You can only change M_IOCTL family of message types to other M_IOCTL message types.
M_DATA, M_PROTO, M_PCPROTO are dependent on the modules, drivers and service providers interfaces defined.
A message type should not be changed if the reference count > 1.
The data of a message should not be modified if the reference count > 1.
All other message types are interchangeable as long as sufficient space has been allocated in the data buffer of the message.