Я пытаюсь обнаружить исходящие пакеты в моем модуле ядра (Netfilter). Для этого я использую функцию strcmp. Ядро всегда вылетает после загрузки моего модуля ядра с помощью функции strcmp. Я попытался удалить функцию strcmp - загрузилась без проблем. Надеюсь, проблема связана со всеми строковыми функциями, я также пробовал strstr () - моя система разбилась
Логика, лежащая в основе этого: входящий пакет будет иметь eth [0-9] +, назначенный «in-> name», и «out-> name» будет и наоборот для исходящего пакета.
Есть какие-нибудь сведения об обнаружении исходящего пакета? Я знал, что другой вариант - использовать output_hook вместо prerouting и postrouting hook. Но здесь я хочу по-разному искажать как входящий, так и исходящий пакет. Используемая мной версия ядра не поддерживает строковые функции внутри модулей?
$ uname -a
Linux vmdsk01 2.6.32-21-generic #32-Ubuntu SMP Fri Apr 16 08:09:38 UTC 2010 x86_64 GNU/Linux
Включить часть
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/skbuff.h>
#include <linux/inet.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <net/ip.h>
#include <linux/string.h>
Главный крюк
31 unsigned int main_hook(unsigned int hooknum,
32 struct sk_buff *skb,
33 const struct net_device *in,
34 const struct net_device *out,
35 int (*okfn)(struct sk_buff*))
36 {
37 if( strcmp(out->name, "<NULL>") == NULL ) // Outgoing packet must not have <NULL>
38 {
39 printk( KERN_INFO "OUTGOING PACKET");
40 }
41 ....
Я также попытался заменить строку 37 следующей, моя система зависает
37 if( strstr(out->name, "eth") != NULL ) // Outgoing packet must have eth[0-9]+