diff options
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/debugfs_netdev.c | 9 | ||||
-rw-r--r-- | net/mac80211/debugfs_sta.c | 3 | ||||
-rw-r--r-- | net/mac80211/ieee80211.c | 3 | ||||
-rw-r--r-- | net/mac80211/ieee80211_i.h | 9 | ||||
-rw-r--r-- | net/mac80211/ieee80211_sta.c | 5 | ||||
-rw-r--r-- | net/mac80211/rx.c | 8 | ||||
-rw-r--r-- | net/mac80211/sta_info.h | 44 | ||||
-rw-r--r-- | net/mac80211/tx.c | 8 |
8 files changed, 44 insertions, 45 deletions
diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c index 829872a3ae8..29f7b98ba1f 100644 --- a/net/mac80211/debugfs_netdev.c +++ b/net/mac80211/debugfs_netdev.c | |||
@@ -91,7 +91,6 @@ static const struct file_operations name##_ops = { \ | |||
91 | /* common attributes */ | 91 | /* common attributes */ |
92 | IEEE80211_IF_FILE(channel_use, channel_use, DEC); | 92 | IEEE80211_IF_FILE(channel_use, channel_use, DEC); |
93 | IEEE80211_IF_FILE(drop_unencrypted, drop_unencrypted, DEC); | 93 | IEEE80211_IF_FILE(drop_unencrypted, drop_unencrypted, DEC); |
94 | IEEE80211_IF_FILE(ieee802_1x_pac, ieee802_1x_pac, DEC); | ||
95 | 94 | ||
96 | /* STA/IBSS attributes */ | 95 | /* STA/IBSS attributes */ |
97 | IEEE80211_IF_FILE(state, u.sta.state, DEC); | 96 | IEEE80211_IF_FILE(state, u.sta.state, DEC); |
@@ -148,7 +147,6 @@ static void add_sta_files(struct ieee80211_sub_if_data *sdata) | |||
148 | { | 147 | { |
149 | DEBUGFS_ADD(channel_use, sta); | 148 | DEBUGFS_ADD(channel_use, sta); |
150 | DEBUGFS_ADD(drop_unencrypted, sta); | 149 | DEBUGFS_ADD(drop_unencrypted, sta); |
151 | DEBUGFS_ADD(ieee802_1x_pac, sta); | ||
152 | DEBUGFS_ADD(state, sta); | 150 | DEBUGFS_ADD(state, sta); |
153 | DEBUGFS_ADD(bssid, sta); | 151 | DEBUGFS_ADD(bssid, sta); |
154 | DEBUGFS_ADD(prev_bssid, sta); | 152 | DEBUGFS_ADD(prev_bssid, sta); |
@@ -169,7 +167,6 @@ static void add_ap_files(struct ieee80211_sub_if_data *sdata) | |||
169 | { | 167 | { |
170 | DEBUGFS_ADD(channel_use, ap); | 168 | DEBUGFS_ADD(channel_use, ap); |
171 | DEBUGFS_ADD(drop_unencrypted, ap); | 169 | DEBUGFS_ADD(drop_unencrypted, ap); |
172 | DEBUGFS_ADD(ieee802_1x_pac, ap); | ||
173 | DEBUGFS_ADD(num_sta_ps, ap); | 170 | DEBUGFS_ADD(num_sta_ps, ap); |
174 | DEBUGFS_ADD(dtim_count, ap); | 171 | DEBUGFS_ADD(dtim_count, ap); |
175 | DEBUGFS_ADD(num_beacons, ap); | 172 | DEBUGFS_ADD(num_beacons, ap); |
@@ -182,7 +179,6 @@ static void add_wds_files(struct ieee80211_sub_if_data *sdata) | |||
182 | { | 179 | { |
183 | DEBUGFS_ADD(channel_use, wds); | 180 | DEBUGFS_ADD(channel_use, wds); |
184 | DEBUGFS_ADD(drop_unencrypted, wds); | 181 | DEBUGFS_ADD(drop_unencrypted, wds); |
185 | DEBUGFS_ADD(ieee802_1x_pac, wds); | ||
186 | DEBUGFS_ADD(peer, wds); | 182 | DEBUGFS_ADD(peer, wds); |
187 | } | 183 | } |
188 | 184 | ||
@@ -190,7 +186,6 @@ static void add_vlan_files(struct ieee80211_sub_if_data *sdata) | |||
190 | { | 186 | { |
191 | DEBUGFS_ADD(channel_use, vlan); | 187 | DEBUGFS_ADD(channel_use, vlan); |
192 | DEBUGFS_ADD(drop_unencrypted, vlan); | 188 | DEBUGFS_ADD(drop_unencrypted, vlan); |
193 | DEBUGFS_ADD(ieee802_1x_pac, vlan); | ||
194 | } | 189 | } |
195 | 190 | ||
196 | static void add_monitor_files(struct ieee80211_sub_if_data *sdata) | 191 | static void add_monitor_files(struct ieee80211_sub_if_data *sdata) |
@@ -234,7 +229,6 @@ static void del_sta_files(struct ieee80211_sub_if_data *sdata) | |||
234 | { | 229 | { |
235 | DEBUGFS_DEL(channel_use, sta); | 230 | DEBUGFS_DEL(channel_use, sta); |
236 | DEBUGFS_DEL(drop_unencrypted, sta); | 231 | DEBUGFS_DEL(drop_unencrypted, sta); |
237 | DEBUGFS_DEL(ieee802_1x_pac, sta); | ||
238 | DEBUGFS_DEL(state, sta); | 232 | DEBUGFS_DEL(state, sta); |
239 | DEBUGFS_DEL(bssid, sta); | 233 | DEBUGFS_DEL(bssid, sta); |
240 | DEBUGFS_DEL(prev_bssid, sta); | 234 | DEBUGFS_DEL(prev_bssid, sta); |
@@ -255,7 +249,6 @@ static void del_ap_files(struct ieee80211_sub_if_data *sdata) | |||
255 | { | 249 | { |
256 | DEBUGFS_DEL(channel_use, ap); | 250 | DEBUGFS_DEL(channel_use, ap); |
257 | DEBUGFS_DEL(drop_unencrypted, ap); | 251 | DEBUGFS_DEL(drop_unencrypted, ap); |
258 | DEBUGFS_DEL(ieee802_1x_pac, ap); | ||
259 | DEBUGFS_DEL(num_sta_ps, ap); | 252 | DEBUGFS_DEL(num_sta_ps, ap); |
260 | DEBUGFS_DEL(dtim_count, ap); | 253 | DEBUGFS_DEL(dtim_count, ap); |
261 | DEBUGFS_DEL(num_beacons, ap); | 254 | DEBUGFS_DEL(num_beacons, ap); |
@@ -268,7 +261,6 @@ static void del_wds_files(struct ieee80211_sub_if_data *sdata) | |||
268 | { | 261 | { |
269 | DEBUGFS_DEL(channel_use, wds); | 262 | DEBUGFS_DEL(channel_use, wds); |
270 | DEBUGFS_DEL(drop_unencrypted, wds); | 263 | DEBUGFS_DEL(drop_unencrypted, wds); |
271 | DEBUGFS_DEL(ieee802_1x_pac, wds); | ||
272 | DEBUGFS_DEL(peer, wds); | 264 | DEBUGFS_DEL(peer, wds); |
273 | } | 265 | } |
274 | 266 | ||
@@ -276,7 +268,6 @@ static void del_vlan_files(struct ieee80211_sub_if_data *sdata) | |||
276 | { | 268 | { |
277 | DEBUGFS_DEL(channel_use, vlan); | 269 | DEBUGFS_DEL(channel_use, vlan); |
278 | DEBUGFS_DEL(drop_unencrypted, vlan); | 270 | DEBUGFS_DEL(drop_unencrypted, vlan); |
279 | DEBUGFS_DEL(ieee802_1x_pac, vlan); | ||
280 | } | 271 | } |
281 | 272 | ||
282 | static void del_monitor_files(struct ieee80211_sub_if_data *sdata) | 273 | static void del_monitor_files(struct ieee80211_sub_if_data *sdata) |
diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c index 49660f4e845..ac61353ae7c 100644 --- a/net/mac80211/debugfs_sta.c +++ b/net/mac80211/debugfs_sta.c | |||
@@ -74,12 +74,11 @@ static ssize_t sta_flags_read(struct file *file, char __user *userbuf, | |||
74 | { | 74 | { |
75 | char buf[100]; | 75 | char buf[100]; |
76 | struct sta_info *sta = file->private_data; | 76 | struct sta_info *sta = file->private_data; |
77 | int res = scnprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s", | 77 | int res = scnprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s", |
78 | sta->flags & WLAN_STA_AUTH ? "AUTH\n" : "", | 78 | sta->flags & WLAN_STA_AUTH ? "AUTH\n" : "", |
79 | sta->flags & WLAN_STA_ASSOC ? "ASSOC\n" : "", | 79 | sta->flags & WLAN_STA_ASSOC ? "ASSOC\n" : "", |
80 | sta->flags & WLAN_STA_PS ? "PS\n" : "", | 80 | sta->flags & WLAN_STA_PS ? "PS\n" : "", |
81 | sta->flags & WLAN_STA_TIM ? "TIM\n" : "", | 81 | sta->flags & WLAN_STA_TIM ? "TIM\n" : "", |
82 | sta->flags & WLAN_STA_PERM ? "PERM\n" : "", | ||
83 | sta->flags & WLAN_STA_AUTHORIZED ? "AUTHORIZED\n" : "", | 82 | sta->flags & WLAN_STA_AUTHORIZED ? "AUTHORIZED\n" : "", |
84 | sta->flags & WLAN_STA_SHORT_PREAMBLE ? "SHORT PREAMBLE\n" : "", | 83 | sta->flags & WLAN_STA_SHORT_PREAMBLE ? "SHORT PREAMBLE\n" : "", |
85 | sta->flags & WLAN_STA_WME ? "WME\n" : "", | 84 | sta->flags & WLAN_STA_WME ? "WME\n" : "", |
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c index de894b61a23..cb09931af86 100644 --- a/net/mac80211/ieee80211.c +++ b/net/mac80211/ieee80211.c | |||
@@ -804,6 +804,9 @@ int ieee80211_if_update_wds(struct net_device *dev, u8 *remote_addr) | |||
804 | sta = sta_info_add(local, dev, remote_addr, GFP_KERNEL); | 804 | sta = sta_info_add(local, dev, remote_addr, GFP_KERNEL); |
805 | if (!sta) | 805 | if (!sta) |
806 | return -ENOMEM; | 806 | return -ENOMEM; |
807 | |||
808 | sta->flags |= WLAN_STA_AUTHORIZED; | ||
809 | |||
807 | sta_info_put(sta); | 810 | sta_info_put(sta); |
808 | 811 | ||
809 | /* Remove STA entry for the old peer */ | 812 | /* Remove STA entry for the old peer */ |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 54eea5f2447..ac802feb765 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -305,11 +305,6 @@ struct ieee80211_sub_if_data { | |||
305 | unsigned int flags; | 305 | unsigned int flags; |
306 | 306 | ||
307 | int drop_unencrypted; | 307 | int drop_unencrypted; |
308 | /* | ||
309 | * IEEE 802.1X Port access control in effect, | ||
310 | * drop packets to/from unauthorized port | ||
311 | */ | ||
312 | int ieee802_1x_pac; | ||
313 | 308 | ||
314 | /* | 309 | /* |
315 | * basic rates of this AP or the AP we're associated to | 310 | * basic rates of this AP or the AP we're associated to |
@@ -352,7 +347,6 @@ struct ieee80211_sub_if_data { | |||
352 | struct { | 347 | struct { |
353 | struct dentry *channel_use; | 348 | struct dentry *channel_use; |
354 | struct dentry *drop_unencrypted; | 349 | struct dentry *drop_unencrypted; |
355 | struct dentry *ieee802_1x_pac; | ||
356 | struct dentry *state; | 350 | struct dentry *state; |
357 | struct dentry *bssid; | 351 | struct dentry *bssid; |
358 | struct dentry *prev_bssid; | 352 | struct dentry *prev_bssid; |
@@ -371,7 +365,6 @@ struct ieee80211_sub_if_data { | |||
371 | struct { | 365 | struct { |
372 | struct dentry *channel_use; | 366 | struct dentry *channel_use; |
373 | struct dentry *drop_unencrypted; | 367 | struct dentry *drop_unencrypted; |
374 | struct dentry *ieee802_1x_pac; | ||
375 | struct dentry *num_sta_ps; | 368 | struct dentry *num_sta_ps; |
376 | struct dentry *dtim_count; | 369 | struct dentry *dtim_count; |
377 | struct dentry *num_beacons; | 370 | struct dentry *num_beacons; |
@@ -382,13 +375,11 @@ struct ieee80211_sub_if_data { | |||
382 | struct { | 375 | struct { |
383 | struct dentry *channel_use; | 376 | struct dentry *channel_use; |
384 | struct dentry *drop_unencrypted; | 377 | struct dentry *drop_unencrypted; |
385 | struct dentry *ieee802_1x_pac; | ||
386 | struct dentry *peer; | 378 | struct dentry *peer; |
387 | } wds; | 379 | } wds; |
388 | struct { | 380 | struct { |
389 | struct dentry *channel_use; | 381 | struct dentry *channel_use; |
390 | struct dentry *drop_unencrypted; | 382 | struct dentry *drop_unencrypted; |
391 | struct dentry *ieee802_1x_pac; | ||
392 | } vlan; | 383 | } vlan; |
393 | struct { | 384 | struct { |
394 | struct dentry *mode; | 385 | struct dentry *mode; |
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c index 0d5e3fee8e5..dac02d001ef 100644 --- a/net/mac80211/ieee80211_sta.c +++ b/net/mac80211/ieee80211_sta.c | |||
@@ -1828,7 +1828,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, | |||
1828 | } | 1828 | } |
1829 | 1829 | ||
1830 | sta->dev = dev; | 1830 | sta->dev = dev; |
1831 | sta->flags |= WLAN_STA_AUTH | WLAN_STA_ASSOC | WLAN_STA_ASSOC_AP; | 1831 | sta->flags |= WLAN_STA_AUTH | WLAN_STA_ASSOC | WLAN_STA_ASSOC_AP | |
1832 | WLAN_STA_AUTHORIZED; | ||
1832 | 1833 | ||
1833 | rates = 0; | 1834 | rates = 0; |
1834 | basic_rates = 0; | 1835 | basic_rates = 0; |
@@ -3791,6 +3792,8 @@ struct sta_info * ieee80211_ibss_add_sta(struct net_device *dev, | |||
3791 | if (!sta) | 3792 | if (!sta) |
3792 | return NULL; | 3793 | return NULL; |
3793 | 3794 | ||
3795 | sta->flags |= WLAN_STA_AUTHORIZED; | ||
3796 | |||
3794 | sta->supp_rates[local->hw.conf.channel->band] = | 3797 | sta->supp_rates[local->hw.conf.channel->band] = |
3795 | sdata->u.sta.supp_rates_bits[local->hw.conf.channel->band]; | 3798 | sdata->u.sta.supp_rates_bits[local->hw.conf.channel->band]; |
3796 | 3799 | ||
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index c9ff98a9321..0989c212b7c 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -987,11 +987,11 @@ ieee80211_rx_h_remove_qos_control(struct ieee80211_txrx_data *rx) | |||
987 | static int | 987 | static int |
988 | ieee80211_802_1x_port_control(struct ieee80211_txrx_data *rx) | 988 | ieee80211_802_1x_port_control(struct ieee80211_txrx_data *rx) |
989 | { | 989 | { |
990 | if (unlikely(rx->sdata->ieee802_1x_pac && | 990 | if (unlikely(!rx->sta || !(rx->sta->flags & WLAN_STA_AUTHORIZED))) { |
991 | (!rx->sta || !(rx->sta->flags & WLAN_STA_AUTHORIZED)))) { | ||
992 | #ifdef CONFIG_MAC80211_DEBUG | 991 | #ifdef CONFIG_MAC80211_DEBUG |
993 | printk(KERN_DEBUG "%s: dropped frame " | 992 | if (net_ratelimit()) |
994 | "(unauthorized port)\n", rx->dev->name); | 993 | printk(KERN_DEBUG "%s: dropped frame " |
994 | "(unauthorized port)\n", rx->dev->name); | ||
995 | #endif /* CONFIG_MAC80211_DEBUG */ | 995 | #endif /* CONFIG_MAC80211_DEBUG */ |
996 | return -EACCES; | 996 | return -EACCES; |
997 | } | 997 | } |
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index 3573743dfa5..19f3fb41294 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h | |||
@@ -15,21 +15,35 @@ | |||
15 | #include <linux/kref.h> | 15 | #include <linux/kref.h> |
16 | #include "ieee80211_key.h" | 16 | #include "ieee80211_key.h" |
17 | 17 | ||
18 | /* Stations flags (struct sta_info::flags) */ | 18 | /** |
19 | #define WLAN_STA_AUTH BIT(0) | 19 | * enum ieee80211_sta_info_flags - Stations flags |
20 | #define WLAN_STA_ASSOC BIT(1) | 20 | * |
21 | #define WLAN_STA_PS BIT(2) | 21 | * These flags are used with &struct sta_info's @flags member. |
22 | #define WLAN_STA_TIM BIT(3) /* TIM bit is on for PS stations */ | 22 | * |
23 | #define WLAN_STA_PERM BIT(4) /* permanent; do not remove entry on expiration */ | 23 | * @WLAN_STA_AUTH: Station is authenticated. |
24 | #define WLAN_STA_AUTHORIZED BIT(5) /* If 802.1X is used, this flag is | 24 | * @WLAN_STA_ASSOC: Station is associated. |
25 | * controlling whether STA is authorized to | 25 | * @WLAN_STA_PS: Station is in power-save mode |
26 | * send and receive non-IEEE 802.1X frames | 26 | * @WLAN_STA_TIM: TIM bit is on for this PS station (traffic buffered) |
27 | */ | 27 | * @WLAN_STA_AUTHORIZED: Station is authorized to send/receive traffic. |
28 | #define WLAN_STA_SHORT_PREAMBLE BIT(7) | 28 | * This bit is always checked so needs to be enabled for all stations |
29 | /* whether this is an AP that we are associated with as a client */ | 29 | * when virtual port control is not in use. |
30 | #define WLAN_STA_ASSOC_AP BIT(8) | 30 | * @WLAN_STA_SHORT_PREAMBLE: Station is capable of receiving short-preamble |
31 | #define WLAN_STA_WME BIT(9) | 31 | * frames. |
32 | #define WLAN_STA_WDS BIT(27) | 32 | * @WLAN_STA_ASSOC_AP: We're associated to that station, it is an AP. |
33 | * @WLAN_STA_WME: Station is a QoS-STA. | ||
34 | * @WLAN_STA_WDS: Station is one of our WDS peers. | ||
35 | */ | ||
36 | enum ieee80211_sta_info_flags { | ||
37 | WLAN_STA_AUTH = 1<<0, | ||
38 | WLAN_STA_ASSOC = 1<<1, | ||
39 | WLAN_STA_PS = 1<<2, | ||
40 | WLAN_STA_TIM = 1<<3, | ||
41 | WLAN_STA_AUTHORIZED = 1<<4, | ||
42 | WLAN_STA_SHORT_PREAMBLE = 1<<5, | ||
43 | WLAN_STA_ASSOC_AP = 1<<6, | ||
44 | WLAN_STA_WME = 1<<7, | ||
45 | WLAN_STA_WDS = 1<<8, | ||
46 | }; | ||
33 | 47 | ||
34 | #define STA_TID_NUM 16 | 48 | #define STA_TID_NUM 16 |
35 | #define ADDBA_RESP_INTERVAL HZ | 49 | #define ADDBA_RESP_INTERVAL HZ |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 9e535999198..2b474644123 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1471,12 +1471,10 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1471 | } | 1471 | } |
1472 | 1472 | ||
1473 | /* | 1473 | /* |
1474 | * If port access control is enabled, drop unicast frames to | 1474 | * Drop unicast frames to unauthorised stations unless they are |
1475 | * unauthorised stations unless they are EAPOL frames from the | 1475 | * EAPOL frames from the local station. |
1476 | * local station. | ||
1477 | */ | 1476 | */ |
1478 | if (unlikely(sdata->ieee802_1x_pac && | 1477 | if (unlikely(!is_multicast_ether_addr(hdr.addr1) && |
1479 | !is_multicast_ether_addr(hdr.addr1) && | ||
1480 | !(sta_flags & WLAN_STA_AUTHORIZED) && | 1478 | !(sta_flags & WLAN_STA_AUTHORIZED) && |
1481 | !(ethertype == ETH_P_PAE && | 1479 | !(ethertype == ETH_P_PAE && |
1482 | compare_ether_addr(dev->dev_addr, | 1480 | compare_ether_addr(dev->dev_addr, |