Я много читал о том, как отправлять сообщения из ядра в пространство пользователя, в том числе эту статью по lwn , документацию по инфракрасному порту и множество вопросов, связанных с этим тема здесь, в StackOverflow, но я все еще не понимаю, как это сделать должным образом. Что я делаю сейчас:
Протокол пользовательского пространства
- Allo c сокет с
nl_socket_alloc()
- Подключите мой сокет к generi c netlink, используя
genl_connect()
- Разрешите семейство с помощью
genl_ctrl_resolve()
- Настройте обратный вызов сокета по умолчанию с помощью
nl_socket_modify_cb()
- Allo c сообщение для отправки к ядру
- Наконец, отправьте это сообщение ядру (эта часть работает отлично)
- Затем ожидает ответа от ядра с
nl_recvmsgs_default()
Протокол ядра
- Как только мое сообщение получено ядром, оно запускает функцию обратного вызова с параметрами
struct sk_buff *buff
и struct genl_info *info
(назовем его cb
) cb
затем выполняет следующие действия: - Allo c новый буфер сокета с
genlmsg_new()
- Заполняет этот буфер необходимой информацией, используя
genlmsg_put_reply()
- Завершите сообщение, набрав
genlmsg_end()
- И передайте сообщение, набрав
genlmsg_reply()
Примечание * 105 6 * Я проверил все ошибки и знаю, что мое сообщение отправлено успешно, но я не получаю эти сообщения на стороне пользовательского пространства, я предполагаю, что ошибка связана с настройкой функции обратного вызова на со стороны пользователя, потому что, когда я отключаю функцию auto_ack
в libnl, я получаю все сообщения от ядра. Я хотел бы знать, правильный ли мой протокол для получения сообщений, и если это так, почему не работает с включенным auto_ack
?