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のいずれかの関数が呼ばれ
てパケットが処理される。