From d254f3ae80d57e22737137261a649b9c48796bba Mon Sep 17 00:00:00 2001 From: soypat Date: Wed, 20 Aug 2025 19:25:08 -0300 Subject: [PATCH] dhcp subnet prefix fix --- dhcpv4/client.go | 16 ++++++++++++++++ internal/net.go | 9 +++++++++ internal/net_tinygo.go | 12 ++++++++++++ internal/tap.go | 3 +-- x/xnet/stack-async.go | 2 +- 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 internal/net.go create mode 100644 internal/net_tinygo.go diff --git a/dhcpv4/client.go b/dhcpv4/client.go index 10270ec..eb6ab5f 100644 --- a/dhcpv4/client.go +++ b/dhcpv4/client.go @@ -20,6 +20,7 @@ type Client struct { clientID []byte hostname []byte dns []netip.Addr + ntps []netip.Addr svIPtos ipv4.ToS tRenew uint32 @@ -290,6 +291,13 @@ func (c *Client) setOptions(frm Frame) error { for i := 0; i < len(data); i += 4 { c.dns = append(c.dns, netip.AddrFrom4([4]byte(data[i:i+4]))) } + case OptNTPServersAddresses: + if len(c.ntps) > 0 || len(data)%4 != 0 { + return nil + } + for i := 0; i < len(data); i += 4 { + c.ntps = append(c.ntps, netip.AddrFrom4([4]byte(data[i:i+4]))) + } } return nil }) @@ -355,6 +363,14 @@ func (d *Client) DNSServerFirst() netip.Addr { return d.dns[0] } +func (d *Client) SubnetPrefix() netip.Prefix { + if !d.offer.valid { + return netip.Prefix{} + } + m, _ := netip.AddrFrom4(d.offer.addr).Prefix(int(d.SubnetCIDRBits())) + return m +} + func (d *Client) SubnetCIDRBits() uint8 { if !d.subnet.valid { return 0 diff --git a/internal/net.go b/internal/net.go new file mode 100644 index 0000000..b9e0a21 --- /dev/null +++ b/internal/net.go @@ -0,0 +1,9 @@ +//go:build !tinygo + +package internal + +import "net" + +func interfaceByName(name string) (*net.Interface, error) { + return net.InterfaceByName(name) +} diff --git a/internal/net_tinygo.go b/internal/net_tinygo.go new file mode 100644 index 0000000..124524d --- /dev/null +++ b/internal/net_tinygo.go @@ -0,0 +1,12 @@ +//go:build tinygo + +package internal + +import ( + "errors" + "net" +) + +func interfaceByName(name string) (*net.Interface, error) { + return nil, errors.New("net.InterfaceByName not implemented on TinyGo") +} diff --git a/internal/tap.go b/internal/tap.go index a49037f..62dd488 100644 --- a/internal/tap.go +++ b/internal/tap.go @@ -7,7 +7,6 @@ import ( "errors" "fmt" "math/bits" - "net" "net/netip" "os" "os/exec" @@ -205,7 +204,7 @@ type Bridge struct { } func NewBridge(name string) (*Bridge, error) { - iface, err := net.InterfaceByName(name) + iface, err := interfaceByName(name) if err != nil { return nil, err } diff --git a/x/xnet/stack-async.go b/x/xnet/stack-async.go index 8aa95db..a520fd3 100644 --- a/x/xnet/stack-async.go +++ b/x/xnet/stack-async.go @@ -480,7 +480,7 @@ func (s *StackAsync) populateDHCPResults() error { router := netip.AddrFrom4(router4) s.dhcpResults = DHCPResults{ Router: router, - Subnet: netip.PrefixFrom(router, int(s.dhcp.SubnetCIDRBits())), + Subnet: s.dhcp.SubnetPrefix(), AssignedAddr: netip.AddrFrom4(assigned4), ServerAddr: addr4(s.dhcp.ServerAddr()), BroadcastAddr: addr4(s.dhcp.BroadcastAddr()),