diff --git a/Asuro.iso b/Asuro.iso index eb8bd503..577cfa82 100644 Binary files a/Asuro.iso and b/Asuro.iso differ diff --git a/bin/kernel.bin b/bin/kernel.bin index b37e0e86..30feac9b 100755 Binary files a/bin/kernel.bin and b/bin/kernel.bin differ diff --git a/iso/boot/asuro.bin b/iso/boot/asuro.bin index b37e0e86..30feac9b 100755 Binary files a/iso/boot/asuro.bin and b/iso/boot/asuro.bin differ diff --git a/lib/E1000.ppu b/lib/E1000.ppu index 3f4aaf95..9a1f5745 100644 Binary files a/lib/E1000.ppu and b/lib/E1000.ppu differ diff --git a/lib/IDE.ppu b/lib/IDE.ppu index b7975ec5..b90ec606 100644 Binary files a/lib/IDE.ppu and b/lib/IDE.ppu differ diff --git a/lib/PCI.ppu b/lib/PCI.ppu index c872e5a6..025f824a 100644 Binary files a/lib/PCI.ppu and b/lib/PCI.ppu differ diff --git a/lib/USB.ppu b/lib/USB.ppu index 2d63c6b0..d1a577a5 100644 Binary files a/lib/USB.ppu and b/lib/USB.ppu differ diff --git a/lib/bios_data_area.ppu b/lib/bios_data_area.ppu index 83071a7a..23015577 100644 Binary files a/lib/bios_data_area.ppu and b/lib/bios_data_area.ppu differ diff --git a/lib/console.ppu b/lib/console.ppu index 261b1dea..5b1fafe7 100644 Binary files a/lib/console.ppu and b/lib/console.ppu differ diff --git a/lib/drivermanagement.ppu b/lib/drivermanagement.ppu index d36a1fd2..df7c5c2f 100644 Binary files a/lib/drivermanagement.ppu and b/lib/drivermanagement.ppu differ diff --git a/lib/eth2.ppu b/lib/eth2.ppu index b085dda7..ffedd572 100644 Binary files a/lib/eth2.ppu and b/lib/eth2.ppu differ diff --git a/lib/idt.ppu b/lib/idt.ppu index 7dc46d33..07bbe92a 100644 Binary files a/lib/idt.ppu and b/lib/idt.ppu differ diff --git a/lib/ipv4.ppu b/lib/ipv4.ppu index eadae60e..7b0a92b7 100644 Binary files a/lib/ipv4.ppu and b/lib/ipv4.ppu differ diff --git a/lib/irq.ppu b/lib/irq.ppu index c93ea647..a772646b 100644 Binary files a/lib/irq.ppu and b/lib/irq.ppu differ diff --git a/lib/isr0.ppu b/lib/isr0.ppu index 54146ee2..e2777dc0 100644 Binary files a/lib/isr0.ppu and b/lib/isr0.ppu differ diff --git a/lib/isr1.ppu b/lib/isr1.ppu index 68acc2a0..3d1dcba3 100644 Binary files a/lib/isr1.ppu and b/lib/isr1.ppu differ diff --git a/lib/isr10.ppu b/lib/isr10.ppu index bc8d1eaf..3622033a 100644 Binary files a/lib/isr10.ppu and b/lib/isr10.ppu differ diff --git a/lib/isr11.ppu b/lib/isr11.ppu index 794f150b..0784e1e2 100644 Binary files a/lib/isr11.ppu and b/lib/isr11.ppu differ diff --git a/lib/isr12.ppu b/lib/isr12.ppu index a27b34fa..96e1fab6 100644 Binary files a/lib/isr12.ppu and b/lib/isr12.ppu differ diff --git a/lib/isr13.ppu b/lib/isr13.ppu index fca59c68..945ced18 100644 Binary files a/lib/isr13.ppu and b/lib/isr13.ppu differ diff --git a/lib/isr14.ppu b/lib/isr14.ppu index eb3ebe51..e5024c73 100644 Binary files a/lib/isr14.ppu and b/lib/isr14.ppu differ diff --git a/lib/isr15.ppu b/lib/isr15.ppu index 7d05af99..64aaa176 100644 Binary files a/lib/isr15.ppu and b/lib/isr15.ppu differ diff --git a/lib/isr16.ppu b/lib/isr16.ppu index 04a4237a..9882cc3b 100644 Binary files a/lib/isr16.ppu and b/lib/isr16.ppu differ diff --git a/lib/isr17.ppu b/lib/isr17.ppu index a7e77644..2ba4301a 100644 Binary files a/lib/isr17.ppu and b/lib/isr17.ppu differ diff --git a/lib/isr18.ppu b/lib/isr18.ppu index 149edc2d..02dd2332 100644 Binary files a/lib/isr18.ppu and b/lib/isr18.ppu differ diff --git a/lib/isr2.ppu b/lib/isr2.ppu index 80108739..d5441d58 100644 Binary files a/lib/isr2.ppu and b/lib/isr2.ppu differ diff --git a/lib/isr3.ppu b/lib/isr3.ppu index 449b2028..a0b6f5ac 100644 Binary files a/lib/isr3.ppu and b/lib/isr3.ppu differ diff --git a/lib/isr32.ppu b/lib/isr32.ppu index 001a17a3..7b3ba77e 100644 Binary files a/lib/isr32.ppu and b/lib/isr32.ppu differ diff --git a/lib/isr33.ppu b/lib/isr33.ppu index 582edcbb..ff736439 100644 Binary files a/lib/isr33.ppu and b/lib/isr33.ppu differ diff --git a/lib/isr4.ppu b/lib/isr4.ppu index 3f0d7b4b..ac262086 100644 Binary files a/lib/isr4.ppu and b/lib/isr4.ppu differ diff --git a/lib/isr40.ppu b/lib/isr40.ppu index c1eb4f0f..2ccdc7ac 100644 Binary files a/lib/isr40.ppu and b/lib/isr40.ppu differ diff --git a/lib/isr44.ppu b/lib/isr44.ppu index 448aaf99..b1f1df4c 100644 Binary files a/lib/isr44.ppu and b/lib/isr44.ppu differ diff --git a/lib/isr5.ppu b/lib/isr5.ppu index 4d0898e5..b8a6bdb6 100644 Binary files a/lib/isr5.ppu and b/lib/isr5.ppu differ diff --git a/lib/isr6.ppu b/lib/isr6.ppu index efad4cd5..c871a0cc 100644 Binary files a/lib/isr6.ppu and b/lib/isr6.ppu differ diff --git a/lib/isr7.ppu b/lib/isr7.ppu index a4daed92..efbde61d 100644 Binary files a/lib/isr7.ppu and b/lib/isr7.ppu differ diff --git a/lib/isr76.ppu b/lib/isr76.ppu index e1e38d2a..7ee4cad5 100644 Binary files a/lib/isr76.ppu and b/lib/isr76.ppu differ diff --git a/lib/isr8.ppu b/lib/isr8.ppu index c22763a7..91bb1168 100644 Binary files a/lib/isr8.ppu and b/lib/isr8.ppu differ diff --git a/lib/isr9.ppu b/lib/isr9.ppu index 24610abe..8d55c618 100644 Binary files a/lib/isr9.ppu and b/lib/isr9.ppu differ diff --git a/lib/kernel.ppu b/lib/kernel.ppu index 0a1fb481..01753f52 100644 Binary files a/lib/kernel.ppu and b/lib/kernel.ppu differ diff --git a/lib/keyboard.ppu b/lib/keyboard.ppu index 93aa0082..527bbe25 100644 Binary files a/lib/keyboard.ppu and b/lib/keyboard.ppu differ diff --git a/lib/libpconsole.a b/lib/libpconsole.a index 64252256..0633eaaf 100644 Binary files a/lib/libpconsole.a and b/lib/libpconsole.a differ diff --git a/lib/libpmultiboot.a b/lib/libpmultiboot.a index a75475b9..10dd5c6c 100644 Binary files a/lib/libpmultiboot.a and b/lib/libpmultiboot.a differ diff --git a/lib/libpsystem.a b/lib/libpsystem.a index e4e1097d..23879493 100644 Binary files a/lib/libpsystem.a and b/lib/libpsystem.a differ diff --git a/lib/lists.ppu b/lib/lists.ppu index a6f18d7e..b4c2eec4 100644 Binary files a/lib/lists.ppu and b/lib/lists.ppu differ diff --git a/lib/lmemorymanager.ppu b/lib/lmemorymanager.ppu index 606e2f11..5b265cc6 100644 Binary files a/lib/lmemorymanager.ppu and b/lib/lmemorymanager.ppu differ diff --git a/lib/mouse.ppu b/lib/mouse.ppu index 38b75b31..4039b4ca 100644 Binary files a/lib/mouse.ppu and b/lib/mouse.ppu differ diff --git a/lib/net.ppu b/lib/net.ppu index f4d72839..61b51ebd 100644 Binary files a/lib/net.ppu and b/lib/net.ppu differ diff --git a/lib/nettypes.ppu b/lib/nettypes.ppu index f631cfdd..145f81d2 100644 Binary files a/lib/nettypes.ppu and b/lib/nettypes.ppu differ diff --git a/lib/netutils.ppu b/lib/netutils.ppu index 4ca19af0..e51fa5a8 100644 Binary files a/lib/netutils.ppu and b/lib/netutils.ppu differ diff --git a/lib/pmemorymanager.ppu b/lib/pmemorymanager.ppu index c4c5ab11..0556ebb0 100644 Binary files a/lib/pmemorymanager.ppu and b/lib/pmemorymanager.ppu differ diff --git a/lib/scheduler.ppu b/lib/scheduler.ppu index 4c378adf..9bcafba1 100644 Binary files a/lib/scheduler.ppu and b/lib/scheduler.ppu differ diff --git a/lib/storagemanagement.ppu b/lib/storagemanagement.ppu index 9b706e51..11cead0a 100644 Binary files a/lib/storagemanagement.ppu and b/lib/storagemanagement.ppu differ diff --git a/lib/strings.ppu b/lib/strings.ppu index 9a495ef9..3fa5be24 100644 Binary files a/lib/strings.ppu and b/lib/strings.ppu differ diff --git a/lib/system.ppu b/lib/system.ppu index b368f65c..404e748b 100644 Binary files a/lib/system.ppu and b/lib/system.ppu differ diff --git a/lib/terminal.ppu b/lib/terminal.ppu index 4f0e87f6..ce6908bc 100644 Binary files a/lib/terminal.ppu and b/lib/terminal.ppu differ diff --git a/lib/testdriver.ppu b/lib/testdriver.ppu index 062ed20d..f89b65f4 100644 Binary files a/lib/testdriver.ppu and b/lib/testdriver.ppu differ diff --git a/lib/tss.ppu b/lib/tss.ppu index 97358db4..d8f5b295 100644 Binary files a/lib/tss.ppu and b/lib/tss.ppu differ diff --git a/lib/util.ppu b/lib/util.ppu index 53c8759d..a37a39aa 100644 Binary files a/lib/util.ppu and b/lib/util.ppu differ diff --git a/lib/vmemorymanager.ppu b/lib/vmemorymanager.ppu index f1cf407a..a1e1c07d 100644 Binary files a/lib/vmemorymanager.ppu and b/lib/vmemorymanager.ppu differ diff --git a/src/driver/net/include/nettypes.pas b/src/driver/net/include/nettypes.pas index faf20ee4..f952f343 100644 --- a/src/driver/net/include/nettypes.pas +++ b/src/driver/net/include/nettypes.pas @@ -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); diff --git a/src/driver/net/include/netutils.pas b/src/driver/net/include/netutils.pas index 48f0f1f2..b485a8df 100644 --- a/src/driver/net/include/netutils.pas +++ b/src/driver/net/include/netutils.pas @@ -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. \ No newline at end of file diff --git a/src/driver/net/l1/net.pas b/src/driver/net/l1/net.pas index 545f77b1..6fb21914 100644 --- a/src/driver/net/l1/net.pas +++ b/src/driver/net/l1/net.pas @@ -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. \ No newline at end of file diff --git a/src/driver/net/l2/eth2.pas b/src/driver/net/l2/eth2.pas index 92ef9877..42a26f18 100644 --- a/src/driver/net/l2/eth2.pas +++ b/src/driver/net/l2/eth2.pas @@ -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; diff --git a/src/driver/net/l3/arp.pas b/src/driver/net/l3/arp.pas index 274f1318..aa7ca3f1 100644 --- a/src/driver/net/l3/arp.pas +++ b/src/driver/net/l3/arp.pas @@ -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. \ No newline at end of file diff --git a/src/driver/net/l3/ipv4.pas b/src/driver/net/l3/ipv4.pas index db26172b..7655002b 100644 --- a/src/driver/net/l3/ipv4.pas +++ b/src/driver/net/l3/ipv4.pas @@ -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; diff --git a/src/drivermanagement.pas b/src/drivermanagement.pas index 41d63022..b80b7731 100644 --- a/src/drivermanagement.pas +++ b/src/drivermanagement.pas @@ -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. \ No newline at end of file diff --git a/src/include/util.pas b/src/include/util.pas index 90d62412..3a592c69 100644 --- a/src/include/util.pas +++ b/src/include/util.pas @@ -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; diff --git a/src/kernel.pas b/src/kernel.pas index 356d7f10..1c0f683c 100644 --- a/src/kernel.pas +++ b/src/kernel.pas @@ -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 '); - 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(''); diff --git a/src/terminal.pas b/src/terminal.pas index 71ef3579..e0af1d96 100644 --- a/src/terminal.pas +++ b/src/terminal.pas @@ -16,7 +16,8 @@ uses keyboard, util, lmemorymanager, - strings; + strings, + tracer; type PParamList = ^TParamList; diff --git a/src/vmemorymanager.pas b/src/vmemorymanager.pas index ace79c8f..a6cf226e 100644 --- a/src/vmemorymanager.pas +++ b/src/vmemorymanager.pas @@ -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;