]> git.ipfire.org Git - oddments/cappie.git/blobdiff - cappie/protocol.py
Merge branch 'master' of ssh://git.ipfire.org/pub/git/oddments/cappie
[oddments/cappie.git] / cappie / protocol.py
index ed5f4a3f98994bc3349724e0a144f2cf83f9a746..c4252de5075f27a9594ca1f053900ea10c97e42c 100644 (file)
@@ -21,6 +21,8 @@
 
 import struct
 
+import database
+
 from constants import *
 from errors import *
 
@@ -34,15 +36,17 @@ def val2mac(val):
        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 = {
@@ -58,15 +62,10 @@ def decode_arp_packet(data):
        }
 
        #"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:
@@ -93,3 +92,7 @@ def decode_arp_packet(data):
 
 def decode_ndp_packet(data):
        raise PacketTypeError
+
+protocol2function = {
+       ETHERTYPE_ARP : decode_arp_packet,
+}