diff options
Diffstat (limited to 'external/construct/protocols/layer2/arp.py')
-rw-r--r-- | external/construct/protocols/layer2/arp.py | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/external/construct/protocols/layer2/arp.py b/external/construct/protocols/layer2/arp.py new file mode 100644 index 0000000..3e86b53 --- /dev/null +++ b/external/construct/protocols/layer2/arp.py @@ -0,0 +1,94 @@ +""" +Ethernet (TCP/IP protocol stack) +""" +from construct import * +from ethernet import MacAddressAdapter +from construct.protocols.layer3.ipv4 import IpAddressAdapter +from binascii import unhexlify +import six + + + +def HwAddress(name): + return IfThenElse(name, lambda ctx: ctx.hardware_type == "ETHERNET", + MacAddressAdapter(Field("data", lambda ctx: ctx.hwaddr_length)), + Field("data", lambda ctx: ctx.hwaddr_length) + ) + +def ProtoAddress(name): + return IfThenElse(name, lambda ctx: ctx.protocol_type == "IP", + IpAddressAdapter(Field("data", lambda ctx: ctx.protoaddr_length)), + Field("data", lambda ctx: ctx.protoaddr_length) + ) + +arp_header = Struct("arp_header", + Enum(UBInt16("hardware_type"), + ETHERNET = 1, + EXPERIMENTAL_ETHERNET = 2, + ProNET_TOKEN_RING = 4, + CHAOS = 5, + IEEE802 = 6, + ARCNET = 7, + HYPERCHANNEL = 8, + ULTRALINK = 13, + FRAME_RELAY = 15, + FIBRE_CHANNEL = 18, + IEEE1394 = 24, + HIPARP = 28, + ISO7816_3 = 29, + ARPSEC = 30, + IPSEC_TUNNEL = 31, + INFINIBAND = 32, + ), + Enum(UBInt16("protocol_type"), + IP = 0x0800, + ), + UBInt8("hwaddr_length"), + UBInt8("protoaddr_length"), + Enum(UBInt16("opcode"), + REQUEST = 1, + REPLY = 2, + REQUEST_REVERSE = 3, + REPLY_REVERSE = 4, + DRARP_REQUEST = 5, + DRARP_REPLY = 6, + DRARP_ERROR = 7, + InARP_REQUEST = 8, + InARP_REPLY = 9, + ARP_NAK = 10 + + ), + HwAddress("source_hwaddr"), + ProtoAddress("source_protoaddr"), + HwAddress("dest_hwaddr"), + ProtoAddress("dest_protoaddr"), +) + +rarp_header = Rename("rarp_header", arp_header) + + +if __name__ == "__main__": + cap1 = unhexlify(six.b("00010800060400010002e3426009c0a80204000000000000c0a80201")) + obj = arp_header.parse(cap1) + print (obj) + print (repr(arp_header.build(obj))) + + print ("-" * 80) + + cap2 = unhexlify(six.b("00010800060400020011508c283cc0a802010002e3426009c0a80204")) + obj = arp_header.parse(cap2) + print (obj) + print (repr(arp_header.build(obj))) + + + + + + + + + + + + + |