Pull request: 3443 dhcp broadcast vol.2
Merge in DNS/adguard-home from 3443-dhcp-broadcast-vol.2 to master
Closes #3443.
Squashed commit of the following:
commit a85af89cb43f2489126fe3c12366fc034e89f59d
Merge: 72eb3a88 a4e07827
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Thu Sep 30 18:08:19 2021 +0300
Merge branch 'master' into 3443-dhcp-broadcast-vol.2
commit 72eb3a8853540b06ee1096decf50e836b539fe45
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Thu Sep 30 18:03:19 2021 +0300
dhcpd: imp code readability
commit 2d1fbc40d04a4125855d6be9f02e09d15430150d
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Thu Sep 30 14:16:59 2021 +0300
dhcpd: imp tests
commit 889fad3084ad2b81edfc12100e2ce29d323227ba
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Wed Sep 29 20:09:25 2021 +0300
dhcpd: imp code, docs
commit 1fd6b2346ff66e033bceaa169aed751be5822ca8
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Thu Sep 23 16:08:18 2021 +0300
dhcpd: unicast to mac address
This commit is contained in:
@@ -4,12 +4,11 @@
|
||||
package dhcpd
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"net"
|
||||
"testing"
|
||||
|
||||
"github.com/AdguardTeam/golibs/netutil"
|
||||
"github.com/insomniacslk/dhcp/dhcpv4"
|
||||
"github.com/mdlayher/raw"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -390,67 +389,107 @@ func (fc *fakePacketConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
|
||||
return fc.writeTo(p, addr)
|
||||
}
|
||||
|
||||
func TestV4Server_Send_unicast(t *testing.T) {
|
||||
b := &bytes.Buffer{}
|
||||
var peer *net.UDPAddr
|
||||
|
||||
conn := &fakePacketConn{
|
||||
writeTo: func(p []byte, addr net.Addr) (n int, err error) {
|
||||
udpPeer, ok := addr.(*net.UDPAddr)
|
||||
require.True(t, ok)
|
||||
|
||||
peer = cloneUDPAddr(udpPeer)
|
||||
|
||||
n, err = b.Write(p)
|
||||
require.NoError(t, err)
|
||||
|
||||
return n, nil
|
||||
},
|
||||
}
|
||||
|
||||
defaultPeer := &net.UDPAddr{
|
||||
IP: net.IP{1, 2, 3, 4},
|
||||
// Use neither client nor server port.
|
||||
Port: 1234,
|
||||
}
|
||||
defaultResp := &dhcpv4.DHCPv4{
|
||||
OpCode: dhcpv4.OpcodeBootReply,
|
||||
}
|
||||
func TestV4Server_Send(t *testing.T) {
|
||||
s := &v4Server{}
|
||||
|
||||
var (
|
||||
defaultIP = net.IP{99, 99, 99, 99}
|
||||
knownIP = net.IP{4, 2, 4, 2}
|
||||
knownMAC = net.HardwareAddr{6, 5, 4, 3, 2, 1}
|
||||
)
|
||||
|
||||
defaultPeer := &net.UDPAddr{
|
||||
IP: defaultIP,
|
||||
// Use neither client nor server port to check it actually
|
||||
// changed.
|
||||
Port: dhcpv4.ClientPort + dhcpv4.ServerPort,
|
||||
}
|
||||
defaultResp := &dhcpv4.DHCPv4{}
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
req *dhcpv4.DHCPv4
|
||||
wantPeer net.Addr
|
||||
want net.Addr
|
||||
req *dhcpv4.DHCPv4
|
||||
resp *dhcpv4.DHCPv4
|
||||
name string
|
||||
}{{
|
||||
name: "relay_agent",
|
||||
req: &dhcpv4.DHCPv4{
|
||||
GatewayIPAddr: defaultPeer.IP,
|
||||
},
|
||||
wantPeer: &net.UDPAddr{
|
||||
IP: defaultPeer.IP,
|
||||
name: "giaddr",
|
||||
req: &dhcpv4.DHCPv4{GatewayIPAddr: knownIP},
|
||||
resp: defaultResp,
|
||||
want: &net.UDPAddr{
|
||||
IP: knownIP,
|
||||
Port: dhcpv4.ServerPort,
|
||||
},
|
||||
}, {
|
||||
name: "known_client",
|
||||
req: &dhcpv4.DHCPv4{
|
||||
GatewayIPAddr: netutil.IPv4Zero(),
|
||||
ClientIPAddr: net.IP{2, 3, 4, 5},
|
||||
name: "nak",
|
||||
req: &dhcpv4.DHCPv4{},
|
||||
resp: &dhcpv4.DHCPv4{
|
||||
Options: dhcpv4.OptionsFromList(
|
||||
dhcpv4.OptMessageType(dhcpv4.MessageTypeNak),
|
||||
),
|
||||
},
|
||||
wantPeer: &net.UDPAddr{
|
||||
IP: net.IP{2, 3, 4, 5},
|
||||
want: defaultPeer,
|
||||
}, {
|
||||
name: "ciaddr",
|
||||
req: &dhcpv4.DHCPv4{ClientIPAddr: knownIP},
|
||||
resp: &dhcpv4.DHCPv4{},
|
||||
want: &net.UDPAddr{
|
||||
IP: knownIP,
|
||||
Port: dhcpv4.ClientPort,
|
||||
},
|
||||
}, {
|
||||
name: "chaddr",
|
||||
req: &dhcpv4.DHCPv4{ClientHWAddr: knownMAC},
|
||||
resp: &dhcpv4.DHCPv4{YourIPAddr: knownIP},
|
||||
want: &dhcpUnicastAddr{
|
||||
Addr: raw.Addr{HardwareAddr: knownMAC},
|
||||
yiaddr: knownIP,
|
||||
},
|
||||
}, {
|
||||
name: "who_are_you",
|
||||
req: &dhcpv4.DHCPv4{},
|
||||
resp: &dhcpv4.DHCPv4{},
|
||||
want: defaultPeer,
|
||||
}}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
s.send(defaultPeer, conn, tc.req, defaultResp)
|
||||
assert.EqualValues(t, defaultResp.ToBytes(), b.Bytes())
|
||||
assert.Equal(t, tc.wantPeer, peer)
|
||||
})
|
||||
conn := &fakePacketConn{
|
||||
writeTo: func(_ []byte, addr net.Addr) (_ int, _ error) {
|
||||
assert.Equal(t, tc.want, addr)
|
||||
|
||||
b.Reset()
|
||||
peer = nil
|
||||
return 0, nil
|
||||
},
|
||||
}
|
||||
|
||||
s.send(cloneUDPAddr(defaultPeer), conn, tc.req, tc.resp)
|
||||
})
|
||||
}
|
||||
|
||||
t.Run("giaddr_nak", func(t *testing.T) {
|
||||
req := &dhcpv4.DHCPv4{
|
||||
GatewayIPAddr: knownIP,
|
||||
}
|
||||
// Ensure the request is for unicast.
|
||||
req.SetUnicast()
|
||||
resp := &dhcpv4.DHCPv4{
|
||||
Options: dhcpv4.OptionsFromList(
|
||||
dhcpv4.OptMessageType(dhcpv4.MessageTypeNak),
|
||||
),
|
||||
}
|
||||
want := &net.UDPAddr{
|
||||
IP: req.GatewayIPAddr,
|
||||
Port: dhcpv4.ServerPort,
|
||||
}
|
||||
|
||||
conn := &fakePacketConn{
|
||||
writeTo: func(_ []byte, addr net.Addr) (n int, err error) {
|
||||
assert.Equal(t, want, addr)
|
||||
|
||||
return 0, nil
|
||||
},
|
||||
}
|
||||
|
||||
s.send(cloneUDPAddr(defaultPeer), conn, req, resp)
|
||||
assert.True(t, resp.IsBroadcast())
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user