def parse(self, raw): assert isinstance(raw, bytes) self.raw = raw dlen = len(raw) if dlen < gre.MIN_LEN: self.msg('warning GRE packet data too short to ' + 'parse header: data len %u' % (dlen, )) return o = 0 flags, self.type = struct.unpack("!HH", raw[o:o + 4]) o += 4 self.ver = flags & 7 if self.ver != 0: self.msg('unknown GRE version: %s' % (self.ver, )) csum_present = (flags & 0x8000) != 0 route_present = (flags & 0x4000) != 0 key_present = (flags & 0x2000) != 0 seq_present = (flags & 0x1000) != 0 self.strict_source_route = (flags & 0x800) != 0 self.recursion = (flags & 0x700) >> 8 offset = None if csum_present or route_present: self.csum, self.route_offset = struct.unpack("!HH", raw[o:o + 4]) o += 4 if self.verify_csum: if checksum(raw) != 0: self.msg('warning GRE checksum did not match') return if key_present: self.key = struct.unpack("!I", raw[o:o + 4])[0] o += 4 if seq_present: self.seq = struct.unpack("!I", raw[o:o + 4])[0] o += 4 if route_present: self.routing = [] while True: af, so, sl = struct.unpack("!HBB", raw[o:o + 4]) o += 4 sd = raw[o:o + sl] o += sl self.routing.append((af, so, sl, sd)) if sl == 0: break self.parsed = True if self.type == 0x0800: self.next = ipv4.ipv4(raw=raw[o:]) elif self.type == 0x6558: self.next = ethernet(raw=raw[o:]) else: self.next = raw[o:]
def parse(self): dlen = len(self.arr) if dlen < self.MIN_LEN: print '(unreach parse) warning unreachable payload too short to parse header: data len %u' % dlen return (self.unused, self.next_mtu) \ = struct.unpack('!HH', self.arr[:self.MIN_LEN]) self.parsed = True if dlen >= 28: # xxx We're assuming this is IPv4! import ipv4 self.next = ipv4.ipv4(arr=self.arr[unreach.MIN_LEN:],prev=self) else: self.next = self.arr[unreach.MIN_LEN:].tostring()
def parse(self): dlen = len(self.arr) if dlen < self.MIN_LEN: print '(unreach parse) warning unreachable payload too short to parse header: data len %u' % dlen return (self.unused, self.next_mtu) \ = struct.unpack('!HH', self.arr[:self.MIN_LEN]) self.parsed = True if dlen >= 28: # xxx We're assuming this is IPv4! import ipv4 self.next = ipv4.ipv4(arr=self.arr[unreach.MIN_LEN:], prev=self) else: self.next = self.arr[unreach.MIN_LEN:].tostring()
def parse (self, raw): assert isinstance(raw, bytes) self.raw = raw dlen = len(raw) if dlen < self.MIN_LEN: self.msg('(time_exceeded parse) warning payload too short ' 'to parse header: data len %u' % (dlen,)) return self.unused = struct.unpack('!I', raw[:self.MIN_LEN])[0] self.parsed = True if dlen >= 28: # xxx We're assuming this is IPv4! import ipv4 self.next = ipv4.ipv4(raw=raw[self.MIN_LEN:],prev=self) else: self.next = raw[self.MIN_LEN:]
def parse(self, raw): assert isinstance(raw, bytes) self.raw = raw dlen = len(raw) if dlen < self.MIN_LEN: self.msg("(unreach parse) warning unreachable payload too short to parse header: data len %u" % dlen) return (self.unused, self.next_mtu) = struct.unpack("!HH", raw[: self.MIN_LEN]) self.parsed = True if dlen >= 28: # xxx We're assuming this is IPv4! import ipv4 self.next = ipv4.ipv4(raw=raw[unreach.MIN_LEN :], prev=self) else: self.next = raw[unreach.MIN_LEN :]
def parse(self, raw): assert isinstance(raw, bytes) self.raw = raw dlen = len(raw) if dlen < self.MIN_LEN: self.msg('(time_exceeded parse) warning payload too short ' 'to parse header: data len %u' % (dlen, )) return self.unused = struct.unpack('!I', raw[:self.MIN_LEN])[0] self.parsed = True if dlen >= 28: # xxx We're assuming this is IPv4! import ipv4 self.next = ipv4.ipv4(raw=raw[self.MIN_LEN:], prev=self) else: self.next = raw[self.MIN_LEN:]
def parse(self, raw): assert isinstance(raw, bytes) self.raw = raw dlen = len(raw) if dlen < self.MIN_LEN: self.msg('(unreach parse) warning unreachable payload too short ' 'to parse header: data len %u' % dlen) return (self.unused, self.next_mtu) \ = struct.unpack('!HH', raw[:self.MIN_LEN]) self.parsed = True if dlen >= 28: # xxx We're assuming this is IPv4! import ipv4 self.next = ipv4.ipv4(raw=raw[unreach.MIN_LEN:],prev=self) else: self.next = raw[unreach.MIN_LEN:]