/*    
 *
 *  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 _FCI_H
#define _FCI_H

/*
* Prototypes
*/

/* FPP Forward Engine API*/
extern int comcerto_fpp_send_command(unsigned short fcode, unsigned short length, unsigned short *payload, unsigned short *, unsigned short *);
extern int comcerto_fpp_register_event_cb(void *cb);

/*
* Debug macros
*/

#define FCI_PRINT	0
#define FCI_INIT	0
#define FCI_STAT	0
#define FCI_OUTBOUND	0
#define FCI_INBOUND	0
#define FCI_DUMP	0
#define FCI_NL		0
#define FCI_ACK		0

#ifdef FCI_PRINT
#define FCI_PRINTK(type, info, args...) do {if(type) printk(KERN_DEBUG info, ## args);} while(0);
#else
#define FCI_PRINTK(type, info, args...) do {} while(0);
#endif

/* Supported netlink protocol type NETLINK_FF */
#define FCI_NL_FF		0
#define FCI_MAX_PROTO		1

/* Netlink multicast groups supported by FCI */
#define NL_FF_GROUP	1

/* FCI message definitions*/
#define FCI_MSG_MAX_PAYLOAD	256
#define FCI_MSG_HDR_SIZE 	4 /* fcode + length */
#define FCI_MSG_SIZE		(FCI_MSG_MAX_PAYLOAD + FCI_MSG_HDR_SIZE)

/*
* Structures
*
*/
typedef struct t_FCI_MSG
{
	/* message data */
	u16 fcode;
	u16 length;
	u16 payload[(FCI_MSG_MAX_PAYLOAD / sizeof(u16))];
} FCI_MSG;


typedef struct t_FCI_SOCK_STATS
{
	unsigned long tx_msg;
	unsigned long rx_msg;
	unsigned long tx_msg_err;
	unsigned long rx_msg_err;
} FCI_SOCK_STATS;


typedef struct t_FCI_STATS
{
	/* Globlas Statistics*/
	unsigned long tx_msg;
	unsigned long rx_msg;
	unsigned long tx_msg_err;
	unsigned long rx_msg_err;
	unsigned long mem_alloc_err;
	unsigned long kernel_create_err;
	unsigned long unknown_sock_type;
	/* Per socket type statistics*/
	FCI_SOCK_STATS sock_stats[FCI_MAX_PROTO];
} FCI_STATS;


typedef struct t_FCI
{
	struct sock *fci_nl_sock[FCI_MAX_PROTO];
	FCI_STATS stats;
} FCI;



#endif /* _FCI_H */
