Ejemplo n.º 1
0
  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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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:]