2007-10-03 Dan Williams <dcbw@redhat.com>
* src/nm-device-802-11-wireless.c - (nm_device_802_11_wireless_update_bssid): remove - (get_active_ap): new function; find the AP in the scan list which matches the current BSSID and SSID of the wireless device - (nm_device_802_11_periodic_update): get current AP using get_active_ap() and print AP roam messages git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@2926 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
@@ -1,3 +1,12 @@
|
|||||||
|
2007-10-03 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
|
* src/nm-device-802-11-wireless.c
|
||||||
|
- (nm_device_802_11_wireless_update_bssid): remove
|
||||||
|
- (get_active_ap): new function; find the AP in the scan list which
|
||||||
|
matches the current BSSID and SSID of the wireless device
|
||||||
|
- (nm_device_802_11_periodic_update): get current AP using
|
||||||
|
get_active_ap() and print AP roam messages
|
||||||
|
|
||||||
2007-10-01 Dan Williams <dcbw@redhat.com>
|
2007-10-01 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
* libnm-util/nm-setting.h
|
* libnm-util/nm-setting.h
|
||||||
|
@@ -116,8 +116,10 @@ struct _NMDevice80211WirelessPrivate
|
|||||||
gint8 num_freqs;
|
gint8 num_freqs;
|
||||||
double freqs[IW_MAX_FREQUENCIES];
|
double freqs[IW_MAX_FREQUENCIES];
|
||||||
|
|
||||||
gboolean scanning;
|
|
||||||
GSList * ap_list;
|
GSList * ap_list;
|
||||||
|
NMAccessPoint * current_ap;
|
||||||
|
|
||||||
|
gboolean scanning;
|
||||||
GTimeVal scheduled_scan_time;
|
GTimeVal scheduled_scan_time;
|
||||||
guint8 scan_interval; /* seconds */
|
guint8 scan_interval; /* seconds */
|
||||||
guint pending_scan_id;
|
guint pending_scan_id;
|
||||||
@@ -189,54 +191,6 @@ network_removed (NMDevice80211Wireless *device, NMAccessPoint *ap)
|
|||||||
g_signal_emit (device, signals[NETWORK_REMOVED], 0, ap);
|
g_signal_emit (device, signals[NETWORK_REMOVED], 0, ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* nm_device_802_11_wireless_update_bssid
|
|
||||||
*
|
|
||||||
* Update the current wireless network's BSSID, presumably in response to
|
|
||||||
* roaming.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
nm_device_802_11_wireless_update_bssid (NMDevice80211Wireless *self,
|
|
||||||
NMAccessPoint *ap)
|
|
||||||
{
|
|
||||||
struct ether_addr new_bssid;
|
|
||||||
const struct ether_addr *old_bssid;
|
|
||||||
const GByteArray * new_ssid;
|
|
||||||
const GByteArray * old_ssid;
|
|
||||||
|
|
||||||
/* Get the current BSSID. If it is valid but does not match the stored value,
|
|
||||||
* and the SSID is the same as what we think its supposed to be, update it. */
|
|
||||||
nm_device_802_11_wireless_get_bssid (self, &new_bssid);
|
|
||||||
old_bssid = nm_ap_get_address (ap);
|
|
||||||
new_ssid = nm_device_802_11_wireless_get_ssid (self);
|
|
||||||
old_ssid = nm_ap_get_ssid (ap);
|
|
||||||
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, TRUE))
|
|
||||||
{
|
|
||||||
gboolean automatic;
|
|
||||||
gchar new_addr[20];
|
|
||||||
gchar old_addr[20];
|
|
||||||
|
|
||||||
memset (new_addr, '\0', sizeof (new_addr));
|
|
||||||
memset (old_addr, '\0', sizeof (old_addr));
|
|
||||||
iw_ether_ntop (&new_bssid, new_addr);
|
|
||||||
iw_ether_ntop (old_bssid, old_addr);
|
|
||||||
nm_debug ("Roamed from BSSID %s to %s on wireless network '%s'",
|
|
||||||
old_addr,
|
|
||||||
new_addr,
|
|
||||||
nm_utils_escape_ssid (old_ssid->data, old_ssid->len));
|
|
||||||
|
|
||||||
nm_ap_set_address (ap, &new_bssid);
|
|
||||||
|
|
||||||
automatic = !nm_act_request_get_user_requested (nm_device_get_act_request (NM_DEVICE (self)));
|
|
||||||
// FIXME: push new BSSID to the info-daemon
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nm_device_802_11_wireless_update_signal_strength
|
* nm_device_802_11_wireless_update_signal_strength
|
||||||
*
|
*
|
||||||
@@ -531,6 +485,32 @@ out:
|
|||||||
nm_device_set_active_link (NM_DEVICE (self), new_link);
|
nm_device_set_active_link (NM_DEVICE (self), new_link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NMAccessPoint *
|
||||||
|
get_active_ap (NMDevice80211Wireless *self)
|
||||||
|
{
|
||||||
|
struct ether_addr bssid;
|
||||||
|
const GByteArray *ssid;
|
||||||
|
GSList *iter;
|
||||||
|
|
||||||
|
nm_device_802_11_wireless_get_bssid (self, &bssid);
|
||||||
|
if (!nm_ethernet_address_is_valid (&bssid))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ssid = nm_device_802_11_wireless_get_ssid (self);
|
||||||
|
|
||||||
|
/* Find this SSID + BSSID in the device's AP list */
|
||||||
|
for (iter = self->priv->ap_list; iter; iter = g_slist_next (iter)) {
|
||||||
|
NMAccessPoint *ap = NM_AP (iter->data);
|
||||||
|
const struct ether_addr *ap_bssid = nm_ap_get_address (ap);
|
||||||
|
const GByteArray *ap_ssid = nm_ap_get_ssid (ap);
|
||||||
|
|
||||||
|
if ( nm_ethernet_addresses_are_equal (&bssid, ap_bssid)
|
||||||
|
&& nm_utils_same_ssid (ssid, ap_ssid, TRUE))
|
||||||
|
return ap;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nm_device_802_11_periodic_update
|
* nm_device_802_11_periodic_update
|
||||||
@@ -542,15 +522,51 @@ static gboolean
|
|||||||
nm_device_802_11_periodic_update (gpointer data)
|
nm_device_802_11_periodic_update (gpointer data)
|
||||||
{
|
{
|
||||||
NMDevice80211Wireless *self = NM_DEVICE_802_11_WIRELESS (data);
|
NMDevice80211Wireless *self = NM_DEVICE_802_11_WIRELESS (data);
|
||||||
|
NMDeviceState state;
|
||||||
|
NMAccessPoint *old_ap;
|
||||||
|
NMAccessPoint *new_ap;
|
||||||
|
|
||||||
/* BSSID and signal strength have meaningful values only if the device
|
/* BSSID and signal strength have meaningful values only if the device
|
||||||
is activated and not scanning */
|
is activated and not scanning */
|
||||||
if (nm_device_get_state (NM_DEVICE (self)) == NM_DEVICE_STATE_ACTIVATED &&
|
state = nm_device_get_state (NM_DEVICE (self));
|
||||||
!NM_DEVICE_802_11_WIRELESS_GET_PRIVATE (self)->scanning) {
|
if ( (state != NM_DEVICE_STATE_ACTIVATED)
|
||||||
NMAccessPoint *ap = nm_device_802_11_wireless_get_activation_ap (self);
|
|| NM_DEVICE_802_11_WIRELESS_GET_PRIVATE (self)->scanning)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
nm_device_802_11_wireless_update_signal_strength (self, ap);
|
new_ap = get_active_ap (self);
|
||||||
nm_device_802_11_wireless_update_bssid (self, ap);
|
if (new_ap)
|
||||||
|
nm_device_802_11_wireless_update_signal_strength (self, new_ap);
|
||||||
|
|
||||||
|
old_ap = nm_device_802_11_wireless_get_activation_ap (self);
|
||||||
|
if ((new_ap || old_ap) && (new_ap != old_ap)) {
|
||||||
|
const struct ether_addr *new_bssid = NULL;
|
||||||
|
const GByteArray *new_ssid = NULL;
|
||||||
|
const struct ether_addr *old_bssid = NULL;
|
||||||
|
const GByteArray *old_ssid = NULL;
|
||||||
|
gchar new_addr[20];
|
||||||
|
gchar old_addr[20];
|
||||||
|
|
||||||
|
memset (new_addr, '\0', sizeof (new_addr));
|
||||||
|
if (new_ap) {
|
||||||
|
new_bssid = nm_ap_get_address (new_ap);
|
||||||
|
iw_ether_ntop (new_bssid, new_addr);
|
||||||
|
new_ssid = nm_ap_get_ssid (new_ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset (old_addr, '\0', sizeof (old_addr));
|
||||||
|
if (old_ap) {
|
||||||
|
old_bssid = nm_ap_get_address (old_ap);
|
||||||
|
iw_ether_ntop (old_bssid, old_addr);
|
||||||
|
old_ssid = nm_ap_get_ssid (old_ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
nm_debug ("Roamed from BSSID %s (%s) to %s (%s)",
|
||||||
|
old_bssid ? old_addr : "(none)",
|
||||||
|
old_ssid ? nm_utils_escape_ssid (old_ssid->data, old_ssid->len) : "(none)",
|
||||||
|
new_bssid ? new_addr : "(none)",
|
||||||
|
new_ssid ? nm_utils_escape_ssid (new_ssid->data, new_ssid->len) : "(none)");
|
||||||
|
|
||||||
|
// FIXME: emit PropertiesChanged for active network
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
Reference in New Issue
Block a user