Files
wlan-lanforge-scripts/LANforge/Port.pm
2017-10-06 14:01:49 -07:00

1067 lines
27 KiB
Perl

package LANforge::Port;
use strict;
##################################################
## the object constructor ##
## To use: $ep = LANforge::Port->new(); ##
## or: $ep2 = $ep->new(); ##
##################################################
# Must be kept in sync with Port.h, the GUI, gnuforge (gui_msgs.h), etc...
# Hopefully it won't change too much!
my $IF_down = 0;
my $IF_10bt_HD = 1;
my $IF_10bt_FD = 2;
my $IF_100bt_HD = 3;
my $IF_100bt_FD = 4;
my $IF_1000_HD = 5;
my $IF_1000_FD = 6;
my $IF_100bt4 = 7;
my $IF_auto_negotiate = 8;
my $IF_link_OK = 9;
my $IF_flow_control = 10;
my $IF_negotiation_complete = 11;
my $IF_remote_fault = 12;
my $IF_link_jabber = 13;
my $IF_802_3X_flow_control = 14;
my $IF_10bt_link = 15;
my $IF_100bt_link = 16;
my $IF_PHANTOM = 17;
my $IF_ADMIN_DOWN = 18;
my $IF_MII_PROBE_ERROR = 19;
my $IF_ADV_10bt_HD = 20; # What to advertise when in auto-negotiate mode.
my $IF_ADV_10bt_FD = 21;
my $IF_ADV_100bt_HD = 22;
my $IF_ADV_100bt_FD = 23;
my $IF_ADV_1000_HD = 24;
my $IF_ADV_1000_FD = 25;
my $IF_ADV_100bt4 = 26;
my $IF_ADV_flow_control = 27;
my $IF_PROMISC = 28;
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
$self->{shelf_id} = undef;
$self->{card_id} = undef;
$self->{port_id} = undef;
bless( $self, $class );
$self->initDataMembers();
return $self;
} #new
sub initDataMembers {
my $self = shift;
$self->{pps_tx} = undef;
$self->{pps_rx} = undef;
$self->{bps_tx} = undef;
$self->{bps_rx} = undef;
$self->{port_type} = undef;
$self->{cur_flags} = undef;
$self->{parent} = undef;
$self->{supported_flags} = undef;
$self->{partner_flags} = undef;
$self->{advert_flags} = undef;
$self->{ip_addr} = undef;
$self->{ip_mask} = undef;
$self->{ip_gw} = undef;
$self->{ipv6_global} = undef;
$self->{ipv6_link} = undef;
$self->{ipv6_gw} = undef;
$self->{dns_servers} = undef;
$self->{mac_addr} = undef;
$self->{dev} = undef;
$self->{mtu} = undef;
$self->{tx_q_len} = undef;
$self->{rx_pkts} = undef;
$self->{tx_pkts} = undef;
$self->{rx_bytes} = undef;
$self->{tx_bytes} = undef;
$self->{rx_errors} = undef;
$self->{tx_errors} = undef;
$self->{rx_drop} = undef;
$self->{tx_drop} = undef;
$self->{multicasts} = undef;
$self->{collisions} = undef;
$self->{rx_len_err} = undef;
$self->{rx_overflow} = undef;
$self->{rx_crc} = undef;
$self->{rx_frame} = undef;
$self->{rx_fifo} = undef;
$self->{rx_missed} = undef;
$self->{tx_abort} = undef;
$self->{tx_carrier} = undef;
$self->{tx_fifo} = undef;
$self->{tx_heartbeat} = undef;
$self->{tx_window} = undef;
$self->{tx_bytes_ll} = undef;
$self->{tx_bytes_ll} = undef;
$self->{alias} = undef;
$self->{dhcp_client_id} = undef;
$self->{dhcp_vendor_id} = undef;
} #initDataMembers
sub isPhantom {
my $self = shift;
my $cf = $self->{cur_flags};
if ( $cf =~ /PHANTOM/ ) {
return 1;
}
return 0;
}
# A Port's output from the CLI looks something like this
#Shelf: 1, Card: 1, Port: 5 Type: Ethernet Alias: dut1
# Current: LINK-UP 100bt FULL-DUPLEX AUTO-NEGOTIATE NEG-COMPLETE
# Supported: 10bt 100bt FULL-DUPLEX AUTO-NEGOTIATE
# Partner: 10bt 100bt FULL-DUPLEX
# Advertising: 10bt-HD 10bt-FD 100bt-HD 100bt-FD FLOW-CONTROL
# IP: 0.0.0.0 MASK: 0.0.0.0 GW: 0.0.0.0
# IPv6-Global: DELETED
# IPv6-Link: DELETED
# IPv6-Gateway: DELETED
# MAC: 00:c0:95:e2:4c:0e DEV: eth5 MTU: 1500 TX Queue Len: 400
# Rxp: 88210 Txp: 0 Rxb: 5292600 Txb: 0 RxERR: 18338 TxERR: 0
# RxDrop: 0 TxDrop: 0 Multi: 0 Coll: 0 RxLenERR: 0 RxOverFlow: 0
# RxCRC: 0 RxFrame: 0 RxFifo: 0 RxMissed: 0 TxAbort: 0 TxCarrier: 0
# TxFifo: 0 TxHeartBeat: 0 TxWindow: 0 RxBytesLL: 0 TxBytesLL: 0
sub decode {
my $self = shift;
my $txt = shift;
my $dvname = "";
#print "Port::decode, txt -:$txt:-\n";
if ( $txt =~ /DEV:\s+(\S+)\s+/g ) {
$dvname = $1;
}
my @ta = split( /\n/, $txt );
my $i;
my $got_one = 0;
for ( $i = 0 ; $i < @ta ; $i++ ) {
my $ln = $ta[$i];
#print "Got line -:$ln:-\n";
#Shelf: 1, Card: 1, Port: 5 Type: Ethernet Alias: dut1
if (
!(
defined( $self->{shelf_id} )
&& defined( $self->{card_id} )
&& defined( $self->{port_id} )
)
)
{
if ( $ln =~
/Shelf:\s+(\d+)\,\s+Card:\s+(\d+)\,\s+Port:\s+(\S+)\s+Type:\s+(\S+)\s+Alias:\s+(\S+)/
)
{
$self->shelf_id($1);
$self->card_id($2);
$self->port_id($3);
$self->port_type($4);
$self->alias($5);
$got_one = 1;
}
elsif ( $ln =~
/Shelf:\s+(\d+)\,\s+Card:\s+(\d+)\,\s+Port:\s+(\S+)\s+Type:\s+(\S+)/
)
{
$self->shelf_id($1);
$self->card_id($2);
$self->port_id($3);
$self->port_type($4);
$self->alias("");
$got_one = 1;
}
}
else {
my $sid = $self->shelf_id();
my $cid = $self->card_id();
my $pid = $self->port_id();
if ( $dvname eq $pid ) {
#print "Looking for match, ln -:$ln:-\n";
if ( $ln =~
/Shelf:\s+$sid\,\s+Card:\s+$cid\,\s+Port:\s+\S+\s+Type:\s+(\S+)/
)
{
$self->port_type($1);
$got_one = 1;
}
}
else {
#print "Looking for match, ln -:$ln:-\n";
if ( $ln =~
/Shelf:\s+$sid\,\s+Card:\s+$cid\,\s+Port:\s+$pid\s+Type:\s+(\S+)/
)
{
$self->port_type($1);
$got_one = 1;
}
}
}
#print "Got_one: $got_one\n";
if ($got_one) {
# Current: LINK-UP 100bt FULL-DUPLEX AUTO-NEGOTIATE NEG-COMPLETE
$i++;
$ln = $ta[$i];
if ( $ln =~ /.*Parent\/Peer:\s+(\S+)\s+Rpt-Timer.*/ ) {
$self->parent($1);
$i++;
$ln = $ta[$i];
}
elsif ( $ln =~ /.*Parent\/Peer:\s+Rpt-Timer.*/ ) {
$self->parent("");
$i++;
$ln = $ta[$i];
}
if ( $ln =~ /\s+Current:\s+(.*)/ ) {
$self->cur_flags($1);
}
else { die("Could not parse line[$i] -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n($txt)\n"); }
# Supported: 10bt 100bt FULL-DUPLEX AUTO-NEGOTIATE
$i++;
$ln = $ta[$i];
if ( $ln =~ /\sSupported:\s+(.*)/ ) {
$self->supported_flags($1);
}
else { die("Could not parse line[$i] -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n($txt)\n"); }
# Partner: 10bt 100bt FULL-DUPLEX
$i++;
$ln = $ta[$i];
if ( $ln =~ /\s+Partner:\s+(.*)/ ) {
$self->partner_flags($1);
}
else { die("Could not parse line[$i] -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n($txt)\n"); }
# Advertising: 10bt-HD 10bt-FD 100bt-HD 100bt-FD FLOW-CONTROL
$i++;
$ln = $ta[$i];
if ( $ln =~ /\s+Advertising:\s+(.*)/ ) {
$self->advert_flags($1);
}
else { die("Could not parse line[$i] -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n($txt)\n"); }
# IP: 0.0.0.0 MASK: 0.0.0.0 GW: 0.0.0.0
$i++;
$ln = $ta[$i];
if ( $ln =~ /\s+IP:\s+(\S+)\s+MASK:\s+(\S+)\s+GW:\s+(\S+)/ ) {
#print "Found ip_addr: $1\n";
$self->ip_addr($1);
#print "After setting ip_addr: $1, " . $self->ip_addr() . "\n";
$self->ip_mask($2);
$self->ip_gw($3);
}
else { die("Could not parse line[$i] -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n($txt)\n"); }
$i++;
$ln = $ta[$i];
if ( $ln =~ /\s+DNS Servers:\s+(.*)/ ) {
$self->dns_servers($i);
$i++;
$ln = $ta[$i];
}
# IPv6-Global: DELETED
if ( $ln =~ /\s+IPv6-Global:\s+(\S+)/ ) {
#print "Found ipv6_global: $1\n";
$self->ipv6_global($1);
#print "After setting ipv6_global: $1, " . $self->ipv6_global() . "\n";
# IPv6-Link: DELETED
$i++;
$ln = $ta[$i];
if ( $ln =~ /\s+IPv6-Link:\s+(\S+)/ ) {
#print "Found ipv6_link: $1\n";
$self->ipv6_link($1);
#print "After setting ipv6_link: $1, " . $self->ipv6_link() . "\n";
}
else { die("Could not parse line[$i] -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n($txt)\n"); }
# IPv6-Gateway: DELETED
$i++;
$ln = $ta[$i];
if ( $ln =~ /\s+IPv6-Gateway:\s+(\S+)/ ) {
#print "Found ipv6_gw: $1\n";
$self->ipv6_gw($1);
#print "After setting ipv6_gw: $1, " . $self->ipv6_gw() . "\n";
}
else { die("Could not parse line[$i] -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n($txt)\n"); }
$i++;
$ln = $ta[$i];
}
# stuff to skip
if ( $ln =~ /\s+(Cfg|Rpt)-Secondary-IPs:/) {
$i++;
$ln = $ta[$i];
}
if ($ln =~ /\s+IPv6-Global:/) {
$i++;
$ln = $ta[$i];
} # IPv6-Link:
if ($ln =~ /\s+IPv6-Link:/) {
$i++;
$ln = $ta[$i];
} # IPv6-Link:
if ($ln =~ /\s+IPv6-Global:/) {
$i++;
$ln = $ta[$i];
} #IPv6-Gateway:
if ($ln =~ /\s+IPv6-Gateway:/) {
$i++;
$ln = $ta[$i];
} #IPv6-Gateway:
# MAC: 00:c0:95:e2:4c:0e DEV: eth5 MTU: 1500 TX Queue Len: 400
if ( $ln =~
/\s+MAC:\s+(\S+)\s+DEV:\s+(\S+)\s+MTU:\s+(\d+)\s+TX Queue Len:\s+(\d+)/
)
{
$self->mac_addr($1);
$self->dev($2);
$self->mtu($3);
$self->tx_q_len($4);
}
else {
die("MAC test could not parse line[$i] -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n($txt)\n");
}
#print "MAC line $i\n";
$i++;
$ln = $ta[$i];
if (( $ln =~ /\s+Bridge[ -]Port-Cost:.*/ ) ||
( $ln =~ /\s+Bus-Speed:.*/ ) ||
( $ln =~ /\s+LastDHCP:.*/ )) {
# Ignore this line, skip on to the next
#print "Bridge DHCP or Bus line $i\n";
$i++;
$ln = $ta[$i];
}
if (( $ln =~ /\s+Bridge[ -]Port-Cost:.*/ ) ||
( $ln =~ /\s+Bus-Speed:.*/ ) ||
( $ln =~ /\s+LastDHCP:.*/ )) {
# Ignore this line, skip on to the next
#print "DHCP, Bus or Bridge line $i\n";
$i++;
$ln = $ta[$i];
}
if (( $ln =~ /\s+Bridge[ -]Port-Cost:.*/ ) ||
( $ln =~ /\s+Bus-Speed:.*/ ) ||
( $ln =~ /\s+LastDHCP:.*/ )) {
# Ignore this line, skip on to the next
#print "Bus DHCP or Bridge line $i\n";
$i++;
$ln = $ta[$i];
}
if ($ln =~ /DHCP-Client-ID: (.*?)\s+DHCP-Vendor-ID: (.*)\s*$/) {
$self->dhcp_client_id($1);
$self->dhcp_vendor_id($2);
$i++;
$ln = $ta[$i];
}
# pps_tx: 0 pps_rx: 0 bps_tx: 0 bps_rx: 0
if ( $ln =~
/\s+pps_tx:\s+(\d+)\s+pps_rx:\s+(\d+)\s+bps_tx:\s+(\d+)\s+bps_rx:\s+(\d+)/
)
{
$self->pps_tx($1);
$self->pps_rx($2);
$self->bps_tx($3);
$self->bps_rx($4);
}
else { die("Could not parse pps line[$i] -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n($txt)\n"); }
# Rxp: 88210 Txp: 0 Rxb: 5292600 Txb: 0 RxERR: 18338 TxERR: 0
$i++;
$ln = $ta[$i];
if ( $ln =~
/\s+Rxp:\s+(\d+)\s+Txp:\s+(\d+)\s+Rxb:\s+(\d+)\s+Txb:\s+(\d+)\s+RxERR:\s+(\d+)\s+TxERR:\s+(\d+)/
)
{
$self->rx_pkts($1);
$self->tx_pkts($2);
$self->rx_bytes($3);
$self->tx_bytes($4);
$self->rx_errors($5);
$self->tx_errors($6);
}
else { die("Could not parse line[$i] -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n($txt)\n"); }
# RxDrop: 0 TxDrop: 0 Multi: 0 Coll: 0 RxLenERR: 0 RxOverFlow: 0
$i++;
$ln = $ta[$i];
if ( $ln =~
/\s+RxDrop:\s+(\d+)\s+TxDrop:\s+(\d+)\s+Multi:\s+(\d+)\s+Coll:\s+(\d+)\s+RxLenERR:\s+(\d+)\s+RxOverFlow:\s+(\d+)/
)
{
$self->rx_drop($1);
$self->tx_drop($2);
$self->multicasts($3);
$self->collisions($4);
$self->rx_len_err($5);
$self->rx_overflow($6);
}
else { die("Could not parse line[$i] -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n($txt)\n"); }
# RxCRC: 0 RxFrame: 0 RxFifo: 0 RxMissed: 0 TxAbort: 0 TxCarrier: 0
$i++;
$ln = $ta[$i];
if ( $ln =~
/\s+RxCRC:\s+(\d+)\s+RxFrame:\s+(\d+)\s+RxFifo:\s+(\d+)\s+RxMissed:\s+(\d+)\s+TxAbort:\s+(\d+)\s+TxCarrier:\s+(\d+)/
)
{
$self->rx_crc($1);
$self->rx_frame($2);
$self->rx_fifo($3);
$self->rx_missed($4);
$self->tx_abort($5);
$self->tx_carrier($6);
}
else { die("Could not parse line[$i] -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n($txt)\n"); }
# TxFifo: 0 TxHeartBeat: 0 TxWindow: 0 TxCompressed: 0 RxCompr: 0 (This is pre 5.2.3 API)
$i++;
$ln = $ta[$i];
if ( $ln =~
/\s+TxFifo:\s+(\d+)\s+TxHeartBeat:\s+(\d+)\s+TxWindow:\s+(\d+)\s+TxCompressed:\s+(\d+)\s+RxCompr:\s+(\d+)/
)
{
$self->tx_fifo($1);
$self->tx_heartbeat($2);
$self->tx_window($3);
}
elsif ( $ln =~
/\s+TxFifo:\s+(\d+)\s+TxHeartBeat:\s+(\d+)\s+TxWindow:\s+(\d+)\s+RxBytesLL:\s+(\d+)\s+TxBytesLL:\s+(\d+)/
)
{
$self->tx_fifo($1);
$self->tx_heartbeat($2);
$self->tx_window($3);
$self->rx_bytes_ll($4);
$self->tx_bytes_ll($5);
}
else { die("Could not parse line[$i] -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n($txt)\n"); }
return;
} #if found the beginning for the/a endpoint
} #for all the lines in our buffer
} #decode
sub toStringBrief {
my $self = shift;
return ( "Port: "
. $self->{shelf_id} . "."
. $self->{card_id} . "."
. $self->{port_id} . " ("
. $self->{dev}
. ")" );
}
sub toString {
my $self = shift;
my $rv = "";
$rv = <<__END_TS;
Shelf: $self->{shelf_id}, Card: $self->{card_id}, Port: $self->{port_id} Type: $self->{port_type} Alias: $self->{alias}
Parent: $self->{parent}
Current: $self->{cur_flags}
Supported: $self->{supported_flags}
Partner: $self->{partner_flags}
Advertising: $self->{advert_flags}
IP: $self->{ip_addr} MASK: $self->{ip_mask} GW: $self->{ip_gw}
DNS Servers: $self->{dns_servers}
IPv6-Global: $self->{ipv6_global}
IPv6-Link: $self->{ipv6_link}
IPv6-Gateway: $self->{ipv6_gw}
MAC: $self->{mac_addr} DEV: $self->{dev} MTU: $self->{mtu} TX Queue Len: $self->{tx_q_len}
Rxp: $self->{rx_pkts} Txp: $self->{tx_pkts} Rxb: $self->{rx_bytes} Txb: $self->{tx_bytes} RxERR: $self->{rx_errors} TxERR: $self->{tx_errors}
RxDrop: $self->{rx_drop} TxDrop: $self->{tx_drop} Multi: $self->{multicasts} Coll: $self->{collisions} RxLenERR: $self->{rx_len_err} RxOverFlow: $self->{rx_overflow}
RxCRC: $self->{rx_crc} RxFrame: $self->{rx_frame} RxFifo: $self->{rx_fifo} RxMissed: $self->{rx_missed} TxAbort: $self->{tx_abort} TxCarrier: $self->{tx_carrier}
TxFifo: $self->{tx_fifo} TxHeartBeat: $self->{tx_heartbeat} TxWindow: $self->{tx_window} RxBytesLL: $self->{rx_bytes_ll} TxBytesLL: $self->{tx_bytes_ll}
__END_TS
return $rv;
}
# Sets IP & MAC information
sub getSetCmd {
my $self = shift;
my $rv =
( "set_port "
. $self->shelf_id() . " "
. $self->card_id() . " "
. $self->port_id . " "
. $self->ip_addr() . " "
. $self->ip_mask() . " "
. $self->ip_gw()
. " NA NA "
. $self->mac_addr()
. " NA NA" );
return $rv;
}
sub getDeleteCmd {
my $self = shift;
my $rv;
if ( $self->dev() ) {
$rv =
( "rm_vlan "
. $self->shelf_id() . " "
. $self->card_id() . " "
. $self->dev() );
}
else {
$rv =
( "rm_vlan "
. $self->shelf_id() . " "
. $self->card_id() . " "
. $self->port_id() );
}
return $rv;
}
sub isMacVlan {
my $self = shift;
if ( $self->{port_type} eq "MacVLAN" ) {
return 1;
}
return 0;
}
sub is8021qVlan {
my $self = shift;
if ( $self->{port_type} eq "Vlan" ) {
return 1;
}
return 0;
}
# Set MTU only
sub getSetMtuCmd {
my $self = shift;
my $rv =
( "set_port "
. $self->shelf_id() . " "
. $self->card_id() . " "
. $self->port_id()
. " NA NA NA NA NA NA "
. $self->mtu()
. " NA" );
return $rv;
}
# Set tx-queue-length only
sub getSetTxQueueLenCmd {
my $self = shift;
my $rv =
( "set_port "
. $self->shelf_id() . " "
. $self->card_id() . " "
. $self->port_id()
. " NA NA NA NA NA NA NA "
. $self->tx_q_len() );
return $rv;
}
#set rate (current flags) only
sub getSetRateCmd {
my $self = shift;
my $rv =
( "set_port "
. $self->shelf_id() . " "
. $self->card_id() . " "
. $self->port_id()
. " NA NA NA NA " );
my $i = 0;
if ( $self->isAutoNegotiate() ) {
$i |= ( 1 << $IF_auto_negotiate );
}
else {
if ( $self->isCurrent("10bt-HD") ) {
$i |= ( 1 << $IF_10bt_HD );
}
elsif ( $self->isCurrent("10bt-FD") ) {
$i |= ( 1 << $IF_10bt_FD );
}
elsif ( $self->isCurrent("100bt-HD") ) {
$i |= ( 1 << $IF_100bt_HD );
}
elsif ( $self->isCurrent("100bt-FD") ) {
$i |= ( 1 << $IF_100bt_FD );
}
}
if ( $self->isAdvertising("10bt-HD") ) {
$i |= ( 1 << $IF_ADV_10bt_HD );
}
if ( $self->isAdvertising("10bt-FD") ) {
$i |= ( 1 << $IF_ADV_10bt_FD );
}
if ( $self->isAdvertising("100bt-HD") ) {
$i |= ( 1 << $IF_ADV_100bt_HD );
}
if ( $self->isAdvertising("100bt-FD") ) {
$i |= ( 1 << $IF_ADV_100bt_FD );
}
if ( $self->isAdvertising("FLOW-CONTROL") ) {
$i |= ( 1 << $IF_ADV_flow_control );
}
$rv .= "$i NA NA NA";
return $rv;
} #getSetRateCmd
sub setRate {
my $self = shift;
my $val = shift;
if ( $val eq "auto" ) {
$self->ensureCurSet("AUTO-NEGOTIATE");
}
else {
$self->cur_flags($val);
}
} #setRate
sub ensureCurSet {
my $self = shift;
my $flg = shift;
my $flgs = $self->cur_flags();
if ( $flgs =~ /$flg/ ) {
return;
}
else {
$flgs .= "$flg ";
$self->cur_flags($flgs);
}
}
sub ensureCurNotSet {
my $self = shift;
my $flg = shift;
my $flgs = $self->cur_flags();
if ( $flgs =~ /$flg/ ) {
$flgs =~ s/$flg //;
$self->cur_flags($flgs);
}
else {
return;
}
}
sub isAutoNegotiate {
my $self = shift;
return $self->isCurrent("AUTO-NEGOTIATE");
}
sub isAdvertising {
my $self = shift;
my $flg = shift;
my $flgs = $self->advert_flags();
if ( $flgs =~ /$flg/ ) {
return 1;
}
return 0;
} #isAdvertisting (flag set)
sub isCurrent {
my $self = shift;
my $flg = shift;
my $cur_flgs = $self->cur_flags();
if ( $cur_flgs =~ /$flg/ ) {
return 1;
}
return 0;
} #isCurrent (flag set)
##############################################
## methods to access per-object data ##
## ##
## With args, they set the value. Without ##
## any, they only retrieve it/them. ##
##############################################
sub pps_tx {
my $self = shift;
if (@_) { $self->{pps_tx} = shift }
return $self->{pps_tx};
}
sub pps_rx {
my $self = shift;
if (@_) { $self->{pps_rx} = shift }
return $self->{pps_rx};
}
sub bps_tx {
my $self = shift;
if (@_) { $self->{bps_tx} = shift }
return $self->{bps_tx};
}
sub bps_rx {
my $self = shift;
if (@_) { $self->{bps_rx} = shift }
return $self->{bps_rx};
}
sub shelf_id {
my $self = shift;
if (@_) { $self->{shelf_id} = shift }
return $self->{shelf_id};
}
sub card_id {
my $self = shift;
if (@_) { $self->{card_id} = shift }
return $self->{card_id};
}
sub port_id {
my $self = shift;
if (@_) { $self->{port_id} = shift }
return $self->{port_id};
}
sub port_type {
my $self = shift;
if (@_) { $self->{port_type} = shift }
return $self->{port_type};
}
sub cur_flags {
my $self = shift;
if (@_) { $self->{cur_flags} = shift }
return $self->{cur_flags};
}
sub parent {
my $self = shift;
if (@_) { $self->{parent} = shift }
return $self->{parent};
}
sub supported_flags {
my $self = shift;
if (@_) { $self->{supported_flags} = shift }
return $self->{supported_flags};
}
sub partner_flags {
my $self = shift;
if (@_) { $self->{partner_flags} = shift }
return $self->{partner_flags};
}
sub advert_flags {
my $self = shift;
if (@_) { $self->{advert_flags} = shift }
return $self->{advert_flags};
}
sub ip_addr {
my $self = shift;
if (@_) { $self->{ip_addr} = shift }
return $self->{ip_addr};
}
sub ip_mask {
my $self = shift;
if (@_) { $self->{ip_mask} = shift }
return $self->{ip_mask};
}
sub ip_gw {
my $self = shift;
if (@_) { $self->{ip_gw} = shift }
return $self->{ip_gw};
}
sub ipv6_global {
my $self = shift;
if (@_) { $self->{ipv6_global} = shift }
return $self->{ipv6_global};
}
sub ipv6_link {
my $self = shift;
if (@_) { $self->{ipv6_link} = shift }
return $self->{ipv6_link};
}
sub ipv6_gw {
my $self = shift;
if (@_) { $self->{ipv6_gw} = shift }
return $self->{ipv6_gw};
}
sub dns_servers {
my $self = shift;
if (@_) { $self->{dns_servers} = shift }
return $self->{dns_servers};
}
sub mac_addr {
my $self = shift;
if (@_) { $self->{mac_addr} = shift }
return $self->{mac_addr};
}
sub dev {
my $self = shift;
if (@_) { $self->{dev} = shift }
return $self->{dev};
}
sub mtu {
my $self = shift;
if (@_) { $self->{mtu} = shift }
return $self->{mtu};
}
sub tx_q_len {
my $self = shift;
if (@_) { $self->{tx_q_len} = shift }
return $self->{tx_q_len};
}
sub rx_pkts {
my $self = shift;
if (@_) { $self->{rx_pkts} = shift }
return $self->{rx_pkts};
}
sub tx_pkts {
my $self = shift;
if (@_) { $self->{tx_pkts} = shift }
return $self->{tx_pkts};
}
sub rx_bytes {
my $self = shift;
if (@_) { $self->{rx_bytes} = shift }
return $self->{rx_bytes};
}
sub tx_bytes {
my $self = shift;
if (@_) { $self->{tx_bytes} = shift }
return $self->{tx_bytes};
}
sub rx_errors {
my $self = shift;
if (@_) { $self->{rx_errors} = shift }
return $self->{rx_errors};
}
sub tx_errors {
my $self = shift;
if (@_) { $self->{tx_errors} = shift }
return $self->{tx_errors};
}
sub rx_drop {
my $self = shift;
if (@_) { $self->{rx_drop} = shift }
return $self->{rx_drop};
}
sub tx_drop {
my $self = shift;
if (@_) { $self->{tx_drop} = shift }
return $self->{tx_drop};
}
sub multicasts {
my $self = shift;
if (@_) { $self->{multicasts} = shift }
return $self->{multicasts};
}
sub collisions {
my $self = shift;
if (@_) { $self->{collisions} = shift }
return $self->{collisions};
}
sub rx_len_err {
my $self = shift;
if (@_) { $self->{rx_len_err} = shift }
return $self->{rx_len_err};
}
sub rx_overflow {
my $self = shift;
if (@_) { $self->{rx_overflow} = shift }
return $self->{rx_overflow};
}
sub rx_crc {
my $self = shift;
if (@_) { $self->{rx_crc} = shift }
return $self->{rx_crc};
}
sub rx_frame {
my $self = shift;
if (@_) { $self->{rx_frame} = shift }
return $self->{rx_frame};
}
sub rx_fifo {
my $self = shift;
if (@_) { $self->{rx_fifo} = shift }
return $self->{rx_fifo};
}
sub rx_missed {
my $self = shift;
if (@_) { $self->{rx_missed} = shift }
return $self->{rx_missed};
}
sub tx_abort {
my $self = shift;
if (@_) { $self->{tx_abort} = shift }
return $self->{tx_abort};
}
sub tx_carrier {
my $self = shift;
if (@_) { $self->{tx_carrier} = shift }
return $self->{tx_carrier};
}
sub tx_fifo {
my $self = shift;
if (@_) { $self->{tx_fifo} = shift }
return $self->{tx_fifo};
}
sub tx_heartbeat {
my $self = shift;
if (@_) { $self->{tx_heartbeat} = shift }
return $self->{tx_heartbeat};
}
sub tx_window {
my $self = shift;
if (@_) { $self->{tx_window} = shift }
return $self->{tx_window};
}
sub rx_bytes_ll {
my $self = shift;
if (@_) { $self->{rx_bytes_ll} = shift }
return $self->{rx_bytes_ll};
}
sub tx_bytes_ll {
my $self = shift;
if (@_) { $self->{tx_bytes_ll} = shift }
return $self->{tx_bytes_ll};
}
sub alias {
my $self = shift;
if (@_) { $self->{alias} = shift }
return $self->{alias};
}
sub dhcp_client_id {
my $self = shift;
if (@_) { $self->{dhcp_client_id} = shift }
return $self->{dhcp_client_id};
}
sub dhcp_vendor_id {
my $self = shift;
if (@_) { $self->{dhcp_vendor_id} = shift }
return $self->{dhcp_vendor_id};
}
1; # So the require or use succeeds (perl stuff)
__END__
# Plain Old Documentation (POD)
=head1 NAME
Port - class to implement LANforge Ports
=head1 SYNOPSIS
use LANforge::Port
#################
# class methods #
#################
$ob = LANforge::Port->new;
#######################
# object data methods #
#######################
### get versions ###
$port_id = $ob->port_id();
### set versions ###
$ob->port_id(2);
########################
# other object methods #
########################
$ob->decode("CLI output that contains this Port's output");
=head1 DESCRIPTION
The Port class gives you some clever access into the Port
objects as sent by the LANforge CLI.
=head1 AUTHOR
Ben Greear (greearb@candelatech.com)
Copyright (c) 2001 Candela Technologies. All rights reserved.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
=head1 VERSION
Version 0.0.1 May 26, 2001
=end