2004-10-21 Dan Williams <dcbw@redhat.com>

* NetworkManager.h
		- New file, now contains commonly used structures and bits
			for the dbus API of NetworkManager

	* Makefile.am
		- Deliver NetworkManager.h to ${includedir}/NetworkManager

	* src/NetworkManager.h
		- Rename -> src/NetworkManagerMain.c

	* Various fixups all around to use NetworkManager.h and new
		src/NetworkManagerMain.h, remove redundant bits that got
		moved into NetworkManager.h

	* src/NetworkManagerDevice.[ch]
	  src/NetworkManagerUtils.[ch]
	  src/NetworkManagerPolicy.c
	  src/NetworkManagerDbus.c
		- Whitelist wireless drivers, and blacklist some wired
			drivers.  Also blacklist cipsec and ethernet-over-usb
			devices at this time (RH #135722, RH #135648)
		- Don't leak unsupported devices out over dbus, or allow
			them to be set as the active device.  Skip over them
			during automatic device picking

	* test/nmclienttest.c
		- Clean up the dbus code a lot


git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@261 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
Dan Williams
2004-10-21 17:42:14 +00:00
parent d8540834b3
commit faae8945db
28 changed files with 774 additions and 670 deletions

View File

@@ -210,3 +210,282 @@ int nm_spawn_process (char *args)
return (-1);
}
typedef struct driver_support
{
char *name;
NMDriverSupportLevel level;
} driver_support;
/* The list of wireless drivers we support and how well we support each */
static driver_support wireless_driver_support_list[] =
{
/* Fully supported drivers */
{"airo_cs", NM_DRIVER_FULLY_SUPPORTED},
{"airo", NM_DRIVER_FULLY_SUPPORTED},
{"atmel_cs", NM_DRIVER_FULLY_SUPPORTED},
{"atmel", NM_DRIVER_FULLY_SUPPORTED},
{"atmel_pci", NM_DRIVER_FULLY_SUPPORTED},
{"prism54", NM_DRIVER_FULLY_SUPPORTED},
{"wl3501_cs", NM_DRIVER_FULLY_SUPPORTED},
{"ipw2100", NM_DRIVER_FULLY_SUPPORTED},
{"ipw2200", NM_DRIVER_FULLY_SUPPORTED},
{"ath_pci", NM_DRIVER_FULLY_SUPPORTED},
{"ath_cs", NM_DRIVER_FULLY_SUPPORTED},
/* Semi-supported drivers, for example ones that don't support
* wireless scanning yet in-kernel
*/
{"hermes", NM_DRIVER_SEMI_SUPPORTED},
{"netwave_cs", NM_DRIVER_SEMI_SUPPORTED},
{"orinoco_cs", NM_DRIVER_SEMI_SUPPORTED},
{"orinoco", NM_DRIVER_SEMI_SUPPORTED},
{"orinoco_pci", NM_DRIVER_SEMI_SUPPORTED},
{"orinoco_plx", NM_DRIVER_SEMI_SUPPORTED},
{"orinoco_tmd", NM_DRIVER_SEMI_SUPPORTED},
{"wavelan_cs", NM_DRIVER_SEMI_SUPPORTED},
{"wavelan", NM_DRIVER_SEMI_SUPPORTED},
{NULL, NM_DRIVER_UNSUPPORTED}
};
/* Blacklist of unsupported wired drivers */
static driver_support wired_driver_blacklist[] =
{
/* Completely unsupported drivers */
{NULL, NM_DRIVER_UNSUPPORTED}
};
/*
* nm_get_device_driver_name
*
* Checks either /proc/sys/bus/devices or /var/lib/pcmcia/stab to determine
* which driver is bound to the device.
*
*/
char *nm_get_device_driver_name (LibHalContext *ctx, NMDevice *dev)
{
FILE *f;
char *driver_name = NULL;
int vendor;
int product;
g_return_val_if_fail (ctx != NULL, NULL);
g_return_val_if_fail (dev != NULL, NULL);
vendor = hal_device_get_property_int (ctx, nm_device_get_udi (dev), "pci.vendor_id");
product = hal_device_get_property_int (ctx, nm_device_get_udi (dev), "pci.product_id");
if (vendor && product)
{
if ((f = fopen ("/proc/bus/pci/devices", "r")))
{
char buf[200];
char id[9];
snprintf (&id[0], 9, "%4X%4X", vendor, product);
id[8] = '\0';
while (fgets (&buf[0], 200, f) && !feof (f))
{
char *p;
char s[9];
int len;
/* Whack newline */
buf[199] = '\0';
len = strlen (buf);
if ((buf[len-1] == '\n') || (buf[len-1] == '\r'))
{
buf[len-1] = '\0';
len--;
}
p = strchr (buf, '\t');
s[8] = '\0';
strncpy (&s[0], p+1, 8);
if (!strcmp (&s[0], &id[0]))
{
/* Yay, we've got a match. Pull the driver name from the
* last word in the line.
*/
char *m = strrchr (&buf[0], '\t');
if (m && (m > &buf[0]) && (m < &buf[len]))
{
driver_name = strdup (m+1);
syslog (LOG_INFO, "PCI driver for '%s' is '%s'", nm_device_get_iface (dev), driver_name);
break;
}
}
}
fclose (f);
}
}
/* Might be a PCMCIA card, try /var/lib/pcmcia/stab and match the interface name.
*
* stab has a format like this:
* Socket 0: Belkin F5D6020 rev.2
* 0 network atmel_cs 0 eth2
* Socket 1: Belkin-5020
* 1 network pcnet_cs 0 eth1
*/
if (!driver_name && (f = fopen ("/var/lib/pcmcia/stab", "r")))
{
char buf[200];
while (fgets (&buf[0], 200, f) && !feof (f))
{
int len;
char *p;
/* Whack newline */
buf[199] = '\0';
len = strlen (buf);
if ((buf[len-1] == '\n') || (buf[len-1] == '\r'))
{
buf[len-1] = '\0';
len--;
}
/* Ignore lines that start with "Socket" */
if (strncmp (&buf[0], "Socket", 6) && (p = strrchr (&buf[0], '\t')))
{
/* See if this device's interface matches our device's interface */
if (!strcmp (++p, nm_device_get_iface (dev)))
{
char *end;
/* Pull out driver name by seeking to _second_ tab */
if ((p = strchr (&buf[0], '\t')) && *(p++) && (p = strchr (p, '\t')))
{
p++;
end = strchr (p, '\t');
if (p && end)
{
*end = '\0';
driver_name = strdup (p);
syslog (LOG_INFO, "PCMCIA driver for '%s' is '%s'", nm_device_get_iface (dev), driver_name);
}
}
}
}
}
fclose (f);
}
return (driver_name);
}
/*
* nm_get_wireless_driver_support_level
*
* Checks either /proc/sys/bus/devices or /var/lib/pcmcia/stab to determine
* wether or not the card's driver is supported and how well, using a whitelist.
*
*/
NMDriverSupportLevel nm_get_wireless_driver_support_level (LibHalContext *ctx, NMDevice *dev)
{
NMDriverSupportLevel level = NM_DRIVER_UNSUPPORTED;
char *driver_name = NULL;
g_return_val_if_fail (ctx != NULL, FALSE);
g_return_val_if_fail (dev != NULL, FALSE);
if ((driver_name = nm_get_device_driver_name (ctx, dev)))
{
driver_support *driver = &wireless_driver_support_list[0];
while (driver->name != NULL)
{
if (!strcmp (driver->name, driver_name))
{
level = driver->level;
break;
}
driver++;
}
g_free (driver_name);
}
return (level);
}
/*
* nm_get_wired_driver_support_level
*
* Blacklist certain devices.
*
*/
NMDriverSupportLevel nm_get_wired_driver_support_level (LibHalContext *ctx, NMDevice *dev)
{
NMDriverSupportLevel level = NM_DRIVER_FULLY_SUPPORTED;
char *driver_name = NULL;
char *usb_test;
g_return_val_if_fail (ctx != NULL, FALSE);
g_return_val_if_fail (dev != NULL, FALSE);
if ((driver_name = nm_get_device_driver_name (ctx, dev)))
{
driver_support *driver = &wired_driver_blacklist[0];
while (driver->name != NULL)
{
if (!strcmp (driver->name, driver_name))
{
level = driver->level;
break;
}
driver++;
}
g_free (driver_name);
}
/* cipsec devices are also explicitly unsupported at this time */
if (strstr (nm_device_get_iface (dev), "cipsec"))
level = NM_DRIVER_UNSUPPORTED;
/* Ignore Ethernet-over-USB devices too for the moment (Red Hat #135722) */
if ((usb_test = hal_device_get_property_string (ctx, nm_device_get_udi (dev), "usb.interface.class")))
{
hal_free_string (usb_test);
level = NM_DRIVER_UNSUPPORTED;
}
return (level);
}
/*
* nm_get_driver_support_level
*
* Return the driver support level for a particular device.
*
*/
NMDriverSupportLevel nm_get_driver_support_level (LibHalContext *ctx, NMDevice *dev)
{
NMDriverSupportLevel level = NM_DRIVER_UNSUPPORTED;
g_return_val_if_fail (ctx != NULL, NM_DRIVER_UNSUPPORTED);
g_return_val_if_fail (dev != NULL, NM_DRIVER_UNSUPPORTED);
if (nm_device_is_wireless (dev))
level = nm_get_wireless_driver_support_level (ctx, dev);
else if (nm_device_is_wired (dev))
level = nm_get_wired_driver_support_level (ctx, dev);
switch (level)
{
case NM_DRIVER_SEMI_SUPPORTED:
syslog (LOG_INFO, "%s: Driver support level is semi-supported", nm_device_get_iface (dev));
break;
case NM_DRIVER_FULLY_SUPPORTED:
syslog (LOG_INFO, "%s: Driver support level is fully-supported", nm_device_get_iface (dev));
break;
default:
syslog (LOG_INFO, "%s: Driver support level is unsupported", nm_device_get_iface (dev));
break;
}
return (level);
}