2005-12-14 Dan Williams <dcbw@redhat.com>

* 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


git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1188 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
Dan Williams
2005-12-14 17:56:35 +00:00
parent 9841fc9c45
commit a00992c902
6 changed files with 118 additions and 50 deletions

View File

@@ -11,6 +11,24 @@
support.
* src/backends/NetworkManagerSuSE.c: add NIS support, baby.
2005-12-14 Dan Williams <dcbw@redhat.com>
* 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 <dcbw@redhat.com>
* src/nm-ap-security*.[ch]

View File

@@ -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
/*

View File

@@ -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) &range;
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) &range;
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;
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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