Date: Sat, 10 Jun 2006 17:36:31 -0700 (PDT) From: "Shaun Colley" <shaun@rsc.cx> To: freebsd-net@freebsd.org Subject: Unexpected behavior after altering inetsw[] switch table Message-ID: <52706.81.107.58.115.1149986191.squirrel@webmail.rsc.cx>
next in thread | raw e-mail | index | archive | help
------=_20060610173631_26678 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Hi list. My system is: --- FreeBSD 6.0-RELEASE FreeBSD 6.0-RELEASE #0: Thu Nov 3 09:36:13 UTC 2005 root@x64.samsco.home:/usr/obj/usr/src/sys/GENERIC i386 --- I'm writing a kernel module whose job is to modify the inetsw[] switch table for the IPPROTO_TCP protocol. The pr_output hook for TCP needs to be changed, such that my own custom tcp_output function will be called when transmitting TCP packets. The reason for doing this is so that I can do some modification on TCP packets before they are transmitted, but the semantics of this are not important. The part of the module of interest is: --- switch (what) { case MOD_LOAD: /* kldload */ uprintf("Skeleton KLD loaded.\n"); old_handler = inetsw[ip_protox[IPPROTO_TCP]].pr_output; inetsw[ip_protox[IPPROTO_TCP]].pr_output = (pr_output_t *)my_tcp_output; break; case MOD_UNLOAD: uprintf("Skeleton KLD unloaded.\n"); inetsw[ip_protox[IPPROTO_TCP]].pr_output = old_handler; break; default: err = EINVAL; break; } --- my_tcp_output is a hacked version of tcp_output. When the module is built and loaded, the modification to the switch table seems to have no effect whatsoever. That is, my custom routine does not seem to be called when outputting TCP packets. This can be demonstrated fully by changing the modification line to: inetsw[ip_protox[IPPROTO_TCP]].pr_output = (pr_output_t *)0x0; - no kernel panic occurs in this case. This ultimately leads me to believe that the hook is not being called, even though it should be (I am attempting to send TCP packets, so my function should be getting called). This is very odd, because when I instead modify the pr_input hook, my custom function *does* get called (i.e. when incoming packets are passed up). For example, by inserting the line 'inetsw[ip_protox[IPPROTO_TCP]].pr_input = (pr_input_t *)my_input_handler;', and then receiving TCP packets from below, my_input_handler *is* entered, whereas if the corresponding TCP pr_output hook is modified, that function does not get called (the regular tcp_output() function seems to get used as normal). I've attached a testcase module which demonstrates the behavior. If the hook replacement works correctly, you'll have a TCP output hook which essentially does nothing (i.e. doesn't pass packet down to next layer), hence your TCP stack shouldn't work properly (so to speak). However, that doesn't happen (at least on my system), as I've said. A makefile is also attached. Note, I'm not saying this is a bug. I'm just wondering what is going wrong. My information (i.e. the way I'm trying to do this) may be out of date, for example. I'm wondering if someone can cast some light on what the problem might be. Also attached is a kernel module that alters the pr_input hook of TCP to a dummy function, similarly to the pr_input one. Loading this one will leave you with a dummy input function, rendering your TCP stack not able to process packets until you unload the module. Note that unloading both of the modules will leave you good to go again. cheers, Shaun ------=_20060610173631_26678 Content-Type: application/octet-stream; name="Makefile.1" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Makefile.1" U1JDUz1wcl9vdXRwdXQuYwpLTU9EPXByX291dHB1dAoKLmluY2x1ZGUgPGJzZC5rbW9kLm1rPgo= ------=_20060610173631_26678 Content-Type: application/octet-stream; name="Makefile.2" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Makefile.2" U1JDUz1wcl9pbnB1dC5jCktNT0Q9cHJfaW5wdXQKCi5pbmNsdWRlIDxic2Qua21vZC5taz4K ------=_20060610173631_26678 Content-Type: application/octet-stream; name="pr_input.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pr_input.c" I2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL21vZHVsZS5oPgojaW5jbHVkZSA8 c3lzL3N5c3RtLmg+ICAvKiB1cHJpbnRmICovIAojaW5jbHVkZSA8c3lzL2Vycm5vLmg+CiNpbmNs dWRlIDxzeXMvcGFyYW0uaD4gIC8qIGRlZmluZXMgdXNlZCBpbiBrZXJuZWwuaCAqLwojaW5jbHVk ZSA8c3lzL2tlcm5lbC5oPiAvKiB0eXBlcyB1c2VkIGluIG1vZHVsZSBpbml0aWFsaXphdGlvbiAq LwojaW5jbHVkZSA8c3lzL3Byb3Rvc3cuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1 ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDxzeXMva2VybmVsLmg+CiNpbmNsdWRlIDxzeXMvc3lz bG9nLmg+CiNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CiNpbmNsdWRlIDxzeXMvZG9tYWluLmg+CiNp bmNsdWRlIDxzeXMvbG9jay5oPgojaW5jbHVkZSA8c3lzL21hYy5oPgojaW5jbHVkZSA8c3lzL21i dWYuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXR2YXIuaD4KI2luY2x1ZGUgPHN5cy9tdXRleC5oPgoK I2luY2x1ZGUgPG5ldC9wZmlsLmg+CiNpbmNsdWRlIDxuZXQvaWYuaD4KI2luY2x1ZGUgPG5ldC9p Zl90eXBlcy5oPgojaW5jbHVkZSA8bmV0L2lmX3Zhci5oPgojaW5jbHVkZSA8bmV0L2lmX2RsLmg+ CiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KI2luY2x1ZGUgPG5ldGluZXQvdGNwX2ZzbS5oPgojaW5j bHVkZSA8bmV0aW5ldC90Y3Bfc2VxLmg+CiNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgojaW5jbHVk ZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgojaW5jbHVkZSA8 bmV0aW5ldC9pbl92YXIuaD4KI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KI2luY2x1ZGUgPG5ldGlu ZXQvdGNwX3RpbWVyLmg+CiNpbmNsdWRlIDxuZXRpbmV0L3RjcF92YXIuaD4KLy8jaW5jbHVkZSA8 bmV0aW5ldC90Y3BpcC5oPgojaW5jbHVkZSA8bmV0aXBzZWMvaXBzZWMuaD4KI2luY2x1ZGUgPG5l dGluZXQvaW5fcGNiLmg+Ci8vI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNpbmNsdWRlIDxu ZXRpbmV0L2lwX2ljbXAuaD4KI2luY2x1ZGUgPG1hY2hpbmUvaW5fY2tzdW0uaD4KCmV4dGVybiAg c3RydWN0IHByb3Rvc3cgaW5ldHN3W107CmV4dGVybiB1X2NoYXIgaXBfcHJvdG94W107CnZvaWQg Km9sZF9oYW5kbGVyOwppbnQgbW9vKHN0cnVjdCB0Y3BjYiAqdHApOwovKiAKICogTG9hZCBoYW5k bGVyIHRoYXQgZGVhbHMgd2l0aCB0aGUgbG9hZGluZyBhbmQgdW5sb2FkaW5nIG9mIGEgS0xELgog Ki8KaW50IG1vbyhzdHJ1Y3QgdGNwY2IgKnRwKSB7CnJldHVybiAwOwp9CgpzdGF0aWMgaW50CnNr ZWxfbG9hZGVyKHN0cnVjdCBtb2R1bGUgKm0sIGludCB3aGF0LCB2b2lkICphcmcpCnsKICBpbnQg ZXJyID0gMDsKICAKICBzd2l0Y2ggKHdoYXQpIHsKICBjYXNlIE1PRF9MT0FEOiAgICAgICAgICAg ICAgICAvKiBrbGRsb2FkICovCiAgICB1cHJpbnRmKCJTa2VsZXRvbiBLTEQgbG9hZGVkLlxuIik7 CiAgICBvbGRfaGFuZGxlciA9IGluZXRzd1tpcF9wcm90b3hbSVBQUk9UT19UQ1BdXS5wcl9pbnB1 dDsKICAgIGluZXRzd1tpcF9wcm90b3hbSVBQUk9UT19UQ1BdXS5wcl9pbnB1dCA9IChwcl9pbnB1 dF90ICopbW9vOwogICAgYnJlYWs7CiAgY2FzZSBNT0RfVU5MT0FEOgogICAgdXByaW50ZigiU2tl bGV0b24gS0xEIHVubG9hZGVkLlxuIik7CiAgICBpbmV0c3dbaXBfcHJvdG94W0lQUFJPVE9fVENQ XV0ucHJfaW5wdXQgPSBvbGRfaGFuZGxlcjsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICBlcnIg PSBFSU5WQUw7CiAgICBicmVhazsKICB9CiAgcmV0dXJuKGVycik7Cn0KCi8qIERlY2xhcmUgdGhp cyBtb2R1bGUgdG8gdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbCAqLwoKCnN0YXRpYyBtb2R1bGVkYXRh X3Qgc2tlbF9tb2QgPSB7CiAgInNrZWwiLAogIHNrZWxfbG9hZGVyLAogIE5VTEwKfTsgIAoKREVD TEFSRV9NT0RVTEUoc2tlbGV0b24sIHNrZWxfbW9kLCBTSV9TVUJfS0xELCBTSV9PUkRFUl9BTlkp Owo= ------=_20060610173631_26678 Content-Type: application/octet-stream; name="pr_output.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pr_output.c" I2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL21vZHVsZS5oPgojaW5jbHVkZSA8 c3lzL3N5c3RtLmg+ICAvKiB1cHJpbnRmICovIAojaW5jbHVkZSA8c3lzL2Vycm5vLmg+CiNpbmNs dWRlIDxzeXMvcGFyYW0uaD4gIC8qIGRlZmluZXMgdXNlZCBpbiBrZXJuZWwuaCAqLwojaW5jbHVk ZSA8c3lzL2tlcm5lbC5oPiAvKiB0eXBlcyB1c2VkIGluIG1vZHVsZSBpbml0aWFsaXphdGlvbiAq LwojaW5jbHVkZSA8c3lzL3Byb3Rvc3cuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1 ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDxzeXMva2VybmVsLmg+CiNpbmNsdWRlIDxzeXMvc3lz bG9nLmg+CiNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CiNpbmNsdWRlIDxzeXMvZG9tYWluLmg+CiNp bmNsdWRlIDxzeXMvbG9jay5oPgojaW5jbHVkZSA8c3lzL21hYy5oPgojaW5jbHVkZSA8c3lzL21i dWYuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXR2YXIuaD4KI2luY2x1ZGUgPHN5cy9tdXRleC5oPgoK I2luY2x1ZGUgPG5ldC9wZmlsLmg+CiNpbmNsdWRlIDxuZXQvaWYuaD4KI2luY2x1ZGUgPG5ldC9p Zl90eXBlcy5oPgojaW5jbHVkZSA8bmV0L2lmX3Zhci5oPgojaW5jbHVkZSA8bmV0L2lmX2RsLmg+ CiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KI2luY2x1ZGUgPG5ldGluZXQvdGNwX2ZzbS5oPgojaW5j bHVkZSA8bmV0aW5ldC90Y3Bfc2VxLmg+CiNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgojaW5jbHVk ZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgojaW5jbHVkZSA8 bmV0aW5ldC9pbl92YXIuaD4KI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KI2luY2x1ZGUgPG5ldGlu ZXQvdGNwX3RpbWVyLmg+CiNpbmNsdWRlIDxuZXRpbmV0L3RjcF92YXIuaD4KLy8jaW5jbHVkZSA8 bmV0aW5ldC90Y3BpcC5oPgojaW5jbHVkZSA8bmV0aXBzZWMvaXBzZWMuaD4KI2luY2x1ZGUgPG5l dGluZXQvaW5fcGNiLmg+Ci8vI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNpbmNsdWRlIDxu ZXRpbmV0L2lwX2ljbXAuaD4KI2luY2x1ZGUgPG1hY2hpbmUvaW5fY2tzdW0uaD4KCmV4dGVybiAg c3RydWN0IHByb3Rvc3cgaW5ldHN3W107CmV4dGVybiB1X2NoYXIgaXBfcHJvdG94W107CnZvaWQg Km9sZF9oYW5kbGVyOwppbnQgbW9vKHN0cnVjdCB0Y3BjYiAqdHApOwovKiAKICogTG9hZCBoYW5k bGVyIHRoYXQgZGVhbHMgd2l0aCB0aGUgbG9hZGluZyBhbmQgdW5sb2FkaW5nIG9mIGEgS0xELgog Ki8KaW50IG1vbyhzdHJ1Y3QgdGNwY2IgKnRwKSB7CnJldHVybiAwOwp9CgpzdGF0aWMgaW50CnNr ZWxfbG9hZGVyKHN0cnVjdCBtb2R1bGUgKm0sIGludCB3aGF0LCB2b2lkICphcmcpCnsKICBpbnQg ZXJyID0gMDsKICAKICBzd2l0Y2ggKHdoYXQpIHsKICBjYXNlIE1PRF9MT0FEOiAgICAgICAgICAg ICAgICAvKiBrbGRsb2FkICovCiAgICB1cHJpbnRmKCJTa2VsZXRvbiBLTEQgbG9hZGVkLlxuIik7 CiAgICBvbGRfaGFuZGxlciA9IGluZXRzd1tpcF9wcm90b3hbSVBQUk9UT19UQ1BdXS5wcl9vdXRw dXQ7CiAgICBpbmV0c3dbaXBfcHJvdG94W0lQUFJPVE9fVENQXV0ucHJfb3V0cHV0ID0gKHByX291 dHB1dF90ICopbW9vOwogICAgYnJlYWs7CiAgY2FzZSBNT0RfVU5MT0FEOgogICAgdXByaW50Zigi U2tlbGV0b24gS0xEIHVubG9hZGVkLlxuIik7CiAgICBpbmV0c3dbaXBfcHJvdG94W0lQUFJPVE9f VENQXV0ucHJfb3V0cHV0ID0gb2xkX2hhbmRsZXI7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAg ZXJyID0gRUlOVkFMOwogICAgYnJlYWs7CiAgfQogIHJldHVybihlcnIpOwp9CgovKiBEZWNsYXJl IHRoaXMgbW9kdWxlIHRvIHRoZSByZXN0IG9mIHRoZSBrZXJuZWwgKi8KCgpzdGF0aWMgbW9kdWxl ZGF0YV90IHNrZWxfbW9kID0gewogICJza2VsIiwKICBza2VsX2xvYWRlciwKICBOVUxMCn07ICAK CkRFQ0xBUkVfTU9EVUxFKHNrZWxldG9uLCBza2VsX21vZCwgU0lfU1VCX0tMRCwgU0lfT1JERVJf QU5ZKTsK ------=_20060610173631_26678--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?52706.81.107.58.115.1149986191.squirrel>