def __init__(self, parent, buffer, idx): super(EthernetSNAP ,self).__init__(parent, buffer, idx) self.snap_orgid = Header.hex2int(buffer.bytes()[17:20]) self.snap_pid = Header.hex2int(buffer.bytes()[20:22]) key = (self.snap_orgid, self.snap_pid) self.parse_child(key, 22)
def parse(self, data): self.addrs = [] (count,) = struct.unpack("!I", data[0:4].tostring()) idx = 4 for i in xrange(0,count): (type, length) = struct.unpack("!BB", data[idx:idx+2].tostring()) idx += 2 protocol = Header.hex2int( data[idx:idx+length] ) idx += length (length,) = struct.unpack("!H", data[idx:idx+2].tostring()) idx += 2 addr = data[idx:idx+length] idx += length for cls in [ self.IPv4Addr, self.IPv6Addr ]: if cls.PROTO == protocol: value = cls(addr, protocol) self.addrs.append(value) return "(%s)" % ", ".join(map(str, self.addrs))
def __str__(self): return "%s(0x%04x): %s" % (self.NAME, self.type_id, Header.hex2str(self.data))