Skip to content

Commit

Permalink
DHCP test complete
Browse files Browse the repository at this point in the history
  • Loading branch information
soypat committed Nov 26, 2023
1 parent 61a805e commit 04ce5d7
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 10 deletions.
13 changes: 8 additions & 5 deletions stacks/dhcp_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ func (d *DHCPServer) HandleUDP(resp []byte, packet *UDPPacket) (_ int, err error
}
return nil
})
if err != nil || (rcvHdr.SIAddr != d.siaddr.As4()) {
if err != nil || (msgType != 1 && rcvHdr.SIAddr != d.siaddr.As4()) {
return 0, err
}

Expand All @@ -133,7 +133,9 @@ func (d *DHCPServer) HandleUDP(resp []byte, packet *UDPPacket) (_ int, err error
Options = []dhcpOption{
{eth.DHCP_MessageType, []byte{2}}, // DHCP Message Type: Offer
}
rcvHdr.SIAddr = d.siaddr.As4()
client.port = packet.UDP.SourcePort
client.state = dhcpStateWaitOffer

case 3: // DHCP Request.
if client.state != dhcpStateWaitOffer {
Expand All @@ -147,6 +149,7 @@ func (d *DHCPServer) HandleUDP(resp []byte, packet *UDPPacket) (_ int, err error
if err != nil {
return 0, nil
}
d.hosts[mac] = client
for i := dhcpOffset + 14; i < len(resp); i++ {
resp[i] = 0 // Zero out BOOTP and options fields.
}
Expand All @@ -162,7 +165,7 @@ func (d *DHCPServer) HandleUDP(resp []byte, packet *UDPPacket) (_ int, err error
resp[ptr] = 0xff // endmark
// Set Ethernet+IP+UDP headers.
payload := resp[dhcpOffset : dhcpOffset+sizeDHCPTotal]
d.setResponseUDP(packet, payload)
d.setResponseUDP(client.port, packet, payload)
packet.PutHeaders(resp)
return dhcpOffset + sizeDHCPTotal, nil
}
Expand All @@ -174,7 +177,7 @@ func (d *DHCPServer) next(requested [4]byte) [4]byte {
return [4]byte{192, 168, 1, 2}
}

func (d *DHCPServer) setResponseUDP(packet *UDPPacket, payload []byte) {
func (d *DHCPServer) setResponseUDP(clientport uint16, packet *UDPPacket, payload []byte) {
const ipLenInWords = 5
// Ethernet frame.
packet.Eth.Destination = eth.BroadcastHW6()
Expand All @@ -199,8 +202,8 @@ func (d *DHCPServer) setResponseUDP(packet *UDPPacket, payload []byte) {
packet.IP.Flags = 0

// UDP frame.
packet.UDP.DestinationPort = 67
packet.UDP.SourcePort = 68
packet.UDP.DestinationPort = clientport
packet.UDP.SourcePort = d.port
packet.UDP.Length = packet.IP.TotalLength - 4*ipLenInWords
packet.UDP.Checksum = packet.UDP.CalculateChecksumIPv4(&packet.IP, payload)
}
34 changes: 29 additions & 5 deletions stacks/stacks_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,20 +41,44 @@ func TestDHCP(t *testing.T) {
if err != nil {
t.Fatal(err)
}

const minDHCPSize = eth.SizeEthernetHeader + eth.SizeIPv4Header + eth.SizeUDPHeader + eth.SizeDHCPHeader
// Client performs DISCOVER.
ex, n := exchangeStacks(t, 1, Stacks...)
if n < eth.SizeEthernetHeader+eth.SizeIPv4Header+eth.SizeUDPHeader+eth.SizeDHCPHeader {
t.Errorf("ex[%d] sent=%d want>=%d", ex, n, eth.SizeEthernetHeader+eth.SizeIPv4Header+eth.SizeUDPHeader+eth.SizeDHCPHeader)
if n < minDHCPSize {
t.Errorf("ex[%d] sent=%d want>=%d", ex, n, minDHCPSize)
}
if client.Done() {
t.Fatal("client done on first exchange?!")
}

// Server responds with OFFER.
ex, n = exchangeStacks(t, 1, Stacks...)
if n < eth.SizeEthernetHeader+eth.SizeIPv4Header+eth.SizeUDPHeader+eth.SizeDHCPHeader {
t.Errorf("ex[%d] sent=%d want>=%d", ex, n, eth.SizeEthernetHeader+eth.SizeIPv4Header+eth.SizeUDPHeader+eth.SizeDHCPHeader)
if n < minDHCPSize {
t.Errorf("ex[%d] sent=%d want>=%d", ex, n, minDHCPSize)
}

// Client performs REQUEST.
ex, n = exchangeStacks(t, 1, Stacks...)
if n < minDHCPSize {
t.Errorf("ex[%d] sent=%d want>=%d", ex, n, minDHCPSize)
}
if client.Done() {
t.Fatal("client done on request?!")
}

// Server performs ACK.
ex, n = exchangeStacks(t, 1, Stacks...)
if n < minDHCPSize {
t.Errorf("ex[%d] sent=%d want>=%d", ex, n, minDHCPSize)
}
if client.Done() {
t.Fatal("client not processed ACK yet")
}

// Client processes ACK
exchangeStacks(t, 1, Stacks...)
if !client.Done() {
t.Fatal("client should be done")
}
}

Expand Down

0 comments on commit 04ce5d7

Please sign in to comment.