Проблема с отправкой sk_buff->data в netlink пользователю

Вопросы программного кода и архитектуры Linux

Модератор: Olej

AlekseyMelikov
Интересующийся
Сообщения: 7
Зарегистрирован: 05 дек 2014, 13:49
Контактная информация:

Проблема с отправкой sk_buff->data в netlink пользователю

Непрочитанное сообщение AlekseyMelikov » 05 дек 2014, 14:16

Возникла проблема. Пытаюсь написать модуль ядра, который отлавливал бы нужные сетевые пакеты (посредством netfilter) и передавал их содержимое в пользовательское приложение. Организовал передачу через netlink.

Проблема в том, что после прихода данных в user space, никак не удается их правильно распаковать. Не накладывается структура tcphdr, а если наложить sockaddr_in то данные получаются кривые (что в принципе логично). Если же отправляю просто любой текст («Hello World») вместо sk_buff->data все доходит успешно. Код приложил ниже в сообщении, надеюсь на помощь. Спасибо.
Последний раз редактировалось AlekseyMelikov 05 дек 2014, 19:11, всего редактировалось 1 раз.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Проблема с отправкой sk_buff->data в netlink пользователю

Непрочитанное сообщение Olej » 05 дек 2014, 17:38

aleksey.melikov писал(а):Возникла проблема. Пытаюсь написать модуль ядра, который отлавливал бы нужные сетевые пакеты (посредством netfilter) и передавал их содержимое в пользовательское приложение. Организовал передачу через netlink.

Проблема в том, что после прихода данных в user space, никак не удается их правильно распаковать. Не накладывается структура tcphdr, а если наложить sockaddr_in то данные получаются кривые (что в принципе логично). Если же отправляю просто любой текст («Hello World») вместо sk_buff->data все доходит успешно. Код приложил,
Там столько накручено в вашем коде, что ни один нормальный человек в нём (в чужом) разбираться не станет.
Если "надеетесь на помощь" - то нужно делать маленькие демонстрационные коды, выкраивая в них только самое существо вопроса.

Я не смотрел внимательно ваш код ... но мне как показалось (?) ваше пользовательское приложение что-то пытается отправить по netlink сокету? Никогда такого не видел...

А если по приёму...
Никакая структура tcphdr не "наложится", хотя бы потому, что netlink - это широковещательные UDP датаграммы.
А вот формат сообщений netlink, как мне помнится, зависит от подсистемы, которой они направляются ... т.е. формат может сильно отличаться, в том числе, быть и просто символьной строкой.
Об этом (с ссылками и примером кода) уже было в форуме: асинхронные уведомления и udev, мне нет времени сейчас вспоминать и разбираться - почитайте там.

AlekseyMelikov
Интересующийся
Сообщения: 7
Зарегистрирован: 05 дек 2014, 13:49
Контактная информация:

Re: Проблема с отправкой sk_buff->data в netlink пользователю

Непрочитанное сообщение AlekseyMelikov » 05 дек 2014, 18:52

Olej писал(а): Там столько накручено в вашем коде, что ни один нормальный человек в нём (в чужом) разбираться не станет.
Если "надеетесь на помощь" - то нужно делать маленькие демонстрационные коды, выкраивая в них только самое существо вопроса.

Я не смотрел внимательно ваш код ... но мне как показалось (?) ваше пользовательское приложение что-то пытается отправить по netlink сокету? Никогда такого не видел...

А если по приёму...
Никакая структура tcphdr не "наложится", хотя бы потому, что netlink - это широковещательные UDP датаграммы.
А вот формат сообщений netlink, как мне помнится, зависит от подсистемы, которой они направляются ... т.е. формат может сильно отличаться, в том числе, быть и просто символьной строкой.
Об этом (с ссылками и примером кода) уже было в форуме: асинхронные уведомления и udev, мне нет времени сейчас вспоминать и разбираться - почитайте там.
Выражусь поконкретнее. Пытаюсь передать структуру sk_buff в разделе данных в netlink сообщении. Записываю так (в модуле ядра)

Код: Выделить всё

memcpy (nlmsg_data(nlh), skb->data, 256);
Само netlink сообщение отправляю так

Код: Выделить всё

size_s = nlmsg_unicast(netlink_sock, skb_nl, cl_mass);
И соответственно накладываю структуру iphdr в пользовательском приложении на NLMSG_DATA(от netlink сообщения).
Так

Код: Выделить всё

ip_hdr =  (struct iphdr *)NLMSG_DATA(nlhdr_send);
Или так

Код: Выделить всё

sockaddr_pck = (struct sockaddr_in *)NLMSG_DATA(nlhdr_send);
Проблема в том, что я видимо что то не до понимаю, т.к. при компиляции пользовательского приложения выскакивает ошибка " dereferencing pointer to incomplete type" на ip_hdr->saddr в строчке

Код: Выделить всё

printf ("\nReceive: (saddr) %d [%d byte]\n\n", ip_hdr->saddr ,size_r);
Если отправлять из модуля не skb->data, а какой-либо простой текст, все читается (у клиента) отлично. Поэтому видимо проблема именно в том как правильно наложить структуру iphdr на NLMSG_DATA(от netlink сообщения) в клиентском приложении.


Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Проблема с отправкой sk_buff->data в netlink пользователю

Непрочитанное сообщение Olej » 07 дек 2014, 15:21

aleksey.melikov писал(а):Проблема решена.
Если решена, вы бы написали в 2 слова в чём проблема и как решена - завтра это ещё кому-то понадобится.

AlekseyMelikov
Интересующийся
Сообщения: 7
Зарегистрирован: 05 дек 2014, 13:49
Контактная информация:

Re: Проблема с отправкой sk_buff->data в netlink пользователю

Непрочитанное сообщение AlekseyMelikov » 11 дек 2014, 20:01

Не было инклуда

Код: Выделить всё

#include <linux/ip.h>
Поэтому и ошибки сыпались.

В остальном данные нормально пересылаются между модулем и клиентской программой.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Проблема с отправкой sk_buff->data в netlink пользователю

Непрочитанное сообщение Olej » 11 дек 2014, 20:51

aleksey.melikov писал(а):Не было инклуда

Код: Выделить всё

#include <linux/ip.h>
Поэтому и ошибки сыпались.

В остальном данные нормально пересылаются между модулем и клиентской программой.
А если не было необходимого инклуда, то как оно вообще компилировалось?
Вы же описывали непонятные ошибки runtime...

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей