
/*
 *
 *  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 __MODULE_WIFI__
#define __MODULE_WIFI__
#include "itf.h"

#define WIFI_FF_SYSCTL_PATH "/proc/sys/net/"
#define WIFI_FF_SYSCTL_ENTRY "wifi_fast_path_enable"

typedef struct vwd_cmd_s {
	int32_t		action;
	int32_t		ifindex;
	int16_t		vap_id;
	uint16_t	cmd_flags;
#define VWD_CMD_ENABLE_DIRECT_PATH_RX (1 << 0)
#define VWD_CMD_ENABLE_DIRECT_PATH_TX (1 << 1)
	char		ifname[12];
	u_int8_t	macaddr[6];
} __attribute__((__packed__)) vwd_cmd_t;

void __cmmGetWiFi(int fd, struct interface *itf);
struct interface *cmmFeWiFiGetRootIf();
int cmmFeWiFiUpdate(FCI_CLIENT *fci_handle, int fd, int request, struct interface *itf);
int cmmFeWiFiEnable( FCI_CLIENT *fci_handle, int fd, struct interface *witf );
int cmmFeWiFiDisable( FCI_CLIENT *fci_handle, int fd, struct interface *itf );
int cmmFeWiFiBridgeUpdate( FCI_CLIENT *fci_handle, int fd, int request, struct interface *bitf);
void cmmWiFiReset(FCI_CLIENT *fci_handle);

#endif //__MODULE_WIFI__
