Compare commits
1 Commits
28f5022603
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0784da4bb9 |
@@ -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: isn’t this guaranteed by the filter above?
|
// TODO: isn’t 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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user