diff --git a/Asuro.iso b/Asuro.iso index c97a2d80..706369c8 100644 Binary files a/Asuro.iso and b/Asuro.iso differ diff --git a/bin/kernel.bin b/bin/kernel.bin index 554ab5d7..3bfedaeb 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 554ab5d7..3bfedaeb 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 a3b8543f..d60c0ede 100644 Binary files a/lib/E1000.ppu and b/lib/E1000.ppu differ diff --git a/lib/arp.ppu b/lib/arp.ppu index 98d5a332..a9a12900 100644 Binary files a/lib/arp.ppu and b/lib/arp.ppu differ diff --git a/lib/asuro.ppu b/lib/asuro.ppu index a8f9c140..47257e92 100644 Binary files a/lib/asuro.ppu and b/lib/asuro.ppu differ diff --git a/lib/eth2.ppu b/lib/eth2.ppu index ac124ed2..2b7feb2a 100644 Binary files a/lib/eth2.ppu and b/lib/eth2.ppu differ diff --git a/lib/ipv4.ppu b/lib/ipv4.ppu index 4dde0094..e0f99479 100644 Binary files a/lib/ipv4.ppu and b/lib/ipv4.ppu differ diff --git a/lib/kernel.ppu b/lib/kernel.ppu index 8309833e..48ddbba8 100644 Binary files a/lib/kernel.ppu and b/lib/kernel.ppu differ diff --git a/lib/libpconsole.a b/lib/libpconsole.a index 80664fd2..3997ed67 100644 Binary files a/lib/libpconsole.a and b/lib/libpconsole.a differ diff --git a/lib/libpmultiboot.a b/lib/libpmultiboot.a index 634b4a26..a61f26ee 100644 Binary files a/lib/libpmultiboot.a and b/lib/libpmultiboot.a differ diff --git a/lib/libpsystem.a b/lib/libpsystem.a index 6f03178a..6d1c6ce5 100644 Binary files a/lib/libpsystem.a and b/lib/libpsystem.a differ diff --git a/lib/net.ppu b/lib/net.ppu index ff92ce60..eb89e363 100644 Binary files a/lib/net.ppu and b/lib/net.ppu differ diff --git a/lib/nettypes.ppu b/lib/nettypes.ppu index 9c713592..090f35bc 100644 Binary files a/lib/nettypes.ppu and b/lib/nettypes.ppu differ diff --git a/lib/netutils.ppu b/lib/netutils.ppu index ec8c21c2..dc24bc0f 100644 Binary files a/lib/netutils.ppu and b/lib/netutils.ppu differ diff --git a/lib/shell.ppu b/lib/shell.ppu index 402ee808..fcfa8428 100644 Binary files a/lib/shell.ppu and b/lib/shell.ppu differ diff --git a/lib/terminal.ppu b/lib/terminal.ppu index e2bda496..3a82c10c 100644 Binary files a/lib/terminal.ppu and b/lib/terminal.ppu differ diff --git a/src/driver/net/include/nettypes.pas b/src/driver/net/include/nettypes.pas index 73dfe4e1..d87bc52f 100644 --- a/src/driver/net/include/nettypes.pas +++ b/src/driver/net/include/nettypes.pas @@ -18,10 +18,19 @@ type Destination : TIPv4Address; end; + TProtocol = record + L1 : uint16; + L2 : uint16; + L3 : uint16; + L4 : uint16; + end; + PPacketContext = ^TPacketContext; TPacketContext = record MAC : TMACPair; IP : TIPv4Pair; + Protocol : TProtocol; + TTL : uint8; end; PIPv4Configuration = ^TIPv4Configuration; diff --git a/src/driver/net/l3/ipv4.pas b/src/driver/net/l3/ipv4.pas index 8dca5cac..97b323bd 100644 --- a/src/driver/net/l3/ipv4.pas +++ b/src/driver/net/l3/ipv4.pas @@ -23,12 +23,74 @@ var Registered : Boolean = false; Protocols : Array[0..255] of TRecvCallback; Config : TIPv4Configuration; + CurrentID : uint16 = 0; function getIPv4Config : PIPv4Configuration; begin getIPv4Config:= @Config; end; +function calculateChecksum(p_data : puint16; p_len : uint16) : uint16; +var + sum : uint32; + dat : puint16; + carry : uint16; + i : uint32; + l : uint32; + +begin + dat:= p_data; + sum:= 0; + l:= p_len div 2; + for i:=1 to l do begin + sum:= sum + p_data^; + inc(p_data); + end; + while (sum > $FFFF) do begin + carry:= (sum AND $FFFF0000) SHR 16; + sum:= sum + carry; + end; + calculateChecksum:= not sum; +end; + +procedure send(p_data : void; p_len : uint16; p_context : PPacketContext); +var + Header : TIPV4Header; + Len : uint16; + CHK : uint16; + buffer : void; + +begin + writeToLogLn(' L3: ipv4.send'); + inc(CurrentID); + Header.version:= 4; + Header.header_len:= 5; + Header.ToS:= 0; + Len:= 20 + p_len; + Header.total_len_Hi:= Len SHR 8; + Header.total_len_Lo:= Len AND $FF; + Header.identifier_Hi:= CurrentID SHR 8; + Header.identifier_Lo:= CurrentID AND $FF; + Header.Flags:= 0; + Header.Fragment_Off:= 0; + Header.TTL:= p_context^.TTL; + Header.Protocol:= p_context^.Protocol.L4 AND $FF; + Header.HDR_CHK_Hi:= 0; + Header.HDR_CHK_Lo:= 0; + CopyIPv4(@getIPv4Config^.Address[0], @Header.Src[0]); + CopyIPv4(@p_context^.IP.Destination[0], @Header.Dst[0]); + Header.Options:= 0; + Header.Padding:= 0; + CHK:= calculateChecksum(puint16(@Header), sizeof(TIPV4Header)); + Header.HDR_CHK_Hi:= CHK SHR 8; + Header.HDR_CHK_Lo:= 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); + eth2.send(Buffer, (Header.header_len * 4) + p_len, $0800, p_context); + kfree(Buffer); +end; + procedure recv(p_data : void; p_len : uint16; p_context : PPacketContext); var Header : PIPV4Header; diff --git a/src/driver/netdev/E1000.pas b/src/driver/netdev/E1000.pas index 9a0758a1..5a7e5d69 100644 --- a/src/driver/netdev/E1000.pas +++ b/src/driver/netdev/E1000.pas @@ -556,7 +556,6 @@ begin net.registerNetworkCard(@sendPacket, getMACAddress()); isrmanager.registerISR(32 + PCI_Info^.interrupt_line, @fire); - //IDT.set_gate(32 + PCI_Info^.interrupt_line, uint32(@fire), $08, ISR_RING_0); enableInturrupt(); rxinit(); diff --git a/src/include/asuro.pas b/src/include/asuro.pas index f599707c..7ee679a3 100644 --- a/src/include/asuro.pas +++ b/src/include/asuro.pas @@ -3,20 +3,20 @@ unit asuro; interface const - VERSION = '1.0.1-677ia'; + VERSION = '1.0.1-726ia'; VERSION_MAJOR = '1'; VERSION_MINOR = '0'; VERSION_SUB = '1'; - REVISION = '677'; + REVISION = '726'; RELEASE = 'ia'; - LINE_COUNT = 28115; + LINE_COUNT = 28185; FILE_COUNT = 90; DRIVER_COUNT = 32; FPC_VERSION = '2.6.4'; NASM_VERSION = '2.10.09'; MAKE_VERSION = '3.81'; COMPILE_DATE = '12/05/18'; - COMPILE_TIME = '11:08:14'; + COMPILE_TIME = '16:05:29'; implementation