2010-12-14 44 views
0

J'essaye d'envoyer une liste/tableau de struct à l'espace noyau de l'espace utilisateur. Similaire à Link Comme recommandé là, je pense à utiliser des prises pour lesquelles j'ai trouvé link. Le message est défini bonjour dans cette ligneSockets Netlink

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

J'ai essayé

NLMSG_DATA(nlh) = my_list 

Cela m'a donné l'erreur: lvalue nécessaire comme opérande gauche d'affectation.

Comment puis-je modifier cela pour envoyer un tableau/une liste en utilisant netlinks? Si ça ne peut pas être envoyé de cette façon, comment pourrais-je le faire facilement?

Mise à jour

Ma structure

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

Je dois allouer un tableau/liste de ceux-ci dans la mémoire du noyau pour que d'autres appels système peuvent accéder à cette liste.

+0

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

Répondre

0

NLMSG_DATA() évalue à un pointeur valeur, de sorte que vous devez utiliser une fonction de copie comme memcpy(NLMSG_DATA(nlh), my_list, sizeof my_list).

Les détails exacts dépendront de votre structure de données. Vraisemblablement, vous voudrez envoyer le nombre d'entrées de la liste, puis chaque entrée séparément.

+0

Donc, je compile la liste et j'envoie la valeur du pointeur au noyau. En faisant cela, je ne peux pas accéder à la liste dans l'espace du noyau juste par my_userspace_list-> next? – Alkesh

+0

@Alkesh: Non. Tous les accès à la mémoire utilisateur dans l'espace noyau utilisent 'copy_from_user' ou similaire, et chacun doit être vérifié pour la sécurité. Ne forcez pas le noyau à suivre une liste chaînée dans la mémoire utilisateur. – ephemient

+0

@Alkesh: Non, les pointeurs d'espace utilisateur ne doivent pas être directement déréférencés à partir de l'espace noyau. La méthode correcte consiste à utiliser 'copy_from_user()' et les fonctions associées - mais il est probable que votre liste soit sérialisée dans un tableau pour le transport entre l'espace utilisateur et l'espace noyau. – caf

0

Vous ne pouvez pas envoyer de structures basées sur des pointeurs à l'aide de sockets Netlink. Voir le packet structure de netlink: toutes les données doivent être dans un seul bloc.

+0

Eh bien, s'il voulait les valeurs du pointeur, ce serait suffisant ;-) – user502515