AdGuardHome/internal/dhcpd/broadcast_others.go

31 lines
1,004 B
Go
Raw Normal View History

//go:build darwin || linux
package dhcpd
import (
"net"
)
// broadcast sends resp to the broadcast address specific for network interface.
func (c *dhcpConn) broadcast(respData []byte, peer *net.UDPAddr) (n int, err error) {
// This write to 0xffffffff reverts some behavior changes made in
// https://github.com/AdguardTeam/AdGuardHome/issues/3289. The DHCP
// server should broadcast the message to 0xffffffff but it's
// inconsistent with the actual mental model of DHCP implementation
// which requires the network interface selection to bind to.
//
// See https://github.com/AdguardTeam/AdGuardHome/issues/3480 and
// https://github.com/AdguardTeam/AdGuardHome/issues/3366.
//
// See also https://github.com/AdguardTeam/AdGuardHome/issues/3539.
if n, err = c.udpConn.WriteTo(respData, peer); err != nil {
return n, err
}
// Broadcast the message one more time using the interface-specific
// broadcast address.
peer.IP = c.bcastIP
return c.udpConn.WriteTo(respData, peer)
}