diff --git a/ChangeLog b/ChangeLog index 2ca688c148..5d2aa44483 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2004-10-04 Dan Williams + + * src/NetworkManagerDevice.[ch] + - Add a slightly more robust method of determining if the WEP key + is correct or not, by checking the WEP-discarded packet count + on the card + + * info-daemon/NetworkManagerInfo.c + - (nmi_gconf_notify_callback): Fix GConf essid escaping, should + un-escape values we pull out rather than escaping them + 2004-10-03 Marcel Telka * configure.in (ALL_LINGUAS): Added sk. diff --git a/info-daemon/NetworkManagerInfo.c b/info-daemon/NetworkManagerInfo.c index 654fe6f23f..32fec8d165 100644 --- a/info-daemon/NetworkManagerInfo.c +++ b/info-daemon/NetworkManagerInfo.c @@ -67,17 +67,17 @@ void nmi_gconf_notify_callback (GConfClient *client, guint connection_id, GConfE { char *network = g_strdup ((key + path_len)); char *slash_pos; - char *escaped_network; + char *unescaped_network; /* If its a key under the network name, zero out the slash so we * are left with only the network name. */ - if ((slash_pos = strchr (network, '/'))) + unescaped_network = gnome_vfs_unescape_string (network, ""); + if ((slash_pos = strchr (unescaped_network, '/'))) *slash_pos = '\0'; - escaped_network = gnome_vfs_escape_string (network); - nmi_dbus_signal_update_network (info->connection, network, NETWORK_TYPE_ALLOWED); - g_free (escaped_network); + nmi_dbus_signal_update_network (info->connection, unescaped_network, NETWORK_TYPE_ALLOWED); + g_free (unescaped_network); g_free (network); } } diff --git a/info-daemon/NetworkManagerInfoDbus.c b/info-daemon/NetworkManagerInfoDbus.c index 6f2b5c3f27..1f8457bb7f 100644 --- a/info-daemon/NetworkManagerInfoDbus.c +++ b/info-daemon/NetworkManagerInfoDbus.c @@ -488,7 +488,7 @@ static DBusHandlerResult nmi_dbus_nmi_message_handler (DBusConnection *connectio method = dbus_message_get_member (message); path = dbus_message_get_path (message); - syslog (LOG_WARNING, "nmi_dbus_nmi_message_handler() got method %s for path %s", method, path); +/* syslog (LOG_WARNING, "nmi_dbus_nmi_message_handler() got method %s for path %s", method, path);*/ if (strcmp ("getKeyForNetwork", method) == 0) { diff --git a/src/NetworkManagerDevice.c b/src/NetworkManagerDevice.c index 4240c7fe0b..d3456276d1 100644 --- a/src/NetworkManagerDevice.c +++ b/src/NetworkManagerDevice.c @@ -910,6 +910,29 @@ guint8 nm_device_get_max_quality (NMDevice *dev) } +/* + * nm_device_get_bad_crypt_packets + * + * Return the number of packets the card has dropped because + * they could not be successfully decrypted. + * + */ +guint32 nm_device_get_bad_crypt_packets (NMDevice *dev) +{ + iwstats stats; + int sk; + int err; + + g_return_val_if_fail (dev != NULL, 0); + g_return_val_if_fail (nm_device_is_wireless (dev), 0); + + sk = iw_sockets_open (); + err = iw_get_stats (sk, nm_device_get_iface (dev), &stats, NULL, FALSE); + close (sk); + return (err == 0 ? stats.discard.code : 0); +} + + /* * nm_device_get_ip4_address * @@ -1200,6 +1223,15 @@ static gboolean nm_device_activate_wireless (NMDevice *dev) } +inline gboolean HAVE_LINK (NMDevice *dev, guint32 bad_crypt_packets) +{ + g_return_val_if_fail (dev != NULL, FALSE); + g_return_val_if_fail (nm_device_is_wireless (dev), FALSE); + +fprintf (stderr, "PACKETS: dev %d, previous %d\n", nm_device_get_bad_crypt_packets (dev), bad_crypt_packets); + return (nm_device_get_link_active (dev) && (nm_device_get_bad_crypt_packets (dev) <= bad_crypt_packets)); +} + /* * nm_device_activate_wireless_wait_for_link * @@ -1211,6 +1243,7 @@ static gboolean nm_device_activate_wireless (NMDevice *dev) void nm_device_activate_wireless_wait_for_link (NMDevice *dev) { NMAccessPoint *best_ap; + guint32 bad_crypt_packets = 0; g_return_if_fail (dev != NULL); @@ -1222,6 +1255,7 @@ void nm_device_activate_wireless_wait_for_link (NMDevice *dev) } /* Try activating the device with the key and access point we have already */ + bad_crypt_packets = nm_device_get_bad_crypt_packets (dev); nm_device_activate_wireless (dev); /* Wait until we have a link. Some things that might block us from @@ -1237,7 +1271,20 @@ void nm_device_activate_wireless_wait_for_link (NMDevice *dev) * a "best" access point for us. * */ - while (!nm_device_get_link_active (dev)) + + /* There are two ways to check for a good link. If we are using WEP and Open System + * authentication, then we can associate with the base station regardless of whether the + * WEP key is right or not. Therefore, we have to monitor the # of packets the card discards + * when its unable to decrypt them, since that gives us some indicator of whether the WEP + * key is wrong. It seems that right after association, at least one packet is dropped by + * most cards if the WEP key is wrong. + * + * The second and better way (if all cards actually supported it) is to check the MAC address + * the card is associated with. However, this doesn't tell us if the WEP key is wrong when we + * are using Open System authentication. Also, not all drivers return an invalid MAC address + * when the card cannot communicate with the access point. + */ + while (!HAVE_LINK (dev, bad_crypt_packets)) { if ((best_ap = nm_device_get_best_ap (dev))) { @@ -1299,7 +1346,8 @@ void nm_device_activate_wireless_wait_for_link (NMDevice *dev) return; } - /* Try activating again with up-to-date access point and keys */ + /* Try activating again with up-to-date access point and keys */ + bad_crypt_packets = nm_device_get_bad_crypt_packets (dev); nm_device_activate_wireless (dev); } else diff --git a/src/NetworkManagerDevice.h b/src/NetworkManagerDevice.h index 650a96684e..7dac72767a 100644 --- a/src/NetworkManagerDevice.h +++ b/src/NetworkManagerDevice.h @@ -64,6 +64,7 @@ gint8 nm_device_get_signal_strength (NMDevice *dev); void nm_device_update_signal_strength (NMDevice *dev); guint8 nm_device_get_noise (NMDevice *dev); guint8 nm_device_get_max_quality (NMDevice *dev); +guint32 nm_device_get_bad_crypt_packets (NMDevice *dev); NMAccessPoint *nm_device_get_best_ap (NMDevice *dev); void nm_device_set_best_ap (NMDevice *dev, NMAccessPoint *ap);