diff --git a/Asuro.iso b/Asuro.iso index cbf8a30a..4de97c15 100644 Binary files a/Asuro.iso and b/Asuro.iso differ diff --git a/bin/kernel.bin b/bin/kernel.bin index d5eb8805..7742fc66 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 d5eb8805..7742fc66 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 daafdd7f..057d02a9 100644 Binary files a/lib/E1000.ppu and b/lib/E1000.ppu differ diff --git a/lib/arp.ppu b/lib/arp.ppu index d87b2690..1b4ccef5 100644 Binary files a/lib/arp.ppu and b/lib/arp.ppu differ diff --git a/lib/asuro.ppu b/lib/asuro.ppu index 3602fe09..73596195 100644 Binary files a/lib/asuro.ppu and b/lib/asuro.ppu differ diff --git a/lib/eth2.ppu b/lib/eth2.ppu index 3fef17dc..aa2bf86e 100644 Binary files a/lib/eth2.ppu and b/lib/eth2.ppu differ diff --git a/lib/ipv4.ppu b/lib/ipv4.ppu index c25761f7..4f681517 100644 Binary files a/lib/ipv4.ppu and b/lib/ipv4.ppu differ diff --git a/lib/libpconsole.a b/lib/libpconsole.a index f01c44e0..14a9ac86 100644 Binary files a/lib/libpconsole.a and b/lib/libpconsole.a differ diff --git a/lib/libpmultiboot.a b/lib/libpmultiboot.a index f51a880a..046f1ae5 100644 Binary files a/lib/libpmultiboot.a and b/lib/libpmultiboot.a differ diff --git a/lib/libpsystem.a b/lib/libpsystem.a index e6fee17c..2f298495 100644 Binary files a/lib/libpsystem.a and b/lib/libpsystem.a differ diff --git a/lib/net.ppu b/lib/net.ppu index d85036f6..773402f0 100644 Binary files a/lib/net.ppu and b/lib/net.ppu differ diff --git a/lib/nettypes.ppu b/lib/nettypes.ppu index 1877512e..54a50249 100644 Binary files a/lib/nettypes.ppu and b/lib/nettypes.ppu differ diff --git a/lib/netutils.ppu b/lib/netutils.ppu index 1d2cb851..e0fe8f1c 100644 Binary files a/lib/netutils.ppu and b/lib/netutils.ppu differ diff --git a/lib/shell.ppu b/lib/shell.ppu index c9449a7a..e2b23d83 100644 Binary files a/lib/shell.ppu and b/lib/shell.ppu differ diff --git a/lib/terminal.ppu b/lib/terminal.ppu index c64860e0..c92b9a35 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 f952f343..f836822a 100644 --- a/src/driver/net/include/nettypes.pas +++ b/src/driver/net/include/nettypes.pas @@ -116,6 +116,7 @@ type const 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); implementation diff --git a/src/driver/net/include/netutils.pas b/src/driver/net/include/netutils.pas index 77aded95..560fe4b9 100644 --- a/src/driver/net/include/netutils.pas +++ b/src/driver/net/include/netutils.pas @@ -3,10 +3,12 @@ unit netutils; interface uses - tracer, util, nettypes, console, lmemorymanager; + tracer, util, nettypes, console, lmemorymanager, lists, strings; procedure copyMAC(src : puint8; dst : puint8); procedure copyIPv4(src : puint8; dst : puint8); +function stringToMAC(str : pchar) : puint8; +function stringToIPv4(str : pchar) : puint8; procedure writeMACAddress(mac : puint8; WND : HWND); procedure writeIPv4Address(ip : puint8; WND : HWND); function MACEqual(mac1 : puint8; mac2 : puint8) : boolean; @@ -16,6 +18,36 @@ procedure freePacketContext(p_context : PPacketContext); implementation +function stringToMAC(str : pchar) : puint8; +var + Mac_Delim : PLinkedListBase; + i : uint32; + +begin + stringToMac:= puint8(kalloc(6)); + Mac_Delim:= STRLL_FromString(str, ':'); + if STRLL_Size(Mac_Delim) >= 6 then begin + for i:=0 to 5 do begin + stringToMAC[i]:= stringToInt(STRLL_Get(Mac_Delim, i)); + end; + end; +end; + +function stringToIPv4(str : pchar) : puint8; +var + IP_Delim : PLinkedListBase; + i : uint32; + +begin + stringToIPv4:= puint8(kalloc(6)); + IP_Delim:= STRLL_FromString(str, '.'); + if STRLL_Size(IP_Delim) >= 4 then begin + for i:=0 to 3 do begin + stringToIPv4[i]:= stringToInt(STRLL_Get(IP_Delim, i)); + end; + end; +end; + function IPEqual(ip1 : puint8; ip2 : puint8) : boolean; var i : uint8; diff --git a/src/driver/net/l2/eth2.pas b/src/driver/net/l2/eth2.pas index 2bf1bcb4..043c0322 100644 --- a/src/driver/net/l2/eth2.pas +++ b/src/driver/net/l2/eth2.pas @@ -16,6 +16,9 @@ procedure register; implementation +uses + arp; + var Registered : Boolean = false; EthTypes : Array[0..65535] of TRecvCallback; @@ -59,28 +62,17 @@ var begin push_trace('eth2.recv'); writeToLogLn(' L2: 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]); - proto_type:= Header^.EthTypeHi SHL 8; proto_type:= proto_type + Header^.EthTypeLo; - //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'); if EthTypes[proto_type] <> nil then begin EthTypes[proto_type](void(buf), p_len - 14, p_context); end; diff --git a/src/driver/net/l3/arp.pas b/src/driver/net/l3/arp.pas index 58e425dc..0a249c4a 100644 --- a/src/driver/net/l3/arp.pas +++ b/src/driver/net/l3/arp.pas @@ -17,8 +17,9 @@ type end; procedure register; -function IPv4ToMAC(ip : puint8) : puint8; -function MACToIIPv4(mac : puint8) : puint8; +function IPv4ToMAC(ip : puint8) : puint8; +function MACToIIPv4(mac : puint8) : puint8; +procedure send(hType : uint16; pType : uint16; op : uint16; p_context : PPacketContext); implementation @@ -97,6 +98,9 @@ begin copyIPv4(@p_context^.IP.Source[0], @hdr^.Source_Protocol[0]); copyMAC(@p_context^.MAC.Destination[0], @hdr^.Destination_Hardware[0]); copyIPv4(@p_context^.IP.Destination[0], @hdr^.Destination_Protocol[0]); + if MACEqual(@p_context^.MAC.Destination[0], @NULL_MAC[0]) then begin + CopyMAC(@BROADCAST_MAC[0], @p_context^.MAC.Destination[0]); + end; eth2.send(buf, sizeof(TARPHeader), p_context); end; kfree(buf); diff --git a/src/driver/net/l3/ipv4.pas b/src/driver/net/l3/ipv4.pas index 8f0059c6..81917602 100644 --- a/src/driver/net/l3/ipv4.pas +++ b/src/driver/net/l3/ipv4.pas @@ -3,10 +3,11 @@ unit ipv4; interface uses - tracer, - util, console, terminal, + tracer, lmemorymanager, + util, console, terminal, strings, net, nettypes, netutils, netlog, + lists, eth2; procedure registerProtocol(Protocol_ID : uint8; recv_callback : TRecvCallback); @@ -15,6 +16,9 @@ procedure register; implementation +uses + arp; + var Registered : Boolean = false; Protocols : Array[0..255] of TRecvCallback; @@ -74,9 +78,49 @@ begin end; procedure terminal_command_ifconfig(params : PParamList); +var + Command, Sub, Address, Gateway, Netmask : pchar; + _Address, _Gateway, _Netmask : puint8; + context : PPacketContext; + begin push_trace('ipv4.terminal_command_ifconfig'); - if paramCount(params) > 2 then begin + if paramCount(params) > 1 then begin + Command:= GetParam(0, Params); + if StringEquals(Command, 'set') then begin + if paramCount(params) > 3 then begin + Address:= GetParam(1, Params); + Gateway:= GetParam(2, Params); + Netmask:= GetParam(3, Params); + _Address:= stringToIPv4(Address); + _Gateway:= stringToIPv4(Gateway); + _Netmask:= stringToIPv4(Netmask); + copyIPv4(_Address, @Config.Address[0]); + copyIPv4(_Gateway, @Config.Gateway[0]); + copyIPv4(_Netmask, @Config.Netmask[0]); + kfree(void(_Address)); + kfree(void(_Gateway)); + kfree(void(_Netmask)); + end else begin + writestringlnWND('Invalid number of params to call ''set''.', getTerminalHWND); + end; + end; + if StringEquals(Command, 'net') then begin + Sub:= GetParam(1, Params); + if StringEquals(Sub, 'up') then begin + Config.UP:= true; + end; + if StringEquals(Sub, 'down') then begin + Config.UP:= false; + end; + end; + context:= newPacketContext; + CopyIPv4(@Config.Gateway[0], @context^.IP.Destination[0]); + CopyIPv4(@Config.Address[0], @context^.IP.Source[0]); + CopyMAC(GetMAC, @context^.MAC.Source[0]); + CopyMAC(@NULL_MAC[0], @context^.MAC.Destination[0]); + arp.send($1, $8000, $1, context); + freePacketContext(context); end else begin writestringWND(' MAC: ', getTerminalHWND); writeMACAddress(net.GetMAC, getTerminalHWND); @@ -87,9 +131,9 @@ begin writestringWND(' Netmask: ', getTerminalHWND); writeIPv4Address(@Config.Netmask[0], getTerminalHWND); if Config.UP then - writestringlnWND(' NetUP: true', getTerminalHWND) + writestringlnWND(' NetUP: true', getTerminalHWND) else - writestringlnWND(' NetUP: false', getTerminalHWND); + writestringlnWND(' NetUP: false', getTerminalHWND); end; pop_trace; end; diff --git a/src/driver/netdev/E1000.pas b/src/driver/netdev/E1000.pas index 16cf065b..e4d2fe3b 100644 --- a/src/driver/netdev/E1000.pas +++ b/src/driver/netdev/E1000.pas @@ -605,6 +605,7 @@ end; function sendPacket(p_data : void; p_len : uint16) : sint32; var old_cur : uint8; + timeout : uint32; begin push_trace('E1000.sendPacket'); @@ -615,9 +616,12 @@ begin old_cur:= tx_curr; tx_curr:= (tx_curr + 1) MOD E1000_NUM_TX_DESC; writeCommand(REG_TXDESCTAIL, tx_curr); - while (tx_descs[old_cur]^.status AND $FF) = 0 do begin + timeout:= 10000; + while ((tx_descs[old_cur]^.status AND $FF) = 0) and (timeout > 0) do begin + dec(timeout); end; - sendPacket:= 0; + sendPacket:= 1; + if timeout > 0 then sendPacket:= 0; pop_trace; end; diff --git a/src/include/asuro.pas b/src/include/asuro.pas index 380dffc6..c824620d 100644 --- a/src/include/asuro.pas +++ b/src/include/asuro.pas @@ -9,14 +9,14 @@ const VERSION_SUB = '1'; REVISION = '677'; RELEASE = 'ia'; - LINE_COUNT = 27778; + LINE_COUNT = 27855; FILE_COUNT = 89; DRIVER_COUNT = 32; FPC_VERSION = '2.6.4'; NASM_VERSION = '2.10.09'; MAKE_VERSION = '3.81'; COMPILE_DATE = '10/05/18'; - COMPILE_TIME = '12:19:23'; + COMPILE_TIME = '13:17:01'; implementation