diff --git a/ChangeLog b/ChangeLog index db461d7da..e9779d9a4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,6 +11,24 @@ support. * src/backends/NetworkManagerSuSE.c: add NIS support, baby. +2005-12-14 Dan Williams + + * include/NetworkManager.h + - Update and split 802.11 wireless-specific capabilities from + generic device capabilities + + * src/NetworkManagerDevice.c + src/NetworkManagerDevicePrivate.h + - (nm_device_wireless_discover_capabilities): Move 802.11 + wireless-specific capability checks to + NetworkManagerWireless.c + - Rename NMDeviceWirelessOptions -> NMDevice80211WirelessOptions + - Rename NMDeviceWiredOptions -> NMDevice80211EthernetOptions + + * src/NetworkManagerWireless.[ch] + - (nm_802_11_wireless_discover_capabilities): Check extended + 802.11 wireless-specific capabilities of the driver + 2005-12-14 Dan Williams * src/nm-ap-security*.[ch] diff --git a/include/NetworkManager.h b/include/NetworkManager.h index 1d8b35e4a..3fc36860e 100644 --- a/include/NetworkManager.h +++ b/include/NetworkManager.h @@ -94,15 +94,33 @@ typedef enum NMEncKeyType /* - * Device capability bits + * General device capability bits * */ -#define NM_DEVICE_CAP_NONE 0x0000 -#define NM_DEVICE_CAP_NM_SUPPORTED 0x0001 -#define NM_DEVICE_CAP_CARRIER_DETECT 0x0002 -#define NM_DEVICE_CAP_WIRELESS_SCAN 0x0004 -#define NM_DEVICE_CAP_WIRELESS_WPA 0x0008 -#define NM_DEVICE_CAP_WIRELESS_WPA2 0x0010 +#define NM_DEVICE_CAP_NONE 0x00000000 +#define NM_DEVICE_CAP_NM_SUPPORTED 0x00000001 +#define NM_DEVICE_CAP_CARRIER_DETECT 0x00000002 +#define NM_DEVICE_CAP_WIRELESS_SCAN 0x00000004 + + +/* 802.11 wireless-specific device capability bits */ +#define NM_802_11_CAP_NONE 0x00000000 +#define NM_802_11_CAP_KEY_MGMT_WPA 0x00000001 +#define NM_802_11_CAP_KEY_MGMT_WPA_PSK 0x00000002 +#define NM_802_11_CAP_KEY_MGMT_WPA2 0x00000004 +#define NM_802_11_CAP_KEY_MGMT_WPA2_PSK 0x00000008 +#define NM_802_11_CAP_KEY_MGMT_RESERVED1 0x00000010 +#define NM_802_11_CAP_KEY_MGMT_RESERVED2 0x00000020 +#define NM_802_11_CAP_KEY_MGMT_RESERVED3 0x00000040 +#define NM_802_11_CAP_KEY_MGMT_RESERVED4 0x00000080 +#define NM_802_11_CAP_CIPHER_WEP40 0x00000100 +#define NM_802_11_CAP_CIPHER_WEP104 0x00000200 +#define NM_802_11_CAP_CIPHER_TKIP 0x00000400 +#define NM_802_11_CAP_CIPHER_CCMP 0x00000800 +#define NM_802_11_CAP_CIPHER_RESERVED1 0x00001000 +#define NM_802_11_CAP_CIPHER_RESERVED2 0x00002000 +#define NM_802_11_CAP_CIPHER_RESERVED3 0x00004000 +#define NM_802_11_CAP_CIPHER_RESERVED4 0x00008000 /* diff --git a/src/NetworkManagerDevice.c b/src/NetworkManagerDevice.c index e5fb54504..328096ef2 100644 --- a/src/NetworkManagerDevice.c +++ b/src/NetworkManagerDevice.c @@ -334,8 +334,8 @@ void nm_device_copy_allowed_to_dev_list (NMDevice *dev, NMAccessPointList *allow */ static gboolean nm_device_wireless_init (NMDevice *dev) { - NMSock *sk; - NMDeviceWirelessOptions *opts = &(dev->options.wireless); + NMDevice80211WirelessOptions * opts = &(dev->options.wireless); + NMSock * sk; g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (nm_device_is_802_11_wireless (dev), FALSE); @@ -359,8 +359,16 @@ static gboolean nm_device_wireless_init (NMDevice *dev) opts->we_version = 0; if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL))) { - iwrange range; - if (iw_get_range_info (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), &range) >= 0) + struct iw_range range; + struct iwreq wrq; + int minlen = ((char *) &range.enc_capa) - (char *) &range + sizeof (range.enc_capa); + + memset (&wrq, 0, sizeof (wrq)); + strncpy (wrq.ifr_name, nm_device_get_iface (dev), IFNAMSIZ); + wrq.u.data.pointer = (caddr_t) ⦥ + wrq.u.data.length = sizeof (struct iw_range); + + if (ioctl (nm_dev_sock_get_fd (sk), SIOCGIWRANGE, &wrq) >= 0) { int i; @@ -379,6 +387,9 @@ static gboolean nm_device_wireless_init (NMDevice *dev) opts->freqs[i] = iw_freq2float (&(range.freq[i])); opts->we_version = range.we_version_compiled; + + /* 802.11 wireless-specific capabilities */ + opts->capabilities = nm_802_11_wireless_discover_capabilities (dev, &range, wrq.u.data.length); } nm_dev_sock_close (sk); } @@ -653,38 +664,6 @@ static guint32 nm_device_wireless_discover_capabilities (NMDevice *dev) } } - /* A test wireless device is a pro at WPA and WPA2 */ - if (dev->test_device) - caps |= NM_DEVICE_CAP_WIRELESS_WPA | NM_DEVICE_CAP_WIRELESS_WPA2; - else - { - if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL))) - { - struct iw_range range; - struct iwreq wrq; - - memset (&wrq, 0, sizeof (wrq)); - strncpy (wrq.ifr_name, nm_device_get_iface (dev), IFNAMSIZ); - wrq.u.data.pointer = (caddr_t) ⦥ - wrq.u.data.length = sizeof (struct iw_range); - - if (ioctl (nm_dev_sock_get_fd (sk), SIOCGIWRANGE, &wrq) >= 0) - { - if (range.enc_capa & IW_ENC_CAPA_WPA) - caps |= NM_DEVICE_CAP_WIRELESS_WPA; - if (range.enc_capa & IW_ENC_CAPA_WPA2) - caps |= NM_DEVICE_CAP_WIRELESS_WPA2; - } - - /* - * FIXME: Most drivers do not yet support enc_capa, so we should - * try another method here if neither WPA cap was set. - */ - - nm_dev_sock_close (sk); - } - } - return caps; } diff --git a/src/NetworkManagerDevicePrivate.h b/src/NetworkManagerDevicePrivate.h index d2bd16313..94d656c95 100644 --- a/src/NetworkManagerDevicePrivate.h +++ b/src/NetworkManagerDevicePrivate.h @@ -34,9 +34,9 @@ /* Wireless device specific options */ -typedef struct NMDeviceWirelessOptions +typedef struct NMDevice80211WirelessOptions { - char * cur_essid; /* Mainly for test devices */ + char * cur_essid; /* Only for test devices */ gint8 strength; gint8 invalid_strength_counter; iwqual max_qual; @@ -51,20 +51,23 @@ typedef struct NMDeviceWirelessOptions NMAccessPointList * ap_list; guint8 scan_interval; /* seconds */ guint32 last_scan; + + /* Static options from driver */ guint8 we_version; -} NMDeviceWirelessOptions; + guint32 capabilities; +} NMDevice80211WirelessOptions; /* Wired device specific options */ -typedef struct NMDeviceWiredOptions +typedef struct NMDevice80211EthernetOptions { guint32 unused; -} NMDeviceWiredOptions; +} NMDevice8023EthernetOptions; /* General options structure */ typedef union NMDeviceOptions { - NMDeviceWirelessOptions wireless; - NMDeviceWiredOptions wired; + NMDevice80211WirelessOptions wireless; + NMDevice8023EthernetOptions wired; } NMDeviceOptions; diff --git a/src/NetworkManagerWireless.c b/src/NetworkManagerWireless.c index 562171339..e1ac1170c 100644 --- a/src/NetworkManagerWireless.c +++ b/src/NetworkManagerWireless.c @@ -271,3 +271,50 @@ void nm_wireless_set_scan_interval (NMData *data, NMDevice *dev, NMWirelessScanI g_source_unref (source); } } + + +guint32 nm_802_11_wireless_discover_capabilities (NMDevice *dev, iwrange * range, guint32 data_len) +{ + int minlen; + guint32 caps = NM_802_11_CAP_NONE; + + g_return_val_if_fail (dev != NULL, NM_802_11_CAP_NONE); + g_return_val_if_fail (range != NULL, NM_802_11_CAP_NONE); + + minlen = ((char *) range->enc_capa) - (char *) range + sizeof (range->enc_capa); + + /* A test wireless device is a pro at everything */ + if (nm_device_is_test_device (dev)) + { + caps |= NM_802_11_CAP_KEY_MGMT_WPA + | NM_802_11_CAP_KEY_MGMT_WPA2 + | NM_802_11_CAP_KEY_MGMT_WPA_PSK + | NM_802_11_CAP_KEY_MGMT_WPA2_PSK + | NM_802_11_CAP_CIPHER_WEP40 + | NM_802_11_CAP_CIPHER_WEP104 + | NM_802_11_CAP_CIPHER_TKIP + | NM_802_11_CAP_CIPHER_CCMP; + } + else + { + /* All drivers should support WEP by default */ + caps |= NM_802_11_CAP_CIPHER_WEP40 | NM_802_11_CAP_CIPHER_WEP104; + + if ((data_len >= minlen) && range->we_version_compiled >= 18) + { + if (range->enc_capa & IW_ENC_CAPA_WPA) + caps |= NM_802_11_CAP_KEY_MGMT_WPA | NM_802_11_CAP_KEY_MGMT_WPA_PSK; + if (range->enc_capa & IW_ENC_CAPA_WPA2) + caps |= NM_802_11_CAP_KEY_MGMT_WPA2 | NM_802_11_CAP_KEY_MGMT_WPA2_PSK; + + 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; + } + } + + return caps; +} + + diff --git a/src/NetworkManagerWireless.h b/src/NetworkManagerWireless.h index 1a07c1a2e..7c3db3e73 100644 --- a/src/NetworkManagerWireless.h +++ b/src/NetworkManagerWireless.h @@ -37,4 +37,7 @@ int nm_wireless_qual_to_percent (const struct iw_quality *qual, const struct iw_quality *avg_qual); void nm_wireless_set_scan_interval (NMData *data, NMDevice *dev, NMWirelessScanInterval interval); +guint32 nm_802_11_wireless_discover_capabilities (NMDevice *dev, iwrange * range, guint32 data_len); + + #endif