/*SH1
*******************************************************************************
**                                                                           **
**         Copyright (c) 2012 Quantenna Communications. Inc.                 **
**                            All Rights Reserved                            **
**                                                                           **
*******************************************************************************
**                                                                           **
**  Redistribution and use in source and binary forms, with or without       **
**  modification, are permitted provided that the following conditions       **
**  are met:                                                                 **
**  1. Redistributions of source code must retain the above copyright        **
**     notice, this list of conditions and the following disclaimer.         **
**  2. Redistributions in binary form must reproduce the above copyright     **
**     notice, this list of conditions and the following disclaimer in the   **
**     documentation and/or other materials provided with the distribution.  **
**  3. The name of the author may not be used to endorse or promote products **
**     derived from this software without specific prior written permission. **
**                                                                           **
**  Alternatively, this software may be distributed under the terms of the   **
**  GNU General Public License ("GPL") version 2, or (at your option) any    **
**  later version as published by the Free Software Foundation.              **
**                                                                           **
**  In the case this software is distributed under the GPL license,          **
**  you should have received a copy of the GNU General Public License        **
**  along with this software; if not, write to the Free Software             **
**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  **
**                                                                           **
**  THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR       **
**  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES**
**  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  **
**  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,         **
**  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT **
**  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,**
**  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY    **
**  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT      **
**  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF **
**  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.        **
**                                                                           **
*******************************************************************************
EH1*/

#ifndef _IPUTIL_H_
#define _IPUTIL_H_

#include <linux/kernel.h>
#include <linux/version.h>

#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
#include <asm/unaligned.h>
#endif

#include <linux/inetdevice.h>
#include <linux/if_arp.h>
#include <linux/ip.h>
#include <net/ip.h>
#include <net80211/if_ethersubr.h>
#if defined(CONFIG_IPV6)
#include <net/ipv6.h>
#include <linux/in6.h>
#include <linux/inet.h>
#include <net/addrconf.h>
#endif

#define IPUTIL_HDR_VER_4	4
#define IPUTIL_HDR_VER_6	6

#define IPUTIL_V4_ADDR_SSDP		htonl(0xEFFFFFFA) /* 239.255.255.250 */
#define IPUTIL_V4_ADDR_MULTICAST(_addr)	\
	((_addr & htonl(0xF0000000)) == htonl(0xE0000000)) /* 224.0.0.0/4 */
#define IPUTIL_V6_ADDR_MULTICAST(_addr)	\
	((_addr & htonl(0xFF000000)) == htonl(0xFF000000)) /* ff00::/8 - see __ipv6_addr_type() */
#define IPUTIL_V4_ADDR_LNCB(_addr)	\
	((_addr & htonl(0xFFFFFF00)) == htonl(0xE0000000)) /* 224.0.0.0/24 */
#define IPUTIL_V6_ADDR_LNCB(_addr)     \
	((_addr & htonl(0xFF0F0000)) == htonl(0xFF020000)) /* ffx2::/8 - see __ipv6_addr_type() */

#define IPUTIL_V4_FRAG_OFFSET(_fh)	(ntohs(_fh->frag_off) & ~0x7)
#define IPUTIL_V4_FRAG_MF(_fh)		(ntohs(_fh->frag_off) & IP6_MF)

#define IPUTIL_V6_FRAG_OFFSET(_fh)	(ntohs(_fh->frag_off) & ~0x7)
#define IPUTIL_V6_FRAG_MF(_fh)		(ntohs(_fh->frag_off) & IP6_MF)

#define NIPV6OCTA_FMT "%pI6"
#define NIPV6OCTA(_ipv6_addr_) _ipv6_addr_

#define IPUTIL_V4_ADDR_LEN 4

#ifdef CONFIG_IPV6
int iputil_v6_skip_exthdr(const struct ipv6hdr *ipv6h, int start, uint8_t *nexthdrp,
				int total_len, __be32 *ip_id, uint8_t *more_frags);
int iputil_v6_ntop(char *buf, const struct in6_addr *addr);
int iputil_v6_ntop_port(char *buf, const struct in6_addr *addr, __be16 port);
int iputil_eth_is_v6_mld(void *iphdr, uint32_t data_len);

int iputil_ipv6_is_neigh_msg(struct ipv6hdr *ipv6, struct icmp6hdr *icmpv6);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
int iputil_ipv6_is_neigh_sol_msg(uint8_t dup_addr_detect,
				const struct in6_addr *target,
				const struct in6_addr *daddr);
#else
int iputil_ipv6_is_neigh_sol_msg(uint8_t dad, struct nd_msg *msg, struct ipv6hdr *ipv6);
#endif
#endif

int iputil_v4_pton(const char *ip_str, __be32 *ipaddr);
int iputil_v4_ntop_port(char *buf, __be32 addr, __be16 port);

/*
 * IPv6 broadcasts are scoped multicast.
 * +--------+----+----+---------------------------------------------+
 * | 8      | 4  | 4  |                 112 bits                    |
 * +------ -+----+----+---------------------------------------------+
 * |11111111|flgs|scop|                 group ID                    |
 * +--------+----+----+---------------------------------------------+
 *
 *  Scope:
 *  1: Interface-Local (loopback)
 *  2: Link-Local
 *  4: Admin-Local
 *  5: Site-Local
 *  8: Organization-Local
 *  E: Global
 *  0,3,F: reserved
 *  others: unassigned, are available for administrators to define additional multicast regions.
 *
 *  RFC4291 http://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xml
 */
#ifdef CONFIG_IPV6
static inline int iputil_mac_is_v6_local(const struct ipv6hdr *ipv6h)
{
	const struct in6_addr *ipaddr = &ipv6h->daddr;

	return ((ipaddr->in6_u.u6_addr8[0] == 0xff) &&
		(ipaddr->in6_u.u6_addr8[1] > 0x01) &&
		(ipaddr->in6_u.u6_addr8[1] < 0x0E));
}
#endif

static inline int iputil_is_v4_ssdp(const void *addr, const void *iph)
{
	static const char ssdp_addr[] = {0x01, 0x00, 0x5E, 0x7F, 0xFF, 0xFA};

	if (unlikely(!memcmp(addr, ssdp_addr, sizeof(ssdp_addr)))) {
		const struct iphdr *ipv4h = iph;
		uint32_t daddr = get_unaligned((uint32_t *)&ipv4h->daddr);

		if (daddr == IPUTIL_V4_ADDR_SSDP) {
			return 1;
		}
	}

	return 0;
}

#ifdef CONFIG_IPV6
/*
 * IPv6 SSDP is 0xff0?::c
 */
static inline int iputil_is_v6_ssdp(const unsigned char *dest, const struct ipv6hdr *ipv6h)
{
	static const uint8_t ssdp6_addr[ETH_ALEN] = {0x33, 0x33, 0x00, 0x00, 0x00, 0x0c};
	const struct in6_addr *ipaddr = &ipv6h->daddr;

	return ((memcmp(dest, &ssdp6_addr, sizeof(ssdp6_addr)) == 0) &&
		(((get_unaligned(&ipaddr->in6_u.u6_addr32[0])) & 0xfff0ffff) == __constant_htonl(0xff000000)) &&
		(get_unaligned(&ipaddr->in6_u.u6_addr32[1]) == 0) &&
		(get_unaligned(&ipaddr->in6_u.u6_addr32[2]) == 0) &&
		(get_unaligned(&ipaddr->in6_u.u6_addr32[3]) == __constant_htonl(0xc)));
}
#endif

static inline int iputil_is_ssdp(const void *addr, const void *iph)
{
	if (iputil_is_v4_ssdp(addr, iph)) {
		return 1;
	}

#ifdef CONFIG_IPV6
	if (unlikely(iputil_is_v6_ssdp(addr, iph))) {
		return 1;
	}
#endif
	return 0;
}

#ifdef CONFIG_IPV6
static inline
void iputil_in6_addr_copy(struct in6_addr *dst, const struct in6_addr *src)
{
	memcpy(dst, src, sizeof(*dst));
}

/*
 * IPv6 all-nodes multicast address
 * the link-local scope address to reach all nodes is 0xff02::1
 */
static inline int iputil_ipv6_is_ll_all_nodes_mc(const unsigned char *dest, void *iph)
{
	struct ipv6hdr *ipv6h = (struct ipv6hdr *)iph;
	static const uint8_t ll_all_nodes_mac_addr[ETH_ALEN] = {0x33, 0x33, 0x00, 0x00, 0x00, 0x01};
	struct in6_addr *ipaddr = &ipv6h->daddr;

	return ((memcmp(dest, ll_all_nodes_mac_addr, sizeof(ll_all_nodes_mac_addr)) == 0) &&
		(get_unaligned(&ipaddr->in6_u.u6_addr32[0]) == __constant_htonl(0xff020000)) &&
		(get_unaligned(&ipaddr->in6_u.u6_addr32[1]) == 0) &&
		(get_unaligned(&ipaddr->in6_u.u6_addr32[2]) == 0) &&
		(get_unaligned(&ipaddr->in6_u.u6_addr32[3]) == __constant_htonl(0x1)));
}
#endif

/* Check for a local network control block MAC address */
static inline int iputil_is_lncb(const uint8_t *addr, const void *iph)
{
	static const char lncb_addr[] = {0x01, 0x00, 0x5E, 0x00, 0x00};

	if (unlikely(!memcmp(addr, lncb_addr, sizeof(lncb_addr)))) {
		const struct iphdr *ipv4h = iph;
		uint32_t daddr = get_unaligned((uint32_t *)&ipv4h->daddr);

		return IPUTIL_V4_ADDR_LNCB(daddr);
	}

#ifdef CONFIG_IPV6
	{
		static const char ipmc6_addr[] = {0x33, 0x33};

		if (unlikely(!memcmp(addr, ipmc6_addr, sizeof(ipmc6_addr)))) {
			const struct ipv6hdr *ipv6h = iph;
			uint32_t daddr = get_unaligned((uint32_t *)ipv6h->daddr.s6_addr32);

			return IPUTIL_V6_ADDR_LNCB(daddr);
		}
	}
#endif

	return 0;
}

static inline int iputil_is_multicast(void *iph)
{
	const struct iphdr *ipv4h = iph;

	if (ipv4h->version == 4) {
		uint32_t daddr = get_unaligned((uint32_t *)&ipv4h->daddr);

		return IPUTIL_V4_ADDR_MULTICAST(daddr);
	}

#ifdef CONFIG_IPV6
	if (ipv4h->version == 6) {
		struct ipv6hdr *ipv6h = iph;
		__be32 daddr = get_unaligned(ipv6h->daddr.s6_addr32);

		return IPUTIL_V6_ADDR_MULTICAST(daddr);
	}
#endif
	return 0;
}

static inline size_t iputil_hdrlen(void *iph, uint32_t data_len)
{
	const struct iphdr *ipv4h = iph;
#ifdef CONFIG_IPV6
	const struct ipv6hdr *ip6hdr_p = iph;
	uint8_t nexthdr;
	int nhdr_off;
#endif

	if (likely(ipv4h->version == 4)) {
		return (ipv4h->ihl << 2);
	}

#ifdef CONFIG_IPV6
	/*
	 * This is the base IPv6 header. If the next header is an option header, its length must be
	 * accounted for explicitly elsewhere.
	 */
	if (ipv4h->version == 6) {
		nhdr_off = iputil_v6_skip_exthdr(ip6hdr_p,
			sizeof(struct ipv6hdr),
			&nexthdr, data_len, NULL, NULL);
		return nhdr_off;
	}
#endif
	return 0;
}

static inline int iputil_mac_is_v6_multicast(const uint8_t *mac)
{
	const char ipmc6_addr[] = {0x33, 0x33};

	return mac[0] == ipmc6_addr[0] &&
		mac[1] == ipmc6_addr[1];
}

static inline int iputil_mac_is_v4_multicast(const uint8_t *mac)
{
	const char ipmc4_addr[] = {0x01, 0x00, 0x5E};

	return mac[0] == ipmc4_addr[0] &&
		mac[1] == ipmc4_addr[1] &&
		mac[2] == ipmc4_addr[2];
}

static inline int iputil_eth_is_type(const struct ether_header *eh, const uint16_t ether_type)
{
	if (eh->ether_type == __constant_htons(ETH_P_8021Q)) {
		return (*(&eh->ether_type + 2) == ether_type);
	}

	return (eh->ether_type == ether_type);
}

static inline int iputil_eth_is_v6_multicast(const struct ether_header *eh)
{

	return iputil_eth_is_type(eh, __constant_htons(ETH_P_IPV6)) &&
		iputil_mac_is_v6_multicast(eh->ether_dhost);
}

static inline int iputil_eth_is_v4_multicast(const struct ether_header *eh)
{
	return iputil_eth_is_type(eh, __constant_htons(ETH_P_IP)) &&
		iputil_mac_is_v4_multicast(eh->ether_dhost);
}

static inline int iputil_eth_is_multicast(const struct ether_header *eh)
{
	if (iputil_eth_is_v4_multicast(eh)) {
		return 1;
	}

#ifdef CONFIG_IPV6
	if (iputil_eth_is_v6_multicast(eh)) {
		return 1;
	}
#endif
	return 0;
}

static inline int iputil_eth_is_ipv4or6(uint16_t ether_type)
{
	return ether_type == __constant_htons(ETH_P_IP) ||
		ether_type == __constant_htons(ETH_P_IPV6);
}

/* Multicast data traffic, with the most common types of non-streaming mc filtered out */
static inline int iputil_is_mc_data(const struct ether_header *eh, void *iph)
{
	return iputil_eth_is_multicast(eh) &&
		!iputil_is_lncb(eh->ether_dhost, iph) &&
		!iputil_is_ssdp(eh->ether_dhost, iph);
}

uint8_t iputil_proto_info(void *iph, void *data,
	void **proto_data, uint32_t *ip_id, uint8_t *more_frags);

static inline struct igmphdr *iputil_igmp_hdr(struct iphdr *p_iphdr)
{
	return (struct igmphdr *)((unsigned int*)p_iphdr + p_iphdr->ihl);
}

struct dhcp_message {
	uint8_t op;
	uint8_t htype;
	uint8_t hlen;
	uint8_t hops;
	uint32_t xid;
	uint16_t secs;
	uint16_t flags;
	uint32_t ciaddr;
	uint32_t yiaddr;
	uint32_t siaddr;
	uint32_t giaddr;
	uint8_t chaddr[16];
	uint8_t sname[64];
	uint8_t file[128];
	uint32_t cookie;
	uint8_t options[0];
}__attribute__ ((packed));

#define DHCPSERVER_PORT		67
#define DHCPCLIENT_PORT		68

#define DHCPV6SERVER_PORT	547
#define DHCPV6CLIENT_PORT	546

#define BOOTREQUEST		1
#define DHCPREQUEST		3
#define ARPHRD_ETHER		1
#define DHCP_BROADCAST_FLAG	0x8000

#endif
