On 20.03.2018 18:55, Ajay Singh wrote:
> Refactor mgmt_tx() to fix line over 80 characters issue. Split the
> function to avoid the checkpatch.pl warning. Returning the same error
> code in case of memory allocation failure.
> 
> Signed-off-by: Ajay Singh <ajay.kat...@microchip.com>
> ---
>  drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | 187 
> +++++++++++++---------
>  1 file changed, 111 insertions(+), 76 deletions(-)
> 
> diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
> b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
> index d7ff0a9..9950ca5 100644
> --- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
> +++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
> @@ -1555,6 +1555,58 @@ static int cancel_remain_on_channel(struct wiphy 
> *wiphy,
>                       priv->remain_on_ch_params.listen_session_id);
>  }
>  
> +static void wilc_wfi_cfg_tx_vendor_spec(struct p2p_mgmt_data *mgmt_tx,
> +                                     struct cfg80211_mgmt_tx_params *params,
> +                                     u8 iftype, u32 buf_len)
> +{
> +     const u8 *buf = params->buf;
> +     size_t len = params->len;
> +     u32 i;
> +     u8 subtype = buf[P2P_PUB_ACTION_SUBTYPE];
> +
> +     if (subtype == GO_NEG_REQ || subtype == GO_NEG_RSP) {
> +             if (p2p_local_random == 1 &&
> +                 p2p_recv_random < p2p_local_random) {
I think you can inner this if in the above one. Your choice.

> +                     get_random_bytes(&p2p_local_random, 1);
> +                     p2p_local_random++;
> +             }
> +     }
> +
> +     if (p2p_local_random > p2p_recv_random && (subtype == GO_NEG_REQ ||
> +                                                subtype == GO_NEG_RSP ||
> +                                                subtype == P2P_INV_REQ ||
> +                                                subtype == P2P_INV_RSP)) {
> +             bool found = false;
> +             bool oper_ch = false;
> +
> +             for (i = P2P_PUB_ACTION_SUBTYPE + 2; i < len; i++) {
> +                     if (buf[i] == P2PELEM_ATTR_ID &&
> +                         !(memcmp(p2p_oui, &buf[i + 2], 4))) {
You can remove "(" ")" around memcmp. Again, your choice.

> +                             if (subtype == P2P_INV_REQ ||
> +                                 subtype == P2P_INV_RSP)
> +                                     oper_ch = true;
> +
> +                             found = true;
> +                             break;
> +                     }
> +             }
> +
> +             if (found)
> +                     wilc_wfi_cfg_parse_tx_action(&mgmt_tx->buff[i + 6],
> +                                                  len - (i + 6), oper_ch,
> +                                                  iftype);
> +
> +             if (subtype != P2P_INV_REQ && subtype != P2P_INV_RSP) {
> +                     int vendor_spec_len = sizeof(p2p_vendor_spec);
> +
> +                     memcpy(&mgmt_tx->buff[len], p2p_vendor_spec,
> +                            vendor_spec_len);
> +                     mgmt_tx->buff[len + vendor_spec_len] = p2p_local_random;
> +                     mgmt_tx->size = buf_len;
> +             }
> +     }
> +}
Looking at wilc_wfi_cfg_tx_vendor_spec() and
wilc_wfi_cfg_parse_rx_vendor_spec() from patch 4 from this series I can see
that conditions in these two are mostly the same but you refactor them
differently. I think the approach in wilc_wfi_cfg_parse_rx_vendor_spec()
from patch 4 is better and can help you avoid usage of bool variables like
found and oper_ch.

For instance, you can have:

static void wilc_wfi_cfg_tx_vendor_spec(struct p2p_mgmt_data *mgmt_tx,
                                        struct cfg80211_mgmt_tx_params *params,
                                        u8 iftype, u32 buf_len)
{
        const u8 *buf = params->buf;
        size_t len = params->len;
        u32 i;
        u8 subtype = buf[P2P_PUB_ACTION_SUBTYPE];

        if ((subtype == GO_NEG_REQ || subtype == GO_NEG_RSP) &&
            p2p_local_random == 1 && p2p_recv_random < p2p_local_random) {
                get_random_bytes(&p2p_local_random, 1);
                p2p_local_random++;
        }

        if (p2p_local_random <= p2p_recv_random)
                return;

        if (subtype == GO_NEG_REQ || subtype == GO_NEG_RSP ||
            subtype == P2P_INV_REQ || subtype == P2P_INV_RSP) {
                for (i = P2P_PUB_ACTION_SUBTYPE + 2; i < len; i++) {
                        if (buf[i] != P2PELEM_ATTR_ID ||
                            memcmp(p2p_oui, &buf[i + 2], 4))
                                continue;

                        wilc_wfi_cfg_parse_tx_action(&mgmt_tx->buff[i + 6],
                                                     len - (i + 6),
                                                     (subtype == P2P_INV_REQ ||
                                                      subtype == P2P_INV_RSP),
                                                      iftype);

                        break;
                }

                if (subtype != P2P_INV_REQ && subtype != P2P_INV_RSP) {
                        int vendor_spec_len = sizeof(p2p_vendor_spec);

                        memcpy(&mgmt_tx->buff[len], p2p_vendor_spec,
                               vendor_spec_len);
                        mgmt_tx->buff[len + vendor_spec_len] = p2p_local_random;
                        mgmt_tx->size = buf_len;
                }
        }
}


which is mostly in the same format as wilc_wfi_cfg_parse_rx_vendor_spec(), from
the point of view of if () sequences:

        if ((subtype == GO_NEG_REQ || subtype == GO_NEG_RSP) && something) {
                // ...
        }

        if (p2p_local_random <= p2p_recv_random)
                return;

        if (subtype == GO_NEG_REQ || subtype == GO_NEG_RSP ||
            subtype == P2P_INV_REQ || subtype == P2P_INV_RSP) {
                // ...
        }
        
> +
>  static int mgmt_tx(struct wiphy *wiphy,
>                  struct wireless_dev *wdev,
>                  struct cfg80211_mgmt_tx_params *params,
> @@ -1568,9 +1620,9 @@ static int mgmt_tx(struct wiphy *wiphy,
>       struct p2p_mgmt_data *mgmt_tx;
>       struct wilc_priv *priv;
>       struct host_if_drv *wfi_drv;
> -     u32 i;
>       struct wilc_vif *vif;
>       u32 buf_len = len + sizeof(p2p_vendor_spec) + sizeof(p2p_local_random);
> +     int ret = 0;
>  
>       vif = netdev_priv(wdev->netdev);
>       priv = wiphy_priv(wiphy);
> @@ -1580,92 +1632,75 @@ static int mgmt_tx(struct wiphy *wiphy,
>       priv->tx_cookie = *cookie;
>       mgmt = (const struct ieee80211_mgmt *)buf;
>  
> -     if (ieee80211_is_mgmt(mgmt->frame_control)) {
> -             mgmt_tx = kmalloc(sizeof(struct p2p_mgmt_data), GFP_KERNEL);
> -             if (!mgmt_tx)
> -                     return -EFAULT;
> +     if (!ieee80211_is_mgmt(mgmt->frame_control))
> +             goto out;
>  
> -             mgmt_tx->buff = kmalloc(buf_len, GFP_KERNEL);
> -             if (!mgmt_tx->buff) {
> -                     kfree(mgmt_tx);
> -                     return -ENOMEM;
> -             }
> +     mgmt_tx = kmalloc(sizeof(struct p2p_mgmt_data), GFP_KERNEL);
> +     if (!mgmt_tx) {
> +             ret = -ENOMEM;
> +             goto out;
> +     }
> +
> +     mgmt_tx->buff = kmalloc(buf_len, GFP_KERNEL);
> +     if (!mgmt_tx->buff) {
> +             ret = -ENOMEM;
> +             kfree(mgmt_tx);
> +             goto out;
> +     }
> +
> +     memcpy(mgmt_tx->buff, buf, len);
> +     mgmt_tx->size = len;
> +
> +     if (ieee80211_is_probe_resp(mgmt->frame_control)) {
> +             wilc_set_mac_chnl_num(vif, chan->hw_value);
> +             curr_channel = chan->hw_value;
> +             goto out_txq_add_pkt;
> +     }
>  
> -             memcpy(mgmt_tx->buff, buf, len);
> -             mgmt_tx->size = len;
> +     if (!ieee80211_is_action(mgmt->frame_control))
> +             goto out_txq_add_pkt;
>  
> -             if (ieee80211_is_probe_resp(mgmt->frame_control)) {
> +     if (buf[ACTION_CAT_ID] == PUB_ACTION_ATTR_ID) {
> +             if (buf[ACTION_SUBTYPE_ID] != PUBLIC_ACT_VENDORSPEC ||
> +                 buf[P2P_PUB_ACTION_SUBTYPE] != GO_NEG_CONF) {
>                       wilc_set_mac_chnl_num(vif, chan->hw_value);
>                       curr_channel = chan->hw_value;
> -             } else if (ieee80211_is_action(mgmt->frame_control))   {
> -                     if (buf[ACTION_CAT_ID] == PUB_ACTION_ATTR_ID) {
> -                             if (buf[ACTION_SUBTYPE_ID] != 
> PUBLIC_ACT_VENDORSPEC ||
> -                                 buf[P2P_PUB_ACTION_SUBTYPE] != GO_NEG_CONF) 
> {
> -                                     wilc_set_mac_chnl_num(vif,
> -                                                           chan->hw_value);
> -                                     curr_channel = chan->hw_value;
> -                             }
> -                             switch (buf[ACTION_SUBTYPE_ID]) {
> -                             case GAS_INITIAL_REQ:
> -                                     break;
> +             }
> +             switch (buf[ACTION_SUBTYPE_ID]) {
> +             case GAS_INITIAL_REQ:
> +             case GAS_INITIAL_RSP:
> +                     break;
>  
> -                             case GAS_INITIAL_RSP:
> -                                     break;
> +             case PUBLIC_ACT_VENDORSPEC:
> +                     if (!memcmp(p2p_oui, &buf[ACTION_SUBTYPE_ID + 1], 4))
> +                             wilc_wfi_cfg_tx_vendor_spec(mgmt_tx, params,
> +                                                         vif->iftype,
> +                                                         buf_len);
> +                     else
> +                             netdev_dbg(vif->ndev,
> +                                        "Not a P2P public action frame\n");
>  
> -                             case PUBLIC_ACT_VENDORSPEC:
> -                             {
> -                                     if (!memcmp(p2p_oui, 
> &buf[ACTION_SUBTYPE_ID + 1], 4)) {
> -                                             if 
> ((buf[P2P_PUB_ACTION_SUBTYPE] == GO_NEG_REQ || buf[P2P_PUB_ACTION_SUBTYPE] == 
> GO_NEG_RSP)) {
> -                                                     if (p2p_local_random == 
> 1 && p2p_recv_random < p2p_local_random) {
> -                                                             
> get_random_bytes(&p2p_local_random, 1);
> -                                                             
> p2p_local_random++;
> -                                                     }
> -                                             }
> -
> -                                             if 
> ((buf[P2P_PUB_ACTION_SUBTYPE] == GO_NEG_REQ || buf[P2P_PUB_ACTION_SUBTYPE] == 
> GO_NEG_RSP ||
> -                                                  
> buf[P2P_PUB_ACTION_SUBTYPE] == P2P_INV_REQ || buf[P2P_PUB_ACTION_SUBTYPE] == 
> P2P_INV_RSP)) {
> -                                                     if (p2p_local_random > 
> p2p_recv_random) {
> -                                                             for (i = 
> P2P_PUB_ACTION_SUBTYPE + 2; i < len; i++) {
> -                                                                     if 
> (buf[i] == P2PELEM_ATTR_ID && !(memcmp(p2p_oui, &buf[i + 2], 4))) {
> -                                                                             
> if (buf[P2P_PUB_ACTION_SUBTYPE] == P2P_INV_REQ || buf[P2P_PUB_ACTION_SUBTYPE] 
> == P2P_INV_RSP)
> -                                                                             
>         wilc_wfi_cfg_parse_tx_action(&mgmt_tx->buff[i + 6], len - (i + 6), 
> true, vif->iftype);
> -                                                                             
> else
> -                                                                             
>         wilc_wfi_cfg_parse_tx_action(&mgmt_tx->buff[i + 6], len - (i + 6), 
> false, vif->iftype);
> -                                                                             
> break;
> -                                                                     }
> -                                                             }
> -
> -                                                             if 
> (buf[P2P_PUB_ACTION_SUBTYPE] != P2P_INV_REQ && buf[P2P_PUB_ACTION_SUBTYPE] != 
> P2P_INV_RSP) {
> -                                                                     
> memcpy(&mgmt_tx->buff[len], p2p_vendor_spec, sizeof(p2p_vendor_spec));
> -                                                                     
> mgmt_tx->buff[len + sizeof(p2p_vendor_spec)] = p2p_local_random;
> -                                                                     
> mgmt_tx->size = buf_len;
> -                                                             }
> -                                                     }
> -                                             }
> -
> -                                     } else {
> -                                             netdev_dbg(vif->ndev, "Not a 
> P2P public action frame\n");
> -                                     }
> +                     break;
>  
> -                                     break;
> -                             }
> +             default:
> +                     netdev_dbg(vif->ndev,
> +                                "NOT HANDLED PUBLIC ACTION FRAME TYPE:%x\n",
> +                                buf[ACTION_SUBTYPE_ID]);
> +                     break;
> +             }
> +     }
>  
> -                             default:
> -                             {
> -                                     netdev_dbg(vif->ndev, "NOT HANDLED 
> PUBLIC ACTION FRAME TYPE:%x\n", buf[ACTION_SUBTYPE_ID]);
> -                                     break;
> -                             }
> -                             }
> -                     }
> +     wfi_drv->p2p_timeout = (jiffies + msecs_to_jiffies(wait));
>  
> -                     wfi_drv->p2p_timeout = (jiffies + 
> msecs_to_jiffies(wait));
> -             }
> +out_txq_add_pkt:
>  
> -             wilc_wlan_txq_add_mgmt_pkt(wdev->netdev, mgmt_tx,
> -                                        mgmt_tx->buff, mgmt_tx->size,
> -                                        wilc_wfi_mgmt_tx_complete);
> -     }
> -     return 0;
> +     wilc_wlan_txq_add_mgmt_pkt(wdev->netdev, mgmt_tx,
> +                                mgmt_tx->buff, mgmt_tx->size,
> +                                wilc_wfi_mgmt_tx_complete);
You should check return value of this function and free mgmt_tx and
mgmt_tx->buff accordingly (if not in this series maybe in a future one).

> +
> +out:
> +
> +     return ret;
>  }
>  
>  static int mgmt_tx_cancel_wait(struct wiphy *wiphy,
> 

Reply via email to