mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 17:35:40 +08:00
47 lines
897 B
Go
47 lines
897 B
Go
package dhcpd
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"time"
|
|
|
|
"github.com/insomniacslk/dhcp/dhcpv4"
|
|
|
|
"github.com/nadoo/glider/pkg/sockopt"
|
|
)
|
|
|
|
func discovery(intf *net.Interface) (found bool) {
|
|
lc := &net.ListenConfig{}
|
|
lc.Control = sockopt.BindControl(intf)
|
|
|
|
pc, err := lc.ListenPacket(context.Background(), "udp4", "255.255.255.255:68")
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer pc.Close()
|
|
|
|
discovery, err := dhcpv4.NewDiscovery(intf.HardwareAddr, dhcpv4.WithBroadcast(true))
|
|
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
|
|
}
|
|
|
|
msg, err := dhcpv4.FromBytes(buf[:n])
|
|
if err != nil || msg.TransactionID != discovery.TransactionID {
|
|
return
|
|
}
|
|
|
|
return true
|
|
}
|