x86_64 do not merge #76
No files matched your search
@@ -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
@@ -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
@@ -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.
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in new issue
Block a user