16dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt/*
238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Copyright (C) 1999-2013, Broadcom Corporation
338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt *
46dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * Permission to use, copy, modify, and/or distribute this software for any
56dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * purpose with or without fee is hereby granted, provided that the above
66dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * copyright notice and this permission notice appear in all copies.
76dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt *
86dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
96dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
106dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
116dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
126dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
136dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
146dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
156dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt *
166dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * Fundamental constants relating to IP Protocol
176dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt *
1838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * $Id: bcmip.h 384540 2013-02-12 04:28:58Z $
196dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt */
206dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
216dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#ifndef _bcmip_h_
226dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#define _bcmip_h_
236dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
246dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#ifndef _TYPEDEFS_H_
256dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#include <typedefs.h>
266dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#endif
276dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
2838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* This marks the start of a packed structure section. */
296dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#include <packed_section_start.h>
306dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
316dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
3238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* IPV4 and IPV6 common */
3338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IP_VER_OFFSET		0x0	/* offset to version field */
3438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IP_VER_MASK		0xf0	/* version mask */
3538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IP_VER_SHIFT		4	/* version shift */
3638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IP_VER_4		4	/* version number for IPV4 */
3738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IP_VER_6		6	/* version number for IPV6 */
386dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
396dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#define IP_VER(ip_body) \
406dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt	((((uint8 *)(ip_body))[IP_VER_OFFSET] & IP_VER_MASK) >> IP_VER_SHIFT)
416dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
4238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IP_PROT_ICMP		0x1	/* ICMP protocol */
4338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IP_PROT_IGMP		0x2	/* IGMP protocol */
4438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IP_PROT_TCP		0x6	/* TCP protocol */
4538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IP_PROT_UDP		0x11	/* UDP protocol type */
4638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IP_PROT_ICMP6		0x3a	/* ICMPv6 protocol type */
4738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
4838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* IPV4 field offsets */
4938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_VER_HL_OFFSET      0       /* version and ihl byte offset */
5038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_TOS_OFFSET         1       /* type of service offset */
5138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_PKTLEN_OFFSET      2       /* packet length offset */
5238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_PKTFLAG_OFFSET     6       /* more-frag,dont-frag flag offset */
5338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_PROT_OFFSET        9       /* protocol type offset */
5438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_CHKSUM_OFFSET      10      /* IP header checksum offset */
5538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_SRC_IP_OFFSET      12      /* src IP addr offset */
5638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_DEST_IP_OFFSET     16      /* dest IP addr offset */
5738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_OPTIONS_OFFSET     20      /* IP options offset */
5838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_MIN_HEADER_LEN     20      /* Minimum size for an IP header (no options) */
5938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
6038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* IPV4 field decodes */
6138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_VER_MASK		0xf0	/* IPV4 version mask */
6238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_VER_SHIFT		4	/* IPV4 version shift */
6338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
6438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_HLEN_MASK		0x0f	/* IPV4 header length mask */
656dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#define IPV4_HLEN(ipv4_body)	(4 * (((uint8 *)(ipv4_body))[IPV4_VER_HL_OFFSET] & IPV4_HLEN_MASK))
666dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
6738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_ADDR_LEN		4	/* IPV4 address length */
686dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
696dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#define IPV4_ADDR_NULL(a)	((((uint8 *)(a))[0] | ((uint8 *)(a))[1] | \
706dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt				  ((uint8 *)(a))[2] | ((uint8 *)(a))[3]) == 0)
716dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
726dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#define IPV4_ADDR_BCAST(a)	((((uint8 *)(a))[0] & ((uint8 *)(a))[1] & \
736dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt				  ((uint8 *)(a))[2] & ((uint8 *)(a))[3]) == 0xff)
746dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
7538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	IPV4_TOS_DSCP_MASK	0xfc	/* DiffServ codepoint mask */
7638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	IPV4_TOS_DSCP_SHIFT	2	/* DiffServ codepoint shift */
776dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
786dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#define	IPV4_TOS(ipv4_body)	(((uint8 *)(ipv4_body))[IPV4_TOS_OFFSET])
796dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
8038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	IPV4_TOS_PREC_MASK	0xe0	/* Historical precedence mask */
8138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	IPV4_TOS_PREC_SHIFT	5	/* Historical precedence shift */
826dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
8338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_TOS_LOWDELAY	0x10	/* Lowest delay requested */
8438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_TOS_THROUGHPUT	0x8	/* Best throughput requested */
8538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_TOS_RELIABILITY	0x4	/* Most reliable delivery requested */
866dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
876dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#define IPV4_PROT(ipv4_body)	(((uint8 *)(ipv4_body))[IPV4_PROT_OFFSET])
886dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
8938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_FRAG_RESV		0x8000	/* Reserved */
9038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_FRAG_DONT		0x4000	/* Don't fragment */
9138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_FRAG_MORE		0x2000	/* More fragments */
9238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_FRAG_OFFSET_MASK	0x1fff	/* Fragment offset */
936dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
9438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_ADDR_STR_LEN	16	/* Max IP address length in string format */
956dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
9638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* IPV4 packet formats */
976dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry ShmidtBWL_PRE_PACKED_STRUCT struct ipv4_addr {
986dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt	uint8	addr[IPV4_ADDR_LEN];
996dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt} BWL_POST_PACKED_STRUCT;
1006dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
1016dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry ShmidtBWL_PRE_PACKED_STRUCT struct ipv4_hdr {
10238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8	version_ihl;		/* Version and Internet Header Length */
10338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8	tos;			/* Type Of Service */
10438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16	tot_len;		/* Number of bytes in packet (max 65535) */
1056dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt	uint16	id;
10638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16	frag;			/* 3 flag bits and fragment offset */
10738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8	ttl;			/* Time To Live */
10838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8	prot;			/* Protocol */
10938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16	hdr_chksum;		/* IP header checksum */
11038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8	src_ip[IPV4_ADDR_LEN];	/* Source IP Address */
11138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8	dst_ip[IPV4_ADDR_LEN];	/* Destination IP Address */
1126dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt} BWL_POST_PACKED_STRUCT;
1136dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
11438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* IPV6 field offsets */
11538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_PAYLOAD_LEN_OFFSET	4	/* payload length offset */
11638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_NEXT_HDR_OFFSET	6	/* next header/protocol offset */
11738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_HOP_LIMIT_OFFSET	7	/* hop limit offset */
11838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_SRC_IP_OFFSET	8	/* src IP addr offset */
11938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_DEST_IP_OFFSET	24	/* dst IP addr offset */
1206dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
12138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* IPV6 field decodes */
1226dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#define IPV6_TRAFFIC_CLASS(ipv6_body) \
1236dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt	(((((uint8 *)(ipv6_body))[0] & 0x0f) << 4) | \
1246dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt	 ((((uint8 *)(ipv6_body))[1] & 0xf0) >> 4))
1256dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
1266dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#define IPV6_FLOW_LABEL(ipv6_body) \
1276dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt	(((((uint8 *)(ipv6_body))[1] & 0x0f) << 16) | \
1286dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt	 (((uint8 *)(ipv6_body))[2] << 8) | \
1296dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt	 (((uint8 *)(ipv6_body))[3]))
1306dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
1316dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#define IPV6_PAYLOAD_LEN(ipv6_body) \
1326dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt	((((uint8 *)(ipv6_body))[IPV6_PAYLOAD_LEN_OFFSET + 0] << 8) | \
1336dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt	 ((uint8 *)(ipv6_body))[IPV6_PAYLOAD_LEN_OFFSET + 1])
1346dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
1356dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#define IPV6_NEXT_HDR(ipv6_body) \
1366dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt	(((uint8 *)(ipv6_body))[IPV6_NEXT_HDR_OFFSET])
1376dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
1386dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#define IPV6_PROT(ipv6_body)	IPV6_NEXT_HDR(ipv6_body)
1396dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
14038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_ADDR_LEN		16	/* IPV6 address length */
1416dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
14238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* IPV4 TOS or IPV6 Traffic Classifier or 0 */
1436dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#define IP_TOS46(ip_body) \
1446dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt	(IP_VER(ip_body) == IP_VER_4 ? IPV4_TOS(ip_body) : \
1456dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt	 IP_VER(ip_body) == IP_VER_6 ? IPV6_TRAFFIC_CLASS(ip_body) : 0)
1466dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
14738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* IPV6 extension headers (options) */
14838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_EXTHDR_HOP		0
14938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_EXTHDR_ROUTING	43
15038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_EXTHDR_FRAGMENT	44
15138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_EXTHDR_AUTH	51
15238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_EXTHDR_NONE	59
15338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_EXTHDR_DEST	60
15438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
15538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_EXTHDR(prot)	(((prot) == IPV6_EXTHDR_HOP) || \
15638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                         ((prot) == IPV6_EXTHDR_ROUTING) || \
15738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                         ((prot) == IPV6_EXTHDR_FRAGMENT) || \
15838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                         ((prot) == IPV6_EXTHDR_AUTH) || \
15938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                         ((prot) == IPV6_EXTHDR_NONE) || \
16038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                         ((prot) == IPV6_EXTHDR_DEST))
16138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
16238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_MIN_HLEN 		40
16338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
16438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV6_EXTHDR_LEN(eh)	((((struct ipv6_exthdr *)(eh))->hdrlen + 1) << 3)
1656dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
16638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry ShmidtBWL_PRE_PACKED_STRUCT struct ipv6_exthdr {
16738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8	nexthdr;
16838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8	hdrlen;
16938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt} BWL_POST_PACKED_STRUCT;
17038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
17138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry ShmidtBWL_PRE_PACKED_STRUCT struct ipv6_exthdr_frag {
17238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8	nexthdr;
17338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8	rsvd;
17438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16	frag_off;
17538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32	ident;
17638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt} BWL_POST_PACKED_STRUCT;
17738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
17838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtstatic INLINE int32
17938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtipv6_exthdr_len(uint8 *h, uint8 *proto)
18038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt{
18138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16 len = 0, hlen;
18238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	struct ipv6_exthdr *eh = (struct ipv6_exthdr *)h;
18338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
18438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	while (IPV6_EXTHDR(eh->nexthdr)) {
18538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt		if (eh->nexthdr == IPV6_EXTHDR_NONE)
18638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt			return -1;
18738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt		else if (eh->nexthdr == IPV6_EXTHDR_FRAGMENT)
18838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt			hlen = 8;
18938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt		else if (eh->nexthdr == IPV6_EXTHDR_AUTH)
19038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt			hlen = (eh->hdrlen + 2) << 2;
19138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt		else
19238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt			hlen = IPV6_EXTHDR_LEN(eh);
19338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
19438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt		len += hlen;
19538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt		eh = (struct ipv6_exthdr *)(h + len);
19638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	}
19738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
19838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	*proto = eh->nexthdr;
19938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	return len;
20038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt}
20138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
20238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IPV4_ISMULTI(a) (((a) & 0xf0000000) == 0xe0000000)
20338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
20438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* This marks the end of a packed structure section. */
2056dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#include <packed_section_end.h>
2066dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt
20738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif	/* _bcmip_h_ */
208