Files
for-gentoo/net-misc/networkmanager/files/networkmanager-0.6.4-wireless-drivers-workarounds.patch
T
lxnay 522697b228 version bump
git-svn-id: http://svn.sabayonlinux.org/overlay@1163 d7aec97c-591d-0410-af39-a8856400b30a
2007-04-11 15:01:43 +00:00

196 lines
6.6 KiB
Diff

--- a/src/nm-device-802-11-wireless.c
+++ b/src/nm-device-802-11-wireless.c
@@ -116,7 +116,8 @@
guint8 **out_res_buf,
guint32 *data_len);
-static int wireless_qual_to_percent (const struct iw_quality *qual,
+static int wireless_qual_to_percent (NMDevice *dev,
+ const struct iw_quality *qual,
const struct iw_quality *max_qual,
const struct iw_quality *avg_qual);
@@ -244,8 +245,9 @@
#endif
if (iw_get_stats (nm_dev_sock_get_fd (sk), iface, &stats, &range, has_range) == 0)
{
- percent = wireless_qual_to_percent (&stats.qual, (const iwqual *)(&self->priv->max_qual),
- (const iwqual *)(&self->priv->avg_qual));
+ percent = wireless_qual_to_percent (NM_DEVICE (self), &stats.qual,
+ (const iwqual *)(&self->priv->max_qual),
+ (const iwqual *)(&self->priv->avg_qual));
}
nm_dev_sock_close (sk);
}
@@ -1148,7 +1150,8 @@
*
*/
static int
-wireless_qual_to_percent (const struct iw_quality *qual,
+wireless_qual_to_percent (NMDevice *dev,
+ const struct iw_quality *qual,
const struct iw_quality *max_qual,
const struct iw_quality *avg_qual)
{
@@ -1177,7 +1180,7 @@
* are free to use whatever they want to calculate "Link Quality".
*/
if ((max_qual->qual != 0) && !(max_qual->updated & IW_QUAL_QUAL_INVALID) && !(qual->updated & IW_QUAL_QUAL_INVALID))
- percent = (int)(100 * ((double)qual->qual / (double)max_qual->qual));
+ percent = (int) (100 * ((double) qual->qual / (double) max_qual->qual));
/* If the driver doesn't specify a complete and valid quality, we have two options:
*
@@ -1243,7 +1246,7 @@
}
/* If the quality percent was 0 or doesn't exist, then try to use signal levels instead */
- if ((percent < 1) && (level_percent >= 0))
+ if ((percent < 1 || !strcmp (nm_device_get_driver (dev), "ath_pci")) && (level_percent >= 0))
percent = level_percent;
#ifdef IW_QUAL_DEBUG
@@ -3301,7 +3304,8 @@
nm_ap_set_freq (ap, iw_freq2float(&(iwe->u.freq)));
break;
case IWEVQUAL:
- nm_ap_set_strength (ap, wireless_qual_to_percent (&(iwe->u.qual),
+ nm_ap_set_strength (ap, wireless_qual_to_percent (&dev->parent,
+ &(iwe->u.qual),
(const iwqual *)(&dev->priv->max_qual),
(const iwqual *)(&dev->priv->avg_qual)));
break;
--- a/src/nm-device-802-11-wireless.c
+++ b/src/nm-device-802-11-wireless.c
@@ -354,23 +354,15 @@
if ((data_len >= minlen) && range->we_version_compiled >= 18)
{
- if (range->enc_capa & IW_ENC_CAPA_WPA)
- {
- caps |= (NM_802_11_CAP_PROTO_WPA
- | NM_802_11_CAP_KEY_MGMT_PSK
- | NM_802_11_CAP_KEY_MGMT_802_1X);
- }
- if (range->enc_capa & IW_ENC_CAPA_WPA2)
- {
- caps |= (NM_802_11_CAP_PROTO_WPA2
- | NM_802_11_CAP_KEY_MGMT_PSK
- | NM_802_11_CAP_KEY_MGMT_802_1X);
- }
-
- if (range->enc_capa & IW_ENC_CAPA_CIPHER_TKIP)
- caps |= NM_802_11_CAP_CIPHER_TKIP;
- if (range->enc_capa & IW_ENC_CAPA_CIPHER_CCMP)
- caps |= NM_802_11_CAP_CIPHER_CCMP;
+ /* FIXME: Until all drivers support enc_capa ... */
+ caps |= (NM_802_11_CAP_PROTO_WPA
+ | NM_802_11_CAP_KEY_MGMT_PSK
+ | NM_802_11_CAP_KEY_MGMT_802_1X);
+ caps |= (NM_802_11_CAP_PROTO_WPA2
+ | NM_802_11_CAP_KEY_MGMT_PSK
+ | NM_802_11_CAP_KEY_MGMT_802_1X);
+ caps |= NM_802_11_CAP_CIPHER_TKIP;
+ caps |= NM_802_11_CAP_CIPHER_CCMP;
}
return caps;
@@ -2695,13 +2687,11 @@
}
-#define NM_SUPPLICANT_TIMEOUT 20 /* how long we wait for wpa_supplicant to associate (in seconds) */
+#define NM_SUPPLICANT_TIMEOUT 60 /* how long we wait for wpa_supplicant to associate (in seconds) */
static unsigned int
get_supplicant_timeout (NMDevice80211Wireless *self)
{
- if (self->priv->num_freqs > 14)
- return NM_SUPPLICANT_TIMEOUT * 2;
return NM_SUPPLICANT_TIMEOUT;
}
@@ -2910,6 +2900,8 @@
struct wpa_ctrl * ctrl = NULL;
char * socket_path;
const char * iface = nm_device_get_iface (NM_DEVICE (self));
+ const char * wpa_driver;
+ const char * kernel_driver;
gboolean success = FALSE;
int tries = 0;
@@ -2926,9 +2918,21 @@
goto exit;
}
+ /*
+ * We want to work with the generic "wext" wpa_supplicant driver, but some kernel drivers
+ * are just utter junk. For those losers, we use a specific wpa_supplicant driver.
+ */
+ kernel_driver = nm_device_get_driver (NM_DEVICE (self));
+ if (!strcmp (kernel_driver, "ath_pci"))
+ wpa_driver = "madwifi";
+ else if (!strcmp (kernel_driver, "prism54"))
+ wpa_driver = "prism54";
+ else
+ wpa_driver = "wext";
+
/* wpa_cli -g/var/run/wpa_supplicant-global interface_add eth1 "" wext /var/run/wpa_supplicant */
if (!nm_utils_supplicant_request_with_check (ctrl, "OK", __func__, NULL,
- "INTERFACE_ADD %s\t\twext\t" WPA_SUPPLICANT_CONTROL_SOCKET "\t", iface))
+ "INTERFACE_ADD %s\t\t%s\t" WPA_SUPPLICANT_CONTROL_SOCKET "\t", iface, wpa_driver))
goto exit;
wpa_ctrl_close (ctrl);
@@ -2964,7 +2968,8 @@
struct wpa_ctrl * ctrl;
gboolean is_adhoc;
char * hex_essid;
- const char * ap_scan = "AP_SCAN 1";
+ char * ap_scan;
+ const char * kernel_driver;
guint32 caps;
gboolean supports_wpa;
@@ -2986,12 +2991,39 @@
|| (caps & NM_802_11_CAP_PROTO_WPA2);
/* Use "AP_SCAN 2" if:
+ *
+ * - The wireless driver does not support "AP_SCAN 1"
+ * (orinoco, prism54, airo, and airo_cs)
+ * - The wireless network is hidden and the driver does not support
+ * "AP_SCAN 1" with hidden networks (ipw2100, ipw2200, and ndiswrapper)
* - The wireless network is non-broadcast or Ad-Hoc
* - The wireless driver does not support WPA (stupid drivers...)
+ *
+ * Otherwise, we prefer "AP_SCAN 1".
*/
is_adhoc = (nm_ap_get_mode(ap) == IW_MODE_ADHOC);
- if (!nm_ap_get_broadcast (ap) || is_adhoc || !supports_wpa)
+ kernel_driver = nm_device_get_driver (NM_DEVICE (self));
+ if (!strcmp (kernel_driver, "orinoco_cs"))
+ ap_scan = "AP_SCAN 2";
+ else if (!strcmp (kernel_driver, "prism54"))
+ ap_scan = "AP_SCAN 2";
+ else if (!strncmp (kernel_driver, "airo", 4))
+ ap_scan = "AP_SCAN 2";
+ else if (!strcmp (kernel_driver, "ndiswrapper") && !nm_ap_get_broadcast (ap))
+ ap_scan = "AP_SCAN 2";
+ else if (!strcmp (kernel_driver, "ipw2100") || !strcmp (kernel_driver, "ipw2200"))
+ {
+ if (nm_ap_get_broadcast (ap))
+ ap_scan = "AP_SCAN 1";
+ else
+ ap_scan = "AP_SCAN 2";
+ }
+ else if (is_adhoc)
ap_scan = "AP_SCAN 2";
+ else if (!supports_wpa)
+ ap_scan = "AP_SCAN 2";
+ else
+ ap_scan = "AP_SCAN 1";
/* Tell wpa_supplicant that we'll do the scanning */
if (!nm_utils_supplicant_request_with_check (ctrl, "OK", __func__, NULL, ap_scan))