I like the simplified part.
Do I miss something, or is there really no locking for the reader side
of the list? That looks dangerous. Of course a global lock for readers
would be likely a scaling disaster. You could use RCU.
Or if you assume rules are changed only very infrequently it might
be more cache friendly to compile all the rules into a linear buffer
and then just replace the whole buffer atomically with a RCU
grace period on cahnges.
It doesn't look like it would scale to larger numbers of rules though.
Is that intended? Would caching of decisions fit into the design?
Also in general code style would need some improvements;
e.g. no externs in .c; no ../.. include hacks etc.
You also seem weak on the Documentation front.
Other than that it looks reasonably clean (haven't read all of it)
-Andi
-