linux netfilter предава съдържанието на пакета към приложението за сокет на потребителското пространство

Искам да напиша Linux 2.6 netfilter module, който може да проверява информацията за входящия IP пакет, като dest-ip, source-ip. След това предайте тази информация на user space приложение, което (т.е. Socket приложение) ще обработва тази информация веднага щом пакетът достигне HOOKs.

Искам да опитам два начина:

1 . Вътре в модула netfilter направете структурен ред fifo, всеки път, когато пакетът достигне hook, поставете информацията за пакета във fifo. и с помощта на /proc/example файлова система. всеки път, когато приложението за потребителско пространство прочете файла /proc/example, ще получи информация за пакет от главата на fifo.

Аз съм начинаещ в програмата kernel, тази програма срива ядрото ми няколко пъти. -_-! Чудя се възможно ли е този начин?

2 . Вътре в модула netfilter направете char устройство, приложението за потребителско пространство да прочете пакетна информация от това char устройство. Но все още не знам как да се уверя, че ще получа пакета възможно най-скоро, има ли начин, когато пакетът достигне куката на netfilter, ядрото да изпрати някакъв сигнал до информационното приложение за потребителско пространство, след което приложението за потребителско пространство да дойде изберете информацията за пакета?

Благодаря ти много.


person Community    schedule 17.08.2009    source източник
comment
Изглежда, че просто копирате NFQUEUE+libnetfilter_queue инфраструктура.   -  person jørgensen    schedule 18.01.2012


Отговори (4)


Какво имаш предвид под възможно най-скоро? Имате ли действителни изисквания за твърдо/меко реално време?

Ако изберете опция 2, би трябвало да можете да получите нови данни доста бързо, като отворите неблокиращото устройство със знаци и изберете()на fd за четене. Правил съм нещо подобно със сокет на ниво ядро, където данните за сокета бяха представени на процес на потребителско ниво чрез символен драйвер. Видях много малко забавяне, стига да обслужвам гнездото навреме. Драйверът беше използван в среда, която имаше някои меки изисквания в реално време и ние нямахме никакъв проблем да изпълним тези изисквания с обичайните съоръжения на ядрото.

Разгледайте Linux драйвери на устройства, 3-то издание.

person Rob Jones    schedule 17.08.2009

Моят начин да направя това: Създайте модул на ядрото, за да се свържете с вашата мрежова активност. След това използвайте Netlink, който може да общува с потребителското пространство от ядрото, за да предаде данните IPC.

person Wei    schedule 06.10.2011

Вариант 1 е възможен и работещ какъв е проблема? Но обикновено използвам за комуникация между user-space и kernel space с помощта на netlink

netlink_kernel_create

netlink_kernel_release

nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);

netlink_kernel_release(nl_sk);

netlink_unicast
person Ibrar Ahmed    schedule 28.02.2013

Не съм сигурен за първия метод, но използвайки втория, вашето приложение за потребителско пространство може да използва извикване select() с устройството char като единствена цел - веднага щом select() се върне, ще имате данни за четене . Просто се уверете, че сте го прочели целия, а не просто предполагайте, че данните са на стойност един пакет.

person Harper Shelby    schedule 17.08.2009