NMAccessPoint * nm_ap_new_from_properties (GHashTable *properties) { NMAccessPoint *ap; GTimeVal cur_time; const struct ether_addr * addr; const char bad_bssid1[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; const char bad_bssid2[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; g_return_val_if_fail (properties != NULL, NULL); ap = nm_ap_new (); g_object_freeze_notify (G_OBJECT (ap)); g_hash_table_foreach (properties, foreach_property_cb, ap); /* ignore APs with invalid BSSIDs */ addr = nm_ap_get_address (ap); if ( !(memcmp (addr->ether_addr_octet, bad_bssid1, ETH_ALEN)) || !(memcmp (addr->ether_addr_octet, bad_bssid2, ETH_ALEN))) { g_object_unref (ap); return NULL; } g_get_current_time (&cur_time); nm_ap_set_last_seen (ap, cur_time.tv_sec); if (!nm_ap_get_ssid (ap)) nm_ap_set_broadcast (ap, FALSE); g_object_thaw_notify (G_OBJECT (ap)); return ap; }
NMAccessPoint * nm_ap_match_in_list (NMAccessPoint *find_ap, GSList *ap_list, gboolean strict_match) { GSList *iter; g_return_val_if_fail (find_ap != NULL, NULL); for (iter = ap_list; iter; iter = g_slist_next (iter)) { NMAccessPoint * list_ap = NM_AP (iter->data); const GByteArray * list_ssid = nm_ap_get_ssid (list_ap); const struct ether_addr * list_addr = nm_ap_get_address (list_ap); const GByteArray * find_ssid = nm_ap_get_ssid (find_ap); const struct ether_addr * find_addr = nm_ap_get_address (find_ap); /* SSID match; if both APs are hiding their SSIDs, * let matching continue on BSSID and other properties */ if ( (!list_ssid && find_ssid) || (list_ssid && !find_ssid) || !nm_utils_same_ssid (list_ssid, find_ssid, TRUE)) continue; /* BSSID match */ if ( (strict_match || nm_ethernet_address_is_valid (find_addr)) && nm_ethernet_address_is_valid (list_addr) && memcmp (list_addr->ether_addr_octet, find_addr->ether_addr_octet, ETH_ALEN) != 0) { continue; } /* mode match */ if (nm_ap_get_mode (list_ap) != nm_ap_get_mode (find_ap)) continue; /* Frequency match */ if (nm_ap_get_freq (list_ap) != nm_ap_get_freq (find_ap)) continue; /* AP flags */ if (nm_ap_get_flags (list_ap) != nm_ap_get_flags (find_ap)) continue; if (strict_match) { if (nm_ap_get_wpa_flags (list_ap) != nm_ap_get_wpa_flags (find_ap)) continue; if (nm_ap_get_rsn_flags (list_ap) != nm_ap_get_rsn_flags (find_ap)) continue; } else { NM80211ApSecurityFlags list_wpa_flags = nm_ap_get_wpa_flags (list_ap); NM80211ApSecurityFlags find_wpa_flags = nm_ap_get_wpa_flags (find_ap); NM80211ApSecurityFlags list_rsn_flags = nm_ap_get_rsn_flags (list_ap); NM80211ApSecurityFlags find_rsn_flags = nm_ap_get_rsn_flags (find_ap); /* Just ensure that there is overlap in the capabilities */ if ( !capabilities_compatible (list_wpa_flags, find_wpa_flags) && !capabilities_compatible (list_rsn_flags, find_rsn_flags)) continue; } return list_ap; } return NULL; }