Difference between revisions of "Unit ARP"
From Ultibo.org
Line 309: | Line 309: | ||
</div></div> | </div></div> | ||
+ | '''ARP address entry''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | |||
+ | <code>TARPAddressEntry = class(TAddressEntry)</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>constructor Create;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div> | ||
+ | |- | ||
+ | | <code>FAddress:TInAddr;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>FProtocolType:Word;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>FHardware:THardwareAddress;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>procedure SetAddress(const AAddress:TInAddr);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>procedure SetProtocolType(AProtocolType:Word);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>procedure SetHardware(const AHardware:THardwareAddress);</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div> | ||
+ | |- | ||
+ | | <code>property Address:TInAddr read FAddress write SetAddress;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>property ProtocolType:Word read FProtocolType write SetProtocolType;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>property Hardware:THardwareAddress read FHardware write SetHardware;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''RARP transport adapter''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | |||
+ | <code>TRARPTransportAdapter = class(TTransportAdapter)</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>constructor Create;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div> | ||
+ | |- | ||
+ | | <code>UseCount:Integer;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''RARP transport''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | |||
+ | <code>TRARPTransport = class(TNetworkTransport)</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>constructor Create(AManager:TTransportManager; const AName:String);</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>destructor Destroy; override;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div> | ||
+ | |- | ||
+ | | <code>FAddresses:TNetworkList;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>FAddressAdd:TEventHandle;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>FAddressRemove:TEventHandle;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>function PacketHandler(AHandle:THandle; ASource,ADest,APacket:Pointer; ASize:Integer; ABroadcast:Boolean):Boolean;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>function SendRARPRequest(AAdapter:TRARPTransportAdapter):Boolean;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>function SendRARPReply(AAdapter:TRARPTransportAdapter; ASource,ATarget:TRARPAddressEntry):Boolean;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|<div style="font-family: monospace,courier;">'''protected'''</div> | ||
+ | |- | ||
+ | | <code>function GetAddressByAddress(const AAddress:TInAddr; AAdapter:TNetworkAdapter; ALock:Boolean; AState:LongWord):TRARPAddressEntry; </code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>function GetAddressByHardware(const AHardware:THardwareAddress; AAdapter:TNetworkAdapter; ALock:Boolean; AState:LongWord):TRARPAddressEntry;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>function GetAddressByNext(APrevious:TRARPAddressEntry; ALock,AUnlock:Boolean; AState:LongWord):TRARPAddressEntry;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>function AddAddress(const AAddress:TInAddr; const AHardware:THardwareAddress; AAdapter:TNetworkAdapter; AType:Word; ALock:Boolean; AState:LongWord):TRARPAddressEntry;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>function RemoveAddress(const AAddress:TInAddr; AAdapter:TNetworkAdapter):Boolean;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>procedure FlushAddresses(All:Boolean);</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div> | ||
+ | |- | ||
+ | | <code>function AddAdapter(AAdapter:TNetworkAdapter; AConfigType:Word; AAddress,ANetmask,AGateway,AServer:Pointer):Boolean; override;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>function RemoveAdapter(AAdapter:TNetworkAdapter):Boolean; override;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>function StartTransport:Boolean; override;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>function StopTransport:Boolean; override;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>function ProcessTransport:Boolean; override;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>function BindTransport(AAdapter:TNetworkAdapter):Boolean; override;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>function UnbindTransport(AAdapter:TNetworkAdapter):Boolean; override;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>function LoadAddress(AAdapter:TNetworkAdapter; const AAddress:TInAddr; const AHardware:THardwareAddress; AType:Word):Boolean;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>function UnloadAddress(AAdapter:TNetworkAdapter; const AAddress:TInAddr):Boolean;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>function ResolveHardware(AAdapter:TNetworkAdapter; var AAddress:TInAddr):Boolean;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>function CompareDefault(const AAddress:TInAddr):Boolean;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>function CompareAddress(const AAddress1,AAddress2:TInAddr):Boolean;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''RARP address entry''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | |||
+ | <code>TRARPAddressEntry = class(TAddressEntry)</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>constructor Create;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div> | ||
+ | |- | ||
+ | | <code>FAddress:TInAddr;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>FProtocolType:Word;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>FHardware:THardwareAddress;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>procedure SetAddress(const AAddress:TInAddr);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>procedure SetProtocolType(AProtocolType:Word);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>procedure SetHardware(const AHardware:THardwareAddress);</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div> | ||
+ | |- | ||
+ | | <code>property Address:TInAddr read FAddress write SetAddress;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>property ProtocolType:Word read FProtocolType write SetProtocolType;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>property Hardware:THardwareAddress read FHardware write SetHardware;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
=== Public variables === | === Public variables === |
Revision as of 04:12, 8 March 2017
Return to Unit Reference
Contents
Description
Ultibo ARP (Address Resolution Protocol) unit
To be documented
Constants
ARP specific constants
ARP_TRANSPORT_*, RARP_TRANSPORT_*
ARP_TRANSPORT_NAME = 'ARP';
|
|
RARP_TRANSPORT_NAME = 'RARP';
|
ARP and RARP constants
MIN_*, MAX_*, ARP_*, RARP_*
MIN_ARP_PACKET = 46;
|
Not Counting Adapter Header |
MAX_ARP_PACKET = 46;
|
Not Counting Adapter Header |
ARP_TIMEOUT = 1000;
|
We wait for 1 second approx for reply |
ARP_RETRIES = 4;
|
We try the request 4 times |
RARP_TIMEOUT = 4000;
|
We wait for 4 seconds for a RARP reply |
RARP_RETRIES = 4;
|
We try the request 4 times |
ARP_HEADER_SIZE = 46;
|
SizeOf(TARPHeader); |
RARP_HEADER_SIZE = 46;
|
SizeOf(TRARPHeader); |
ARP and RARP messages
ARP_*, RARP_*, INARP_*
ARP_REQUEST = $0001;
|
ARP/RARP op codes, Request |
ARP_REPLY = $0002;
|
ARP/RARP op codes, Reply |
RARP_REQUEST = $0003;
|
|
RARP_REPLY = $0004;
|
|
INARP_REQUEST = $0008;
|
Inverse ARP see RFC 1293 |
INARP_REPLY = $0009;
|
Type definitions
ARP specific types
PARPHeader = ^TARPHeader;
TARPHeader = packed record
Note: 46 Bytes | |
HardwareType:Word;
|
Hardware address space (Network Order) |
ProtocolType:Word;
|
Protocol address space (Network Order) |
HardwareLength:Byte;
|
Byte length of hardware address |
ProtocolLength:Byte;
|
Byte length of each protocol address |
Opcode:Word;
|
Op code (eg ARP_REQUEST or ARP_REPLY) (Network Order) |
SourceHardware:THardwareAddress;
|
Source hardware address (of sender) |
SourceIP:TInAddr;
|
Source protocol address (of sender) (Network Order) |
TargetHardware:THardwareAddress;
|
Target hardware address (if known) |
TargetIP:TInAddr;
|
Target protocol address (Network Order) |
Reserved:array[0..17] of Word;
|
RARP specific types
PRARPHeader = ^TRARPHeader;
TRARPHeader = TARPHeader;
Note: 46 Bytes | |
Class definitions
ARP transport adapter
TARPTransportAdapter = class(TTransportAdapter)
constructor Create;
|
|
private
| |
UseCount:Integer;
|
ARP transport
TARPTransport = class(TNetworkTransport)
constructor Create(AManager:TTransportManager; const AName:String);
|
|
destructor Destroy; override;
|
|
private
| |
FAddresses:TNetworkList;
|
|
FAddressAdd:TEventHandle;
|
|
FAddressRemove:TEventHandle;
|
|
function PacketHandler(AHandle:THandle; ASource,ADest,APacket:Pointer; ASize:Integer; ABroadcast:Boolean):Boolean;
|
|
function SendARPRequest(AAdapter:TARPTransportAdapter; ASource:TARPAddressEntry; const ATarget:TInAddr):Boolean;
|
|
function SendARPReply(AAdapter:TARPTransportAdapter; ASource,ATarget:TARPAddressEntry):Boolean;
|
|
function SendINARPRequest(AAdapter:TARPTransportAdapter; ASource:TARPAddressEntry; const ATarget:THardwareAddress):Boolean;
|
|
function SendINARPReply(AAdapter:TARPTransportAdapter; ASource,ATarget:TARPAddressEntry):Boolean;
|
|
protected
| |
function GetAddressByAddress(const AAddress:TInAddr; AAdapter:TNetworkAdapter; ALock:Boolean; AState:LongWord):TARPAddressEntry;
|
|
function GetAddressByHardware(const AHardware:THardwareAddress; AAdapter:TNetworkAdapter; ALock:Boolean; AState:LongWord):TARPAddressEntry;
|
|
function GetAddressByNext(APrevious:TARPAddressEntry; ALock,AUnlock:Boolean; AState:LongWord):TARPAddressEntry;
|
|
function AddAddress(const AAddress:TInAddr; const AHardware:THardwareAddress; AAdapter:TNetworkAdapter; AType:Word; ALock:Boolean; AState:LongWord):TARPAddressEntry;
|
|
function RemoveAddress(const AAddress:TInAddr; AAdapter:TNetworkAdapter):Boolean;
|
|
procedure FlushAddresses(All:Boolean);
|
|
public
| |
function AddAdapter(AAdapter:TNetworkAdapter; AConfigType:Word; AAddress,ANetmask,AGateway,AServer:Pointer):Boolean; override;
|
|
function RemoveAdapter(AAdapter:TNetworkAdapter):Boolean; override;
|
|
function StartTransport:Boolean; override;
|
|
function StopTransport:Boolean; override;
|
|
function ProcessTransport:Boolean; override;
|
|
function BindTransport(AAdapter:TNetworkAdapter):Boolean; override;
|
|
function UnbindTransport(AAdapter:TNetworkAdapter):Boolean; override;
|
|
function LoadAddress(AAdapter:TNetworkAdapter; const AAddress:TInAddr; const AHardware:THardwareAddress; AType:Word):Boolean;
|
|
function UnloadAddress(AAdapter:TNetworkAdapter; const AAddress:TInAddr):Boolean;
|
|
function ResolveAddress(AAdapter:TNetworkAdapter; const ASource,AAddress:TInAddr; var AHardware:THardwareAddress):Boolean;
|
|
function ResolveHardware(AAdapter:TNetworkAdapter; const ASource:TInAddr; const AHardware:THardwareAddress; var AAddress:TInAddr):Boolean;
|
|
function ConfirmAddress(AAdapter:TNetworkAdapter; const ASource,AAddress:TInAddr):Boolean;
|
|
function AdvertiseAddress(AAdapter:TNetworkAdapter; const ASource:TInAddr):Boolean;
|
|
function CompareDefault(const AAddress:TInAddr):Boolean;
|
|
function CompareAddress(const AAddress1,AAddress2:TInAddr):Boolean;
|
ARP address entry
TARPAddressEntry = class(TAddressEntry)
constructor Create;
|
|
private
| |
FAddress:TInAddr;
|
|
FProtocolType:Word;
|
|
FHardware:THardwareAddress;
|
|
procedure SetAddress(const AAddress:TInAddr);
|
|
procedure SetProtocolType(AProtocolType:Word);
|
|
procedure SetHardware(const AHardware:THardwareAddress);
|
|
public
| |
property Address:TInAddr read FAddress write SetAddress;
|
|
property ProtocolType:Word read FProtocolType write SetProtocolType;
|
|
property Hardware:THardwareAddress read FHardware write SetHardware;
|
RARP transport adapter
TRARPTransportAdapter = class(TTransportAdapter)
constructor Create;
|
|
private
| |
UseCount:Integer;
|
RARP transport
TRARPTransport = class(TNetworkTransport)
constructor Create(AManager:TTransportManager; const AName:String);
|
|
destructor Destroy; override;
|
|
private
| |
FAddresses:TNetworkList;
|
|
FAddressAdd:TEventHandle;
|
|
FAddressRemove:TEventHandle;
|
|
function PacketHandler(AHandle:THandle; ASource,ADest,APacket:Pointer; ASize:Integer; ABroadcast:Boolean):Boolean;
|
|
function SendRARPRequest(AAdapter:TRARPTransportAdapter):Boolean;
|
|
function SendRARPReply(AAdapter:TRARPTransportAdapter; ASource,ATarget:TRARPAddressEntry):Boolean;
|
|
protected
| |
function GetAddressByAddress(const AAddress:TInAddr; AAdapter:TNetworkAdapter; ALock:Boolean; AState:LongWord):TRARPAddressEntry;
|
|
function GetAddressByHardware(const AHardware:THardwareAddress; AAdapter:TNetworkAdapter; ALock:Boolean; AState:LongWord):TRARPAddressEntry;
|
|
function GetAddressByNext(APrevious:TRARPAddressEntry; ALock,AUnlock:Boolean; AState:LongWord):TRARPAddressEntry;
|
|
function AddAddress(const AAddress:TInAddr; const AHardware:THardwareAddress; AAdapter:TNetworkAdapter; AType:Word; ALock:Boolean; AState:LongWord):TRARPAddressEntry;
|
|
function RemoveAddress(const AAddress:TInAddr; AAdapter:TNetworkAdapter):Boolean;
|
|
procedure FlushAddresses(All:Boolean);
|
|
public
| |
function AddAdapter(AAdapter:TNetworkAdapter; AConfigType:Word; AAddress,ANetmask,AGateway,AServer:Pointer):Boolean; override;
|
|
function RemoveAdapter(AAdapter:TNetworkAdapter):Boolean; override;
|
|
function StartTransport:Boolean; override;
|
|
function StopTransport:Boolean; override;
|
|
function ProcessTransport:Boolean; override;
|
|
function BindTransport(AAdapter:TNetworkAdapter):Boolean; override;
|
|
function UnbindTransport(AAdapter:TNetworkAdapter):Boolean; override;
|
|
function LoadAddress(AAdapter:TNetworkAdapter; const AAddress:TInAddr; const AHardware:THardwareAddress; AType:Word):Boolean;
|
|
function UnloadAddress(AAdapter:TNetworkAdapter; const AAddress:TInAddr):Boolean;
|
|
function ResolveHardware(AAdapter:TNetworkAdapter; var AAddress:TInAddr):Boolean;
|
|
function CompareDefault(const AAddress:TInAddr):Boolean;
|
|
function CompareAddress(const AAddress1,AAddress2:TInAddr):Boolean;
|
RARP address entry
TRARPAddressEntry = class(TAddressEntry)
constructor Create;
|
|
private
| |
FAddress:TInAddr;
|
|
FProtocolType:Word;
|
|
FHardware:THardwareAddress;
|
|
procedure SetAddress(const AAddress:TInAddr);
|
|
procedure SetProtocolType(AProtocolType:Word);
|
|
procedure SetHardware(const AHardware:THardwareAddress);
|
|
public
| |
property Address:TInAddr read FAddress write SetAddress;
|
|
property ProtocolType:Word read FProtocolType write SetProtocolType;
|
|
property Hardware:THardwareAddress read FHardware write SetHardware;
|
Public variables
None defined
Function declarations
Initialization functions
procedure ARPInit;
Description: To be documented
Note | None documented |
---|
ARP functions
function CheckARP(ABuffer:Pointer):Boolean;
Description: Verify that the packet is a valid ARP packet
Buffer | Buffer points to the complete packet without Adapter header |
---|
function CheckRARP(ABuffer:Pointer):Boolean;
Description: Verify that the packet is a valid RARP packet
Buffer | Buffer points to the complete packet without Adapter header |
---|
Return to Unit Reference