Commit 35983875 authored by Dmitry Antipov's avatar Dmitry Antipov Committed by Kalle Valo

wifi: mwifiex: drop BUG_ON from TX paths

In 'mwifiex_process_sta_txpd()' and 'mwifiex_process_uap_txpd()',
replace 'BUG_ON()' with runtime check, and move all these checks
to 'mwifiex_process_tx()'. This way, both callees may be converted
to 'void', and the caller may be simplified as well.
Suggested-by: default avatarBrian Norris <briannorris@chromium.org>
Signed-off-by: default avatarDmitry Antipov <dmantipov@yandex.ru>
Acked-by: default avatarBrian Norris <briannorris@chromium.org>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230802160726.85545-5-dmantipov@yandex.ru
parent a6b3a016
...@@ -1144,8 +1144,10 @@ int mwifiex_process_uap_event(struct mwifiex_private *); ...@@ -1144,8 +1144,10 @@ int mwifiex_process_uap_event(struct mwifiex_private *);
void mwifiex_delete_all_station_list(struct mwifiex_private *priv); void mwifiex_delete_all_station_list(struct mwifiex_private *priv);
void mwifiex_wmm_del_peer_ra_list(struct mwifiex_private *priv, void mwifiex_wmm_del_peer_ra_list(struct mwifiex_private *priv,
const u8 *ra_addr); const u8 *ra_addr);
void *mwifiex_process_sta_txpd(struct mwifiex_private *, struct sk_buff *skb); void mwifiex_process_sta_txpd(struct mwifiex_private *priv,
void *mwifiex_process_uap_txpd(struct mwifiex_private *, struct sk_buff *skb); struct sk_buff *skb);
void mwifiex_process_uap_txpd(struct mwifiex_private *priv,
struct sk_buff *skb);
int mwifiex_sta_init_cmd(struct mwifiex_private *, u8 first_sta, bool init); int mwifiex_sta_init_cmd(struct mwifiex_private *, u8 first_sta, bool init);
int mwifiex_cmd_802_11_scan(struct host_cmd_ds_command *cmd, int mwifiex_cmd_802_11_scan(struct host_cmd_ds_command *cmd,
struct mwifiex_scan_cmd_config *scan_cfg); struct mwifiex_scan_cmd_config *scan_cfg);
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
* - Priority specific Tx control * - Priority specific Tx control
* - Flags * - Flags
*/ */
void *mwifiex_process_sta_txpd(struct mwifiex_private *priv, void mwifiex_process_sta_txpd(struct mwifiex_private *priv,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct mwifiex_adapter *adapter = priv->adapter; struct mwifiex_adapter *adapter = priv->adapter;
...@@ -39,14 +39,6 @@ void *mwifiex_process_sta_txpd(struct mwifiex_private *priv, ...@@ -39,14 +39,6 @@ void *mwifiex_process_sta_txpd(struct mwifiex_private *priv,
u16 pkt_type, pkt_offset; u16 pkt_type, pkt_offset;
int hroom = adapter->intf_hdr_len; int hroom = adapter->intf_hdr_len;
if (!skb->len) {
mwifiex_dbg(adapter, ERROR,
"Tx: bad packet length: %d\n", skb->len);
return skb->data;
}
BUG_ON(skb_headroom(skb) < MWIFIEX_MIN_DATA_HEADER_LEN);
pkt_type = mwifiex_is_skb_mgmt_frame(skb) ? PKT_TYPE_MGMT : 0; pkt_type = mwifiex_is_skb_mgmt_frame(skb) ? PKT_TYPE_MGMT : 0;
pad = ((uintptr_t)skb->data - (sizeof(*local_tx_pd) + hroom)) & pad = ((uintptr_t)skb->data - (sizeof(*local_tx_pd) + hroom)) &
...@@ -108,8 +100,6 @@ void *mwifiex_process_sta_txpd(struct mwifiex_private *priv, ...@@ -108,8 +100,6 @@ void *mwifiex_process_sta_txpd(struct mwifiex_private *priv,
if (!local_tx_pd->tx_control) if (!local_tx_pd->tx_control)
/* TxCtrl set by user or default */ /* TxCtrl set by user or default */
local_tx_pd->tx_control = cpu_to_le32(priv->pkt_tx_ctrl); local_tx_pd->tx_control = cpu_to_le32(priv->pkt_tx_ctrl);
return skb->data;
} }
/* /*
......
...@@ -72,13 +72,18 @@ EXPORT_SYMBOL_GPL(mwifiex_handle_rx_packet); ...@@ -72,13 +72,18 @@ EXPORT_SYMBOL_GPL(mwifiex_handle_rx_packet);
int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb, int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb,
struct mwifiex_tx_param *tx_param) struct mwifiex_tx_param *tx_param)
{ {
int hroom, ret = -1; int hroom, ret;
struct mwifiex_adapter *adapter = priv->adapter; struct mwifiex_adapter *adapter = priv->adapter;
u8 *head_ptr;
struct txpd *local_tx_pd = NULL; struct txpd *local_tx_pd = NULL;
struct mwifiex_sta_node *dest_node; struct mwifiex_sta_node *dest_node;
struct ethhdr *hdr = (void *)skb->data; struct ethhdr *hdr = (void *)skb->data;
if (unlikely(!skb->len ||
skb_headroom(skb) < MWIFIEX_MIN_DATA_HEADER_LEN)) {
ret = -EINVAL;
goto out;
}
hroom = adapter->intf_hdr_len; hroom = adapter->intf_hdr_len;
if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP) { if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP) {
...@@ -88,20 +93,19 @@ int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb, ...@@ -88,20 +93,19 @@ int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb,
dest_node->stats.tx_packets++; dest_node->stats.tx_packets++;
} }
head_ptr = mwifiex_process_uap_txpd(priv, skb); mwifiex_process_uap_txpd(priv, skb);
} else { } else {
head_ptr = mwifiex_process_sta_txpd(priv, skb); mwifiex_process_sta_txpd(priv, skb);
} }
if ((adapter->data_sent || adapter->tx_lock_flag) && head_ptr) { if (adapter->data_sent || adapter->tx_lock_flag) {
skb_queue_tail(&adapter->tx_data_q, skb); skb_queue_tail(&adapter->tx_data_q, skb);
atomic_inc(&adapter->tx_queued); atomic_inc(&adapter->tx_queued);
return 0; return 0;
} }
if (head_ptr) {
if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA) if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA)
local_tx_pd = (struct txpd *)(head_ptr + hroom); local_tx_pd = (struct txpd *)(skb->data + hroom);
if (adapter->iface_type == MWIFIEX_USB) { if (adapter->iface_type == MWIFIEX_USB) {
ret = adapter->if_ops.host_to_card(adapter, ret = adapter->if_ops.host_to_card(adapter,
priv->usb_port, priv->usb_port,
...@@ -111,10 +115,9 @@ int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb, ...@@ -111,10 +115,9 @@ int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb,
MWIFIEX_TYPE_DATA, MWIFIEX_TYPE_DATA,
skb, tx_param); skb, tx_param);
} }
}
mwifiex_dbg_dump(adapter, DAT_D, "tx pkt:", skb->data, mwifiex_dbg_dump(adapter, DAT_D, "tx pkt:", skb->data,
min_t(size_t, skb->len, DEBUG_DUMP_DATA_MAX_LEN)); min_t(size_t, skb->len, DEBUG_DUMP_DATA_MAX_LEN));
out:
switch (ret) { switch (ret) {
case -ENOSR: case -ENOSR:
mwifiex_dbg(adapter, DATA, "data: -ENOSR is returned\n"); mwifiex_dbg(adapter, DATA, "data: -ENOSR is returned\n");
...@@ -137,6 +140,11 @@ int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb, ...@@ -137,6 +140,11 @@ int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb,
break; break;
case -EINPROGRESS: case -EINPROGRESS:
break; break;
case -EINVAL:
mwifiex_dbg(adapter, ERROR,
"malformed skb (length: %u, headroom: %u)\n",
skb->len, skb_headroom(skb));
fallthrough;
case 0: case 0:
mwifiex_write_data_complete(adapter, skb, 0, ret); mwifiex_write_data_complete(adapter, skb, 0, ret);
break; break;
......
...@@ -461,7 +461,7 @@ int mwifiex_process_uap_rx_packet(struct mwifiex_private *priv, ...@@ -461,7 +461,7 @@ int mwifiex_process_uap_rx_packet(struct mwifiex_private *priv,
* - Priority specific Tx control * - Priority specific Tx control
* - Flags * - Flags
*/ */
void *mwifiex_process_uap_txpd(struct mwifiex_private *priv, void mwifiex_process_uap_txpd(struct mwifiex_private *priv,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct mwifiex_adapter *adapter = priv->adapter; struct mwifiex_adapter *adapter = priv->adapter;
...@@ -471,14 +471,6 @@ void *mwifiex_process_uap_txpd(struct mwifiex_private *priv, ...@@ -471,14 +471,6 @@ void *mwifiex_process_uap_txpd(struct mwifiex_private *priv,
u16 pkt_type, pkt_offset; u16 pkt_type, pkt_offset;
int hroom = adapter->intf_hdr_len; int hroom = adapter->intf_hdr_len;
if (!skb->len) {
mwifiex_dbg(adapter, ERROR,
"Tx: bad packet length: %d\n", skb->len);
return skb->data;
}
BUG_ON(skb_headroom(skb) < MWIFIEX_MIN_DATA_HEADER_LEN);
pkt_type = mwifiex_is_skb_mgmt_frame(skb) ? PKT_TYPE_MGMT : 0; pkt_type = mwifiex_is_skb_mgmt_frame(skb) ? PKT_TYPE_MGMT : 0;
pad = ((uintptr_t)skb->data - (sizeof(*txpd) + hroom)) & pad = ((uintptr_t)skb->data - (sizeof(*txpd) + hroom)) &
...@@ -526,6 +518,4 @@ void *mwifiex_process_uap_txpd(struct mwifiex_private *priv, ...@@ -526,6 +518,4 @@ void *mwifiex_process_uap_txpd(struct mwifiex_private *priv,
if (!txpd->tx_control) if (!txpd->tx_control)
/* TxCtrl set by user or default */ /* TxCtrl set by user or default */
txpd->tx_control = cpu_to_le32(priv->pkt_tx_ctrl); txpd->tx_control = cpu_to_le32(priv->pkt_tx_ctrl);
return skb->data;
} }
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