From 78f0479b6bca61b8771a9544447269dbf811afbd Mon Sep 17 00:00:00 2001 From: Siyuan Date: Tue, 7 Oct 2025 18:27:47 +0000 Subject: [PATCH] fix netmask calculation --- pkg/nmlite/interface.go | 36 +++++++++++++++++++++++++++++------- pkg/nmlite/link/netlink.go | 1 + pkg/nmlite/state.go | 26 ++++++++++++++++---------- pkg/nmlite/udhcpc/parser.go | 6 ++++-- 4 files changed, 50 insertions(+), 19 deletions(-) diff --git a/pkg/nmlite/interface.go b/pkg/nmlite/interface.go index 91e1b6f9..102dc864 100644 --- a/pkg/nmlite/interface.go +++ b/pkg/nmlite/interface.go @@ -163,6 +163,14 @@ func (im *InterfaceManager) GetIPv4Addresses() []string { return im.state.IPv4Addresses } +func (im *InterfaceManager) GetIPv4Address() string { + return im.state.IPv4Address +} + +func (im *InterfaceManager) GetIPv6Address() string { + return im.state.IPv6Address +} + func (im *InterfaceManager) GetIPv6Addresses() []string { addresses := []string{} for _, addr := range im.state.IPv6Addresses { @@ -585,7 +593,7 @@ func (im *InterfaceManager) updateInterfaceState() error { im.logger.Error().Err(err).Msg("failed to update IP addresses") } - // im.state.LastUpdated = time.Now() // TODO: remove this + im.state.LastUpdated = time.Now() // Notify callback if state changed if stateChanged && im.onStateChange != nil { @@ -604,10 +612,13 @@ func (im *InterfaceManager) updateIPAddresses(nl *link.Link) error { return fmt.Errorf("failed to get addresses: %w", err) } - var ipv4Addresses []string - var ipv6Addresses []types.IPv6Address - var ipv4Addr, ipv6Addr string - var ipv6LinkLocal string + var ( + ipv4Addresses []string + ipv6Addresses []types.IPv6Address + ipv4Addr, ipv6Addr string + ipv6LinkLocal string + ipv4Ready, ipv6Ready = false, false + ) for _, addr := range addrs { im.logger.Debug().Str("address", addr.IP.String()).Msg("checking address") @@ -616,6 +627,7 @@ func (im *InterfaceManager) updateIPAddresses(nl *link.Link) error { ipv4Addresses = append(ipv4Addresses, addr.IPNet.String()) if ipv4Addr == "" { ipv4Addr = addr.IP.String() + ipv4Ready = true } } else if addr.IP.To16() != nil { // IPv6 address @@ -629,6 +641,7 @@ func (im *InterfaceManager) updateIPAddresses(nl *link.Link) error { }) if ipv6Addr == "" { ipv6Addr = addr.IP.String() + ipv6Ready = true } } } @@ -637,6 +650,10 @@ func (im *InterfaceManager) updateIPAddresses(nl *link.Link) error { im.state.IPv4Addresses = ipv4Addresses im.state.IPv6Addresses = ipv6Addresses im.state.IPv6LinkLocal = ipv6LinkLocal + im.state.IPv4Address = ipv4Addr + im.state.IPv6Address = ipv6Addr + im.state.IPv4Ready = ipv4Ready + im.state.IPv6Ready = ipv6Ready return nil } @@ -677,10 +694,12 @@ func (im *InterfaceManager) applyDHCPLease(lease *types.DHCPLease) error { // convertDHCPLeaseToIPv4Config converts a DHCP lease to IPv4Config func (im *InterfaceManager) convertDHCPLeaseToIPv4Config(lease *types.DHCPLease) *types.IPAddress { + mask := lease.Netmask + // Create IPNet from IP and netmask ipNet := &net.IPNet{ IP: lease.IPAddress, - Mask: net.IPMask(lease.Netmask), + Mask: net.IPv4Mask(mask[12], mask[13], mask[14], mask[15]), } // Create IPv4Address @@ -691,7 +710,10 @@ func (im *InterfaceManager) convertDHCPLeaseToIPv4Config(lease *types.DHCPLease) Permanent: false, } - im.logger.Trace().Interface("ipv4Addr", ipv4Addr).Msg("converted DHCP lease to IPv4Config") + im.logger.Trace(). + Interface("ipv4Addr", ipv4Addr). + Interface("lease", lease). + 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 c8c4e53a..ef56a212 100644 --- a/pkg/nmlite/link/netlink.go +++ b/pkg/nmlite/link/netlink.go @@ -419,6 +419,7 @@ func (nm *NetlinkManager) ReconcileLinkAddrs(link *Link, expected []*types.IPAdd for _, addr := range expected { ipCidr := addr.Address.IP.String() + "/" + addr.Address.Mask.String() + nm.logger.Trace().Str("address", ipCidr).Msg("adding expected address") expectedAddrs[ipCidr] = true } diff --git a/pkg/nmlite/state.go b/pkg/nmlite/state.go index f7bdf617..48c080bd 100644 --- a/pkg/nmlite/state.go +++ b/pkg/nmlite/state.go @@ -46,6 +46,20 @@ func (nm *NetworkManager) GetIPv4Addresses() []string { return []string{} } +func (nm *NetworkManager) GetIPv4Address() string { + for _, iface := range nm.interfaces { + return iface.GetIPv4Address() + } + return "" +} + +func (nm *NetworkManager) GetIPv6Address() string { + for _, iface := range nm.interfaces { + return iface.GetIPv6Address() + } + return "" +} + func (nm *NetworkManager) GetIPv6Addresses() []string { for _, iface := range nm.interfaces { return iface.GetIPv6Addresses() @@ -61,19 +75,11 @@ func (nm *NetworkManager) GetMACAddress() string { } func (nm *NetworkManager) IPv4String() string { - l := nm.GetIPv4Addresses() - if len(l) == 0 { - return "" - } - return l[0] + return nm.GetIPv4Address() } func (nm *NetworkManager) IPv6String() string { - l := nm.GetIPv6Addresses() - if len(l) == 0 { - return "" - } - return l[0] + return nm.GetIPv6Address() } func (nm *NetworkManager) MACString() string { diff --git a/pkg/nmlite/udhcpc/parser.go b/pkg/nmlite/udhcpc/parser.go index 0c08ad15..e76dceca 100644 --- a/pkg/nmlite/udhcpc/parser.go +++ b/pkg/nmlite/udhcpc/parser.go @@ -79,7 +79,9 @@ func (l *Lease) SetLeaseExpiry() (time.Time, error) { } // UnmarshalDHCPCLease unmarshals a lease from a string. -func UnmarshalDHCPCLease(lease *Lease, str string) error { +func UnmarshalDHCPCLease(obj *Lease, str string) error { + lease := &obj.DHCPLease + // parse the lease file as a map data := make(map[string]string) for line := range strings.SplitSeq(str, "\n") { @@ -161,7 +163,7 @@ func UnmarshalDHCPCLease(lease *Lease, str string) error { valuesParsed[key] = true } - lease.setIsEmpty(valuesParsed) + obj.setIsEmpty(valuesParsed) return nil }