fix netmask calculation

This commit is contained in:
Siyuan 2025-10-07 18:27:47 +00:00
parent 3c83bcfe69
commit 78f0479b6b
4 changed files with 50 additions and 19 deletions

View File

@ -163,6 +163,14 @@ func (im *InterfaceManager) GetIPv4Addresses() []string {
return im.state.IPv4Addresses 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 { func (im *InterfaceManager) GetIPv6Addresses() []string {
addresses := []string{} addresses := []string{}
for _, addr := range im.state.IPv6Addresses { 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.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 // Notify callback if state changed
if stateChanged && im.onStateChange != nil { 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) return fmt.Errorf("failed to get addresses: %w", err)
} }
var ipv4Addresses []string var (
var ipv6Addresses []types.IPv6Address ipv4Addresses []string
var ipv4Addr, ipv6Addr string ipv6Addresses []types.IPv6Address
var ipv6LinkLocal string ipv4Addr, ipv6Addr string
ipv6LinkLocal string
ipv4Ready, ipv6Ready = false, false
)
for _, addr := range addrs { for _, addr := range addrs {
im.logger.Debug().Str("address", addr.IP.String()).Msg("checking address") 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()) ipv4Addresses = append(ipv4Addresses, addr.IPNet.String())
if ipv4Addr == "" { if ipv4Addr == "" {
ipv4Addr = addr.IP.String() ipv4Addr = addr.IP.String()
ipv4Ready = true
} }
} else if addr.IP.To16() != nil { } else if addr.IP.To16() != nil {
// IPv6 address // IPv6 address
@ -629,6 +641,7 @@ func (im *InterfaceManager) updateIPAddresses(nl *link.Link) error {
}) })
if ipv6Addr == "" { if ipv6Addr == "" {
ipv6Addr = addr.IP.String() ipv6Addr = addr.IP.String()
ipv6Ready = true
} }
} }
} }
@ -637,6 +650,10 @@ func (im *InterfaceManager) updateIPAddresses(nl *link.Link) error {
im.state.IPv4Addresses = ipv4Addresses im.state.IPv4Addresses = ipv4Addresses
im.state.IPv6Addresses = ipv6Addresses im.state.IPv6Addresses = ipv6Addresses
im.state.IPv6LinkLocal = ipv6LinkLocal im.state.IPv6LinkLocal = ipv6LinkLocal
im.state.IPv4Address = ipv4Addr
im.state.IPv6Address = ipv6Addr
im.state.IPv4Ready = ipv4Ready
im.state.IPv6Ready = ipv6Ready
return nil return nil
} }
@ -677,10 +694,12 @@ func (im *InterfaceManager) applyDHCPLease(lease *types.DHCPLease) error {
// convertDHCPLeaseToIPv4Config converts a DHCP lease to IPv4Config // convertDHCPLeaseToIPv4Config converts a DHCP lease to IPv4Config
func (im *InterfaceManager) convertDHCPLeaseToIPv4Config(lease *types.DHCPLease) *types.IPAddress { func (im *InterfaceManager) convertDHCPLeaseToIPv4Config(lease *types.DHCPLease) *types.IPAddress {
mask := lease.Netmask
// Create IPNet from IP and netmask // Create IPNet from IP and netmask
ipNet := &net.IPNet{ ipNet := &net.IPNet{
IP: lease.IPAddress, IP: lease.IPAddress,
Mask: net.IPMask(lease.Netmask), Mask: net.IPv4Mask(mask[12], mask[13], mask[14], mask[15]),
} }
// Create IPv4Address // Create IPv4Address
@ -691,7 +710,10 @@ func (im *InterfaceManager) convertDHCPLeaseToIPv4Config(lease *types.DHCPLease)
Permanent: false, 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 // Create IPv4Config
return &ipv4Addr return &ipv4Addr

View File

@ -419,6 +419,7 @@ func (nm *NetlinkManager) ReconcileLinkAddrs(link *Link, expected []*types.IPAdd
for _, addr := range expected { for _, addr := range expected {
ipCidr := addr.Address.IP.String() + "/" + addr.Address.Mask.String() ipCidr := addr.Address.IP.String() + "/" + addr.Address.Mask.String()
nm.logger.Trace().Str("address", ipCidr).Msg("adding expected address")
expectedAddrs[ipCidr] = true expectedAddrs[ipCidr] = true
} }

View File

@ -46,6 +46,20 @@ func (nm *NetworkManager) GetIPv4Addresses() []string {
return []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 { func (nm *NetworkManager) GetIPv6Addresses() []string {
for _, iface := range nm.interfaces { for _, iface := range nm.interfaces {
return iface.GetIPv6Addresses() return iface.GetIPv6Addresses()
@ -61,19 +75,11 @@ func (nm *NetworkManager) GetMACAddress() string {
} }
func (nm *NetworkManager) IPv4String() string { func (nm *NetworkManager) IPv4String() string {
l := nm.GetIPv4Addresses() return nm.GetIPv4Address()
if len(l) == 0 {
return ""
}
return l[0]
} }
func (nm *NetworkManager) IPv6String() string { func (nm *NetworkManager) IPv6String() string {
l := nm.GetIPv6Addresses() return nm.GetIPv6Address()
if len(l) == 0 {
return ""
}
return l[0]
} }
func (nm *NetworkManager) MACString() string { func (nm *NetworkManager) MACString() string {

View File

@ -79,7 +79,9 @@ func (l *Lease) SetLeaseExpiry() (time.Time, error) {
} }
// UnmarshalDHCPCLease unmarshals a lease from a string. // 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 // parse the lease file as a map
data := make(map[string]string) data := make(map[string]string)
for line := range strings.SplitSeq(str, "\n") { for line := range strings.SplitSeq(str, "\n") {
@ -161,7 +163,7 @@ func UnmarshalDHCPCLease(lease *Lease, str string) error {
valuesParsed[key] = true valuesParsed[key] = true
} }
lease.setIsEmpty(valuesParsed) obj.setIsEmpty(valuesParsed)
return nil return nil
} }