diff --git a/Asuro.iso b/Asuro.iso index 4687354e..88e8629e 100644 Binary files a/Asuro.iso and b/Asuro.iso differ diff --git a/bin/kernel.bin b/bin/kernel.bin index 501f07c8..9d1e0638 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 501f07c8..9d1e0638 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 d60c0ede..74bc9ce4 100644 Binary files a/lib/E1000.ppu and b/lib/E1000.ppu differ diff --git a/lib/IDE.ppu b/lib/IDE.ppu index 4124aff3..cac4ccf8 100644 Binary files a/lib/IDE.ppu and b/lib/IDE.ppu differ diff --git a/lib/arp.ppu b/lib/arp.ppu index a9a12900..995f62c6 100644 Binary files a/lib/arp.ppu and b/lib/arp.ppu differ diff --git a/lib/asuro.ppu b/lib/asuro.ppu index 45674bcc..cae340c4 100644 Binary files a/lib/asuro.ppu and b/lib/asuro.ppu differ diff --git a/lib/console.ppu b/lib/console.ppu index 16a1cc3a..334b55d5 100644 Binary files a/lib/console.ppu and b/lib/console.ppu differ diff --git a/lib/cpu.ppu b/lib/cpu.ppu index b3dbfad5..2563c35d 100644 Binary files a/lib/cpu.ppu and b/lib/cpu.ppu differ diff --git a/lib/drivermanagement.ppu b/lib/drivermanagement.ppu index dc0e2257..ad0efc65 100644 Binary files a/lib/drivermanagement.ppu and b/lib/drivermanagement.ppu differ diff --git a/lib/eth2.ppu b/lib/eth2.ppu index 2b7feb2a..492467c2 100644 Binary files a/lib/eth2.ppu and b/lib/eth2.ppu differ diff --git a/lib/fat32.ppu b/lib/fat32.ppu index cbc548fb..00230429 100644 Binary files a/lib/fat32.ppu and b/lib/fat32.ppu differ diff --git a/lib/ipv4.ppu b/lib/ipv4.ppu index 9a33a33a..d3fc6c8b 100644 Binary files a/lib/ipv4.ppu and b/lib/ipv4.ppu differ diff --git a/lib/kernel.ppu b/lib/kernel.ppu index 900698dc..01693a70 100644 Binary files a/lib/kernel.ppu and b/lib/kernel.ppu differ diff --git a/lib/libpconsole.a b/lib/libpconsole.a index ab5be288..b4146a37 100644 Binary files a/lib/libpconsole.a and b/lib/libpconsole.a differ diff --git a/lib/libpmultiboot.a b/lib/libpmultiboot.a index 771b3337..9b609e8d 100644 Binary files a/lib/libpmultiboot.a and b/lib/libpmultiboot.a differ diff --git a/lib/libpsystem.a b/lib/libpsystem.a index a74d4154..76a5c551 100644 Binary files a/lib/libpsystem.a and b/lib/libpsystem.a differ diff --git a/lib/memview.ppu b/lib/memview.ppu index eac2397e..efe8f4f9 100644 Binary files a/lib/memview.ppu and b/lib/memview.ppu differ diff --git a/lib/net.ppu b/lib/net.ppu index 8bc527ae..803972e6 100644 Binary files a/lib/net.ppu and b/lib/net.ppu differ diff --git a/lib/netlog.ppu b/lib/netlog.ppu index ba2e55e8..396813ec 100644 Binary files a/lib/netlog.ppu and b/lib/netlog.ppu differ diff --git a/lib/nettypes.ppu b/lib/nettypes.ppu index 090f35bc..c5de39cc 100644 Binary files a/lib/nettypes.ppu and b/lib/nettypes.ppu differ diff --git a/lib/netutils.ppu b/lib/netutils.ppu index dc24bc0f..27313892 100644 Binary files a/lib/netutils.ppu and b/lib/netutils.ppu differ diff --git a/lib/scheduler.ppu b/lib/scheduler.ppu index 2fb7bf65..c76d5557 100644 Binary files a/lib/scheduler.ppu and b/lib/scheduler.ppu differ diff --git a/lib/shell.ppu b/lib/shell.ppu index 8f4ee314..85945c86 100644 Binary files a/lib/shell.ppu and b/lib/shell.ppu differ diff --git a/lib/storagemanagement.ppu b/lib/storagemanagement.ppu index effe5be1..50f2171d 100644 Binary files a/lib/storagemanagement.ppu and b/lib/storagemanagement.ppu differ diff --git a/lib/terminal.ppu b/lib/terminal.ppu index f4b4d5de..e47dc42e 100644 Binary files a/lib/terminal.ppu and b/lib/terminal.ppu differ diff --git a/lib/themer.ppu b/lib/themer.ppu index c00a6e76..01e781d5 100644 Binary files a/lib/themer.ppu and b/lib/themer.ppu differ diff --git a/lib/tracer.ppu b/lib/tracer.ppu index 4687d23c..de672450 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 d87bc52f..61f705ac 100644 --- a/src/driver/net/include/nettypes.pas +++ b/src/driver/net/include/nettypes.pas @@ -4,6 +4,7 @@ interface type + { Generic } TMACAddress = Array[0..5] of uint8; TIPv4Address = Array[0..3] of uint8; @@ -25,6 +26,8 @@ type L4 : uint16; end; + { Context } + PPacketContext = ^TPacketContext; TPacketContext = record MAC : TMACPair; @@ -33,6 +36,8 @@ type TTL : uint8; end; + { Config } + PIPv4Configuration = ^TIPv4Configuration; TIPv4Configuration = record Address : array[0..3] of uint8; @@ -41,6 +46,8 @@ type UP : Boolean; end; + { ARP } + TARPAbstractHeader = record Hardware_Type : uint16; Protocol_Type : uint16; @@ -69,6 +76,8 @@ type Destination_Protocol : TIPv4Address; end; + { ETH2 } + PEthernetHeader = ^TEthernetHeader; TEthernetHeader = bitpacked record dst : array[0..5] of uint8; @@ -77,6 +86,8 @@ type EthTypeLo : uint8; end; + { IPv4 } + PIPV4Header = ^TIPV4Header; TIPV4Header = bitpacked record version : ubit4; @@ -98,11 +109,6 @@ type Padding : uint8; end; - PIPv4AsWORDs = ^TIPv4AsWORDs; - TIPv4AsWORDs = bitpacked record - WORDS : Array[0..11] of uint16; - end; - TTCPFlags = record RS : Boolean; DF : Boolean; @@ -125,9 +131,13 @@ type Options : uint32; end; + { Callback Types } + TNetSendCallback = function(p_data : void; p_len : uint16) : sint32; TRecvCallback = procedure(p_data : void; p_len : uint16; p_context : PPacketContext); +{ Constants } + 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); diff --git a/src/driver/net/include/netutils.pas b/src/driver/net/include/netutils.pas index 48002a5b..966df264 100644 --- a/src/driver/net/include/netutils.pas +++ b/src/driver/net/include/netutils.pas @@ -17,9 +17,40 @@ function MACEqual(mac1 : puint8; mac2 : puint8) : boolean; function IPEqual(ip1 : puint8; ip2 : puint8) : boolean; 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; implementation +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 AND $FFFF); + sum:= sum + carry; + end; + calculateChecksum:= not (sum AND $FFFF); +end; + +function verifyChecksum(p_data : puint16; p_len : uint16) : boolean; +begin + verifyChecksum:= calculateChecksum(p_data, p_len) = $0000; +end; + function stringToMAC(str : pchar) : puint8; var Mac_Delim : PLinkedListBase; diff --git a/src/driver/net/l3/ipv4.pas b/src/driver/net/l3/ipv4.pas index 97b323bd..7ea3a59b 100644 --- a/src/driver/net/l3/ipv4.pas +++ b/src/driver/net/l3/ipv4.pas @@ -30,29 +30,6 @@ 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; @@ -133,8 +110,10 @@ begin 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); + if Config.UP then begin + 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; pop_trace; end; diff --git a/src/include/asuro.pas b/src/include/asuro.pas index 16b6e8f9..51750856 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 = 28339; + LINE_COUNT = 28413; 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 = '16:47:26'; + COMPILE_TIME = '18:38:28'; implementation diff --git a/src/prog/terminal.pas b/src/prog/terminal.pas index fdb8431a..6f3a194f 100644 --- a/src/prog/terminal.pas +++ b/src/prog/terminal.pas @@ -23,6 +23,7 @@ uses serial; type + THaltCallback = procedure(); PParamList = ^TParamList; TParamList = record Param : pchar; @@ -49,6 +50,9 @@ var bIndex : uint32 = 0; Commands : array[0..65534] of TCommand; Working_Directory : PChar = '/'; + Halted : Boolean = false; + HaltID : uint32 = 0; + HaltCB : THaltCallback = nil; procedure run; procedure init; @@ -60,6 +64,8 @@ function getParam(index : uint32; params : PParamList) : pchar; procedure setWorkingDirectory(str : pchar); function getWorkingDirectory : pchar; function getTerminalHWND : uint32; +function halt(id : uint32; cb : THaltCallback) : boolean; +function done(id : uint32) : boolean; implementation @@ -69,6 +75,42 @@ uses var TERMINAL_HWND : HWND = 0; +function halt(id : uint32; cb : THaltCallback) : boolean; +begin + halt:= false; + if not Halted then begin + Halted:= true; + halt:= true; + HaltID:= id; + HaltCB:= cb; + end; +end; + +function done(id : uint32) : boolean; +begin + done:= false; + if Halted then begin + if id = HaltID then begin + if HaltCB <> nil then HaltCB(); + HaltCB:= nil; + Halted:= false; + HaltID:= 0; + done:= true; + console.writestringWND('Asuro#', TERMINAL_HWND); + console.writestringWND(Working_Directory, TERMINAL_HWND); + console.writestringWND('> ', TERMINAL_HWND); + bIndex:= 0; + memset(uint32(@buffer[0]), 0, 1024); + end; + end; +end; + +procedure force_done; +begin + HaltID:= 0; + done(0); +end; + function getTerminalHWND : uint32; begin getTerminalHWND:= TERMINAL_HWND; @@ -381,13 +423,14 @@ begin console.writestringlnWND('Unknown Command.', TERMINAL_HWND); end; - { Reset the terminal ready for the next command } - console.writestringWND('Asuro#', TERMINAL_HWND); - console.writestringWND(Working_Directory, TERMINAL_HWND); - console.writestringWND('> ', TERMINAL_HWND); - bIndex:= 0; - memset(uint32(@buffer[0]), 0, 1024); - + if not Halted then begin + { Reset the terminal ready for the next command } + console.writestringWND('Asuro#', TERMINAL_HWND); + console.writestringWND(Working_Directory, TERMINAL_HWND); + console.writestringWND('> ', TERMINAL_HWND); + bIndex:= 0; + memset(uint32(@buffer[0]), 0, 1024); + end; pop_trace; end; @@ -395,22 +438,28 @@ procedure key_event(info : TKeyInfo); begin if TERMINAL_HWND <> 0 then begin //writeintlnWND(info.key_code, TERMINAL_HWND); - if (info.key_code >= 32) and (info.key_code <= 126) then begin - if bIndex < 1024 then begin - buffer[bIndex]:= info.key_code; - inc(bIndex); - console.writecharWND(char(info.key_code), TERMINAL_HWND); + if info.CTRL_DOWN then begin + if info.key_code = uint8('c') then force_done; + end else begin + if not halted then begin + if (info.key_code >= 32) and (info.key_code <= 126) then begin + if bIndex < 1024 then begin + buffer[bIndex]:= info.key_code; + inc(bIndex); + console.writecharWND(char(info.key_code), TERMINAL_HWND); + end; + end; + if info.key_code = 8 then begin //backspace + if bIndex > 0 then begin + console.backspaceWND(TERMINAL_HWND); + dec(bIndex); + buffer[bIndex]:= 0; + end; + end; + if info.key_code = 13 then begin //return + process_command; + end; end; - end; - if info.key_code = 8 then begin //backspace - if bIndex > 0 then begin - console.backspaceWND(TERMINAL_HWND); - dec(bIndex); - buffer[bIndex]:= 0; - end; - end; - if info.key_code = 13 then begin //return - process_command; end; end; end; @@ -452,9 +501,14 @@ begin resetSystem; end; +procedure teapot_halt; +begin + console.writeStringlnWND('Stopped. [CTRL+C]', getTerminalHWND); +end; + procedure teapot(Params : PParamList); begin - console.writestringlnWND('Teapot?', getTerminalHWND); + terminal.halt(555, @teapot_halt); end; procedure init;