#ifndef __CMM_ITF_H
#define __CMM_ITF_H

#include <stdio.h>
#include <libfci.h>
#include <netinet/ip.h>
#include <net/ethernet.h>
#include <linux/ip6_tunnel.h>
#include <linux/if_tunnel.h>

#include "rtnl.h"
#include "list.h"

#ifdef COMCERTO_2000
#define GEM_PORTS 3
#else
#define GEM_PORTS 2
#endif

/* default value for WAN interface is eth0, and LAN interface is eth2 */
#define GEMAC0_PORT	0 //do not change !
#define GEMAC1_PORT	1 //do not change !
#define GEMAC2_PORT	2 //do not change !

struct gemac_port {
	char ifname[12];
	char logical_name[12];
	int  type;
	int  ifindex;
	int  port_id;
	int  enable;
};

#define GEMAC_PORT_TYPE_LAN	0x0
#define GEMAC_PORT_TYPE_WAN	0x1

#define LO_INTERFACE_NAME	"lo"

#ifdef WIFI_ENABLE
#define WIFI_PORT0	GEM_PORTS //do not change !
#endif

extern struct gemac_port port_table[GEM_PORTS];
static inline int is_wan_port_ifindex(int ifindex)
{
	int ii;

	for (ii = 0; ii < GEM_PORTS; ii++)
		if ((port_table[ii].ifindex == ifindex) && (port_table[ii].type == GEMAC_PORT_TYPE_WAN))
			return 1;

	return 0;
}

static inline int is_wan_port_id(int port_id)
{
	int ii;

	for (ii = 0; ii < GEM_PORTS; ii++)
		if ((port_table[ii].port_id == port_id) && (port_table[ii].type == GEMAC_PORT_TYPE_WAN))
			return 1;
	return 0;
}

static inline void print_all_gemac_ports(char *buf, int buf_len)
{
	int len = 0, ii;

	for (ii = 0; ii < GEM_PORTS; ii++){

		if (!port_table[ii].enable)
			continue;

		len += snprintf(&buf[len], buf_len, "%s|", port_table[ii].ifname);
		buf_len = buf_len > len ? buf_len - len : 0;
	}

	for (ii = 0; ii < GEM_PORTS; ii++) {

		if (!port_table[ii].enable)
			continue;

		len += snprintf(&buf[len], buf_len, "%s|", port_table[ii].logical_name);
		buf_len = buf_len > len ? buf_len - len : 0;
	}

	buf[strlen(buf) - 1] = '\0';
}

static inline int get_port_id(char *name)
{
	int ii;

	for (ii = 0; ii < GEM_PORTS; ii++)
	{
		if (!port_table[ii].enable)
			continue;

		if (!strcmp(name, port_table[ii].ifname) || !strcmp(name, port_table[ii].logical_name))
			return port_table[ii].port_id;
	}

	return -1;
}

static inline int get_port_ifindex(char *name)
{
	int ii;

	for (ii = 0; ii < GEM_PORTS; ii++)
	{
		if (!strcmp(name, port_table[ii].ifname) || !strcmp(name, port_table[ii].logical_name))
			return port_table[ii].ifindex;
	}

	return -1;
}

static inline char *get_port_name(int port_id, char *buf, int buf_size)
{
	int ii;

	buf[0] = '\0';

	for (ii = 0; ii < GEM_PORTS; ii++)
	{
		if (!port_table[ii].enable)
			continue;

		if (port_table[ii].port_id == port_id)
			snprintf(buf, buf_size, "%s",  port_table[ii].ifname);
	}

	return buf;
}

#define ITF_HASH_TABLE_SIZE	64
#define MAX_BRIDGES	64
#define MAX_PORTS	64

#define ITF_BRIDGE		(1 << 0)
#define ITF_VLAN		(1 << 1)
#define ITF_BRIDGED		(1 << 2)
#define ITF_TUNNEL		(1 << 3)
#define ITF_PPPOE_SESSION_UP    (1 << 4)
#define ITF_PPPOE_AUTO_MODE     (1 << 5)
#define ITF_MACVLAN 	(1 << 6)
#ifdef WIFI_ENABLE
#define ITF_WIFI	(1 << 7)
#endif
#define ITF_L2TP	(1 << 8)

#ifndef SAM_LEGACY

#ifndef RTM_NEW4RD
#define RTM_NEW4RD 80 /* If RTM_NEW4RD is not defined we can safely assume that RTM_DEL4RD and RTM_GET4RD will also not be defined */
#define RTM_DEL4RD 81
#define RTM_GET4RD 82
struct ip6_4rd_map_msg {
	__u32 reset;
	__u32 ifindex;
	__be32 prefix;
	__u16 prefixlen;
	struct in6_addr relay_prefix;
	struct in6_addr relay_suffix;
	__u16 relay_prefixlen;
	__u16 relay_suffixlen;
	__u16 psid_offsetlen;
	__u16 eabit_len;
	__u16 entry_num;
};
#endif
#endif

#define INFO_KIND_MACVLAN_STR_LEN 7
#define INFO_KIND_MACVLAN_STR     "macvlan"

#ifndef SIOCGET6RD
#define SIOCGET6RD	(SIOCDEVPRIVATE + 8)

struct ip_tunnel_6rd {
	struct in6_addr		prefix;
	u_int32_t		relay_prefix;
	u_int16_t		prefixlen;
	u_int16_t		relay_prefixlen;
};
#endif

struct l2tp_itf_info {
	u_int16_t local_tun_id;
	u_int16_t peer_tun_id;
	u_int16_t local_ses_id;
	u_int16_t peer_ses_id;
	u_int16_t options;
	struct socket *sock;
};

struct interface_addr {
	struct list_head list;
	unsigned int address[4];
	unsigned short len;
	int family;
	unsigned char scope;
	unsigned char prefixlen;
};

struct interface {
	struct list_head list;

	/* netlink address information */
	struct list_head addr_list;

	char ifname[IFNAMSIZ];

	/* netlink link information */
	int ifindex;
	unsigned char macaddr[ETH_ALEN];
	int macaddr_len;
	unsigned short type;	/* ARPHRD_* */
	unsigned ifi_flags;	/* IFF_* flags */
	unsigned int mtu;

	/* cmm information */
	unsigned int itf_flags; /* bit field with ITF_xxx flags */

	int phys_ifindex;	/* physical interface index, if vlan/pppoe */

	u_int16_t session_id; /* session id if pppoe interface */
	unsigned char dst_macaddr[ETH_ALEN]; /* peer mac address if pppoe interface */

	u_int16_t vlan_id;	/* vlan id if vlan interface */

	int ifindices[MAX_PORTS];	/* list of bridge ports if bridge interface */

	struct ct_route rt;		/* Route information if tunnel interface */

	struct FlowEntry *flow_orig;	/* Flow information if tunnel interface */
	struct FlowEntry *flow_rep;	/* Flow information if tunnel interface */
	union {
		struct ip6_tnl_parm tunnel_parm6;
		struct ip_tunnel_parm tunnel_parm4;
	};
	struct ip_tunnel_6rd tunnel_parm6rd;

	int tunnel_flags;
	int tunnel_family;
	int tunnel_enabled;

	int count;
	int flags;
#ifdef WIFI_ENABLE
	struct wifi_ff_entry *wifi_if;
#endif
#ifdef SAM_LEGACY
	u_int16_t sam_enable;
#else
	struct list_head mr_list; /* netlink mapping rule information */
#endif
	/* If L2TP interface */
	struct l2tp_itf_info l2tp;
};

struct interface_table {
	pthread_mutex_t lock;
	struct list_head hash[ITF_HASH_TABLE_SIZE];
	FILE *fp;
	int fd;
	struct rtnl_handle rth;
	FCI_CLIENT *fci_handle;
	FCI_CLIENT *fci_key_handle;
};

extern struct interface_table itf_table;
extern int LO_IFINDEX;
struct gemac_port ;

struct interface *__itf_get(int ifindex);
void __itf_put(struct interface *itf);
struct interface *__itf_find(int ifindex);

int itf_table_init(struct interface_table *ctx);
int itf_get_ipaddr(int ifindex, int family, unsigned char scope, unsigned int *ipaddr, unsigned int *target);
int __itf_get_macaddr(struct interface *itf, unsigned char *macaddr);
int itf_get_macaddr(int ifindex, unsigned char *macaddr);
int __itf_get_mtu(int ifindex);
int ____itf_get_name(struct interface *itf, char *ifname, int len);
int __itf_get_name(int ifindex, char *ifname, int len);
int __itf_is_bridge(int ifindex);
int __itf_is_vlan(struct interface *itf);
int __itf_is_macvlan(struct interface *itf);
int __itf_is_pointopoint(struct interface *itf);
int __itf_is_pppoe(struct interface *itf);
int __itf_is_noarp(int ifindex);
int __itf_is_up(struct interface *itf);
int __itf_is_tunnel(struct interface *itf);
int __itf_is_l2tp(struct interface *itf);
int __itf_get_from_bridge_port(int ifindex, int port);
int __itf_is_programmed(int ifindex);
int itf_is_programmed(int ifindex);
 int ____itf_is_4o6_tunnel(struct interface *itf);
int ____itf_is_floating_sit_tunnel(struct interface *itf);
int __itf_is_floating_sit_tunnel(int ifindex);
int itf_name_update(FCI_CLIENT *fci_handle, struct gemac_port *port);

int cmmRtnlLink(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg);
int cmmRtnlIfAddr(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg);

#ifdef WIFI_ENABLE
int __itf_is_wifi_ff_if(struct interface *itf);
int __itf_is_wifi(struct interface *itf);
#endif
static inline u_int32_t HASH_ITF(int ifindex)
{
	return ifindex & (ITF_HASH_TABLE_SIZE - 1);
}
#endif /* __CMM_ITF_H */
