wifi: mac80211: tx: simplify chanctx_conf handling
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>
This commit is contained in:
parent
e5c0ee01fe
commit
27f852de7e
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user