summaryrefslogtreecommitdiffstats
path: root/perl-install
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install')
-rw-r--r--perl-install/network/ethernet.pm13
1 files changed, 13 insertions, 0 deletions
diff --git a/perl-install/network/ethernet.pm b/perl-install/network/ethernet.pm
index 113e6fb6a..bd13dd5a6 100644
--- a/perl-install/network/ethernet.pm
+++ b/perl-install/network/ethernet.pm
@@ -42,23 +42,34 @@ sub get_eth_categories() {
# return list of [ intf_name, module, device_description ] tuples such as:
# [ "eth0", "3c59x", "3Com Corporation|3c905C-TX [Fast Etherlink]" ]
+#
+# this function try several method in order to get interface's driver and description in order to support both:
+# - hotplug managed devices (USB, firewire)
+# - special interfaces (IP aliasing, VLAN)
sub get_eth_cards {
my ($modules_conf) = @_;
my @all_cards = detect_devices::getNet();
my @devs = detect_devices::pcmcia_probe();
my $saved_driver;
+ # compute device description and return (interface, driver, description) tuples:
return map {
my $interface = $_;
my $description;
+ # 0) get interface's driver through ETHTOOL ioctl or module aliases:
my $a = c::getNetDriver($interface) || $modules_conf->get_alias($interface);
$a = "eth1394" if $a eq "ip1394";
+ # 1) try to match a PCMCIA device for device description:
if (my $b = find { $_->{device} eq $interface } @devs) { # PCMCIA case
$a = $b->{driver};
$description = $b->{description};
} else {
+ # 2) try to lookup a device by hardware address for device description:
+ # maybe should have we try sysfs first for robustness?
($description) = (mapIntfToDevice($interface))[0]->{description};
}
+ # 3) try to match a device through sysfs for driver & device description:
+ # (eg: ipw2100 driver for intel centrino do not support ETHTOOL)
if (!$description) {
my $drv = readlink("/sys/class/net/$interface/driver");
if ($drv && $drv =~ s!.*/!!) {
@@ -70,6 +81,8 @@ sub get_eth_cards {
$description = $cards[0]{description} if @cards == 1;
}
}
+ # 4) try to match a device by driver for device description:
+ # (eg: madwifi, ndiswrapper, ...)
if (!$description) {
my @cards = grep { $_->{driver} eq ($a || $saved_driver) } detect_devices::probeall();
$description = $cards[0]{description} if @cards == 1;