2016-12-21 1 views
0

J'expérimente des pilotes réseau dans une machine virtuelle qemu exécutant Ubuntu 16.04.1. uname -r donne 4.4.0-31-generic comme version du noyau.Erreur "Lecture seule" lors de l'affectation de la fonction du pilote au pointeur de fonction netdev_ops

En linux/netdevice.h for that kernel version, je trouve le commentaire

"@netdev_ops: Comprend plusieurs pointeurs vers callbacks, si l'on veut passer outre les fonctions ndo _ *()"

Cependant, dans mon code, une mission tels que dev->netdev_ops->ndo_open = netmod_open (où netmod_open est la méthode ouverte dans mon propre pilote) donne l'erreur du compilateur:

assignment of member 'ndo_open' in read-only object

de plus, netdev_ops est déclarée comme const dans la source:

const struct net_device_ops *netdev_ops; 

Comment puis-je "passer outre les fonctions ndo _ *()" si le struct contenant leurs pointeurs est const?

+0

Il semble que je doive créer ma propre structure 'struct net_device_ops', puis assigner' dev-> netdev_ops' l'adresse de cette 'struct'. Donc, en général, j'ai besoin d'en savoir plus sur la façon dont les structures de données sont transmises dans le noyau. Tous les liens vers de telles informations seraient appréciés. Il semble que la plupart des tutoriels que je trouve ont des API noyau obsolètes. – Vale132

Répondre

1

How can I "override the ndo_*() functions"

définir votre propre variable de type struct net_device_ops, la configuration de ses champs (crochets en fait) que vous souhaitez remplacer, et attribuer à cette variable dev->netdev_ops.

Notez que selon description pour struct net_device_ops, le seul champ .ndo_start_xmit doit être défini, les autres champs que vous pouvez laisser non initialisés (c'est-à-dire NULL).