/*
 *  Copyright (c) 2009 Mindspeed Technologies, Inc.
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.
 *
 *  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 _COMMON_HDRS_H__
#define _COMMON_HDRS_H__

#include "types.h"
#include "ipv6.h"

#define C2000_MAX_FRAGMENTS 2

#define IPV4_HDR_SIZE		20
#define TCP_HDR_SIZE		20
#define UDP_TCP_HDR_SIZE	8
#define PPPOE_HDR_SIZE		8
#define IPSEC_ESP_HDR_SIZE	8
#define ETH_HDR_SIZE		14
#define VLAN_HDR_SIZE		4

#define MAX_L2_HEADER	18


/* 
* VLAN
*
*/


/** Structure that describes the VLAN header as it used by the code:
 * VID contains the actual VID value, while TPID contains the Ethertype of the inner data.
 * This makes the VLAN handling logic simpler and more intuitive.
 */
typedef struct VLAN_HDR_STRUCT
{
		U16 TCI;
		U16 TPID; /**< Tells the Protocol ID, like IPv4 or IPv6 */
}vlan_hdr_t;

#define VLAN_VID(vlan_hdr)	((vlan_hdr)->TCI & htons(0xfff))
#define VLAN_PCP(vlan_hdr)	(*(U8 *)&((vlan_hdr)->TCI) >> 5)

/** Structure that describes the real VLAN header format, as defined in the 802.1Q standard.
 */
typedef struct REAL_VLAN_HDR_STRUCT
{
	union {
		U32 tag;
		struct {
			U16 TPID; /**< should be 0x8100 in most VLAN tags */
			U16 TCI;
		};
	};
}real_vlan_hdr_t;


/* 
* IPV4
*
*/


/* IP flags. */
#define IP_DF		0x4000		/* Flag: "Don't Fragment"	*/
#define IP_MF		0x2000		/* Flag: "More Fragments"	*/
#define IP_OFFSET	0x1FFF		/* "Fragment Offset" part	*/

typedef struct  IPv4_HDR_STRUCT
{
        unsigned char Version_IHL;
        unsigned char TypeOfService;
        unsigned short TotalLength;
        unsigned short Identification;
        unsigned short Flags_FragmentOffset;
        unsigned char  TTL;
        unsigned char  Protocol;
        unsigned short HeaderChksum;
        unsigned int SourceAddress;
        unsigned int DestinationAddress;
}  ipv4_hdr_t;

typedef struct _tNatt_Socket_v4{
        struct _tNatt_Socket_v4 *next;
        unsigned int src_ip;
        unsigned int dst_ip;
        unsigned short sport;
        unsigned short dport;
}Natt_Socket_v4, *PNatt_Socket_v4;



/* 
* IPV6
*
*/

typedef struct _tNatt_Socket_v6{
        struct _tNatt_Socket_v6 *next;
        unsigned int src_ip[4];
        unsigned int dst_ip[4];
        unsigned short sport;
        unsigned short dport;
}Natt_Socket_v6, *PNatt_Socket_v6;

#endif

