If the kernel had a standard ABI, an out-of-tree kernel module would be the way. As it is, DKMS is a pain and so in-tree modules are the easiest where license allows it.