My attempt at compiling a kernel module failed. Missing a header file pulled from include/net/netfilter/br_netfilter.h
. Its just not there. I do not see how it possibly could.
What I expected to see:
filename: /var/.../module/minrep.ko
license: GPL
name: minrep
What I did see:
CC [M] /var/lib/dkms/minrep/0.1/build/minrep.o
In file included from /var/lib/dkms/minrep/0.1/build/minrep.c:2:
./include/net/netfilter/br_netfilter.h:7:10: fatal error: ../../../net/bridge/br_private.h: No such file or directory
modinfo: ERROR: Module /var/lib/dkms/minrep/0.1/5.19.0-41-generic/x86_64/module/minrep.ko not found.
Reproduction for Linux 5.19 @ amd64 using Ubuntu 22.04.2
sudo apt install "linux-headers-$(uname -r)" dkms
sudo mkdir /usr/src/minrep-0.1
sudo tee /usr/src/minrep-0.1/dkms.conf <<'EOF'
PACKAGE_NAME=minrep
PACKAGE_VERSION=0.1
DEST_MODULE_LOCATION=/updates/dkms/
BUILT_MODULE_NAME=minrep
AUTOINSTALL=no
REMAKE_INITRD=no
EOF
sudo tee /usr/src/minrep-0.1/minrep.c <<'EOF'
#include <net/ipv6.h>
#include <net/netfilter/br_netfilter.h>
struct sk_buff skb;
static int __init minrep_init(void)
{
printk(KERN_NOTICE "Conditional nf_bridge_info %d\n",
nf_bridge_alloc(&skb) ? "on": "off" );
return 0;
}
module_init(minrep_init);
MODULE_LICENSE("GPL");
EOF
echo "obj-m += minrep.o" | sudo tee /usr/src/minrep-0.1/Makefile
sudo dkms build -m minrep -v 0.1 -k "$(uname -r)" --verbose
cat /var/lib/dkms/minrep/0.1/build/make.log
modinfo "/var/lib/dkms/minrep/0.1/$(uname -r)/x86_64/module/minrep.ko"
Must be a more general misunderstanding, this is not just a peculiarity of the one header I happened to try first:
grep -R '#include "\.\.' "/usr/src/linux-headers-$(uname -r)/" | wc -l
15
How are such kernel headers meant to be used in separately built modules? Surely not by collecting per-kernel-version copies of all referenced definitions?