Commit 90e8eafc authored by Luis Carlos Cobo's avatar Luis Carlos Cobo Committed by John W. Linville

[PATCH] libertas: updated mesh commands for 5.220.9.p11

Updated commands fwt_add and fwt_list, bt_list.
New commands: bt_get_invert, bt_set_invert, to invert the blinding table,
i.e., receive only frames from nodes listed in the BT.

This patch needs/is needed for firmware 5.220.9.p11.
Signed-off-by: default avatarLuis Carlos Cobo <luisca@cozybit.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 7db283c9
...@@ -861,6 +861,11 @@ static int wlan_cmd_bt_access(wlan_private * priv, ...@@ -861,6 +861,11 @@ static int wlan_cmd_bt_access(wlan_private * priv,
break; break;
case cmd_act_bt_access_reset: case cmd_act_bt_access_reset:
break; break;
case cmd_act_bt_access_set_invert:
bt_access->id = cpu_to_le32(*(u32 *) pdata_buf);
break;
case cmd_act_bt_access_get_invert:
break;
default: default:
break; break;
} }
......
...@@ -374,6 +374,8 @@ enum SNMP_MIB_VALUE_e { ...@@ -374,6 +374,8 @@ enum SNMP_MIB_VALUE_e {
/* Default values for fwt commands. */ /* Default values for fwt commands. */
#define FWT_DEFAULT_METRIC 0 #define FWT_DEFAULT_METRIC 0
#define FWT_DEFAULT_DIR 1 #define FWT_DEFAULT_DIR 1
/* Default Rate, 11Mbps */
#define FWT_DEFAULT_RATE 3
#define FWT_DEFAULT_SSN 0xffffffff #define FWT_DEFAULT_SSN 0xffffffff
#define FWT_DEFAULT_DSN 0 #define FWT_DEFAULT_DSN 0
#define FWT_DEFAULT_HOPCOUNT 0 #define FWT_DEFAULT_HOPCOUNT 0
......
...@@ -287,7 +287,9 @@ enum cmd_bt_access_opts { ...@@ -287,7 +287,9 @@ enum cmd_bt_access_opts {
cmd_act_bt_access_add = 5, cmd_act_bt_access_add = 5,
cmd_act_bt_access_del, cmd_act_bt_access_del,
cmd_act_bt_access_list, cmd_act_bt_access_list,
cmd_act_bt_access_reset cmd_act_bt_access_reset,
cmd_act_bt_access_set_invert,
cmd_act_bt_access_get_invert
}; };
/* Define action or option for cmd_fwt_access */ /* Define action or option for cmd_fwt_access */
......
...@@ -607,18 +607,21 @@ struct cmd_ds_bt_access { ...@@ -607,18 +607,21 @@ struct cmd_ds_bt_access {
struct cmd_ds_fwt_access { struct cmd_ds_fwt_access {
u16 action; u16 action;
u32 id; u32 id;
u8 valid;
u8 da[ETH_ALEN]; u8 da[ETH_ALEN];
u8 dir; u8 dir;
u8 ra[ETH_ALEN]; u8 ra[ETH_ALEN];
u32 ssn; u32 ssn;
u32 dsn; u32 dsn;
u32 metric; u32 metric;
u8 rate;
u8 hopcount; u8 hopcount;
u8 ttl; u8 ttl;
u32 expiration; u32 expiration;
u8 sleepmode; u8 sleepmode;
u32 snr; u32 snr;
u32 references; u32 references;
u8 prec[ETH_ALEN];
} __attribute__ ((packed)); } __attribute__ ((packed));
struct cmd_ds_mesh_access { struct cmd_ds_mesh_access {
......
...@@ -241,7 +241,7 @@ static int wlan_bt_list_ioctl(wlan_private * priv, struct ifreq *req) ...@@ -241,7 +241,7 @@ static int wlan_bt_list_ioctl(wlan_private * priv, struct ifreq *req)
if (ret == 0) { if (ret == 0) {
addr1 = param.addr1addr2; addr1 = param.addr1addr2;
pos = sprintf(pbuf, "ignoring traffic from "); pos = sprintf(pbuf, "BT includes node ");
pbuf += pos; pbuf += pos;
pos = eth_addr2str(addr1, pbuf); pos = eth_addr2str(addr1, pbuf);
pbuf += pos; pbuf += pos;
...@@ -257,6 +257,64 @@ static int wlan_bt_list_ioctl(wlan_private * priv, struct ifreq *req) ...@@ -257,6 +257,64 @@ static int wlan_bt_list_ioctl(wlan_private * priv, struct ifreq *req)
return -EFAULT; return -EFAULT;
} }
lbs_deb_leave(LBS_DEB_IOCTL);
return 0 ;
}
/**
* @brief Sets inverted state of blacklist (non-zero if inverted)
* @param priv A pointer to wlan_private structure
* @param req A pointer to ifreq structure
* @return 0 --success, otherwise fail
*/
static int wlan_bt_set_invert_ioctl(wlan_private * priv, struct ifreq *req)
{
int ret;
struct iwreq *wrq = (struct iwreq *)req;
union {
int id;
char addr1addr2[2 * ETH_ALEN];
} param;
lbs_deb_enter(LBS_DEB_IOCTL);
param.id = SUBCMD_DATA(wrq) ;
ret = libertas_prepare_and_send_command(priv, cmd_bt_access,
cmd_act_bt_access_set_invert,
cmd_option_waitforrsp, 0,
(char *)&param);
if (ret != 0)
return -EFAULT;
lbs_deb_leave(LBS_DEB_IOCTL);
return 0;
}
/**
* @brief Gets inverted state of blacklist (non-zero if inverted)
* @param priv A pointer to wlan_private structure
* @param req A pointer to ifreq structure
* @return 0 --success, otherwise fail
*/
static int wlan_bt_get_invert_ioctl(wlan_private * priv, struct ifreq *req)
{
int ret;
union {
int id;
char addr1addr2[2 * ETH_ALEN];
} param;
lbs_deb_enter(LBS_DEB_IOCTL);
ret = libertas_prepare_and_send_command(priv, cmd_bt_access,
cmd_act_bt_access_get_invert,
cmd_option_waitforrsp, 0,
(char *)&param);
if (ret == 0)
req->ifr_data = (char *)(le32_to_cpu(param.id));
else
return -EFAULT;
lbs_deb_leave(LBS_DEB_IOCTL); lbs_deb_leave(LBS_DEB_IOCTL);
return 0; return 0;
} }
...@@ -313,6 +371,11 @@ static int wlan_fwt_add_ioctl(wlan_private * priv, struct ifreq *req) ...@@ -313,6 +371,11 @@ static int wlan_fwt_add_ioctl(wlan_private * priv, struct ifreq *req)
else else
fwt_access.dir = FWT_DEFAULT_DIR; fwt_access.dir = FWT_DEFAULT_DIR;
if ((ptr = next_param(ptr)))
fwt_access.rate = (u8) simple_strtoul(ptr, &ptr, 10);
else
fwt_access.rate = FWT_DEFAULT_RATE;
if ((ptr = next_param(ptr))) if ((ptr = next_param(ptr)))
fwt_access.ssn = fwt_access.ssn =
cpu_to_le32(simple_strtoul(ptr, &ptr, 10)); cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
...@@ -441,15 +504,18 @@ static void print_route(struct cmd_ds_fwt_access fwt_access, char *buf) ...@@ -441,15 +504,18 @@ static void print_route(struct cmd_ds_fwt_access fwt_access, char *buf)
buf += eth_addr2str(fwt_access.da, buf); buf += eth_addr2str(fwt_access.da, buf);
buf += sprintf(buf, " "); buf += sprintf(buf, " ");
buf += eth_addr2str(fwt_access.ra, buf); buf += eth_addr2str(fwt_access.ra, buf);
buf += sprintf(buf, " %u", fwt_access.valid);
buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.metric)); buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.metric));
buf += sprintf(buf, " %u", fwt_access.dir); buf += sprintf(buf, " %u", fwt_access.dir);
buf += sprintf(buf, " %u", fwt_access.rate);
buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.ssn)); buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.ssn));
buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.dsn)); buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.dsn));
buf += sprintf(buf, " %u", fwt_access.hopcount); buf += sprintf(buf, " %u", fwt_access.hopcount);
buf += sprintf(buf, " %u", fwt_access.ttl); buf += sprintf(buf, " %u", fwt_access.ttl);
buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.expiration)); buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.expiration));
buf += sprintf(buf, " %u", fwt_access.sleepmode); buf += sprintf(buf, " %u", fwt_access.sleepmode);
buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.snr)); buf += sprintf(buf, " %u ", le32_to_cpu(fwt_access.snr));
buf += eth_addr2str(fwt_access.prec, buf);
} }
/** /**
...@@ -866,6 +932,10 @@ int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd) ...@@ -866,6 +932,10 @@ int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
ret = wlan_mesh_set_ttl_ioctl(priv, idata); ret = wlan_mesh_set_ttl_ioctl(priv, idata);
break; break;
case WLAN_SUBCMD_BT_SET_INVERT:
ret = wlan_bt_set_invert_ioctl(priv, req);
break ;
default: default:
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
break; break;
...@@ -923,6 +993,10 @@ int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd) ...@@ -923,6 +993,10 @@ int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
ret = wlan_mesh_get_ttl_ioctl(priv, req); ret = wlan_mesh_get_ttl_ioctl(priv, req);
break; break;
case WLAN_SUBCMD_BT_GET_INVERT:
ret = wlan_bt_get_invert_ioctl(priv, req);
break ;
default: default:
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
......
...@@ -1066,6 +1066,16 @@ static const struct iw_priv_args wlan_private_args[] = { ...@@ -1066,6 +1066,16 @@ static const struct iw_priv_args wlan_private_args[] = {
IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR | 128,
IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR | 128,
"bt_list"}, "bt_list"},
{
WLAN_SUBCMD_BT_SET_INVERT,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
IW_PRIV_TYPE_NONE,
"bt_set_invert"},
{
WLAN_SUBCMD_BT_GET_INVERT,
IW_PRIV_TYPE_NONE,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
"bt_get_invert"},
/* FWT Management */ /* FWT Management */
{ {
WLAN_SUBCMD_FWT_ADD, WLAN_SUBCMD_FWT_ADD,
......
...@@ -20,21 +20,23 @@ ...@@ -20,21 +20,23 @@
#define WLAN_SUBCMD_FWT_CLEANUP 15 #define WLAN_SUBCMD_FWT_CLEANUP 15
#define WLAN_SUBCMD_FWT_TIME 16 #define WLAN_SUBCMD_FWT_TIME 16
#define WLAN_SUBCMD_MESH_GET_TTL 17 #define WLAN_SUBCMD_MESH_GET_TTL 17
#define WLAN_SUBCMD_BT_GET_INVERT 18
#define WLAN_SETONEINT_GETNONE (WLANIOCTL + 24) #define WLAN_SETONEINT_GETNONE (WLANIOCTL + 24)
#define WLANSETREGION 8 #define WLANSETREGION 8
#define WLAN_SUBCMD_MESH_SET_TTL 18 #define WLAN_SUBCMD_MESH_SET_TTL 18
#define WLAN_SUBCMD_BT_SET_INVERT 19
#define WLAN_SET128CHAR_GET128CHAR (WLANIOCTL + 25) #define WLAN_SET128CHAR_GET128CHAR (WLANIOCTL + 25)
#define WLAN_SUBCMD_BT_ADD 18 #define WLAN_SUBCMD_BT_ADD 18
#define WLAN_SUBCMD_BT_DEL 19 #define WLAN_SUBCMD_BT_DEL 19
#define WLAN_SUBCMD_BT_LIST 20 #define WLAN_SUBCMD_BT_LIST 20
#define WLAN_SUBCMD_FWT_ADD 21 #define WLAN_SUBCMD_FWT_ADD 21
#define WLAN_SUBCMD_FWT_DEL 22 #define WLAN_SUBCMD_FWT_DEL 22
#define WLAN_SUBCMD_FWT_LOOKUP 23 #define WLAN_SUBCMD_FWT_LOOKUP 23
#define WLAN_SUBCMD_FWT_LIST_NEIGHBOR 24 #define WLAN_SUBCMD_FWT_LIST_NEIGHBOR 24
#define WLAN_SUBCMD_FWT_LIST 25 #define WLAN_SUBCMD_FWT_LIST 25
#define WLAN_SUBCMD_FWT_LIST_ROUTE 26 #define WLAN_SUBCMD_FWT_LIST_ROUTE 26
#define WLAN_SET_GET_SIXTEEN_INT (WLANIOCTL + 29) #define WLAN_SET_GET_SIXTEEN_INT (WLANIOCTL + 29)
#define WLAN_LED_GPIO_CTRL 5 #define WLAN_LED_GPIO_CTRL 5
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment