Как правильно отправлять и получать сообщения из ядра в пользовательское пространство с помощью generi c netlink и libnl? - PullRequest
0 голосов
/ 12 июля 2020

Я много читал о том, как отправлять сообщения из ядра в пространство пользователя, в том числе эту статью по lwn , документацию по инфракрасному порту и множество вопросов, связанных с этим тема здесь, в StackOverflow, но я все еще не понимаю, как это сделать должным образом. Что я делаю сейчас:

Протокол пользовательского пространства

  1. Allo c сокет с nl_socket_alloc()
  2. Подключите мой сокет к generi c netlink, используя genl_connect()
  3. Разрешите семейство с помощью genl_ctrl_resolve()
  4. Настройте обратный вызов сокета по умолчанию с помощью nl_socket_modify_cb()
  5. Allo c сообщение для отправки к ядру
  6. Наконец, отправьте это сообщение ядру (эта часть работает отлично)
  7. Затем ожидает ответа от ядра с nl_recvmsgs_default()

Протокол ядра

  1. Как только мое сообщение получено ядром, оно запускает функцию обратного вызова с параметрами struct sk_buff *buff и struct genl_info *info (назовем его cb)
  2. cb затем выполняет следующие действия:
    • Allo c новый буфер сокета с genlmsg_new()
    • Заполняет этот буфер необходимой информацией, используя genlmsg_put_reply()
    • Завершите сообщение, набрав genlmsg_end()
    • И передайте сообщение, набрав genlmsg_reply()

Примечание * 105 6 * Я проверил все ошибки и знаю, что мое сообщение отправлено успешно, но я не получаю эти сообщения на стороне пользовательского пространства, я предполагаю, что ошибка связана с настройкой функции обратного вызова на со стороны пользователя, потому что, когда я отключаю функцию auto_ack в libnl, я получаю все сообщения от ядра. Я хотел бы знать, правильный ли мой протокол для получения сообщений, и если это так, почему не работает с включенным auto_ack?

...