def parse (self, raw): assert isinstance(raw, bytes) self.raw = raw dlen = len(raw) if dlen < self.MIN_LEN: self.msg('(llc parse) warning: packet data too short') return self.length = 3 (self.dsap, self.ssap, self.control) \ = struct.unpack('!BBB', raw[:self.MIN_LEN]) if ((self.control & 1) == 0) or ((self.control & 3) == 2): if dlen < self.length + 1: self.msg('(llc parse) warning: packet data too short') return self.control |= (ord(raw[3:4]) << 8) self.length = 4 if (self.ssap & 0xfe) == 0xaa: if (self.dsap & 0xfe) == 0xaa: # Oh snap if dlen < self.length + 5: self.msg('(llc parse) warning: incomplete SNAP') return self.oui = raw[self.length:self.length+3] self.length += 3 self.eth_type = struct.unpack("!H", raw[self.length:self.length+2])[0] self.length += 2 self.parsed = True self.next = ethernet.parse_next(self, self.eth_type, raw, self.length, allow_llc = False)
def parse(self, raw): assert isinstance(raw, bytes) self.raw = raw dlen = len(raw) if dlen < vlan.MIN_LEN: self.msg("(vlan parse) warning VLAN packet data too short to " + "parse header: data len %u" % (dlen,)) return (pcpid, self.eth_type) = struct.unpack("!HH", raw[: vlan.MIN_LEN]) self.pcp = pcpid >> 13 self.cfi = pcpid & 0x1000 self.id = pcpid & 0x0FFF self.parsed = True self.next = ethernet.parse_next(self, self.eth_type, raw, vlan.MIN_LEN)
def parse(self, raw): assert isinstance(raw, bytes) self.raw = raw dlen = len(raw) if dlen < vlan.MIN_LEN: self.msg('(vlan parse) warning VLAN packet data too short to ' + 'parse header: data len %u' % (dlen, )) return (pcpid, self.eth_type) = struct.unpack("!HH", raw[:vlan.MIN_LEN]) self.pcp = pcpid >> 13 self.cfi = pcpid & 0x1000 self.id = pcpid & 0x0fff self.parsed = True self.next = ethernet.parse_next(self, self.eth_type, raw, vlan.MIN_LEN)
def parse(self, raw): assert isinstance(raw, bytes) self.raw = raw dlen = len(raw) if dlen < self.MIN_LEN: self.msg('(llc parse) warning: packet data too short') return self.length = 3 (self.dsap, self.ssap, self.control) \ = struct.unpack('!BBB', raw[:self.MIN_LEN]) if ((self.control & 1) == 0) or ((self.control & 3) == 2): if dlen < self.length + 1: self.msg('(llc parse) warning: packet data too short') return self.control |= (ord(raw[3:4]) << 8) self.length = 4 if (self.ssap & 0xfe) == 0xaa: if (self.dsap & 0xfe) == 0xaa: # Oh snap if dlen < self.length + 5: self.msg('(llc parse) warning: incomplete SNAP') return self.oui = raw[self.length:self.length + 3] self.length += 3 self.eth_type = struct.unpack( "!H", raw[self.length:self.length + 2])[0] self.length += 2 self.parsed = True if self.oui == '\0\0\0': self.next = ethernet.parse_next(self, self.eth_type, raw, self.length, allow_llc=False) else: self.next = raw[self.length:]