2012-04-27 3 views
2

Я создал модуль, в котором я получаю все входящие пакеты сетевым фильтром. Я хочу напечатать данные (без заголовков) в/var/log/messages. Я пробовал следующую строку printk, но не печатал подходящее сообщение.печать пользовательских данных в сетевом пакете

struct sk_buff *sock_buff; 
printk(KERN_INFO"user data :: %x",(sock_buff->data+sizeof(*sock_buff->network_header)+sizeof(*sock_buff->mac_header)) //though i want in character but i cant understand whats it printing not matching the hex of my data 
    printk(KERN_INFO"user data :: %s",(sock_buff->data+sizeof(*sock_buff->network_header)+sizeof(*sock_buff->mac_header)) 

Я даже использовал tail - sizeof (my_data); то также я не получаю желаемого o/p.

+0

Для этого используйте [print_hex_dump_bytes] (http://lxr.linux.no/linux+v3.3.3/lib/hexdump.c#L242). –

ответ

2

Может быть, ваши забыл принять значение по указателю (*), попробуйте этот

printk(KERN_INFO"user data :: %x",*(sock_buff->data+sizeof(*sock_buff->network_header) +sizeof(*sock_buff->mac_header)); 

Как я понимаю, в вашем поле данных структуры имеет тип указателя.

typedef struct{ 
    ... 
    unsigned char* data; 
    ... 
} sk_buff; 

Также% х спецификаторы (число в шестнадцатеричном) requers числовой agrument, а не указатель, поэтому вы не должны забыли поставить один маленькие (*)

-1

Я не хакер ядра, но глядя на skbuff.h заголовок файла мне кажется, что один из sock_buff->data или sock_buff->tail указывает на данные после заголовков. В этом случае printk(KERN_INFO"user data :: %s",sock_buff->data); может сделать трюк.

Смежные вопросы