Ошибка компиляции при создании модуля ядра Netfilter - PullRequest
0 голосов
/ 11 марта 2019

Я использую мини-брандмауэр.

Я реализовал функцию фильтра, и это сигнатура;

unsigned int minifw_inbound_filter(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in,
                                const struct net_device *out, int (*okfn)(struct sk_buff *));

Когда я добавил модуль ядра netfilter:

static struct           nf_hook_ops nfho_in;

nt init_rule_match_module(void) {
nfho_in.hook        = minifw_inbound_filter;        // filter for inbound packets
nfho_in.hooknum     = NF_INET_LOCAL_IN;             // netfilter hook for local machine bounded ipv4 packets
nfho_in.pf          = PF_INET;
nfho_in.priority    = NF_IP_PRI_FIRST;              // we set its priority higher than other hooks
nf_register_hook(&nfho_in);

Я попытался скомпилировать свой модуль и получил ошибку компиляции:

ошибка: присвоение из несовместимого типа указателя [-Werror = incompatible-pointer-types] nfho_in.hook = minifw_inbound_filter; // фильтр для входящих пакетов

Что я делаю не так?

Заранее спасибо!

1 Ответ

2 голосов
/ 11 марта 2019

Объявление типа функции хука изменяется в зависимости от того, с каким ядром вы компилируете.Этот шаблон выглядит как ядро ​​ 2.6 .

Текущая сигнатура функции выглядит следующим образом:

unsigned int nf_hookfn(void *priv, struct sk_buff *skb, const struct nf_hook_state *state); 

Вероятно, вы ссылаетесь на старый пример кода для этого -вы должны попытаться найти более новый пример, более согласованный с ядром, с которым вы компилируете.

Однако, как упоминает Пол Р. в комментариях к вопросу, если вы хотите укрепить код, чтобы он мог компилироваться противВ нескольких выпусках ядра Linux вы можете использовать решение , предложенное в этом ответе , которое оборачивает его на основе среды ядра / RHEL, против которой вы строите.

Проблема в том, чтоПодпись функции ловушки netfilter изменялась как минимум три раза, начиная с версии 2.6 - во временном интервале ядра 3.13, во временном интервале ядра 4.1 и снова во временном интервале ядра 4.4, все изменяя сигнатуру.

...