2010-12-14 4 views
0

Я пытаюсь отправить список/массив структуры в пространство ядра из пользовательского пространства. Как и в случае с Link Как рекомендовано, я думаю об использовании сокетов, для которых я нашел link. Сообщение устанавливается привет в этой линииСокеты Netlink

strcpy(NLMSG_DATA(nlh), "Hello"); 

Я попытался

NLMSG_DATA(nlh) = my_list 

Это дало мне ошибку: именующее выражение, необходимое в качестве левого операнда назначения.

Как это изменить, чтобы отправить массив/список, используя netlinks? Если он не может быть отправлен таким образом, как еще легко это сделать?

Update

Моя структура

typedef struct { 
int val1; 
int val2; 
} mystruct; 

мне нужно выделить массив/список из них в памяти ядра, так и другие системные вызовы могут получить доступ к этому списку.

+0

http://stackoverflow.com/questions/1698396/linux-kernel-copy-from-user-struct-with-pointers – ephemient

ответ

0

NLMSG_DATA() оценивает значение указателя rvalue, поэтому вам необходимо использовать функцию копирования, такую ​​как memcpy(NLMSG_DATA(nlh), my_list, sizeof my_list).

Точные данные будут зависеть от структуры данных. Предположительно, вы захотите отправить количество записей в списке, затем каждую запись отдельно.

+0

Итак, я создаю список и отправлю значение указателя в ядро. Поступая таким образом, я не могу получить доступ к списку в пространстве ядра только с помощью my_userspace_list-> next? – Alkesh

+0

@Alkesh: Нет. Все обращения к пользовательской памяти в пространстве ядра используют 'copy_from_user' или аналогичные, и каждый должен быть проверен на предмет безопасности. Не заставляйте ядро ​​отслеживать связанный список через пользовательскую память. – ephemient

+0

@Alkesh: Нет, указатели пользовательского пространства не должны быть разыменованы из пространства ядра. Правильный метод - использовать 'copy_from_user()' и связанные с ним функции, но вполне вероятно, что ваш список должен быть сериализован в массив для переноса между пользователем и пространством ядра. – caf

0

Вы не можете отправлять структуры на основе указателей, используя сетевые сокеты. См. packet structure netlink: все данные должны быть в одном блоке.

+0

Ну, если бы он хотел значения указателя, это было бы достаточно ;-) – user502515