@@ -54,30 +54,47 @@ func GetNextHop(node *graph.Node, ip net.IP) (*NextHop, error) {
5454 for _ , t := range * rts {
5555 var defaultRouteIP net.IP
5656 var defaultIfIndex int64
57+ var nh * NextHop
58+
59+ getNeighbor := func (ip net.IP ) string {
60+ if neighbors != nil {
61+ return neighbors .getMAC (ip )
62+ }
63+ return ""
64+ }
5765
5866 for _ , r := range t .Routes {
5967 ipnet := net .IPNet (r .Prefix )
6068 if r .Prefix .IsDefaultRoute () {
6169 defaultRouteIP = r .NextHops [0 ].IP
6270 defaultIfIndex = r .NextHops [0 ].IfIndex
6371 } else if ipnet .Contains (ip ) {
64- nextIP := r .NextHops [0 ].IP
65- nh := & NextHop {IfIndex : r .NextHops [0 ].IfIndex }
66- if nextIP != nil {
67- nh .IP = nextIP
68- if neighbors != nil {
69- nh .MAC = neighbors .getMAC (nextIP )
70- }
72+ nh = & NextHop {IfIndex : r .NextHops [0 ].IfIndex }
73+
74+ if r .NextHops [0 ].IP != nil {
75+ nh .IP = r .NextHops [0 ].IP
76+ nh .MAC = getNeighbor (nh .IP )
77+
78+ // dedicated NH so return here
79+ return nh , nil
7180 }
72- return nh , nil
81+
82+ // same network but maybe a dedicated route, keep checking
83+ nh .IP = ip
84+ nh .MAC = getNeighbor (nh .IP )
7385 }
7486 }
7587
88+ // one route found
89+ if nh != nil {
90+ return nh , nil
91+ }
92+
93+ // no route found try with the default
7694 if defaultRouteIP != nil {
7795 nh := & NextHop {IP : defaultRouteIP , IfIndex : defaultIfIndex }
78- if neighbors != nil {
79- nh .MAC = neighbors .getMAC (defaultRouteIP )
80- }
96+ nh .MAC = getNeighbor (nh .IP )
97+
8198 return nh , nil
8299 }
83100 }
0 commit comments