mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 01:15:41 +08:00
42 lines
832 B
Go
42 lines
832 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{Control: sockopt.Control(sockopt.Bind(intf), sockopt.ReuseAddr())}
|
|
|
|
pc, err := lc.ListenPacket(context.Background(), "udp4", ":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
|
|
}
|
|
|
|
_, err = dhcpv4.FromBytes(buf[:n])
|
|
return err == nil
|
|
}
|