/*
 * Copyright (c) 2010 Broadcom Corporation
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef _bcmip_h_
#define _bcmip_h_

#include <packed_section_start.h>

#define IP_VER_OFFSET		0x0
#define IP_VER_MASK		0xf0
#define IP_VER_SHIFT		4
#define IP_VER_4		4
#define IP_VER_6		6

#define IP_VER(ip_body) \
	((((u8 *)(ip_body))[IP_VER_OFFSET] & IP_VER_MASK) >> IP_VER_SHIFT)

#define IPV4_TOS_OFFSET		1

#define IPV4_ADDR_LEN		4

#define	IPV4_TOS(ipv4_body)	(((u8 *)(ipv4_body))[IPV4_TOS_OFFSET])

#define	IPV4_TOS_PREC_MASK	0xe0
#define	IPV4_TOS_PREC_SHIFT	5

BWL_PRE_PACKED_STRUCT struct ipv4_addr {
	u8 addr[IPV4_ADDR_LEN];
} BWL_POST_PACKED_STRUCT;

#define IPV6_TRAFFIC_CLASS(ipv6_body) \
	(((((u8 *)(ipv6_body))[0] & 0x0f) << 4) | \
	 ((((u8 *)(ipv6_body))[1] & 0xf0) >> 4))

#ifndef IP_TOS
#define IP_TOS(ip_body) \
	(IP_VER(ip_body) == IP_VER_4 ? IPV4_TOS(ip_body) : \
	 IP_VER(ip_body) == IP_VER_6 ? IPV6_TRAFFIC_CLASS(ip_body) : 0)
#endif

#include <packed_section_end.h>

#endif				/* _bcmip_h_ */
