func()

in pkg/initalizer/iproute/route_linux.go [11:45]


func (l *agentLink) SetupRouteTableForAddrFamily(ctx context.Context, family AddrFamily) error {
	log := logger.FromContext(ctx)

	newRoute := &netlink.Route{
		LinkIndex: l.link.Attrs().Index,
		Dst:       family.LinkLocalAddr.IPNet,
	}

	routeList, err := l.netlinkHandle.RouteList(nil, family.Family)
	if err != nil {
		return fmt.Errorf("unable to fetch newRoute list for interface %s: %w", l.link.Attrs().Name, err)
	}

	// search for the newRoute, if it already exists do not create it
	for _, existingRoute := range routeList {
		log.Tracef("Got route: (tbl: %v, dst: %v, iface idx: %v)", existingRoute.Table, existingRoute.Dst, existingRoute.LinkIndex)
		if dstRoutesEq(&existingRoute, newRoute) {
			if err = l.validateRouteLinkMatch(existingRoute); err != nil {
				return err
			}
			log.Infof("Route (dst: %v, iface idx: %v) already exists, skipping creation", existingRoute.Dst, existingRoute.LinkIndex)
			return nil
		} else {
			log.Tracef("Discarding route %v as it doesnt contain %v", existingRoute.Dst, family.LinkLocalAddr.IP)
		}
	}

	err = l.netlinkHandle.RouteAdd(newRoute)
	if err != nil {
		return fmt.Errorf("unable to create route for addr %v: %v", family.LinkLocalAddr, err)
	}
	log.Infof("Created newRoute (dst: %v, iface idx: %v)", newRoute.Dst, newRoute.LinkIndex)

	return nil
}