Я пытаюсь написать модуль сетевого фильтра. Моя первая попытка.
Мой Makefile:
obj-m += someModule.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Я получаю ошибку времени компиляции, ясно указывающую, что typedefs
из structs nf_hookfn
, nf_hook_ops
и т. Д. Не выбраны илиошибочно выбран.
Я знаю, что список аргументов функции хука изменился в более позднем ядре. В любом случае, я просто не вижу ничего из typedefs
, которое мне нужно в /usr/include/linux/netfilter.h
.
Что я пробовал?
Я пытался обновить заголовки ядра:
sudo apt-get install linux-headers-$(uname -r)
[sudo] password for xxx:
Reading package lists... Done
Building dependency tree
Reading state information... Done
linux-headers-4.15.0-33-generic is already the newest version (4.15.0-33.36).
0 обновлено, 0 вновь установлено, 0 для удаления и 397. Не обновлено.
Я вижу все необходимые определения в
/usr/src/linux-headers-4.15.0-33/include/linux/netfilter.h
Конечно, я могу включить этот файл вместо этого или иметьссылка на него.
Не похоже, что нужно делать. Какой правильный подход?
EDIT: вывод make -V 1:
gcc -Wp,-MD,/home/somedir/.someModule.o.d -nostdinc
-isystem /usr/lib/gcc/x86_64-linux-gnu/7/include
-I./arch/x86/include -I./arch/x86/include/generated
-I./include -I./arch/x86/include/uapi
-I./arch/x86/include/generated/uapi
-I./include/uapi
-I./include/generated/uapi -include ./include/linux/kconfig.h
-Iubuntu/include -D__KERNEL__ -Wall -Wundef
-Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing
-fno-common -fshort-wchar -Werror-implicit-function-declaration
-Wno-format-security -std=gnu89 -fno-PIE -mno-sse -mno-mmx -mno-sse2
-mno-3dnow -mno-avx -m64 -falign-jumps=1 -falign-loops=1 -mno-80387
-mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup
-mtune=generic -mno-red-zone -mcmodel=kernel -funit-at-a-time
-DCONFIG_X86_X32_ABI -DCONFIG_AS_CFI=1
-DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1
-DCONFIG_AS_FXSAVEQ=1 -DCONFIG_AS_SSSE3=1 -DCONFIG_AS_CRC32=1
-DCONFIG_AS_AVX=1 -DCONFIG_AS_AVX2=1 -DCONFIG_AS_AVX512=1
-DCONFIG_AS_SHA1_NI=1 -DCONFIG_AS_SHA256_NI=1 -pipe
-Wno-sign-compare -fno-asynchronous-unwind-tables
-mindirect-branch=thunk-extern -mindirect-branch-register
-DRETPOLINE -fno-delete-null-pointer-checks -Wno-frame-address
-Wno-format-truncation -Wno-format-overflow -Wno-int-in-bool-context -O2
--param=allow-store-data-races=0 -DCC_HAVE_ASM_GOTO -Wframe-larger-than=1024
-fstack-protector-strong -Wno-unused-but-set-variable -Wno-unused-const-variable
-fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-var-tracking-assignments
-pg -mfentry -DCC_USING_FENTRY -Wdeclaration-after-statement -Wno-pointer-sign
-fno-strict-overflow -fno-merge-all-constants -fmerge-constants -fno-stack-check
-fconserve-stack -Werror=implicit-int -Werror=strict-prototypes -Werror=date-time
-Werror=incompatible-pointer-types -Werror=designated-init -DMODULE -DKBUILD_BASENAME='"someModule"'
-DKBUILD_MODNAME='"someModule"' -c -o /home/somedir/someModule.o /home/somedir/someModule.c
EDIT : ошибка в моем коде заключалась в том, что я следовал примеру, с которым столкнулся насеть. Сигнатура функции ловушки и даже несколько имен функций тоже изменились. Если вы сталкиваетесь с примером использования функций netfilter в сети, убедитесь, что вы используете правильную версию API.