mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-03-21 18:00:38 +01:00
2006-06-08 Robert Love <rml@novell.com>
Add 'fallback' support. NetworkManager will attempt to brute-force connect to networks marked as fallback if there are no better wireless connections available. This is useful as a method of last resort, to work around driver problems, and for use with hidden networks. * gnome/applet/applet-dbus-devices.c, gnome/applet/applet-dbus-devices.h: Add fallback parameter. * gnome/applet/applet-dbus-info.c: Retrieve fallback bit from Gconf and pass it on via DBUS. * gnome/applet/applet.c: No fallback by default. * gnome/applet/applet.glade, gnome/applet/other-network-dialog.c: Update other-network-dialog to add UI checkbox toggling fallback. * src/NetworkManagerAP.c, src/NetworkManagerAP.h: Remove "trusted" propery from AP object. Add "fallback" property to AP object. * src/nm-dbus-nm.c: Grab the fallback parameter via DBUS. * src/nm-dbus-nmi.c: Grab the fallback parameter via DBUS. * src/nm-device-802-11-wireless.c: Break out blacklist logic into separate function. Add get_best_fallback_ap() for returning an AP on which to attempt fallback. * src/backends/NetworkManagerSuSE.c: Set stored network as fallback. * test/nm-set-fallback: New file. Sets a given network as fallback. git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1814 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
parent
faeff6152a
commit
75478a3768
14 changed files with 265 additions and 85 deletions
23
ChangeLog
23
ChangeLog
|
|
@ -1,3 +1,26 @@
|
|||
2006-06-08 Robert Love <rml@novell.com>
|
||||
|
||||
Add 'fallback' support. NetworkManager will attempt to brute-force
|
||||
connect to networks marked as fallback if there are no better wireless
|
||||
connections available. This is useful as a method of last resort, to
|
||||
work around driver problems, and for use with hidden networks.
|
||||
* gnome/applet/applet-dbus-devices.c,
|
||||
gnome/applet/applet-dbus-devices.h: Add fallback parameter.
|
||||
* gnome/applet/applet-dbus-info.c: Retrieve fallback bit from Gconf and
|
||||
pass it on via DBUS.
|
||||
* gnome/applet/applet.c: No fallback by default.
|
||||
* gnome/applet/applet.glade, gnome/applet/other-network-dialog.c:
|
||||
Update other-network-dialog to add UI checkbox toggling fallback.
|
||||
* src/NetworkManagerAP.c, src/NetworkManagerAP.h: Remove "trusted"
|
||||
propery from AP object. Add "fallback" property to AP object.
|
||||
* src/nm-dbus-nm.c: Grab the fallback parameter via DBUS.
|
||||
* src/nm-dbus-nmi.c: Grab the fallback parameter via DBUS.
|
||||
* src/nm-device-802-11-wireless.c: Break out blacklist logic into
|
||||
separate function. Add get_best_fallback_ap() for returning an AP
|
||||
on which to attempt fallback.
|
||||
* src/backends/NetworkManagerSuSE.c: Set stored network as fallback.
|
||||
* test/nm-set-fallback: New file. Sets a given network as fallback.
|
||||
|
||||
2006-06-07 Robert Love <rml@novell.com>
|
||||
|
||||
* gnome/applet/gconf-helpers.c: Bug fix: nm_gconf_helper_get_bool()
|
||||
|
|
|
|||
|
|
@ -1275,7 +1275,7 @@ void nma_dbus_device_remove_one_device (NMApplet *applet, const char *dev_path)
|
|||
*
|
||||
*/
|
||||
void nma_dbus_set_device (DBusConnection *connection, NetworkDevice *dev, const char *essid,
|
||||
WirelessSecurityOption * opt)
|
||||
gboolean fallback, WirelessSecurityOption * opt)
|
||||
{
|
||||
DBusMessage * message;
|
||||
gboolean success = TRUE;
|
||||
|
|
@ -1294,6 +1294,7 @@ void nma_dbus_set_device (DBusConnection *connection, NetworkDevice *dev, const
|
|||
/* Build up the required args */
|
||||
dbus_message_append_args (message, DBUS_TYPE_OBJECT_PATH, &dev_path,
|
||||
DBUS_TYPE_STRING, &essid,
|
||||
DBUS_TYPE_BOOLEAN, &fallback,
|
||||
DBUS_TYPE_INVALID);
|
||||
|
||||
/* If we have specific wireless security options, add them */
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ void nma_dbus_device_remove_one_device (NMApplet *applet, const char *dev_pa
|
|||
void nma_dbus_device_update_one_network (NMApplet *applet, const char *dev_path, const char *net_path, const char *active_net_path);
|
||||
void nma_dbus_device_remove_one_network (NMApplet *applet, const char *dev_path, const char *net_path);
|
||||
void nma_dbus_update_strength (NMApplet *applet, const char *dev_path, const char *net_path, int strength);
|
||||
void nma_dbus_set_device (DBusConnection *connection, NetworkDevice *dev, const char *essid, WirelessSecurityOption *opt);
|
||||
void nma_dbus_set_device (DBusConnection *connection, NetworkDevice *dev, const char *essid, gboolean fallback, WirelessSecurityOption *opt);
|
||||
void nma_dbus_create_network (DBusConnection *connection, NetworkDevice *dev, const char *essid, WirelessSecurityOption *opt);
|
||||
|
||||
void nma_free_data_model (NMApplet *applet);
|
||||
|
|
|
|||
|
|
@ -395,7 +395,7 @@ nmi_dbus_get_network_properties (DBusConnection *connection,
|
|||
char * escaped_network = NULL;
|
||||
char * essid = NULL;
|
||||
gint timestamp = -1;
|
||||
gboolean trusted = FALSE;
|
||||
gboolean fallback = FALSE;
|
||||
DBusMessageIter iter, array_iter;
|
||||
GConfClient * client;
|
||||
NMGConfWSO * gconf_wso;
|
||||
|
|
@ -435,9 +435,9 @@ nmi_dbus_get_network_properties (DBusConnection *connection,
|
|||
if (!nm_gconf_get_int_helper (client, GCONF_PATH_WIRELESS_NETWORKS, "timestamp", escaped_network, ×tamp) || (timestamp < 0))
|
||||
timestamp = 0;
|
||||
|
||||
/* Trusted status */
|
||||
if (!nm_gconf_get_bool_helper (client, GCONF_PATH_WIRELESS_NETWORKS, "trusted", escaped_network, &trusted))
|
||||
trusted = FALSE;
|
||||
/* Fallback status */
|
||||
if (!nm_gconf_get_bool_helper (client, GCONF_PATH_WIRELESS_NETWORKS, "fallback", escaped_network, &fallback))
|
||||
fallback = FALSE;
|
||||
|
||||
/* Grab the list of stored access point BSSIDs */
|
||||
gconf_key = g_strdup_printf ("%s/%s/bssids", GCONF_PATH_WIRELESS_NETWORKS, escaped_network);
|
||||
|
|
@ -468,8 +468,8 @@ nmi_dbus_get_network_properties (DBusConnection *connection,
|
|||
/* Second arg: Timestamp (INT32) */
|
||||
dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, ×tamp);
|
||||
|
||||
/* Third arg: Trusted (BOOLEAN) */
|
||||
dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &trusted);
|
||||
/* Third arg: Fallback? (BOOLEAN) */
|
||||
dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &fallback);
|
||||
|
||||
/* Fourth arg: List of AP BSSIDs (ARRAY, STRING) */
|
||||
dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &array_iter);
|
||||
|
|
@ -818,6 +818,7 @@ static void
|
|||
nmi_save_network_info (NMApplet *applet,
|
||||
const char *essid,
|
||||
gboolean automatic,
|
||||
gboolean fallback,
|
||||
const char *bssid,
|
||||
NMGConfWSO * gconf_wso)
|
||||
{
|
||||
|
|
@ -856,6 +857,10 @@ nmi_save_network_info (NMApplet *applet,
|
|||
g_free (key);
|
||||
}
|
||||
|
||||
key = g_strdup_printf ("%s/%s/fallback", GCONF_PATH_WIRELESS_NETWORKS, escaped_network);
|
||||
gconf_client_set_bool (applet->gconf_client, key, fallback, NULL);
|
||||
g_free (key);
|
||||
|
||||
if (bssid && (strlen (bssid) >= 11))
|
||||
{
|
||||
GConfValue * value;
|
||||
|
|
@ -954,6 +959,7 @@ nmi_dbus_update_network_info (DBusConnection *connection,
|
|||
NMApplet * applet = (NMApplet *) user_data;
|
||||
char * essid = NULL;
|
||||
gboolean automatic;
|
||||
gboolean fallback;
|
||||
NMGConfWSO * gconf_wso = NULL;
|
||||
DBusMessageIter iter;
|
||||
char * bssid;
|
||||
|
|
@ -984,7 +990,15 @@ nmi_dbus_update_network_info (DBusConnection *connection,
|
|||
}
|
||||
dbus_message_iter_get_basic (&iter, &automatic);
|
||||
|
||||
/* Third argument: Access point's BSSID */
|
||||
/* Third argument: Fallback? (BOOLEAN) */
|
||||
if (!dbus_message_iter_next (&iter) || (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_BOOLEAN))
|
||||
{
|
||||
nm_warning ("%s:%d - message argument 'fallback' was invalid.", __FILE__, __LINE__);
|
||||
goto out;
|
||||
}
|
||||
dbus_message_iter_get_basic (&iter, &fallback);
|
||||
|
||||
/* Fourth argument: Access point's BSSID */
|
||||
if (!dbus_message_iter_next (&iter) || (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_STRING))
|
||||
{
|
||||
nm_warning ("%s:%d - message argument 'bssid' was invalid.", __FILE__, __LINE__);
|
||||
|
|
@ -1002,7 +1016,7 @@ nmi_dbus_update_network_info (DBusConnection *connection,
|
|||
goto out;
|
||||
}
|
||||
|
||||
nmi_save_network_info (applet, essid, automatic, bssid, gconf_wso);
|
||||
nmi_save_network_info (applet, essid, automatic, fallback, bssid, gconf_wso);
|
||||
g_object_unref (G_OBJECT (gconf_wso));
|
||||
|
||||
out:
|
||||
|
|
|
|||
|
|
@ -1287,7 +1287,7 @@ static void nma_menu_item_activate (GtkMenuItem *item, gpointer user_data)
|
|||
if ((tag = g_object_get_data (G_OBJECT (item), "network")))
|
||||
net = network_device_get_wireless_network_by_essid (dev, tag);
|
||||
|
||||
nma_dbus_set_device (applet->connection, dev, net ? wireless_network_get_essid (net) : NULL, NULL);
|
||||
nma_dbus_set_device (applet->connection, dev, net ? wireless_network_get_essid (net) : NULL, FALSE, NULL);
|
||||
network_device_unref (dev);
|
||||
|
||||
nmi_dbus_signal_user_interface_activated (applet->connection);
|
||||
|
|
|
|||
|
|
@ -426,7 +426,7 @@ You have chosen to log in to the wireless network '%s'. If you are sure that th
|
|||
<child>
|
||||
<widget class="GtkTable" id="table1">
|
||||
<property name="visible">True</property>
|
||||
<property name="n_rows">4</property>
|
||||
<property name="n_rows">5</property>
|
||||
<property name="n_columns">2</property>
|
||||
<property name="homogeneous">False</property>
|
||||
<property name="row_spacing">6</property>
|
||||
|
|
@ -548,8 +548,8 @@ You have chosen to log in to the wireless network '%s'. If you are sure that th
|
|||
<packing>
|
||||
<property name="left_attach">0</property>
|
||||
<property name="right_attach">1</property>
|
||||
<property name="top_attach">2</property>
|
||||
<property name="bottom_attach">3</property>
|
||||
<property name="top_attach">3</property>
|
||||
<property name="bottom_attach">4</property>
|
||||
<property name="x_options">fill</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
|
|
@ -569,8 +569,8 @@ WEP 64/128-bit ASCII
|
|||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">2</property>
|
||||
<property name="bottom_attach">3</property>
|
||||
<property name="top_attach">3</property>
|
||||
<property name="bottom_attach">4</property>
|
||||
<property name="x_options">fill</property>
|
||||
<property name="y_options">fill</property>
|
||||
</packing>
|
||||
|
|
@ -589,11 +589,33 @@ WEP 64/128-bit ASCII
|
|||
<packing>
|
||||
<property name="left_attach">0</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">3</property>
|
||||
<property name="bottom_attach">4</property>
|
||||
<property name="top_attach">4</property>
|
||||
<property name="bottom_attach">5</property>
|
||||
<property name="x_options">fill</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkCheckButton" id="fallback_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="label" translatable="yes">_Fallback on this Network</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="relief">GTK_RELIEF_NORMAL</property>
|
||||
<property name="focus_on_click">True</property>
|
||||
<property name="active">False</property>
|
||||
<property name="inconsistent">False</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">2</property>
|
||||
<property name="bottom_attach">3</property>
|
||||
<property name="x_options">fill</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
|
|
|
|||
|
|
@ -410,19 +410,24 @@ static void nma_ond_response_cb (GtkDialog *dialog, gint response, gpointer data
|
|||
WirelessSecurityOption * opt;
|
||||
GtkComboBox * security_combo;
|
||||
GtkTreeIter iter;
|
||||
GtkWidget * fallback_button;
|
||||
char * str;
|
||||
NetworkDevice * dev;
|
||||
gboolean fallback;
|
||||
|
||||
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo), &iter);
|
||||
gtk_tree_model_get (model, &iter, NAME_COLUMN, &str, DEV_COLUMN, &dev, -1);
|
||||
|
||||
fallback_button = glade_xml_get_widget (xml, "fallback_button");
|
||||
fallback = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fallback_button));
|
||||
|
||||
security_combo = GTK_COMBO_BOX (glade_xml_get_widget (xml, "security_combo"));
|
||||
opt = wsm_get_option_for_active (wsm, security_combo);
|
||||
|
||||
if (create_network)
|
||||
nma_dbus_create_network (applet->connection, dev, essid, opt);
|
||||
else
|
||||
nma_dbus_set_device (applet->connection, dev, essid, opt);
|
||||
nma_dbus_set_device (applet->connection, dev, essid, fallback, opt);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ struct NMAccessPoint
|
|||
GTimeVal last_seen; /* Last time the AP was seen in a scan */
|
||||
|
||||
/* Things from user prefs/NetworkManagerInfo */
|
||||
gboolean trusted;
|
||||
gboolean fallback;
|
||||
NMAPSecurity * security;
|
||||
GTimeVal timestamp;
|
||||
GSList * user_addresses;
|
||||
|
|
@ -398,21 +398,21 @@ void nm_ap_set_invalid (NMAccessPoint *ap, gboolean invalid)
|
|||
|
||||
/*
|
||||
* Get/Set functions to indicate that an access point is
|
||||
* 'trusted'
|
||||
* 'fallback'
|
||||
*
|
||||
*/
|
||||
gboolean nm_ap_get_trusted (const NMAccessPoint *ap)
|
||||
gboolean nm_ap_get_fallback (const NMAccessPoint *ap)
|
||||
{
|
||||
g_return_val_if_fail (ap != NULL, FALSE);
|
||||
|
||||
return (ap->trusted);
|
||||
return (ap->fallback);
|
||||
}
|
||||
|
||||
void nm_ap_set_trusted (NMAccessPoint *ap, gboolean trusted)
|
||||
void nm_ap_set_fallback (NMAccessPoint *ap, gboolean fallback)
|
||||
{
|
||||
g_return_if_fail (ap != NULL);
|
||||
|
||||
ap->trusted = trusted;
|
||||
ap->fallback = fallback;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -72,8 +72,8 @@ void nm_ap_set_rate (NMAccessPoint *ap, guint16 rate);
|
|||
gboolean nm_ap_get_invalid (const NMAccessPoint *ap);
|
||||
void nm_ap_set_invalid (NMAccessPoint *ap, gboolean invalid);
|
||||
|
||||
gboolean nm_ap_get_trusted (const NMAccessPoint *ap);
|
||||
void nm_ap_set_trusted (NMAccessPoint *ap, gboolean trusted);
|
||||
gboolean nm_ap_get_fallback (const NMAccessPoint *ap);
|
||||
void nm_ap_set_fallback (NMAccessPoint *ap, gboolean fallback);
|
||||
|
||||
gboolean nm_ap_get_artificial (const NMAccessPoint *ap);
|
||||
void nm_ap_set_artificial (NMAccessPoint *ap, gboolean artificial);
|
||||
|
|
|
|||
|
|
@ -543,7 +543,7 @@ found:
|
|||
ap = nm_ap_new ();
|
||||
nm_ap_set_essid (ap, buf);
|
||||
nm_ap_set_timestamp (ap, time (NULL), 0);
|
||||
nm_ap_set_trusted (ap, TRUE);
|
||||
nm_ap_set_fallback (ap, TRUE);
|
||||
|
||||
if ((mode = svGetValue (file, "WIRELESS_AUTH_MODE")) && !strcmp (mode, "psk"))
|
||||
{
|
||||
|
|
@ -644,7 +644,7 @@ found:
|
|||
{
|
||||
nm_ap_set_essid (list_ap, nm_ap_get_essid (ap));
|
||||
nm_ap_set_timestamp_via_timestamp (list_ap, nm_ap_get_timestamp (ap));
|
||||
nm_ap_set_trusted (list_ap, nm_ap_get_trusted (ap));
|
||||
nm_ap_set_fallback (list_ap, TRUE);
|
||||
nm_ap_set_security (list_ap, nm_ap_get_security (ap));
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -261,6 +261,7 @@ static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DB
|
|||
{
|
||||
NMAPSecurity * security = NULL;
|
||||
char * essid = NULL;
|
||||
gboolean fallback = FALSE;
|
||||
|
||||
if (!dbus_message_iter_next (&iter) || (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_STRING))
|
||||
{
|
||||
|
|
@ -276,6 +277,15 @@ static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DB
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (!dbus_message_iter_next (&iter) || (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_BOOLEAN))
|
||||
{
|
||||
nm_warning ("Invalid argument type (fallback");
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* grab the fallback bit */
|
||||
dbus_message_iter_get_basic (&iter, &fallback);
|
||||
|
||||
/* If there's security information, we use that. If not, we
|
||||
* make some up from the scan list.
|
||||
*/
|
||||
|
|
@ -292,6 +302,7 @@ static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DB
|
|||
|
||||
/* Set up the wireless-specific activation request properties */
|
||||
ap = nm_device_802_11_wireless_get_activation_ap (NM_DEVICE_802_11_WIRELESS (dev), essid, security);
|
||||
nm_ap_set_fallback (ap, fallback);
|
||||
if (security)
|
||||
g_object_unref (G_OBJECT (security));
|
||||
|
||||
|
|
|
|||
|
|
@ -224,6 +224,7 @@ gboolean nm_dbus_update_network_info (DBusConnection *connection, NMAccessPoint
|
|||
{
|
||||
DBusMessage * message;
|
||||
gboolean success = FALSE;
|
||||
gboolean fallback;
|
||||
const char * essid;
|
||||
gchar * char_bssid;
|
||||
NMAPSecurity * security;
|
||||
|
|
@ -246,10 +247,14 @@ gboolean nm_dbus_update_network_info (DBusConnection *connection, NMAccessPoint
|
|||
/* First argument: ESSID (STRING) */
|
||||
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &essid);
|
||||
|
||||
/* Second argument: Automatic (BOOLEAN) */
|
||||
/* Second argument: Automatic or user-driven connection? (BOOLEAN) */
|
||||
dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &automatic);
|
||||
|
||||
/* Third argument: Access point's BSSID */
|
||||
/* Third argument: Fallback? (BOOLEAN) */
|
||||
fallback = nm_ap_get_fallback (ap);
|
||||
dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &fallback);
|
||||
|
||||
/* Fourth argument: Access point's BSSID */
|
||||
addr = nm_ap_get_address (ap);
|
||||
if ((nm_ap_get_mode (ap) == IW_MODE_INFRA) && nm_ethernet_address_is_valid (addr))
|
||||
{
|
||||
|
|
@ -340,7 +345,7 @@ static void nm_dbus_get_network_data_cb (DBusPendingCall *pcall, void *user_data
|
|||
DBusMessageIter subiter;
|
||||
const char * essid = NULL;
|
||||
gint timestamp_secs = -1;
|
||||
gboolean trusted = FALSE;
|
||||
gboolean fallback = FALSE;
|
||||
GSList * addr_list = NULL;
|
||||
NMAPSecurity * security;
|
||||
NMAccessPoint * ap;
|
||||
|
|
@ -393,14 +398,14 @@ static void nm_dbus_get_network_data_cb (DBusPendingCall *pcall, void *user_data
|
|||
}
|
||||
dbus_message_iter_get_basic (&iter, ×tamp_secs);
|
||||
|
||||
/* Third arg: Trusted (BOOLEAN) */
|
||||
/* Third arg: Fallback? (BOOLEAN) */
|
||||
if (!dbus_message_iter_next (&iter)
|
||||
|| (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_BOOLEAN))
|
||||
{
|
||||
nm_warning ("a message argument (trusted) was invalid.");
|
||||
nm_warning ("a message argument (fallback) was invalid.");
|
||||
goto out;
|
||||
}
|
||||
dbus_message_iter_get_basic (&iter, &trusted);
|
||||
dbus_message_iter_get_basic (&iter, &fallback);
|
||||
|
||||
/* Fourth arg: BSSID addresses (ARRAY, STRING) */
|
||||
if (!dbus_message_iter_next (&iter)
|
||||
|
|
@ -439,18 +444,19 @@ static void nm_dbus_get_network_data_cb (DBusPendingCall *pcall, void *user_data
|
|||
ap = nm_ap_new ();
|
||||
nm_ap_set_essid (ap, essid);
|
||||
nm_ap_set_security (ap, security);
|
||||
nm_ap_add_capabilities_from_security (ap, security);
|
||||
g_object_unref (G_OBJECT (security)); /* set_security copies the object */
|
||||
|
||||
nm_ap_set_timestamp (ap, timestamp_secs, 0);
|
||||
|
||||
nm_ap_set_trusted (ap, trusted);
|
||||
nm_ap_set_fallback (ap, fallback);
|
||||
nm_ap_set_user_addresses (ap, addr_list);
|
||||
|
||||
if ((list_ap = nm_ap_list_get_ap_by_essid (cb_data->list, essid)))
|
||||
{
|
||||
nm_ap_set_essid (list_ap, nm_ap_get_essid (ap));
|
||||
nm_ap_set_timestamp_via_timestamp (list_ap, nm_ap_get_timestamp (ap));
|
||||
nm_ap_set_trusted (list_ap, nm_ap_get_trusted (ap));
|
||||
nm_ap_set_fallback (list_ap, nm_ap_get_fallback (ap));
|
||||
nm_ap_set_security (list_ap, nm_ap_get_security (ap));
|
||||
nm_ap_set_user_addresses (list_ap, nm_ap_get_user_addresses (ap));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -767,6 +767,103 @@ link_to_specific_ap (NMDevice80211Wireless *self,
|
|||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
get_ap_blacklisted (NMAccessPoint *ap, GSList *addrs)
|
||||
{
|
||||
gboolean blacklisted;
|
||||
|
||||
blacklisted = nm_ap_has_manufacturer_default_essid (ap);
|
||||
if (blacklisted)
|
||||
{
|
||||
GSList *elt;
|
||||
const struct ether_addr *ap_addr;
|
||||
char char_addr[20];
|
||||
|
||||
ap_addr = nm_ap_get_address (ap);
|
||||
|
||||
memset (&char_addr[0], 0, 20);
|
||||
iw_ether_ntop (ap_addr, &char_addr[0]);
|
||||
|
||||
for (elt = addrs; elt; elt = g_slist_next (elt))
|
||||
{
|
||||
if (elt->data && !strcmp (elt->data, &char_addr[0]))
|
||||
{
|
||||
blacklisted = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return blacklisted;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_best_fallback_ap
|
||||
*
|
||||
* Find and return the most suitable "fallback" network, if any. We "fall back"
|
||||
* on these networks and attempt a brute-force connection, given no better options.
|
||||
*/
|
||||
static NMAccessPoint *
|
||||
get_best_fallback_ap (NMDevice80211Wireless *self)
|
||||
{
|
||||
NMAccessPointList * allowed_list;
|
||||
NMAccessPoint * best_ap = NULL;
|
||||
NMAccessPoint * allowed_ap;
|
||||
GTimeVal best_timestamp = {0, 0};
|
||||
NMAPListIter * iter;
|
||||
NMData * app_data;
|
||||
|
||||
app_data = nm_device_get_app_data (NM_DEVICE (self));
|
||||
allowed_list = app_data->allowed_ap_list;
|
||||
|
||||
iter = nm_ap_list_iter_new (allowed_list);
|
||||
if (!iter)
|
||||
return NULL;
|
||||
|
||||
while ((allowed_ap = nm_ap_list_iter_next (iter)))
|
||||
{
|
||||
const char * essid;
|
||||
GSList * user_addrs;
|
||||
const GTimeVal * curtime;
|
||||
gboolean blacklisted;
|
||||
|
||||
/* Only designated fallback networks, natch */
|
||||
if (!nm_ap_get_fallback (allowed_ap))
|
||||
continue;
|
||||
|
||||
/* Only connect to a blacklisted AP if the user has connected to this specific AP before */
|
||||
user_addrs = nm_ap_get_user_addresses (allowed_ap);
|
||||
blacklisted = get_ap_blacklisted (allowed_ap, user_addrs);
|
||||
g_slist_foreach (user_addrs, (GFunc) g_free, NULL);
|
||||
g_slist_free (user_addrs);
|
||||
if (blacklisted)
|
||||
continue;
|
||||
|
||||
/* No fallback to networks on the invalid list -- we probably already tried them and failed */
|
||||
essid = nm_ap_get_essid (allowed_ap);
|
||||
if (nm_ap_list_get_ap_by_essid (app_data->invalid_ap_list, essid))
|
||||
continue;
|
||||
|
||||
curtime = nm_ap_get_timestamp (allowed_ap);
|
||||
if (curtime->tv_sec > best_timestamp.tv_sec)
|
||||
{
|
||||
best_timestamp = *nm_ap_get_timestamp (allowed_ap);
|
||||
best_ap = allowed_ap;
|
||||
}
|
||||
}
|
||||
nm_ap_list_iter_free (iter);
|
||||
|
||||
if (best_ap)
|
||||
{
|
||||
nm_ap_set_broadcast (best_ap, FALSE);
|
||||
nm_info ("No allowed networks in sight: Brute forcing fall-back '%s'", nm_ap_get_essid (best_ap));
|
||||
}
|
||||
|
||||
return best_ap;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* nm_device_update_best_ap
|
||||
*
|
||||
|
|
@ -782,10 +879,7 @@ nm_device_802_11_wireless_get_best_ap (NMDevice80211Wireless *self)
|
|||
NMAccessPoint * best_ap = NULL;
|
||||
NMAccessPoint * cur_ap = NULL;
|
||||
NMActRequest * req = NULL;
|
||||
NMAccessPoint * trusted_best_ap = NULL;
|
||||
NMAccessPoint * untrusted_best_ap = NULL;
|
||||
GTimeVal trusted_latest_timestamp = {0, 0};
|
||||
GTimeVal untrusted_latest_timestamp = {0, 0};
|
||||
GTimeVal best_timestamp = {0, 0};
|
||||
NMData * app_data;
|
||||
|
||||
g_return_val_if_fail (self != NULL, NULL);
|
||||
|
|
@ -844,54 +938,29 @@ nm_device_802_11_wireless_get_best_ap (NMDevice80211Wireless *self)
|
|||
|
||||
if ((tmp_ap = nm_ap_list_get_ap_by_essid (app_data->allowed_ap_list, ap_essid)))
|
||||
{
|
||||
const GTimeVal *curtime = nm_ap_get_timestamp (tmp_ap);
|
||||
const GTimeVal * curtime = nm_ap_get_timestamp (tmp_ap);
|
||||
gboolean blacklisted;
|
||||
GSList * user_addrs;
|
||||
|
||||
/* Only connect to a blacklisted AP if the user has connected
|
||||
* to this specific AP before.
|
||||
*/
|
||||
gboolean blacklisted = nm_ap_has_manufacturer_default_essid (scan_ap);
|
||||
if (blacklisted)
|
||||
/* Only connect to a blacklisted AP if the user has connected to this specific AP before */
|
||||
user_addrs = nm_ap_get_user_addresses (tmp_ap);
|
||||
blacklisted = get_ap_blacklisted (scan_ap, user_addrs);
|
||||
g_slist_foreach (user_addrs, (GFunc) g_free, NULL);
|
||||
g_slist_free (user_addrs);
|
||||
|
||||
if (!blacklisted && (curtime->tv_sec > best_timestamp.tv_sec))
|
||||
{
|
||||
GSList *elt, *user_addrs;
|
||||
const struct ether_addr *ap_addr;
|
||||
char char_addr[20];
|
||||
|
||||
ap_addr = nm_ap_get_address (scan_ap);
|
||||
user_addrs = nm_ap_get_user_addresses (tmp_ap);
|
||||
|
||||
memset (&char_addr[0], 0, 20);
|
||||
iw_ether_ntop (ap_addr, &char_addr[0]);
|
||||
|
||||
for (elt = user_addrs; elt; elt = g_slist_next (elt))
|
||||
{
|
||||
if (elt->data && !strcmp (elt->data, &char_addr[0]))
|
||||
{
|
||||
blacklisted = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
g_slist_foreach (user_addrs, (GFunc)g_free, NULL);
|
||||
g_slist_free (user_addrs);
|
||||
}
|
||||
|
||||
if (!blacklisted && nm_ap_get_trusted (tmp_ap) && (curtime->tv_sec > trusted_latest_timestamp.tv_sec))
|
||||
{
|
||||
trusted_latest_timestamp = *nm_ap_get_timestamp (tmp_ap);
|
||||
trusted_best_ap = scan_ap;
|
||||
nm_ap_set_security (trusted_best_ap, nm_ap_get_security (tmp_ap));
|
||||
}
|
||||
else if (!blacklisted && !nm_ap_get_trusted (tmp_ap) && (curtime->tv_sec > untrusted_latest_timestamp.tv_sec))
|
||||
{
|
||||
untrusted_latest_timestamp = *nm_ap_get_timestamp (tmp_ap);
|
||||
untrusted_best_ap = scan_ap;
|
||||
nm_ap_set_security (untrusted_best_ap, nm_ap_get_security (tmp_ap));
|
||||
best_timestamp = *nm_ap_get_timestamp (tmp_ap);
|
||||
best_ap = scan_ap;
|
||||
nm_ap_set_security (best_ap, nm_ap_get_security (tmp_ap));
|
||||
}
|
||||
}
|
||||
}
|
||||
best_ap = trusted_best_ap ? trusted_best_ap : untrusted_best_ap;
|
||||
nm_ap_list_iter_free (iter);
|
||||
|
||||
if (!best_ap)
|
||||
best_ap = get_best_fallback_ap (self);
|
||||
|
||||
if (best_ap)
|
||||
nm_ap_ref (best_ap);
|
||||
|
||||
|
|
@ -1752,7 +1821,6 @@ convert_scan_results (gpointer user_data)
|
|||
NMDevice80211Wireless * self;
|
||||
GTimeVal cur_time;
|
||||
NMAPListIter * iter = NULL;
|
||||
const char * iface;
|
||||
NMData * app_data;
|
||||
NMAccessPointList * ap_list;
|
||||
|
||||
|
|
@ -1765,12 +1833,15 @@ convert_scan_results (gpointer user_data)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
iface = nm_device_get_iface (NM_DEVICE (self));
|
||||
app_data = nm_device_get_app_data (NM_DEVICE (self));
|
||||
if (cb_data->results_len > 0)
|
||||
{
|
||||
if (!process_scan_results (self, cb_data->results, cb_data->results_len))
|
||||
{
|
||||
const char * iface;
|
||||
iface = nm_device_get_iface (NM_DEVICE (self));
|
||||
nm_warning ("process_scan_results() on device %s returned an error.", iface);
|
||||
}
|
||||
|
||||
/* Once we have the list, copy in any relevant information from our Allowed list. */
|
||||
nm_ap_list_copy_properties (nm_device_802_11_wireless_ap_list_get (self), app_data->allowed_ap_list);
|
||||
|
|
@ -3035,7 +3106,7 @@ real_activation_failure_handler (NMDevice *dev,
|
|||
if (nm_ap_get_artificial (ap))
|
||||
{
|
||||
NMAccessPointList * dev_list;
|
||||
|
||||
|
||||
/* Artificial APs are ones that don't show up in scans,
|
||||
* but which the user explicitly attempted to connect to.
|
||||
* However, if we fail on one of these, remove it from the
|
||||
|
|
|
|||
27
test/nm-set-fallback
Normal file
27
test/nm-set-fallback
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
#! /bin/sh
|
||||
#
|
||||
# nm-set-fallback - mark a network as fallback
|
||||
#
|
||||
# Robert Love
|
||||
|
||||
BIN=`which gconftool-2`
|
||||
|
||||
if [ "x$1" == "x" ]; then
|
||||
echo "usage: $0 <network> <true|false>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "x$2" != "xtrue" -a "x$2" != "xfalse" ]; then
|
||||
echo "usage: $0 <network> <true|false>"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
KEY="/system/networking/wireless/networks/${1}/fallback"
|
||||
CURRENT=`$BIN --get $KEY 2>/dev/null`
|
||||
|
||||
if [ "x$CURRENT" != "xtrue" -a "x$CURRENT" != "xfalse" ]; then
|
||||
echo "Network '$1' is not valid"
|
||||
exit 3
|
||||
fi
|
||||
|
||||
$BIN --set --type=bool $KEY ${2}
|
||||
Loading…
Add table
Reference in a new issue