I'm developing a kernel module that will be doing inspection and needed access to raw network frames, so I turned to netgraph as the solution.However it seems that netgraph will not permit a module to unload once it's participated in a mkpeer/connect operation. Rebooting to remove a module is
 angrymaking (not like mtx/sleep crashes).

This going into the kernel because my bpf based userland stuff is probably not going to hold up to the packet rate.

Should I file a PR? Or is there magic in the documentation I havn't found?


I've observed the trouble in 7.0 release, and tonight's 7_RELENG, with GENERIC + WITNESS/INVARIANTS

The module code ( cobbled together from netgraph/ng_sample.c / ng_echo.c)
http://pastebin.com/m31b6ece6

The module loads and unloads fine until connected to a netgraph hook:

#make load :ro:~/tmp/ food.ko:3:06:42:20
/sbin/kldload -v /root/tmp/food.ko/food.ko
Loaded /root/tmp/food.ko/food.ko, id=3
#Mar 18 03:06:44 kernel: foodmod loaded :ro:~/tmp/ food.ko:3:06:44:21 #make unload :ro:~/tmp/ food.ko:3:10:16:21
/sbin/kldunload -v food.ko
Unloading food.ko, id=3
#Mar 18 03:10:19 kernel: quiesced :ro:~/tmp/ food.ko:3:10:19:22
Mar 18 03:10:19  kernel: foodmod unloaded


Fine.. so let's connect it:
#make ath :ro:~/tmp/ food.ko:3:10:59:23
kldload ng_ether
ifconfig ath0 ssid ')(allmightytallest'
ifconfig ath0 promisc

#Mar 18 03:11:04 kernel: ath0: permanently promiscuous mode enabledo:3:11:04:24
make connect
#make load :ro:~/tmp/ food.ko:3:11:13:26
/sbin/kldload -v /root/tmp/food.ko/food.ko
Loaded /root/tmp/food.ko/food.ko, id=7
#Mar 18 03:12:05  kernel: foodmod loaded
make connect
ngctl mkpeer ath0: food lower fredhook
ngctl name ath0:lower eater
sleep 1
Mar 18 03:12:15  kernel: ngconstruct
ifconfig ath0 down
ifconfig ath0 up
#Mar 18 03:12:18 kernel: not our messageunrecognized command/ food.ko:3:12:16:28
Mar 18 03:12:18  kernel: ath0: link state changed to UP
# :ro:~/tmp/ food.ko:3:12:18:28
#Mar 18 03:12:21  kernel: ....

Fine; we get packets to the ng_rx_data procedure .. now we pull the plug on the netgraph

#make discon :ro:~/tmp/ food.ko:3:12:35:28
ngctl shutdown eater:
#Mar 18 03:12:37 kernel: discondiconnecting last ng nodengshutdownko:3:12:36:29

#ngctl list :ro:~/tmp/ food.ko:3:12:39:29
There are 3 total nodes:
Name: bge0 Type: ether ID: 00000001 Num hooks: 0 Name: ngctl1058 Type: socket ID: 00000008 Num hooks: 0 Name: ath0 Type: ether ID: 00000002 Num hooks: 0



But the module will never unload: ( but the UNLOAD and QUIESE event handlers are invoked)
#make unload :ro:~/tmp/ food.ko:3:14:28:31
/sbin/kldunload -vf food.ko
Unloading food.ko, id=7
kldunload: can't unload file: Device busy
*** Error code 1

Stop in /root/tmp/food.ko.
Exit 1
#Mar 18 03:14:31 kernel: quiesced :ro:~/tmp/ food.ko:3:14:31:32
Mar 18 03:14:31  kernel: foodmod unloaded


Seems that I can't unload some of the other netgraph types either ( it's not just me):

#kldunload ng_ether :ro:~/tmp/ food.ko:3:24:07:41
kldunload: can't unload file: Device busy
Exit 1


_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to