|
@@ -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
|
|
|
}
|