Проблема с отправкой sk_buff->data в netlink пользователю
Модератор: Olej
-
- Интересующийся
- Сообщения: 7
- Зарегистрирован: 05 дек 2014, 13:49
- Контактная информация:
Проблема с отправкой sk_buff->data в netlink пользователю
Возникла проблема. Пытаюсь написать модуль ядра, который отлавливал бы нужные сетевые пакеты (посредством netfilter) и передавал их содержимое в пользовательское приложение. Организовал передачу через netlink.
Проблема в том, что после прихода данных в user space, никак не удается их правильно распаковать. Не накладывается структура tcphdr, а если наложить sockaddr_in то данные получаются кривые (что в принципе логично). Если же отправляю просто любой текст («Hello World») вместо sk_buff->data все доходит успешно. Код приложил ниже в сообщении, надеюсь на помощь. Спасибо.
Проблема в том, что после прихода данных в 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 пользователю
Там столько накручено в вашем коде, что ни один нормальный человек в нём (в чужом) разбираться не станет.aleksey.melikov писал(а):Возникла проблема. Пытаюсь написать модуль ядра, который отлавливал бы нужные сетевые пакеты (посредством netfilter) и передавал их содержимое в пользовательское приложение. Организовал передачу через netlink.
Проблема в том, что после прихода данных в user space, никак не удается их правильно распаковать. Не накладывается структура tcphdr, а если наложить sockaddr_in то данные получаются кривые (что в принципе логично). Если же отправляю просто любой текст («Hello World») вместо sk_buff->data все доходит успешно. Код приложил,
Если "надеетесь на помощь" - то нужно делать маленькие демонстрационные коды, выкраивая в них только самое существо вопроса.
Я не смотрел внимательно ваш код ... но мне как показалось (?) ваше пользовательское приложение что-то пытается отправить по netlink сокету? Никогда такого не видел...
А если по приёму...
Никакая структура tcphdr не "наложится", хотя бы потому, что netlink - это широковещательные UDP датаграммы.
А вот формат сообщений netlink, как мне помнится, зависит от подсистемы, которой они направляются ... т.е. формат может сильно отличаться, в том числе, быть и просто символьной строкой.
Об этом (с ссылками и примером кода) уже было в форуме: асинхронные уведомления и udev, мне нет времени сейчас вспоминать и разбираться - почитайте там.
-
- Интересующийся
- Сообщения: 7
- Зарегистрирован: 05 дек 2014, 13:49
- Контактная информация:
Re: Проблема с отправкой sk_buff->data в netlink пользователю
Выражусь поконкретнее. Пытаюсь передать структуру sk_buff в разделе данных в netlink сообщении. Записываю так (в модуле ядра)Olej писал(а): Там столько накручено в вашем коде, что ни один нормальный человек в нём (в чужом) разбираться не станет.
Если "надеетесь на помощь" - то нужно делать маленькие демонстрационные коды, выкраивая в них только самое существо вопроса.
Я не смотрел внимательно ваш код ... но мне как показалось (?) ваше пользовательское приложение что-то пытается отправить по netlink сокету? Никогда такого не видел...
А если по приёму...
Никакая структура tcphdr не "наложится", хотя бы потому, что netlink - это широковещательные UDP датаграммы.
А вот формат сообщений netlink, как мне помнится, зависит от подсистемы, которой они направляются ... т.е. формат может сильно отличаться, в том числе, быть и просто символьной строкой.
Об этом (с ссылками и примером кода) уже было в форуме: асинхронные уведомления и udev, мне нет времени сейчас вспоминать и разбираться - почитайте там.
Код: Выделить всё
memcpy (nlmsg_data(nlh), skb->data, 256);
Код: Выделить всё
size_s = nlmsg_unicast(netlink_sock, skb_nl, cl_mass);
Так
Код: Выделить всё
ip_hdr = (struct iphdr *)NLMSG_DATA(nlhdr_send);
Код: Выделить всё
sockaddr_pck = (struct sockaddr_in *)NLMSG_DATA(nlhdr_send);
Код: Выделить всё
printf ("\nReceive: (saddr) %d [%d byte]\n\n", ip_hdr->saddr ,size_r);
-
- Интересующийся
- Сообщения: 7
- Зарегистрирован: 05 дек 2014, 13:49
- Контактная информация:
Re: Проблема с отправкой sk_buff->data в netlink пользователю
Facepalm!
Проблема решена. Спасибо.
Код: Выделить всё
#include <linux/ip.h>
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Проблема с отправкой sk_buff->data в netlink пользователю
Если решена, вы бы написали в 2 слова в чём проблема и как решена - завтра это ещё кому-то понадобится.aleksey.melikov писал(а):Проблема решена.
-
- Интересующийся
- Сообщения: 7
- Зарегистрирован: 05 дек 2014, 13:49
- Контактная информация:
Re: Проблема с отправкой sk_buff->data в netlink пользователю
Не было инклуда
Поэтому и ошибки сыпались.
В остальном данные нормально пересылаются между модулем и клиентской программой.
Код: Выделить всё
#include <linux/ip.h>
В остальном данные нормально пересылаются между модулем и клиентской программой.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Проблема с отправкой sk_buff->data в netlink пользователю
А если не было необходимого инклуда, то как оно вообще компилировалось?aleksey.melikov писал(а):Не было инклудаПоэтому и ошибки сыпались.Код: Выделить всё
#include <linux/ip.h>
В остальном данные нормально пересылаются между модулем и клиентской программой.
Вы же описывали непонятные ошибки runtime...
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей