Pull request: 3289 freebsd dhcp
Merge in DNS/adguard-home from 3289-freebsd-dhcp to master Updates #3289. Squashed commit of the following: commit 1365d8f17293da611b860525d519a7bbd7851902 Author: Eugene Burkov <e.burkov@adguard.com> Date: Fri Jul 30 15:01:13 2021 +0300 dhcpd: fix doc commit 26724df27e92d457c39c8bf0fb78179a874e3fb2 Author: Eugene Burkov <e.burkov@adguard.com> Date: Fri Jul 30 14:52:58 2021 +0300 all: imp code & docs commit 9a9574a885d3d2129ef54fefb9a56857ce060cff Author: Eugene Burkov <e.burkov@adguard.com> Date: Thu Jul 29 15:51:07 2021 +0300 all: fix broadcasting, sup freebsd dhcp, fix http response
This commit is contained in:
@@ -412,7 +412,9 @@ func (s *Server) handleDHCPFindActiveServer(w http.ResponseWriter, r *http.Reque
|
||||
result := dhcpSearchResult{
|
||||
V4: dhcpSearchV4Result{
|
||||
OtherServer: dhcpSearchOtherResult{},
|
||||
StaticIP: dhcpStaticIPStatus{},
|
||||
StaticIP: dhcpStaticIPStatus{
|
||||
Static: "yes",
|
||||
},
|
||||
},
|
||||
V6: dhcpSearchV6Result{
|
||||
OtherServer: dhcpSearchOtherResult{},
|
||||
|
||||
@@ -38,6 +38,9 @@ type V4ServerConf struct {
|
||||
|
||||
GatewayIP net.IP `yaml:"gateway_ip" json:"gateway_ip"`
|
||||
SubnetMask net.IP `yaml:"subnet_mask" json:"subnet_mask"`
|
||||
// broadcastIP is the broadcasting address pre-calculated from the
|
||||
// configured gateway IP and subnet mask.
|
||||
broadcastIP net.IP
|
||||
|
||||
// The first & the last IP address for dynamic leases
|
||||
// Bytes [0..2] of the last allowed IP address must match the first IP
|
||||
|
||||
@@ -927,12 +927,30 @@ func (s *v4Server) packetHandler(conn net.PacketConn, peer net.Addr, req *dhcpv4
|
||||
resp.Options.Update(dhcpv4.OptMessageType(dhcpv4.MessageTypeNak))
|
||||
}
|
||||
|
||||
// peer is expected to be of type *net.UDPConn as the server4.NewServer
|
||||
// initializes it.
|
||||
udpPeer, ok := peer.(*net.UDPAddr)
|
||||
if !ok {
|
||||
log.Error("dhcpv4: peer is of unexpected type %T", peer)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Despite the fact that server4.NewIPv4UDPConn explicitly sets socket
|
||||
// options to allow broadcasting, it also binds the connection to a
|
||||
// specific interface. On FreeBSD conn.WriteTo causes errors while
|
||||
// writing to the addresses that belong to another interface. So, use
|
||||
// the broadcast address specific for the binded interface in case
|
||||
// server4.Server.Serve sets it to net.IPv4Bcast.
|
||||
if udpPeer.IP.Equal(net.IPv4bcast) {
|
||||
udpPeer.IP = s.conf.broadcastIP
|
||||
}
|
||||
|
||||
log.Debug("dhcpv4: sending: %s", resp.Summary())
|
||||
|
||||
_, err = conn.WriteTo(resp.ToBytes(), peer)
|
||||
if err != nil {
|
||||
log.Error("dhcpv4: conn.Write to %s failed: %s", peer, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1043,6 +1061,12 @@ func v4Create(conf V4ServerConf) (srv DHCPServer, err error) {
|
||||
Mask: subnetMask,
|
||||
}
|
||||
|
||||
bcastIP := aghnet.CloneIP(routerIP)
|
||||
for i, b := range subnetMask {
|
||||
bcastIP[i] |= ^b
|
||||
}
|
||||
s.conf.broadcastIP = bcastIP
|
||||
|
||||
s.conf.ipRange, err = newIPRange(conf.RangeStart, conf.RangeEnd)
|
||||
if err != nil {
|
||||
return s, fmt.Errorf("dhcpv4: %w", err)
|
||||
|
||||
Reference in New Issue
Block a user