/************************************
* 	Protocol.h
*************************************/
#ifndef	__PROTOCOL_H__
#define	__PROTOCOL_H__


#define IPV4				4
#define IPV6                6


struct ArpHeader {
    struct arphdr       arp;
    unsigned char       ar_sha[ETH_ALEN];   /* sender hardware address  */
    unsigned char       ar_sip[4];      /* sender IP address        */
    unsigned char       ar_tha[ETH_ALEN];   /* target hardware address  */
    unsigned char       ar_tip[4];      /* target IP address        */
}/*__attribute__((packed))*/;


struct TransportHeaderT
{
	union
	{
		struct udphdr uhdr;
		struct tcphdr thdr;
	};
} __attribute__((packed));
typedef struct TransportHeaderT xporthdr;


typedef enum _E_NWPKT_IPFRAME_TYPE
{
	eNonIPPacket,
	eIPv4Packet,
	eIPv6Packet
}E_NWPKT_IPFRAME_TYPE;

typedef enum _E_NWPKT_ETHFRAME_TYPE
{
	eEthUnsupportedFrame,
	eEth802LLCFrame,
	eEth802LLCSNAPFrame,
	eEth802QVLANFrame,
	eEthOtherFrame
} E_NWPKT_ETHFRAME_TYPE;

typedef struct _S_ETHCS_PKT_INFO
{
	E_NWPKT_IPFRAME_TYPE eNwpktIPFrameType;
	E_NWPKT_ETHFRAME_TYPE eNwpktEthFrameType;
	USHORT	usEtherType;
	UCHAR	ucDSAP;
}S_ETHCS_PKT_INFO,*PS_ETHCS_PKT_INFO;

typedef struct _ETH_CS_802_Q_FRAME
{
	ETH_HEADER_STRUC EThHdr;
	USHORT UserPriority:3;
	USHORT CFI:1;
	USHORT VLANID:12;
	USHORT EthType;
} __attribute__((packed)) ETH_CS_802_Q_FRAME;

typedef struct _ETH_CS_802_LLC_FRAME
{
	ETH_HEADER_STRUC EThHdr;
	unsigned char DSAP;
	unsigned char SSAP;
	unsigned char Control;
}__attribute__((packed)) ETH_CS_802_LLC_FRAME;

typedef struct _ETH_CS_802_LLC_SNAP_FRAME
{
	ETH_HEADER_STRUC EThHdr;
	unsigned char DSAP;
	unsigned char SSAP;
	unsigned char Control;
	unsigned char OUI[3];
	unsigned short usEtherType;
} __attribute__((packed)) ETH_CS_802_LLC_SNAP_FRAME;

typedef struct _ETH_CS_ETH2_FRAME
{
	ETH_HEADER_STRUC EThHdr;
} __attribute__((packed)) ETH_CS_ETH2_FRAME;

#define ETHERNET_FRAMETYPE_IPV4		ntohs(0x0800)
#define ETHERNET_FRAMETYPE_IPV6 	ntohs(0x86dd)
#define ETHERNET_FRAMETYPE_802QVLAN 	ntohs(0x8100)

//Per SF CS Specification Encodings
typedef enum _E_SERVICEFLOW_CS_SPEC_
{
	eCSSpecUnspecified =0,
	eCSPacketIPV4,
	eCSPacketIPV6,
	eCS802_3PacketEthernet,
	eCS802_1QPacketVLAN,
	eCSPacketIPV4Over802_3Ethernet,
	eCSPacketIPV6Over802_3Ethernet,
	eCSPacketIPV4Over802_1QVLAN,
	eCSPacketIPV6Over802_1QVLAN,
	eCSPacketUnsupported
}E_SERVICEFLOW_CS_SPEC;


#define	IP6_HEADER_LEN	40

#define IP_VERSION(byte)        (((byte&0xF0)>>4))



#define MAC_ADDRESS_SIZE	6
#define	ETH_AND_IP_HEADER_LEN	14 + 20
#define L4_SRC_PORT_LEN 2
#define L4_DEST_PORT_LEN 2



#define	CTRL_PKT_LEN		8 + ETH_AND_IP_HEADER_LEN

#define	ETH_ARP_FRAME			0x806
#define	ETH_IPV4_FRAME			0x800
#define	ETH_IPV6_FRAME			0x86DD
#define UDP 					0x11
#define TCP         			0x06

#define	ARP_OP_REQUEST			0x01
#define	ARP_OP_REPLY			0x02
#define	ARP_PKT_SIZE			60

// This is the format for the TCP packet header
typedef struct _TCP_HEADER
{
	USHORT usSrcPort;
	USHORT usDestPort;
	ULONG  ulSeqNumber;
	ULONG  ulAckNumber;
	UCHAR  HeaderLength;
    UCHAR  ucFlags;
	USHORT usWindowsSize;
	USHORT usChkSum;
	USHORT usUrgetPtr;
} TCP_HEADER,*PTCP_HEADER;
#define TCP_HEADER_LEN  	sizeof(TCP_HEADER)
#define TCP_ACK             0x10  //Bit 4 in tcpflags field.
#define GET_TCP_HEADER_LEN(byte) ((byte&0xF0)>>4)


#endif //__PROTOCOL_H__