#!/usr/bin/perl package LANforge::Endpoint; use strict; ################################################## ## the object constructor ## ## To use: $ep = LANforge::Endpoint->new(); ## ## or: $ep2 = $ep->new(); ## ################################################## sub new { my $proto = shift; my $class = ref($proto) || $proto; my $self = {}; $self->{name} = undef; bless( $self, $class ); initDataMembers(); return $self; } sub initDataMembers { my $self = shift; $self->{payload} = undef; $self->{shelf_id} = undef; $self->{card_id} = undef; $self->{port_id} = undef; $self->{endp_id} = undef; $self->{endp_type} = undef; $self->{pattern} = undef; $self->{ip_port} = undef; $self->{ip_tos} = undef; $self->{ip_addr} = undef; $self->{dst_ip_port} = undef; $self->{dst_ip_addr} = undef; $self->{dst_mac} = undef; $self->{src_addr} = undef; $self->{role} = undef; $self->{ep_flags} = undef; $self->{min_pkt_size} = undef; $self->{max_pkt_size} = undef; $self->{min_tx_rate} = undef; $self->{max_tx_rate} = undef; $self->{report_timer} = undef; $self->{start_time} = undef; $self->{stop_time} = undef; $self->{cx_detected_dropped_rx} = undef; $self->{last_rpt} = undef; $self->{rx_pkts} = undef; $self->{tx_pkts} = undef; $self->{tx_failed_pkts} = undef; $self->{tx_failed_bytes} = undef; $self->{rx_bytes} = undef; $self->{tx_bytes} = undef; $self->{rx_dropped_pkts} = undef; # figure out by looking at gaps in pkt ids $self->{rx_dup_pkts} = undef; $self->{rx_ooo_pkts} = undef; $self->{rx_wrong_dev} = undef; $self->{rx_crc_failed} = undef; $self->{connection_dropped} = undef; $self->{real_tx_rate} = undef; $self->{real_rx_rate} = undef; $self->{counters} = undef; $self->{avg_latency} = undef; $self->{ttl} = undef; $self->{filename} = undef; $self->{send_bad_crc} = undef; $self->{rx_drop_cx} = undef; $self->{rx_drop_seq} = undef; $self->{rx_bit_errors} = undef; $self->{conn_estab} = undef; $self->{tcp_retrans} = undef; # WanLink (LANforge ICE) fields. $self->{cfg_latency} = undef; $self->{max_jitter} = undef; $self->{drop_freq} = undef; $self->{dup_freq} = undef; $self->{jitter_freq} = undef; $self->{reord_freq} = undef; $self->{max_buf} = undef; $self->{extra_buf} = undef; $self->{wan_paths} = undef; $self->{record_q} = undef; $self->{dump_file} = undef; $self->{min_drop_amt} = undef; $self->{max_drop_amt} = undef; # VOIP fields. $self->{proxy_ip} = undef; $self->{phone_num} = undef; $self->{peer_phone_num} = undef; $self->{min_rtp_port} = undef; $self->{max_rtp_port} = undef; $self->{reg_expire_timer} = undef; $self->{sound_dev} = undef; $self->{tx_sound_file} = undef; $self->{rx_sound_file} = undef; $self->{fc_delay} = undef; $self->{min_ic_gap} = undef; $self->{max_ic_gap} = undef; $self->{loop_calls} = undef; $self->{loop_wav_files} = undef; $self->{call_setup_dist} = undef; $self->{last_call_setup_time} = undef; $self->{state_change_in} = undef; $self->{min_call_duration} = undef; $self->{max_call_duration} = undef; $self->{register_state} = undef; $self->{call_state} = undef; $self->{msg_proto} = undef; $self->{rtp_encoding} = undef; $self->{latency} = undef; $self->{rt_latency} = undef; $self->{jitter} = undef; $self->{calls_attempted} = undef; $self->{calls_completed} = undef; $self->{calls_answered} = undef; $self->{calls_connected} = undef; $self->{calls_RHUP} = undef; $self->{calls_failed} = undef; $self->{calls_failed_404} = undef; $self->{calls_failed_no_answer} = undef; $self->{calls_failed_busy} = undef; $self->{ringing_timer} = undef; $self->{rcvd_487_cancel} = undef; # Armageddon fields - Added by Adam $self->{udp_src_min} = undef; $self->{udp_src_max} = undef; $self->{udp_dst_min} = undef; $self->{udp_dst_max} = undef; $self->{pps} = undef; $self->{pkts_to_send} = undef; $self->{arm_flags} = undef; $self->{src_mac_cnt} = undef; $self->{dst_mac_cnt} = undef; $self->{multi_pkt} = undef; $self->{min_src_ip} = undef; $self->{max_src_ip} = undef; $self->{min_dst_ip} = undef; $self->{max_dst_ip} = undef; } #initDataMembers # VOIP endpoints look like this: #VoipEndp [voip1-B] (RUNNING, UDP_TRANSPORT, SAVE_RX_PCM, PLAY_AUDIO, RCV_CALL_ONLY) # Shelf: 1, Card: 2 Port: 0 Endpoint: 27 Type: VOIP # ProxyIP: 192.168.1.24 PhoneNum: 2102 PeerPhone: 2103 # MinRtpPort: 10000 MaxRtpPort: 10002 RegExpireTimer: 300 # SoundDev: /dev/dsp TxSoundFile: /tmp/fvoice.wav RxSoundFile: /tmp/pcm_rx.wav # FC-Delay: 5 MinInterCallGap: 5 MaxInterCallGap: 5 # LoopCalls: FOREVER LoopWaveFiles: 1 MinCallDuration: 30 Max: 30 # RegisterState: REGISTERED CallState: CALL_IN_PROGRESS Protocol: SIP/G711U # RingingTimer: 10000ms LastCallSetup: 12ms StateChangeIn: 4s # RptTimer: 5000ms RunningFor: 150446s StopIn: 206276387s # LastRpt: 0.000 secs ago RealWriteRate: 62044bps RealReadRate: 62044bps # Latency: -32 -:-24:- -10 [ 9 1 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] (5) # RT-Latency: 0 -:73:- 1760 [ 5 0 1 0 0 0 0 2 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] (5) # Jitter: -20 -:-1:- 2010 [ 891 1 1968 95 0 0 1 0 5 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] (5) # CallSetup: 0 -:13:- 37 [ 0 0 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] (5) # CallsAttempted: Total: 0 Time: 300000ms Current: 0 # CallsCompleted: Total: 501 Time: 300000ms Current: 1 # CallsAnswered Total: 502 Time: 300000ms Current: 1 # CallsConnected Total: 0 Time: 300000ms Current: 0 # CallsRemoteHUP Total: 501 Time: 300000ms Current: 1 # CallsFailed: Total: 0 Time: 300000ms Current: 0 # RTP Pkts Tx: Total: 7292502 Time: 300000ms Current: 14361 # RTP Pkts Rx: Total: 7292442 Time: 300000ms Current: 14361 # RTP Bytes Tx: Total: 1166800320 Time: 300000ms Current: 2297760 # RTP Bytes Rx: Total: 1166790720 Time: 300000ms Current: 2297760 # RTP Pkts Dropped: Total: 0 Time: 300000ms Current: 0 # RTP Pkts Dup: Total: 0 Time: 300000ms Current: 0 # RTP Pkts OOO: Total: 0 Time: 300000ms Current: 0 # CallsFailed-404 Total: 0 Time: 300000ms Current: 0 # CF 408 (No-Answer) Total: 3 Time: 300000ms Current: 3 # CallsFailed-busy Total: 0 Time: 300000ms Current: 0 # Rcvd 487 (Cancel) Total: 4 Time: 300000ms Current: 4 # A WanLink (LANforge ICE) endpoint's output from the CLI looks something like this #WanLink [wl1-B] (NOT_RUNNING) # Shelf: 1, Card: 1 Port: 2 Endpoint: 10 Type: WAN_LINK # MaxTxRate: 56000bps Latency: 0ms MaxJitter: 0ms # DropFreq: 0 DupFreq: 0 ReorderFreq: 0 ExtraBuf: 64KB # RptTimer: 5000ms RunningFor: 0s StopIn: 0s MaxBuf: 67050B # Cur Backlog: 0 Real Tx Rate: 0bps WanPaths: 1 # Rx Pkts: Total: 0 Time: 300000ms Current: 0 # Rx Bytes: Total: 0 Time: 300000ms Current: 0 # Tx OOO Pkts: Total: 0 Time: 300000ms Current: 0 # Rx Dropped Pkts: Total: 0 Time: 300000ms Current: 0 # Rx Dropped Bytes: Total: 0 Time: 300000ms Current: 0 # Tx Duplicate Pkts: Total: 0 Time: 300000ms Current: 0 # Tx Pkts: Total: 0 Time: 300000ms Current: 0 # Tx Bytes: Total: 0 Time: 300000ms Current: 0 # Tx Failed Pkts: Total: 0 Time: 300000ms Current: 0 # Tx Failed Bytes: Total: 0 Time: 300000ms Current: 0 # # Name RxPkts RxBytes Dropped MaxRate(bps) Latency Backlog TxPkts TxBytes # wp1 0 0 0 56000 6 0 0 0 # A Data-Generating (LANforge FIRE) endpoint's output from the CLI looks something like this #Endpoint [endp-399-RX] (NOT_RUNNING, FIXED_PLD_SIZE, PHANTOM, RATE_CONSTANT, IP_PORT_AUTO) # Shelf: 1, Card: 1 Port: 409 Endpoint: 400 Type: LANFORGE_TCP Pattern: INCREASING # MinTxRate: 9600bps MaxTxRate: 9600bps MinPktSize: 1472B MaxPktSize: 1472B # DestMAC: 00 00 00 00 00 00 DestIpAddr: 0.0.0.0 DestIpPort: 0 Quiesce: 3 # SrcMAC: 00 00 00 00 00 00 SrcIp: 0.0.0.0 IpPort: 0 IpTOS: DONT-SET Priority: 0 # Role: ACCEPT RptTimer: 1000ms RunningFor: 0s StopIn: 0s # Latency: 0 -:0:- 0 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] (1) # Last Rpt: 0.000 secs ago RealTxRate: 0bps RealRxRate: 0bps TTL: 0 # FileName: SendBadCrc: 0 RcvBuf: 0 SndBuf: 0 CWND: 0 # RxDrop%-SEQ: 0.0000 RxDrop%-CX: 0.0000 Conn-Timer: -1ms # Rx Pkts: Total: 0 Time: 60s Cur: 0 0/s # Rx Bytes: Total: 0 Time: 60s Cur: 0 0/s # Rx OOO Pkts: Total: 0 Time: 60s Cur: 0 0/s # RX Wrong Dev: Total: 0 Time: 60s Cur: 0 0/s # RX CRC Failed: Total: 0 Time: 60s Cur: 0 0/s # RX Bit Errors: Total: 0 Time: 3s Cur: 0 0/s # Rx Dropped Pkts: Total: 0 Time: 3s Cur: 0 0/s # Cx Detected: 0 # Rx Duplicate Pkts: Total: 0 Time: 60s Cur: 0 0/s # Tx Pkts: Total: 0 Time: 60s Cur: 0 0/s # Tx Bytes: Total: 0 Time: 60s Cur: 0 0/s # Tx Failed Pkts: Total: 0 Time: 60s Cur: 0 0/s # Tx Failed Bytes: Total: 0 Time: 60s Cur: 0 0/s # Conn Established: Total: 0 Time: 30s Cur: 0 0/s # TCP Retransmits: Total: 0 Time: 3s Cur: 0 0/s sub decode { my $self = shift; my $txt = shift; my @ta = split( /\n/, $txt ); my $i = -1; my $got_endp = 0; my $got_wl = 0; my $got_voip = 0; my $got_arm = 0; print "Endpoint::decode, txt -:$txt:-\n"; foreach my $ln (@ta) { $i++; next if ($ln =~ /^\s*$/); next if ($ln =~ /^\s*>>RSLT:/); next if ($ln =~ /(admin|default)\@btbits>>/i); #print "Line: -:$ln:-\n"; #Endpoint [endp-34-TX] (NOT_RUNNING, RND_PLD_SIZE, RATE_BURSTY) #print STDERR "NAME:".$self->{name}."\n"; if ( !defined( $self->{name} ) ) { if ( $ln =~ /Endpoint\s+\[(.*)\]\s+\((.*)\)/ ) { print "line has Endpoint\n"; $self->name($1); # set our name $self->ep_flags($2); $got_endp = 1; next; } elsif ( $ln =~ /WanLink\s+\[(.*)\]\s+\((.*)\)/ ) { print "line has Wanlink\n"; $self->name($1); # set our name $self->ep_flags($2); $got_wl = 1; next; } elsif ( $ln =~ /VoipEndp\s+\[(.*)\]\s+\((.*)\)/ ) { print "line has Voip\n"; $self->name($1); # set our name $self->ep_flags($2); $got_voip = 1; next; } elsif ( $ln =~ /ArmEndp\s+\[(.*)\]\s+\((.*)\)/ ) { # added by Adam 8-17-04 print "line has Armg\n"; $self->name($1); # set our name $self->ep_flags($2); $got_arm = 1; next; } else { warn "$0: Don't know about this endpoint: $ln\n"; } } elsif (($got_endp + $got_wl + $got_arm) == 0) { my $nm = $self->{name}; if ( $ln =~ /Endpoint\s+\[$nm\]\s+\((.*)\)/ ) { $self->ep_flags($1); #print "Set flags -:" . $self->ep_flags() . ":- orig -:$1:-\n"; $got_endp = 1; next; } elsif ( $ln =~ /WanLink\s+\[$nm\]\s+\((.*)\)/ ) { $self->ep_flags($1); #print "Set flags -:" . $self->ep_flags() . ":- orig -:$1:-\n"; $got_wl = 1; next; } elsif ( $ln =~ /ArmEndp\s+\[(.*)\]\s+\((.*)\)/ ) { $self->ep_flags($2); #print "Set flags -:" . $self->ep_flags() . ":- orig -:$2:-\n"; $got_arm = 1; next; } else { warn "$0: Don't know about this endpoint, nm: $nm, ln: $ln\n"; } next; } # Shelf: 1, Card: 1 Port: 3 Endpoint: 15 Type: CUSTOM_TCP Pattern: CUSTOM if ($got_endp) { if ( $ln =~ /Shelf:\s+(\d+)\,\s+Card:\s+(\d+)\s+Port:\s+(\d+)\s+Endpoint:\s+(\d+)\s+Type:\s+(\S+)\s+Pattern:\s+(\S+)/ ) { $self->shelf_id($1); $self->card_id($2); $self->port_id($3); $self->ep_id($4); $self->ep_type($5); $self->pattern($6); next; } # MinTxRate: 512000bps MaxTxRate: 1024000bps MinPktSize: 128B MaxPktSize: 128B if ( $ln =~ /MinTxRate:\s+(\d+)bps\s+MaxTxRate:\s+(\d+)bps\s+MinPktSize:\s+(\d+)B\s+MaxPktSize:\s+(\d+)B/ ) { $self->min_tx_rate($1); $self->max_tx_rate($2); $self->min_pkt_size($3); $self->max_pkt_size($4); next; } # DestMAC: 00 90 27 a2 9e 54 DestIpAddr: 172.1.2.201 DestIpPort: 33011 if ( $ln =~ /DestMAC:\s+(([0-9a-fA-F]{2}[: ]){5}([0-9a-fA-F]{2}))\s+DestIpAddr:\s+(\S+)\s+DestIpPort:\s+(\d+)/ ) { $self->dest_mac($1); $self->dest_ip_addr($2); $self->dest_ip_port($3); next; } # SrcMAC: 00 c0 95 e2 4c 0c SrcIp: 172.1.2.200 IpPort: 33011 IpTOS: 0x8 if ( $ln =~ /SrcMAC:\s+(([0-9a-fA-F]{2}[: ]){5}([0-9a-fA-F]{2}))\s+SrcIp:\s+(\S+)\s+IpPort:\s+(\d+(-\d+)?)\s+IpTOS:\s+(\S+)/ ) { $self->src_mac($1); $self->ip_addr($2); $self->ip_port($3); $self->ip_tos($4); next; } # Role: CONNECT RptTimer: 3000ms RunningFor: 1271256573s StopIn: 0s if ( $ln =~ /Role:\s+(\S+)\s+RptTimer:\s+(\d+)ms\s+RunningFor:\s+(\d+)s\s+StopIn:\s+(\d+)s/ ) { $self->role($1); $self->report_timer($2); $self->running_for($3); $self->stop_in($4); next; } if ( $ln =~ /PktsToSend:\s+(\d+)/) { $self->pkts_to_send($4); next; } # Latency: 0 -:0:- 0 [ 0 0 0 0 0 0 0 0 ] (0) if ( $ln =~ /Latency:\s+(\S+) -:(\S+):- (\S+)\s+\[ (.*) \]\s+\((\S+)\)/ ) { $self->min_lat($1); $self->avg_latency($2); $self->max_lat($3); $self->lat_buckets($4); $self->lat_bucket_size($5); next; } # Last Rpt: 0.000 secs ago RealTxRate: 0bps RealRxRate: 5bps TTL: 0 if ( $ln =~ /Last[- ]Rpt:\s+(\S+) secs ago\s+RealTxRate:\s+(\d+)bps\s+RealRxRate:\s+(\d+)bps\s+TTL:\s+(\S+)/ ) { $self->last_rpt($1); $self->real_tx_rate($2); $self->real_rx_rate($3); $self->ttl($4); next; } # FileName: if ( $ln =~ /FileName:\s+(\S+)\s+SendBadCrc:\s+(\S+)/ ) { $self->filename($1); $self->send_bad_crc($2); next; } elsif ( $ln =~ /FileName:\s+SendBadCrc:\s+(\S+)/ ) { $self->filename(""); $self->send_bad_crc($1); next; } # RxDrop%-SEQ: 0.0000 RxDrop%-CX: 12.1819 if ($ln =~ /RxDrop\%-SEQ:\s+(\S+)\s+RxDrop\%-CX:\s+(\S+)/ ) { $self->rx_drop_seq($1); $self->rx_drop_cx($2); next; } # Multi-Conn: 0 Active-Connections: 0 # Rx Pkts: Total: 0 Time: 300000ms Current: 0 if ($ln =~ /Rx Pkts:\s+Total:\s+(\d+)/ ) { $self->rx_pkts($1); next; } # Rx Bytes: Total: 2455112960 Time: 300000ms Current: 0 if ($ln =~ /Rx Bytes:\s+Total:\s+(\d+)/ ) { $self->rx_bytes($1); next; } # Rx OOO Pkts: Total: 0 Time: 300000ms Current: 0 if ($ln =~ /Rx OOO Pkts:\s+Total:\s+(\d+)/ ) { $self->rx_ooo_pkts($1); next; } # RX Wrong Dev: Total: 0 Time: 300000ms Current: 0 # RX CRC Failed: Total: 0 Time: 300000ms Current: 0 # RX Bit Errors: Total: 0 Time: 3s Cur: 0 0/s if ( $ln =~ /RX Bit Errors:\s+Total:\s+(\d+)/ ) { $self->rx_bit_errors($1); next; } # Rx Dropped Pkts: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /Rx Dropped Pkts:\s+Total:\s+(\d+)/ ) { $self->rx_dropped_pkts($1); next; } # Tx Pkts: Total: 30288945 Time: 300000ms Current: 0 if ( $ln =~ /Tx Pkts:\s+Total:\s+(\d+)/ ) { $self->tx_pkts($1); next; } # Tx Bytes: Total: 3876984960 Time: 300000ms Current: 0 if ( $ln =~ /Tx Bytes:\s+Total:\s+(\d+)/ ) { $self->tx_bytes($1); next; } # Conn Established: Total: 0 Time: 30s Cur: 0 0/s if ( $ln =~ /Conn Established:\s+Total:\s+(\d+)/ ) { $self->conn_estab($1); next; } # TCP Retransmits: Total: 0 Time: 3s Cur: 0 0/s if ( $ln =~ /TCP Retransmits:\s+Total:\s+(\d+)/ ) { $self->tcp_retrans($1); next; } next if ($ln =~ /RX Wrong Dev:/ ); next if ($ln =~ /RX CRC Failed:/); next if ($ln =~ /Multi-Conn:/ ); next if ($ln =~ /Cx Detected:/); next if ($ln =~ /Rx Duplicate Pkts:/); next if ($ln =~ /Tx Failed Pkts:/); next if ($ln =~ /Tx Failed Bytes:/); next if ( $ln =~ /Pkt-Gaps:/ ); next if ( $ln =~ /First-Rx:/); next if ( $ln =~ /RunningInGroup:/); next if ( $ln =~ /[RT]x Pkts .On Wire./); next if ( $ln =~ /[RT]x Bytes .On Wire./); next if ( $ln =~ /Conn Timeouts:/); warn( "Could not parse line -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n" ); return; } # If we were a LANforge-FIRE endpoint. elsif ($got_wl) { print "PARSING WANLINK: $ln\n"; if ( $ln =~ /Shelf:\s+(\d+)\,\s+Card:\s+(\d+)\s+Port:\s+(\d+)\s+Endpoint:\s+(\d+)\s+Type:\s+(\S+)/ ) { # Shelf: 1, Card: 1 Port: 3 Endpoint: 4 Type: WAN_LINK $self->shelf_id($1); $self->card_id($2); $self->port_id($3); $self->ep_id($4); $self->ep_type($5); next; } # Description: $i++; $ln = $ta[$i]; if ( $ln =~ /Description:/ ) { # ignore next; } # MaxTxRate: 4000000bps Latency: 10ms MaxJitter: 0ms if ( $ln =~ /MaxTxRate:\s+(\d+)bps\s+Latency:\s+(\d+)ms\s+MaxJitter:\s+(\d+)ms/ ) { $self->max_tx_rate($1); $self->cfg_latency($2); $self->max_jitter($3); next; } # Case where MaxTxRate < 0. It shouldn't happen, but i added it # so the regression script wouldn't die - Adam. elsif ( $ln =~ /MaxTxRate:\s+-(\d+)bps\s+Latency:\s+(\d+)ms\s+MaxJitter:\s+(\d+)ms/ ) { my $tmp = "-" . $1; $self->max_tx_rate($tmp); $self->cfg_latency($2); $self->max_jitter($3); next; } # DropFreq: 0 DupFreq: 0 ReorderFreq: 0 ExtraBuf: 100KB if ( $ln =~ /DropFreq:\s+(\d+)\s+DupFreq:\s+(\d+)\s+ReorderFreq:\s+(\d+)\s+ExtraBuf:\s+(\d+)KB/ ) { $self->drop_freq($1); $self->dup_freq($2); $self->reord_freq($3); $self->extra_buf($4); next; } # RptTimer: 5000ms RunningFor: 277602940s StopIn: 0s MaxBuf: 103914B if ( $ln =~ /RptTimer:\s+(\d+)ms\s+RunningFor:\s+(\d+)s\s+StopIn:\s+(\d+)s\s+MaxBuf:\s+(\d+)B/ ) { $self->report_timer($1); $self->running_for($2); $self->stop_in($3); $self->max_buf($4); next; } # Cur Backlog: 0 Real Tx Rate: 0bps WanPaths: 1 $i++; $ln = $ta[$i]; if ( $ln =~ /Cur Backlog:\s+(\d+)\s+Real Tx Rate:\s+(\d+)bps\s+WanPaths:\s+(\d+)/ ) { $self->cur_backlog($1); $self->real_tx_rate($2); $self->wan_paths($3); next; } # JitterFreq: 1000 RecordQ: 0 Dump File: if ( $ln =~ /JitterFreq:\s+(\d+)\s+RecordQ:\s+(\d+)\s+Dump File:\s+(\S*)/ ) { $self->jitter_freq($1); $self->record_q($2); $self->dump_file($3); next; } # MinDropAmt: 0 MaxDropAmt: 0 $ln = $ta[ ++$i ]; if ( $ln =~ /MinDropAmt:\s+(\d+)\s+MaxDropAmt:\s+(\d+)/ ) { $self->min_drop_amt($1); $self->max_drop_amt($2); next; } if ( $ln =~ /\s+QueueDiscipline:/ ) { # ignore next; } # Rx Pkts: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /\s+Rx Pkts:\s+Total:\s+(\d+)/ ) { $self->rx_pkts($1); next; } # Adam - I am just matching the fields in these sections for now because I am # not using this data. Will complete when the data is needed # Rx Bytes: Total: 2455112960 Time: 300000ms Current: 0 if ( $ln =~ /Rx Bytes:\s+Total:\s+(\d+)/ ) { $self->rx_bytes($1); next; } # Tx OOO Pkts: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /Tx OOO Pkts:\s+Total:\s+(\d+)/ ) { #$self->tx_ooo_pkts($1); next; } # Rx Dropped Pkts: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /Rx Dropped Pkts:\s+Total:\s+(\d+)/ ) { $self->rx_dropped_pkts($1); next; } # Rx Dropped Bytes: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /Rx Dropped Bytes:\s+Total:\s+(\d+)/ ) { # $self->rx_dropped_bytes($1); next; } # Tx Duplicate Pkts: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /Tx Duplicate Pkts:\s+Total:\s+(\d+)/ ) { #$self->tx_duplicate_pkts($1); next; } # Tx Pkts: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /Tx Pkts:\s+Total:\s+(\d+)/ ) { #$self->tx_pkts_pkts($1); next; } # Tx Bytes: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /Tx Bytes:\s+Total:\s+(\d+)/ ) { $self->tx_bytes($1); next; } # Tx Failed Pkts: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /Tx Failed Pkts:\s+Total:\s+(\d+)/ ) { #$self->tx_failed_pkts($1); next; } # Tx Failed Late Pkts: Total: 5 Time: 60s Cur: 5 0/s if ( $ln =~ /Tx Failed Late Pkts:\s+Total:\s+(\d+)/ ) { # ignore next; } # Tx Failed Bytes: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /Tx Failed Bytes:\s+Total:\s+(\d+)/ ) { next; #$self->tx_bytes($1); } # Tx Failed Late Pkts: Total: 5 Time: 60s Cur: 5 0/s if ( $ln =~ /Tx Failed Late Bytes:\s+Total:\s+(\d+)/ ) { # ignore next; } # Recorded Pkts: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /Recorded Pkts:/ ) { next; } # Recorded Bytes: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /Recorded Bytes:/ ) { next; } # Rcrd Dropped Pkts: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /Rcrd Dropped Pkts:/ ) { next; } # Rcrd Dropped Bytes: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /Rcrd Dropped Bytes:/ ) { next; } else { warn( "LAST LINE? Could not parse line -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n" ); } return; # return for now, the rest of wanlink stuff not completely implemented - Adam # TODO: Adam - redo the rest of this wanpath stuff # WanPaths # my $j = 0; # my $wpaths = ""; # for ( $j = 0 ; $j < $self->wan_paths() ; $j++ ) { # # # Name RxPkts RxBytes Dropped MaxRate(bps) Latency Backlog TxPkts TxBytes # # wp1 0 0 0 56000 6 0 0 0 # $i++; # $ln = $ta[$i]; # if ( $ln =~ #/\s+(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d)\s+(\d+)\s+(\d+)/ # ) # { # $wpaths .= $ln; # } # else { # warn( "Could not parse line -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n" ); # } # $self->wan_path_rpts($wpaths); # } # return; } # If we were a LANforge-ICE endpoint. elsif ($got_voip) { # Skip first line, we ignore VOIP flags for now. if ( $ln =~ /Shelf:\s+(\d+)\,\s+Card:\s+(\d+)\s+Port:\s+(\d+)\s+Endpoint:\s+(\d+)\s+Type:\s+(\S+)/ ) { # Shelf: 1, Card: 1 Port: 3 Endpoint: 4 Type: VOIP $self->shelf_id($1); $self->card_id($2); $self->port_id($3); $self->ep_id($4); $self->ep_type($5); next; } # ProxyIP: 192.168.1.24 PhoneNum: 2102 PeerPhone: 2103 if ( $ln =~ /ProxyIP:\s+(\S+)\s+SipPort:\s+\S+\s+PhoneNum:\s+(\S+)\s+PeerPhone:\s+(\S+)/ ) { $self->proxy_ip($1); $self->phone_num($2); $self->peer_phone_num($3); next; } # MinRtpPort: 10000 MaxRtpPort: 10002 RegExpireTimer: 300 if ( $ln =~ /MinRtpPort:\s+(\S+)\s+MaxRtpPort:\s+(\S+)\s+RegExpireTimer:\s+(\S+)/ ) { $self->min_rtp_port($1); $self->max_rtp_port($2); $self->reg_expire_timer($3); next; } # SoundDev: /dev/dsp TxSoundFile: /tmp/graceland.wav RxSoundFile: /tmp/pcm_rx.wav if ( $ln =~ /SoundDev:\s+(\S+)\s+TxSoundFile:\s+(.*\S)\s+JB-Bufs/ ) { $self->sound_dev($1); $self->tx_sound_file($2); next; } if ( $ln =~ /RxSoundFile:\s+(.*) PESQ-Server/ ) { $self->rx_sound_file($3); next; } # FC-Delay: 5 MinInterCallGap: 5 MaxInterCallGap: 5 if ( $ln =~ /FC-Delay:\s+(\S+)\s+MinInterCallGap:\s+(\S+)\s+MaxInterCallGap:\s+(\S+)/ ) { $self->fc_delay($1); $self->min_ic_gap($2); $self->max_ic_gap($3); next; } # LoopCalls: FOREVER LoopWaveFiles: 1 MinCallDuration: 0 if ( $ln =~ /LoopCalls:\s+(\S+)\s+LoopWaveFiles:\s+(\S+)\s+MinCallDuration:\s+(\S+)\s+Max:\s+(\S+)/ ) { $self->loop_calls($1); $self->loop_wav_files($2); $self->min_call_duration($3); $self->max_call_duration($4); next; } # RegisterState: REGISTERED CallState: CALL_IN_PROGRESS Protocol: SIP/G711U if ( $ln =~ /RegisterState:\s+(\S+)\s+CallState:\s+(\S+)\s+Protocol:\s+(\S+)\/(\S+)/ ) { $self->register_state($1); $self->call_state($2); $self->msg_proto($3); $self->rtp_encoding($4); next; } # RingingTimer: 10000ms LastCallSetup: 12ms StateChangeIn: 4s if ( $ln =~ /RingingTimer:\s+(\S+)\s+LastCallSetup:\s+(\S+)ms\s+StateChangeIn:\s+(\S+)s/ ) { $self->ringing_timer($1); $self->last_call_setup_time($2); $self->state_change_in($3); next; } # RptTimer: 5000ms RunningFor: 150446s StopIn: 206276387s if ( $ln =~ /RptTimer:\s+(\d+)ms\s+RunningFor:\s+(\d+)s\s+StopIn:\s+(\d+)s/ ) { $self->report_timer($1); $self->running_for($2); $self->stop_in($3); next; } # LastRpt: 0.000 secs ago RealWriteRate: 62044bps RealReadRate: 62044bps if ( $ln =~ /LastRpt:\s+(\S+) secs ago\s+RealWriteRate:\s+(\d+)bps\s+RealReadRate:\s+(\d+)bps/ ) { $self->last_rpt($1); $self->real_tx_rate($2); $self->real_rx_rate($3); next; } # Skip VAD settings # Latency: -32 -:-24:- -10 [ 9 1 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] (5) if ($ln =~ /\s+Latency:/) { $self->latency($ln); next; } # RT-Latency: 0 -:73:- 1760 [ 5 0 1 0 0 0 0 2 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] (5) if ($ln =~ /RT-Latency:/) { $self->rt_latency($ln); next; } # Jitter: -20 -:-1:- 2010 [ 891 1 1968 95 0 0 1 0 5 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] (5) if ($ln =~ /Jitter:/) { $self->jitter($ln); next; } # CallSetup: 0 -:13:- 37 [ 0 0 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] (5) if ($ln =~ /CallSetup:/) { $self->call_setup_dist($ln); next; } # CallsAttempted: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /CallsAttempted:\s+Total:\s+(\d+)/ ) { $self->calls_attempted($1); next; } # CallsCompleted: Total: 501 Time: 300000ms Current: 1 if ( $ln =~ /CallsCompleted:\s+Total:\s+(\d+)/ ) { $self->calls_completed($1); next; } # CallsAnswered Total: 502 Time: 300000ms Current: 1 if ( $ln =~ /CallsAnswered.*\s+Total:\s+(\d+)/ ) { $self->calls_answered($1); next; } # CallsConnected Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /CallsConnected.*\s+Total:\s+(\d+)/ ) { $self->calls_connected($1); next; } # CallsRemoteHUP Total: 501 Time: 300000ms Current: 1 if ( $ln =~ /CallsRemoteHUP.*\s+Total:\s+(\d+)/ ) { $self->calls_RHUP($1); next; } # CallsFailed: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /CallsFailed:\s+Total:\s+(\d+)/ ) { $self->calls_failed($1); next; } # RTP Pkts Tx: Total: 7292502 Time: 300000ms Current: 14361 if ( $ln =~ /RTP Pkts Tx:\s+Total:\s+(\d+)/ ) { $self->tx_pkts($1); next; } if ($ln =~ /VAD:/) { next; } # RTP Pkts Rx: Total: 7292442 Time: 300000ms Current: 14361 if ( $ln =~ /RTP Pkts Rx:\s+Total:\s+(\d+)/ ) { $self->rx_pkts($1); next; } # RTP Bytes Tx: Total: 1166800320 Time: 300000ms Current: 2297760 if ( $ln =~ /RTP Bytes Tx:\s+Total:\s+(\d+)/ ) { $self->tx_bytes($1); next; } # RTP Bytes Rx: Total: 1166790720 Time: 300000ms Current: 2297760 if ( $ln =~ /RTP Bytes Rx:\s+Total:\s+(\d+)/ ) { $self->rx_bytes($1); next; } # RTP Pkts Dropped: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /RTP Pkts Dropped:\s+Total:\s+(\d+)/ ) { $self->rx_dropped_pkts($1); next; } # RTP Pkts Dup: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /RTP Pkts Dup:\s+Total:\s+(\d+)/ ) { $self->rx_dup_pkts($1); next; } # RTP Pkts Dropped: Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /RTP Pkts OOO:\s+Total:\s+(\d+)/ ) { $self->rx_ooo_pkts($1); next; } # Skip JB silence played, overruns, underruns #$i += 3; # CallsFailed-404 Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /CallsFailed-404\s+Total:\s+(\d+)/ ) { $self->calls_failed_404($1); next; } # CF 408 (No-Answer) Total: 3 Time: 300000ms Current: 3 if ( $ln =~ /CF 408 \(No-Answer\)\s+Total:\s+(\d+)/ ) { $self->calls_failed_no_answer($1); next; } else { warn( "Could not parse line -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n" ); } # CallsFailed-busy Total: 0 Time: 300000ms Current: 0 if ( $ln =~ /CallsFailed-busy\s+Total:\s+(\d+)/ ) { $self->calls_failed_busy($1); next; } # Rcvd 487 (Cancel) Total: 4 Time: 300000ms Current: 4 if ( $ln =~ /Rcvd 487 \(Cancel\)\s+Total:\s+(\d+)/ ) { $self->rcvd_487_cancel($1); next; } warn( "Could not parse line -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n" ); return; } elsif ($got_arm) { if ( $ln =~ /Shelf:\s+(\d+)\,\s+Card:\s+(\d+)\s+Port:\s+(\d+)\s+Endpoint:\s+(\d+)\s+Type:\s+(\S+)/ ) { #Shelf: 1, Card: 1 Port: 1 Endpoint: 125 Type: ARM_UDP $self->shelf_id($1); $self->card_id($2); $self->port_id($3); $self->ep_id($4); $self->ep_type($5); next; } if ( $ln =~ /MinPktSz:\s+(\d+)B\s+MaxPktSz:\s+(\d+)B\s+Pps:\s+(\d+)/ ) { #MinPktSz: 128B MaxPktSz: 128B Pps: 1 PktsToSend: 0 $self->min_pkt_size($1); $self->max_pkt_size($2); $self->pps($3); } if ( $ln =~ /PktsToSend:\s+(\d+)/) { $self->pkts_to_send($4); next; } if ( $ln =~ /UdpSrcMin:\s+(\d+)\s+UdpSrcMax:\s+(\d+)\s+UdpDstMin:\s+(\d+)\s+UdpDstMax:\s+(\d+)/ ) { #UdpSrcMin: 9 UdpSrcMax: 9 UdpDstMin: 9 UdpDstMax: 9 $self->udp_src_min($1); $self->udp_src_max($2); $self->udp_dst_min($3); $self->udp_dst_max($4); next; } if ( $ln =~ /TcpSrcMin:\s+(\d+.\d+.\d+.\d+)\s+TcpSrcMax:\s+(\d+.\d+.\d+.\d+)\s+TcpDstMin:\s+(\d+.\d+.\d+.\d+)\s+TcpDstMax:\s+(\d+.\d+.\d+.\d+)/ ) { #TcpSrcMin: 192.168.99.2 TcpSrcMax: 192.168.99.2 TcpDstMin: 192.168.99.3 TcpDstMax: 192.168.99.3 $self->min_src_ip($1); $self->max_src_ip($2); $self->min_dst_ip($3); $self->max_dst_ip($4); next; } if ( $ln =~ /SrcMac:\s+(\S\S \S\S \S\S \S\S \S\S \S\S)\s+SrcMacCount:\s+(\d+)\s+RepeatedPkts:\s+(\d+)/ ) { #SrcMac: 00 e4 14 d5 e7 14 SrcMacCount: 0 RepeatedPkts: 0 $self->src_mac($1); $self->src_mac_cnt($2); $self->multi_pkt($3); next; } if ( $ln =~ /DstMac:\s+(\S\S \S\S \S\S \S\S \S\S \S\S)\s+DstMacCount:\s+(\d+)\s+PeerRepeatedPkts:\s+(\d+)/ ) { #DstMac: 00 30 f7 03 c5 4a DstMacCount: 0 PeerRepeatedPkts: 0 $self->dest_mac($1); $self->dst_mac_cnt($2); next; #$self->peer_multi_pkt($3); } if ( $ln =~ /RptTimer:\s+(\d+)ms\s+RunningFor:\s+(\d+)s\s+StopIn:\s+(\d+)s\s+ArmFlags:\s+\S+/ ) { #RptTimer: 156746ms RunningFor: 0s StopIn: 0s ArmFlags: 0x0 $self->report_timer($1); $self->running_for($2); $self->stop_in($3); $self->arm_flags($4); next; } if ( $ln =~ /LastRpt:\s+(\d+)\s+RealTxRate:\s+(\d+)bps\s+RealRxRate:\s+(\d+)bps/ ) { #LastRpt: 137608640 RealTxRate: 0bps RealRxRate: 0bps # print "FOUND LINE 8\n"; next; } warn( "Could not parse line -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n" ); } else { warn( "Could not parse line -:$ln:-\n ".__PACKAGE__.".".__FILE__.".".__LINE__."\n" ); } } #for all the lines in our buffer } #decode sub decodePayload { my $self = shift; my $txt = shift; my @ta = split( /\n/, $txt ); my $i; my $got_one = 0; #print "Endpoint::decodePayload, txt -:$txt:-\n"; my $pld = ""; for ( $i = 0 ; $i < @ta ; $i++ ) { my $ln = $ta[$i]; #print "Line: -:$ln:-\n"; #Endpoint [endp-34-TX] (NOT_RUNNING, RND_PLD_SIZE, RATE_BURSTY) my $nm = $self->{name}; if ( $ln =~ /$nm payload\,/ ) { $got_one = 1; $i++; $ln = $ta[$i]; } # Shelf: 1, Card: 1 Port: 3 Endpoint: 15 Type: CUSTOM_TCP Pattern: CUSTOM if ($got_one) { if ( $ln =~ /(\S.*\S\s)\s\s.*/ ) { $pld .= "$1"; } else { last; #done } } } #for # Trim off remaining white-space if ( $pld =~ /\s*(\S.*\S)\s*/ ) { $self->payload($1); } else { $self->payload(""); } } #decodePayload sub toStringBrief { my $self = shift; return "Endpoint: " . $self->name() . " (" . $self->ep_id() . ")"; my $rv = ""; } #toStringBrief sub isCustom { my $self = shift; my $tp = $self->ep_type(); if (!defined $tp || ($tp eq "")) { return 0; } if ( ( $tp =~ /custom/ ) || ( $tp =~ /CUSTOM/ ) ) { return 1; } return 0; } sub usesIP() { my $self = shift; my $tp = $self->ep_type(); if ( ( $tp =~ /tcp/ ) || ( $tp =~ /udp/ ) ) { return 1; } return 0; } #usesIP sub isOfType { my $self = shift; my $tp = shift; my $_tp = $self->ep_type(); if ( $_tp eq $tp ) { return 1; } # Deal with special (**puke**) cases if ( $_tp eq "LANFORGE" ) { return ( ( $tp eq "lf" ) || ( $tp eq "LF" ) ); } if ( $_tp eq "LANFORGE_UDP" ) { return ( ( $tp eq "lf_udp" ) || ( $tp eq "LF_UDP" ) ); } if ( $_tp eq "LANFORGE_TCP" ) { return ( ( $tp eq "lf_tcp" ) || ( $tp eq "LF_TCP" ) ); } if ( $_tp eq "CUSTOM_ETHER" ) { return ( $tp eq "custom_ether" ); } if ( $_tp eq "CUSTOM_TCP" ) { return ( $tp eq "custom_tcp" ); } if ( $_tp eq "CUSTOM_UDP" ) { return ( $tp eq "custom_udp" ); } if ( $_tp eq "WAN_LINK" ) { return ( $tp eq "wan_link" ); } return 0; } #isOfType # Not sure this works, and I know it does not deal well with WAN_LINK endpoints. # TODO: Support WAN_LINK sub toString { my $self = shift; my $rv = ""; $rv = <<__END_TS; Endpoint [$self->{name}] ($self->{ep_flags}) Shelf: $self->{shelf_id}, Card: $self->{card_id} Port: $self->{port_id} Endpoint: self->{endp_id} Type: self->{endp_type} Pattern: $self->{pattern} MinTxRate: self->{min_tx_rate}bps MaxTxRate: self->{max_tx_rate}bps MinPktSize: self->min_pkt_sizeB MaxPktSize: self->{max_pkt_size}B DestMAC: self->{dst_mac} DestIpAddr: self->{dest_ip_addr} DestIpPort: self->{dst_ip_port} SrcMAC: self->{src_mac} SrcIP: self->{src_ip_addr} IpPort: self->{src_ip_port} IpTOS: self->{ip_tos} Role: self->{role} ReportTimer: self->{report_timer}ms RunningFor: self->{running_for}s StopIn: self->{stop_in}s Last Rpt: self->{last_rpt} secs ago Real Tx Rate: self->{real_tx_rate}bps self->{counters} __END_TS return $rv; } sub getSetCmds { my $self = shift; my @rslt = (); my $i = 0; if ( $self->ep_type() eq "WAN_LINK" ) { $rslt[$i] = ( "add_wl_endp " . $self->name() . " " . $self->shelf_id() . " " . $self->card_id() . " " . $self->port_id() . " " . $self->cfg_latency() . " " . $self->max_tx_rate() ); $i++; $rslt[$i] = ( "set_wanlink_info " . $self->name() . " " . $self->max_tx_rate() . " " . $self->cfg_latency() . " " . " " . $self->max_jitter() . " " . $self->reord_freq() . " " . $self->extra_buffer() . " " . $self->drop_freq . " " . $self->dup_freq() ); $i++; } # TODO: Support other types of endpoints. #elsif ($self->ep_type() eq "WAN_LINK") { else { $rslt[$i] = ( "add_endp " . $self->name() . " " . $self->shelf_id() . " " . $self->card_id() . " " . $self->port_id() . " " . $self->getSetType() . " " . $self->getSetIpPort() . " " . $self->getBursty() . " " . $self->min_tx_rate() . " " . $self->max_tx_rate() . " " . $self->size_random() . " " . $self->min_pkt_size() . " " . $self->max_pkt_size() . " " . $self->pattern() . " " . $self->checksum() ); $i++; $rslt[$i] = ( "set_endp_tos " . $self->name() . " " . $self->ip_tos() ); $i++; } return @rslt; } #getSetCmds sub getSetPayloadCmd { my $self = shift; return "set_endp_pay " . $self->name() . " custom " . $self->payload(); } #getPayloadSetCmd sub getSetType { my $self = shift; my $tp = $self->ep_type(); if (!defined $tp || ($tp eq "")) { print STDERR "Endpoint type not defined\n"; return ""; } if ( $tp eq "LANFORGE" ) { return "lf"; } if ( $tp eq "LANFORGE_UDP" ) { return "lf_udp"; } if ( $tp eq "LANFORGE_TCP" ) { return "lf_tcp"; } return $tp; } #getSetType sub getSetIpPort { my $self = shift; if ( $self->isFlagSet("IP_PORT_AUTO") ) { return "-1"; } return $self->ip_port(); } ############################################## ## methods to access per-object data ## ## ## ## With args, they set the value. Without ## ## any, they only retrieve it/them. ## ############################################## sub name { my $self = shift; if (@_) { $self->{name} = shift } return $self->{name}; } sub setRandom { my $self = shift; my $val = shift; if ( $val eq "YES" ) { $self->ensureFlagSet("RND_PLD_SIZE"); $self->ensureFlagNotSet("FIXED_PLD_SIZE"); } else { $self->ensureFlagNotSet("RND_PLD_SIZE"); $self->ensureFlagSet("FIXED_PLD_SIZE"); } #print "Endpoint::setBursty -:$val:- flags: " . $self->ep_flags() . "\n"; } #setBursty sub size_random { my $self = shift; if ( $self->isFlagSet("RND_PLD_SIZE") ) { return "YES"; } return "NO"; } sub checksum { my $self = shift; if ( $self->isFlagSet("CHECKSUM") ) { return "YES"; } return "NO"; } sub setBursty { my $self = shift; my $val = shift; if ( $val eq "YES" ) { $self->ensureFlagSet("RATE_BURSTY"); } else { $self->ensureFlagNotSet("RATE_BURSTY"); } #print "Endpoint::setBursty -:$val:- flags: " . $self->ep_flags() . "\n"; } #setBursty sub getBursty { my $self = shift; #print "Endpoint::getBursty flags: " . $self->ep_flags() . "\n"; if ( $self->isFlagSet("RATE_BURSTY") ) { return "YES"; } return "NO"; } sub isRunning { my $self = shift; #print "Endpoint::getBursty flags: " . $self->ep_flags() . "\n"; if ( $self->isFlagSet("NOT_RUNNING") ) { return "NO"; } return "YES"; } sub ensureFlagSet { my $self = shift; my $flg = shift; my $flgs = $self->ep_flags(); if ( $flgs =~ /$flg/ ) { return; } else { $flgs .= "$flg "; $self->ep_flags($flgs); } } #ensureFlagSet sub ensureFlagNotSet { my $self = shift; my $flg = shift; my $flgs = $self->ep_flags(); if ( $flgs =~ /$flg/ ) { $flgs =~ s/$flg//; $self->ep_flags($flgs); } else { return; } } #ensureFlagNotSet sub isFlagSet { my $self = shift; my $flg = shift; my $cur_flgs = $self->ep_flags(); #print "Endpoint::isFlagSet, flags -:$cur_flgs:- flg -:$flg:-\n"; if ( $cur_flgs =~ /$flg/ ) { return 1; } return 0; } #isFlagSet sub ep_flags { my $self = shift; if (@_) { $self->{ep_flags} = shift } return $self->{ep_flags}; } sub tx_bytes { my $self = shift; if (@_) { $self->{tx_bytes} = shift } return $self->{tx_bytes}; } sub rx_bytes { my $self = shift; if (@_) { $self->{rx_bytes} = shift } return $self->{rx_bytes}; } 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_dropped_pkts { my $self = shift; if (@_) { $self->{rx_dropped_pkts} = shift } return $self->{rx_dropped_pkts}; } sub ttl { my $self = shift; if (@_) { $self->{ttl} = shift } return $self->{ttl}; } sub rx_ooo_pkts { my $self = shift; if (@_) { $self->{rx_ooo_pkts} = shift } return $self->{rx_ooo_pkts}; } sub rx_dup_pkts { my $self = shift; if (@_) { $self->{rx_dup_pkts} = shift } return $self->{rx_dup_pkts}; } 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 ep_id { my $self = shift; if (@_) { $self->{endp_id} = shift } return $self->{endp_id}; } sub ep_type { my $self = shift; if (@_) { $self->{endp_type} = shift } return $self->{endp_type}; } sub payload { my $self = shift; if (@_) { $self->{payload} = shift } return $self->{payload}; } sub pattern { my $self = shift; if (@_) { $self->{pattern} = shift } return $self->{pattern}; } sub min_tx_rate { my $self = shift; if (@_) { $self->{min_tx_rate} = shift } return $self->{min_tx_rate}; } sub max_tx_rate { my $self = shift; if (@_) { $self->{max_tx_rate} = shift } return $self->{max_tx_rate}; } sub min_pkt_size { my $self = shift; if (@_) { $self->{min_pkt_size} = shift } return $self->{min_pkt_size}; } sub max_pkt_size { my $self = shift; if (@_) { $self->{max_pkt_size} = shift } return $self->{max_pkt_size}; } sub dest_mac { my $self = shift; if (@_) { $self->{dst_mac} = shift } return $self->{dst_mac}; } sub dest_ip_addr { my $self = shift; if (@_) { $self->{dst_ip_addr} = shift } return $self->{dst_ip_addr}; } sub dest_ip_port { my $self = shift; if (@_) { $self->{dst_ip_port} = shift } return $self->{dst_ip_port}; } sub src_mac { my $self = shift; if (@_) { $self->{src_mac} = shift } return $self->{src_mac}; } sub ip_addr { my $self = shift; if (@_) { $self->{ip_addr} = shift } return $self->{ip_addr}; } sub ip_port { my $self = shift; if (@_) { $self->{ip_port} = shift } return $self->{ip_port}; } sub ip_tos { my $self = shift; if (@_) { $self->{ip_tos} = shift } return $self->{ip_tos}; } sub role { my $self = shift; if (@_) { $self->{role} = shift } return $self->{role}; } sub report_timer { my $self = shift; if (@_) { $self->{report_timer} = shift } return $self->{report_timer}; } sub running_for { my $self = shift; if (@_) { $self->{running_for} = shift } return $self->{running_for}; } sub stop_in { my $self = shift; if (@_) { $self->{stop_in} = shift } return $self->{stop_in}; } sub last_rpt { my $self = shift; if (@_) { $self->{last_rpt} = shift } return $self->{last_rpt}; } sub real_tx_rate { my $self = shift; if (@_) { $self->{real_tx_rate} = shift } return $self->{real_tx_rate}; } sub real_rx_rate { my $self = shift; if (@_) { $self->{real_rx_rate} = shift } return $self->{real_rx_rate}; } sub cur_backlog { my $self = shift; if (@_) { $self->{cur_backlog} = shift } return $self->{cur_backlog}; } sub avg_latency { my $self = shift; if (@_) { $self->{avg_latency} = shift } return $self->{avg_latency}; } sub filename { my $self = shift; if (@_) { $self->{filename} = shift } return $self->{filename}; } sub send_bad_crc { my $self = shift; if (@_) { $self->{send_bad_crc} = shift } return $self->{send_bad_crc}; } sub rx_drop_seq { my $self = shift; if (@_) { $self->{rx_drop_seq} = shift } return $self->{rx_drop_seq}; } sub rx_drop_cx { my $self = shift; if (@_) { $self->{rx_drop_cx} = shift } return $self->{rx_drop_cx}; } sub rx_bit_errors { my $self = shift; if (@_) { $self->{rx_bit_errors} = shift } return $self->{rx_bit_errors}; } sub conn_estab { my $self = shift; if (@_) { $self->{conn_estab} = shift } return $self->{conn_estab}; } sub tcp_retrans { my $self = shift; if (@_) { $self->{tcp_retrans} = shift } return $self->{tcp_retrans}; } sub min_lat { my $self = shift; if (@_) { $self->{min_lat} = shift } return $self->{min_lat}; } sub max_lat { my $self = shift; if (@_) { $self->{max_lat} = shift } return $self->{max_lat}; } sub lat_buckets { my $self = shift; if (@_) { $self->{lat_buckets} = shift } return $self->{lat_buckets}; } sub lat_bucket_size { my $self = shift; if (@_) { $self->{lat_bucket_size} = shift } return $self->{lat_bucket_size}; } sub cfg_latency { my $self = shift; if (@_) { $self->{cfg_latency} = shift } return $self->{cfg_latency}; } sub max_jitter { my $self = shift; if (@_) { $self->{max_jitter} = shift } return $self->{max_jitter}; } sub wan_paths { my $self = shift; if (@_) { $self->{wan_paths} = shift } return $self->{wan_paths}; } sub drop_freq { my $self = shift; if (@_) { $self->{drop_freq} = shift } return $self->{drop_freq}; } sub dup_freq { my $self = shift; if (@_) { $self->{dup_freq} = shift } return $self->{dup_freq}; } sub jitter_freq { my $self = shift; if (@_) { $self->{jitter_freq} = shift } return $self->{jitter_freq}; } sub record_q { my $self = shift; if (@_) { $self->{record_q} = shift } return $self->{record_q}; } sub dump_file { my $self = shift; if (@_) { $self->{dump_file} = shift } return $self->{dump_file}; } sub min_drop_amt { my $self = shift; if (@_) { $self->{min_drop_amt} = shift } return $self->{min_drop_amt}; } sub max_drop_amt { my $self = shift; if (@_) { $self->{max_drop_amt} = shift } return $self->{max_drop_amt}; } sub reord_freq { my $self = shift; if (@_) { $self->{reord_freq} = shift } return $self->{reord_freq}; } sub max_buf { my $self = shift; if (@_) { $self->{max_buf} = shift } return $self->{max_buf}; } sub extra_buf { my $self = shift; if (@_) { $self->{extra_buf} = shift } return $self->{extra_buf}; } sub counters { my $self = shift; if (@_) { $self->{counters} = shift } return $self->{counters}; } sub proxy_ip { my $self = shift; if (@_) { $self->{proxy_ip} = shift } return $self->{proxy_ip}; } sub phone_num { my $self = shift; if (@_) { $self->{phone_num} = shift } return $self->{phone_num}; } sub peer_phone_num { my $self = shift; if (@_) { $self->{peer_phone_num} = shift } return $self->{peer_phone_num}; } sub min_rtp_port { my $self = shift; if (@_) { $self->{min_rtp_port} = shift } return $self->{min_rtp_port}; } sub max_rtp_port { my $self = shift; if (@_) { $self->{max_rtp_port} = shift } return $self->{max_rtp_port}; } sub reg_expire_timer { my $self = shift; if (@_) { $self->{reg_expire_timer} = shift } return $self->{reg_expire_timer}; } sub sound_dev { my $self = shift; if (@_) { $self->{sound_dev} = shift } return $self->{sound_dev}; } sub tx_sound_file { my $self = shift; if (@_) { $self->{tx_sound_file} = shift } return $self->{tx_sound_file}; } sub rx_sound_file { my $self = shift; if (@_) { $self->{rx_sound_file} = shift } return $self->{rx_sound_file}; } sub fc_delay { my $self = shift; if (@_) { $self->{fc_delay} = shift } return $self->{fc_delay}; } sub min_ic_gap { my $self = shift; if (@_) { $self->{min_ic_gap} = shift } return $self->{min_ic_gap}; } sub max_ic_gap { my $self = shift; if (@_) { $self->{max_ic_gap} = shift } return $self->{max_ic_gap}; } sub loop_calls { my $self = shift; if (@_) { $self->{loop_calls} = shift } return $self->{loop_calls}; } sub loop_wav_files { my $self = shift; if (@_) { $self->{loop_wav_files} = shift } return $self->{loop_wav_files}; } sub min_call_duration { my $self = shift; if (@_) { $self->{min_call_duration} = shift } return $self->{min_call_duration}; } sub state_change_in { my $self = shift; if (@_) { $self->{state_change_in} = shift } return $self->{state_change_in}; } sub call_setup_dist { my $self = shift; if (@_) { $self->{call_setup_dist} = shift } return $self->{call_setup_dist}; } sub last_call_setup_time { my $self = shift; if (@_) { $self->{last_call_setup_time} = shift } return $self->{last_call_setup_time}; } sub max_call_duration { my $self = shift; if (@_) { $self->{max_call_duration} = shift } return $self->{max_call_duration}; } sub register_state { my $self = shift; if (@_) { $self->{register_state} = shift } return $self->{register_state}; } sub call_state { my $self = shift; if (@_) { $self->{call_state} = shift } return $self->{call_state}; } sub msg_proto { my $self = shift; if (@_) { $self->{msg_proto} = shift } return $self->{msg_proto}; } sub rtp_encoding { my $self = shift; if (@_) { $self->{rtp_encoding} = shift } return $self->{rtp_encoding}; } sub latency { my $self = shift; if (@_) { $self->{latency} = shift } return $self->{latency}; } sub rt_latency { my $self = shift; if (@_) { $self->{rt_latency} = shift } return $self->{rt_latency}; } sub jitter { my $self = shift; if (@_) { $self->{jitter} = shift } return $self->{jitter}; } sub calls_attempted { my $self = shift; if (@_) { $self->{calls_attempted} = shift } return $self->{calls_attempted}; } sub calls_completed { my $self = shift; if (@_) { $self->{calls_completed} = shift } return $self->{calls_completed}; } sub calls_answered { my $self = shift; if (@_) { $self->{calls_answered} = shift } return $self->{calls_answered}; } sub calls_connected { my $self = shift; if (@_) { $self->{calls_connected} = shift } return $self->{calls_connected}; } sub calls_RHUP { my $self = shift; if (@_) { $self->{calls_RHUP} = shift } return $self->{calls_RHUP}; } sub calls_failed { my $self = shift; if (@_) { $self->{calls_failed} = shift } return $self->{calls_failed}; } sub calls_failed_404 { my $self = shift; if (@_) { $self->{calls_failed_404} = shift } return $self->{calls_failed_404}; } sub calls_failed_busy { my $self = shift; if (@_) { $self->{calls_failed_busy} = shift } return $self->{calls_failed_busy}; } sub calls_failed_no_answer { my $self = shift; if (@_) { $self->{calls_failed_no_answer} = shift } return $self->{calls_failed_no_answer}; } sub rcvd_487_cancel { my $self = shift; if (@_) { $self->{rcvd_487_cancel} = shift } return $self->{rcvd_487_cancel}; } sub ringing_timer { my $self = shift; if (@_) { $self->{ringing_timer} = shift } return $self->{ringing_timer}; } # # Armageddon get/set functions - Added by Adam # sub udp_src_min { my $self = shift; if (@_) { $self->{udp_src_min} = shift } return $self->{udp_src_min}; } sub udp_src_max { my $self = shift; if (@_) { $self->{udp_src_max} = shift } return $self->{udp_src_max}; } sub udp_dst_min { my $self = shift; if (@_) { $self->{udp_dst_min} = shift } return $self->{udp_dst_min}; } sub udp_dst_max { my $self = shift; if (@_) { $self->{udp_dst_max} = shift } return $self->{udp_dst_max}; } sub pps { my $self = shift; if (@_) { $self->{pps} = shift } return $self->{pps}; } sub pkts_to_send { my $self = shift; if (@_) { $self->{pkts_to_send} = shift } return $self->{pkts_to_send}; } sub arm_flags { my $self = shift; if (@_) { $self->{arm_flags} = shift } return $self->{arm_flags}; } sub src_mac_cnt { my $self = shift; if (@_) { $self->{src_mac_cnt} = shift } return $self->{src_mac_cnt}; } sub dst_mac_cnt { my $self = shift; if (@_) { $self->{dst_mac_cnt} = shift } return $self->{dst_mac_cnt}; } sub multi_pkt { my $self = shift; if (@_) { $self->{multi_pkt} = shift } return $self->{multi_pkt}; } sub min_src_ip { my $self = shift; if (@_) { $self->{min_src_ip} = shift } return $self->{min_src_ip}; } sub max_src_ip { my $self = shift; if (@_) { $self->{max_src_ip} = shift } return $self->{max_src_ip}; } sub min_dst_ip { my $self = shift; if (@_) { $self->{min_dst_ip} = shift } return $self->{min_dst_ip}; } sub max_dst_ip { my $self = shift; if (@_) { $self->{max_dst_ip} = shift } return $self->{max_dst_ip}; } 1; # So the require or use succeeds (perl stuff) __END__ # Plain Old Documentation (POD) =head1 NAME Endpoint - class to implement LANforge Endpoints =head1 SYNOPSIS use LANforge::Endpoint ################# # class methods # ################# $ob = LANforge::Endpoint->new; ####################### # object data methods # ####################### ### get versions ### $name = $ob->name; ### set versions ### $ob->name("endp-2-TX"); ######################## # other object methods # ######################## $ob->decode("CLI output that contains this Endpoint's output"); =head1 DESCRIPTION The Endpoint class gives you some clever access into the Endpoint 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