Esempio n. 1
0
    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:]
Esempio n. 2
0
    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()
Esempio n. 3
0
    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()
Esempio n. 4
0
    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 :]
Esempio n. 6
0
    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:]
Esempio n. 7
0
    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:]