Почему в файле netfilter.h отсутствуют определения типов nf_hookfn, nf_hook_ops и т. Д.? - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь написать модуль сетевого фильтра. Моя первая попытка.

Мой 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.

1 Ответ

1 голос
/ 05 октября 2019

Если ваш модуль ядра включает в себя заголовок из /usr/include/linux, там действительно что-то идет не так: файлы в /usr/include/linux предназначены для использования пользовательскими приложениями (см. В чем разница между / usr / include / linuxи папка include в источнике ядра linux? ), а не модули ядра.

Вместо этого ваш модуль должен включать заголовочный файл в исходный код ядра.

Для чего бы это ни стоило, это похоже на настройку по умолчанию в моей системе. Если я скомпилирую этот модуль, не являющийся ядром:

#include <linux/netfilter.h>

void my_fn(void) {
    struct nf_hook_ops ops;
}

с Makefile, идентичным вашему фрагменту, он преуспеет, и когда я запускаю make V=1, создайте отчеты, что он вызывает gcc сфлаги, чтобы пропустить стандартные каталоги включений, и добавить каталог include в правильном месте:

gcc ... -nostdinc ... -I./include ...

Если у вас этого нет, то что-то идет не так, но трудно сказать, что, не глядя накод.

...