Difference between revisions of "Unit ICMP"
(14 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
---- | ---- | ||
− | '' | + | '''Ultibo ICMP (Internet Control Message Protocol) unit''' |
=== Constants === | === Constants === | ||
---- | ---- | ||
− | '' | + | |
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''ICMP protocol''' <code> ICMP_PROTOCOL_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Some ICMP definitions are in the Protocol or IP modules | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>ICMP_PROTOCOL_NAME = 'ICMP';</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''ICMP specific constants''' <code> ICMP_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>ICMP_TIMEOUT = 0;</code> | ||
+ | | Wait forever on a ICMP Read | ||
+ | |- | ||
+ | | <code>ICMP_BUFFER_SIZE = 65536;</code> | ||
+ | | ICMP Receive Buffer Size | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>ICMP_HEADER_SIZE = 8;</code> | ||
+ | | SizeOf(TICMPHeader); ICMP.Solicit | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>ICMP_PACKET_SIZE = 8;</code> | ||
+ | | SizeOf(TICMPPacket) | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>ICMP_ROUTER_TIMEOUT = 60000;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
=== Type definitions === | === Type definitions === | ||
---- | ---- | ||
− | |||
+ | '''ICMP unused header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPUnusedHeader = ^TICMPUnusedHeader;</code> | ||
+ | |||
+ | <code>TICMPUnusedHeader = packed record {Unreachable, TimeExceeded, SourceQuench etc}</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Some ICMP definitions are in the Protocol or IP modules | ||
+ | |- | ||
+ | | <code>ICMPType:Byte;</code> | ||
+ | | ICMP_UNREACH etc | ||
+ | |- | ||
+ | | <code>Code:Byte;</code> | ||
+ | | ICMP_UNREACH_NET,ICMP_UNREACH_PORT etc | ||
+ | |- | ||
+ | | <code>Checksum:Word;</code> | ||
+ | | 1s Compliment checksum of Structure | ||
+ | |- | ||
+ | | <code>Unused:LongWord;</code> | ||
+ | | 4 Bytes Unused Must be Zero | ||
+ | |- | ||
+ | | <code>IP:TIPHeader;</code> | ||
+ | | IP Header from Original IP Packet | ||
+ | |- | ||
+ | | <code>Data:array[0..7] of Byte;</code> | ||
+ | | 8 Bytes of Original IP Packet Data | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP unreach header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPUnreachHeader = ^TICMPUnreachHeader;</code> | ||
+ | |||
+ | <code>TICMPUnreachHeader = TICMPUnusedHeader; </code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: ICMP_UNREACH | ||
+ | |- | ||
+ | | | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP expire header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPExpireHeader = ^TICMPExpireHeader;</code> | ||
+ | |||
+ | <code>TICMPExpireHeader = TICMPUnusedHeader;</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: ICMP_TIMXCEED | ||
+ | |- | ||
+ | | | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP quench header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPQuenchHeader = ^TICMPQuenchHeader;</code> | ||
+ | |||
+ | <code>TICMPQuenchHeader = TICMPUnusedHeader;</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: ICMP_SOURCEQUENCH | ||
+ | |- | ||
+ | | | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP pointer header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPPointerHeader = ^TICMPPointerHeader;</code> | ||
+ | |||
+ | <code>TICMPPointerHeader = packed record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Param Problem | ||
+ | |- | ||
+ | | <code>ICMPType:Byte;</code> | ||
+ | | ICMP_PARAMPROB etc | ||
+ | |- | ||
+ | | <code>Code:Byte;</code> | ||
+ | | ICMP_PARAMPROB_OPTABSENT etc | ||
+ | |- | ||
+ | | <code>Checksum:Word;</code> | ||
+ | | 1s Compliment checksum of Structure | ||
+ | |- | ||
+ | | <code>Pointer:Byte;</code> | ||
+ | | If Code = 0 Pointer to Byte where Error Occured | ||
+ | |- | ||
+ | | <code>Unused:array[0..2] of Byte;</code> | ||
+ | | 3 Bytes Unused Must be Zero | ||
+ | |- | ||
+ | | <code>IP:TIPHeader;</code> | ||
+ | | IP Header from Original IP Packet | ||
+ | |- | ||
+ | | <code>Data:array[0..7] of Byte;</code> | ||
+ | | 8 Bytes of Original IP Packet Data | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP param header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPParamHeader = ^TICMPParamHeader;</code> | ||
+ | |||
+ | <code>TICMPParamHeader = TICMPPointerHeader;</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: ICMP_PARAMPROB | ||
+ | |- | ||
+ | | | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP IP header | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPIpHeader = ^TICMPIpHeader;</code> | ||
+ | |||
+ | <code>TICMPIpHeader = packed record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Redirect | ||
+ | |- | ||
+ | | <code>ICMPType:Byte;</code> | ||
+ | | ICMP_REDIRECT etc | ||
+ | |- | ||
+ | | <code>Code:Byte;</code> | ||
+ | | ICMP_REDIRECT_NET,ICMP_REDIRECT_HOST etc | ||
+ | |- | ||
+ | | <code>Checksum:Word;</code> | ||
+ | | 1s Compliment checksum of Structure | ||
+ | |- | ||
+ | | <code>Gateway:TInAddr;</code> | ||
+ | | Redirect Gateway Address | ||
+ | |- | ||
+ | | <code>IP:TIPHeader;</code> | ||
+ | | IP Header from Original IP Packet | ||
+ | |- | ||
+ | | <code>Data:array[0..7] of Byte;</code> | ||
+ | | 8 Bytes of Original IP Packet Data | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP redirect header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPRedirectHeader = ^TICMPRedirectHeader;</code> | ||
+ | |||
+ | <code>TICMPRedirectHeader = TICMPIpHeader</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: ICMP_REDIRECT | ||
+ | |- | ||
+ | | | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP echo header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPEchoHeader = ^TICMPEchoHeader;</code> | ||
+ | |||
+ | <code>TICMPEchoHeader = packed record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Echo Request/Reply | ||
+ | |- | ||
+ | | <code>ICMPType:Byte;</code> | ||
+ | | ICMP_ECHO,ICMP_ECHOREPLY | ||
+ | |- | ||
+ | | <code>Code:Byte;</code> | ||
+ | | Always 0 | ||
+ | |- | ||
+ | | <code>Checksum:Word;</code> | ||
+ | | 1s Compliment checksum of Structure | ||
+ | |- | ||
+ | | <code>Identifier:Word;</code> | ||
+ | | Increments with each ICMP_ECHO | ||
+ | |- | ||
+ | | <code>Sequence:Word;</code> | ||
+ | | Sequence within an ICMP_ECHO set | ||
+ | |- | ||
+ | | <code>Data:array[0..((MAX_IP_PACKET - 1) - SizeOf(TIPHeader)) - 8] of Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP time stamp header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPTimestampHeader = ^TICMPTimestampHeader;</code> | ||
+ | |||
+ | <code>TICMPTimestampHeader = packed record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Timestamp Request/Reply | ||
+ | |- | ||
+ | | <code>ICMPType:Byte;</code> | ||
+ | | ICMP_TSTAMP,ICMP_TSTAMPREPLY | ||
+ | |- | ||
+ | | <code>Code:Byte;</code> | ||
+ | | Always 0 | ||
+ | |- | ||
+ | | <code>Checksum:Word;</code> | ||
+ | | 1s Compliment checksum of Structure | ||
+ | |- | ||
+ | | <code>Identifier:Word;</code> | ||
+ | | Increments with each ICMP_TSTAMP | ||
+ | |- | ||
+ | | <code>Sequence:Word;</code> | ||
+ | | Sequence within an ICMP_TSTAMP set | ||
+ | |- | ||
+ | | <code>Original:LongWord;</code> | ||
+ | | Original Timestamp | ||
+ | |- | ||
+ | | <code>Receive:LongWord;</code> | ||
+ | | Receive Timestamp | ||
+ | |- | ||
+ | | <code>Transmit:LongWord;</code> | ||
+ | | Transmit Timestamp (A sort of Round Trip Time Echo) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP info header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPInfoHeader = ^TICMPInfoHeader;</code> | ||
+ | |||
+ | <code>TICMPInfoHeader = packed record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Info Request/Reply | ||
+ | |- | ||
+ | | <code>ICMPType:Byte;</code> | ||
+ | | ICMP_IREQ,ICMP_IREQREPLY | ||
+ | |- | ||
+ | | <code>Code:Byte;</code> | ||
+ | | Always 0 | ||
+ | |- | ||
+ | | <code>Checksum:Word;</code> | ||
+ | | 1s Compliment checksum of Structure | ||
+ | |- | ||
+ | | <code>Identifier:Word;</code> | ||
+ | | Increments with each ICMP_IREQ | ||
+ | |- | ||
+ | | <code>Sequence:Word;</code> | ||
+ | | Sequence within an ICMP_IREQ set (Used to determine Network Number of Local Subnet) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP mask header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPMaskHeader = ^TICMPMaskHeader;</code> | ||
+ | |||
+ | <code>TICMPMaskHeader = packed record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: Mask Request/Reply | ||
+ | |- | ||
+ | | <code>ICMPType:Byte;</code> | ||
+ | | ICMP_MASKREQ,ICMP_MASKREPLY | ||
+ | |- | ||
+ | | <code>Code:Byte;</code> | ||
+ | | Always 0 | ||
+ | |- | ||
+ | | <code>Checksum:Word;</code> | ||
+ | | 1s Compliment checksum of Structure | ||
+ | |- | ||
+ | | <code>Identifier:Word;</code> | ||
+ | | Increments with each ICMP_MASKREQ | ||
+ | |- | ||
+ | | <code>Sequence:Word;</code> | ||
+ | | Sequence within an ICMP_MASKREQ set | ||
+ | |- | ||
+ | | <code>Mask:TInAddr;</code> | ||
+ | | Subnet Mask of Local Subnet (Used to determine Subnet Mask of Local Subnet) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP router address''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPRouterAddress = ^TICMPRouterAddress;</code> | ||
+ | |||
+ | <code>TICMPRouterAddress = packed record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>Address:TInAddr;</code> | ||
+ | | The address of the Router on this subnet | ||
+ | |- | ||
+ | | <code>Level:LongInt;</code> | ||
+ | | The level of preference, higher is better | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP advert header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPAdvertHeader = ^TICMPAdvertHeader;</code> | ||
+ | |||
+ | <code>TICMPAdvertHeader = packed record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>ICMPType:Byte;</code> | ||
+ | | ICMP_ROUTERADVERT | ||
+ | |- | ||
+ | | <code>Code:Byte;</code> | ||
+ | | Always 0 | ||
+ | |- | ||
+ | | <code>Checksum:Word;</code> | ||
+ | | 1s Compliment checksum of Structure | ||
+ | |- | ||
+ | | <code>EntryCount:Byte;</code> | ||
+ | | Number of Router Address entries | ||
+ | |- | ||
+ | | <code>EntrySize:Byte;</code> | ||
+ | | Size of each Router Address entry | ||
+ | |- | ||
+ | | <code>Lifetime:Word;</code> | ||
+ | | Lifetime of entries in seconds | ||
+ | |- | ||
+ | | <code>Routers:array[1..EntryCount] of TICMPRouterAddress;</code> | ||
+ | | Used to advertise routers | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP solicit header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPSolicitHeader = ^TICMPSolicitHeader;</code> | ||
+ | |||
+ | <code>TICMPSolicitHeader = packed record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>ICMPType:Byte;</code> | ||
+ | | ICMP_ROUTERSOLICIT | ||
+ | |- | ||
+ | | <code>Code:Byte;</code> | ||
+ | | Always 0 | ||
+ | |- | ||
+ | | <code>Checksum:Word;</code> | ||
+ | | 1s Compliment checksum of Structure | ||
+ | |- | ||
+ | | <code>Reserved:LongWord;</code> | ||
+ | | Always 0 (Used to solicit routers) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP header''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPHeader = ^TICMPHeader;</code> | ||
+ | |||
+ | <code>TICMPHeader = packed record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>case Integer of</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>0:(Unused:TICMPUnusedHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>1:(Unreach:TICMPUnreachHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>2:(Expire:TICMPExpireHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>3:(Quench:TICMPQuenchHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>4:(Pointer:TICMPPointerHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>5:(Param:TICMPParamHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>6:(Ip:TICMPIpHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>7:(Redirect:TICMPRedirectHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>8:(Echo:TICMPEchoHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>9:(Timestamp:TICMPTimestampHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>10:(Info:TICMPInfoHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>11:(Mask:TICMPMaskHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>12:(Advert:TICMPAdvertHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>13:(Solicit:TICMPSolicitHeader);</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''ICMP packet''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PICMPPacket = ^TICMPPacket;</code> | ||
+ | |||
+ | <code>TICMPPacket = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: 8 Bytes (Used by ICMPBuffer) | ||
+ | |- | ||
+ | | <code>Size:LongWord;</code> | ||
+ | | LongWord to keep size even | ||
+ | |- | ||
+ | | <code>Next:PICMPPacket;</code> | ||
+ | | Followed by RemoteAddress (4 or 16 Bytes) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | === Class definitions === | ||
+ | ---- | ||
+ | |||
+ | |||
+ | '''ICMP specific classes''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | [[TICMPProtocolTransport|<code>TICMPProtocolTransport = class(TProtocolTransport)</code>]] | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | [[TICMPProtocol|<code>TICMPProtocol = class(TNetworkProtocol)</code>]] | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | [[TICMPSocket|<code>TICMPSocket = class(TProtocolSocket)</code>]] | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | [[TICMPBuffer|<code>TICMPBuffer = class(TSocketBuffer)</code>]] | ||
+ | |- | ||
+ | |} | ||
+ | <br /> | ||
=== Public variables === | === Public variables === | ||
---- | ---- | ||
− | '' | + | ''None defined'' |
=== Function declarations === | === Function declarations === | ||
Line 34: | Line 572: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 49: | Line 587: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| The complete packet including Transport header | | The complete packet including Transport header | ||
|- | |- | ||
Line 61: | Line 599: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| The complete packet including Transport header | | The complete packet including Transport header | ||
|- | |- | ||
Line 73: | Line 611: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| The complete packet including Transport header | | The complete packet including Transport header | ||
|- | |- | ||
Line 85: | Line 623: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| The complete packet including Transport header | | The complete packet including Transport header | ||
|- | |- | ||
Line 97: | Line 635: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| The complete packet including Transport header | | The complete packet including Transport header | ||
|- | |- | ||
Line 105: | Line 643: | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
<pre style="border: 0; padding-bottom:0px;">function ChecksumICMP(AFamily:Word; ABuffer:Pointer; AOffset,ALength:Word):Word;</pre> | <pre style="border: 0; padding-bottom:0px;">function ChecksumICMP(AFamily:Word; ABuffer:Pointer; AOffset,ALength:Word):Word;</pre> | ||
− | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Checksum the ICMP Header on Send / Validate the Checksum on Receive</div> | + | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Checksum the ICMP Header on Send/Validate the Checksum on Receive</div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- |
Latest revision as of 05:24, 31 August 2021
Return to Unit Reference
Contents
Description
Ultibo ICMP (Internet Control Message Protocol) unit
Constants
ICMP_PROTOCOL_*
Note: Some ICMP definitions are in the Protocol or IP modules | |
ICMP_PROTOCOL_NAME = 'ICMP';
|
ICMP_*
ICMP_TIMEOUT = 0;
|
Wait forever on a ICMP Read |
ICMP_BUFFER_SIZE = 65536;
|
ICMP Receive Buffer Size |
ICMP_HEADER_SIZE = 8;
|
SizeOf(TICMPHeader); ICMP.Solicit |
ICMP_PACKET_SIZE = 8;
|
SizeOf(TICMPPacket) |
ICMP_ROUTER_TIMEOUT = 60000;
|
Type definitions
ICMP unused header
PICMPUnusedHeader = ^TICMPUnusedHeader;
TICMPUnusedHeader = packed record {Unreachable, TimeExceeded, SourceQuench etc}
Note: Some ICMP definitions are in the Protocol or IP modules | |
ICMPType:Byte;
|
ICMP_UNREACH etc |
Code:Byte;
|
ICMP_UNREACH_NET,ICMP_UNREACH_PORT etc |
Checksum:Word;
|
1s Compliment checksum of Structure |
Unused:LongWord;
|
4 Bytes Unused Must be Zero |
IP:TIPHeader;
|
IP Header from Original IP Packet |
Data:array[0..7] of Byte;
|
8 Bytes of Original IP Packet Data |
ICMP unreach header
PICMPUnreachHeader = ^TICMPUnreachHeader;
TICMPUnreachHeader = TICMPUnusedHeader;
Note: ICMP_UNREACH | |
ICMP expire header
PICMPExpireHeader = ^TICMPExpireHeader;
TICMPExpireHeader = TICMPUnusedHeader;
Note: ICMP_TIMXCEED | |
ICMP quench header
PICMPQuenchHeader = ^TICMPQuenchHeader;
TICMPQuenchHeader = TICMPUnusedHeader;
Note: ICMP_SOURCEQUENCH | |
ICMP pointer header
PICMPPointerHeader = ^TICMPPointerHeader;
TICMPPointerHeader = packed record
Note: Param Problem | |
ICMPType:Byte;
|
ICMP_PARAMPROB etc |
Code:Byte;
|
ICMP_PARAMPROB_OPTABSENT etc |
Checksum:Word;
|
1s Compliment checksum of Structure |
Pointer:Byte;
|
If Code = 0 Pointer to Byte where Error Occured |
Unused:array[0..2] of Byte;
|
3 Bytes Unused Must be Zero |
IP:TIPHeader;
|
IP Header from Original IP Packet |
Data:array[0..7] of Byte;
|
8 Bytes of Original IP Packet Data |
ICMP param header
PICMPParamHeader = ^TICMPParamHeader;
TICMPParamHeader = TICMPPointerHeader;
Note: ICMP_PARAMPROB | |
ICMP IP header
PICMPIpHeader = ^TICMPIpHeader;
TICMPIpHeader = packed record
Note: Redirect | |
ICMPType:Byte;
|
ICMP_REDIRECT etc |
Code:Byte;
|
ICMP_REDIRECT_NET,ICMP_REDIRECT_HOST etc |
Checksum:Word;
|
1s Compliment checksum of Structure |
Gateway:TInAddr;
|
Redirect Gateway Address |
IP:TIPHeader;
|
IP Header from Original IP Packet |
Data:array[0..7] of Byte;
|
8 Bytes of Original IP Packet Data |
ICMP redirect header
PICMPRedirectHeader = ^TICMPRedirectHeader;
TICMPRedirectHeader = TICMPIpHeader
Note: ICMP_REDIRECT | |
ICMP echo header
PICMPEchoHeader = ^TICMPEchoHeader;
TICMPEchoHeader = packed record
Note: Echo Request/Reply | |
ICMPType:Byte;
|
ICMP_ECHO,ICMP_ECHOREPLY |
Code:Byte;
|
Always 0 |
Checksum:Word;
|
1s Compliment checksum of Structure |
Identifier:Word;
|
Increments with each ICMP_ECHO |
Sequence:Word;
|
Sequence within an ICMP_ECHO set |
Data:array[0..((MAX_IP_PACKET - 1) - SizeOf(TIPHeader)) - 8] of Byte;
|
ICMP time stamp header
PICMPTimestampHeader = ^TICMPTimestampHeader;
TICMPTimestampHeader = packed record
Note: Timestamp Request/Reply | |
ICMPType:Byte;
|
ICMP_TSTAMP,ICMP_TSTAMPREPLY |
Code:Byte;
|
Always 0 |
Checksum:Word;
|
1s Compliment checksum of Structure |
Identifier:Word;
|
Increments with each ICMP_TSTAMP |
Sequence:Word;
|
Sequence within an ICMP_TSTAMP set |
Original:LongWord;
|
Original Timestamp |
Receive:LongWord;
|
Receive Timestamp |
Transmit:LongWord;
|
Transmit Timestamp (A sort of Round Trip Time Echo) |
ICMP info header
PICMPInfoHeader = ^TICMPInfoHeader;
TICMPInfoHeader = packed record
Note: Info Request/Reply | |
ICMPType:Byte;
|
ICMP_IREQ,ICMP_IREQREPLY |
Code:Byte;
|
Always 0 |
Checksum:Word;
|
1s Compliment checksum of Structure |
Identifier:Word;
|
Increments with each ICMP_IREQ |
Sequence:Word;
|
Sequence within an ICMP_IREQ set (Used to determine Network Number of Local Subnet) |
ICMP mask header
PICMPMaskHeader = ^TICMPMaskHeader;
TICMPMaskHeader = packed record
Note: Mask Request/Reply | |
ICMPType:Byte;
|
ICMP_MASKREQ,ICMP_MASKREPLY |
Code:Byte;
|
Always 0 |
Checksum:Word;
|
1s Compliment checksum of Structure |
Identifier:Word;
|
Increments with each ICMP_MASKREQ |
Sequence:Word;
|
Sequence within an ICMP_MASKREQ set |
Mask:TInAddr;
|
Subnet Mask of Local Subnet (Used to determine Subnet Mask of Local Subnet) |
ICMP router address
PICMPRouterAddress = ^TICMPRouterAddress;
TICMPRouterAddress = packed record
Address:TInAddr;
|
The address of the Router on this subnet |
Level:LongInt;
|
The level of preference, higher is better |
ICMP advert header
PICMPAdvertHeader = ^TICMPAdvertHeader;
TICMPAdvertHeader = packed record
ICMPType:Byte;
|
ICMP_ROUTERADVERT |
Code:Byte;
|
Always 0 |
Checksum:Word;
|
1s Compliment checksum of Structure |
EntryCount:Byte;
|
Number of Router Address entries |
EntrySize:Byte;
|
Size of each Router Address entry |
Lifetime:Word;
|
Lifetime of entries in seconds |
Routers:array[1..EntryCount] of TICMPRouterAddress;
|
Used to advertise routers |
ICMP solicit header
PICMPSolicitHeader = ^TICMPSolicitHeader;
TICMPSolicitHeader = packed record
ICMPType:Byte;
|
ICMP_ROUTERSOLICIT |
Code:Byte;
|
Always 0 |
Checksum:Word;
|
1s Compliment checksum of Structure |
Reserved:LongWord;
|
Always 0 (Used to solicit routers) |
ICMP header
PICMPHeader = ^TICMPHeader;
TICMPHeader = packed record
case Integer of
|
|
0:(Unused:TICMPUnusedHeader);
|
|
1:(Unreach:TICMPUnreachHeader);
|
|
2:(Expire:TICMPExpireHeader);
|
|
3:(Quench:TICMPQuenchHeader);
|
|
4:(Pointer:TICMPPointerHeader);
|
|
5:(Param:TICMPParamHeader);
|
|
6:(Ip:TICMPIpHeader);
|
|
7:(Redirect:TICMPRedirectHeader);
|
|
8:(Echo:TICMPEchoHeader);
|
|
9:(Timestamp:TICMPTimestampHeader);
|
|
10:(Info:TICMPInfoHeader);
|
|
11:(Mask:TICMPMaskHeader);
|
|
12:(Advert:TICMPAdvertHeader);
|
|
13:(Solicit:TICMPSolicitHeader);
|
ICMP packet
PICMPPacket = ^TICMPPacket;
TICMPPacket = record
Note: 8 Bytes (Used by ICMPBuffer) | |
Size:LongWord;
|
LongWord to keep size even |
Next:PICMPPacket;
|
Followed by RemoteAddress (4 or 16 Bytes) |
Class definitions
ICMP specific classes
TICMPProtocolTransport = class(TProtocolTransport)
|
TICMPProtocol = class(TNetworkProtocol)
|
TICMPSocket = class(TProtocolSocket)
|
TICMPBuffer = class(TSocketBuffer)
|
Public variables
None defined
Function declarations
Initialization functions
procedure ICMPInit;
Note | None documented |
---|
ICMP functions
function CheckICMP(AFamily:Word; ABuffer:Pointer):Boolean;
Buffer | The complete packet including Transport header |
---|
function GetICMPHeaderOffset(AFamily:Word; ABuffer:Pointer):Word;
Buffer | The complete packet including Transport header |
---|
function GetICMPHeaderLength(AFamily:Word; ABuffer:Pointer):Word;
Buffer | The complete packet including Transport header |
---|
function GetICMPDataOffset(AFamily:Word; ABuffer:Pointer):Word;
Buffer | The complete packet including Transport header |
---|
function GetICMPDataLength(AFamily:Word; ABuffer:Pointer):Word;
Buffer | The complete packet including Transport header |
---|
function ChecksumICMP(AFamily:Word; ABuffer:Pointer; AOffset,ALength:Word):Word;
Note | None documented |
---|
Return to Unit Reference