proc VerifyArpDiscoveries { {ExitTest doNotExitTest} } { # This API is for Protocol Interface arp discovery. Not for NGPF. # First, get a list of all the expected Gateway IP addresses for this vPort. # Get only if the interface is enabled. We don't care about gateways if the # interface isn't enable. # Then get a list of all the discovered arps. # At the end, compare the two list. Any left overs are unresolved arps. set resolvedArp {} set allIpGateways {} foreach vP [ixNet getList [ixNet getRoot] vport] { # Refresh the arp table on this vport first ixNet execute refreshUnresolvedNeighbors $vP set currentVportInterfaceList [ixNet getList $vP interface] foreach int $currentVportInterfaceList { # Ignore the Unconnected (Routed), and GRE interfaces set interfaceType [ixNet getAttribute $int -type] if {[regexp "default" $interfaceType]} { # Only lappend the Gateway if the Interface is enabled. set isIntEnabled [ixNet getAttribute $int -enabled] if {$isIntEnabled == "true" || $isIntEnabled == "True"} { catch {ixNet getAttribute $int/ipv4 -gateway} ipv4GatewayReturn if {[regexp "null" $ipv4GatewayReturn] != 1} { if {[lsearch $allIpGateways $ipv4GatewayReturn] == -1} { lappend allIpGateways $ipv4GatewayReturn } } catch {ixNet getList $int ipv6} ipv6GatewayList if {$ipv6GatewayList != ""} { foreach ipv6Gateway $ipv6GatewayList { set ipv6 [ixNet getAttribute $ipv6Gateway -gateway] if {$ipv6 != "0:0:0:0:0:0:0:0"} { if {[lsearch $allIpGateways $ipv6] == -1} { lappend allIpGateways $ipv6 } } } } } } } } puts "\nVerifyArpDiscoveries: Expected ARPs to be resolved:\n" foreach arp $allIpGateways { puts "\t$arp" } puts \n foreach vP [ixNet getList [ixNet getRoot] vport] { # Get all the discovered ARPs for the current vPort set vPortInterfaceList [ixNet getList $vP discoveredNeighbor] if {$vPortInterfaceList != ""} { set currentPort [GetVportConnectedToPort $vP] # vPortInt = ::ixNet::OBJ-/vport:1/discoveredNeighbor:1 foreach vPortInt $vPortInterfaceList { set currentVp [join [lrange [split $vPortInt /] 0 1] /] set discoveredIp [ixNet getAttribute $vPortInt -neighborIp] set discoveredMac [ixNet getAttribute $vPortInt -neighborMac] puts "VerifyArpDiscoveries: Discovered arp on $currentPort: $discoveredIp : $discoveredMac" if {$discoveredMac != "" || $discoveredMac != "00:00:00:00:00:00"} { if {[lsearch $allIpGateways $discoveredIp] != -1} { lappend resolvedArp $discoveredIp } } } } } # Now compare the expected list of arps with what is resolved. # Any left overs are unresovled arps. foreach resolvedGateway $resolvedArp { if {[lsearch $allIpGateways $resolvedGateway] != -1} { set index [lsearch $allIpGateways $resolvedGateway] set allIpGateways [lreplace $allIpGateways $index $index] } } if {$allIpGateways != ""} { puts "\nVerifyArpDiscoveriesArp: Unresolved Arps:" foreach unresolvedArp $allIpGateways { puts "\t$unresolvedArp" } puts \n puts "VerifyArpDiscoveries: Unresolved arps: $allIpGateways" return 1 } else { puts "\nVerifyArpDiscoveries: All arps are resolved" return 0 } }