Created
November 2, 2022 23:48
-
-
Save JeremyGrosser/90e7df4cdd0eff4c3b62fdf61bdc65ef to your computer and use it in GitHub Desktop.
ARP Packet Parser
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
with HAL; use HAL; | |
package ARP is | |
type Packet | |
(HLEN, PLEN : Natural) | |
is record | |
HTYPE : UInt16; | |
PTYPE : UInt16; | |
OPER : UInt16; | |
SHA : UInt8_Array (1 .. HLEN); | |
SPA : UInt8_Array (1 .. PLEN); | |
THA : UInt8_Array (1 .. HLEN); | |
TPA : UInt8_Array (1 .. PLEN); | |
end record; | |
function Parse | |
(Data : UInt8_Array) | |
return Packet; | |
end ARP; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
with Ada.Unchecked_Conversion; | |
with System; | |
package body ARP is | |
function Parse | |
(Data : UInt8_Array) | |
return Packet | |
is | |
type Header is record | |
HTYPE : UInt16; -- Hardware type | |
PTYPE : UInt16; -- Protocol type | |
HLEN : UInt8; -- Hardware address length | |
PLEN : UInt8; -- Protocol address length | |
OPER : UInt16; -- Operation | |
end record | |
with Size => 64, | |
Bit_Order => System.High_Order_First, | |
Scalar_Storage_Order => System.High_Order_First; | |
for Header use record | |
HTYPE at 0 range 0 .. 15; | |
PTYPE at 2 range 0 .. 15; | |
HLEN at 4 range 0 .. 7; | |
PLEN at 5 range 0 .. 7; | |
OPER at 6 range 0 .. 15; | |
end record; | |
Header_Length : constant Natural := Header'Size / 8; | |
subtype Header_Bytes is UInt8_Array (1 .. Header_Length); | |
function To_Header is new Ada.Unchecked_Conversion (Header_Bytes, Header); | |
First : Natural := Data'First; | |
Last : Natural := First + Header_Length - 1; | |
H : constant Header := To_Header (Data (First .. Last)); | |
function Next | |
(Len : UInt8) | |
return UInt8_Array | |
is | |
begin | |
First := Last + 1; | |
Last := First + Natural (Len) - 1; | |
return Data (First .. Last); | |
end Next; | |
begin | |
return Packet' | |
(HLEN => Natural (H.HLEN), | |
PLEN => Natural (H.PLEN), | |
HTYPE => H.HTYPE, | |
PTYPE => H.PTYPE, | |
OPER => H.OPER, | |
SHA => Next (H.HLEN), | |
SPA => Next (H.PLEN), | |
THA => Next (H.HLEN), | |
TPA => Next (H.PLEN)); | |
end Parse; | |
end ARP; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment