mirror of https://github.com/jetkvm/kvm.git
fix: dhcp not working
This commit is contained in:
parent
2f33c08c98
commit
49e28f218e
|
|
@ -87,6 +87,9 @@ func NewInterfaceManager(ctx context.Context, ifaceName string, config *types.Ne
|
||||||
|
|
||||||
// Set up DHCP client callbacks
|
// Set up DHCP client callbacks
|
||||||
im.dhcpClient.SetOnLeaseChange(func(lease *types.DHCPLease) {
|
im.dhcpClient.SetOnLeaseChange(func(lease *types.DHCPLease) {
|
||||||
|
if err := im.applyDHCPLease(lease); err != nil {
|
||||||
|
im.logger.Error().Err(err).Msg("failed to apply DHCP lease")
|
||||||
|
}
|
||||||
im.updateStateFromDHCPLease(lease)
|
im.updateStateFromDHCPLease(lease)
|
||||||
if im.onDHCPLeaseChange != nil {
|
if im.onDHCPLeaseChange != nil {
|
||||||
im.onDHCPLeaseChange(lease)
|
im.onDHCPLeaseChange(lease)
|
||||||
|
|
@ -588,44 +591,43 @@ func (im *InterfaceManager) updateStateFromDHCPLease(lease *types.DHCPLease) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (im *InterfaceManager) ReconcileLinkAddrs(ipv4Config *types.IPv4StaticConfig) error {
|
func (im *InterfaceManager) ReconcileLinkAddrs(addrs []*types.IPAddress) error {
|
||||||
// nl := getNetlinkManager()
|
nl := getNetlinkManager()
|
||||||
// return nl.ReconcileLinkAddrs(ipv4Config)
|
link, err := im.link()
|
||||||
return nil
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to get interface: %w", err)
|
||||||
|
}
|
||||||
|
if link == nil {
|
||||||
|
return fmt.Errorf("failed to get interface: %w", err)
|
||||||
|
}
|
||||||
|
return nl.ReconcileLinkAddrs(link, addrs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// applyDHCPLease applies DHCP lease configuration using ReconcileLinkAddrs
|
// applyDHCPLease applies DHCP lease configuration using ReconcileLinkAddrs
|
||||||
func (im *InterfaceManager) applyDHCPLease(lease *types.DHCPLease) error {
|
func (im *InterfaceManager) applyDHCPLease(lease *types.DHCPLease) error {
|
||||||
// Convert DHCP lease to IPv4Config
|
// Convert DHCP lease to IPv4Config
|
||||||
// ipv4Config := im.convertDHCPLeaseToIPv4Config(lease)
|
ipv4Config := im.convertDHCPLeaseToIPv4Config(lease)
|
||||||
|
|
||||||
// Apply the configuration using ReconcileLinkAddrs
|
// Apply the configuration using ReconcileLinkAddrs
|
||||||
// return im.ReconcileLinkAddrs(ipv4Config)
|
return im.ReconcileLinkAddrs([]*types.IPAddress{ipv4Config})
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// convertDHCPLeaseToIPv4Config converts a DHCP lease to IPv4Config
|
// convertDHCPLeaseToIPv4Config converts a DHCP lease to IPv4Config
|
||||||
// func (im *InterfaceManager) convertDHCPLeaseToIPv4Config(lease *types.DHCPLease) *netif.IPv4Config {
|
func (im *InterfaceManager) convertDHCPLeaseToIPv4Config(lease *types.DHCPLease) *types.IPAddress {
|
||||||
// // 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.IPMask(lease.Netmask),
|
||||||
// }
|
}
|
||||||
|
|
||||||
// // Create IPv4Address
|
// Create IPv4Address
|
||||||
// ipv4Addr := netif.IPv4Address{
|
ipv4Addr := types.IPAddress{
|
||||||
// Address: *ipNet,
|
Address: *ipNet,
|
||||||
// Gateway: lease.Gateway,
|
Gateway: lease.Routers[0],
|
||||||
// Secondary: false,
|
Secondary: false,
|
||||||
// Permanent: false,
|
Permanent: false,
|
||||||
// }
|
}
|
||||||
|
|
||||||
// // Create IPv4Config
|
// Create IPv4Config
|
||||||
// return &netif.IPv4Config{
|
return &ipv4Addr
|
||||||
// Addresses: []netif.IPv4Address{ipv4Addr},
|
}
|
||||||
// Nameservers: lease.DNS,
|
|
||||||
// SearchList: lease.SearchList,
|
|
||||||
// Domain: lease.Domain,
|
|
||||||
// Interface: im.ifaceName,
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/jetkvm/kvm/internal/network/types"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"github.com/vishvananda/netlink"
|
"github.com/vishvananda/netlink"
|
||||||
)
|
)
|
||||||
|
|
@ -239,8 +240,6 @@ func (nm *NetlinkManager) RemoveNonLinkLocalIPv6Addresses(link *Link) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Route operations
|
|
||||||
|
|
||||||
// RouteList gets all routes
|
// RouteList gets all routes
|
||||||
func (nm *NetlinkManager) RouteList(link *Link, family int) ([]netlink.Route, error) {
|
func (nm *NetlinkManager) RouteList(link *Link, family int) ([]netlink.Route, error) {
|
||||||
nm.mu.RLock()
|
nm.mu.RLock()
|
||||||
|
|
@ -336,6 +335,42 @@ func (nm *NetlinkManager) RemoveDefaultRoute(family int) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (nm *NetlinkManager) ReconcileLinkAddrs(link *Link, expected []*types.IPAddress) error {
|
||||||
|
existingAddr := make(map[string]bool)
|
||||||
|
|
||||||
|
addrs, err := nm.AddrList(link, AfUnspec)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to get addresses: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, addr := range addrs {
|
||||||
|
ipCidr := addr.IP.String() + "/" + addr.IPNet.Mask.String()
|
||||||
|
existingAddr[ipCidr] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, addr := range expected {
|
||||||
|
ipCidr := addr.Address.IP.String() + "/" + addr.Address.Mask.String()
|
||||||
|
if ok := existingAddr[ipCidr]; ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Sysctl operations
|
// Sysctl operations
|
||||||
|
|
||||||
// SetSysctlValues sets sysctl values for the interface
|
// SetSysctlValues sets sysctl values for the interface
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue