LINUX.ORG.RU

Отправляемые данные в сеть

 ,


0

1

В ядре с помощью netfilter в точке NF_IP_POST_ROUTING получаю доступ к исходящим пакетам.
В ф-ции обработчике есть доступ к заполненным заголовкам ip и tcp и к буферу сокета skb
skb->data указывает на начало ip
Далее, если вывести данные которые находятся по skb->data, то можно увидеть, что за tcp заголовком нет данных
(Т.е. в буфер сокета, на данном этапе данные ещё не записаны)
А в skb->data_len указано количество отправляемых данных (не ноль)
Вопрос: Где находится указатель на данные, которые будут переданы в сеть? (Записаны в буфер сокета) (Мне нужно прочесть отправляемые данные. Как это сделать?)


Далее, если вывести данные которые находятся по skb->data, то можно увидеть, что за tcp заголовком нет данных

А как эти данные выводятся? Если чем-то вроде printk, то без явной передачи длины печать закончится на любом нулевом байте.

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от annulen

Вывожу по одному байту (через цикл) с помощью
unsigned char *data_ptr;
printk(«%x », *data_ptr);
Получается очень не удобно, но видно какие байты записаны.

malord
() автор топика

Добро пожаловать в мир нелинейных skb.

skb_copy - это просто, но может быть очень дорого (skb на 60кБ из 16 фрагментов).

Посмотри код ip_set_string_main.c начиная с 462 строки

    if(!skb_is_nonlinear(skb)) {
    ...
    } else {
там есть код для доступа ко всем фрагментам данных.

vel ★★★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария