aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2015-04-22 08:40:58 -0400
committerJohannes Berg <johannes.berg@intel.com>2015-04-24 05:14:13 -0400
commitdf1404650ccbfeb76a84f301f22316be0d00a864 (patch)
tree3c866bf75c99dd402b4e152bdeefaa209f38eb8d /net
parentebd82b39bf11b38b0b50919c8d4386706b26bff7 (diff)
mac80211: remove support for IFF_PROMISC
This support is essentially useless as typically networks are encrypted, frames will be filtered by hardware, and rate scaling will be done with the intended recipient in mind. For real monitoring of the network, the monitor mode support should be used instead. Removing it removes a lot of corner cases. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/ieee80211_i.h6
-rw-r--r--net/mac80211/iface.c19
-rw-r--r--net/mac80211/main.c3
-rw-r--r--net/mac80211/rx.c33
4 files changed, 12 insertions, 49 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 556051f68ad7..7d12ba5a4a36 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -725,7 +725,6 @@ struct ieee80211_if_mesh {
725 * enum ieee80211_sub_if_data_flags - virtual interface flags 725 * enum ieee80211_sub_if_data_flags - virtual interface flags
726 * 726 *
727 * @IEEE80211_SDATA_ALLMULTI: interface wants all multicast packets 727 * @IEEE80211_SDATA_ALLMULTI: interface wants all multicast packets
728 * @IEEE80211_SDATA_PROMISC: interface is promisc
729 * @IEEE80211_SDATA_OPERATING_GMODE: operating in G-only mode 728 * @IEEE80211_SDATA_OPERATING_GMODE: operating in G-only mode
730 * @IEEE80211_SDATA_DONT_BRIDGE_PACKETS: bridge packets between 729 * @IEEE80211_SDATA_DONT_BRIDGE_PACKETS: bridge packets between
731 * associated stations and deliver multicast frames both 730 * associated stations and deliver multicast frames both
@@ -735,7 +734,6 @@ struct ieee80211_if_mesh {
735 */ 734 */
736enum ieee80211_sub_if_data_flags { 735enum ieee80211_sub_if_data_flags {
737 IEEE80211_SDATA_ALLMULTI = BIT(0), 736 IEEE80211_SDATA_ALLMULTI = BIT(0),
738 IEEE80211_SDATA_PROMISC = BIT(1),
739 IEEE80211_SDATA_OPERATING_GMODE = BIT(2), 737 IEEE80211_SDATA_OPERATING_GMODE = BIT(2),
740 IEEE80211_SDATA_DONT_BRIDGE_PACKETS = BIT(3), 738 IEEE80211_SDATA_DONT_BRIDGE_PACKETS = BIT(3),
741 IEEE80211_SDATA_DISCONNECT_RESUME = BIT(4), 739 IEEE80211_SDATA_DISCONNECT_RESUME = BIT(4),
@@ -1211,8 +1209,8 @@ struct ieee80211_local {
1211 1209
1212 atomic_t agg_queue_stop[IEEE80211_MAX_QUEUES]; 1210 atomic_t agg_queue_stop[IEEE80211_MAX_QUEUES];
1213 1211
1214 /* number of interfaces with corresponding IFF_ flags */ 1212 /* number of interfaces with allmulti RX */
1215 atomic_t iff_allmultis, iff_promiscs; 1213 atomic_t iff_allmultis;
1216 1214
1217 struct rate_control_ref *rate_ctrl; 1215 struct rate_control_ref *rate_ctrl;
1218 1216
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index b4ac596a7cb7..7791a08a560a 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -697,9 +697,6 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
697 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) 697 if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
698 atomic_inc(&local->iff_allmultis); 698 atomic_inc(&local->iff_allmultis);
699 699
700 if (sdata->flags & IEEE80211_SDATA_PROMISC)
701 atomic_inc(&local->iff_promiscs);
702
703 if (coming_up) 700 if (coming_up)
704 local->open_count++; 701 local->open_count++;
705 702
@@ -827,13 +824,10 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
827 WARN_ON_ONCE((sdata->vif.type != NL80211_IFTYPE_WDS && flushed > 0) || 824 WARN_ON_ONCE((sdata->vif.type != NL80211_IFTYPE_WDS && flushed > 0) ||
828 (sdata->vif.type == NL80211_IFTYPE_WDS && flushed != 1)); 825 (sdata->vif.type == NL80211_IFTYPE_WDS && flushed != 1));
829 826
830 /* don't count this interface for promisc/allmulti while it is down */ 827 /* don't count this interface for allmulti while it is down */
831 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) 828 if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
832 atomic_dec(&local->iff_allmultis); 829 atomic_dec(&local->iff_allmultis);
833 830
834 if (sdata->flags & IEEE80211_SDATA_PROMISC)
835 atomic_dec(&local->iff_promiscs);
836
837 if (sdata->vif.type == NL80211_IFTYPE_AP) { 831 if (sdata->vif.type == NL80211_IFTYPE_AP) {
838 local->fif_pspoll--; 832 local->fif_pspoll--;
839 local->fif_probe_req--; 833 local->fif_probe_req--;
@@ -1047,12 +1041,10 @@ static void ieee80211_set_multicast_list(struct net_device *dev)
1047{ 1041{
1048 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 1042 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1049 struct ieee80211_local *local = sdata->local; 1043 struct ieee80211_local *local = sdata->local;
1050 int allmulti, promisc, sdata_allmulti, sdata_promisc; 1044 int allmulti, sdata_allmulti;
1051 1045
1052 allmulti = !!(dev->flags & IFF_ALLMULTI); 1046 allmulti = !!(dev->flags & IFF_ALLMULTI);
1053 promisc = !!(dev->flags & IFF_PROMISC);
1054 sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI); 1047 sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI);
1055 sdata_promisc = !!(sdata->flags & IEEE80211_SDATA_PROMISC);
1056 1048
1057 if (allmulti != sdata_allmulti) { 1049 if (allmulti != sdata_allmulti) {
1058 if (dev->flags & IFF_ALLMULTI) 1050 if (dev->flags & IFF_ALLMULTI)
@@ -1062,13 +1054,6 @@ static void ieee80211_set_multicast_list(struct net_device *dev)
1062 sdata->flags ^= IEEE80211_SDATA_ALLMULTI; 1054 sdata->flags ^= IEEE80211_SDATA_ALLMULTI;
1063 } 1055 }
1064 1056
1065 if (promisc != sdata_promisc) {
1066 if (dev->flags & IFF_PROMISC)
1067 atomic_inc(&local->iff_promiscs);
1068 else
1069 atomic_dec(&local->iff_promiscs);
1070 sdata->flags ^= IEEE80211_SDATA_PROMISC;
1071 }
1072 spin_lock_bh(&local->filter_lock); 1057 spin_lock_bh(&local->filter_lock);
1073 __hw_addr_sync(&local->mc_list, &dev->mc, dev->addr_len); 1058 __hw_addr_sync(&local->mc_list, &dev->mc, dev->addr_len);
1074 spin_unlock_bh(&local->filter_lock); 1059 spin_unlock_bh(&local->filter_lock);
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index ea31f119234b..b144de971366 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -41,9 +41,6 @@ void ieee80211_configure_filter(struct ieee80211_local *local)
41 unsigned int changed_flags; 41 unsigned int changed_flags;
42 unsigned int new_flags = 0; 42 unsigned int new_flags = 0;
43 43
44 if (atomic_read(&local->iff_promiscs))
45 new_flags |= FIF_PROMISC_IN_BSS;
46
47 if (atomic_read(&local->iff_allmultis)) 44 if (atomic_read(&local->iff_allmultis))
48 new_flags |= FIF_ALLMULTI; 45 new_flags |= FIF_ALLMULTI;
49 46
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 6e3b564b6dea..99fb5d80e60a 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2331,11 +2331,9 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
2331 IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames); 2331 IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
2332 ieee80211_add_pending_skb(local, fwd_skb); 2332 ieee80211_add_pending_skb(local, fwd_skb);
2333 out: 2333 out:
2334 if (is_multicast_ether_addr(hdr->addr1) || 2334 if (is_multicast_ether_addr(hdr->addr1))
2335 sdata->dev->flags & IFF_PROMISC)
2336 return RX_CONTINUE; 2335 return RX_CONTINUE;
2337 else 2336 return RX_DROP_MONITOR;
2338 return RX_DROP_MONITOR;
2339} 2337}
2340#endif 2338#endif
2341 2339
@@ -3266,12 +3264,8 @@ static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
3266 if (!bssid && !sdata->u.mgd.use_4addr) 3264 if (!bssid && !sdata->u.mgd.use_4addr)
3267 return false; 3265 return false;
3268 if (!multicast && 3266 if (!multicast &&
3269 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) { 3267 !ether_addr_equal(sdata->vif.addr, hdr->addr1))
3270 if (!(sdata->dev->flags & IFF_PROMISC) || 3268 return false;
3271 sdata->u.mgd.use_4addr)
3272 return false;
3273 status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
3274 }
3275 break; 3269 break;
3276 case NL80211_IFTYPE_ADHOC: 3270 case NL80211_IFTYPE_ADHOC:
3277 if (!bssid) 3271 if (!bssid)
@@ -3285,9 +3279,7 @@ static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
3285 return false; 3279 return false;
3286 } else if (!multicast && 3280 } else if (!multicast &&
3287 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) { 3281 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) {
3288 if (!(sdata->dev->flags & IFF_PROMISC)) 3282 return false;
3289 return false;
3290 status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
3291 } else if (!rx->sta) { 3283 } else if (!rx->sta) {
3292 int rate_idx; 3284 int rate_idx;
3293 if (status->flag & (RX_FLAG_HT | RX_FLAG_VHT)) 3285 if (status->flag & (RX_FLAG_HT | RX_FLAG_VHT))
@@ -3309,12 +3301,7 @@ static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
3309 } else if (!multicast && 3301 } else if (!multicast &&
3310 !ether_addr_equal(sdata->dev->dev_addr, 3302 !ether_addr_equal(sdata->dev->dev_addr,
3311 hdr->addr1)) { 3303 hdr->addr1)) {
3312 /* if we are in promisc mode we also accept 3304 return false;
3313 * packets not destined for us
3314 */
3315 if (!(sdata->dev->flags & IFF_PROMISC))
3316 return false;
3317 rx->flags &= ~IEEE80211_RX_RA_MATCH;
3318 } else if (!rx->sta) { 3305 } else if (!rx->sta) {
3319 int rate_idx; 3306 int rate_idx;
3320 if (status->flag & RX_FLAG_HT) 3307 if (status->flag & RX_FLAG_HT)
@@ -3327,12 +3314,8 @@ static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
3327 break; 3314 break;
3328 case NL80211_IFTYPE_MESH_POINT: 3315 case NL80211_IFTYPE_MESH_POINT:
3329 if (!multicast && 3316 if (!multicast &&
3330 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) { 3317 !ether_addr_equal(sdata->vif.addr, hdr->addr1))
3331 if (!(sdata->dev->flags & IFF_PROMISC)) 3318 return false;
3332 return false;
3333
3334 status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
3335 }
3336 break; 3319 break;
3337 case NL80211_IFTYPE_AP_VLAN: 3320 case NL80211_IFTYPE_AP_VLAN:
3338 case NL80211_IFTYPE_AP: 3321 case NL80211_IFTYPE_AP: