2022-02-23 17:48:43 +08:00
|
|
|
package dhcpd
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"net"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/insomniacslk/dhcp/dhcpv4"
|
|
|
|
|
|
|
|
"github.com/nadoo/glider/pkg/sockopt"
|
|
|
|
)
|
|
|
|
|
2022-02-23 22:20:06 +08:00
|
|
|
func discovery(intf *net.Interface) (found bool) {
|
2022-02-24 18:41:03 +08:00
|
|
|
lc := &net.ListenConfig{Control: sockopt.Control(sockopt.Bind(intf), sockopt.ReuseAddr())}
|
2022-02-23 17:48:43 +08:00
|
|
|
|
2022-02-24 18:41:03 +08:00
|
|
|
pc, err := lc.ListenPacket(context.Background(), "udp4", ":68")
|
2022-02-23 17:48:43 +08:00
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
defer pc.Close()
|
|
|
|
|
2022-02-24 18:41:03 +08:00
|
|
|
discovery, err := dhcpv4.NewDiscovery(intf.HardwareAddr, dhcpv4.WithBroadcast(true), dhcpv4.WithRequestedOptions(dhcpv4.OptionDomainNameServer))
|
2022-02-23 17:48:43 +08:00
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = pc.WriteTo(discovery.ToBytes(), &net.UDPAddr{IP: net.IPv4bcast, Port: 67})
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var buf [dhcpv4.MaxMessageSize]byte
|
|
|
|
pc.SetReadDeadline(time.Now().Add(time.Second * 3))
|
|
|
|
n, _, err := pc.ReadFrom(buf[:])
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-02-24 18:41:03 +08:00
|
|
|
_, err = dhcpv4.FromBytes(buf[:n])
|
|
|
|
return err == nil
|
2022-02-23 17:48:43 +08:00
|
|
|
}
|