Skip to content

Commit

Permalink
cfg80211: use compare_ether_addr on MAC addresses instead of memcmp
Browse files Browse the repository at this point in the history
Because of the constant size and guaranteed 16 bit alignment, the inline
compare_ether_addr function is much cheaper than calling memcmp.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Felix Fietkau authored and John W. Linville committed Apr 9, 2012
1 parent 4272a27 commit c6fb08a
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 16 deletions.
32 changes: 17 additions & 15 deletions net/wireless/mlme.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/etherdevice.h>
#include <linux/netdevice.h>
#include <linux/nl80211.h>
#include <linux/slab.h>
Expand Down Expand Up @@ -100,7 +101,7 @@ void __cfg80211_send_deauth(struct net_device *dev,
ASSERT_WDEV_LOCK(wdev);

if (wdev->current_bss &&
memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) {
compare_ether_addr(wdev->current_bss->pub.bssid, bssid) == 0) {
cfg80211_unhold_bss(wdev->current_bss);
cfg80211_put_bss(&wdev->current_bss->pub);
wdev->current_bss = NULL;
Expand All @@ -115,7 +116,7 @@ void __cfg80211_send_deauth(struct net_device *dev,

reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);

from_ap = memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) != 0;
from_ap = compare_ether_addr(mgmt->sa, dev->dev_addr) != 0;
__cfg80211_disconnected(dev, NULL, 0, reason_code, from_ap);
} else if (wdev->sme_state == CFG80211_SME_CONNECTING) {
__cfg80211_connect_result(dev, mgmt->bssid, NULL, 0, NULL, 0,
Expand Down Expand Up @@ -154,7 +155,7 @@ void __cfg80211_send_disassoc(struct net_device *dev,
return;

if (wdev->current_bss &&
memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) {
compare_ether_addr(wdev->current_bss->pub.bssid, bssid) == 0) {
cfg80211_sme_disassoc(dev, wdev->current_bss);
cfg80211_unhold_bss(wdev->current_bss);
cfg80211_put_bss(&wdev->current_bss->pub);
Expand All @@ -165,7 +166,7 @@ void __cfg80211_send_disassoc(struct net_device *dev,

reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);

from_ap = memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) != 0;
from_ap = compare_ether_addr(mgmt->sa, dev->dev_addr) != 0;
__cfg80211_disconnected(dev, NULL, 0, reason_code, from_ap);
}
EXPORT_SYMBOL(__cfg80211_send_disassoc);
Expand Down Expand Up @@ -285,7 +286,7 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
return -EINVAL;

if (wdev->current_bss &&
memcmp(bssid, wdev->current_bss->pub.bssid, ETH_ALEN) == 0)
compare_ether_addr(bssid, wdev->current_bss->pub.bssid) == 0)
return -EALREADY;

memset(&req, 0, sizeof(req));
Expand Down Expand Up @@ -362,7 +363,7 @@ int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
memset(&req, 0, sizeof(req));

if (wdev->current_bss && prev_bssid &&
memcmp(wdev->current_bss->pub.bssid, prev_bssid, ETH_ALEN) == 0) {
compare_ether_addr(wdev->current_bss->pub.bssid, prev_bssid) == 0) {
/*
* Trying to reassociate: Allow this to proceed and let the old
* association to be dropped when the new one is completed.
Expand Down Expand Up @@ -446,7 +447,8 @@ int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,

if (local_state_change) {
if (wdev->current_bss &&
memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) {
compare_ether_addr(wdev->current_bss->pub.bssid, bssid)
== 0) {
cfg80211_unhold_bss(wdev->current_bss);
cfg80211_put_bss(&wdev->current_bss->pub);
wdev->current_bss = NULL;
Expand Down Expand Up @@ -495,7 +497,7 @@ static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
req.local_state_change = local_state_change;
req.ie = ie;
req.ie_len = ie_len;
if (memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0)
if (compare_ether_addr(wdev->current_bss->pub.bssid, bssid) == 0)
req.bss = &wdev->current_bss->pub;
else
return -ENOTCONN;
Expand Down Expand Up @@ -758,8 +760,8 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
break;
}

if (memcmp(wdev->current_bss->pub.bssid,
mgmt->bssid, ETH_ALEN)) {
if (compare_ether_addr(wdev->current_bss->pub.bssid,
mgmt->bssid)) {
err = -ENOTCONN;
break;
}
Expand All @@ -772,20 +774,20 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
break;

/* for station, check that DA is the AP */
if (memcmp(wdev->current_bss->pub.bssid,
mgmt->da, ETH_ALEN)) {
if (compare_ether_addr(wdev->current_bss->pub.bssid,
mgmt->da)) {
err = -ENOTCONN;
break;
}
break;
case NL80211_IFTYPE_AP:
case NL80211_IFTYPE_P2P_GO:
case NL80211_IFTYPE_AP_VLAN:
if (memcmp(mgmt->bssid, dev->dev_addr, ETH_ALEN))
if (compare_ether_addr(mgmt->bssid, dev->dev_addr))
err = -EINVAL;
break;
case NL80211_IFTYPE_MESH_POINT:
if (memcmp(mgmt->sa, mgmt->bssid, ETH_ALEN)) {
if (compare_ether_addr(mgmt->sa, mgmt->bssid)) {
err = -EINVAL;
break;
}
Expand All @@ -804,7 +806,7 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
return err;
}

if (memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) != 0)
if (compare_ether_addr(mgmt->sa, dev->dev_addr) != 0)
return -EINVAL;

/* Transmit the Action frame as requested by user space */
Expand Down
2 changes: 1 addition & 1 deletion net/wireless/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ static int cmp_bss_core(struct cfg80211_bss *a,
b->len_information_elements);
}

return memcmp(a->bssid, b->bssid, ETH_ALEN);
return compare_ether_addr(a->bssid, b->bssid);
}

static int cmp_bss(struct cfg80211_bss *a,
Expand Down

0 comments on commit c6fb08a

Please sign in to comment.