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:
@@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user