Как идентифицировать и отправлять сообщения в приложение из ядра? - PullRequest
0 голосов
/ 04 октября 2018

Я пишу модуль ядра, который отправляет и получает интернет-пакеты, и я использую Generic Netlink для связи между ядром и пользовательским пространством.

Когда приложение хочет отправить интернет-сообщение (не имеет значениячто это за протокол), я могу без проблем отправить его в ядро ​​с помощью одной из функций, которые я определил в моем общем семействе сетевых соединений, и модуль отправляет его по проводам.Все в порядке.

Но когда модуль получает пакет, как я могу добраться до соответствующего процесса доставки сообщения?Моя проблема не в том, чтобы определить правильный процесс: это делается с помощью пользовательских протоколов (например, таблиц IP);но это состоит в том, какую информацию я должен хранить, чтобы уведомить правильный процесс?

Пока я держу только portid процесса (потому что он инициирует связь), и я пытался использовать функцию genlmsg_unicast(), но он был изменен в версии ядра 2009 года таким образом, что для него требуется дополнительный параметр (кроме skb *buffer и portid): указатель на struct net.Ни одно из учебных пособий, которые я нашел, не решает эту проблему.

Я пытался использовать &init_net в качестве нового параметра, но компьютер просто зависает, и мне нужно перезапустить его с помощью кнопки питания.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 24 октября 2018

Обнаружено, что вызывало проблему: оказалось, что я освобождаю буфер в конце функции.# facepalm

Я не должен этого делать, потому что буфер ставится в очередь и ждет там, пока он фактически не будет доставлен.Таким образом, вызывающая сторона не отвечает за освобождение буфера, если функция genlmsg_unicast() завершается успешно.

Теперь она работает с &init_net.

...