У меня есть одноадресная связь на основе 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 () - это дорогостоящая операция, я должен иметь возможность отправлять тот же буфер памяти в пространство пользователя, не создавая его копии.
Любая помощь должна быть оценена по поводу того, что мне здесь не хватает.