From 03f7d618cb3d4c79fa1579790c745ca7b0daf1d2 Mon Sep 17 00:00:00 2001 From: kieron Date: Sun, 12 Jul 2020 21:44:23 +0000 Subject: [PATCH] git-svn-id: https://spexeah.com:8443/svn/Asuro@1045 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c --- src/driver/net/l5/dhcp.pas | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/driver/net/l5/dhcp.pas b/src/driver/net/l5/dhcp.pas index 30b8e377..61470ae7 100644 --- a/src/driver/net/l5/dhcp.pas +++ b/src/driver/net/l5/dhcp.pas @@ -217,6 +217,22 @@ begin readOption32:= read32^; end; +function getOptionByOpcode(Options : PDHCPOptions; Opcode : TDHCPOpCode) : PDHCPOption; +var + Option : PDHCPOption; + i : uint16; + +begin + getOptionByOpcode:= nil; + for i:=0 to getOptionsCount(Options)-1 do begin + Option:= getOption(Options, i); + if Option^.Opcode = Opcode then begin + getOptionByOpcode:= Option; + break; + end; + end; +end; + function writeOptions(Header : PDHCPHeader; Options : PDHCPOptions; newLength : puint16) : PDHCPHeader; var OptionsSize : uint16; @@ -414,11 +430,15 @@ Var NewSendHeader : PDHCPHeader; NewHeaderSize : uint32; + RequestParams : Array[0..3] of uint8; + SendCtx : PUDPSendContext; PacketCtx : PPacketContext; MAC : puint8; + Option : PDHCPOption; + begin console.outputln('DHCP', 'Process OFFER.'); @@ -433,9 +453,21 @@ begin SendOptions:= newOptions(); SendMsgType:= ord(TDHCPMessageType.REQUEST); + NewOption(SendOptions, TDHCPOpCode.DHCP_MESSAGE_TYPE, void(@SendMsgType), 1, false); + NewOption(SendOptions, TDHCPOpCode.REQUESTED_IP_ADDRESS, void(@SendHeader^.Client_IP[0]), 4, false); - NewOption(SendOptions, TDHCPOpCode.SERVER_IDENTIFIER, void(@SendHeader^.Server_IP[0]), 4, false); + + Option:= getOptionByOpcode(Options, TDHCPOpCode.SERVER_IDENTIFIER); + if Option <> nil then begin + NewOption(SendOptions, TDHCPOpCode.SERVER_IDENTIFIER, void(@Option^.Value[0]), 4, false); + end; + + RequestParams[0]:= Ord(TDHCPOpCode.SUBNET_MASK); + RequestParams[1]:= Ord(TDHCPOpCode.ROUTER); + RequestParams[2]:= Ord(TDHCPOpCode.DOMAIN_NAME); + RequestParams[3]:= Ord(TDHCPOpCode.DNS_SERVER); + NewOption(SendOptions, TDHCPOpCode.PARAMETER_REQUEST_LIST, void(@RequestParams[0]), 4, false); NewOption(SendOptions, TDHCPOpCode.END_VENDOR_OPTIONS, nil, 0, false); NewSendHeader:= writeOptions(SendHeader, SendOptions, @NewHeaderSize); @@ -526,6 +558,8 @@ begin { Packet is intended for a DHCP server } Outputln('DHCP','Packet is a server packet.'); end; + end else begin + Outputln('DHCP', 'Packet is not addressed to us.'); end;