/*
 * INET		An implementation of the TCP/IP protocol suite for the LINUX
 *		operating system.  INET is implemented using the  BSD Socket
 *		interface as the means of communication with the user level.
 *
 *		Definitions for the IP protocol.
 *
 * Version:	@(#)ip.h	1.0.2	04/28/93
 *
 * Authors:	Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 *
 *		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.
 */
#ifndef _LINUX_IP_H
#define _LINUX_IP_H

#include <linux/skbuff.h>
#include <uapi/linux/ip.h>

#define QTN_IP_REALIGN_MAX      (4)     /* Reserve tailroom for realignment on IP header */
#define QTN_IP_REALIGN_BYTES    (2)     /* realignment bytes on IP header */

static inline struct iphdr *ip_hdr(const struct sk_buff *skb)
{
	return (struct iphdr *)skb_network_header(skb);
}

static inline struct iphdr *inner_ip_hdr(const struct sk_buff *skb)
{
	return (struct iphdr *)skb_inner_network_header(skb);
}

static inline struct iphdr *ipip_hdr(const struct sk_buff *skb)
{
	return (struct iphdr *)skb_transport_header(skb);
}

static inline struct iphdr *ip_hdr_aligned(struct sk_buff *skb)
{
	struct iphdr *iph = ip_hdr(skb);

#ifdef CONFIG_ARC_PLAT_QTN
	int err = 0;

	if (unlikely(((uint32_t)iph & 0x3) == QTN_IP_REALIGN_BYTES)) {
		if (unlikely((skb->end - skb->tail) < QTN_IP_REALIGN_BYTES)) {
			err = pskb_expand_head(skb, 0, QTN_IP_REALIGN_MAX, GFP_ATOMIC);
			if (err)
				panic("###### QTN: %s over panic and expand fail\n", __func__);
		}
		M_FLAG_SET(skb, M_HAS_MISALIGN);
		memmove(skb->head + QTN_IP_REALIGN_BYTES, skb->head, skb->end - skb->head - QTN_IP_REALIGN_BYTES);
		skb->data += QTN_IP_REALIGN_BYTES;
		skb->tail += QTN_IP_REALIGN_BYTES;
		skb->mac_header += QTN_IP_REALIGN_BYTES;
		if (skb->network_header)
			skb->network_header += QTN_IP_REALIGN_BYTES;
		if ( skb->transport_header)
			skb->transport_header += QTN_IP_REALIGN_BYTES;
		iph = ip_hdr(skb);
	}
#endif

	return iph;
}


#endif	/* _LINUX_IP_H */
