cfg80211: fix nl80211 disconnected events
authorJohannes Berg <johannes@sipsolutions.net>
Thu, 6 Aug 2009 18:41:33 +0000 (20:41 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 14 Aug 2009 13:12:46 +0000 (09:12 -0400)
When reporting a disconnection to userspace, we try
to report whether it was from the AP or by our own
choice. However, we misreported a broadcast deauth
or disassoc as being by own choice, which is wrong.
Fix this by checking the sender address instead of
the destination address.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/wireless/mlme.c

index b44b6c0..51d5df6 100644 (file)
@@ -149,7 +149,7 @@ static void __cfg80211_send_deauth(struct net_device *dev,
 
                reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
 
-               from_ap = memcmp(mgmt->da, dev->dev_addr, ETH_ALEN) == 0;
+               from_ap = memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) != 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,
@@ -215,7 +215,7 @@ static void __cfg80211_send_disassoc(struct net_device *dev,
 
        reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
 
-       from_ap = memcmp(mgmt->da, dev->dev_addr, ETH_ALEN) == 0;
+       from_ap = memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) != 0;
        __cfg80211_disconnected(dev, NULL, 0, reason_code, from_ap);
 }