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
}