From 48c203f028a0875bdc9c2c29ef3ede65b8846bc9 Mon Sep 17 00:00:00 2001 From: t3hn3rd Date: Mon, 17 Mar 2025 00:00:21 +0000 Subject: [PATCH] Fixed a DHCP bug - Fixed a bug within `dhcp.pas` - `processPacket_OFFER` in which the client was responding with the client IP value within the DHCP header was incorrectly being filled out with the IP being requested & this value was then being used within the REQUESTED_IP_ADDRESS option. Corrected this to fill out the client IP with the currently configured IP, which will be NULL (0.0.0.0) on boot, and whatever is issued thereafter. - Cascaded the change to use the currently configured IP as opposed to a NULL IP to any other functions that were calling `copyIPv4(@NULL_IP[0], @packetCtx^.IP.Source[0])`. - Allowed `processPacket_OFFER` to process packets addressed to the BROADCAST MAC (WHY COULDN'T IT DO THIS ALREADY?!). --- src/driver/net/l5/dhcp.pas | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/driver/net/l5/dhcp.pas b/src/driver/net/l5/dhcp.pas index ebffc193..b0041990 100644 --- a/src/driver/net/l5/dhcp.pas +++ b/src/driver/net/l5/dhcp.pas @@ -491,22 +491,26 @@ begin { Create a new header to the use in our DHCP REQUEST packet } SendHeader:= createHeader(); - CopyIPv4(puint8(@Header^.Your_IP[0]), puint8(@SendHeader^.Client_IP[0])); + CopyIPv4(@getIPv4Config^.Address[0], puint8(@SendHeader^.Client_IP[0])); CopyIPv4(puint8(@Header^.Server_IP[0]), puint8(@SendHeader^.Server_IP[0])); processHeader(SendHeader); { Setup Options } SendOptions:= newOptions(); + { Create a message type option and assign it the value REQUEST } SendMsgType:= ord(TDHCPMessageType.REQUEST); NewOption(SendOptions, TDHCPOpCode.DHCP_MESSAGE_TYPE, void(@SendMsgType), 1, false); + { Create a Requested IP option and assign it the value from the OFFER packet header } - NewOption(SendOptions, TDHCPOpCode.REQUESTED_IP_ADDRESS, void(@SendHeader^.Client_IP[0]), 4, false); + NewOption(SendOptions, TDHCPOpCode.REQUESTED_IP_ADDRESS, void(@Header^.Your_IP[0]), 4, false); + { Create a Server Identifier Option and assign it the value from the OFFER packet options } Option:= getOptionByOpcode(Options, TDHCPOpCode.SERVER_IDENTIFIER); if Option <> nil then begin NewOption(SendOptions, TDHCPOpCode.SERVER_IDENTIFIER, void(@Option^.Value[0]), 4, false); end; + { Create a Parameter Request List, Request the following: Netmask, Gateway, DNS Name & DNS Server } RequestParams[0]:= Ord(TDHCPOpCode.SUBNET_MASK); RequestParams[1]:= Ord(TDHCPOpCode.ROUTER); @@ -522,9 +526,13 @@ begin MAC:= getMAC(); packetCtx:= PPacketContext(Kalloc(sizeof(TPacketContext))); packetCtx^.TTL:= 128; - copyMAC(@BROADCAST_MAC[0], @packetCtx^.MAC.Destination[0]); + + { Copy over MAC - src: broadcast - dst: DHCP Server } copyMAC(MAC, @packetCtx^.MAC.Source[0]); - copyIPv4(@NULL_IP[0], @packetCtx^.IP.Source[0]); + copyMAC(@BROADCAST_MAC[0], @packetCtx^.MAC.Destination[0]); + + { Copy over IP - src: NULL - dst: Broadcast } + CopyIPv4(@getIPv4Config^.Address[0], @packetCtx^.IP.Source[0]); copyIPv4(@BROADCAST_IP[0], @packetCtx^.IP.Destination[0]); { Setup UDPContext (UDP) & copy in the correct details } @@ -570,7 +578,7 @@ begin { Check the frame is for us and then process } MAC:= getMAC; - if MACEqual(@context^.PacketContext^.MAC.Destination[0], MAC) then begin + if MACEqual(@context^.PacketContext^.MAC.Destination[0], MAC) or MACEqual(@context^.PacketContext^.MAC.Destination[0], BROADCAST_MAC) then begin Outputln('DHCP','Frame is addressed to us.'); { Check the message type is client specific } If Header^.Message_Type = $02 then begin @@ -655,7 +663,7 @@ begin copyMAC(@BROADCAST_MAC[0], @packetCtx^.MAC.Destination[0]); MAC:= getMAC; copyMAC(MAC, @packetCtx^.MAC.Source[0]); - copyIPv4(@NULL_IP[0], @packetCtx^.IP.Source[0]); + CopyIPv4(@getIPv4Config^.Address[0], @packetCtx^.IP.Source[0]); copyIPv4(@BROADCAST_IP[0], @packetCtx^.IP.Destination[0]); { Setup UDPContext (UDP) }