Просмотр исходного кода

Merge pull request #458 from steveeJ/hostgw-checkroutes

hostgw: check for route existence before adding
Tom Denham 8 лет назад
Родитель
Сommit
264f0c8320
1 измененных файлов с 21 добавлено и 1 удалено
  1. 21 1
      backend/hostgw/network.go

+ 21 - 1
backend/hostgw/network.go

@@ -92,7 +92,27 @@ func (n *network) handleSubnetEvents(batch []subnet.Event) {
 				Gw:        evt.Lease.Attrs.PublicIP.ToIP(),
 				LinkIndex: n.linkIndex,
 			}
-			if err := netlink.RouteAdd(&route); err != nil {
+
+			// Check if route exists before attempting to add it
+			routeList, err := netlink.RouteListFiltered(netlink.FAMILY_V4, &netlink.Route{
+				Dst: route.Dst,
+			}, netlink.RT_FILTER_DST)
+			if err != nil {
+				log.Warningf("Unable to list routes: %v", err)
+			}
+			//   Check match on Dst for match on Gw
+			if len(routeList) > 0 && !routeList[0].Gw.Equal(route.Gw) {
+				// Same Dst different Gw. Remove it, correct route will be added below.
+				log.Warningf("Replacing existing route to %v via %v with %v via %v.", evt.Lease.Subnet, routeList[0].Gw, evt.Lease.Subnet, evt.Lease.Attrs.PublicIP)
+				if err := netlink.RouteDel(&route); err != nil {
+					log.Errorf("Error deleting route to %v: %v", evt.Lease.Subnet, err)
+					continue
+				}
+			}
+			if len(routeList) > 0 && routeList[0].Gw.Equal(route.Gw) {
+				// Same Dst and same Gw, keep it and do not attempt to add it.
+				log.Infof("Route to %v via %v already exists, skipping.", evt.Lease.Subnet, evt.Lease.Attrs.PublicIP)
+			} else if err := netlink.RouteAdd(&route); err != nil {
 				log.Errorf("Error adding route to %v via %v: %v", evt.Lease.Subnet, evt.Lease.Attrs.PublicIP, err)
 				continue
 			}