Skip to content

Commit

Permalink
mac80211: receive EAP frames from a station in an AP VLAN on the main AP
Browse files Browse the repository at this point in the history
This makes it easier to handle moving stations to VLAN interfaces that are
part of a different bridge.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Felix Fietkau authored and John W. Linville committed Apr 13, 2011
1 parent 8e26a03 commit 4114fa2
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions net/mac80211/rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1586,14 +1586,15 @@ ieee80211_drop_unencrypted_mgmt(struct ieee80211_rx_data *rx)
}

static int
__ieee80211_data_to_8023(struct ieee80211_rx_data *rx)
__ieee80211_data_to_8023(struct ieee80211_rx_data *rx, bool *port_control)
{
struct ieee80211_sub_if_data *sdata = rx->sdata;
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
bool check_port_control = false;
struct ethhdr *ehdr;
int ret;

*port_control = false;
if (ieee80211_has_a4(hdr->frame_control) &&
sdata->vif.type == NL80211_IFTYPE_AP_VLAN && !sdata->u.vlan.sta)
return -1;
Expand All @@ -1612,11 +1613,13 @@ __ieee80211_data_to_8023(struct ieee80211_rx_data *rx)
return -1;

ret = ieee80211_data_to_8023(rx->skb, sdata->vif.addr, sdata->vif.type);
if (ret < 0 || !check_port_control)
if (ret < 0)
return ret;

ehdr = (struct ethhdr *) rx->skb->data;
if (ehdr->h_proto != rx->sdata->control_port_protocol)
if (ehdr->h_proto == rx->sdata->control_port_protocol)
*port_control = true;
else if (check_port_control)
return -1;

return 0;
Expand Down Expand Up @@ -1917,6 +1920,7 @@ ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
struct net_device *dev = sdata->dev;
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
__le16 fc = hdr->frame_control;
bool port_control;
int err;

if (unlikely(!ieee80211_is_data(hdr->frame_control)))
Expand All @@ -1933,13 +1937,21 @@ ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
sdata->vif.type == NL80211_IFTYPE_AP)
return RX_DROP_MONITOR;

err = __ieee80211_data_to_8023(rx);
err = __ieee80211_data_to_8023(rx, &port_control);
if (unlikely(err))
return RX_DROP_UNUSABLE;

if (!ieee80211_frame_allowed(rx, fc))
return RX_DROP_MONITOR;

if (rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
unlikely(port_control) && sdata->bss) {
sdata = container_of(sdata->bss, struct ieee80211_sub_if_data,
u.ap);
dev = sdata->dev;
rx->sdata = sdata;
}

rx->skb->dev = dev;

dev->stats.rx_packets++;
Expand Down

0 comments on commit 4114fa2

Please sign in to comment.