UDP Implemented.
git-svn-id: https://spexeah.com:8443/svn/Asuro@818 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
parent
23a0bc52e4
commit
0248ab2a90
@ -148,6 +148,32 @@ type
|
|||||||
Options : uint32;
|
Options : uint32;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ UDP }
|
||||||
|
TUDPError = (tueOK, tuePortInUse, tuePortRestricted, tuePortNotFound, tueInvalidUID, tueGenericError);
|
||||||
|
PUDPPacketContext = ^TUDPPacketContext;
|
||||||
|
TUDPRecieveCallback = procedure(p_data : void; p_len : uint16; context : PUDPPacketContext);
|
||||||
|
TUDPPacketContext = record
|
||||||
|
SrcPort : Word;
|
||||||
|
DstPort : Word;
|
||||||
|
ChecksumValid : Boolean;
|
||||||
|
Length : uint16;
|
||||||
|
PacketContext : PPacketContext;
|
||||||
|
end;
|
||||||
|
PUDPBindContext = ^TUDPBindContext;
|
||||||
|
TUDPBindContext = record
|
||||||
|
Port : uint16;
|
||||||
|
Callback : TUDPRecieveCallback;
|
||||||
|
UID : uint32;
|
||||||
|
end;
|
||||||
|
PUDPHeader = ^TUDPHeader;
|
||||||
|
TUDPHeader = bitpacked record
|
||||||
|
SrcPort : Word;
|
||||||
|
DstPort : Word;
|
||||||
|
Length : Word;
|
||||||
|
Checksum : Word;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{ Callback Types }
|
{ Callback Types }
|
||||||
|
|
||||||
TNetSendCallback = function(p_data : void; p_len : uint16) : sint32;
|
TNetSendCallback = function(p_data : void; p_len : uint16) : sint32;
|
||||||
|
@ -26,7 +26,7 @@ procedure writeToLogLn(str : pchar);
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
ipv4, arp, eth2, icmp, e1000, terminal;
|
ipv4, arp, eth2, icmp, e1000, terminal, udp;
|
||||||
|
|
||||||
var
|
var
|
||||||
CBSend : TNetSendCallback = nil;
|
CBSend : TNetSendCallback = nil;
|
||||||
@ -120,6 +120,7 @@ begin
|
|||||||
arp.register;
|
arp.register;
|
||||||
ipv4.register;
|
ipv4.register;
|
||||||
icmp.register;
|
icmp.register;
|
||||||
|
udp.register;
|
||||||
pop_trace;
|
pop_trace;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -8,9 +8,126 @@ unit udp;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
|
lmemorymanager,
|
||||||
nettypes, netutils,
|
nettypes, netutils,
|
||||||
ipv4;
|
ipv4, netlog, net,
|
||||||
|
util;
|
||||||
|
|
||||||
|
var
|
||||||
|
Ports : Array[0..65535] of PUDPBindContext;
|
||||||
|
|
||||||
|
procedure register();
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
console, terminal;
|
||||||
|
|
||||||
|
function bind(bindContext : PUDPBindContext) : TUDPError;
|
||||||
|
var
|
||||||
|
result : TUDPError;
|
||||||
|
context : PUDPBindContext;
|
||||||
|
|
||||||
|
begin
|
||||||
|
result:= tueGenericError;
|
||||||
|
if bindContext <> nil then begin
|
||||||
|
if Ports[bindContext^.port] = nil then begin
|
||||||
|
context:= PUDPBindContext(kalloc(sizeof(TUDPBindContext)));
|
||||||
|
context^.Port:= bindContext^.port;
|
||||||
|
context^.Callback:= bindContext^.Callback;
|
||||||
|
context^.UID:= bindContext^.UID;
|
||||||
|
Ports[context^.Port]:= context;
|
||||||
|
result:= tueOK;
|
||||||
|
end else begin
|
||||||
|
result:= tuePortInUse;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
bind:= result;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function unbind(bindContext : PUDPBindContext) : TUDPError;
|
||||||
|
var
|
||||||
|
result : TUDPError;
|
||||||
|
context : PUDPBindContext;
|
||||||
|
|
||||||
|
begin
|
||||||
|
result:= tueGenericError;
|
||||||
|
if bindContext <> nil then begin
|
||||||
|
context:= Ports[bindContext^.port];
|
||||||
|
if Ports[bindContext^.port] <> nil then begin
|
||||||
|
if context^.UID = bindContext^.UID then begin
|
||||||
|
kfree(void(context));
|
||||||
|
Ports[bindContext^.port]:= nil;
|
||||||
|
result:= tueOK;
|
||||||
|
end else begin
|
||||||
|
result:= tueInvalidUID;
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
result:= tuePortNotFound;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure UDPReceive(p_data : void; p_len : uint16; p_context : PPacketContext);
|
||||||
|
var
|
||||||
|
header : PUDPHeader;
|
||||||
|
context : PUDPPacketContext;
|
||||||
|
buf : puint8;
|
||||||
|
bind : PUDPBindContext;
|
||||||
|
|
||||||
|
begin
|
||||||
|
writeToLogLn(' L4: udp.recv');
|
||||||
|
header:= PUDPHeader(p_data);
|
||||||
|
if switchendian16(header^.SrcPort) = 22294 then WriteStringln('Src-E: 22294');
|
||||||
|
if header^.SrcPort = 22294 then WriteStringln('Src: 22294');
|
||||||
|
if switchendian16(header^.DstPort) = 22294 then WriteStringln('Dst-E: 22294');
|
||||||
|
if header^.DstPort = 22294 then WriteStringln('Dst: 22294');
|
||||||
|
if Ports[header^.DstPort] <> nil then begin
|
||||||
|
bind:= Ports[header^.DstPort];
|
||||||
|
context:= PUDPPacketContext(kalloc(sizeof(TUDPPacketContext)));
|
||||||
|
context^.PacketContext:= p_context;
|
||||||
|
context^.SrcPort:= header^.SrcPort;
|
||||||
|
context^.DstPort:= header^.DstPort;
|
||||||
|
context^.ChecksumValid:= false;
|
||||||
|
context^.Length:= header^.Length;
|
||||||
|
buf:= puint8(p_data);
|
||||||
|
buf:= buf + (sizeof(TUDPHeader));
|
||||||
|
bind^.Callback(void(buf), context^.Length, context);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TestRecv(p_data : void; p_len : uint16; context : PUDPPacketContext);
|
||||||
|
var
|
||||||
|
Output : PChar;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Output:= PChar(kalloc(p_len+1));
|
||||||
|
memcpy(uint32(p_data), uint32(Output), p_len);
|
||||||
|
Output[p_len+1]:= Char(0);
|
||||||
|
Writestringln(Output);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure register();
|
||||||
|
var
|
||||||
|
i : uint16;
|
||||||
|
context : TUDPBindContext;
|
||||||
|
r : TUDPError;
|
||||||
|
|
||||||
|
begin
|
||||||
|
for i:=0 to 65535 do begin
|
||||||
|
Ports[i]:= nil;
|
||||||
|
end;
|
||||||
|
context.Port:= 22294;
|
||||||
|
context.Callback:= @TestRecv;
|
||||||
|
context.UID:= 4398724;
|
||||||
|
r:= bind(@context);
|
||||||
|
case r of
|
||||||
|
tueOK:writestringln('22294 bind OK');
|
||||||
|
tuePortInUse:writestringln('22294 port in use');
|
||||||
|
tueGenericError:writestringln('22294 generic error');
|
||||||
|
tuePortRestricted:writestringln('22294 restricted');
|
||||||
|
end;
|
||||||
|
ipv4.registerProtocol($11, @UDPReceive);
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
@ -20,6 +20,7 @@ procedure GPF();
|
|||||||
function hi(b : uint8) : uint8;
|
function hi(b : uint8) : uint8;
|
||||||
function lo(b : uint8) : uint8;
|
function lo(b : uint8) : uint8;
|
||||||
function switchendian(b : uint8) : uint8;
|
function switchendian(b : uint8) : uint8;
|
||||||
|
function switchendian16(b : uint16) : uint16;
|
||||||
function switchendian32(b : uint32) : uint32;
|
function switchendian32(b : uint32) : uint32;
|
||||||
function getWord(i : uint32; hi : boolean) : uint16;
|
function getWord(i : uint32; hi : boolean) : uint16;
|
||||||
function getByte(i : uint32; index : uint8) : uint8;
|
function getByte(i : uint32; index : uint8) : uint8;
|
||||||
@ -97,6 +98,11 @@ begin
|
|||||||
div6432:= (r0 SHL 32) OR r4;
|
div6432:= (r0 SHL 32) OR r4;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function switchendian16(b : uint16) : uint16;
|
||||||
|
begin
|
||||||
|
switchendian16:= ((b AND $FF00) SHR 8) OR ((b AND $00FF) SHR 8);
|
||||||
|
end;
|
||||||
|
|
||||||
function switchendian32(b : uint32) : uint32;
|
function switchendian32(b : uint32) : uint32;
|
||||||
begin
|
begin
|
||||||
switchendian32:= ((b AND $FF000000) SHR 24) OR
|
switchendian32:= ((b AND $FF000000) SHR 24) OR
|
||||||
|
Loading…
x
Reference in New Issue
Block a user