proc GetEgressStats { args } { # Remove all existing TCL Views first. ixNet execute removeAllTclViews set argIndex 0 while {$argIndex < [llength $args]} { set currentArg [lindex $args $argIndex] switch -exact -- $currentArg { -trafficItemName { set trafficItemName [lindex $args [expr $argIndex + 1]] incr argIndex 2 } -port { set port [lindex $args [expr $argIndex + 1]] incr argIndex 2 } -offset { set customOffset [lindex $args [expr $argIndex + 1]] incr argIndex 2 } -bits { set bits [lindex $args [expr $argIndex + 1]] incr argIndex 2 } -field { set field [lindex $args [expr $argIndex + 1]] incr argIndex 2 } -csvFileName { set csvFileName [lindex $args [expr $argIndex + 1]] exec echo "" > $csvFileName incr argIndex 2 } default { puts "\nError GetEgressStats: No such parameter: $currentArg" return 1 } } } set offset "Custom: ($bits bits at offset $customOffset)" set view [ixNet add [ixNet getRoot]statistics "view"] ixNet setMultiAttribute $view -caption "EgressView" -treeViewNodeName "Egress\\Custom\ Views" -type layer23TrafficFlow -visible true #ixNet setMultiAttribute $view -caption "$trafficItemName\View" -type layer23TrafficFlow -visible true ixNet setMultiAttribute $view -caption "EgressStats" -type layer23TrafficFlow -visible true ixNet commit set view [lindex [ixNet remapIds $view] 0] set trafficFlowFilter [ixNet add $view "layer23TrafficFlowFilter"] ixNet setMultiAttribute $trafficFlowFilter -egressLatencyBinDisplayOption showEgressRows ixNet commit set trafficFlowFilter [lindex [ixNet remapIds $trafficFlowFilter] 0] # ::ixNet::OBJ-/statistics/view:"EgressView"/layer23TrafficFlowFilter/enumerationFilter:L81 set enumerationFilter2 [ixNet add $trafficFlowFilter "enumerationFilter"] ixNet setMultiAttribute $enumerationFilter2 -sortDirection ascending ixNet commit set enumerationFilter2 [lindex [ixNet remapIds $enumerationFilter2] 0] # ::ixNet::OBJ-/statistics/view:"EgressView"/layer23TrafficFlowFilter/enumerationFilter:L81 set enumerationFilter3 [ixNet add $trafficFlowFilter "enumerationFilter"] ixNet setMultiAttribute $enumerationFilter3 -sortDirection ascending ixNet commit set enumerationFilter3 [lindex [ixNet remapIds $enumerationFilter3] 0] puts "\n-portFilterIds: [list $view/availablePortFilter:"$port"]" # The -portFilterIds needs to be in this format: # ::ixNet::OBJ-/statistics/view:"EgressStats"/availablePortFilter:"10.205.4.155/Card1/Port2" # layer23TrafficFlowFilter will use the -portFilterIds port handles to retrieve egress stats from. ixNet setMultiAttribute $trafficFlowFilter -portFilterIds [list $view/availablePortFilter:"$port"] ixNet setMultiAttribute $trafficFlowFilter -trafficItemFilterIds [list $view/availableTrafficItemFilter:"$trafficItemName"] ixNet setMultiAttribute $enumerationFilter2 -trackingFilterId $view/availableTrackingFilter:"$offset" ixNet setMultiAttribute $enumerationFilter3 -trackingFilterId $view/availableTrackingFilter:"$field" catch {ixNet commit} errMsg if {$errMsg != "::ixNet::OK"} { puts "\nError GetEgressStats: $field must be selected in Flow Tracking for tracking:\n$errMsg\n" return 1 } # Enable all the statistic counters foreach {statistic} [ixNet getList $view statistic] { ixNet setAttribute $statistic -enabled true } ixNet commit puts "\nGetEgressStats: Created and enabling: $view" puts "\nRetrieving egress stats is intense processing." puts "Please wait ~1.5 minutes ..." catch {ixNet setMultiAttribute $view -enabled true} errMsg puts "\nGetEgressStats: Enabling statView $view : $errMsg" catch {ixNet commit} errMsg # These are all the stat counters on the page set columnList [ixNet getAttribute ${view}/page -columnCaptions] if {[info exists csvFileName]} { # Using a foreach loop to add a comma in between each item for csv. set newColumnList {} set needComma false foreach item $columnList { if {$needComma} { # Don't put a comma in front. # And don't put a comma at the end. append newColumnList , } else { set needComma true } append newColumnList $item } exec echo $newColumnList >> $csvFileName } set totalPages [ixNet getAttribute $view/page -totalPages] for {set currPage 1} {$currPage <= $totalPages} {incr currPage} { ixNet setAttribute $view/page -currentPage $currPage ixNet commit set rowValues [ixNet getAttribute ${view}/page -rowValues] set totalRowsOfStatistics [llength $rowValues] #puts "\n---- rowValues: $rowValues ----\n" for {set pageListIndex 0} {$pageListIndex <= $totalRowsOfStatistics} {incr pageListIndex} { set rowList [lindex $rowValues $pageListIndex] for {set rowIndex 0} {$rowIndex < [llength $rowList]} {incr rowIndex} { set cellLineFlag 0 set getOneTimeOnlyFlag 0 foreach row $rowList { if {[info exists csvFileName]} { exec echo $row >> $csvFileName } #puts "\n---- foreach row: $row ----\n" foreach column $columnList item $row { # Using cellLineFlag to control only getting stats on the # first line. Ignore the second line. # Already parsed out the egress tracking. if {$cellLineFlag == 0} { if {$getOneTimeOnlyFlag == 0} { set ingressTracking [lindex $row 1] #puts "\nIngressTracking: $ingressTracking" if {$column == "Rx Port"} { set port [GetAssignedPort $item] } set getOneTimeOnlyFlag 1 } set column [join $column _] set item [join $item _] #puts "--- $column : $item ----" keylset egressStats rxPort.$port.$trafficItemName.ingress.$ingressTracking.$column $item } } # We just want the egressing value. That is it. if {$cellLineFlag == 1} { set egressTrackingIndex [lsearch $columnList "Egress Tracking"] set egressTracking [lindex $row $egressTrackingIndex] keylset egressStats rxPort.$port.$trafficItemName.ingress.$ingressTracking.Egressing-As $egressTracking } set cellLineFlag 1 } } } } if {[info exists ::removeTclViewStats] == 1 && $::removeTclViewStats == 1} { ixNet remove $view ixNet commit } return $egressStats }