113 lines
3.2 KiB
ObjectPascal
113 lines
3.2 KiB
ObjectPascal
unit ipv4;
|
|
|
|
interface
|
|
|
|
uses
|
|
util, console, terminal,
|
|
net, nettypes, netutils,
|
|
eth2;
|
|
|
|
procedure registerProtocol(Protocol_ID : uint8; recv_callback : TRecvCallback);
|
|
procedure register;
|
|
|
|
implementation
|
|
|
|
var
|
|
Registered : Boolean = false;
|
|
Protocols : Array[0..255] of TRecvCallback;
|
|
Config : TIPv4Configuration;
|
|
|
|
procedure recv(p_data : void; p_len : uint16; p_context : PPacketContext);
|
|
var
|
|
Header : PIPV4Header;
|
|
AHeader : TIPV4AbstractHeader;
|
|
i : Integer;
|
|
buf : puint8;
|
|
len : uint16;
|
|
|
|
begin
|
|
//console.outputln('net.ipv4', 'RECV.');
|
|
Header:= PIPV4Header(p_data);
|
|
AHeader.version:= Header^.version;
|
|
AHeader.header_len:= Header^.header_len;
|
|
AHeader.ToS:= Header^.ToS;
|
|
AHeader.total_len:= (Header^.total_len_Hi SHL 8) + Header^.total_len_Lo;
|
|
AHeader.identifier:= (Header^.identifier_Hi SHL 8) + Header^.identifier_Lo;
|
|
AHeader.Flags.RS:= false;
|
|
AHeader.Flags.DF:= (Header^.Flags AND $2) > 0;
|
|
AHeader.Flags.MF:= (Header^.Flags AND $1) > 0;
|
|
AHeader.Fragment_Off:= Header^.Fragment_Off;
|
|
AHeader.TTL:= Header^.TTL;
|
|
AHeader.Protocol:= Header^.Protocol;
|
|
AHeader.HDR_CHK:= (Header^.HDR_CHK_Hi SHL 8) + Header^.HDR_CHK_Lo;
|
|
for i:=0 to 3 do begin
|
|
AHeader.Src[i]:= Header^.Src[i];
|
|
AHeader.Dst[i]:= Header^.Dst[i];
|
|
end;
|
|
AHeader.Options:= Header^.Options;
|
|
|
|
//console.output('net.ipv4', 'Source: ');
|
|
//writeIPv4Address(puint8(@AHeader.Src[0]));
|
|
//console.output('net.ipv4', 'Dest: ');
|
|
//writeIPv4Address(puint8(@AHeader.Dst[0]));
|
|
|
|
buf:= puint8(p_data);
|
|
buf:= buf + AHeader.header_len;
|
|
len:= p_len - AHeader.header_len;
|
|
|
|
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);
|
|
end;
|
|
end;
|
|
|
|
procedure terminal_command_ifconfig(params : PParamList);
|
|
begin
|
|
if paramCount(params) > 2 then begin
|
|
|
|
end else begin
|
|
writestring(' MAC: ');
|
|
writeMACAddress(net.GetMAC);
|
|
writestring(' IPv4: ');
|
|
writeIPv4Address(@Config.Address[0]);
|
|
writestring(' Gateway: ');
|
|
writeIPv4Address(@Config.Gateway[0]);
|
|
writestring(' Netmask: ');
|
|
writeIPv4Address(@Config.Netmask[0]);
|
|
if Config.UP then
|
|
writestringln(' NetUP: true')
|
|
else
|
|
writestringln(' NetUP: false');
|
|
end;
|
|
end;
|
|
|
|
procedure register;
|
|
var
|
|
i : uint8;
|
|
|
|
begin
|
|
if not Registered then begin
|
|
for i:=0 to 255 do begin
|
|
Protocols[i]:= nil;
|
|
end;
|
|
for i:=0 to 3 do begin
|
|
Config.Address[i]:= 0;
|
|
Config.Gateway[i]:= 0;
|
|
Config.Netmask[i]:= 0;
|
|
end;
|
|
Config.UP:= false;
|
|
eth2.registerType($0800, @recv);
|
|
terminal.registerCommand('IFCONFIG', @terminal_command_ifconfig, 'Configure Network Settings.');
|
|
Registered:= true;
|
|
end;
|
|
end;
|
|
|
|
procedure registerProtocol(Protocol_ID : uint8; recv_callback : TRecvCallback);
|
|
begin
|
|
register;
|
|
if Protocols[Protocol_ID] = nil then Protocols[Protocol_ID]:= recv_callback;
|
|
end;
|
|
|
|
end. |