From f606e70250eb2a30842ee7a98bb2d28e923bd530 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 7 Oct 2018 17:36:00 +0200 Subject: [PATCH] dhcp4d: respect broadcast bit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mac’s Internet Recovery DHCP client requires broadcast responses and will ignore unicast responses outright. --- internal/dhcp4d/dhcp4d.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/internal/dhcp4d/dhcp4d.go b/internal/dhcp4d/dhcp4d.go index 857d1ce..0cba287 100644 --- a/internal/dhcp4d/dhcp4d.go +++ b/internal/dhcp4d/dhcp4d.go @@ -163,8 +163,14 @@ func (h *Handler) ServeDHCP(p dhcp4.Packet, msgType dhcp4.MessageType, options d ComputeChecksums: true, FixLengths: true, } + destMAC := p.CHAddr() + destIP := reply.YIAddr() + if p.Broadcast() { + destMAC = []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff} + destIP = net.IPv4bcast + } ethernet := &layers.Ethernet{ - DstMAC: p.CHAddr(), + DstMAC: destMAC, SrcMAC: h.iface.HardwareAddr, EthernetType: layers.EthernetTypeIPv4, } @@ -173,7 +179,7 @@ func (h *Handler) ServeDHCP(p dhcp4.Packet, msgType dhcp4.MessageType, options d Version: 4, TTL: 255, SrcIP: h.serverIP, - DstIP: reply.YIAddr(), + DstIP: destIP, Protocol: layers.IPProtocolUDP, Flags: layers.IPv4DontFragment, } @@ -188,7 +194,7 @@ func (h *Handler) ServeDHCP(p dhcp4.Packet, msgType dhcp4.MessageType, options d udp, gopacket.Payload(reply)) - if _, err := h.rawConn.WriteTo(buf.Bytes(), &raw.Addr{p.CHAddr()}); err != nil { + if _, err := h.rawConn.WriteTo(buf.Bytes(), &raw.Addr{destMAC}); err != nil { log.Printf("WriteTo: %v", err) }