func()

in cmd/core_plugin/network/route/route_linux.go [252:309]


func (lc *linuxClient) MissingRoutes(ctx context.Context, iface string, addresses address.IPAddressMap) ([]Handle, error) {
	var ignoreAddrs []*address.IPAddr

	config := cfg.Retrieve()

	opts := Options{
		Table:  "local",
		Type:   "local",
		Proto:  config.IPForwarding.EthernetProtoID,
		Device: iface,
	}

	ipv6Routes, err := Find(ctx, opts)
	if err != nil {
		return nil, fmt.Errorf("failed to find IPv6 routes: %w", err)
	}

	for _, route := range ipv6Routes {
		ignoreAddrs = append(ignoreAddrs, route.Destination)
	}

	opts.Scope = "host"
	ipv4Routes, err := Find(ctx, opts)
	if err != nil {
		return nil, fmt.Errorf("failed to find IPv4 routes: %w", err)
	}

	for _, route := range ipv4Routes {
		ignoreAddrs = append(ignoreAddrs, route.Destination)
	}

	wantedRoutes := make(address.IPAddressMap)
	maps.Copy(wantedRoutes, addresses)

	wantedRoutes.RemoveIPAddrs(ignoreAddrs)
	var addrs []*address.IPAddr

	for _, addr := range wantedRoutes {
		addrs = append(addrs, addr)
	}

	sort.Slice(addrs, func(i, j int) bool {
		return addrs[i].String() < addrs[j].String()
	})

	var res []Handle
	for _, addr := range addrs {
		res = append(res, Handle{
			Destination:   addr,
			InterfaceName: iface,
			Table:         "local",
			Type:          "local",
			Proto:         config.IPForwarding.EthernetProtoID,
		})
	}

	return res, nil
}