text: """
  Linux cooked capture format
  """
  import logging
  
  from packetracer import packetracer
  # handler
  from packetracer.layer12 import can, arp, dtp, pppoe
  from packetracer.layer3 import ip, ip6, ipx
  from packetracer.structcbs import unpack_H
  
  logger = logging.getLogger("packetracer")
  
  # Ethernet payload types - http://standards.ieee.org/regauth/ethertype
  LCC_TYPE_CAN = 0x000C  # CAN protocol
  LCC_TYPE_PUP = 0x0200  # PUP protocol
  LCC_TYPE_IP = 0x0800  # IPv4 protocol
  LCC_TYPE_ARP = 0x0806  # address resolution protocol
  LCC_TYPE_WOL = 0x0842  # Wake on LAN
  LCC_TYPE_CDP = 0x2000  # Cisco Discovery Protocol
  LCC_TYPE_DTP = 0x2004  # Cisco Dynamic Trunking Protocol
  LCC_TYPE_REVARP = 0x8035  # reverse addr resolution protocol
  LCC_TYPE_ETHTALK = 0x809B  # Apple Talk
  LCC_TYPE_AARP = 0x80F3  # Appletalk Address Resolution Protocol
  LCC_TYPE_8021Q = 0x8100  # IEEE 802.1Q VLAN tagging
  LCC_TYPE_IPX = 0x8137  # Internetwork Packet Exchange
  LCC_TYPE_NOV = 0x8138  # Novell
  LCC_TYPE_IP6 = 0x86DD  # IPv6 protocol
  LCC_TYPE_MPLS_UCAST = 0x8847  # MPLS unicast
  LCC_TYPE_MPLS_MCAST = 0x8848  # MPLS multicast
  LCC_TYPE_PPOE_DISC = 0x8863  # PPPoE Discovery
  LCC_TYPE_PPOE_SESS = 0x8864  # PPPoE Session
  LCC_TYPE_JUMBOF = 0x8870  # Jumbo Frames
  LCC_TYPE_PROFINET = 0x8892  # Realtime-Ethernet PROFINET
  LCC_TYPE_ATAOE = 0x88A2  # ATA other Ethernet
  LCC_TYPE_ETHERCAT = 0x88A4  # Realtime-Ethernet Ethercat
  LCC_TYPE_PBRIDGE = 0x88A8  # Provider Briding
  LCC_TYPE_POWERLINK = 0x88AB  # Realtime Ethernet POWERLINK
  LCC_TYPE_LLDP = 0x88CC  # Link Layer Discovery Protocol
  LCC_TYPE_SERCOS = 0x88CD  # Realtime Ethernet SERCOS III
  LCC_TYPE_FIBRE_ETH = 0x8906  # Fibre Channel over Ethernet
  LCC_TYPE_FCOE = 0x8914  # FCoE Initialization Protocol (FIP)
  
  PACKET_DIR_TO_US = 0
  PACKET_DIR_FROM_US = 4
  
  
  class LinuxCC(packetracer.Packet):
      __hdr__ = (
          ("dir", "H", 4),
          ("addrtype", "H", 0),
          ("addrlen", "H", 0),
          ("info", "Q", 0),
          ("type", "H", LCC_TYPE_IP)
      )
  
      __handler__ = {
          LCC_TYPE_CAN: can.CAN,
          LCC_TYPE_IP: ip.IP,
          LCC_TYPE_ARP: arp.ARP,
          LCC_TYPE_DTP: dtp.DTP,
          LCC_TYPE_IPX: ipx.IPX,
          LCC_TYPE_IP6: ip6.IP6,
          LCC_TYPE_PPOE_DISC: pppoe.PPPoE,
          LCC_TYPE_PPOE_SESS: pppoe.PPPoE
      }
  
      def _dissect(self, buf):
          htype = unpack_H(buf[14: 16])[0]
          # logger.debug("type: %X" % type)
          self._init_handler(htype, buf[16:])
          return 16
  