If a module cannot process the message types, the message types must be passed to the next module.
The module that acts on an M_IOCTL message should send an M_IOCACK or M_IOCNAK message in response to the ioctl(2). If the module cannot process the ioctl(2), it should pass the M_IOCTL message to the next module.
Modules should not pertain to any particular driver but should be compatible with all drivers.
In general, modules should not require the data in an M_DATA message to follow a particular format, such as a specific alignment. This means modules can be arbitrarily pushed on top of each other in a sensible fashion. Not following this rule can limit module usability.
Filter modules pushed between a service user and a service provider should not alter the contents of the M_PROTO or M_PCPROTO block in messages. The contents of the data blocks can be changed, but the message boundaries must be preserved.
htonl(3N) and ntohl(3N)
The htonl(3N) and ntohl(3N) conversion routines follow the XNS5 publications. The functions continue to convert 32-bit quantities between network byte order and host byte order.