summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@vyatta.com>2012-04-09 21:17:58 -0700
committerStephen Hemminger <shemminger@vyatta.com>2012-04-09 21:17:58 -0700
commitd4707f2d85d525d90e56020cbb029f928d210ef3 (patch)
treec60ca19f284ef2d3a4742237080e4ace303e2c72 /lib
parent3705ca912db94c6445768a09ddaf737fe38bd647 (diff)
downloadvyatta-cfg-d4707f2d85d525d90e56020cbb029f928d210ef3.tar.gz
vyatta-cfg-d4707f2d85d525d90e56020cbb029f928d210ef3.zip
Use ioctl() to read interface flags
Bug 8006 Interface running state is only visible through ioctl() or netlink. The flag is not exported via sysfs properly.
Diffstat (limited to 'lib')
-rwxr-xr-xlib/Vyatta/Interface.pm47
1 files changed, 22 insertions, 25 deletions
diff --git a/lib/Vyatta/Interface.pm b/lib/Vyatta/Interface.pm
index e8e2e30..2cc47ba 100755
--- a/lib/Vyatta/Interface.pm
+++ b/lib/Vyatta/Interface.pm
@@ -24,11 +24,13 @@ use warnings;
use Vyatta::Config;
use Vyatta::Misc;
use base 'Exporter';
+use Socket;
+require 'sys/ioctl.ph';
+
our @EXPORT = qw(IFF_UP IFF_BROADCAST IFF_DEBUG IFF_LOOPBACK
IFF_POINTOPOINT IFF_RUNNING IFF_NOARP
IFF_PROMISC IFF_MULTICAST);
-
use constant {
IFF_UP => 0x1, # interface is up
IFF_BROADCAST => 0x2, # broadcast address valid
@@ -210,7 +212,7 @@ sub _ppp_intf {
chomp;
# looking for line like:
# pty "/usr/sbin/pppoe -m 1412 -I eth1"
- next unless /pty\s.*-I\s*(\w+)"/;
+ next unless /^pty\s.*-I\s*(\w+)"/;
$intf = $1;
last;
}
@@ -404,34 +406,29 @@ sub address {
return Vyatta::Misc::getIP($self->{name}, $type);
}
-sub exists {
- my $self = shift;
+# Do SIOCGIFFLAGS ioctl in perl
+sub flags {
+ my $self = shift;
- return ( -d "/sys/class/net/$self->{name}" );
-}
+ my $SIOCGIFFLAGS = &SIOCGIFFLAGS;
+ die "SIOCGIFFLAGS not found"
+ unless defined($SIOCGIFFLAGS);
-sub flags {
- my $self = shift;
+ socket (my $sock, AF_INET, SOCK_DGRAM, 0)
+ or die "open UDP socket failed: $!";
- open my $flags, '<', "/sys/class/net/$self->{name}/flags"
- or return;
+ my $ifreq = pack('a16', $self->{name});
+ ioctl($sock, $SIOCGIFFLAGS, $ifreq)
+ or return; #undef
- my $val = <$flags>;
- chomp $val;
- close $flags;
- return hex($val);
+ my (undef, $flags) = unpack('a16s', $ifreq);
+ return $flags;
}
-sub carrier {
+sub exists {
my $self = shift;
- open my $carrier, '<', "/sys/class/net/$self->{name}/carrier"
- or return;
-
- my $val = <$carrier>;
- $val = 0 if ! defined $val; # proc entry not readable on down interface
- chomp $val;
- close $carrier;
- return $val;
+ my $flags = $self->flags();
+ return defined($flags);
}
sub hw_address {
@@ -471,7 +468,7 @@ sub up {
my $self = shift;
my $flags = $self->flags();
- return $flags && ( $flags & IFF_UP );
+ return defined($flags) && ( $flags & IFF_UP );
}
# device exists and is running (ie carrier present)
@@ -479,7 +476,7 @@ sub running {
my $self = shift;
my $flags = $self->flags();
- return $flags && ( $flags & IFF_RUNNING );
+ return defined($flags) && ( $flags & IFF_RUNNING );
}
# device description information in kernel (future use)