import struct
+import database
+
from constants import *
from errors import *
return ":".join(["%02x" % ord(i) for i in val])
def decode_packet(data):
- for func in (decode_arp_packet,):
- try:
- p = func(data)
- except PacketTypeError:
- continue
+ try:
+ protocol = val2int(struct.unpack("!2s", data[12:14])[0])
+ except:
+ raise DecodeError
- return p
+ try:
+ d = protocol2function[protocol](data)
+ except KeyErrror:
+ raise PacketTypeError, "Could not determine type of packet"
- raise PacketTypeError, "Could not determine type of packet"
+ return database.Row(d)
def decode_arp_packet(data):
operationmap = {
}
#"hwtype" : data[:2],
- protocol = val2int(struct.unpack("!2s", data[12:14])[0])
hw_addr_size = val2int(struct.unpack("!1s", data[18:19])[0])
hw_prot_size = val2int(struct.unpack("!1s", data[19:20])[0])
operation = val2int(struct.unpack("!2s", data[20:22])[0])
- # Sanity checks
- if not protocol == 0x0806:
- raise PacketTypeError, "Not an ARP packet"
-
# TODO Must check hwtype here...
try:
def decode_ndp_packet(data):
raise PacketTypeError
+
+protocol2function = {
+ ETHERTYPE_ARP : decode_arp_packet,
+}