diff options
author | Scott Ullrich <sullrich@pfsense.org> | 2005-10-25 23:43:18 +0000 |
---|---|---|
committer | Scott Ullrich <sullrich@pfsense.org> | 2005-10-25 23:43:18 +0000 |
commit | 7a2215437ed23bb1cdced127db99468be964e00b (patch) | |
tree | c1fbdaed0ca1d84d6dbce6f298ea373b6dc9e945 | |
parent | 1a97873411ca8def43b8e7dfbdc466bedf406686 (diff) | |
download | pfsense-7a2215437ed23bb1cdced127db99468be964e00b.zip pfsense-7a2215437ed23bb1cdced127db99468be964e00b.tar.gz |
Handle ethernet hotplug events correctly
-rw-r--r-- | etc/devd.conf | 152 | ||||
-rwxr-xr-x | etc/rc.linkup | 22 |
2 files changed, 23 insertions, 151 deletions
diff --git a/etc/devd.conf b/etc/devd.conf index 7246357..ae15b75 100644 --- a/etc/devd.conf +++ b/etc/devd.conf @@ -1,132 +1,48 @@ # $Id$ # $FreeBSD: src/etc/devd.conf,v 1.26.2.1 2005/09/03 22:49:22 sam Exp $ -# -# Refer to devd.conf(5) and devd(8) man pages for the details on how to -# run and configure devd. -# - -# NB: All regular expressions have an implicit ^$ around them. -# NB: device-name is shorthand for 'match device-name' options { - # Each directory directive adds a directory the list of directories - # that we scan for files. Files are read-in in the order that they - # are returned from readdir(3). The rule-sets are combined to - # create a DFA that's used to match events to actions. directory "/etc/devd"; - directory "/usr/local/etc/devd"; pid-file "/var/run/devd.pid"; - - # Setup some shorthand for regex that we use later in the file. - #XXX Yes, these are gross -- imp set scsi-controller-regex "(aac|adv|adw|aha|ahb|ahc|ahd|aic|amd|amr|asr|bt|ciss|ct|dpt|\ esp|ida|iir|ips|isp|mlx|mly|mpt|ncr|ncv|nsp|stg|sym|trm|wds)\ [0-9]+"; }; -# Note that the attach/detach with the highest value wins, so that one can -# override these general rules. - -# -# For ethernet like devices start configuring the interface. Due to -# a historical accident, this script is called pccard_ether. -# +# Handle ethernet linkup and linkdown attach 0 { media-type "ethernet"; - action "/sbin/dhclient $device-name"; + action "/etc/rc.linkup $device-name start"; }; detach 0 { media-type "ethernet"; - action "/sbin/ifconfig $device-name delete && /usr/sbin/arp -da"; + action "/etc/rc.linkup $device-name stop"; }; -# -# Try to start dhclient on Ethernet like interfaces when the link comes -# up. Only devices that are configured to support DHCP will actually -# run it. No link down rule exists because dhclient automaticly exits -# when the link goes down. -# -notify 0 { - match "system" "IFNET"; - match "type" "LINK_UP"; - media-type "ethernet"; - action "/sbin/dhclient $device-name"; -}; - -# -# Like Ethernet devices, but separate because -# they have a different media type. We may want -# to exploit this later. -# +# Handle wireless linkup and linkdown detach 0 { media-type "802.11"; - action "/sbin/ifconfig $device-name delete && /usr/sbin/arp -da"; + action "/etc/rc.linkup $device-name start"; }; + attach 0 { media-type "802.11"; - action "/sbin/dhclient $device-name"; -}; -notify 0 { - match "system" "IFNET"; - match "type" "LINK_UP"; - media-type "802.11"; - action "/sbin/dhclient $device-name"; -}; - -# An entry like this might be in a different file, but is included here -# as an example of how to override things. Normally 'ed50' would match -# the above attach/detach stuff, but the value of 100 makes it -# hard wired to 1.2.3.4. -attach 100 { - device-name "ed50"; - action "/sbin/ifconfig $device-name inet 1.2.3.4 netmask 0xffff0000"; -}; -detach 100 { - device-name "ed50"; + action "/etc/rc.linkup $device-name stop"; }; # When a USB keyboard arrives, attach it as the console keyboard. attach 100 { device-name "ukbd0"; - action "kbdcontrol -k /dev/ukbd0 < /dev/console && /etc/rc.d/syscons restart"; + action "kbdcontrol -k /dev/ukbd0 < /dev/console"; }; + detach 100 { device-name "ukbd0"; action "kbdcontrol -k /dev/kbd0 < /dev/console"; }; -# The entry below starts moused when a mouse is plugged in. Moused -# stops automatically (actually it bombs :) when the device disappears. -attach 100 { - device-name "ums[0-9]+"; - action "/etc/rc.d/moused start $device-name"; -}; - -# -# Rescan scsi device-names on attach, but not detach. However, it is -# disabled by default due to reports of problems. -# -attach 0 { - device-name "$scsi-controller-regex"; -// action "camcontrol rescan all"; -}; - -# Don't even try to second guess what to do about drivers that don't -# match here. Instead, pass it off to syslog. Commented out for the -# moment, as pnpinfo isn't set in devd yet. -nomatch 0 { -# action "logger Unknown device: $pnpinfo $location $bus"; -}; - -# Switch power profiles when the AC line state changes. -#notify 10 { -# match "system" "ACPI"; -# match "subsystem" "ACAD"; -# action "/etc/rc.d/power_profile $notify"; -#}; - # Notify all users before beginning emergency shutdown when we get # a _CRT or _HOT thermal event and we're going to power down the system # very soon. @@ -137,53 +53,3 @@ notify 10 { action "logger -p kern.emerg 'WARNING: system temperature too high, shutting down soon!'"; }; -/* EXAMPLES TO END OF FILE - -# The following might be an example of something that a vendor might -# install if you were to add their device. This might reside in -# /usr/local/etc/devd/deqna.conf. A deqna is, in this hypothetical -# example, a pccard ethernet-like device. Students of history may -# know other devices by this name, and will get the in-jokes in this -# entry. -nomatch 10 { - match "bus" "pccard[0-9]+"; - match "manufacturer" "0x1234"; - match "product" "0x2323"; - action "kldload if_deqna"; -}; -attach 10 { - device-name "deqna[0-9]+"; - action "/sbin/dhclient $device-name"; -}; -detach 10 { - device-name "deqna[0-9]+"; - action "/sbin/ifconfig $device-name delete && /usr/sbin/arp -da"; -}; - -# Examples of notify hooks. A notify is a generic way for a kernel -# subsystem to send event notification to userland. -# -# Here are some examples of ACPI notify handlers. ACPI subsystems that -# generate notifies include the AC adapter, power/sleep buttons, -# control method batteries, lid switch, and thermal zones. -# -# Information returned is not always the same as the ACPI notify -# events. See the ACPI specification for more information about -# notifies. Here is the information returned for each subsystem: -# -# ACAD: AC line state (0 is offline, 1 is online) -# Button: Button pressed (0 for power, 1 for sleep) -# CMBAT: ACPI battery events -# Lid: Lid state (0 is closed, 1 is open) -# Thermal: ACPI thermal zone events -# -# This example calls a script when the AC state changes, passing the -# notify value as the first argument. If the state is 0x00, it might -# call some sysctls to implement economy mode. If 0x01, it might set -# the mode to performance. -#notify 10 { -# match "system" "ACPI"; -# match "subsystem" "ACAD"; -# action "/etc/acpi_ac $notify"; -#}; -*/ diff --git a/etc/rc.linkup b/etc/rc.linkup index b935c2f..fc73327 100755 --- a/etc/rc.linkup +++ b/etc/rc.linkup @@ -1,7 +1,7 @@ #!/usr/local/bin/php -f <?php /* - rc.linkup + rc.linkup - devd hotplug actions part of pfSense Copyright (C) 2003-2005 Scott Ullrich <sullrich@gmail.com>. @@ -33,30 +33,36 @@ require_once("config.inc"); require_once("functions.inc"); - if($argv[2] == "stop") { + if($argv[2] == "stop" or $argv[2] == "down") { + log_error("DEVD Ethernet detached event for {$argv[1]}"); exec("/sbin/ifconfig {$argv[1]} delete"); exec("/sbin/ifconfig {$argv[1]} down"); - exec("arp -da"); + exec("/usr/sbin/arp -da"); + exit; } - if($argv[2] == "start") { - exec("/sbin/ifconfig {$argv[1]} delete"); + if($argv[2] == "start" or $argv[2] == "up") { + log_error("DEVD Ethernet attached event for {$argv[1]}"); exec("/sbin/ifconfig {$argv[1]} up"); - exec("arp -da"); + exec("/usr/sbin/arp -da"); } if($argv[1] <> "") { $interface = convert_real_interface_to_friendly_interface_name($argv[1]); } else { - $curwanip = get_current_wan_address(); + log_error("WARNING: No interface passed to rc.linkup"); $interface = "wan"; } if($interface == "wan") { + log_error("HOTPLUG: Configuring wan interface {$interface}"); interfaces_wan_configure(); + } else if($interface == "lan") { + log_error("HOTPLUG: Configuring lan interface {$interface}"); + interfaces_lan_configure(); } else { + log_error("HOTPLUG: Configuring optional interface {$interface}"); interfaces_optional_configure_if($interface); } - ?>
\ No newline at end of file |