/* $Id$ */
/****************************************************************************
 *
 * Copyright (C) 2014-2017 Cisco and/or its affiliates. All rights reserved.
 * Copyright (C) 2005-2013 Sourcefire, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License Version 2 as
 * published by the Free Software Foundation.  You may not use, modify or
 * distribute this program under any other version of the GNU General
 * Public License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 ****************************************************************************/

#ifndef __SF_PROTOCOLS_H__
#define __SF_PROTOCOLS_H__

typedef uint8_t IpProto;

typedef enum {
    PROTO_ETH,        /* DecodeEthPkt */
    PROTO_FPATH,      /* FabricPath - handled by DecodeEthPkt */
    PROTO_CISCO_META, /* Cisco Metadata - handled by DecodeEthPkt */

    PROTO_IP4,        /* DecodeIP */
                      /* DecodeIPOptions - handled with IP4 */
    PROTO_ICMP4,      /* DecodeICMP */
    PROTO_ICMP_IP4,   /* DecodeICMPEmbeddedIP */

    PROTO_UDP,        /* DecodeUDP */
    PROTO_TCP,        /* DecodeTCP */
                      /* DecodeTCPOptions - handled with TCP */

    PROTO_IP6,        /* DecodeIPV6 */
                      /* DecodeIPV6Extensions - nothing to do here, calls below */
    PROTO_IP6_HOP_OPTS,  /* DecodeIPV6Options - ip6 hop, dst, rte, and frag exts */
    PROTO_IP6_DST_OPTS,
    PROTO_ICMP6,      /* DecodeICMP6 */
    PROTO_ICMP_IP6,   /* DecodeICMPEmbeddedIP6 */
    PROTO_VLAN,       /* DecodeVlan */
#ifdef GRE
    PROTO_GRE,        /* DecodeGRE */
                      /* DecodeTransBridging - basically same as DecodeEthPkt */
    PROTO_ERSPAN,     /* DecodeERSPANType2 and DecodeERSPANType3 */
#endif
    PROTO_PPPOE,      /* DecodePPPoEPkt */
    PROTO_PPP_ENCAP,  /* DecodePppPktEncapsulated */
    PROTO_MPLS,       /* DecodeMPLS - decoder changes pkth len/caplen! */
                      /* DecodeEthOverMPLS - basically same as straight eth */
    PROTO_ARP,        /* DecodeARP */
    PROTO_GTP,        /* DecodeGTP */
    PROTO_AH,         /* DecodeAH - Authentication Header (IPSec stuff) */

#ifndef NO_NON_ETHER_DECODER
    PROTO_TR,         /* DecodeTRPkt */
    PROTO_FDDI,       /* DecodeFDDIPkt */
    PROTO_LSLL,       /* DecodeLinuxSLLPkt sockaddr_ll for "any" device and  */
                      /* certain misbehaving link layer encapsulations */
    PROTO_80211,      /* DecodeIEEE80211Pkt */
    PROTO_SLIP,       /* DecodeSlipPkt - actually, based on header size, this */
                      /* must be CSLIP (TCP/IP header compression) but all it */
                      /* does is skip over the presumed header w/o expanding */
                      /* and then jumps into IP4 decoding only; also, the actual */
                      /* esc/end sequences must already have been removed because */
                      /* there is no attempt to do that. */
    PROTO_L2I4,       /* DecodeI4LRawIPPkt - always skips 2 bytes and then does */
                      /* IP4 decoding only */
    PROTO_L2I4C,      /* DecodeI4LCiscoIPPkt -always skips 4 bytes and then does */
                      /* IP4 decoding only */
    PROTO_CHDLC,      /* DecodeChdlcPkt - skips 4 bytes and decodes IP4 only. */
    PROTO_PFLOG,      /* DecodePflog */
    PROTO_OLD_PFLOG,  /* DecodeOldPflog */
    PROTO_PPP,        /* DecodePppPkt - weird - optionally skips addr and cntl */
                      /* bytes; what about flag and protocol? */
                      /* calls only DecodePppPktEncapsulated. */
    PROTO_PPP_SERIAL, /* DecodePppSerialPkt - also weird - requires addr, cntl, */
                      /* and proto (no flag) but optionally skips only 2 bytes */
                      /* (presumably the trailer w/chksum is already stripped) */
                      /* Calls either DecodePppPktEncapsulated or DecodeChdlcPkt. */
    PROTO_ENC,        /* DecodeEncPkt - skips 12 bytes and decodes IP4 only. */
                      /* (add family + "spi" + "flags" - don't know what this is) */
    PROTO_EAP,        /* DecodeEAP */
    PROTO_EAPOL,      /* DecodeEapol - leaf decoder */
    PROTO_EAPOL_KEY,  /* DecodeEapolKey - leaf decoder */
#endif /* NO_NON_ETHER_DECODER */

    PROTO_MAX
} PROTO_ID;

                      /* DecodeIPX - just counts; no decoding */
                      /* DecodeEthLoopback - same as ipx */
                      /* DecodeRawPkt - jumps straight into IP4 decoding */
                      /* there is nothing to do */
                      /* DecodeNullPkt - same as DecodeRawPkt */

typedef struct {
    PROTO_ID proto;
    uint16_t length;
    uint8_t* start;
} Layer;

#endif /* __PROTOCOLS_H__ */

