x86_64 do not merge #76

Open
Aaron wants to merge 9 commits from 64bit into feature/sotrage-system-overhaul
pull from: 64bit
12 changed files with 275 additions and 211 deletions
Showing only changes of commit b71e6d67b4 - Show all commits

No files matched your search

+1 -1
View File
@@ -22,7 +22,7 @@ unit app.dhclient;
interface interface
uses uses
io.stdio, core.util, arch.x86.util, core.strings, debug.tracer, driver.net.proto.dhcp; io.stdio, core.util, arch.platform.cpu, core.strings, debug.tracer, driver.net.proto.dhcp;
procedure init(); procedure init();
+30 -12
View File
@@ -20,8 +20,8 @@ procedure init();
implementation implementation
uses uses
arch.x86.bda, driver.net.types, driver.net.proto.icmp, driver.net.util, core.strings, proc.types, driver.net.types, driver.net.proto.icmp, driver.net.util, core.strings,
proc.mgr, core.util, arch.x86.util, memory.heap; proc.mgr, core.util, arch.platform.cpu, memory.heap;
const const
PING_TIMEOUT_MS = 5000; { 5-second timeout per app.ping } PING_TIMEOUT_MS = 5000; { 5-second timeout per app.ping }
@@ -31,22 +31,34 @@ type
PPingState = ^TPingState; PPingState = ^TPingState;
TPingState = record TPingState = record
Result : TPingResult; Result : TPingResult;
ReplyTimeMS : uint64; ReplyTimeMS : uint32;
ErrorReason : TARPErrorCode; ErrorReason : TARPErrorCode;
SendTime : uint64; SendTime : uint32;
Address : puint8;
end; end;
procedure cleanup(handle: void);
var
st: PPingState;
begin
st := PPingState(handle);
if st = nil then exit;
driver.net.proto.icmp.cancelRequests(handle);
kfree(void(st^.Address));
kfree(handle);
end;
{ ---- ICMP callbacks (called from network recv context) ---- } { ---- ICMP callbacks (called from network recv context) ---- }
procedure on_reply(hdr : PICMPHeader; userData : void); procedure on_reply(hdr : PICMPHeader; userData : void);
var var
st : PPingState; st : PPingState;
t2 : uint64; t2 : uint32;
begin begin
st := PPingState(userData); st := PPingState(userData);
if st = nil then exit; if st = nil then exit;
t2 := Counters.c64; t2 := networkTicks;
st^.ReplyTimeMS := t2 - st^.SendTime; st^.ReplyTimeMS := (uint64(uint32(t2 - st^.SendTime)) * 1000) div 1024;
st^.Result := prGotReply; st^.Result := prGotReply;
end; end;
@@ -87,24 +99,31 @@ begin
{ Allocate per-invocation state so concurrent pings are safe } { Allocate per-invocation state so concurrent pings are safe }
st := PPingState(kalloc(sizeof(TPingState))); st := PPingState(kalloc(sizeof(TPingState)));
if st = nil then begin
kfree(void(ip));
exit;
end;
st^.Address := ip;
proc.mgr.bindResource(proc.mgr.CurrentProcess, rkCustom, void(st), @cleanup);
timeoutTicks := (PING_TIMEOUT_MS * 1024) div 1000; timeoutTicks := (PING_TIMEOUT_MS * 1024) div 1000;
for i := 0 to 9 do begin for i := 0 to 9 do begin
{ Send ICMP echo request } { Send ICMP echo request }
st^.Result := prWaiting; st^.Result := prWaiting;
st^.SendTime := Counters.c64; st^.SendTime := networkTicks;
driver.net.proto.icmp.sendICMPRequest(ip, i, 128, @on_reply, @on_error, void(st)); driver.net.proto.icmp.sendICMPRequest(ip, i, 128, @on_reply, @on_error, void(st));
{ Spin-yield until callback fires or timeout } { Spin-yield until callback fires or timeout }
tStart := Counters.c32; tStart := networkTicks;
while st^.Result = prWaiting do begin while st^.Result = prWaiting do begin
proc.mgr.proc_yield; proc.mgr.proc_yield;
tNow := Counters.c32; tNow := networkTicks;
if tNow >= tStart then if tNow >= tStart then
elapsed := tNow - tStart elapsed := tNow - tStart
else else
elapsed := ($FFFFFFFF - tStart) + tNow + 1; elapsed := ($FFFFFFFF - tStart) + tNow + 1;
if elapsed >= timeoutTicks then begin if elapsed >= timeoutTicks then begin
driver.net.proto.icmp.cancelRequests(void(st));
st^.Result := prGotError; st^.Result := prGotError;
st^.ErrorReason := aecTimeout; st^.ErrorReason := aecTimeout;
break; break;
@@ -132,8 +151,7 @@ begin
end; end;
{ Clean up } { Clean up }
kfree(void(st)); proc.mgr.unbindResource(proc.mgr.CurrentProcess, void(st));
kfree(void(ip));
end; end;
procedure init(); procedure init();
File diff suppressed because it is too large. Load diff
+7 -4
View File
@@ -22,7 +22,6 @@ unit driver.net;
interface interface
uses uses
boot.mgr,
debug.tracer, debug.tracer,
driver.net.types, driver.net.util, driver.net.types, driver.net.util,
io.syslog, io.syslog,
@@ -40,7 +39,7 @@ procedure writeToLogLn(str : pchar);
implementation implementation
uses uses
driver.net.dev.e1000, //dev io.stdio, driver.net.dev.e1000, //dev
driver.net.proto.eth2, //L2 driver.net.proto.eth2, //L2
driver.net.proto.arp, driver.net.proto.ipv4, //L3 driver.net.proto.arp, driver.net.proto.ipv4, //L3
driver.net.proto.icmp, driver.net.proto.tcp, driver.net.proto.udp, //L4 driver.net.proto.icmp, driver.net.proto.tcp, driver.net.proto.udp, //L4
@@ -141,10 +140,14 @@ begin
driver.net.proto.udp.register; driver.net.proto.udp.register;
//l5 //l5
driver.net.proto.dhcp.register; driver.net.proto.dhcp.register;
driver.net.dev.e1000.init;
io.stdio.registerCommand('ARP', @driver.net.proto.arp.terminal_command_arp, 'Get ARP Table.');
io.stdio.registerCommand('IFCONFIG', @driver.net.proto.ipv4.terminal_command_ifconfig, 'Configure Network Settings.');
io.stdio.registerCommand('TCPCONNECT', @driver.net.proto.tcp.terminal_command_tcpconnect, 'Connect to a TCP host and send Hello World.');
io.stdio.registerCommand('TCPLISTEN', @driver.net.proto.tcp.terminal_command_tcplisten, 'Listen on a TCP port and log received data.');
io.stdio.registerCommand('TCPHTTP', @driver.net.proto.tcp.terminal_command_tcphttp, 'Send HTTP GET to a host IP (port 80 default).');
pop_trace; pop_trace;
end; end;
initialization
boot.mgr.registerBoot('driver.net', @Init, 'Net Driver', BOOT_MGR_BARRIER_LATE)
end. end.
+14 -2
View File
@@ -22,7 +22,7 @@ unit driver.net.util;
interface interface
uses uses
debug.tracer, core.util, arch.x86.util, driver.net.types, io.stdio, memory.heap, core.ds.lists, core.strings; debug.tracer, core.util, arch.platform.cpu, driver.net.types, io.stdio, memory.heap, core.ds.lists, core.strings;
procedure copyMAC(src : puint8; dst : puint8); procedure copyMAC(src : puint8; dst : puint8);
procedure copyIPv4(src : puint8; dst : puint8); procedure copyIPv4(src : puint8; dst : puint8);
@@ -41,9 +41,21 @@ function verifyChecksum(p_data : puint16; p_len : uint16) : boolean;
function sameSubnetIPv4(ip1, ip2, netmask : puint8) : boolean; function sameSubnetIPv4(ip1, ip2, netmask : puint8) : boolean;
procedure contextMACSwitch(p_context : PPacketContext); procedure contextMACSwitch(p_context : PPacketContext);
procedure contextIPv4Switch(p_context : PPacketContext); procedure contextIPv4Switch(p_context : PPacketContext);
function networkTicks: uint32;
implementation implementation
uses arch.platform.interrupts, arch.common.legacyirq;
function networkTicks: uint32;
var
ticks: uint64;
begin
ticks := arch.platform.interrupts.timerTicks;
networkTicks := uint32((ticks div PIT_INPUT_HZ) * PIT_DIVISOR * 1024 +
((ticks mod PIT_INPUT_HZ) * PIT_DIVISOR * 1024) div PIT_INPUT_HZ);
end;
function sameSubnetIPv4(ip1, ip2, netmask : puint8) : boolean; function sameSubnetIPv4(ip1, ip2, netmask : puint8) : boolean;
var var
_ip1, _ip2, _netmask : puint32; _ip1, _ip2, _netmask : puint32;
@@ -232,7 +244,7 @@ function newPacketContext : PPacketContext;
begin begin
push_trace('driver.net.util.newPacketContext'); push_trace('driver.net.util.newPacketContext');
newPacketContext:= PPacketContext(kalloc(sizeof(TPacketContext))); newPacketContext:= PPacketContext(kalloc(sizeof(TPacketContext)));
memset(uint32(newPacketContext), 0, sizeof(TPacketContext)); memset(PtrUInt(newPacketContext), 0, sizeof(TPacketContext));
pop_trace; pop_trace;
end; end;
@@ -23,7 +23,7 @@ interface
uses uses
debug.tracer, memory.heap, debug.tracer, memory.heap,
core.util, arch.x86.util, core.ds.lists, core.util, arch.platform.cpu, core.ds.lists,
driver.net, driver.net.types, driver.net.util, driver.net, driver.net.types, driver.net.util,
driver.net.proto.eth2, driver.net.proto.ipv4, io.stdio; driver.net.proto.eth2, driver.net.proto.ipv4, io.stdio;
@@ -212,6 +212,7 @@ var
begin begin
push_trace('driver.net.proto.arp.recv'); push_trace('driver.net.proto.arp.recv');
if (p_data = nil) or (p_len < sizeof(TARPHeader)) then exit;
{ Get our converted Header } { Get our converted Header }
Header:= PARPHeader(p_data); Header:= PARPHeader(p_data);
AHeader.Hardware_Type:= (Header^.Hardware_Type_Hi SHL 8) + Header^.Hardware_Type_Lo; AHeader.Hardware_Type:= (Header^.Hardware_Type_Hi SHL 8) + Header^.Hardware_Type_Lo;
+14 -12
View File
@@ -24,7 +24,7 @@ interface
uses uses
memory.heap, io.syslog, memory.heap, io.syslog,
driver.net.types, driver.net.util, driver.net.proto.udp, driver.net, driver.net.types, driver.net.util, driver.net.proto.udp, driver.net,
core.util, arch.x86.util, core.rand, core.ds.lists, debug.tracer, driver.net.proto.ipv4, driver.net.proto.arp; core.util, arch.platform.cpu, core.rand, core.ds.lists, debug.tracer, driver.net.proto.ipv4, driver.net.proto.arp;
type type
TDHCPOptions = PLinkedListBase; TDHCPOptions = PLinkedListBase;
@@ -95,10 +95,10 @@ begin
CopyIPv4(@NULL_IP[0], @result^.Relay_Agent_IP[0]); CopyIPv4(@NULL_IP[0], @result^.Relay_Agent_IP[0]);
MAC:= getMAC; MAC:= getMAC;
CopyMAC(MAC, @result^.Client_MAC[0]); CopyMAC(MAC, @result^.Client_MAC[0]);
memset(uint32(@result^.Padding[0]), 0, 10); memset(PtrUInt(@result^.Padding[0]), 0, 10);
memset(uint32(@result^.Server_Hostname[0]), 0, 64); memset(PtrUInt(@result^.Server_Hostname[0]), 0, 64);
memset(uint32(@result^.Boot_File[0]), 0, 128); memset(PtrUInt(@result^.Boot_File[0]), 0, 128);
memcpy(uint32(@DHCP_MAGIC[0]), uint32(@result^.Magic_Cookie[0]), 4); memcpy(PtrUInt(@DHCP_MAGIC[0]), PtrUInt(@result^.Magic_Cookie[0]), 4);
createHeader:= result; createHeader:= result;
end; end;
@@ -115,7 +115,7 @@ begin
Option^.Reverse_Endian:= SwapEndian; Option^.Reverse_Endian:= SwapEndian;
if Length > 0 then begin if Length > 0 then begin
Option^.Value:= kalloc(Length); Option^.Value:= kalloc(Length);
memcpy(uint32(Data), uint32(Option^.Value), Length); memcpy(PtrUInt(Data), PtrUInt(Option^.Value), Length);
end else begin end else begin
Option^.Value:= nil; Option^.Value:= nil;
end; end;
@@ -292,7 +292,7 @@ begin
{ Copy the header } { Copy the header }
NewHeader:= PDHCPHeader(NewBuffer); NewHeader:= PDHCPHeader(NewBuffer);
memcpy(uint32(Header), uint32(NewHeader), sizeof(TDHCPHeader)); memcpy(PtrUInt(Header), PtrUInt(NewHeader), sizeof(TDHCPHeader));
{ Write Options } { Write Options }
buffer:= puint8(NewBuffer); buffer:= puint8(NewBuffer);
@@ -322,7 +322,7 @@ begin
read32^:= getEndianCorrectValue32(Option); read32^:= getEndianCorrectValue32(Option);
end; end;
else begin else begin
memcpy(uint32(Option^.Value), uint32(buffer), Option^.Size); memcpy(PtrUInt(Option^.Value), PtrUInt(buffer), Option^.Size);
end; end;
end; end;
inc(buffer, Option^.Size); inc(buffer, Option^.Size);
@@ -354,8 +354,8 @@ begin
{ Get the beginning & end of the Options buffer } { Get the beginning & end of the Options buffer }
HeaderSize:= sizeOf(TDHCPHeader); HeaderSize:= sizeOf(TDHCPHeader);
bufferEnd:= puint8(uint32(p_data) + p_len); bufferEnd:= puint8(PtrUInt(p_data) + p_len);
bufferStart:= puint8(uint32(p_data) + headerSize); bufferStart:= puint8(PtrUInt(p_data) + headerSize);
{ Buffer is our iterator } { Buffer is our iterator }
buffer:= bufferStart; buffer:= bufferStart;
@@ -363,13 +363,14 @@ begin
HaveOp:= false; HaveOp:= false;
HaveLen:= false; HaveLen:= false;
while (uint32(buffer) < uint32(bufferEnd)) do begin while (PtrUInt(buffer) < PtrUInt(bufferEnd)) do begin
{ {
If we have a length, read the value (bytes[length]) If we have a length, read the value (bytes[length])
If we have an Opcode read the length (bytes[1]) If we have an Opcode read the length (bytes[1])
If we have neither, read the opcode (bytes[1]) If we have neither, read the opcode (bytes[1])
} }
if HaveLen then begin if HaveLen then begin
if Length > PtrUInt(bufferEnd) - PtrUInt(buffer) then exit;
{ Get a new option LinkedList 'object' and store everything inside } { Get a new option LinkedList 'object' and store everything inside }
Option:= newOption(DHCPOptions, Opcode, void(buffer), Length, not FlipExclude^[ord(Opcode)]); Option:= newOption(DHCPOptions, Opcode, void(buffer), Length, not FlipExclude^[ord(Opcode)]);
if Length = 2 then begin if Length = 2 then begin
@@ -445,7 +446,7 @@ begin
else begin else begin
cfgopt:= kalloc(Option^.Size); cfgopt:= kalloc(Option^.Size);
Configuration^.Options[ord(Option^.Opcode)]:= cfgopt; Configuration^.Options[ord(Option^.Opcode)]:= cfgopt;
memcpy(uint32(Option^.Value), uint32(cfgopt), Option^.Size); memcpy(PtrUInt(Option^.Value), PtrUInt(cfgopt), Option^.Size);
end; end;
end; end;
end; end;
@@ -566,6 +567,7 @@ var
begin begin
debug.tracer.push_trace('driver.net.proto.dhcp.processPacket.enter'); debug.tracer.push_trace('driver.net.proto.dhcp.processPacket.enter');
if (p_data = nil) or (p_len < sizeof(TDHCPHeader)) then exit;
writeToLogLn(' L5/DHCP: processPacket'); writeToLogLn(' L5/DHCP: processPacket');
io.syslog.logln('DHCP','processPacket'); io.syslog.logln('DHCP','processPacket');
@@ -22,7 +22,7 @@ unit driver.net.proto.eth2;
interface interface
uses uses
memory.heap, core.util, arch.x86.util, memory.heap, core.util, arch.platform.cpu,
debug.tracer, debug.tracer,
driver.net.types, driver.net.util, driver.net.types, driver.net.util,
driver.net, driver.net,
@@ -79,9 +79,9 @@ begin
copyMAC(@p_context^.MAC.Destination[0], @hdr.dst[0]); copyMAC(@p_context^.MAC.Destination[0], @hdr.dst[0]);
hdr.EthTypeHi:= eth_type SHR 8; hdr.EthTypeHi:= eth_type SHR 8;
hdr.EthTypeLo:= eth_type AND $FF; hdr.EthTypeLo:= eth_type AND $FF;
memcpy(uint32(@hdr), uint32(buffer), sizeof(TEthernetHeader)); memcpy(PtrUInt(@hdr), PtrUInt(buffer), sizeof(TEthernetHeader));
memcpy(uint32(p_data), uint32(buffer)+sizeof(TEthernetHeader), p_len); memcpy(PtrUInt(p_data), PtrUInt(buffer)+sizeof(TEthernetHeader), p_len);
//FCS:= puint32((uint32(buffer) + size) - 4); //FCS:= puint32((PtrUInt(buffer) + size) - 4);
//FCS^:= crc32(puint8(buffer), size - 4); //FCS^:= crc32(puint8(buffer), size - 4);
driver.net.send(buffer, size); driver.net.send(buffer, size);
kfree(buffer); kfree(buffer);
@@ -96,6 +96,7 @@ var
begin begin
push_trace('driver.net.proto.eth2.recv'); push_trace('driver.net.proto.eth2.recv');
if (p_data = nil) or (p_len < sizeof(TEthernetHeader)) then exit;
buf:= puint8(p_data); buf:= puint8(p_data);
Header:= PEthernetHeader(buf); Header:= PEthernetHeader(buf);
+31 -3
View File
@@ -22,9 +22,8 @@ unit driver.net.proto.icmp;
interface interface
uses uses
arch.x86.bda,
memory.heap, debug.tracer, memory.heap, debug.tracer,
driver.net, driver.net.types, driver.net.util, driver.net.proto.ipv4, driver.net.proto.arp, core.util, arch.x86.util; driver.net, driver.net.types, driver.net.util, driver.net.proto.ipv4, driver.net.proto.arp, core.util, arch.platform.cpu;
type type
TARPErrorCode = (aecFailedToResolveHost, aecNoRouteToHost, aecTimeout, aecTTLExpired); TARPErrorCode = (aecFailedToResolveHost, aecNoRouteToHost, aecTimeout, aecTTLExpired);
@@ -38,6 +37,7 @@ type
end; end;
procedure register; procedure register;
procedure cancelRequests(userData: void);
procedure sendICMPRequest(ip : puint8; Sequence : uint16; TTL : uint8; OnRep : TARPReplyCallback; OnErr : TARPErrorCallback; userData : void); procedure sendICMPRequest(ip : puint8; Sequence : uint16; TTL : uint8; OnRep : TARPReplyCallback; OnErr : TARPErrorCallback; userData : void);
implementation implementation
@@ -45,6 +45,23 @@ implementation
var var
Handlers : Array[0..255] of TARPHandler; Handlers : Array[0..255] of TARPHandler;
procedure cancelRequests(userData: void);
var
i: uint32;
flags: PtrUInt;
begin
flags := arch.platform.cpu.lock;
for i := 1 to 255 do begin
if Handlers[i].UserData = userData then begin
Handlers[i].Active := false;
Handlers[i].UserData := nil;
Handlers[i].OnReply := nil;
Handlers[i].OnError := nil;
end;
end;
arch.platform.cpu.unlock(flags);
end;
function nextInactiveHandler : uint8; function nextInactiveHandler : uint8;
var var
i : uint8; i : uint8;
@@ -74,15 +91,23 @@ var
Buffer : void; Buffer : void;
CHK : uint16; CHK : uint16;
Size : uint32; Size : uint32;
flags : PtrUInt;
begin begin
push_trace('driver.net.proto.icmp.sendICMPRequest'); push_trace('driver.net.proto.icmp.sendICMPRequest');
writeToLogLn(' L4/ICMP: sendICMPRequest'); writeToLogLn(' L4/ICMP: sendICMPRequest');
flags := arch.platform.cpu.lock;
handle:= nextInactiveHandler; handle:= nextInactiveHandler;
if handle = 0 then begin
arch.platform.cpu.unlock(flags);
if OnErr <> nil then OnErr(nil, aecTimeout, userData);
exit;
end;
Handlers[handle].Active:= true; Handlers[handle].Active:= true;
Handlers[handle].OnReply:= OnRep; Handlers[handle].OnReply:= OnRep;
Handlers[handle].OnError:= OnErr; Handlers[handle].OnError:= OnErr;
Handlers[handle].UserData:= userData; Handlers[handle].UserData:= userData;
arch.platform.cpu.unlock(flags);
if SameSubnetIPv4(ip, @getIPv4Config^.Address[0], @getIPv4Config^.Netmask[0]) then begin if SameSubnetIPv4(ip, @getIPv4Config^.Address[0], @getIPv4Config^.Netmask[0]) then begin
dest_mac:= driver.net.proto.arp.resolveIP(ip); dest_mac:= driver.net.proto.arp.resolveIP(ip);
end else begin end else begin
@@ -109,7 +134,7 @@ begin
Header^.Identifier:= handle; Header^.Identifier:= handle;
Header^.Sequence:= Sequence; Header^.Sequence:= Sequence;
memcpy(uint32(@ICMP_DATA_GENERIC[0]), uint32(Buffer) + sizeof(TICMPHeader), sizeof(ICMP_DATA_GENERIC)); memcpy(PtrUInt(@ICMP_DATA_GENERIC[0]), PtrUInt(Buffer) + sizeof(TICMPHeader), sizeof(ICMP_DATA_GENERIC));
CHK:= calculateChecksum(puint16(Buffer), Size); CHK:= calculateChecksum(puint16(Buffer), Size);
@@ -117,6 +142,7 @@ begin
Header^.ICMP_CHK_Lo:= CHK SHR 8; Header^.ICMP_CHK_Lo:= CHK SHR 8;
driver.net.proto.ipv4.send(Buffer, size, context); driver.net.proto.ipv4.send(Buffer, size, context);
kfree(Buffer);
freePacketContext(context); freePacketContext(context);
end; end;
@@ -135,6 +161,7 @@ var
begin begin
push_trace('driver.net.proto.icmp.recv'); push_trace('driver.net.proto.icmp.recv');
if (p_data = nil) or (p_len < sizeof(TICMPHeader)) then exit;
writeToLogLn(' L4/ICMP: recv'); writeToLogLn(' L4/ICMP: recv');
Header:= PICMPHeader(p_data); Header:= PICMPHeader(p_data);
//writehexlnWND(Header^.ICMP_Type, getTerminalHWND); //writehexlnWND(Header^.ICMP_Type, getTerminalHWND);
@@ -153,6 +180,7 @@ begin
driver.net.proto.ipv4.send(p_data, p_len, p_context); driver.net.proto.ipv4.send(p_data, p_len, p_context);
end; end;
$00:begin //Reply $00:begin //Reply
if Header^.Identifier > 255 then exit;
Handle:= Header^.Identifier; Handle:= Header^.Identifier;
if (Handle > 0) and (Handle < 256) then begin if (Handle > 0) and (Handle < 256) then begin
If Handlers[Handle].Active then begin If Handlers[Handle].Active then begin
@@ -23,7 +23,7 @@ interface
uses uses
debug.tracer, memory.heap, debug.tracer, memory.heap,
core.util, arch.x86.util, core.strings, core.util, arch.platform.cpu, core.strings,
driver.net, driver.net.types, driver.net.util, driver.net, driver.net.types, driver.net.util,
core.ds.lists, core.ds.lists,
driver.net.proto.eth2, io.stdio; driver.net.proto.eth2, io.stdio;
@@ -84,8 +84,8 @@ begin
Header.HDR_CHK_Hi:= CHK AND $FF;//CHK SHR 8; Header.HDR_CHK_Hi:= CHK AND $FF;//CHK SHR 8;
Header.HDR_CHK_Lo:= CHK SHR 8;//CHK AND $FF; Header.HDR_CHK_Lo:= CHK SHR 8;//CHK AND $FF;
Buffer:= kalloc(Len); Buffer:= kalloc(Len);
memcpy(uint32(@Header), uint32(Buffer), Header.header_len * 4); memcpy(PtrUInt(@Header), PtrUInt(Buffer), Header.header_len * 4);
memcpy(uint32(p_data), uint32(Buffer) + (Header.header_len * 4), p_len); memcpy(PtrUInt(p_data), PtrUInt(Buffer) + (Header.header_len * 4), p_len);
driver.net.proto.eth2.send(Buffer, (Header.header_len * 4) + p_len, $0800, p_context); driver.net.proto.eth2.send(Buffer, (Header.header_len * 4) + p_len, $0800, p_context);
kfree(Buffer); kfree(Buffer);
pop_trace; pop_trace;
@@ -101,11 +101,15 @@ var
begin begin
push_trace('driver.net.proto.ipv4.recv'); push_trace('driver.net.proto.ipv4.recv');
if (p_data = nil) or (p_len < 20) then exit;
Header:= PIPV4Header(p_data); Header:= PIPV4Header(p_data);
AHeader.version:= Header^.version; AHeader.version:= Header^.version;
AHeader.header_len:= Header^.header_len; AHeader.header_len:= Header^.header_len;
AHeader.ToS:= Header^.ToS; AHeader.ToS:= Header^.ToS;
AHeader.total_len:= (Header^.total_len_Hi SHL 8) + Header^.total_len_Lo; AHeader.total_len:= (Header^.total_len_Hi SHL 8) + Header^.total_len_Lo;
if (AHeader.version <> 4) or (AHeader.header_len < 5) or
(AHeader.total_len < AHeader.header_len * 4) or
(AHeader.total_len > p_len) then exit;
AHeader.identifier:= (Header^.identifier_Hi SHL 8) + Header^.identifier_Lo; AHeader.identifier:= (Header^.identifier_Hi SHL 8) + Header^.identifier_Lo;
AHeader.Flags.RS:= false; AHeader.Flags.RS:= false;
AHeader.Flags.DF:= (Header^.Flags AND $2) > 0; AHeader.Flags.DF:= (Header^.Flags AND $2) > 0;
@@ -122,7 +126,7 @@ begin
buf:= puint8(p_data); buf:= puint8(p_data);
buf:= buf + (AHeader.header_len * 4); buf:= buf + (AHeader.header_len * 4);
len:= p_len - (AHeader.header_len * 4); len:= AHeader.total_len - (AHeader.header_len * 4);
copyIPv4(@AHeader.Src[0], @p_context^.IP.Source[0]); copyIPv4(@AHeader.Src[0], @p_context^.IP.Source[0]);
copyIPv4(@AHeader.Dst[0], @p_context^.IP.Destination[0]); copyIPv4(@AHeader.Dst[0], @p_context^.IP.Destination[0]);
File diff suppressed because it is too large. Load diff
@@ -25,7 +25,7 @@ uses
memory.heap, memory.heap,
driver.net.types, driver.net.util, driver.net.types, driver.net.util,
driver.net.proto.ipv4, driver.net, driver.net.proto.ipv4, driver.net,
debug.tracer, core.util, arch.x86.util; debug.tracer, core.util, arch.platform.cpu;
procedure register(); procedure register();
function bind(bindContext : PUDPBindContext) : TUDPError; function bind(bindContext : PUDPBindContext) : TUDPError;
@@ -83,7 +83,7 @@ begin
pseudoHeader^.UDP_Source:= pseduoSrc; pseudoHeader^.UDP_Source:= pseduoSrc;
pseudoHeader^.UDP_Destination:= udpContext^.DstPort; pseudoHeader^.UDP_Destination:= udpContext^.DstPort;
pseudoHeader^.UDP_Length:= size; pseudoHeader^.UDP_Length:= size;
memcpy(uint32(p_data), uint32(pseudoBuffer) + SizeOf(TUDPPseudoHeader), p_len); memcpy(PtrUInt(p_data), PtrUInt(pseudoBuffer) + SizeOf(TUDPPseudoHeader), p_len);
if nullend then pseudoBuffer8[pseudoSize-1]:= 0; if nullend then pseudoBuffer8[pseudoSize-1]:= 0;
pseudoHeader^.Source_IP:= switchendian32(pseudoHeader^.Source_IP); pseudoHeader^.Source_IP:= switchendian32(pseudoHeader^.Source_IP);
@@ -136,8 +136,8 @@ begin
hdr^.Checksum:= switchendian16(checksum); hdr^.Checksum:= switchendian16(checksum);
hdr^.Length:= switchendian16(size); hdr^.Length:= switchendian16(size);
memcpy(uint32(hdr), uint32(buffer), sizeof(TUDPHeader)); memcpy(PtrUInt(hdr), PtrUInt(buffer), sizeof(TUDPHeader));
memcpy(uint32(p_data), uint32(buffer) + sizeof(TUDPHeader), p_len); memcpy(PtrUInt(p_data), PtrUInt(buffer) + sizeof(TUDPHeader), p_len);
udpContext^.context^.Protocol.L4:= $11; udpContext^.context^.Protocol.L4:= $11;
@@ -208,7 +208,10 @@ var
begin begin
push_trace('driver.net.proto.udp.ProcessPacket'); push_trace('driver.net.proto.udp.ProcessPacket');
if (p_data = nil) or (p_len < sizeof(TUDPHeader)) then exit;
header:= PUDPHeader(p_data); header:= PUDPHeader(p_data);
size := switchendian16(header^.Length);
if (size < sizeof(TUDPHeader)) or (size > p_len) then exit;
if Ports[switchendian16(header^.DstPort)] <> nil then begin if Ports[switchendian16(header^.DstPort)] <> nil then begin
context:= PUDPPacketContext(kalloc(sizeof(TUDPPacketContext))); context:= PUDPPacketContext(kalloc(sizeof(TUDPPacketContext)));
context^.PacketContext:= p_context; context^.PacketContext:= p_context;