Net-Interface
view release on metacpan or search on metacpan
t/faceinfo.t view on Meta::CPAN
sub getflags {
my($flags) = @_;
no strict;
my $txt = ($flags & IFF_UP) ? '<up ' : '<down ';
foreach(sort @{$Net::Interface::EXPORT_TAGS{iffs}}) {
my $x = eval { &$_(); };
my $v = 0 + $x;
next if $v == IFF_UP;
$txt .= $x .' ' if $flags & $v;
}
chop $txt;
$txt .= '>';
}
sub addr42txt {
my($txt,$naddr) = @_;
return '' unless $naddr;
$txt .= ' '. inet_ntoa($naddr);
}
sub dumpaddrs {
my($hvp,$i,$fam,$mac) = @_;
my $key = 0 + $fam;
if (exists $i->{$key}) {
diag(sprintf("\t%s %d, addr size %d %s\n",$fam,$i->{$key}->{number},$i->{$key}->{size},$$mac));
$$mac = '';
my @address = $hvp->address($key);
my @netmask = $hvp->netmask($key);
my @broadcast = $hvp->broadcast($key);
if ($key == AF_INET()) {
foreach(0..$#address) {
diag(sprintf("\t%s %s %s\n",
addr42txt('addr',scalar $hvp->address($key,$_)),
addr42txt('netmask',scalar $hvp->netmask($key,$_)),
addr42txt('broadcast',scalar $hvp->broadcast($key,$_))
));
}
} else {
foreach(0..$#address) {
diag(sprintf("\t%s/%d <%s>\n",
inet_ntop($address[$_]),
$hvp->mask2cidr($netmask[$_]),
typetxt($hvp->type($address[$_])) ."\b"
));
}
}
}
}
foreach my $hvp (@ifaces) {
my $i = $hvp->info();
unless (defined $i->{flags} && $i->{flags} & IFF_UP()) {
diag(sprintf("%s\t<DOWN>\n",$i->{name}));
next;
}
## Dump($i);
my $flags = getflags($i->{flags});
my $mac = (defined $i->{mac}) ? "\tMAC: ". mac_bin2hex($i->{mac}) : '';
my $mtu = $i->{mtu} ? 'MTU:'. $i->{mtu} : '';
my $metric = (defined $i->{metric}) ? 'Metric:'. $i->{metric} : '';
my $af_inet6 = eval {AF_INET6} || 0;
diag(sprintf("%s id %d\tflags:0x%02x%s %s %s\n",$i->{name},$i->{index},$i->{flags},$flags,$mtu,$metric));
dumpaddrs($hvp,$i,AF_INET,\$mac);
dumpaddrs($hvp,$i,$af_inet6,\$mac);
# print Dumper($i),"\n";
}
( run in 0.627 second using v1.01-cache-2.11-cpan-39bf76dae61 )