Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 52148655 authored by Dan Williams's avatar Dan Williams Committed by John W. Linville
Browse files

libertas: convert Mesh Blinding Table access to a direct command

parent 4c7c6e00
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -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;
+0 −7
Original line number Diff line number Diff line
@@ -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)
+2 −1
Original line number Diff line number Diff line
@@ -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];
@@ -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;
+150 −32
Original line number Diff line number Diff line
@@ -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,
+6 −2
Original line number Diff line number Diff line
@@ -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,