wl12xx: configure arp filtering only after association
authorEliad Peller <eliad@wizery.com>
Thu, 2 Feb 2012 10:22:11 +0000 (12:22 +0200)
committerLuciano Coelho <coelho@ti.com>
Wed, 15 Feb 2012 06:38:34 +0000 (08:38 +0200)
We have to configure arp filtering only after the role was
started, so move the BSS_CHANGED_ARP_FILTER handling after
the join.

Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/wl12xx/main.c

index a264cb5..b45a16c 100644 (file)
@@ -3840,40 +3840,6 @@ sta_not_found:
        if (ret < 0)
                goto out;
 
-       if ((changed & BSS_CHANGED_ARP_FILTER) ||
-           (!is_ibss && (changed & BSS_CHANGED_QOS))) {
-               __be32 addr = bss_conf->arp_addr_list[0];
-               wlvif->sta.qos = bss_conf->qos;
-               WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS);
-
-               if (bss_conf->arp_addr_cnt == 1 &&
-                   bss_conf->arp_filter_enabled) {
-                       wlvif->ip_addr = addr;
-                       /*
-                        * The template should have been configured only upon
-                        * association. however, it seems that the correct ip
-                        * isn't being set (when sending), so we have to
-                        * reconfigure the template upon every ip change.
-                        */
-                       ret = wl1271_cmd_build_arp_rsp(wl, wlvif);
-                       if (ret < 0) {
-                               wl1271_warning("build arp rsp failed: %d", ret);
-                               goto out;
-                       }
-
-                       ret = wl1271_acx_arp_ip_filter(wl, wlvif,
-                               (ACX_ARP_FILTER_ARP_FILTERING |
-                                ACX_ARP_FILTER_AUTO_ARP),
-                               addr);
-               } else {
-                       wlvif->ip_addr = 0;
-                       ret = wl1271_acx_arp_ip_filter(wl, wlvif, 0, addr);
-               }
-
-               if (ret < 0)
-                       goto out;
-       }
-
        if (do_join) {
                ret = wl1271_join(wl, wlvif, set_assoc);
                if (ret < 0) {
@@ -3940,6 +3906,41 @@ sta_not_found:
                }
        }
 
+       /* Handle arp filtering. Done after join. */
+       if ((changed & BSS_CHANGED_ARP_FILTER) ||
+           (!is_ibss && (changed & BSS_CHANGED_QOS))) {
+               __be32 addr = bss_conf->arp_addr_list[0];
+               wlvif->sta.qos = bss_conf->qos;
+               WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS);
+
+               if (bss_conf->arp_addr_cnt == 1 &&
+                   bss_conf->arp_filter_enabled) {
+                       wlvif->ip_addr = addr;
+                       /*
+                        * The template should have been configured only upon
+                        * association. however, it seems that the correct ip
+                        * isn't being set (when sending), so we have to
+                        * reconfigure the template upon every ip change.
+                        */
+                       ret = wl1271_cmd_build_arp_rsp(wl, wlvif);
+                       if (ret < 0) {
+                               wl1271_warning("build arp rsp failed: %d", ret);
+                               goto out;
+                       }
+
+                       ret = wl1271_acx_arp_ip_filter(wl, wlvif,
+                               (ACX_ARP_FILTER_ARP_FILTERING |
+                                ACX_ARP_FILTER_AUTO_ARP),
+                               addr);
+               } else {
+                       wlvif->ip_addr = 0;
+                       ret = wl1271_acx_arp_ip_filter(wl, wlvif, 0, addr);
+               }
+
+               if (ret < 0)
+                       goto out;
+       }
+
 out:
        return;
 }