Source code for vstruct.defs.inet
'''
Datalink / Network / Transport layer headers
'''
import socket
import struct
import vstruct
from vstruct.primitives import *
ETH_P_IP = 0x0800
ETH_P_VLAN = 0x8100
IPPROTO_ICMP = 1
IPPROTO_TCP = 6
IPPROTO_UDP = 17
IPPROTO_IPV6 = 41
TCP_F_FIN = 0x01
TCP_F_SYN = 0x02
TCP_F_RST = 0x04
TCP_F_PUSH = 0x08
TCP_F_ACK = 0x10
TCP_F_URG = 0x20
TCP_F_ECE = 0x40
TCP_F_CWR = 0x80
# Useful combinations...
TCP_F_SYNACK = (TCP_F_SYN | TCP_F_ACK)
[docs]def reprIPv4Addr(addr):
bytes = struct.pack('>I', addr)
return socket.inet_ntoa(bytes)
[docs]def decIPv4Addr(addrstr):
bytes = socket.inet_aton(addrstr)
return struct.unpack('>I', bytes)[0]
[docs]class IPv4Address(v_uint32):
def __init__(self, value=0):
v_uint32.__init__(self, value=value, bigend=True)
def __repr__(self):
bytes = struct.pack('>I', self._vs_value)
return socket.inet_ntop(socket.AF_INET, bytes)
[docs]class ETHERII(vstruct.VStruct):
def __init__(self):
vstruct.VStruct.__init__(self)
self.destmac = v_bytes(size=6)
self.srcmac = v_bytes(size=6)
self.etype = v_uint16(bigend=True)
[docs] def vsParse(self, sbytes, offset=0):
# If we end up with a vlan tag, reparse
ret = vstruct.VStruct.vsParse(self, sbytes, offset=offset)
if self.etype == ETH_P_VLAN:
self.vsInsertField('vtag', v_uint16(bigend=True), 'etype')
self.vsInsertField('vlan', v_uint16(bigend=True), 'etype')
ret = vstruct.VStruct.vsParse(self, sbytes, offset=offset)
return ret
[docs]class IPv4(vstruct.VStruct):
def __init__(self):
vstruct.VStruct.__init__(self)
self.veriphl = v_uint8()
self.tos = v_uint8()
self.totlen = v_uint16(bigend=True)
self.ipid = v_uint16(bigend=True)
self.flagfrag = v_uint16(bigend=True)
self.ttl = v_uint8()
self.proto = v_uint8()
self.cksum = v_uint16(bigend=True)
self.srcaddr = IPv4Address()
self.dstaddr = IPv4Address()
# Make our len over-ride
def __len__(self):
return (self.veriphl & 0x0f) * 4
[docs]class TCP(vstruct.VStruct):
def __init__(self):
vstruct.VStruct.__init__(self)
self.srcport = v_uint16(bigend=True)
self.dstport = v_uint16(bigend=True)
self.sequence = v_uint32(bigend=True)
self.ackseq = v_uint32(bigend=True)
self.doff = v_uint8()
self.flags = v_uint8()
self.window = v_uint16(bigend=True)
self.checksum = v_uint16(bigend=True)
self.urgent = v_uint16(bigend=True)
def __len__(self):
return self.doff >> 2
[docs]class UDP(vstruct.VStruct):
def __init__(self):
vstruct.VStruct.__init__(self)
self.srcport = v_uint16(bigend=True)
self.dstport = v_uint16(bigend=True)
self.udplen = v_uint16(bigend=True)
self.checksum = v_uint16(bigend=True)
if __name__ == '__main__':
eII = ETHERII()
eII.vsParse('AAAAAABBBBBB\x08\x00')
print eII.tree()
eII = ETHERII()
eII.vsParse('AAAAAABBBBBB\x81\x00\x02\x02\x08\x00')
print eII.tree()