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