Date: Tue, 17 Mar 2009 17:27:55 -0400 From: David Horn <dhorn2000@gmail.com> To: freebsd-net@freebsd.org Subject: Dynamic loading of network kernel modules? Message-ID: <25ff90d60903171427y4032d11es516d7b757fc3b8e0@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
I made a minor change to ifconfig to try kldloading the interface name specified on the create wlandev XXXX (ifconfig already tries for normal invocations, just needed to try with the wlandev interface) /usr/src/sbin/ifconfig/ifieee80211.c --- ifieee80211.c.original 2009-03-17 16:53:29.000000000 -0400 +++ ifieee80211.c 2009-03-17 16:53:43.000000000 -0400 @@ -4673,6 +4673,7 @@ memcmp(params.icp_bssid, zerobssid, sizeof(zerobssid)) == 0) errx(1, "no bssid specified for WDS (use wlanbssid)"); ifr->ifr_data = (caddr_t) ¶ms; + ifmaybeload(params.icp_parent); if (ioctl(s, SIOCIFCREATE2, ifr) < 0) err(1, "SIOCIFCREATE2"); } This works nicely, however at startup, I still do not get the interface up, or the kernel module loaded, so a second patch is needed. At issue is the list_net_interfaces() function in /etc/rc.d/network.subr, which assumes that the greatest possible list of interfaces is that which 'ifconfig -l' can give us. Unfortunately, this puts us in a bit of a chicken and egg situation for network interfaces that are modules. I also have a patch to network.subr that will look for any manually configured interfaces in rc.conf that are not in the list of 'ifconfig -l', and will try to start those interfaces as well. {specifically looking for ifconfig_xxx and wlans_xxx and ipv6_ifconfig_xxx} /etc/network.subr --- network.subr.base_0317 2009-03-17 17:00:01.000000000 -0400 +++ network.subr 2009-03-17 17:10:15.000000000 -0400 @@ -690,6 +690,34 @@ return 0 } +# getconf_ifnames +# Return the value of all of the interfaces names referenced in rc.conf +# This is used to attempt to dynamically load kernel modules that +# are not already loaded, but could also be useful elsewhere +# +# wlans_IF, ifconfig_IF, ipv6_ifconfig_IF are currently used +getconf_ifnames() +{ + local val + matching_vars=`set | grep -e "ifconfig_" -e "^wlans_" | tr "\n" " " | tr -d "'=."` + debug "Here is a list of all of the matching variables: $matching_vars" + for i in ${matching_vars}; do + val="" + val="`expr "${i}" : 'ifconfig_\([a-zA-Z]*[0-9]*\).*'`" + if [ -z "$val" ]; then + val="`expr "${i}" : 'wlans_\([a-zA-Z]*[0-9]*\).*'`" + fi + if [ val != "0" -a -n "$val" ]; then + interfaces="${interfaces} $val" + fi + done + + debug "Here are the rc.conf potential interfaces: $interfaces" + echo "$interfaces" + exit 0 +} + + # # list_net_interfaces type # List all network interfaces. The type of interface returned @@ -712,6 +740,9 @@ [Aa][Uu][Tt][Oo]) _prefix='' _autolist="`ifconfig -l`" + _manuallist="`getconf_ifnames`" + _autolist="$_autolist$_manuallist" + debug "list of all interfaces: $_autolist" _lo= for _if in ${_autolist} ; do if autoif $_if; then Is this something that people would be interested in having commited? If so, I can clean up a little bit and remove the duplicate interfaces and debugging, and add getconf_ifnames() in more places. Both patches are against current from today (031709). --Thanks! -_Dave Horn
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?25ff90d60903171427y4032d11es516d7b757fc3b8e0>