Я пишу модуль ядра, который отправляет и получает интернет-пакеты, и я использую Generic Netlink для связи между ядром и пользовательским пространством.
Когда приложение хочет отправить интернет-сообщение (не имеет значениячто это за протокол), я могу без проблем отправить его в ядро с помощью одной из функций, которые я определил в моем общем семействе сетевых соединений, и модуль отправляет его по проводам.Все в порядке.
Но когда модуль получает пакет, как я могу добраться до соответствующего процесса доставки сообщения?Моя проблема не в том, чтобы определить правильный процесс: это делается с помощью пользовательских протоколов (например, таблиц IP);но это состоит в том, какую информацию я должен хранить, чтобы уведомить правильный процесс?
Пока я держу только portid
процесса (потому что он инициирует связь), и я пытался использовать функцию genlmsg_unicast()
, но он был изменен в версии ядра 2009 года таким образом, что для него требуется дополнительный параметр (кроме skb *buffer
и portid
): указатель на struct net.Ни одно из учебных пособий, которые я нашел, не решает эту проблему.
Я пытался использовать &init_net
в качестве нового параметра, но компьютер просто зависает, и мне нужно перезапустить его с помощью кнопки питания.
Любая помощь приветствуется.