From ccb13f0bdd0c8ac3ee85dd0a6064c9bc545585f1 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 15 Aug 2007 01:56:02 +0000 Subject: [PATCH] 2007-08-14 Dan Williams * src/NetworkManagerUtils.c - (nm_utils_escape_ssid): add "ignore_trailing_null" parameter which ignores trailing nulls in the SSID to work around mismatches in expectations between WEXT and what the info-daemon passes back. The info-daemon would pass back the correct length, but due to the ESSID length issues with WEXT 22 and greater and wpa_supplicant, the device would always have an SSID + 1 depending on what versions of wpa_supplicant, the kernel, and NM you have. This was most often visible by just quitting the applet and relaunching, which caused NM to reassociated to the same network over again when reloading the save networks. git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@2685 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- src/NetworkManagerAPList.c | 8 ++++---- src/NetworkManagerPolicy.c | 2 +- src/NetworkManagerUtils.c | 20 +++++++++++++++++--- src/NetworkManagerUtils.h | 4 +++- src/nm-device-802-11-wireless.c | 8 ++++---- 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/NetworkManagerAPList.c b/src/NetworkManagerAPList.c index bb4f0f198a..db6c1eb5d7 100644 --- a/src/NetworkManagerAPList.c +++ b/src/NetworkManagerAPList.c @@ -174,7 +174,7 @@ nm_ap_list_remove_ap_by_ssid (NMAccessPointList *list, const GByteArray * ssid) for (elt = list->ap_list; elt; elt = g_slist_next (elt)) { NMAccessPoint * list_ap = (NMAccessPoint *) elt->data; - if (nm_utils_same_ssid (nm_ap_get_ssid (list_ap), ssid)) { + if (nm_utils_same_ssid (nm_ap_get_ssid (list_ap), ssid, TRUE)) { list->ap_list = g_slist_remove_link (list->ap_list, elt); g_object_unref (list_ap); g_slist_free (elt); @@ -209,7 +209,7 @@ void nm_ap_list_remove_duplicate_ssids (NMAccessPointList *list) NMAccessPoint * list_ap_j = (NMAccessPoint *) elt_j->data; const GByteArray * list_ap_j_ssid = nm_ap_get_ssid (list_ap_j); - if ((found = nm_utils_same_ssid (list_ap_i_ssid, list_ap_j_ssid))) + if ((found = nm_utils_same_ssid (list_ap_i_ssid, list_ap_j_ssid, TRUE))) break; } @@ -225,7 +225,7 @@ void nm_ap_list_remove_duplicate_ssids (NMAccessPointList *list) const GByteArray * list_ap_j_ssid = nm_ap_get_ssid (list_ap_j); strengthj = nm_ap_get_strength (list_ap_j); - if (nm_utils_same_ssid (list_ap_i_ssid, list_ap_j_ssid)) { + if (nm_utils_same_ssid (list_ap_i_ssid, list_ap_j_ssid, TRUE)) { if (strengthj > max_strength) { removal_list = g_slist_append (removal_list, list_ap_max); list_ap_max = list_ap_j; @@ -267,7 +267,7 @@ nm_ap_list_get_ap_by_ssid (NMAccessPointList *list, const GByteArray * ssid) while ((ap = nm_ap_list_iter_next (iter))) { const GByteArray * ap_ssid = nm_ap_get_ssid (ap); - if (ap_ssid && nm_utils_same_ssid (ap_ssid, ssid)) { + if (ap_ssid && nm_utils_same_ssid (ap_ssid, ssid, TRUE)) { found_ap = ap; break; } diff --git a/src/NetworkManagerPolicy.c b/src/NetworkManagerPolicy.c index 2912fdbcb7..15b980e914 100644 --- a/src/NetworkManagerPolicy.c +++ b/src/NetworkManagerPolicy.c @@ -322,7 +322,7 @@ nm_policy_device_change_check (gpointer user_data) * link to the old access point. We don't switch away * from Ad-Hoc APs either. */ - gboolean same_ssid = nm_utils_same_ssid (old_ssid, new_ssid); + gboolean same_ssid = nm_utils_same_ssid (old_ssid, new_ssid, TRUE); /* If the "best" AP's SSID is the same as the current activation * request's SSID, but the current activation request isn't diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c index de8e9346c5..6aee689ff0 100644 --- a/src/NetworkManagerUtils.c +++ b/src/NetworkManagerUtils.c @@ -625,14 +625,28 @@ nm_utils_escape_ssid (const char * ssid, guint32 len) } gboolean -nm_utils_same_ssid (const GByteArray * ssid1, const GByteArray * ssid2) +nm_utils_same_ssid (const GByteArray * ssid1, + const GByteArray * ssid2, + gboolean ignore_trailing_null) { + guint32 ssid1_len, ssid2_len; + if (ssid1 == ssid2) return TRUE; if ((ssid1 && !ssid2) || (!ssid1 && ssid2)) return FALSE; - if (ssid1->len != ssid2->len) + + ssid1_len = ssid1->len; + ssid2_len = ssid2->len; + if (ssid1_len && ssid2_len && ignore_trailing_null) { + if (ssid1->data[ssid1_len - 1] == '\0') + ssid1_len--; + if (ssid2->data[ssid2_len - 1] == '\0') + ssid2_len--; + } + + if (ssid1_len != ssid2_len) return FALSE; - return memcmp (ssid1->data, ssid2->data, ssid1->len) == 0 ? TRUE : FALSE; + return memcmp (ssid1->data, ssid2->data, ssid1_len) == 0 ? TRUE : FALSE; } diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h index 64b78c49e3..e2f7c83dc5 100644 --- a/src/NetworkManagerUtils.h +++ b/src/NetworkManagerUtils.h @@ -109,6 +109,8 @@ int nm_utils_ip4_netmask_to_prefix (guint32 ip4_netmask); gboolean nm_utils_is_empty_ssid (const char * ssid, int len); const char * nm_utils_escape_ssid (const char *ssid, guint32 len); -gboolean nm_utils_same_ssid (const GByteArray * ssid1, const GByteArray * ssid2); +gboolean nm_utils_same_ssid (const GByteArray * ssid1, + const GByteArray * ssid2, + gboolean ignore_trailing_null); #endif diff --git a/src/nm-device-802-11-wireless.c b/src/nm-device-802-11-wireless.c index 57a4a00a03..8e71cfbb8f 100644 --- a/src/nm-device-802-11-wireless.c +++ b/src/nm-device-802-11-wireless.c @@ -224,7 +224,7 @@ nm_device_802_11_wireless_update_bssid (NMDevice80211Wireless *self, if ( nm_ethernet_address_is_valid (&new_bssid) && nm_ethernet_address_is_valid (old_bssid) && !nm_ethernet_addresses_are_equal (&new_bssid, old_bssid) - && nm_utils_same_ssid (old_ssid, new_ssid)) + && nm_utils_same_ssid (old_ssid, new_ssid, TRUE)) { gboolean automatic; gchar new_addr[20]; @@ -729,7 +729,7 @@ link_to_specific_ap (NMDevice80211Wireless *self, const GByteArray * dev_ssid = nm_device_802_11_wireless_get_ssid (self); const GByteArray * ap_ssid = nm_ap_get_ssid (ap); - if (dev_ssid && ap_ssid && nm_utils_same_ssid (dev_ssid, ap_ssid)) { + if (dev_ssid && ap_ssid && nm_utils_same_ssid (dev_ssid, ap_ssid, TRUE)) { self->priv->failed_link_count = 0; have_link = TRUE; } @@ -1936,7 +1936,7 @@ merge_scanned_ap (NMDevice80211Wireless *dev, /* Did the AP's name change? */ if ( !devlist_ssid || !merge_ssid - || !nm_utils_same_ssid (devlist_ssid, merge_ssid)) { + || !nm_utils_same_ssid (devlist_ssid, merge_ssid, TRUE)) { network_removed (dev, list_ap); nm_ap_set_ssid (list_ap, merge_ssid); network_added (dev, list_ap); @@ -2011,7 +2011,7 @@ cull_scan_list (NMDevice80211Wireless * self) /* Don't ever prune the AP we're currently associated with */ ssid = nm_ap_get_ssid (outdated_ap); cur_ssid = cur_ap ? nm_ap_get_ssid (cur_ap) : NULL; - if (ssid && nm_utils_same_ssid (cur_ssid, ssid)) + if (ssid && nm_utils_same_ssid (cur_ssid, ssid, TRUE)) keep_around = TRUE; prune_interval_s = SCAN_INTERVAL_MAX * 3;