Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 203905
b: refs/heads/master
c: 5214865
h: refs/heads/master
i:
  203903: 922ad8b
v: v3
  • Loading branch information
Dan Williams authored and John W. Linville committed Jul 27, 2010
1 parent 6a3af22 commit 46ced96
Show file tree
Hide file tree
Showing 6 changed files with 159 additions and 47 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 4c7c6e00f17365633638848197c44552dd353d49
refs/heads/master: 52148655608b31b7e18325ae7711de3a86466136
4 changes: 0 additions & 4 deletions trunk/drivers/net/wireless/libertas/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1208,10 +1208,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,

#ifdef CONFIG_LIBERTAS_MESH

case CMD_BT_ACCESS:
ret = lbs_cmd_bt_access(cmdptr, cmd_action, pdata_buf);
break;

case CMD_FWT_ACCESS:
ret = lbs_cmd_fwt_access(cmdptr, cmd_action, pdata_buf);
break;
Expand Down
7 changes: 0 additions & 7 deletions trunk/drivers/net/wireless/libertas/cmdresp.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
case CMD_RET(CMD_802_11_BEACON_STOP):
break;

case CMD_RET(CMD_BT_ACCESS):
spin_lock_irqsave(&priv->driver_lock, flags);
if (priv->cur_cmd->callback_arg)
memcpy((void *)priv->cur_cmd->callback_arg,
&resp->params.bt.addr1, 2 * ETH_ALEN);
spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
case CMD_RET(CMD_FWT_ACCESS):
spin_lock_irqsave(&priv->driver_lock, flags);
if (priv->cur_cmd->callback_arg)
Expand Down
3 changes: 2 additions & 1 deletion trunk/drivers/net/wireless/libertas/host.h
Original file line number Diff line number Diff line change
Expand Up @@ -903,6 +903,8 @@ struct cmd_ds_get_tsf {
} __packed;

struct cmd_ds_bt_access {
struct cmd_header hdr;

__le16 action;
__le32 id;
u8 addr1[ETH_ALEN];
Expand Down Expand Up @@ -959,7 +961,6 @@ struct cmd_ds_command {
/* command Body */
union {
struct cmd_ds_802_11_ps_mode psmode;
struct cmd_ds_bt_access bt;
struct cmd_ds_fwt_access fwt;
} params;
} __packed;
Expand Down
182 changes: 150 additions & 32 deletions trunk/drivers/net/wireless/libertas/mesh.c
Original file line number Diff line number Diff line change
Expand Up @@ -455,44 +455,162 @@ void lbs_mesh_set_txpd(struct lbs_private *priv,
* Mesh command handling
*/

int lbs_cmd_bt_access(struct cmd_ds_command *cmd,
u16 cmd_action, void *pdata_buf)
/**
* @brief Add or delete Mesh Blinding Table entries
*
* @param priv A pointer to struct lbs_private structure
* @param add TRUE to add the entry, FALSE to delete it
* @param addr1 Destination address to blind or unblind
*
* @return 0 on success, error on failure
*/
int lbs_mesh_bt_add_del(struct lbs_private *priv, bool add, u8 *addr1)
{
struct cmd_ds_bt_access *bt_access = &cmd->params.bt;
lbs_deb_enter_args(LBS_DEB_CMD, "action %d", cmd_action);
struct cmd_ds_bt_access cmd;
int ret = 0;

cmd->command = cpu_to_le16(CMD_BT_ACCESS);
cmd->size = cpu_to_le16(sizeof(struct cmd_ds_bt_access) +
sizeof(struct cmd_header));
cmd->result = 0;
bt_access->action = cpu_to_le16(cmd_action);
lbs_deb_enter(LBS_DEB_CMD);

BUG_ON(addr1 == NULL);

switch (cmd_action) {
case CMD_ACT_BT_ACCESS_ADD:
memcpy(bt_access->addr1, pdata_buf, 2 * ETH_ALEN);
memset(&cmd, 0, sizeof(cmd));
cmd.hdr.size = cpu_to_le16(sizeof(cmd));
memcpy(cmd.addr1, addr1, ETH_ALEN);
if (add) {
cmd.action = cpu_to_le16(CMD_ACT_BT_ACCESS_ADD);
lbs_deb_hex(LBS_DEB_MESH, "BT_ADD: blinded MAC addr",
bt_access->addr1, 6);
break;
case CMD_ACT_BT_ACCESS_DEL:
memcpy(bt_access->addr1, pdata_buf, 1 * ETH_ALEN);
addr1, ETH_ALEN);
} else {
cmd.action = cpu_to_le16(CMD_ACT_BT_ACCESS_DEL);
lbs_deb_hex(LBS_DEB_MESH, "BT_DEL: blinded MAC addr",
bt_access->addr1, 6);
break;
case CMD_ACT_BT_ACCESS_LIST:
bt_access->id = cpu_to_le32(*(u32 *) pdata_buf);
break;
case CMD_ACT_BT_ACCESS_RESET:
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:
break;
addr1, ETH_ALEN);
}
lbs_deb_leave(LBS_DEB_CMD);
return 0;

ret = lbs_cmd_with_response(priv, CMD_BT_ACCESS, &cmd);

lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
return ret;
}

/**
* @brief Reset/clear the mesh blinding table
*
* @param priv A pointer to struct lbs_private structure
*
* @return 0 on success, error on failure
*/
int lbs_mesh_bt_reset(struct lbs_private *priv)
{
struct cmd_ds_bt_access cmd;
int ret = 0;

lbs_deb_enter(LBS_DEB_CMD);

memset(&cmd, 0, sizeof(cmd));
cmd.hdr.size = cpu_to_le16(sizeof(cmd));
cmd.action = cpu_to_le16(CMD_ACT_BT_ACCESS_RESET);

ret = lbs_cmd_with_response(priv, CMD_BT_ACCESS, &cmd);

lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
return ret;
}

/**
* @brief Gets the inverted status of the mesh blinding table
*
* Normally the firmware "blinds" or ignores traffic from mesh nodes in the
* table, but an inverted table allows *only* traffic from nodes listed in
* the table.
*
* @param priv A pointer to struct lbs_private structure
* @param invert On success, TRUE if the blinding table is inverted,
* FALSE if it is not inverted
*
* @return 0 on success, error on failure
*/
int lbs_mesh_bt_get_inverted(struct lbs_private *priv, bool *inverted)
{
struct cmd_ds_bt_access cmd;
int ret = 0;

lbs_deb_enter(LBS_DEB_CMD);

BUG_ON(inverted == NULL);

memset(&cmd, 0, sizeof(cmd));
cmd.hdr.size = cpu_to_le16(sizeof(cmd));
cmd.action = cpu_to_le16(CMD_ACT_BT_ACCESS_GET_INVERT);

ret = lbs_cmd_with_response(priv, CMD_BT_ACCESS, &cmd);
if (ret == 0)
*inverted = !!cmd.id;

lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
return ret;
}

/**
* @brief Sets the inverted status of the mesh blinding table
*
* Normally the firmware "blinds" or ignores traffic from mesh nodes in the
* table, but an inverted table allows *only* traffic from nodes listed in
* the table.
*
* @param priv A pointer to struct lbs_private structure
* @param invert TRUE to invert the blinding table (only traffic from
* listed nodes allowed), FALSE to return it
* to normal state (listed nodes ignored)
*
* @return 0 on success, error on failure
*/
int lbs_mesh_bt_set_inverted(struct lbs_private *priv, bool inverted)
{
struct cmd_ds_bt_access cmd;
int ret = 0;

lbs_deb_enter(LBS_DEB_CMD);

memset(&cmd, 0, sizeof(cmd));
cmd.hdr.size = cpu_to_le16(sizeof(cmd));
cmd.action = cpu_to_le16(CMD_ACT_BT_ACCESS_SET_INVERT);
cmd.id = !!inverted;

ret = lbs_cmd_with_response(priv, CMD_BT_ACCESS, &cmd);

lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
return ret;
}

/**
* @brief List an entry in the mesh blinding table
*
* @param priv A pointer to struct lbs_private structure
* @param id The ID of the entry to list
* @param addr1 MAC address associated with the table entry
*
* @return 0 on success, error on failure
*/
int lbs_mesh_bt_get_entry(struct lbs_private *priv, u32 id, u8 *addr1)
{
struct cmd_ds_bt_access cmd;
int ret = 0;

lbs_deb_enter(LBS_DEB_CMD);

BUG_ON(addr1 == NULL);

memset(&cmd, 0, sizeof(cmd));
cmd.hdr.size = cpu_to_le16(sizeof(cmd));
cmd.action = cpu_to_le16(CMD_ACT_BT_ACCESS_SET_INVERT);
cmd.id = cpu_to_le32(id);

ret = lbs_cmd_with_response(priv, CMD_BT_ACCESS, &cmd);
if (ret == 0)
memcpy(addr1, cmd.addr1, sizeof(cmd.addr1));

lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
return ret;
}

int lbs_cmd_fwt_access(struct cmd_ds_command *cmd,
Expand Down
8 changes: 6 additions & 2 deletions trunk/drivers/net/wireless/libertas/mesh.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,12 @@ struct cmd_ds_command;
struct cmd_ds_mesh_access;
struct cmd_ds_mesh_config;

int lbs_cmd_bt_access(struct cmd_ds_command *cmd,
u16 cmd_action, void *pdata_buf);
int lbs_mesh_bt_add_del(struct lbs_private *priv, bool add, u8 *addr1);
int lbs_mesh_bt_reset(struct lbs_private *priv);
int lbs_mesh_bt_get_inverted(struct lbs_private *priv, bool *inverted);
int lbs_mesh_bt_set_inverted(struct lbs_private *priv, bool inverted);
int lbs_mesh_bt_get_entry(struct lbs_private *priv, u32 id, u8 *addr1);

int lbs_cmd_fwt_access(struct cmd_ds_command *cmd,
u16 cmd_action, void *pdata_buf);
int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,
Expand Down

0 comments on commit 46ced96

Please sign in to comment.