diff options
author | dingtianhong <dingtianhong@huawei.com> | 2013-12-26 06:41:15 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-12-26 13:31:35 -0500 |
commit | d22fbd70c2770b5e3ba0d7bc5b29f6ee686cdba4 (patch) | |
tree | 5ae7fe8532ab5d1739b99f7046f6d4907294fd8c /drivers/net/wireless/hostap | |
parent | 5e231c2c5aeda0763c0b6e1337ca7bb61a887af8 (diff) |
hostap: slight optimization of addr compare
Use possibly more efficient ether_addr_equal
instead of memcmp.
Cc: Jouni Malinen <j@w1.fi>
Cc: John W. Linville <linville@tuxdriver.com>
Cc: linux-wireless@vger.kernel.org
Cc: netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Weilong Chen <chenweilong@huawei.com>
Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/wireless/hostap')
-rw-r--r-- | drivers/net/wireless/hostap/hostap_80211_tx.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_ap.c | 28 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_hw.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_ioctl.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_main.c | 8 |
5 files changed, 22 insertions, 24 deletions
diff --git a/drivers/net/wireless/hostap/hostap_80211_tx.c b/drivers/net/wireless/hostap/hostap_80211_tx.c index 344a981a052e..8bde77689469 100644 --- a/drivers/net/wireless/hostap/hostap_80211_tx.c +++ b/drivers/net/wireless/hostap/hostap_80211_tx.c | |||
@@ -1,5 +1,6 @@ | |||
1 | #include <linux/slab.h> | 1 | #include <linux/slab.h> |
2 | #include <linux/export.h> | 2 | #include <linux/export.h> |
3 | #include <linux/etherdevice.h> | ||
3 | 4 | ||
4 | #include "hostap_80211.h" | 5 | #include "hostap_80211.h" |
5 | #include "hostap_common.h" | 6 | #include "hostap_common.h" |
@@ -103,8 +104,7 @@ netdev_tx_t hostap_data_start_xmit(struct sk_buff *skb, | |||
103 | return NETDEV_TX_OK; | 104 | return NETDEV_TX_OK; |
104 | } else if (local->iw_mode == IW_MODE_INFRA && | 105 | } else if (local->iw_mode == IW_MODE_INFRA && |
105 | (local->wds_type & HOSTAP_WDS_AP_CLIENT) && | 106 | (local->wds_type & HOSTAP_WDS_AP_CLIENT) && |
106 | memcmp(skb->data + ETH_ALEN, dev->dev_addr, | 107 | !ether_addr_equal(skb->data + ETH_ALEN, dev->dev_addr)) { |
107 | ETH_ALEN) != 0) { | ||
108 | /* AP client mode: send frames with foreign src addr | 108 | /* AP client mode: send frames with foreign src addr |
109 | * using 4-addr WDS frames */ | 109 | * using 4-addr WDS frames */ |
110 | use_wds = WDS_COMPLIANT_FRAME; | 110 | use_wds = WDS_COMPLIANT_FRAME; |
diff --git a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c index d6033a8e5dea..d36e252d2ccb 100644 --- a/drivers/net/wireless/hostap/hostap_ap.c +++ b/drivers/net/wireless/hostap/hostap_ap.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
25 | #include <linux/export.h> | 25 | #include <linux/export.h> |
26 | #include <linux/moduleparam.h> | 26 | #include <linux/moduleparam.h> |
27 | #include <linux/etherdevice.h> | ||
27 | 28 | ||
28 | #include "hostap_wlan.h" | 29 | #include "hostap_wlan.h" |
29 | #include "hostap.h" | 30 | #include "hostap.h" |
@@ -106,13 +107,12 @@ static void ap_sta_hash_del(struct ap_data *ap, struct sta_info *sta) | |||
106 | 107 | ||
107 | s = ap->sta_hash[STA_HASH(sta->addr)]; | 108 | s = ap->sta_hash[STA_HASH(sta->addr)]; |
108 | if (s == NULL) return; | 109 | if (s == NULL) return; |
109 | if (memcmp(s->addr, sta->addr, ETH_ALEN) == 0) { | 110 | if (ether_addr_equal(s->addr, sta->addr)) { |
110 | ap->sta_hash[STA_HASH(sta->addr)] = s->hnext; | 111 | ap->sta_hash[STA_HASH(sta->addr)] = s->hnext; |
111 | return; | 112 | return; |
112 | } | 113 | } |
113 | 114 | ||
114 | while (s->hnext != NULL && memcmp(s->hnext->addr, sta->addr, ETH_ALEN) | 115 | while (s->hnext != NULL && !ether_addr_equal(s->hnext->addr, sta->addr)) |
115 | != 0) | ||
116 | s = s->hnext; | 116 | s = s->hnext; |
117 | if (s->hnext != NULL) | 117 | if (s->hnext != NULL) |
118 | s->hnext = s->hnext->hnext; | 118 | s->hnext = s->hnext->hnext; |
@@ -435,7 +435,7 @@ int ap_control_del_mac(struct mac_restrictions *mac_restrictions, u8 *mac) | |||
435 | ptr != &mac_restrictions->mac_list; ptr = ptr->next) { | 435 | ptr != &mac_restrictions->mac_list; ptr = ptr->next) { |
436 | entry = list_entry(ptr, struct mac_entry, list); | 436 | entry = list_entry(ptr, struct mac_entry, list); |
437 | 437 | ||
438 | if (memcmp(entry->addr, mac, ETH_ALEN) == 0) { | 438 | if (ether_addr_equal(entry->addr, mac)) { |
439 | list_del(ptr); | 439 | list_del(ptr); |
440 | kfree(entry); | 440 | kfree(entry); |
441 | mac_restrictions->entries--; | 441 | mac_restrictions->entries--; |
@@ -459,7 +459,7 @@ static int ap_control_mac_deny(struct mac_restrictions *mac_restrictions, | |||
459 | 459 | ||
460 | spin_lock_bh(&mac_restrictions->lock); | 460 | spin_lock_bh(&mac_restrictions->lock); |
461 | list_for_each_entry(entry, &mac_restrictions->mac_list, list) { | 461 | list_for_each_entry(entry, &mac_restrictions->mac_list, list) { |
462 | if (memcmp(entry->addr, mac, ETH_ALEN) == 0) { | 462 | if (ether_addr_equal(entry->addr, mac)) { |
463 | found = 1; | 463 | found = 1; |
464 | break; | 464 | break; |
465 | } | 465 | } |
@@ -957,7 +957,7 @@ static struct sta_info* ap_get_sta(struct ap_data *ap, u8 *sta) | |||
957 | struct sta_info *s; | 957 | struct sta_info *s; |
958 | 958 | ||
959 | s = ap->sta_hash[STA_HASH(sta)]; | 959 | s = ap->sta_hash[STA_HASH(sta)]; |
960 | while (s != NULL && memcmp(s->addr, sta, ETH_ALEN) != 0) | 960 | while (s != NULL && !ether_addr_equal(s->addr, sta)) |
961 | s = s->hnext; | 961 | s = s->hnext; |
962 | return s; | 962 | return s; |
963 | } | 963 | } |
@@ -1391,7 +1391,7 @@ static void handle_authen(local_info_t *local, struct sk_buff *skb, | |||
1391 | status_code = __le16_to_cpu(*pos); | 1391 | status_code = __le16_to_cpu(*pos); |
1392 | pos++; | 1392 | pos++; |
1393 | 1393 | ||
1394 | if (memcmp(dev->dev_addr, hdr->addr2, ETH_ALEN) == 0 || | 1394 | if (ether_addr_equal(dev->dev_addr, hdr->addr2) || |
1395 | ap_control_mac_deny(&ap->mac_restrictions, hdr->addr2)) { | 1395 | ap_control_mac_deny(&ap->mac_restrictions, hdr->addr2)) { |
1396 | txt = "authentication denied"; | 1396 | txt = "authentication denied"; |
1397 | resp = WLAN_STATUS_UNSPECIFIED_FAILURE; | 1397 | resp = WLAN_STATUS_UNSPECIFIED_FAILURE; |
@@ -1935,7 +1935,7 @@ static void handle_pspoll(local_info_t *local, | |||
1935 | PDEBUG(DEBUG_PS2, "handle_pspoll: BSSID=%pM, TA=%pM PWRMGT=%d\n", | 1935 | PDEBUG(DEBUG_PS2, "handle_pspoll: BSSID=%pM, TA=%pM PWRMGT=%d\n", |
1936 | hdr->addr1, hdr->addr2, !!ieee80211_has_pm(hdr->frame_control)); | 1936 | hdr->addr1, hdr->addr2, !!ieee80211_has_pm(hdr->frame_control)); |
1937 | 1937 | ||
1938 | if (memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN)) { | 1938 | if (!ether_addr_equal(hdr->addr1, dev->dev_addr)) { |
1939 | PDEBUG(DEBUG_AP, | 1939 | PDEBUG(DEBUG_AP, |
1940 | "handle_pspoll - addr1(BSSID)=%pM not own MAC\n", | 1940 | "handle_pspoll - addr1(BSSID)=%pM not own MAC\n", |
1941 | hdr->addr1); | 1941 | hdr->addr1); |
@@ -2230,7 +2230,7 @@ static void handle_ap_item(local_info_t *local, struct sk_buff *skb, | |||
2230 | goto done; | 2230 | goto done; |
2231 | } | 2231 | } |
2232 | 2232 | ||
2233 | if (memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN)) { | 2233 | if (!ether_addr_equal(hdr->addr1, dev->dev_addr)) { |
2234 | PDEBUG(DEBUG_AP, "handle_ap_item - addr1(BSSID)=%pM" | 2234 | PDEBUG(DEBUG_AP, "handle_ap_item - addr1(BSSID)=%pM" |
2235 | " not own MAC\n", hdr->addr1); | 2235 | " not own MAC\n", hdr->addr1); |
2236 | goto done; | 2236 | goto done; |
@@ -2267,13 +2267,13 @@ static void handle_ap_item(local_info_t *local, struct sk_buff *skb, | |||
2267 | goto done; | 2267 | goto done; |
2268 | } | 2268 | } |
2269 | 2269 | ||
2270 | if (memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN)) { | 2270 | if (!ether_addr_equal(hdr->addr1, dev->dev_addr)) { |
2271 | PDEBUG(DEBUG_AP, "handle_ap_item - addr1(DA)=%pM" | 2271 | PDEBUG(DEBUG_AP, "handle_ap_item - addr1(DA)=%pM" |
2272 | " not own MAC\n", hdr->addr1); | 2272 | " not own MAC\n", hdr->addr1); |
2273 | goto done; | 2273 | goto done; |
2274 | } | 2274 | } |
2275 | 2275 | ||
2276 | if (memcmp(hdr->addr3, dev->dev_addr, ETH_ALEN)) { | 2276 | if (!ether_addr_equal(hdr->addr3, dev->dev_addr)) { |
2277 | PDEBUG(DEBUG_AP, "handle_ap_item - addr3(BSSID)=%pM" | 2277 | PDEBUG(DEBUG_AP, "handle_ap_item - addr3(BSSID)=%pM" |
2278 | " not own MAC\n", hdr->addr3); | 2278 | " not own MAC\n", hdr->addr3); |
2279 | goto done; | 2279 | goto done; |
@@ -3035,7 +3035,7 @@ ap_rx_ret hostap_handle_sta_rx(local_info_t *local, struct net_device *dev, | |||
3035 | if (!wds) { | 3035 | if (!wds) { |
3036 | /* FromDS frame - not for us; probably | 3036 | /* FromDS frame - not for us; probably |
3037 | * broadcast/multicast in another BSS - drop */ | 3037 | * broadcast/multicast in another BSS - drop */ |
3038 | if (memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0) { | 3038 | if (ether_addr_equal(hdr->addr1, dev->dev_addr)) { |
3039 | printk(KERN_DEBUG "Odd.. FromDS packet " | 3039 | printk(KERN_DEBUG "Odd.. FromDS packet " |
3040 | "received with own BSSID\n"); | 3040 | "received with own BSSID\n"); |
3041 | hostap_dump_rx_80211(dev->name, skb, rx_stats); | 3041 | hostap_dump_rx_80211(dev->name, skb, rx_stats); |
@@ -3044,7 +3044,7 @@ ap_rx_ret hostap_handle_sta_rx(local_info_t *local, struct net_device *dev, | |||
3044 | goto out; | 3044 | goto out; |
3045 | } | 3045 | } |
3046 | } else if (stype == IEEE80211_STYPE_NULLFUNC && sta == NULL && | 3046 | } else if (stype == IEEE80211_STYPE_NULLFUNC && sta == NULL && |
3047 | memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0) { | 3047 | ether_addr_equal(hdr->addr1, dev->dev_addr)) { |
3048 | 3048 | ||
3049 | if (local->hostapd) { | 3049 | if (local->hostapd) { |
3050 | prism2_rx_80211(local->apdev, skb, rx_stats, | 3050 | prism2_rx_80211(local->apdev, skb, rx_stats, |
@@ -3073,7 +3073,7 @@ ap_rx_ret hostap_handle_sta_rx(local_info_t *local, struct net_device *dev, | |||
3073 | /* If BSSID (Addr3) is foreign, this frame is a normal | 3073 | /* If BSSID (Addr3) is foreign, this frame is a normal |
3074 | * broadcast frame from an IBSS network. Drop it silently. | 3074 | * broadcast frame from an IBSS network. Drop it silently. |
3075 | * If BSSID is own, report the dropping of this frame. */ | 3075 | * If BSSID is own, report the dropping of this frame. */ |
3076 | if (memcmp(hdr->addr3, dev->dev_addr, ETH_ALEN) == 0) { | 3076 | if (ether_addr_equal(hdr->addr3, dev->dev_addr)) { |
3077 | printk(KERN_DEBUG "%s: dropped received packet from %pM" | 3077 | printk(KERN_DEBUG "%s: dropped received packet from %pM" |
3078 | " with no ToDS flag " | 3078 | " with no ToDS flag " |
3079 | "(type=0x%02x, subtype=0x%02x)\n", dev->name, | 3079 | "(type=0x%02x, subtype=0x%02x)\n", dev->name, |
diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c index c275dc1623fe..6df3ee561d52 100644 --- a/drivers/net/wireless/hostap/hostap_hw.c +++ b/drivers/net/wireless/hostap/hostap_hw.c | |||
@@ -2175,7 +2175,7 @@ static void hostap_tx_callback(local_info_t *local, | |||
2175 | struct hostap_tx_callback_info *cb; | 2175 | struct hostap_tx_callback_info *cb; |
2176 | 2176 | ||
2177 | /* Make sure that frame was from us. */ | 2177 | /* Make sure that frame was from us. */ |
2178 | if (memcmp(txdesc->addr2, local->dev->dev_addr, ETH_ALEN)) { | 2178 | if (!ether_addr_equal(txdesc->addr2, local->dev->dev_addr)) { |
2179 | printk(KERN_DEBUG "%s: TX callback - foreign frame\n", | 2179 | printk(KERN_DEBUG "%s: TX callback - foreign frame\n", |
2180 | local->dev->name); | 2180 | local->dev->name); |
2181 | return; | 2181 | return; |
diff --git a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c index e5090309824e..2454a740ea50 100644 --- a/drivers/net/wireless/hostap/hostap_ioctl.c +++ b/drivers/net/wireless/hostap/hostap_ioctl.c | |||
@@ -655,7 +655,7 @@ static int hostap_join_ap(struct net_device *dev) | |||
655 | if (!local->last_scan_results) | 655 | if (!local->last_scan_results) |
656 | break; | 656 | break; |
657 | entry = &local->last_scan_results[i]; | 657 | entry = &local->last_scan_results[i]; |
658 | if (memcmp(local->preferred_ap, entry->bssid, ETH_ALEN) == 0) { | 658 | if (ether_addr_equal(local->preferred_ap, entry->bssid)) { |
659 | req.channel = entry->chid; | 659 | req.channel = entry->chid; |
660 | break; | 660 | break; |
661 | } | 661 | } |
@@ -1978,7 +1978,7 @@ static inline int prism2_translate_scan(local_info_t *local, | |||
1978 | list_for_each(ptr, &local->bss_list) { | 1978 | list_for_each(ptr, &local->bss_list) { |
1979 | struct hostap_bss_info *bss; | 1979 | struct hostap_bss_info *bss; |
1980 | bss = list_entry(ptr, struct hostap_bss_info, list); | 1980 | bss = list_entry(ptr, struct hostap_bss_info, list); |
1981 | if (memcmp(bss->bssid, scan->bssid, ETH_ALEN) == 0) { | 1981 | if (ether_addr_equal(bss->bssid, scan->bssid)) { |
1982 | bss->included = 1; | 1982 | bss->included = 1; |
1983 | current_ev = __prism2_translate_scan( | 1983 | current_ev = __prism2_translate_scan( |
1984 | local, info, scan, bss, current_ev, | 1984 | local, info, scan, bss, current_ev, |
diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c index a1257c92afc4..67db34e56d7e 100644 --- a/drivers/net/wireless/hostap/hostap_main.c +++ b/drivers/net/wireless/hostap/hostap_main.c | |||
@@ -155,8 +155,7 @@ int prism2_wds_add(local_info_t *local, u8 *remote_addr, | |||
155 | 155 | ||
156 | if (prism2_wds_special_addr(iface->u.wds.remote_addr)) | 156 | if (prism2_wds_special_addr(iface->u.wds.remote_addr)) |
157 | empty = iface; | 157 | empty = iface; |
158 | else if (memcmp(iface->u.wds.remote_addr, remote_addr, | 158 | else if (ether_addr_equal(iface->u.wds.remote_addr, remote_addr)) { |
159 | ETH_ALEN) == 0) { | ||
160 | match = iface; | 159 | match = iface; |
161 | break; | 160 | break; |
162 | } | 161 | } |
@@ -214,8 +213,7 @@ int prism2_wds_del(local_info_t *local, u8 *remote_addr, | |||
214 | if (iface->type != HOSTAP_INTERFACE_WDS) | 213 | if (iface->type != HOSTAP_INTERFACE_WDS) |
215 | continue; | 214 | continue; |
216 | 215 | ||
217 | if (memcmp(iface->u.wds.remote_addr, remote_addr, | 216 | if (ether_addr_equal(iface->u.wds.remote_addr, remote_addr)) { |
218 | ETH_ALEN) == 0) { | ||
219 | selected = iface; | 217 | selected = iface; |
220 | break; | 218 | break; |
221 | } | 219 | } |
@@ -1085,7 +1083,7 @@ int prism2_sta_deauth(local_info_t *local, u16 reason) | |||
1085 | 1083 | ||
1086 | if (local->iw_mode != IW_MODE_INFRA || | 1084 | if (local->iw_mode != IW_MODE_INFRA || |
1087 | is_zero_ether_addr(local->bssid) || | 1085 | is_zero_ether_addr(local->bssid) || |
1088 | memcmp(local->bssid, "\x44\x44\x44\x44\x44\x44", ETH_ALEN) == 0) | 1086 | ether_addr_equal(local->bssid, "\x44\x44\x44\x44\x44\x44")) |
1089 | return 0; | 1087 | return 0; |
1090 | 1088 | ||
1091 | ret = prism2_sta_send_mgmt(local, local->bssid, IEEE80211_STYPE_DEAUTH, | 1089 | ret = prism2_sta_send_mgmt(local, local->bssid, IEEE80211_STYPE_DEAUTH, |