netfilter notifiers. (hooks inside code called by hooks *g*) The idea is to have a generic framework where kernel modules can register all the events they can possibly generate, and all users can register their event handlers for those events. Requirements: - efficient - more than one event handler per event - easy to use #define NF_NOTIFIER_MAXPROV 4 #define NF_NOTIFIER_MAXEVT 8 struct nf_notifier_event { struct list_head list; }; struct list_head nf_notifiers[NF_NOTIFIER_MAX_PROV][NF_NOTIFIER_MAX_EVT]; /* register a callback function with one of the events */ int nf_notifier_register(unsigned int prov_id, unsigned int evt_id, struct nf_notifier_event *evt) { if (prov_id > NF_NOTIFIER_MAXPROV || evt_id > NF_NOTIFIER_MAXEVT) return -1; /* grab write lock */ list_add(&nf_notifiers[prov_id][evt_id].list, &evt->list); /* unlock */ return 0; } int nf_notifier_unregister(struct nf_notifier_event *evt) { if (prov_id > NF_NOTIFIER_MAXPROV || evt_id > NF_NOTIFIER_MAXEVT) return -1; /* grab write lock */ list_del(&evt->list); /* unlock */ } int nf_notifier_call_slow(unsigned int prov_id, unsigned int evt_id, int (*callback)(void *)) { struct list_head *elem, *i; struct ip_notifier_event *evt; /* don't check prov_id and evt_id ranges unless for debugging */ /* grab read lock */ elem = &nf_notifiers[prov_id][evt_id]; for (i = elem; i != elem; i = i->next) { evt = (struct nf_hook_ } } void __init nf_notifier_init(void) { int i, h; for (i = 0; i < NPROTO; i++) { for (h = 0; h < NF_NOTIFIER_MAX_PROVIDERS; h++) INIT_LIST_HEAD(&nf_notifiers[i][h]); } }