2016-12-21 1 views
0

Ich experimentiere mit Netzwerktreibern in einer qemu VM mit Ubuntu 16.04.1. uname -r gibt 4.4.0-31-generische als Kernel-Version."Nur lesen" -Fehler beim Zuweisen der Treiberfunktion zu netdev_ops Funktionszeiger

In linux/netdevice.h for that kernel version fand ich den Kommentar

"@netdev_ops: Enthält mehrere Zeiger auf Rückrufe, wenn man will die ndo _ *() Funktionen außer Kraft setzen"

jedoch in meinem Code, einen Auftrag wie dev->netdev_ops->ndo_open = netmod_open (wo netmod_open die offene Methode in meinem eigenen Treiber ist) gibt den Compiler-Fehler:

assignment of member 'ndo_open' in read-only object

Ferner netdev_ops ist als const in der Quelle erklärt:

const struct net_device_ops *netdev_ops; 

Wie kann ich „die ndo außer Kraft setzen _ *() Funktionen“, wenn die Struktur ihre Zeiger enthalten const ist?

+0

Es sieht so aus, als müsste ich meine eigene 'struct net_device_ops' erstellen und dann' dev-> netdev_ops' die Adresse dieser 'struct' zuweisen. Im Allgemeinen muss ich mehr darüber lernen, wie Datenstrukturen im Kernel weitergegeben werden. Irgendwelche Verbindungen zu solchen Informationen würden geschätzt werden. Es scheint, als ob die meisten Tutorials veraltete Kernel-APIs haben. – Vale132

Antwort

1

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

Definieren Sie Ihre eigene Variable vom Typ struct net_device_ops, Setup seine Felder (Haken tatsächlich), die Sie außer Kraft setzen möchten, und ordnen Sie diese Variable auf dev->netdev_ops.

Hinweis, dass nach description für struct net_device_ops, das einzige Feld .ndo_start_xmit erforderlich ist, eingestellt werden, andere Felder können Sie nicht initialisierten verlassen (dh NULL).

Verwandte Themen