Отправка одного и того же сообщения несколько раз из ядра в пространство пользователя через Netlink Socket - PullRequest
0 голосов
/ 10 июля 2019

У меня есть одноадресная связь на основе Nelink между пользовательским пространством и пространством ядра, и она прекрасно работает.

Ниже вызов отправляет сообщение из пространства ядра в пространство пользователя через сокет netlink.

res = nlmsg_unicast(nl_sk, skb_out, user_space_process_port_id);

Теперь я хочу отправить одну и ту же копию данных 3 раза в пространство пользователя из ядра. Итак, я вижу, что когда возвращается nlmsg_unicast, skb_out не существует, возможно, это уже skb_free.

Итак, перед вызовом nlmsg_unicast я подумал об увеличении количества пользователей skb_out на skb_get(skb_out), как показано ниже.

skb_get(skb_out);
skb_get(skb_out);
res = nlmsg_unicast(nl_sk, skb_out, user_space_process_port_id);
res = nlmsg_unicast(nl_sk, skb_out, user_space_process_port_id);
res = nlmsg_unicast(nl_sk, skb_out, user_space_process_port_id);

Мое объяснение состояло в том, что я должен теперь иметь возможность отправлять одно и то же сообщение 3 раза, поскольку skb_free не должен освобождать skb_out. Но ядро ​​зависает.

Когда я повторяю то же самое, используя skb_copy() вместо skb_get(), я могу отправить сообщение несколько раз. Мой вопрос: skb_copy () - это дорогостоящая операция, я должен иметь возможность отправлять тот же буфер памяти в пространство пользователя, не создавая его копии.

Любая помощь должна быть оценена по поводу того, что мне здесь не хватает.

...