Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mac80211: remove ARP filter enable/disable logic

Depending on the driver, having ARP filtering for
some addresses may be possible. Remove the logic
that tracks whether ARP filter is enabled or not
and give the driver the total number of addresses
instead of the length of the list so it can make
its own decision.

Reviewed-by: Luciano Coelho <coelho@ti.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>

+22 -39
+2 -3
drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
··· 539 539 540 540 if (changed & BSS_CHANGED_ARP_FILTER) { 541 541 /* Hardware ARP filter address list or state changed */ 542 - brcms_err(core, "%s: arp filtering: enabled %s, count %d" 543 - " (implement)\n", __func__, info->arp_filter_enabled ? 544 - "true" : "false", info->arp_addr_cnt); 542 + brcms_err(core, "%s: arp filtering: %d addresses" 543 + " (implement)\n", __func__, info->arp_addr_cnt); 545 544 } 546 545 547 546 if (changed & BSS_CHANGED_QOS) {
+1 -2
drivers/net/wireless/ti/wlcore/main.c
··· 4113 4113 wlvif->sta.qos = bss_conf->qos; 4114 4114 WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS); 4115 4115 4116 - if (bss_conf->arp_addr_cnt == 1 && 4117 - bss_conf->arp_filter_enabled) { 4116 + if (bss_conf->arp_addr_cnt == 1 && bss_conf->assoc) { 4118 4117 wlvif->ip_addr = addr; 4119 4118 /* 4120 4119 * The template should have been configured only upon
+4 -7
include/net/mac80211.h
··· 297 297 * may filter ARP queries targeted for other addresses than listed here. 298 298 * The driver must allow ARP queries targeted for all address listed here 299 299 * to pass through. An empty list implies no ARP queries need to pass. 300 - * @arp_addr_cnt: Number of addresses currently on the list. 301 - * @arp_filter_enabled: Enable ARP filtering - if enabled, the hardware may 302 - * filter ARP queries based on the @arp_addr_list, if disabled, the 303 - * hardware must not perform any ARP filtering. Note, that the filter will 304 - * be enabled also in promiscuous mode. 300 + * @arp_addr_cnt: Number of addresses currently on the list. Note that this 301 + * may be larger than %IEEE80211_BSS_ARP_ADDR_LIST_LEN (the arp_addr_list 302 + * array size), it's up to the driver what to do in that case. 305 303 * @qos: This is a QoS-enabled BSS. 306 304 * @idle: This interface is idle. There's also a global idle flag in the 307 305 * hardware config which may be more appropriate depending on what ··· 336 338 u32 cqm_rssi_hyst; 337 339 struct cfg80211_chan_def chandef; 338 340 __be32 arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN]; 339 - u8 arp_addr_cnt; 340 - bool arp_filter_enabled; 341 + int arp_addr_cnt; 341 342 bool qos; 342 343 bool idle; 343 344 bool ps;
-2
net/mac80211/ieee80211_i.h
··· 747 747 struct work_struct work; 748 748 struct sk_buff_head skb_queue; 749 749 750 - bool arp_filter_state; 751 - 752 750 u8 needed_rx_chains; 753 751 enum ieee80211_smps_mode smps_mode; 754 752
-3
net/mac80211/iface.c
··· 1574 1574 /* initialise type-independent data */ 1575 1575 sdata->wdev.wiphy = local->hw.wiphy; 1576 1576 sdata->local = local; 1577 - #ifdef CONFIG_INET 1578 - sdata->arp_filter_state = true; 1579 - #endif 1580 1577 1581 1578 for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++) 1582 1579 skb_queue_head_init(&sdata->fragments[i].skb_list);
+4 -12
net/mac80211/main.c
··· 349 349 350 350 /* Copy the addresses to the bss_conf list */ 351 351 ifa = idev->ifa_list; 352 - while (c < IEEE80211_BSS_ARP_ADDR_LIST_LEN && ifa) { 353 - bss_conf->arp_addr_list[c] = ifa->ifa_address; 352 + while (ifa) { 353 + if (c < IEEE80211_BSS_ARP_ADDR_LIST_LEN) 354 + bss_conf->arp_addr_list[c] = ifa->ifa_address; 354 355 ifa = ifa->ifa_next; 355 356 c++; 356 357 } 357 358 358 - /* If not all addresses fit the list, disable filtering */ 359 - if (ifa) { 360 - sdata->arp_filter_state = false; 361 - c = 0; 362 - } else { 363 - sdata->arp_filter_state = true; 364 - } 365 359 bss_conf->arp_addr_cnt = c; 366 360 367 361 /* Configure driver only if associated (which also implies it is up) */ 368 - if (ifmgd->associated) { 369 - bss_conf->arp_filter_enabled = sdata->arp_filter_state; 362 + if (ifmgd->associated) 370 363 ieee80211_bss_info_change_notify(sdata, 371 364 BSS_CHANGED_ARP_FILTER); 372 - } 373 365 374 366 mutex_unlock(&ifmgd->mtx); 375 367
+2 -6
net/mac80211/mlme.c
··· 1465 1465 bss_info_changed |= BSS_CHANGED_CQM; 1466 1466 1467 1467 /* Enable ARP filtering */ 1468 - if (bss_conf->arp_filter_enabled != sdata->arp_filter_state) { 1469 - bss_conf->arp_filter_enabled = sdata->arp_filter_state; 1468 + if (bss_conf->arp_addr_cnt) 1470 1469 bss_info_changed |= BSS_CHANGED_ARP_FILTER; 1471 - } 1472 1470 1473 1471 ieee80211_bss_info_change_notify(sdata, bss_info_changed); 1474 1472 ··· 1580 1582 cancel_work_sync(&local->dynamic_ps_enable_work); 1581 1583 1582 1584 /* Disable ARP filtering */ 1583 - if (sdata->vif.bss_conf.arp_filter_enabled) { 1584 - sdata->vif.bss_conf.arp_filter_enabled = false; 1585 + if (sdata->vif.bss_conf.arp_addr_cnt) 1585 1586 changed |= BSS_CHANGED_ARP_FILTER; 1586 - } 1587 1587 1588 1588 sdata->vif.bss_conf.qos = false; 1589 1589 changed |= BSS_CHANGED_QOS;
+9 -4
net/mac80211/trace.h
··· 347 347 __field(s32, cqm_rssi_hyst); 348 348 __field(u32, channel_width); 349 349 __field(u32, channel_cfreq1); 350 - __dynamic_array(u32, arp_addr_list, info->arp_addr_cnt); 351 - __field(bool, arp_filter_enabled); 350 + __dynamic_array(u32, arp_addr_list, 351 + info->arp_addr_cnt > IEEE80211_BSS_ARP_ADDR_LIST_LEN ? 352 + IEEE80211_BSS_ARP_ADDR_LIST_LEN : 353 + info->arp_addr_cnt); 354 + __field(int, arp_addr_cnt); 352 355 __field(bool, qos); 353 356 __field(bool, idle); 354 357 __field(bool, ps); ··· 387 384 __entry->cqm_rssi_hyst = info->cqm_rssi_hyst; 388 385 __entry->channel_width = info->chandef.width; 389 386 __entry->channel_cfreq1 = info->chandef.center_freq1; 387 + __entry->arp_addr_cnt = info->arp_addr_cnt; 390 388 memcpy(__get_dynamic_array(arp_addr_list), info->arp_addr_list, 391 - sizeof(u32) * info->arp_addr_cnt); 392 - __entry->arp_filter_enabled = info->arp_filter_enabled; 389 + sizeof(u32) * (info->arp_addr_cnt > IEEE80211_BSS_ARP_ADDR_LIST_LEN ? 390 + IEEE80211_BSS_ARP_ADDR_LIST_LEN : 391 + info->arp_addr_cnt)); 393 392 __entry->qos = info->qos; 394 393 __entry->idle = info->idle; 395 394 __entry->ps = info->ps;