LINUX.ORG.RU

[KERNEL] фильтрация пакетов в 64-х разрядной системе.

 


0

2

Добрый день!
В своём модуле добавляю фильтр пакетов в список PTYPE_ALL . Как и как он выглядит, совершенно не важно.. он 100% работает на 32-х разрядной системе!
Однако при запуске точно такого-же кода на 64-х разрядной системе, всё виснет.

struct iphdr *ip;  // указатель на заголовок ip пакета
ip_ptr = (struct iphdr *)skb->network_header;  // получаем указатель на заголовок сетевого уровня, через skb (полученный с помощью установленного перехватчика в списке PTYPE_ALL )

/* Система виснет при попытке любого вывода информации из ip_ptr !!!! */
printk("Ща повиснет система!!!   %i \n ", ip->saddr);
.
Ещё раз повторюсь! код на 32-х разрядной системе! работает великолепно!!! а вот на 64-х разрядной..вот такая вот фигня!
И ошибка действительно проявляется только при попытке доступа по указателю ip !!!
В чём может быть косяк????

Deleted

Ответ на: комментарий от Deleted

Сейчас задам глупый вопрос.(для сокращение времени необходимого для решения проблемы)
Как узнать это ip6 или 4 ... вроде должны получить указатель на заголовок ip4 и проверить version ..так?
Если так, то пытаюсь вывести через printk version и комп виснет.

Deleted
()
Ответ на: комментарий от Deleted

А вот это уже странное поведение. Поле version идет самым первым как в iphdr, так и в ipv6dhr и имеет одинаковую длину. Да и в любом случае, не должен компьютер зависать от простого printk. Уж как я изголялся над своей системой, когда экспериментировал с netfilter, но максимум, что получал это kernel_panic. Он у вас совсем намертво виснет или что-нибудь успевает написать?

delete83 ★★
()
Ответ на: комментарий от delete83

Да, система просто виснет. Никаких упсов и тд, не вылетает. Просто намертво зависает. В лог ничего не пишется.
Проверка на iphdr->version == 4 тоже ничего не даёт, виснет система как до этой проверки доходит)
Чтож мне делать???

Deleted
()
Ответ на: комментарий от Deleted

В общем) посмотрел я куда этот skb->network_header указывает..оказалось что х . знает куда.
Буду через skb->data получать указатель на ip ...
Позволю себе заметить, что в 32-х разрядной системе, skb->network_header всегда указывал на заголовок принятого пакета.

Deleted
()
Ответ на: комментарий от Deleted

Да, всё точно. Проблема была именно в skb->network_header
Когда получаю указатель на ip через skb->data то все данные читаются, и ничего не виснет.
delete83 Спасибо, что потратил на меня время, отвечая на вопросы.

Deleted
()
Ответ на: комментарий от Deleted

Блин, точно! Как-то забыл совсем про эту функцию. Она «выпрямляет» структуру skb в памяти компьютера. Изначально, когда пакет приходит, он записывается в skb, но никто не гарантирует, что паять при этом будет выделена последовательно. skb_linearize перевыделяет память под skb. Вероятно именно с этим связаны ваши проблемы. А почему это проявилось только на x64 хрен знает.

delete83 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.