diff --git a/Asuro.iso b/Asuro.iso index 7014d8e5..0e5ba42b 100644 Binary files a/Asuro.iso and b/Asuro.iso differ diff --git a/bin/kernel.bin b/bin/kernel.bin index 4549463c..426e2f71 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 4549463c..426e2f71 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 ddbf33c2..540b4e73 100644 Binary files a/lib/E1000.ppu and b/lib/E1000.ppu differ diff --git a/lib/eth2.ppu b/lib/eth2.ppu new file mode 100644 index 00000000..f9bdbc8e Binary files /dev/null and b/lib/eth2.ppu differ diff --git a/lib/kernel.ppu b/lib/kernel.ppu index 0706e82a..d0e32084 100644 Binary files a/lib/kernel.ppu and b/lib/kernel.ppu differ diff --git a/lib/libpconsole.a b/lib/libpconsole.a index 36eaabc1..664dd714 100644 Binary files a/lib/libpconsole.a and b/lib/libpconsole.a differ diff --git a/lib/libpmultiboot.a b/lib/libpmultiboot.a index 1c4ffb2c..730a662d 100644 Binary files a/lib/libpmultiboot.a and b/lib/libpmultiboot.a differ diff --git a/lib/libpsystem.a b/lib/libpsystem.a index 2b656cd1..812c56f9 100644 Binary files a/lib/libpsystem.a and b/lib/libpsystem.a differ diff --git a/lib/net.ppu b/lib/net.ppu new file mode 100644 index 00000000..a5acd344 Binary files /dev/null and b/lib/net.ppu differ diff --git a/lib/nettypes.ppu b/lib/nettypes.ppu new file mode 100644 index 00000000..e2200f0e Binary files /dev/null and b/lib/nettypes.ppu differ diff --git a/src/driver/net/eth2.pas b/src/driver/net/eth2.pas new file mode 100644 index 00000000..51ffe5f8 --- /dev/null +++ b/src/driver/net/eth2.pas @@ -0,0 +1,51 @@ +unit eth2; + +interface + +uses + net, nettypes, console; + +procedure register; + +implementation + +var + Registered : Boolean = false; + EthTypes : Array[0..65535] of TRecvCallback; + MAC : puint8; + +procedure registerType(eType : uint16; RecvCB : TRecvCallback); +begin + if EthTypes[eType] = nil then EthTypes[eType]:= RecvCB; +end; + +procedure recv(p_data : void; p_len : uint16); +var + src, dst : puint8; + proto_type : uint16; + +begin + dst:= puint8(p_data); + src:= puint8(p_data + 6); + console.output('net.eth2', 'DEST: '); + writeMACAddress(dst); + console.output('net.eth2', 'SRC: '); + writeMACAddress(src); +end; + +procedure register; +var + i : uint16; + +begin + if not Registered then begin + for i:=0 to 65535 do begin + EthTypes[i]:= nil; + end; + net.registerNextLayer(@recv); + MAC:= net.getMAC; + Registered:= true; + end; +end; + +end. \ No newline at end of file diff --git a/src/driver/net/net.pas b/src/driver/net/net.pas index 931a7710..7f7bd38a 100644 --- a/src/driver/net/net.pas +++ b/src/driver/net/net.pas @@ -2,6 +2,50 @@ unit net; interface +uses + nettypes; + +procedure registerNetworkCard(SendCallback : TNetSendCallback; _MAC : puint8); +procedure registerNextLayer(RecvCallback : TRecvCallback); +procedure send(p_data : void; p_len : uint16); +procedure recv(p_data : void; p_len : uint16); +function getMAC : puint8; + implementation +var + CBSend : TNetSendCallback = nil; + CBNext : TRecvCallback = nil; + MAC : puint8 = nil; + +procedure registerNetworkCard(SendCallback : TNetSendCallback; _MAC : puint8); +begin + if CBSend = nil then begin + CBSend:= SendCallback; + MAC:= _MAC; + end; +end; + +procedure registerNextLayer(RecvCallback : TRecvCallback); +begin + if CBNext = nil then begin + CBNext:= RecvCallback; + end; +end; + +procedure send(p_data : void; p_len : uint16); +begin + CBSend(p_data, p_len); +end; + +procedure recv(p_data : void; p_len : uint16); +begin + CBNext(p_data, p_len); +end; + +function getMAC : puint8; +begin + getMAC:= MAC; +end; + end. \ No newline at end of file diff --git a/src/driver/net/nettypes.pas b/src/driver/net/nettypes.pas new file mode 100644 index 00000000..a9549a67 --- /dev/null +++ b/src/driver/net/nettypes.pas @@ -0,0 +1,29 @@ +unit nettypes; + +interface + +uses + console; + +type + TNetSendCallback = function(p_data : void; p_len : uint16) : sint32; + TRecvCallback = procedure(p_data : void; p_len : uint16); + +procedure writeMACAddress(mac : puint8); + +implementation + +procedure writeMACAddress(mac : puint8); +var + i : integer; + +begin + console.writehexpair(mac[0]); + for i:=1 to 5 do begin + console.writestring(':'); + console.writehexpair(mac[i]); + end; + console.writestringln(' '); +end; + +end. \ No newline at end of file diff --git a/src/driver/netdev/E1000.pas b/src/driver/netdev/E1000.pas index 1d0be6ec..89801dd6 100644 --- a/src/driver/netdev/E1000.pas +++ b/src/driver/netdev/E1000.pas @@ -12,7 +12,9 @@ uses util, IDT, PCI, - terminal; + terminal, + net, + nettypes; const INTEL_VEND = $8086; @@ -355,6 +357,8 @@ begin len:= rx_descs[rx_curr]^.length; //Inject Packet into Network Stack + kpalloc(uint32(buf)); + net.recv(void(buf), len); rx_descs[rx_curr]^.status:= 0; old_cur:= rx_curr; @@ -374,19 +378,6 @@ begin end; end; -procedure writeMACAddress(); -var - i : integer; - -begin - console.writehexpair(mac[0]); - for i:=1 to 5 do begin - console.writestring(':'); - console.writehexpair(mac[i]); - end; - console.writestringln(' '); -end; - procedure fire(); interrupt; var status : uint32; @@ -419,7 +410,7 @@ end; procedure console_command_mac(params : PParamList); begin - writeMACAddress(); + writeMACAddress(@mac[0]); end; procedure console_command_sendtest(params : PParamList); @@ -490,7 +481,7 @@ begin exit; end; console.output('E1000 Driver', 'MAC Address: '); - writeMACAddress(); + writeMACAddress(@mac[0]); startLink(); @@ -498,9 +489,11 @@ begin writeCommand($5200 + i*4, 0); end; - IDT.set_gate(32 + PCI_Info^.interrupt_line, uint32(@fire), $08, ISR_RING_0); + net.registerNetworkCard(@sendPacket, getMACAddress()); + IDT.set_gate(32 + PCI_Info^.interrupt_line, uint32(@fire), $08, ISR_RING_0); enableInturrupt(); + rxinit(); txinit();