wifi: mac80211: tx: simplify chanctx_conf handling
authorJohannes Berg <johannes.berg@intel.com>
Wed, 1 Jun 2022 12:25:44 +0000 (14:25 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 20 Jun 2022 10:55:41 +0000 (12:55 +0200)
In ieee80211_build_hdr() we do the same thing for all
interface types except for AP_VLAN, but we can simplify
the code by pulling the common thing in front of the
switch and overriding it for AP_VLAN. This will also
simplify the code for MLD here later.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/tx.c

index f2229b1..0589d2d 100644 (file)
@@ -2584,6 +2584,8 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
        ethertype = (skb->data[12] << 8) | skb->data[13];
        fc = cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA);
 
+       chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
+
        switch (sdata->vif.type) {
        case NL80211_IFTYPE_AP_VLAN:
                if (sdata->wdev.use_4addr) {
@@ -2597,31 +2599,20 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
                        authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED);
                        wme_sta = sta->sta.wme;
                }
+               /* override chanctx_conf from AP (we don't have one) */
                ap_sdata = container_of(sdata->bss, struct ieee80211_sub_if_data,
                                        u.ap);
                chanctx_conf = rcu_dereference(ap_sdata->vif.bss_conf.chanctx_conf);
-               if (!chanctx_conf) {
-                       ret = -ENOTCONN;
-                       goto free;
-               }
-               band = chanctx_conf->def.chan->band;
                if (sdata->wdev.use_4addr)
                        break;
                fallthrough;
        case NL80211_IFTYPE_AP:
-               if (sdata->vif.type == NL80211_IFTYPE_AP)
-                       chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
-               if (!chanctx_conf) {
-                       ret = -ENOTCONN;
-                       goto free;
-               }
                fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS);
                /* DA BSSID SA */
                memcpy(hdr.addr1, skb->data, ETH_ALEN);
                memcpy(hdr.addr2, sdata->vif.addr, ETH_ALEN);
                memcpy(hdr.addr3, skb->data + ETH_ALEN, ETH_ALEN);
                hdrlen = 24;
-               band = chanctx_conf->def.chan->band;
                break;
 #ifdef CONFIG_MAC80211_MESH
        case NL80211_IFTYPE_MESH_POINT:
@@ -2689,12 +2680,6 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
                                                skb->data + ETH_ALEN);
 
                }
-               chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
-               if (!chanctx_conf) {
-                       ret = -ENOTCONN;
-                       goto free;
-               }
-               band = chanctx_conf->def.chan->band;
 
                /* For injected frames, fill RA right away as nexthop lookup
                 * will be skipped.
@@ -2732,12 +2717,6 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
                        memcpy(hdr.addr3, skb->data, ETH_ALEN);
                        hdrlen = 24;
                }
-               chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
-               if (!chanctx_conf) {
-                       ret = -ENOTCONN;
-                       goto free;
-               }
-               band = chanctx_conf->def.chan->band;
                break;
        case NL80211_IFTYPE_OCB:
                /* DA SA BSSID */
@@ -2745,12 +2724,6 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
                memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN);
                eth_broadcast_addr(hdr.addr3);
                hdrlen = 24;
-               chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
-               if (!chanctx_conf) {
-                       ret = -ENOTCONN;
-                       goto free;
-               }
-               band = chanctx_conf->def.chan->band;
                break;
        case NL80211_IFTYPE_ADHOC:
                /* DA SA BSSID */
@@ -2758,18 +2731,18 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
                memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN);
                memcpy(hdr.addr3, sdata->u.ibss.bssid, ETH_ALEN);
                hdrlen = 24;
-               chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
-               if (!chanctx_conf) {
-                       ret = -ENOTCONN;
-                       goto free;
-               }
-               band = chanctx_conf->def.chan->band;
                break;
        default:
                ret = -EINVAL;
                goto free;
        }
 
+       if (!chanctx_conf) {
+               ret = -ENOTCONN;
+               goto free;
+       }
+       band = chanctx_conf->def.chan->band;
+
        multicast = is_multicast_ether_addr(hdr.addr1);
 
        /* sta is always NULL for mesh */