diff --git a/Asuro.iso b/Asuro.iso index 88e8629e..88443bfb 100644 Binary files a/Asuro.iso and b/Asuro.iso differ diff --git a/bin/kernel.bin b/bin/kernel.bin index 9d1e0638..581cc946 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 9d1e0638..581cc946 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 74bc9ce4..c79b2e3a 100644 Binary files a/lib/E1000.ppu and b/lib/E1000.ppu differ diff --git a/lib/IDE.ppu b/lib/IDE.ppu index cac4ccf8..f804cdaf 100644 Binary files a/lib/IDE.ppu and b/lib/IDE.ppu differ diff --git a/lib/arp.ppu b/lib/arp.ppu index 995f62c6..d3b61a56 100644 Binary files a/lib/arp.ppu and b/lib/arp.ppu differ diff --git a/lib/asuro.ppu b/lib/asuro.ppu index cae340c4..e829e923 100644 Binary files a/lib/asuro.ppu and b/lib/asuro.ppu differ diff --git a/lib/console.ppu b/lib/console.ppu index 334b55d5..dfe4656a 100644 Binary files a/lib/console.ppu and b/lib/console.ppu differ diff --git a/lib/cpu.ppu b/lib/cpu.ppu index 2563c35d..44bd6d1e 100644 Binary files a/lib/cpu.ppu and b/lib/cpu.ppu differ diff --git a/lib/drivermanagement.ppu b/lib/drivermanagement.ppu index ad0efc65..7ee21909 100644 Binary files a/lib/drivermanagement.ppu and b/lib/drivermanagement.ppu differ diff --git a/lib/eth2.ppu b/lib/eth2.ppu index 492467c2..34217a63 100644 Binary files a/lib/eth2.ppu and b/lib/eth2.ppu differ diff --git a/lib/fat32.ppu b/lib/fat32.ppu index 00230429..c2aff9ba 100644 Binary files a/lib/fat32.ppu and b/lib/fat32.ppu differ diff --git a/lib/ipv4.ppu b/lib/ipv4.ppu index d3fc6c8b..a4f8fde5 100644 Binary files a/lib/ipv4.ppu and b/lib/ipv4.ppu differ diff --git a/lib/kernel.ppu b/lib/kernel.ppu index 01693a70..fce0c051 100644 Binary files a/lib/kernel.ppu and b/lib/kernel.ppu differ diff --git a/lib/libpconsole.a b/lib/libpconsole.a index b4146a37..da21b6ff 100644 Binary files a/lib/libpconsole.a and b/lib/libpconsole.a differ diff --git a/lib/libpmultiboot.a b/lib/libpmultiboot.a index 9b609e8d..ff5b7de4 100644 Binary files a/lib/libpmultiboot.a and b/lib/libpmultiboot.a differ diff --git a/lib/libpsystem.a b/lib/libpsystem.a index 76a5c551..b71acb26 100644 Binary files a/lib/libpsystem.a and b/lib/libpsystem.a differ diff --git a/lib/lists.ppu b/lib/lists.ppu index 26f83f09..baba431b 100644 Binary files a/lib/lists.ppu and b/lib/lists.ppu differ diff --git a/lib/memview.ppu b/lib/memview.ppu index efe8f4f9..1a3d3637 100644 Binary files a/lib/memview.ppu and b/lib/memview.ppu differ diff --git a/lib/net.ppu b/lib/net.ppu index 803972e6..34154309 100644 Binary files a/lib/net.ppu and b/lib/net.ppu differ diff --git a/lib/netlog.ppu b/lib/netlog.ppu index 396813ec..320ef9e6 100644 Binary files a/lib/netlog.ppu and b/lib/netlog.ppu differ diff --git a/lib/nettypes.ppu b/lib/nettypes.ppu index c5de39cc..2cd54d0d 100644 Binary files a/lib/nettypes.ppu and b/lib/nettypes.ppu differ diff --git a/lib/netutils.ppu b/lib/netutils.ppu index 27313892..4812d6ce 100644 Binary files a/lib/netutils.ppu and b/lib/netutils.ppu differ diff --git a/lib/scheduler.ppu b/lib/scheduler.ppu index c76d5557..dbd20aca 100644 Binary files a/lib/scheduler.ppu and b/lib/scheduler.ppu differ diff --git a/lib/shell.ppu b/lib/shell.ppu index 85945c86..60319a5e 100644 Binary files a/lib/shell.ppu and b/lib/shell.ppu differ diff --git a/lib/storagemanagement.ppu b/lib/storagemanagement.ppu index 50f2171d..01234a00 100644 Binary files a/lib/storagemanagement.ppu and b/lib/storagemanagement.ppu differ diff --git a/lib/terminal.ppu b/lib/terminal.ppu index e47dc42e..5bc99900 100644 Binary files a/lib/terminal.ppu and b/lib/terminal.ppu differ diff --git a/lib/themer.ppu b/lib/themer.ppu index 01e781d5..10654440 100644 Binary files a/lib/themer.ppu and b/lib/themer.ppu differ diff --git a/lib/tracer.ppu b/lib/tracer.ppu index de672450..5167e8c2 100644 Binary files a/lib/tracer.ppu and b/lib/tracer.ppu differ diff --git a/src/driver/net/include/nettypes.pas b/src/driver/net/include/nettypes.pas index 61f705ac..9c4a070f 100644 --- a/src/driver/net/include/nettypes.pas +++ b/src/driver/net/include/nettypes.pas @@ -46,6 +46,18 @@ type UP : Boolean; end; + { ICMP } + + PICMPHeader = ^TICMPHeader; + TICMPHeader = record + ICMP_Type : uint8; + ICMP_Code : uint8; + ICMP_CHK_Hi : uint8; + ICMP_CHK_Lo : uint8; + Identifier : uint16; + Sequence : uint16; + end; + { ARP } TARPAbstractHeader = record @@ -139,10 +151,17 @@ type { Constants } const + { MACs } BROADCAST_MAC : Array[0..5] of uint8 = ($FF, $FF, $FF, $FF, $FF, $FF); NULL_MAC : Array[0..5] of uint8 = ($00, $00, $00, $00, $00, $00); FORCE_MAC : Array[0..5] of uint8 = ($08, $00, $27, $E6, $3F, $81); + { ICMP Data } + ICMP_DATA_GENERIC : Array[0..31] of uint8 = ( $61, $62, $63, $64, $65, $66, $67, $68, + $69, $6a, $6b, $6c, $6d, $6e, $6f, $70, + $71, $72, $73, $74, $75, $76, $77, $61, + $62, $63, $64, $65, $66, $67, $68, $69 ); + implementation end. \ No newline at end of file diff --git a/src/driver/net/include/netutils.pas b/src/driver/net/include/netutils.pas index 966df264..c3f44a87 100644 --- a/src/driver/net/include/netutils.pas +++ b/src/driver/net/include/netutils.pas @@ -19,9 +19,46 @@ function newPacketContext : PPacketContext; procedure freePacketContext(p_context : PPacketContext); function calculateChecksum(p_data : puint16; p_len : uint16) : uint16; 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); implementation +function sameSubnetIPv4(ip1, ip2, netmask : puint8) : boolean; +var + _ip1, _ip2, _netmask : puint32; + c1, c2 : uint32; + +begin + _ip1:= puint32(ip1); + _ip2:= puint32(ip2); + _netmask:= puint32(netmask); + c1:= _ip1^ AND _netmask^; + c2:= _ip2^ AND _netmask^; + sameSubnetIPv4:= c1 = c2; +end; + +procedure contextMACSwitch(p_context : PPacketContext); +var + tmp : TMACAddress; + +begin + copyMAC(@p_context^.MAC.Source[0], @tmp[0]); + copyMAC(@p_context^.MAC.Destination[0], @p_context^.MAC.Source[0]); + copyMAC(@tmp[0], @p_context^.MAC.Destination[0]); +end; + +procedure contextIPv4Switch(p_context : PPacketContext); +var + tmp : TIPv4Address; + +begin + copyIPv4(@p_context^.IP.Source[0], @tmp[0]); + copyIPv4(@p_context^.IP.Destination[0], @p_context^.IP.Source[0]); + copyIPv4(@tmp[0], @p_context^.IP.Destination[0]); +end; + function calculateChecksum(p_data : puint16; p_len : uint16) : uint16; var sum : uint32; diff --git a/src/driver/net/l1/net.pas b/src/driver/net/l1/net.pas index b6282380..9ec69569 100644 --- a/src/driver/net/l1/net.pas +++ b/src/driver/net/l1/net.pas @@ -21,7 +21,7 @@ procedure writeToLogLn(str : pchar); implementation uses - ipv4, arp, eth2, e1000, terminal; + ipv4, arp, eth2, icmp, e1000, terminal; var CBSend : TNetSendCallback = nil; @@ -114,6 +114,7 @@ begin eth2.register; arp.register; ipv4.register; + icmp.register; pop_trace; end; diff --git a/src/driver/net/l3/ipv4.pas b/src/driver/net/l3/ipv4.pas index 7ea3a59b..16942e3b 100644 --- a/src/driver/net/l3/ipv4.pas +++ b/src/driver/net/l3/ipv4.pas @@ -10,6 +10,7 @@ uses lists, eth2; +procedure send(p_data : void; p_len : uint16; p_context : PPacketContext); procedure registerProtocol(Protocol_ID : uint8; recv_callback : TRecvCallback); function getIPv4Config : PIPv4Configuration; procedure register; diff --git a/src/driver/net/l4/icmp.pas b/src/driver/net/l4/icmp.pas index 3ea972b7..c1569863 100644 --- a/src/driver/net/l4/icmp.pas +++ b/src/driver/net/l4/icmp.pas @@ -3,9 +3,50 @@ unit icmp; interface uses - nettypes, netutils, - ipv4; + nettypes, netutils, ipv4; + +procedure register; implementation +procedure sendResponse(p_context : PPacketContext); +begin + +end; + +procedure sendRequest(ip : puint8); +begin + +end; + +procedure recv(p_data : void; p_len : uint16; p_context : PPacketContext); +var + Header : PICMPHeader; + CHK : uint16; + +begin + Header:= PICMPHeader(p_data); + case Header^.ICMP_Type of + $08:Begin //Request + contextMACSwitch(p_context); + contextIPv4Switch(p_context); + Header^.ICMP_Type:= 0; + Header^.ICMP_CHK_Hi:= 0; + Header^.ICMP_CHK_Lo:= 0; + CHK:= calculateChecksum(puint16(p_data), sizeof(TICMPHeader)); + Header^.ICMP_CHK_Hi:= CHK SHR 8; + Header^.ICMP_CHK_Lo:= CHK AND $FF; + ipv4.send(p_data, p_len, p_context); + end; + $00:begin //Reply + + end; + end; +end; + +procedure register; +begin + ipv4.registerProtocol($01, @recv); +end; + end. \ No newline at end of file diff --git a/src/include/asuro.pas b/src/include/asuro.pas index 51750856..27e8a430 100644 --- a/src/include/asuro.pas +++ b/src/include/asuro.pas @@ -9,14 +9,14 @@ const VERSION_SUB = '1'; REVISION = '728'; RELEASE = 'ia'; - LINE_COUNT = 28413; + LINE_COUNT = 28526; 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 = '18:38:28'; + COMPILE_DATE = '13/05/18'; + COMPILE_TIME = '11:34:48'; implementation diff --git a/src/prog/terminal.pas b/src/prog/terminal.pas index 6f3a194f..d0194151 100644 --- a/src/prog/terminal.pas +++ b/src/prog/terminal.pas @@ -20,7 +20,8 @@ uses strings, tracer, asuro, - serial; + serial, + netutils, nettypes; type THaltCallback = procedure(); @@ -507,7 +508,20 @@ begin end; procedure teapot(Params : PParamList); +var + ip1, ip2, ip3 : pchar; + begin + if paramCount(Params) > 2 then begin + ip1:= getParam(0, Params); + ip2:= getParam(1, Params); + ip3:= getParam(2, Params); + if sameSubnetIPv4(stringToIPv4(ip1), stringToIPv4(ip2), stringToIPv4(ip3)) then begin + console.writeStringlnWND('Same.', getTerminalHWND); + end else begin + console.writeStringlnWND('Different', getTerminalHWND); + end; + end; terminal.halt(555, @teapot_halt); end;