cfg80211: introduce capability for 4addr mode
It's very likely that not many devices will support four-address mode in station or AP mode so introduce capability bits for both modes, set them in mac80211 and check them when userspace tries to use the mode. Also, keep track of 4addr in cfg80211 (wireless_dev) and not in mac80211 any more. mac80211 can also be improved for the VLAN case by not looking at the 4addr flag but maintaining the station pointer for it correctly. However, keep track of use_4addr for station mode in mac80211 to avoid all the derefs. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
5be83de54c
commit
9bc383de37
@@ -1192,10 +1192,13 @@ __ieee80211_data_to_8023(struct ieee80211_rx_data *rx)
|
||||
struct net_device *dev = sdata->dev;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN && !sdata->use_4addr &&
|
||||
ieee80211_has_a4(hdr->frame_control))
|
||||
if (ieee80211_has_a4(hdr->frame_control) &&
|
||||
sdata->vif.type == NL80211_IFTYPE_AP_VLAN && !sdata->u.vlan.sta)
|
||||
return -1;
|
||||
if (sdata->use_4addr && is_multicast_ether_addr(hdr->addr1))
|
||||
|
||||
if (is_multicast_ether_addr(hdr->addr1) &&
|
||||
((sdata->vif.type == NL80211_IFTYPE_AP_VLAN && sdata->u.vlan.sta) ||
|
||||
(sdata->vif.type == NL80211_IFTYPE_STATION && sdata->u.mgd.use_4addr)))
|
||||
return -1;
|
||||
|
||||
return ieee80211_data_to_8023(rx->skb, dev->dev_addr, sdata->vif.type);
|
||||
@@ -1245,7 +1248,8 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
|
||||
if ((sdata->vif.type == NL80211_IFTYPE_AP ||
|
||||
sdata->vif.type == NL80211_IFTYPE_AP_VLAN) &&
|
||||
!(sdata->flags & IEEE80211_SDATA_DONT_BRIDGE_PACKETS) &&
|
||||
(rx->flags & IEEE80211_RX_RA_MATCH) && !rx->sdata->use_4addr) {
|
||||
(rx->flags & IEEE80211_RX_RA_MATCH) &&
|
||||
(sdata->vif.type != NL80211_IFTYPE_AP_VLAN || !sdata->u.vlan.sta)) {
|
||||
if (is_multicast_ether_addr(ehdr->h_dest)) {
|
||||
/*
|
||||
* send multicast frames both to higher layers in
|
||||
@@ -2007,7 +2011,7 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
switch (sdata->vif.type) {
|
||||
case NL80211_IFTYPE_STATION:
|
||||
if (!bssid && !sdata->use_4addr)
|
||||
if (!bssid && !sdata->u.mgd.use_4addr)
|
||||
return 0;
|
||||
if (!multicast &&
|
||||
compare_ether_addr(sdata->dev->dev_addr, hdr->addr1) != 0) {
|
||||
|
Reference in New Issue
Block a user