#ifndef _IPV6_PROTOCOL_DEFINES_
#define _IPV6_PROTOCOL_DEFINES_

#define IPV6HDR_TYPE_HOPBYHOP 0x0
#define IPV6HDR_TYPE_ROUTING 0x2B
#define IPV6HDR_TYPE_FRAGMENTATION 0x2C
#define IPV6HDR_TYPE_DESTOPTS 0x3c
#define IPV6HDR_TYPE_AUTHENTICATION 0x33
#define IPV6HDR_TYPE_ENCRYPTEDSECURITYPAYLOAD 0x34
#define MASK_IPV6_CS_SPEC 0x2

#define TCP_HEADER_TYPE	0x6
#define UDP_HEADER_TYPE	0x11
#define IPV6_ICMP_HDR_TYPE 0x2
#define IPV6_FLOWLABEL_BITOFFSET 9

#define IPV6_MAX_CHAINEDHDR_BUFFBYTES 0x64
/*
 * Size of Dest Options field of Destinations Options Header
 * in bytes.
 */
#define IPV6_DESTOPTS_HDR_OPTIONSIZE 0x8

struct bcm_ipv6_hdr {
	unsigned char  ucVersionPrio;
	unsigned char  aucFlowLabel[3];
	unsigned short usPayloadLength;
	unsigned char  ucNextHeader;
	unsigned char  ucHopLimit;
	unsigned long  ulSrcIpAddress[4];
	unsigned long  ulDestIpAddress[4];
};

struct bcm_ipv6_routing_hdr {
	unsigned char ucNextHeader;
	unsigned char ucRoutingType;
	unsigned char ucNumAddresses;
	unsigned char ucNextAddress;
	unsigned long ulReserved;
};

struct bcm_ipv6_fragment_hdr {
	unsigned char  ucNextHeader;
	unsigned char  ucReserved;
	unsigned short usFragmentOffset;
	unsigned long  ulIdentification;
};

struct bcm_ipv6_dest_options_hdr {
	unsigned char ucNextHeader;
	unsigned char ucHdrExtLen;
	unsigned char ucDestOptions[6];
};

struct bcm_ipv6_options_hdr {
	unsigned char ucNextHeader;
	unsigned char ucMisc[3];
	unsigned long ulJumboPayloadLen;
};

struct bcm_ipv6_authentication_hdr {
	unsigned char  ucNextHeader;
	unsigned char  ucLength;
	unsigned short usReserved;
	unsigned long  ulSecurityParametersIndex;
};

enum bcm_ipaddr_context {
	eSrcIpAddress,
	eDestIpAddress
};

/* Function Prototypes */

unsigned short IpVersion6(struct bcm_mini_adapter *Adapter, /* < Pointer to the driver control structure */
					void *pcIpHeader, /* <Pointer to the IP Hdr of the packet */
					struct bcm_classifier_rule *pstClassifierRule);

void DumpIpv6Address(unsigned long *puIpv6Address);

extern bool MatchSrcPort(struct bcm_classifier_rule *pstClassifierRule, unsigned short ushSrcPort);
extern bool MatchDestPort(struct bcm_classifier_rule *pstClassifierRule, unsigned short ushSrcPort);
extern bool MatchProtocol(struct bcm_classifier_rule *pstClassifierRule, unsigned char ucProtocol);

#endif