NetBSD-current netisrの実装
ip_flowに関しての調査の続き。
netisrの初期化は、softint_init()の中の以下の部分で行われる:
#define DONETISR(n, f) \ softint_netisrs[(n)] = softint_establish(SOFTINT_NET|SOFTINT_MPSAFE,\ (void (*)(void *))(f), NULL) #include <net/netisr_dispatch.h>
かなり変則的な書き方だが、これも歴史的事情?
net/netisr_dispatch.hの中は、
#if NARP > 0 DONETISR(NETISR_ARP,arpintr); #endif
のような書き方になっている。
要するに、プロトコル毎にsoftint_establish()をしている。
ether_input()から呼ばれたschednetisr()は、以下のように単なる
softint_schedule()を呼ぶラッパーになっている:
void schednetisr(int isr) { softint_schedule(softint_netisrs[isr]); }
schednetisr()が呼ばれた後、次のタイムスライスで
arpintr/ipintr/ip6intr/atintr/clnlintr/natmintrのいずれかの関数が呼ばれ
てパケットが処理される。