git-svn-id: https://spexeah.com:8443/svn/Asuro@731 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user