1 Commits

Author SHA1 Message Date
Timmy Welch
0784da4bb9 Update dns for ipv6 addresses 2025-12-27 18:13:52 -08:00

View File

@@ -16,6 +16,7 @@
package radvd package radvd
import ( import (
"fmt"
"log" "log"
"net" "net"
"net/netip" "net/netip"
@@ -41,6 +42,31 @@ func NewServer() (*Server, error) {
return &Server{}, nil return &Server{}, nil
} }
func (s *Server) UpdateDNS(b []byte) error {
m,err := ndp.ParseMessage(b)
if err != nil {
return err
}
if m.Type() != ipv6.ICMPTypeNeighborAdvertisement {
return fmt.Errorf("incorrect icmp message recieved expected %s, got %s", ipv6.ICMPTypeNeighborAdvertisement, m.Type())
}
n :=m.(*ndp.NeighborAdvertisement)
var hw net.HardwareAddr
for _,o := range n.Options {
if o.Code() == uint8(ndp.Target) {
ll := o.(*ndp.LinkLayerAddress)
hw = ll.Addr
break
}
}
if hw == nil || !n.TargetAddress.IsGlobalUnicast() || !n.Solicited {
// Ignore advertisements that donot provide the MAC, are not solicited and are not global unicast addresses
return nil
}
log.Printf("found IPv6 address %s for MAC address %s", n.TargetAddress, hw)
return nil
}
func (s *Server) SetPrefixes(prefixes []net.IPNet) { func (s *Server) SetPrefixes(prefixes []net.IPNet) {
s.mu.Lock() s.mu.Lock()
if s.ifname != "" { if s.ifname != "" {
@@ -75,6 +101,7 @@ func (s *Server) Serve(ifname string, conn net.PacketConn) error {
var filter ipv6.ICMPFilter var filter ipv6.ICMPFilter
filter.SetAll(true) filter.SetAll(true)
filter.Accept(ipv6.ICMPTypeRouterSolicitation) filter.Accept(ipv6.ICMPTypeRouterSolicitation)
filter.Accept(ipv6.ICMPTypeNeighborAdvertisement)
if err := s.pc.SetICMPFilter(&filter); err != nil { if err := s.pc.SetICMPFilter(&filter); err != nil {
return err return err
} }
@@ -101,6 +128,9 @@ func (s *Server) Serve(ifname string, conn net.PacketConn) error {
// TODO: isnt this guaranteed by the filter above? // TODO: isnt this guaranteed by the filter above?
if n == 0 || if n == 0 ||
ipv6.ICMPType(buf[0]) != ipv6.ICMPTypeRouterSolicitation { ipv6.ICMPType(buf[0]) != ipv6.ICMPTypeRouterSolicitation {
if ipv6.ICMPType(buf[0]) == ipv6.ICMPTypeNeighborAdvertisement{
s.UpdateDNS(buf)
}
continue continue
} }
if err := s.sendAdvertisement(addr); err != nil { if err := s.sendAdvertisement(addr); err != nil {