diff options
-rw-r--r-- | include/net/mac80211.h | 1 | ||||
-rw-r--r-- | net/mac80211/ieee80211.c | 181 | ||||
-rw-r--r-- | net/mac80211/ieee80211_i.h | 9 | ||||
-rw-r--r-- | net/mac80211/ieee80211_iface.c | 66 | ||||
-rw-r--r-- | net/mac80211/ieee80211_rate.c | 3 | ||||
-rw-r--r-- | net/mac80211/ieee80211_rate.h | 2 | ||||
-rw-r--r-- | net/mac80211/ieee80211_sta.c | 2 | ||||
-rw-r--r-- | net/mac80211/rx.c | 32 | ||||
-rw-r--r-- | net/mac80211/tx.c | 14 | ||||
-rw-r--r-- | net/mac80211/wme.c | 10 |
10 files changed, 14 insertions, 306 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index bd72f59e98fd..c143ac8965db 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -472,7 +472,6 @@ struct ieee80211_conf { | |||
472 | enum ieee80211_if_types { | 472 | enum ieee80211_if_types { |
473 | IEEE80211_IF_TYPE_INVALID, | 473 | IEEE80211_IF_TYPE_INVALID, |
474 | IEEE80211_IF_TYPE_AP, | 474 | IEEE80211_IF_TYPE_AP, |
475 | IEEE80211_IF_TYPE_MGMT, | ||
476 | IEEE80211_IF_TYPE_STA, | 475 | IEEE80211_IF_TYPE_STA, |
477 | IEEE80211_IF_TYPE_IBSS, | 476 | IEEE80211_IF_TYPE_IBSS, |
478 | IEEE80211_IF_TYPE_MNTR, | 477 | IEEE80211_IF_TYPE_MNTR, |
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c index 373e8b728782..804da5e89bbf 100644 --- a/net/mac80211/ieee80211.c +++ b/net/mac80211/ieee80211.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <net/net_namespace.h> | 24 | #include <net/net_namespace.h> |
25 | #include <net/cfg80211.h> | 25 | #include <net/cfg80211.h> |
26 | 26 | ||
27 | #include "ieee80211_common.h" | ||
28 | #include "ieee80211_i.h" | 27 | #include "ieee80211_i.h" |
29 | #include "ieee80211_rate.h" | 28 | #include "ieee80211_rate.h" |
30 | #include "wep.h" | 29 | #include "wep.h" |
@@ -123,151 +122,6 @@ static void ieee80211_master_set_multicast_list(struct net_device *dev) | |||
123 | ieee80211_configure_filter(local); | 122 | ieee80211_configure_filter(local); |
124 | } | 123 | } |
125 | 124 | ||
126 | /* management interface */ | ||
127 | |||
128 | static void | ||
129 | ieee80211_fill_frame_info(struct ieee80211_local *local, | ||
130 | struct ieee80211_frame_info *fi, | ||
131 | struct ieee80211_rx_status *status) | ||
132 | { | ||
133 | if (status) { | ||
134 | struct timespec ts; | ||
135 | struct ieee80211_rate *rate; | ||
136 | |||
137 | jiffies_to_timespec(jiffies, &ts); | ||
138 | fi->hosttime = cpu_to_be64((u64) ts.tv_sec * 1000000 + | ||
139 | ts.tv_nsec / 1000); | ||
140 | fi->mactime = cpu_to_be64(status->mactime); | ||
141 | switch (status->phymode) { | ||
142 | case MODE_IEEE80211A: | ||
143 | fi->phytype = htonl(ieee80211_phytype_ofdm_dot11_a); | ||
144 | break; | ||
145 | case MODE_IEEE80211B: | ||
146 | fi->phytype = htonl(ieee80211_phytype_dsss_dot11_b); | ||
147 | break; | ||
148 | case MODE_IEEE80211G: | ||
149 | fi->phytype = htonl(ieee80211_phytype_pbcc_dot11_g); | ||
150 | break; | ||
151 | default: | ||
152 | fi->phytype = htonl(0xAAAAAAAA); | ||
153 | break; | ||
154 | } | ||
155 | fi->channel = htonl(status->channel); | ||
156 | rate = ieee80211_get_rate(local, status->phymode, | ||
157 | status->rate); | ||
158 | if (rate) { | ||
159 | fi->datarate = htonl(rate->rate); | ||
160 | if (rate->flags & IEEE80211_RATE_PREAMBLE2) { | ||
161 | if (status->rate == rate->val) | ||
162 | fi->preamble = htonl(2); /* long */ | ||
163 | else if (status->rate == rate->val2) | ||
164 | fi->preamble = htonl(1); /* short */ | ||
165 | } else | ||
166 | fi->preamble = htonl(0); | ||
167 | } else { | ||
168 | fi->datarate = htonl(0); | ||
169 | fi->preamble = htonl(0); | ||
170 | } | ||
171 | |||
172 | fi->antenna = htonl(status->antenna); | ||
173 | fi->priority = htonl(0xffffffff); /* no clue */ | ||
174 | fi->ssi_type = htonl(ieee80211_ssi_raw); | ||
175 | fi->ssi_signal = htonl(status->ssi); | ||
176 | fi->ssi_noise = 0x00000000; | ||
177 | fi->encoding = 0; | ||
178 | } else { | ||
179 | /* clear everything because we really don't know. | ||
180 | * the msg_type field isn't present on monitor frames | ||
181 | * so we don't know whether it will be present or not, | ||
182 | * but it's ok to not clear it since it'll be assigned | ||
183 | * anyway */ | ||
184 | memset(fi, 0, sizeof(*fi) - sizeof(fi->msg_type)); | ||
185 | |||
186 | fi->ssi_type = htonl(ieee80211_ssi_none); | ||
187 | } | ||
188 | fi->version = htonl(IEEE80211_FI_VERSION); | ||
189 | fi->length = cpu_to_be32(sizeof(*fi) - sizeof(fi->msg_type)); | ||
190 | } | ||
191 | |||
192 | /* this routine is actually not just for this, but also | ||
193 | * for pushing fake 'management' frames into userspace. | ||
194 | * it shall be replaced by a netlink-based system. */ | ||
195 | void | ||
196 | ieee80211_rx_mgmt(struct ieee80211_local *local, struct sk_buff *skb, | ||
197 | struct ieee80211_rx_status *status, u32 msg_type) | ||
198 | { | ||
199 | struct ieee80211_frame_info *fi; | ||
200 | const size_t hlen = sizeof(struct ieee80211_frame_info); | ||
201 | struct net_device *dev = local->apdev; | ||
202 | |||
203 | skb->dev = dev; | ||
204 | |||
205 | if (skb_headroom(skb) < hlen) { | ||
206 | I802_DEBUG_INC(local->rx_expand_skb_head); | ||
207 | if (pskb_expand_head(skb, hlen, 0, GFP_ATOMIC)) { | ||
208 | dev_kfree_skb(skb); | ||
209 | return; | ||
210 | } | ||
211 | } | ||
212 | |||
213 | fi = (struct ieee80211_frame_info *) skb_push(skb, hlen); | ||
214 | |||
215 | ieee80211_fill_frame_info(local, fi, status); | ||
216 | fi->msg_type = htonl(msg_type); | ||
217 | |||
218 | dev->stats.rx_packets++; | ||
219 | dev->stats.rx_bytes += skb->len; | ||
220 | |||
221 | skb_set_mac_header(skb, 0); | ||
222 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
223 | skb->pkt_type = PACKET_OTHERHOST; | ||
224 | skb->protocol = htons(ETH_P_802_2); | ||
225 | memset(skb->cb, 0, sizeof(skb->cb)); | ||
226 | netif_rx(skb); | ||
227 | } | ||
228 | |||
229 | static int ieee80211_mgmt_open(struct net_device *dev) | ||
230 | { | ||
231 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
232 | |||
233 | if (!netif_running(local->mdev)) | ||
234 | return -EOPNOTSUPP; | ||
235 | return 0; | ||
236 | } | ||
237 | |||
238 | static int ieee80211_mgmt_stop(struct net_device *dev) | ||
239 | { | ||
240 | return 0; | ||
241 | } | ||
242 | |||
243 | static int ieee80211_change_mtu_apdev(struct net_device *dev, int new_mtu) | ||
244 | { | ||
245 | /* FIX: what would be proper limits for MTU? | ||
246 | * This interface uses 802.11 frames. */ | ||
247 | if (new_mtu < 256 || new_mtu > IEEE80211_MAX_DATA_LEN) { | ||
248 | printk(KERN_WARNING "%s: invalid MTU %d\n", | ||
249 | dev->name, new_mtu); | ||
250 | return -EINVAL; | ||
251 | } | ||
252 | |||
253 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | ||
254 | printk(KERN_DEBUG "%s: setting MTU %d\n", dev->name, new_mtu); | ||
255 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ | ||
256 | dev->mtu = new_mtu; | ||
257 | return 0; | ||
258 | } | ||
259 | |||
260 | void ieee80211_if_mgmt_setup(struct net_device *dev) | ||
261 | { | ||
262 | ether_setup(dev); | ||
263 | dev->hard_start_xmit = ieee80211_mgmt_start_xmit; | ||
264 | dev->change_mtu = ieee80211_change_mtu_apdev; | ||
265 | dev->open = ieee80211_mgmt_open; | ||
266 | dev->stop = ieee80211_mgmt_stop; | ||
267 | dev->type = ARPHRD_IEEE80211_PRISM; | ||
268 | dev->destructor = ieee80211_if_free; | ||
269 | } | ||
270 | |||
271 | /* regular interfaces */ | 125 | /* regular interfaces */ |
272 | 126 | ||
273 | static int ieee80211_change_mtu(struct net_device *dev, int new_mtu) | 127 | static int ieee80211_change_mtu(struct net_device *dev, int new_mtu) |
@@ -345,7 +199,6 @@ static int ieee80211_open(struct net_device *dev) | |||
345 | return -ENOLINK; | 199 | return -ENOLINK; |
346 | break; | 200 | break; |
347 | case IEEE80211_IF_TYPE_AP: | 201 | case IEEE80211_IF_TYPE_AP: |
348 | case IEEE80211_IF_TYPE_MGMT: | ||
349 | case IEEE80211_IF_TYPE_STA: | 202 | case IEEE80211_IF_TYPE_STA: |
350 | case IEEE80211_IF_TYPE_MNTR: | 203 | case IEEE80211_IF_TYPE_MNTR: |
351 | case IEEE80211_IF_TYPE_IBSS: | 204 | case IEEE80211_IF_TYPE_IBSS: |
@@ -410,10 +263,6 @@ static int ieee80211_open(struct net_device *dev) | |||
410 | if (local->open_count == 0) { | 263 | if (local->open_count == 0) { |
411 | res = dev_open(local->mdev); | 264 | res = dev_open(local->mdev); |
412 | WARN_ON(res); | 265 | WARN_ON(res); |
413 | if (local->apdev) { | ||
414 | res = dev_open(local->apdev); | ||
415 | WARN_ON(res); | ||
416 | } | ||
417 | tasklet_enable(&local->tx_pending_tasklet); | 266 | tasklet_enable(&local->tx_pending_tasklet); |
418 | tasklet_enable(&local->tasklet); | 267 | tasklet_enable(&local->tasklet); |
419 | } | 268 | } |
@@ -499,9 +348,6 @@ static int ieee80211_stop(struct net_device *dev) | |||
499 | if (netif_running(local->mdev)) | 348 | if (netif_running(local->mdev)) |
500 | dev_close(local->mdev); | 349 | dev_close(local->mdev); |
501 | 350 | ||
502 | if (local->apdev) | ||
503 | dev_close(local->apdev); | ||
504 | |||
505 | if (local->ops->stop) | 351 | if (local->ops->stop) |
506 | local->ops->stop(local_to_hw(local)); | 352 | local->ops->stop(local_to_hw(local)); |
507 | 353 | ||
@@ -550,7 +396,7 @@ static const struct header_ops ieee80211_header_ops = { | |||
550 | .cache_update = eth_header_cache_update, | 396 | .cache_update = eth_header_cache_update, |
551 | }; | 397 | }; |
552 | 398 | ||
553 | /* Must not be called for mdev and apdev */ | 399 | /* Must not be called for mdev */ |
554 | void ieee80211_if_setup(struct net_device *dev) | 400 | void ieee80211_if_setup(struct net_device *dev) |
555 | { | 401 | { |
556 | ether_setup(dev); | 402 | ether_setup(dev); |
@@ -806,8 +652,6 @@ static void ieee80211_remove_tx_extra(struct ieee80211_local *local, | |||
806 | pkt_data->flags |= IEEE80211_TXPD_DO_NOT_ENCRYPT; | 652 | pkt_data->flags |= IEEE80211_TXPD_DO_NOT_ENCRYPT; |
807 | if (control->flags & IEEE80211_TXCTL_REQUEUE) | 653 | if (control->flags & IEEE80211_TXCTL_REQUEUE) |
808 | pkt_data->flags |= IEEE80211_TXPD_REQUEUE; | 654 | pkt_data->flags |= IEEE80211_TXPD_REQUEUE; |
809 | if (control->type == IEEE80211_IF_TYPE_MGMT) | ||
810 | pkt_data->flags |= IEEE80211_TXPD_MGMT_IFACE; | ||
811 | pkt_data->queue = control->queue; | 655 | pkt_data->queue = control->queue; |
812 | 656 | ||
813 | hdrlen = ieee80211_get_hdrlen_from_skb(skb); | 657 | hdrlen = ieee80211_get_hdrlen_from_skb(skb); |
@@ -860,7 +704,6 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
860 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | 704 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; |
861 | struct ieee80211_local *local = hw_to_local(hw); | 705 | struct ieee80211_local *local = hw_to_local(hw); |
862 | u16 frag, type; | 706 | u16 frag, type; |
863 | u32 msg_type; | ||
864 | struct ieee80211_tx_status_rtap_hdr *rthdr; | 707 | struct ieee80211_tx_status_rtap_hdr *rthdr; |
865 | struct ieee80211_sub_if_data *sdata; | 708 | struct ieee80211_sub_if_data *sdata; |
866 | int monitors; | 709 | int monitors; |
@@ -975,29 +818,9 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
975 | local->dot11FailedCount++; | 818 | local->dot11FailedCount++; |
976 | } | 819 | } |
977 | 820 | ||
978 | msg_type = (status->flags & IEEE80211_TX_STATUS_ACK) ? | ||
979 | ieee80211_msg_tx_callback_ack : ieee80211_msg_tx_callback_fail; | ||
980 | |||
981 | /* this was a transmitted frame, but now we want to reuse it */ | 821 | /* this was a transmitted frame, but now we want to reuse it */ |
982 | skb_orphan(skb); | 822 | skb_orphan(skb); |
983 | 823 | ||
984 | if ((status->control.flags & IEEE80211_TXCTL_REQ_TX_STATUS) && | ||
985 | local->apdev) { | ||
986 | if (local->monitors) { | ||
987 | skb2 = skb_clone(skb, GFP_ATOMIC); | ||
988 | } else { | ||
989 | skb2 = skb; | ||
990 | skb = NULL; | ||
991 | } | ||
992 | |||
993 | if (skb2) | ||
994 | /* Send frame to hostapd */ | ||
995 | ieee80211_rx_mgmt(local, skb2, NULL, msg_type); | ||
996 | |||
997 | if (!skb) | ||
998 | return; | ||
999 | } | ||
1000 | |||
1001 | if (!local->monitors) { | 824 | if (!local->monitors) { |
1002 | dev_kfree_skb(skb); | 825 | dev_kfree_skb(skb); |
1003 | return; | 826 | return; |
@@ -1344,8 +1167,6 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw) | |||
1344 | BUG_ON(local->reg_state != IEEE80211_DEV_REGISTERED); | 1167 | BUG_ON(local->reg_state != IEEE80211_DEV_REGISTERED); |
1345 | 1168 | ||
1346 | local->reg_state = IEEE80211_DEV_UNREGISTERED; | 1169 | local->reg_state = IEEE80211_DEV_UNREGISTERED; |
1347 | if (local->apdev) | ||
1348 | ieee80211_if_del_mgmt(local); | ||
1349 | 1170 | ||
1350 | /* | 1171 | /* |
1351 | * At this point, interface list manipulations are fine | 1172 | * At this point, interface list manipulations are fine |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 9e3c365e3f03..d24b0574c436 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -141,7 +141,6 @@ struct ieee80211_txrx_data { | |||
141 | * when using CTS protection with IEEE 802.11g. */ | 141 | * when using CTS protection with IEEE 802.11g. */ |
142 | struct ieee80211_rate *last_frag_rate; | 142 | struct ieee80211_rate *last_frag_rate; |
143 | int last_frag_hwrate; | 143 | int last_frag_hwrate; |
144 | int mgmt_interface; | ||
145 | 144 | ||
146 | /* Extra fragments (in addition to the first fragment | 145 | /* Extra fragments (in addition to the first fragment |
147 | * in skb) */ | 146 | * in skb) */ |
@@ -163,7 +162,6 @@ struct ieee80211_txrx_data { | |||
163 | #define IEEE80211_TXPD_REQ_TX_STATUS BIT(0) | 162 | #define IEEE80211_TXPD_REQ_TX_STATUS BIT(0) |
164 | #define IEEE80211_TXPD_DO_NOT_ENCRYPT BIT(1) | 163 | #define IEEE80211_TXPD_DO_NOT_ENCRYPT BIT(1) |
165 | #define IEEE80211_TXPD_REQUEUE BIT(2) | 164 | #define IEEE80211_TXPD_REQUEUE BIT(2) |
166 | #define IEEE80211_TXPD_MGMT_IFACE BIT(3) | ||
167 | /* Stored in sk_buff->cb */ | 165 | /* Stored in sk_buff->cb */ |
168 | struct ieee80211_tx_packet_data { | 166 | struct ieee80211_tx_packet_data { |
169 | int ifindex; | 167 | int ifindex; |
@@ -408,7 +406,6 @@ struct ieee80211_local { | |||
408 | struct list_head modes_list; | 406 | struct list_head modes_list; |
409 | 407 | ||
410 | struct net_device *mdev; /* wmaster# - "master" 802.11 device */ | 408 | struct net_device *mdev; /* wmaster# - "master" 802.11 device */ |
411 | struct net_device *apdev; /* wlan#ap - management frames (hostapd) */ | ||
412 | int open_count; | 409 | int open_count; |
413 | int monitors; | 410 | int monitors; |
414 | unsigned int filter_flags; /* FIF_* */ | 411 | unsigned int filter_flags; /* FIF_* */ |
@@ -704,14 +701,11 @@ static inline int ieee80211_bssid_match(const u8 *raddr, const u8 *addr) | |||
704 | int ieee80211_hw_config(struct ieee80211_local *local); | 701 | int ieee80211_hw_config(struct ieee80211_local *local); |
705 | int ieee80211_if_config(struct net_device *dev); | 702 | int ieee80211_if_config(struct net_device *dev); |
706 | int ieee80211_if_config_beacon(struct net_device *dev); | 703 | int ieee80211_if_config_beacon(struct net_device *dev); |
707 | void ieee80211_rx_mgmt(struct ieee80211_local *local, struct sk_buff *skb, | ||
708 | struct ieee80211_rx_status *status, u32 msg_type); | ||
709 | void ieee80211_prepare_rates(struct ieee80211_local *local, | 704 | void ieee80211_prepare_rates(struct ieee80211_local *local, |
710 | struct ieee80211_hw_mode *mode); | 705 | struct ieee80211_hw_mode *mode); |
711 | void ieee80211_tx_set_iswep(struct ieee80211_txrx_data *tx); | 706 | void ieee80211_tx_set_iswep(struct ieee80211_txrx_data *tx); |
712 | int ieee80211_if_update_wds(struct net_device *dev, u8 *remote_addr); | 707 | int ieee80211_if_update_wds(struct net_device *dev, u8 *remote_addr); |
713 | void ieee80211_if_setup(struct net_device *dev); | 708 | void ieee80211_if_setup(struct net_device *dev); |
714 | void ieee80211_if_mgmt_setup(struct net_device *dev); | ||
715 | struct ieee80211_rate *ieee80211_get_rate(struct ieee80211_local *local, | 709 | struct ieee80211_rate *ieee80211_get_rate(struct ieee80211_local *local, |
716 | int phymode, int hwrate); | 710 | int phymode, int hwrate); |
717 | 711 | ||
@@ -778,8 +772,6 @@ void __ieee80211_if_del(struct ieee80211_local *local, | |||
778 | int ieee80211_if_remove(struct net_device *dev, const char *name, int id); | 772 | int ieee80211_if_remove(struct net_device *dev, const char *name, int id); |
779 | void ieee80211_if_free(struct net_device *dev); | 773 | void ieee80211_if_free(struct net_device *dev); |
780 | void ieee80211_if_sdata_init(struct ieee80211_sub_if_data *sdata); | 774 | void ieee80211_if_sdata_init(struct ieee80211_sub_if_data *sdata); |
781 | int ieee80211_if_add_mgmt(struct ieee80211_local *local); | ||
782 | void ieee80211_if_del_mgmt(struct ieee80211_local *local); | ||
783 | 775 | ||
784 | /* regdomain.c */ | 776 | /* regdomain.c */ |
785 | void ieee80211_regdomain_init(void); | 777 | void ieee80211_regdomain_init(void); |
@@ -796,7 +788,6 @@ void ieee80211_tx_pending(unsigned long data); | |||
796 | int ieee80211_master_start_xmit(struct sk_buff *skb, struct net_device *dev); | 788 | int ieee80211_master_start_xmit(struct sk_buff *skb, struct net_device *dev); |
797 | int ieee80211_monitor_start_xmit(struct sk_buff *skb, struct net_device *dev); | 789 | int ieee80211_monitor_start_xmit(struct sk_buff *skb, struct net_device *dev); |
798 | int ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev); | 790 | int ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev); |
799 | int ieee80211_mgmt_start_xmit(struct sk_buff *skb, struct net_device *dev); | ||
800 | 791 | ||
801 | /* utility functions/constants */ | 792 | /* utility functions/constants */ |
802 | extern void *mac80211_wiphy_privid; /* for wiphy privid */ | 793 | extern void *mac80211_wiphy_privid; /* for wiphy privid */ |
diff --git a/net/mac80211/ieee80211_iface.c b/net/mac80211/ieee80211_iface.c index ef618e947e2b..be7e77f66fee 100644 --- a/net/mac80211/ieee80211_iface.c +++ b/net/mac80211/ieee80211_iface.c | |||
@@ -96,66 +96,6 @@ fail: | |||
96 | return ret; | 96 | return ret; |
97 | } | 97 | } |
98 | 98 | ||
99 | int ieee80211_if_add_mgmt(struct ieee80211_local *local) | ||
100 | { | ||
101 | struct net_device *ndev; | ||
102 | struct ieee80211_sub_if_data *nsdata; | ||
103 | int ret; | ||
104 | |||
105 | ASSERT_RTNL(); | ||
106 | |||
107 | ndev = alloc_netdev(sizeof(struct ieee80211_sub_if_data), "wmgmt%d", | ||
108 | ieee80211_if_mgmt_setup); | ||
109 | if (!ndev) | ||
110 | return -ENOMEM; | ||
111 | ret = dev_alloc_name(ndev, ndev->name); | ||
112 | if (ret < 0) | ||
113 | goto fail; | ||
114 | |||
115 | memcpy(ndev->dev_addr, local->hw.wiphy->perm_addr, ETH_ALEN); | ||
116 | SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy)); | ||
117 | |||
118 | nsdata = IEEE80211_DEV_TO_SUB_IF(ndev); | ||
119 | ndev->ieee80211_ptr = &nsdata->wdev; | ||
120 | nsdata->wdev.wiphy = local->hw.wiphy; | ||
121 | nsdata->type = IEEE80211_IF_TYPE_MGMT; | ||
122 | nsdata->dev = ndev; | ||
123 | nsdata->local = local; | ||
124 | ieee80211_if_sdata_init(nsdata); | ||
125 | |||
126 | ret = register_netdevice(ndev); | ||
127 | if (ret) | ||
128 | goto fail; | ||
129 | |||
130 | /* | ||
131 | * Called even when register_netdevice fails, it would | ||
132 | * oops if assigned before initialising the rest. | ||
133 | */ | ||
134 | ndev->uninit = ieee80211_if_reinit; | ||
135 | |||
136 | ieee80211_debugfs_add_netdev(nsdata); | ||
137 | |||
138 | if (local->open_count > 0) | ||
139 | dev_open(ndev); | ||
140 | local->apdev = ndev; | ||
141 | return 0; | ||
142 | |||
143 | fail: | ||
144 | free_netdev(ndev); | ||
145 | return ret; | ||
146 | } | ||
147 | |||
148 | void ieee80211_if_del_mgmt(struct ieee80211_local *local) | ||
149 | { | ||
150 | struct net_device *apdev; | ||
151 | |||
152 | ASSERT_RTNL(); | ||
153 | apdev = local->apdev; | ||
154 | ieee80211_debugfs_remove_netdev(IEEE80211_DEV_TO_SUB_IF(apdev)); | ||
155 | local->apdev = NULL; | ||
156 | unregister_netdevice(apdev); | ||
157 | } | ||
158 | |||
159 | void ieee80211_if_set_type(struct net_device *dev, int type) | 99 | void ieee80211_if_set_type(struct net_device *dev, int type) |
160 | { | 100 | { |
161 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 101 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
@@ -247,9 +187,6 @@ void ieee80211_if_reinit(struct net_device *dev) | |||
247 | /* cannot happen */ | 187 | /* cannot happen */ |
248 | WARN_ON(1); | 188 | WARN_ON(1); |
249 | break; | 189 | break; |
250 | case IEEE80211_IF_TYPE_MGMT: | ||
251 | /* nothing to do */ | ||
252 | break; | ||
253 | case IEEE80211_IF_TYPE_AP: { | 190 | case IEEE80211_IF_TYPE_AP: { |
254 | /* Remove all virtual interfaces that use this BSS | 191 | /* Remove all virtual interfaces that use this BSS |
255 | * as their sdata->bss */ | 192 | * as their sdata->bss */ |
@@ -357,11 +294,8 @@ int ieee80211_if_remove(struct net_device *dev, const char *name, int id) | |||
357 | 294 | ||
358 | void ieee80211_if_free(struct net_device *dev) | 295 | void ieee80211_if_free(struct net_device *dev) |
359 | { | 296 | { |
360 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
361 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 297 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
362 | 298 | ||
363 | /* local->apdev must be NULL when freeing management interface */ | ||
364 | BUG_ON(dev == local->apdev); | ||
365 | ieee80211_if_sdata_deinit(sdata); | 299 | ieee80211_if_sdata_deinit(sdata); |
366 | free_netdev(dev); | 300 | free_netdev(dev); |
367 | } | 301 | } |
diff --git a/net/mac80211/ieee80211_rate.c b/net/mac80211/ieee80211_rate.c index 91a9fe2cbad9..93abb8fff141 100644 --- a/net/mac80211/ieee80211_rate.c +++ b/net/mac80211/ieee80211_rate.c | |||
@@ -145,8 +145,7 @@ int ieee80211_init_rate_ctrl_alg(struct ieee80211_local *local, | |||
145 | struct rate_control_ref *ref, *old; | 145 | struct rate_control_ref *ref, *old; |
146 | 146 | ||
147 | ASSERT_RTNL(); | 147 | ASSERT_RTNL(); |
148 | if (local->open_count || netif_running(local->mdev) || | 148 | if (local->open_count || netif_running(local->mdev)) |
149 | (local->apdev && netif_running(local->apdev))) | ||
150 | return -EBUSY; | 149 | return -EBUSY; |
151 | 150 | ||
152 | ref = rate_control_alloc(name, local); | 151 | ref = rate_control_alloc(name, local); |
diff --git a/net/mac80211/ieee80211_rate.h b/net/mac80211/ieee80211_rate.h index cac91a960ff4..7cd1ebab4f83 100644 --- a/net/mac80211/ieee80211_rate.h +++ b/net/mac80211/ieee80211_rate.h | |||
@@ -30,8 +30,6 @@ struct rate_control_extra { | |||
30 | 30 | ||
31 | /* parameters from the caller to rate_control_get_rate(): */ | 31 | /* parameters from the caller to rate_control_get_rate(): */ |
32 | struct ieee80211_hw_mode *mode; | 32 | struct ieee80211_hw_mode *mode; |
33 | int mgmt_data; /* this is data frame that is used for management | ||
34 | * (e.g., IEEE 802.1X EAPOL) */ | ||
35 | u16 ethertype; | 33 | u16 ethertype; |
36 | }; | 34 | }; |
37 | 35 | ||
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c index cf50a7bfb970..bd9d7aa74083 100644 --- a/net/mac80211/ieee80211_sta.c +++ b/net/mac80211/ieee80211_sta.c | |||
@@ -473,8 +473,6 @@ static void ieee80211_sta_tx(struct net_device *dev, struct sk_buff *skb, | |||
473 | pkt_data = (struct ieee80211_tx_packet_data *) skb->cb; | 473 | pkt_data = (struct ieee80211_tx_packet_data *) skb->cb; |
474 | memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data)); | 474 | memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data)); |
475 | pkt_data->ifindex = sdata->dev->ifindex; | 475 | pkt_data->ifindex = sdata->dev->ifindex; |
476 | if (sdata->type == IEEE80211_IF_TYPE_MGMT) | ||
477 | pkt_data->flags |= IEEE80211_TXPD_MGMT_IFACE; | ||
478 | if (!encrypt) | 476 | if (!encrypt) |
479 | pkt_data->flags |= IEEE80211_TXPD_DO_NOT_ENCRYPT; | 477 | pkt_data->flags |= IEEE80211_TXPD_DO_NOT_ENCRYPT; |
480 | 478 | ||
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index b4a62fe3ccbd..7cd185e9dde4 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -19,7 +19,6 @@ | |||
19 | 19 | ||
20 | #include "ieee80211_i.h" | 20 | #include "ieee80211_i.h" |
21 | #include "ieee80211_led.h" | 21 | #include "ieee80211_led.h" |
22 | #include "ieee80211_common.h" | ||
23 | #include "wep.h" | 22 | #include "wep.h" |
24 | #include "wpa.h" | 23 | #include "wpa.h" |
25 | #include "tkip.h" | 24 | #include "tkip.h" |
@@ -412,12 +411,7 @@ ieee80211_rx_h_check(struct ieee80211_txrx_data *rx) | |||
412 | return TXRX_DROP; | 411 | return TXRX_DROP; |
413 | } | 412 | } |
414 | 413 | ||
415 | if (!rx->local->apdev) | 414 | return TXRX_DROP; |
416 | return TXRX_DROP; | ||
417 | |||
418 | ieee80211_rx_mgmt(rx->local, rx->skb, rx->u.rx.status, | ||
419 | ieee80211_msg_sta_not_assoc); | ||
420 | return TXRX_QUEUED; | ||
421 | } | 415 | } |
422 | 416 | ||
423 | return TXRX_CONTINUE; | 417 | return TXRX_CONTINUE; |
@@ -983,15 +977,8 @@ ieee80211_rx_h_802_1x_pae(struct ieee80211_txrx_data *rx) | |||
983 | { | 977 | { |
984 | if (rx->sdata->eapol && ieee80211_is_eapol(rx->skb) && | 978 | if (rx->sdata->eapol && ieee80211_is_eapol(rx->skb) && |
985 | rx->sdata->type != IEEE80211_IF_TYPE_STA && | 979 | rx->sdata->type != IEEE80211_IF_TYPE_STA && |
986 | (rx->flags & IEEE80211_TXRXD_RXRA_MATCH)) { | 980 | (rx->flags & IEEE80211_TXRXD_RXRA_MATCH)) |
987 | /* Pass both encrypted and unencrypted EAPOL frames to user | 981 | return TXRX_CONTINUE; |
988 | * space for processing. */ | ||
989 | if (!rx->local->apdev) | ||
990 | return TXRX_DROP; | ||
991 | ieee80211_rx_mgmt(rx->local, rx->skb, rx->u.rx.status, | ||
992 | ieee80211_msg_normal); | ||
993 | return TXRX_QUEUED; | ||
994 | } | ||
995 | 982 | ||
996 | if (unlikely(rx->sdata->ieee802_1x && | 983 | if (unlikely(rx->sdata->ieee802_1x && |
997 | (rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA && | 984 | (rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA && |
@@ -1233,15 +1220,11 @@ ieee80211_rx_h_mgmt(struct ieee80211_txrx_data *rx) | |||
1233 | sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev); | 1220 | sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev); |
1234 | if ((sdata->type == IEEE80211_IF_TYPE_STA || | 1221 | if ((sdata->type == IEEE80211_IF_TYPE_STA || |
1235 | sdata->type == IEEE80211_IF_TYPE_IBSS) && | 1222 | sdata->type == IEEE80211_IF_TYPE_IBSS) && |
1236 | !rx->local->user_space_mlme) { | 1223 | !rx->local->user_space_mlme) |
1237 | ieee80211_sta_rx_mgmt(rx->dev, rx->skb, rx->u.rx.status); | 1224 | ieee80211_sta_rx_mgmt(rx->dev, rx->skb, rx->u.rx.status); |
1238 | } else { | 1225 | else |
1239 | /* Management frames are sent to hostapd for processing */ | 1226 | return TXRX_DROP; |
1240 | if (!rx->local->apdev) | 1227 | |
1241 | return TXRX_DROP; | ||
1242 | ieee80211_rx_mgmt(rx->local, rx->skb, rx->u.rx.status, | ||
1243 | ieee80211_msg_normal); | ||
1244 | } | ||
1245 | return TXRX_QUEUED; | 1228 | return TXRX_QUEUED; |
1246 | } | 1229 | } |
1247 | 1230 | ||
@@ -1454,7 +1437,6 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata, | |||
1454 | /* take everything */ | 1437 | /* take everything */ |
1455 | break; | 1438 | break; |
1456 | case IEEE80211_IF_TYPE_INVALID: | 1439 | case IEEE80211_IF_TYPE_INVALID: |
1457 | case IEEE80211_IF_TYPE_MGMT: | ||
1458 | /* should never get here */ | 1440 | /* should never get here */ |
1459 | WARN_ON(1); | 1441 | WARN_ON(1); |
1460 | break; | 1442 | break; |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 54e05392410d..8f0007a925a2 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -258,7 +258,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_txrx_data *tx) | |||
258 | return TXRX_CONTINUE; | 258 | return TXRX_CONTINUE; |
259 | } | 259 | } |
260 | 260 | ||
261 | if (unlikely(!tx->u.tx.mgmt_interface && tx->sdata->ieee802_1x && | 261 | if (unlikely(/* !injected && */ tx->sdata->ieee802_1x && |
262 | !(sta_flags & WLAN_STA_AUTHORIZED))) { | 262 | !(sta_flags & WLAN_STA_AUTHORIZED))) { |
263 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | 263 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG |
264 | DECLARE_MAC_BUF(mac); | 264 | DECLARE_MAC_BUF(mac); |
@@ -570,8 +570,6 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_txrx_data *tx) | |||
570 | 570 | ||
571 | memset(&extra, 0, sizeof(extra)); | 571 | memset(&extra, 0, sizeof(extra)); |
572 | extra.mode = tx->u.tx.mode; | 572 | extra.mode = tx->u.tx.mode; |
573 | extra.mgmt_data = tx->sdata && | ||
574 | tx->sdata->type == IEEE80211_IF_TYPE_MGMT; | ||
575 | extra.ethertype = tx->ethertype; | 573 | extra.ethertype = tx->ethertype; |
576 | 574 | ||
577 | tx->u.tx.rate = rate_control_get_rate(tx->local, tx->dev, tx->skb, | 575 | tx->u.tx.rate = rate_control_get_rate(tx->local, tx->dev, tx->skb, |
@@ -1069,7 +1067,7 @@ static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb, | |||
1069 | } | 1067 | } |
1070 | 1068 | ||
1071 | static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, | 1069 | static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, |
1072 | struct ieee80211_tx_control *control, int mgmt) | 1070 | struct ieee80211_tx_control *control) |
1073 | { | 1071 | { |
1074 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 1072 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
1075 | struct sta_info *sta; | 1073 | struct sta_info *sta; |
@@ -1099,7 +1097,6 @@ static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, | |||
1099 | rcu_read_lock(); | 1097 | rcu_read_lock(); |
1100 | 1098 | ||
1101 | sta = tx.sta; | 1099 | sta = tx.sta; |
1102 | tx.u.tx.mgmt_interface = mgmt; | ||
1103 | tx.u.tx.mode = local->hw.conf.mode; | 1100 | tx.u.tx.mode = local->hw.conf.mode; |
1104 | 1101 | ||
1105 | if (res_prepare == TXRX_QUEUED) { /* if it was an injected packet */ | 1102 | if (res_prepare == TXRX_QUEUED) { /* if it was an injected packet */ |
@@ -1250,8 +1247,7 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, | |||
1250 | control.flags |= IEEE80211_TXCTL_REQUEUE; | 1247 | control.flags |= IEEE80211_TXCTL_REQUEUE; |
1251 | control.queue = pkt_data->queue; | 1248 | control.queue = pkt_data->queue; |
1252 | 1249 | ||
1253 | ret = ieee80211_tx(odev, skb, &control, | 1250 | ret = ieee80211_tx(odev, skb, &control); |
1254 | control.type == IEEE80211_IF_TYPE_MGMT); | ||
1255 | dev_put(odev); | 1251 | dev_put(odev); |
1256 | 1252 | ||
1257 | return ret; | 1253 | return ret; |
@@ -1496,8 +1492,6 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1496 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; | 1492 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; |
1497 | memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data)); | 1493 | memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data)); |
1498 | pkt_data->ifindex = dev->ifindex; | 1494 | pkt_data->ifindex = dev->ifindex; |
1499 | if (sdata->type == IEEE80211_IF_TYPE_MGMT) | ||
1500 | pkt_data->flags |= IEEE80211_TXPD_MGMT_IFACE; | ||
1501 | 1495 | ||
1502 | skb->dev = local->mdev; | 1496 | skb->dev = local->mdev; |
1503 | dev->stats.tx_packets++; | 1497 | dev->stats.tx_packets++; |
@@ -1555,8 +1549,6 @@ int ieee80211_mgmt_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1555 | pkt_data = (struct ieee80211_tx_packet_data *) skb->cb; | 1549 | pkt_data = (struct ieee80211_tx_packet_data *) skb->cb; |
1556 | memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data)); | 1550 | memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data)); |
1557 | pkt_data->ifindex = sdata->dev->ifindex; | 1551 | pkt_data->ifindex = sdata->dev->ifindex; |
1558 | if (sdata->type == IEEE80211_IF_TYPE_MGMT) | ||
1559 | pkt_data->flags |= IEEE80211_TXPD_MGMT_IFACE; | ||
1560 | 1552 | ||
1561 | skb->priority = 20; /* use hardcoded priority for mgmt TX queue */ | 1553 | skb->priority = 20; /* use hardcoded priority for mgmt TX queue */ |
1562 | skb->dev = sdata->local->mdev; | 1554 | skb->dev = sdata->local->mdev; |
diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c index fcc8921722f4..5b8a157975a3 100644 --- a/net/mac80211/wme.c +++ b/net/mac80211/wme.c | |||
@@ -94,8 +94,6 @@ static inline int wme_downgrade_ac(struct sk_buff *skb) | |||
94 | static inline int classify80211(struct sk_buff *skb, struct Qdisc *qd) | 94 | static inline int classify80211(struct sk_buff *skb, struct Qdisc *qd) |
95 | { | 95 | { |
96 | struct ieee80211_local *local = wdev_priv(qd->dev->ieee80211_ptr); | 96 | struct ieee80211_local *local = wdev_priv(qd->dev->ieee80211_ptr); |
97 | struct ieee80211_tx_packet_data *pkt_data = | ||
98 | (struct ieee80211_tx_packet_data *) skb->cb; | ||
99 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | 97 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; |
100 | unsigned short fc = le16_to_cpu(hdr->frame_control); | 98 | unsigned short fc = le16_to_cpu(hdr->frame_control); |
101 | int qos; | 99 | int qos; |
@@ -108,12 +106,8 @@ static inline int classify80211(struct sk_buff *skb, struct Qdisc *qd) | |||
108 | return IEEE80211_TX_QUEUE_DATA0; | 106 | return IEEE80211_TX_QUEUE_DATA0; |
109 | } | 107 | } |
110 | 108 | ||
111 | if (unlikely(pkt_data->flags & IEEE80211_TXPD_MGMT_IFACE)) { | 109 | if (0 /* injected */) { |
112 | /* Data frames from hostapd (mainly, EAPOL) use AC_VO | 110 | /* use AC from radiotap */ |
113 | * and they will include QoS control fields if | ||
114 | * the target STA is using WME. */ | ||
115 | skb->priority = 7; | ||
116 | return ieee802_1d_to_ac[skb->priority]; | ||
117 | } | 111 | } |
118 | 112 | ||
119 | /* is this a QoS frame? */ | 113 | /* is this a QoS frame? */ |