TTCPProtocol

From Ultibo.org
Revision as of 01:39, 30 May 2018 by Ultibo (Talk | contribs) (Created page with "Return to Unit TCP __TOC__ === Description === ---- ''To be documented'' === Class definitions === ---- <div class="toccolours mw-collapsible mw-collapsed"...")

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Return to Unit TCP


Description


To be documented

Class definitions



TTCPProtocol = class(TNetworkProtocol)

constructor Create(AManager:TProtocolManager; const AName:String);  
destructor Destroy; override;  
private
FNextPort:Word;  
FMinBacklog:Integer;  
FMaxBacklog:Integer;  
FReceiveBacklog:Integer;  
 
function PacketHandler(AHandle:THandle; ASource,ADest,APacket:Pointer; ASize:Integer; ABroadcast:Boolean):Boolean;  
function SegmentHandler(ASocket:TTCPSocket; ASource,ADest,APacket:Pointer; ASize:Integer):Boolean;  
function ResetHandler(ASocket:TTCPSocket; ASource,ADest,APacket:Pointer; ASize:Integer):Boolean;  
 
function CloneSocket(ASocket:TTCPSocket; ALocalAddress,ARemoteAddress:Pointer; ALocalPort,ARemotePort:Word; ALock:Boolean; AState:LongWord):TTCPSocket;  
 
function GetTCPOptionsSize(ASocket:TTCPSocket; AOptions:Pointer):Word;  
 
function CreateTCPOptions(ASocket:TTCPSocket; AOptions:Pointer; AFlags:Byte):Boolean;  
function HandleTCPOptions(ASocket:TTCPSocket; AOptions:Pointer; AFlags:Byte):Boolean;  
 
function InsertTCPOption(ASocket:TTCPSocket; AOptions:Pointer; AOption:Byte):Boolean;  
function ExtractTCPOption(ASocket:TTCPSocket; AOptions:Pointer; AOption:Byte):Boolean;  
 
function SendReset(ASocket:TTCPSocket):Boolean;  
function SendAcknowledge(ASocket:TTCPSocket):Boolean;  
 
function SendSegment(ASocket:TTCPSocket; ASource,ADest:Pointer; ASourcePort,ADestPort:Word; ASequence,AAcknowledge:LongWord; AWindow,AUrgent:Word; AFlags:Byte; AOptions,AData:Pointer; ASize:Integer):Integer;  
protected
function OpenPort(ASocket:TProtocolSocket; APort:Word):Boolean; override;  
function ClosePort(ASocket:TProtocolSocket):Boolean; override;  
function FindPort(APort:Word; AWrite,ALock:Boolean):TProtocolPort; override;  
 
function SelectCheck(ASource,ADest:PFDSet; ACode:Integer):Integer; override;  
function SelectWait(ASocket:TProtocolSocket; ACode:Integer; ATimeout:LongWord):Integer; override;  
public
function Accept(ASocket:TProtocolSocket; ASockAddr:PSockAddr; AAddrLength:PInteger):TProtocolSocket; override;  
function Bind(ASocket:TProtocolSocket; var ASockAddr:TSockAddr; AAddrLength:Integer):Integer; override;  
function CloseSocket(ASocket:TProtocolSocket):Integer; override;  
function Connect(ASocket:TProtocolSocket; var ASockAddr:TSockAddr; AAddrLength:Integer):Integer; override;  
function IoctlSocket(ASocket:TProtocolSocket; ACmd:DWORD; var AArg:u_long):Integer; override;  
function GetPeerName(ASocket:TProtocolSocket; var ASockAddr:TSockAddr; var AAddrLength:Integer):Integer; override;  
function GetSockName(ASocket:TProtocolSocket; var ASockAddr:TSockAddr; var AAddrLength:Integer):Integer; override;  
function GetSockOpt(ASocket:TProtocolSocket; ALevel,AOptName:Integer; AOptValue:PChar; var AOptLength:Integer):Integer; override;  
function Listen(ASocket:TProtocolSocket; ABacklog:Integer):Integer; override;  
function Recv(ASocket:TProtocolSocket; var ABuffer; ALength,AFlags:Integer):Integer; override;  
function RecvFrom(ASocket:TProtocolSocket; var ABuffer; ALength,AFlags:Integer; var AFromAddr:TSockAddr; var AFromLength:Integer):Integer; override;  
function Select(ANfds:Integer; AReadfds,AWritefds,AExceptfds:PFDSet; ATimeout:PTimeVal):LongInt; override;  
function Send(ASocket:TProtocolSocket; var ABuffer; ALength,AFlags:Integer):Integer; override;  
function SendTo(ASocket:TProtocolSocket; var ABuffer; ALength,AFlags:Integer; var AToAddr:TSockAddr; AToLength:Integer):Integer; override;  
function SetSockOpt(ASocket:TProtocolSocket; ALevel,AOptName:Integer; AOptValue:PChar; AOptLength:Integer):Integer; override;  
function Shutdown(ASocket:TProtocolSocket; AHow:Integer):Integer; override;  
function Socket(AFamily,AStruct,AProtocol:Integer):TProtocolSocket; override;  
 
function AddTransport(ATransport:TNetworkTransport):Boolean; override;  
function RemoveTransport(ATransport:TNetworkTransport):Boolean; override;  
 
function FindSocket(AFamily,AStruct,AProtocol:Word; ALocalAddress,ARemoteAddress:Pointer; ALocalPort,ARemotePort:Word; ABroadcast,AListen,ALock:Boolean; AState:LongWord):TProtocolSocket; override;  
procedure FlushSockets(All:Boolean); override;  
 
function StartProtocol:Boolean; override;  
function StopProtocol:Boolean; override;  
function ProcessProtocol:Boolean; override;  
 
function ProcessSockets:Boolean; override;  
function ProcessSocket(ASocket:TProtocolSocket):Boolean; override;  


Function declarations



constructor TTCPProtocol.Create(AManager:TProtocolManager; const AName:String);
Description: To be documented
Note None documented


destructor TTCPProtocol.Destroy;
Description: To be documented
Note None documented


function TTCPProtocol.PacketHandler(AHandle:THandle; ASource,ADest,APacket:Pointer; ASize:Integer; ABroadcast:Boolean):Boolean;
Description: Process a packet received by a Transport
Handle The Handle of the Protocol Transport the packet was received from
Source The source address of the received packet (Set by Transport)
Dest The destination address of the received packet (Set by Transport)
Packet The received packet (The complete packet including Transport header)
Size The size of the received packet in bytes
Broadcast True if the destination address is a broadcast address


function TTCPProtocol.SegmentHandler(ASocket:TTCPSocket; ASource,ADest,APacket:Pointer; ASize:Integer):Boolean;
Description: Check Socket state and feed Segments to the Sockets, discarding or resetting invalid Segments
Packet The received packet (The complete packet including Transport header)
Note Initial validity check on SEQ/ACK and Flags is done here

Caller must hold the Socket lock


function TTCPProtocol.ResetHandler(ASocket:TTCPSocket; ASource,ADest,APacket:Pointer; ASize:Integer):Boolean;
Description: Send a Reset using the appropriate values from SEQ and ACK
Packet The received packet (The complete packet including Transport header)
Note Must never send a Reset if RST bit is set in Packet

Caller must hold the Socket lock


function TTCPProtocol.CloneSocket(ASocket:TTCPSocket; ALocalAddress,ARemoteAddress:Pointer; ALocalPort,ARemotePort:Word; ALock:Boolean; AState:LongWord):TTCPSocket;
Description: Creates a cloned Socket based on the supplied socket with Options etc copied from the original
Note New Socket will be SS_UNCONNECTED and TCP_STATE_CLOSED but with the Local and Remote address and port bindings completed (different to a new Socket)

Addresses and Ports are passed in Host order
Caller must hold the Socket lock


function TTCPProtocol.GetTCPOptionsSize(ASocket:TTCPSocket; AOptions:Pointer):Word;
Description: Returns the Size of the Options currently in the buffer with padding to 32 bits
Note Caller must hold the Socket lock


function TTCPProtocol.CreateTCPOptions(ASocket:TTCPSocket; AOptions:Pointer; AFlags:Byte):Boolean;
Description: To be documented
Note Caller must hold the Socket lock


function TTCPProtocol.HandleTCPOptions(ASocket:TTCPSocket; AOptions:Pointer; AFlags:Byte):Boolean;
Description: To be documented
Note Caller must hold the Socket lock


function TTCPProtocol.InsertTCPOption(ASocket:TTCPSocket; AOptions:Pointer; AOption:Byte):Boolean;
Description: Inserts the Option into the buffer from the supplied Socket
Note Caller must hold the Socket lock


function TTCPProtocol.ExtractTCPOption(ASocket:TTCPSocket; AOptions:Pointer; AOption:Byte):Boolean;
Description: Extracts the Option from the buffer to the supplied Socket
Note Caller must hold the Socket lock


function TTCPProtocol.SendReset(ASocket:TTCPSocket):Boolean;
Description: Sends an RST in order to abort an existing connection
Note Not called in response to a bad segment (done by ResetHandler)

May be invoked by calling CloseSocket with a hard close etc
Caller must hold the Socket lock


function TTCPProtocol.SendAcknowledge(ASocket:TTCPSocket):Boolean;
Description: Sends an ACK possibly in response to a bad segment or due to a keep alive etc
Note Caller must hold the Socket lock


function TTCPProtocol.SendSegment(ASocket:TTCPSocket; ASource,ADest:Pointer; ASourcePort,ADestPort:Word; ASequence,AAcknowledge:LongWord; AWindow,AUrgent:Word; AFlags:Byte; AOptions,AData:Pointer; ASize:Integer):Integer;
Description: Send Segment adds the Protocol Header and other details to the Data
Note Both Options and Data can be nil, Size can be zero.

Used instead of SendPacket to allow for the extra parameters needed by TCP
Addresses and Ports are passed in Host order
Caller must hold the Socket lock


function TTCPProtocol.OpenPort(ASocket:TProtocolSocket; APort:Word):Boolean;
Description: To be documented
Note Caller must hold the Socket lock


function TTCPProtocol.ClosePort(ASocket:TProtocolSocket):Boolean;
Description: To be documented
Note Caller must hold the Socket lock


function TTCPProtocol.FindPort(APort:Word; AWrite,ALock:Boolean):TProtocolPort;
Description: Find a protocol port for the specified port number
Port The port number to find
Write If True then use the writer lock
Lock If True then lock the found entry before returning


function TTCPProtocol.SelectCheck(ASource,ADest:PFDSet; ACode:Integer):Integer;
Description: To be documented
Source Source is the working set to check
Dest Dest is the set passed to Select


function TTCPProtocol.SelectWait(ASocket:TProtocolSocket; ACode:Integer; ATimeout:LongWord):Integer;
Description: To be documented
Socket Socket is the single socket to check
Code Code is the type of check
Timeout Timeout is how long to wait


function TTCPProtocol.Accept(ASocket:TProtocolSocket; ASockAddr:PSockAddr; AAddrLength:PInteger):TProtocolSocket;
Description: BSD compatible Accept
Socket The socket to accept from
SockAddr The socket address (Network Order)
AddrLength The socket address length
Note SockAddr is returned in Network order

Caller must hold the Socket lock


function TTCPProtocol.Bind(ASocket:TProtocolSocket; var ASockAddr:TSockAddr; AAddrLength:Integer):Integer;
Description: BSD compatible Bind
Socket The socket to bind
SockAddr The socket address (Network Order)
AddrLength The socket address length
Note Sets the LocalAddress/Port for future Sends and Receives, Address can be specified as INADDR_ANY which allows Listening or auto assignment. If Port is IPPORT_ANY then a dynamic Port will be assigned.

SockAddr is passed in Network order
Caller must hold the Socket lock


function TTCPProtocol.CloseSocket(ASocket:TProtocolSocket):Integer;
Description: BSD compatible Close Socket
Socket The socket to close
Note Closes and removes the socket, does not perform Linger

Caller must hold the Socket lock


function TTCPProtocol.Connect(ASocket:TProtocolSocket; var ASockAddr:TSockAddr; AAddrLength:Integer):Integer;
Description: BSD compatible Connect
Socket The socket to connect
SockAddr The socket address (Network Order)
AddrLength The socket address length
Note Sets the RemoteAddress/Port of future Sends and Receives and begins the three way handshake, if Bind has not been called then the LocalAddress/Port will be set appropriately as well based on the route to the RemoteAddress.

SockAddr is passed in Network order
Caller must hold the Socket lock


function TTCPProtocol.IoctlSocket(ASocket:TProtocolSocket; ACmd:DWORD; var AArg:u_long):Integer;
Description: BSD compatible IO Control Socket
Socket The socket to control
Cmd The socket command
Arg The command argument
Note Caller must hold the Socket lock


function TTCPProtocol.GetPeerName(ASocket:TProtocolSocket; var ASockAddr:TSockAddr; var AAddrLength:Integer):Integer;
Description: BSD compatible Get Peer Name (Remote)
Socket The socket to get from
SockAddr The socket address (Network Order)
AddrLength The socket address length
Note SockAddr is returned in Network order

Caller must hold the Socket lock


function TTCPProtocol.GetSockName(ASocket:TProtocolSocket; var ASockAddr:TSockAddr; var AAddrLength:Integer):Integer;
Description: BSD compatible Get Sock Name (Local)
Socket The socket to get from
SockAddr The socket address (Network Order)
AddrLength The socket address length
Note SockAddr is returned in Network order

Caller must hold the Socket lock


function TTCPProtocol.GetSockOpt(ASocket:TProtocolSocket; ALevel,AOptName:Integer; AOptValue:PChar; var AOptLength:Integer):Integer;
Description: BSD compatible Get Socket Option
Socket The socket to get the option from
Level The protocol level for the option
OptName The name of the option to get
OptValue The value of the option
OptLength The length of the option
Note Caller must hold the Socket lock


function TTCPProtocol.Listen(ASocket:TProtocolSocket; ABacklog:Integer):Integer;
Description: BSD compatible Listen
Socket The socket to listen on
Backlog Queue depth for accepted connections
Note Caller must hold the Socket lock


function TTCPProtocol.Recv(ASocket:TProtocolSocket; var ABuffer; ALength,AFlags:Integer):Integer;
Description: BSD compatible Receive
Socket The socket to receive from
Buffer Buffer for received data
Length Length of buffer in bytes
Flags Protocol specific receive flags
Note Caller must hold the Socket lock


function TTCPProtocol.RecvFrom(ASocket:TProtocolSocket; var ABuffer; ALength,AFlags:Integer; var AFromAddr:TSockAddr; var AFromLength:Integer):Integer;
Description: BSD compatible Receive From
Socket The socket to receive from
Buffer Buffer for received data
Length Length of buffer in bytes
Flags Protocol specific receive flags
FromAddr The address the data was received from (Network Order)
FromLength The length of the address
Note TCP treats RecvFrom as Recv

Caller must hold the Socket lock


function TTCPProtocol.Send(ASocket:TProtocolSocket; var ABuffer; ALength,AFlags:Integer):Integer;
Description: BSD compatible Send
Socket The socket to send to
Buffer Buffer for data to send
Length Length of buffer in bytes
Flags Protocol specific send flags
Note Caller must hold the Socket lock


function TTCPProtocol.SendTo(ASocket:TProtocolSocket; var ABuffer; ALength,AFlags:Integer; var AToAddr:TSockAddr; AToLength:Integer):Integer;
Description: BSD compatible Send To
Socket The socket to send to
Buffer Buffer for data to send
Length Length of buffer in bytes
Flags Protocol specific send flags
ToAddr The socket address to send to (Network Order)
ToLength The length of the socket address
Note TCP treats SendTo as Send

Caller must hold the Socket lock


function TTCPProtocol.SetSockOpt(ASocket:TProtocolSocket; ALevel,AOptName:Integer; AOptValue:PChar; AOptLength:Integer):Integer;
Description: BSD compatible Set Socket Option
Socket The socket to set the option for
Level The protocol level for the option
OptName The name of the option to set
OptValue The value of the option
OptLength The length of the option
Note Caller must hold the Socket lock


function TTCPProtocol.Shutdown(ASocket:TProtocolSocket; AHow:Integer):Integer;
Description: BSD compatible Shutdown
Socket The socket to shutdown
How The direction to shutdown the socket
Note Shutdown does not result in CloseSocket so Closed must not get set

Caller must hold the Socket lock


function TTCPProtocol.Socket(AFamily,AStruct,AProtocol:Integer):TProtocolSocket;
Description: BSD compatible Socket (Create a new socket)
Family Socket address family (eg AF_INET)
Struct Socket type (eg SOCK_DGRAM)
Protocol Socket protocol (eg IPPROTO_UDP)
Note When a Socket is created it will be SS_UNCONNECTED and TCP_STATE_CLOSED


function TTCPProtocol.AddTransport(ATransport:TNetworkTransport):Boolean;
Description: Add a transport to this protocol
Transport The transport to add


function TTCPProtocol.RemoveTransport(ATransport:TNetworkTransport):Boolean;
Description: Remove a transport from this protocol
Transport The transport to remove


function TTCPProtocol.FindSocket(AFamily,AStruct,AProtocol:Word; ALocalAddress,ARemoteAddress:Pointer; ALocalPort,ARemotePort:Word; ABroadcast,AListen,ALock:Boolean; AState:LongWord):TProtocolSocket;
Description: Find a protocol socket based on all relevant parameters
Family Socket address family (eg AF_INET)
Struct Socket type (eg SOCK_DGRAM)
Protocol Socket protocol (eg IPPROTO_UDP)
LocalAddress Local transport address to match (Host Order)
RemoteAddress Remote transport address to match (Host Order)
LocalPort Local port to match (Host Order)
RemotePort Remote port to match (Host Order)
Broadcast If True then match broadcast addresses
Listen If True then match only listening sockets
Lock If True then lock the found entry before returning


procedure TTCPProtocol.FlushSockets(All:Boolean);
Description: Flush sockets from the socket cache
All If True flush all sockets, otherwise flush expired sockets.


function TTCPProtocol.StartProtocol:Boolean;
Description: Start this protocol ready for sending and receiving
Note None documented


function TTCPProtocol.StopProtocol:Boolean;
Description: Stop this protocol ready for removal
Note None documented


function TTCPProtocol.ProcessProtocol:Boolean;
Description: Process periodic tasks for this protocol
Note None documented


function TTCPProtocol.ProcessSockets:Boolean;
Description: Process periodic tasks for protocol sockets
Note None documented


function TTCPProtocol.ProcessSocket(ASocket:TProtocolSocket):Boolean;
Description: Process periodic tasks for a protocol socket
Note None documented


Return to Unit Reference