git-svn-id: https://spexeah.com:8443/svn/Asuro@481 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c

This commit is contained in:
kieron
2018-04-10 21:03:37 +00:00
parent aa748b9796
commit 16c0580e58
70 changed files with 350 additions and 34 deletions

View File

@ -3,8 +3,62 @@ unit nettypes;
interface
type
TNetSendCallback = function(p_data : void; p_len : uint16) : sint32;
TRecvCallback = procedure(p_data : void; p_len : uint16);
TMACAddress = Array[0..5] of uint8;
TIPv4Address = Array[0..3] of uint8;
TMACPair = record
Source : TMACAddress;
Destination : TMACAddress;
end;
TIPv4Pair = record
Source : TIPv4Address;
Destination : TIPv4Address;
end;
PPacketContext = ^TPacketContext;
TPacketContext = record
MAC : TMACPair;
IP : TIPv4Pair;
end;
PIPv4Configuration = ^TIPv4Configuration;
TIPv4Configuration = record
Address : array[0..3] of uint8;
Gateway : array[0..3] of uint8;
Netmask : array[0..3] of uint8;
UP : Boolean;
end;
TARPAbstractHeader = record
Hardware_Type : uint16;
Protocol_Type : uint16;
Hardware_Address_Length : uint8;
Protocol_Address_Length : uint8;
Operation : uint16;
Source_Hardware : TMACAddress;
Source_Protocol : TIPv4Address;
Destination_Hardware : TMACAddress;
Destination_Protocol : TIPv4Address;
end;
PARPHeader = ^TARPHeader;
TARPHeader = bitpacked record
Hardware_Type_Hi : uint8;
Hardware_Type_Lo : uint8;
Protocol_Type_Hi : uint8;
Protocol_Type_Lo : uint8;
Hardware_Address_Length : uint8;
Protocol_Address_Length : uint8;
Operation_Hi : uint8;
Operation_Lo : uint8;
Source_Hardware : TMACAddress;
Source_Protocol : TIPv4Address;
Destination_Hardware : TMACAddress;
Destination_Protocol : TIPv4Address;
end;
PEthernetHeader = ^TEthernetHeader;
TEthernetHeader = bitpacked record
@ -57,6 +111,9 @@ type
Options : uint32;
end;
TNetSendCallback = function(p_data : void; p_len : uint16) : sint32;
TRecvCallback = procedure(p_data : void; p_len : uint16; p_context : PPacketContext);
const
BROADCAST_MAC : Array[0..5] of uint8 = ($FF, $FF, $FF, $FF, $FF, $FF);

View File

@ -3,14 +3,33 @@ unit netutils;
interface
uses
nettypes, console;
util, nettypes, console, lmemorymanager;
procedure copyMAC(src : puint8; dst : puint8);
procedure copyIPv4(src : puint8; dst : puint8);
procedure writeMACAddress(mac : puint8);
procedure writeIPv4Address(ip : puint8);
function MACEqual(mac1 : puint8; mac2 : puint8) : boolean;
function IPEqual(ip1 : puint8; ip2 : puint8) : boolean;
function newPacketContext : PPacketContext;
procedure freePacketContext(p_context : PPacketContext);
implementation
function IPEqual(ip1 : puint8; ip2 : puint8) : boolean;
var
i : uint8;
begin
IPEqual:= true;
for i:=0 to 3 do begin
if ip1[i] <> ip2[i] then begin
IPEqual:= false;
exit;
end;
end;
end;
function MACEqual(mac1 : puint8; mac2 : puint8) : boolean;
var
i : uint8;
@ -51,4 +70,35 @@ begin
console.writestringln(' ');
end;
function newPacketContext : PPacketContext;
begin
newPacketContext:= PPacketContext(kalloc(sizeof(TPacketContext)));
memset(uint32(newPacketContext), 0, sizeof(TPacketContext));
end;
procedure freePacketContext(p_context : PPacketContext);
begin
kfree(void(p_context));
end;
procedure copyMAC(src : puint8; dst : puint8);
var
i : uint8;
begin
for i:=0 to 5 do begin
dst[i]:= src[i];
end;
end;
procedure copyIPv4(src : puint8; dst : puint8);
var
i : uint8;
begin
for i:=0 to 3 do begin
dst[i]:= src[i];
end;
end;
end.

View File

@ -6,6 +6,7 @@ uses
console,
nettypes, netutils;
procedure init;
procedure registerNetworkCard(SendCallback : TNetSendCallback; _MAC : puint8);
procedure registerNextLayer(RecvCallback : TRecvCallback);
procedure send(p_data : void; p_len : uint16);
@ -14,6 +15,9 @@ function getMAC : puint8;
implementation
uses
ipv4, arp, eth2;
var
CBSend : TNetSendCallback = nil;
CBNext : TRecvCallback = nil;
@ -40,9 +44,14 @@ begin
end;
procedure recv(p_data : void; p_len : uint16);
var
context : PPacketContext;
begin
//console.outputln('net', 'RECV.');
if CBNext <> nil then CBNext(p_data, p_len);
context:= newPacketContext;
if CBNext <> nil then CBNext(p_data, p_len, context);
freePacketContext(context);
end;
function getMAC : puint8;
@ -50,4 +59,11 @@ begin
getMAC:= MAC;
end;
procedure init;
begin
eth2.register;
arp.register;
ipv4.register;
end;
end.

View File

@ -23,34 +23,37 @@ begin
if EthTypes[eType] = nil then EthTypes[eType]:= RecvCB;
end;
procedure recv(p_data : void; p_len : uint16);
procedure recv(p_data : void; p_len : uint16; p_context : PPacketContext);
var
Header : PEthernetHeader;
proto_type : uint16;
buf : puint8;
begin
console.outputln('net.eth2', 'RECV.');
//console.outputln('net.eth2', 'RECV.');
buf:= puint8(p_data);
Header:= PEthernetHeader(buf);
console.output('net.eth2', 'DEST: ');
writeMACAddress(@Header^.dst[0]);
console.output('net.eth2', 'SRC: ');
writeMACAddress(@Header^.src[0]);
//console.output('net.eth2', 'DEST: ');
//writeMACAddress(@Header^.dst[0]);
//console.output('net.eth2', 'SRC: ');
//writeMACAddress(@Header^.src[0]);
proto_type:= Header^.EthTypeHi SHL 8;
proto_type:= proto_type + Header^.EthTypeLo;
console.output('net.eth2', 'PROTO: ');
console.writehexln(proto_type);
//console.output('net.eth2', 'PROTO: ');
//console.writehexln(proto_type);
buf:= buf + 14;
copyMAC(@Header^.src[0], @p_context^.MAC.Source[0]);
copyMAC(@Header^.dst[0], @p_context^.MAC.Destination[0]);
if MACEqual(@Header^.dst[0], @Header^.src[0]) or MACEqual(@Header^.dst[0], @BROADCAST_MAC[0]) then begin
console.outputln('net.eth2', 'MAC HIT');
//console.outputln('net.eth2', 'MAC HIT');
if EthTypes[proto_type] <> nil then begin
EthTypes[proto_type](void(buf), p_len - 14);
EthTypes[proto_type](void(buf), p_len - 14, p_context);
end;
end;
end;

View File

@ -3,9 +3,142 @@ unit arp;
interface
uses
util, lists, console,
nettypes, netutils,
eth2;
type
PARPCacheRecord = ^TARPCacheRecord;
TARPCacheRecord = record
MAC : TMACAddress;
IP : TIPv4Address;
end;
procedure register;
function IPv4ToMAC(ip : puint8) : puint8;
function MACToIIPv4(mac : puint8) : puint8;
implementation
var
Registered : Boolean = false;
Cache : PLinkedListBase;
function findCacheRecordByMAC(mac : puint8) : PARPCacheRecord;
var
i : uint32;
r : PARPCacheRecord;
begin
findCacheRecordByMAC:= nil;
for i:=0 to LL_Size(Cache)-1 do begin
r:= PARPCacheRecord(LL_Get(Cache, i));
if MACEqual(mac, @r^.MAC[0]) then begin
findCacheRecordByMAC:= r;
exit;
end;
end;
end;
function findCacheRecordByIP(ip : puint8) : PARPCacheRecord;
var
i : uint32;
r : PARPCacheRecord;
begin
findCacheRecordByIP:= nil;
for i:=0 to LL_Size(Cache)-1 do begin
r:= PARPCacheRecord(LL_Get(Cache, i));
if IPEqual(ip, @r^.IP[0]) then begin
findCacheRecordByIP:= r;
exit;
end;
end;
end;
procedure recv(p_data : void; p_len : uint16; p_context : PPacketContext);
var
Header : PARPHeader;
AHeader : TARPAbstractHeader;
CacheElement : PARPCacheRecord;
begin
{ Get our converted Header }
Header:= PARPHeader(p_data);
AHeader.Hardware_Type:= (Header^.Hardware_Type_Hi SHL 8) + Header^.Hardware_Type_Lo;
AHeader.Protocol_Type:= (Header^.Protocol_Type_Hi SHL 8) + Header^.Protocol_Type_Lo;
AHeader.Hardware_Address_Length:= Header^.Hardware_Address_Length;
AHeader.Protocol_Address_Length:= Header^.Protocol_Address_Length;
AHeader.Operation:= (Header^.Operation_Hi SHL 8) + Header^.Operation_Lo;
copyMAC(@Header^.Source_Hardware[0], @AHeader.Source_Hardware[0]);
copyIPv4(@Header^.Source_Protocol[0], @AHeader.Source_Protocol[0]);
copyMAC(@Header^.Destination_Hardware[0], @AHeader.Destination_Hardware[0]);
copyIPv4(@Header^.Destination_Protocol[0], @AHeader.Destination_Protocol[0]);
case AHeader.Operation of
$1:begin { ARP Request }
//console.writestringln('ARP Request.');
end;
$2:begin { ARP Reply }
//console.writestringln('ARP Reply.');
end;
$3:begin { RARP Request }
end;
$4:begin { RARP Reply }
end;
$5:begin { DRARP Request }
end;
$6:begin { DRARP Reply }
end;
$7:begin { DRARP Error }
end;
$8:begin { InARP Request }
end;
$9:begin { InARP Reply }
end;
end;
end;
procedure register;
begin
if not Registered then begin
Cache:= LL_New(sizeof(TARPCacheRecord));
eth2.registerType($0806, @recv);
Registered:= true;
end;
end;
function IPv4ToMAC(ip : puint8) : puint8;
var
r : PARPCacheRecord;
begin
register;
IPv4ToMAC:= nil;
r:= findCacheRecordByIP(ip);
if r <> nil then begin
IPv4ToMAC:= @r^.MAC[0];
end;
end;
function MACToIIPv4(mac : puint8) : puint8;
var
r : PARPCacheRecord;
begin
register;
MACToIIPv4:= nil;
r:= findCacheRecordByMAC(mac);
if r <> nil then begin
MACToIIPv4:= @r^.IP[0];
end;
end;
end.

View File

@ -3,8 +3,8 @@ unit ipv4;
interface
uses
util, console,
nettypes, netutils,
util, console, terminal,
net, nettypes, netutils,
eth2;
procedure registerProtocol(Protocol_ID : uint8; recv_callback : TRecvCallback);
@ -14,9 +14,10 @@ implementation
var
Registered : Boolean = false;
Protocols : Array[0..255] of TRecvCallback;
Protocols : Array[0..255] of TRecvCallback;
Config : TIPv4Configuration;
procedure recv(p_data : void; p_len : uint16);
procedure recv(p_data : void; p_len : uint16; p_context : PPacketContext);
var
Header : PIPV4Header;
AHeader : TIPV4AbstractHeader;
@ -25,7 +26,7 @@ var
len : uint16;
begin
console.outputln('net.ipv4', 'RECV.');
//console.outputln('net.ipv4', 'RECV.');
Header:= PIPV4Header(p_data);
AHeader.version:= Header^.version;
AHeader.header_len:= Header^.header_len;
@ -45,16 +46,41 @@ begin
end;
AHeader.Options:= Header^.Options;
console.output('net.ipv4', 'Source: ');
writeIPv4Address(puint8(@AHeader.Src[0]));
console.output('net.ipv4', 'Dest: ');
writeIPv4Address(puint8(@AHeader.Dst[0]));
//console.output('net.ipv4', 'Source: ');
//writeIPv4Address(puint8(@AHeader.Src[0]));
//console.output('net.ipv4', 'Dest: ');
//writeIPv4Address(puint8(@AHeader.Dst[0]));
buf:= puint8(p_data);
buf:= buf + AHeader.header_len;
len:= p_len - AHeader.header_len;
if Protocols[AHeader.Protocol] <> nil then Protocols[AHeader.Protocol](void(buf), len);
copyIPv4(@AHeader.Src[0], @p_context^.IP.Source[0]);
copyIPv4(@AHeader.Dst[0], @p_context^.IP.Destination[0]);
if (IPEqual(@Config.Address[0], @AHeader.Dst[0])) OR (AHeader.Dst[3] = 255) then begin
if Protocols[AHeader.Protocol] <> nil then Protocols[AHeader.Protocol](void(buf), len, p_context);
end;
end;
procedure terminal_command_ifconfig(params : PParamList);
begin
if paramCount(params) > 2 then begin
end else begin
writestring(' MAC: ');
writeMACAddress(net.GetMAC);
writestring(' IPv4: ');
writeIPv4Address(@Config.Address[0]);
writestring(' Gateway: ');
writeIPv4Address(@Config.Gateway[0]);
writestring(' Netmask: ');
writeIPv4Address(@Config.Netmask[0]);
if Config.UP then
writestringln(' NetUP: true')
else
writestringln(' NetUP: false');
end;
end;
procedure register;
@ -66,7 +92,14 @@ begin
for i:=0 to 255 do begin
Protocols[i]:= nil;
end;
for i:=0 to 3 do begin
Config.Address[i]:= 0;
Config.Gateway[i]:= 0;
Config.Netmask[i]:= 0;
end;
Config.UP:= false;
eth2.registerType($0800, @recv);
terminal.registerCommand('IFCONFIG', @terminal_command_ifconfig, 'Configure Network Settings.');
Registered:= true;
end;
end;

View File

@ -11,7 +11,7 @@ unit drivermanagement;
interface
uses
console, util, strings, lmemorymanager, terminal;
console, util, strings, lmemorymanager, terminal, tracer;
const
idANY = $FFFFFFFF;
@ -88,6 +88,7 @@ var
i : uint32;
begin
//push_trace('driver_management.terminal_command_drivers');
Drv:= Root;
i:= 1;
while Drv <> nil do begin
@ -119,6 +120,7 @@ begin
end;
Drv:= Drv^.Next;
end;
//pop_trace;
end;
procedure terminal_command_driversex(Params : PParamList);
@ -128,6 +130,7 @@ var
i : uint32;
begin
//push_trace('driver_management.terminal_command_driversex');
Drv:= Root;
i:= 1;
while Drv <> nil do begin
@ -158,6 +161,7 @@ begin
i:= i + 1;
Drv:= Drv^.Next;
end;
//pop_trace;
end;
procedure terminal_command_devices(Params : PParamList);
@ -167,6 +171,7 @@ var
i : uint32;
begin
//push_trace('driver_management.terminal_command_devices');
Dv:= Dev;
i:= 1;
while Dv <> nil do begin
@ -204,6 +209,7 @@ begin
i:= i + 1;
Dv:= Dv^.Next;
end;
//pop_trace;
end;
{ Main Functions }
@ -291,6 +297,7 @@ var
RegList : PDriverRegistration;
begin
//push_trace('driver_management.register_driver_ex');
if DeviceID = nil then exit;
NewReg:= PDriverRegistration(kalloc(sizeof(TDriverRegistration)));
NewReg^.Driver_Name:= stringCopy(Driver_Name);
@ -316,6 +323,7 @@ begin
NewReg^.Loaded:= True;
NewReg^.Driver_Load(nil);
end;
//pop_trace;
end;
procedure register_device(Device_Name : PChar; DeviceID : PDeviceIdentifier; ptr : void);
@ -325,6 +333,7 @@ var
dev_list : PDeviceRegistration;
begin
//push_trace('driver_management.register_device');
drv:= Root;
new_dev:= PDeviceRegistration(kalloc(sizeof(TDeviceRegistration)));
new_dev^.Device_Name:= stringCopy(Device_Name);
@ -361,6 +370,7 @@ begin
end;
drv:= drv^.Next;
end;
//pop_trace;
end;
end.

View File

@ -14,7 +14,7 @@ unit util;
interface
uses
bios_data_area;
bios_data_area, tracer;
procedure CLI();
procedure STI();
@ -75,7 +75,7 @@ begin
console.writestring(delim);
end;
end;
console.writestringln(' ');
console.writestringln(' ');
end;
function hi(b : uint8) : uint8; [public, alias: 'util_hi'];
@ -297,7 +297,8 @@ begin
console.writestringln(fault);
console.writestring(' Fault Info: ');
console.writestringln(info);
console.writestringln(' ');
console.writestring(' Faulting Module: ');
console.writestringln(tracer.get_last_trace);
console.writestringln(' ');
halt_and_catch_fire();
end;

View File

@ -26,6 +26,7 @@ uses
vmemorymanager,
pmemorymanager,
lmemorymanager,
tracer,
drivermanagement,
tss,
scheduler,
@ -37,8 +38,8 @@ uses
E1000,
IDE,
storagemanagement,
ipv4,
lists;
lists,
net;
procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall;
@ -51,6 +52,8 @@ end;
procedure terminal_command_meminfo(params : PParamList);
begin
push_trace('kernel.terminal_command_meminfo');
console.writestring('Lower Memory = ');
console.writeint(multibootinfo^.mem_lower);
console.writestringln('KB');
@ -60,16 +63,22 @@ begin
console.writestring('Total Memory = ');
console.writeint(((multibootinfo^.mem_upper + 1000) div 1024) + 1);
console.writestringln('MB');
pop_trace;
end;
procedure terminal_command_bsod(params : PParamList);
begin
push_trace('kernel.terminal_command_bsod');
if ParamCount(params) > 1 then begin
bsod(getparam(0, params), getparam(1, params));
end else begin
console.writestringln('Invalid number of params.');
console.writestringln('Usage: bsod <error> <info>');
end;
end;
pop_trace;
end;
procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall; [public, alias: 'kmain'];
@ -134,6 +143,7 @@ begin
scheduler.init();
{ Management Interfaces }
tracer.init();
drivermanagement.init();
storagemanagement.init();
@ -157,7 +167,7 @@ begin
console.outputln('KERNEL', 'BUS DRIVERS: INIT END.');
{ Network Stack }
ipv4.register();
net.init;
{ End of Boot }
console.writestringln('');

View File

@ -16,7 +16,8 @@ uses
keyboard,
util,
lmemorymanager,
strings;
strings,
tracer;
type
PParamList = ^TParamList;

View File

@ -14,7 +14,8 @@ interface
uses
util,
pmemorymanager,
console;
console,
tracer;
type
PPageDirEntry = ^TPageDirEntry;
@ -84,6 +85,7 @@ begin
end;
Directory:= Directory + KERNEL_VIRTUAL_BASE;
load_current_page_directory:= PPageDirectory(Directory);
pop_trace;
end;
procedure init;