diff --git a/pkg/nmlite/interface.go b/pkg/nmlite/interface.go index a12b57cb..19912652 100644 --- a/pkg/nmlite/interface.go +++ b/pkg/nmlite/interface.go @@ -628,6 +628,8 @@ func (im *InterfaceManager) convertDHCPLeaseToIPv4Config(lease *types.DHCPLease) Permanent: false, } + im.logger.Trace().Interface("ipv4Addr", ipv4Addr).Msg("converted DHCP lease to IPv4Config") + // Create IPv4Config return &ipv4Addr } diff --git a/pkg/nmlite/link/netlink.go b/pkg/nmlite/link/netlink.go index 01adbe86..d8b5e7cd 100644 --- a/pkg/nmlite/link/netlink.go +++ b/pkg/nmlite/link/netlink.go @@ -336,7 +336,13 @@ func (nm *NetlinkManager) RemoveDefaultRoute(family int) error { } func (nm *NetlinkManager) ReconcileLinkAddrs(link *Link, expected []*types.IPAddress) error { - existingAddr := make(map[string]bool) + expectedAddrs := make(map[string]bool) + existingAddrs := make(map[string]bool) + + for _, addr := range expected { + ipCidr := addr.Address.IP.String() + "/" + addr.Address.Mask.String() + expectedAddrs[ipCidr] = true + } addrs, err := nm.AddrList(link, AfUnspec) if err != nil { @@ -345,26 +351,36 @@ func (nm *NetlinkManager) ReconcileLinkAddrs(link *Link, expected []*types.IPAdd for _, addr := range addrs { ipCidr := addr.IP.String() + "/" + addr.IPNet.Mask.String() - existingAddr[ipCidr] = true + existingAddrs[ipCidr] = true } for _, addr := range expected { + family := AfUnspec + if addr.Address.IP.To4() != nil { + family = AfInet + } else if addr.Address.IP.To16() != nil { + family = AfInet6 + } + ipCidr := addr.Address.IP.String() + "/" + addr.Address.Mask.String() - if ok := existingAddr[ipCidr]; ok { - continue + if ok := existingAddrs[ipCidr]; !ok { + ipNet := &net.IPNet{ + IP: addr.Address.IP, + Mask: addr.Address.Mask, + } + + if err := nm.AddrAdd(link, &netlink.Addr{IPNet: ipNet}); err != nil { + return fmt.Errorf("failed to add address %s: %w", ipCidr, err) + } + + nm.logger.Info().Str("address", ipCidr).Msg("added address") } - ipNet := &net.IPNet{ - IP: addr.Address.IP, - Mask: addr.Address.Mask, - } - - addr := &netlink.Addr{ - IPNet: ipNet, - } - - if err := nm.AddrAdd(link, addr); err != nil { - return fmt.Errorf("failed to add address %s: %w", ipCidr, err) + if addr.Gateway != nil { + nm.logger.Trace().Str("address", ipCidr).Str("gateway", addr.Gateway.String()).Msg("adding default route for address") + if err := nm.AddDefaultRoute(link, addr.Gateway, family); err != nil { + return fmt.Errorf("failed to add default route for address %s: %w", ipCidr, err) + } } }