/*
 * ffcontrol.c: Fast Forward Control
 *
 *	Copyright (C) 2007 Mindspeed Technologies, Inc.
 *
 * 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.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
#ifndef __FFCONTROL_H__
#define __FFCONTROL_H__

	#define CONF_FILE_PATH	"/etc/config/fastforward"


	#define ATTR_ORIG_PORT_SRC_STR "orig_src_port"
	#define ATTR_ORIG_PORT_DST_STR "orig_dst_port"
	#define ATTR_REPL_PORT_SRC_STR "repl_src_port"
	#define ATTR_REPL_PORT_DST_STR "repl_dst_port"
	#define ATTR_ORIG_IPV4_SRC_STR "orig_src_ipv4"
	#define ATTR_ORIG_IPV4_DST_STR "orig_dst_ipv4"
	#define ATTR_REPL_IPV4_SRC_STR "repl_src_ipv4"
	#define ATTR_REPL_IPV4_DST_STR "repl_dst_ipv4"
	#define ATTR_ORIG_IPV6_SRC_STR "orig_src_ipv6"
	#define ATTR_ORIG_IPV6_DST_STR "orig_dst_ipv6"
	#define ATTR_REPL_IPV6_SRC_STR "repl_src_ipv6"
	#define ATTR_REPL_IPV6_DST_STR "repl_dst_ipv6"
	#define ATTR_MARK_STR "mark"
	#define ATTR_PROTO_STR "proto"
	#define ATTR_L3_PROTO_STR "l3 proto"


	typedef struct denyRule {
		struct denyRule * next;

		int type;					/*Netfilter attribut*/
		int value;					/*Value of the attribut*/
		int width;			/* 8, 16, 32 bits */
		int mask;
		struct in6_addr valueIpV6 ;
	} *denyRule_t, denyRule;

 	struct denyRuleList {
		struct denyRuleList * next;
		char name[20];
		denyRule_t rule;
	};

	struct cmm_cli;

	typedef struct asymFFRule {
		struct asymFFRule * next;

		int type;			/*Netfilter attribut*/
		int value;			/*Value of the attribut*/
		char strValue[16];		/*Value of the non-numerical atribute*/
		int width;			/* 8, 16, 32 bits */
		int mask;
	} *asymFFRule_t, asymFFRule;

	struct asymFFRuleList {
		struct asymFFRuleList * next;
		char name[20];
		asymFFRule_t rule;
	};

	int cmmFcIsConntrackAsymFastForwarded(struct nf_conntrack *ct);
	int cmmFcIsConntrack4Allowed(FCI_CLIENT *fci_handle, struct nf_conntrack *ct, struct RtEntry **rtEntryOrig);
	int cmmFcIsConntrack6Allowed(FCI_CLIENT *fci_handle, struct nf_conntrack * ct, struct RtEntry **rtEntryOrig);

	int cmmFcParser(char *confFilePath);
	int cmmCliInit(struct cmm_cli *ctx);
	void cmmCliExit(struct cmm_cli *ctx);

	int cmmFFControlProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
	int cmmIPsecSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);

static inline int cmmFcIsConntrackAllowed(FCI_CLIENT *fci_handle, struct nf_conntrack *ct, struct RtEntry **rtEntryOrig)
{
	if (nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO) == AF_INET)
		return cmmFcIsConntrack4Allowed(fci_handle, ct, rtEntryOrig);
	else
		return cmmFcIsConntrack6Allowed(fci_handle, ct, rtEntryOrig);
}

#ifdef WIFI_ENABLE
#define MAX_WIFI_FF_IFS 8	

struct wifi_ff_entry
{
	char   ifname[IFNAMSIZ];
	unsigned char   macaddr[6];
	unsigned short  used;
	unsigned int    vapid;
	unsigned int    direct_path_rx;
	struct interface *wifi_ff_if;
};
#endif

#endif
