J'ai plusieurs modules de noyau qui doivent interagir avec l'espace utilisateur. Par conséquent, chaque module a une socket Netlink.Puis-je avoir plus de 32 sockets netlink dans l'espace noyau?
Mon problème est que ces douilles interfèrent les unes avec les autres. En effet, ils s'inscrivent tous à la même famille d'adresses Netlink (car il n'y en a pas beaucoup pour commencer - les max is 32 et more than half are already reserved) et aussi parce qu'ils se lient tous au même pid (le noyau pid - zéro).
Je souhaite qu'il y avait plus de place pour les familles d'adresses. Ou, mieux encore, je voudrais pouvoir lier mes orbites à d'autres pids. Comment se fait-il que Netlink soit le canal utilisateur-noyau préféré si seulement 32 sockets peuvent être ouvertes en même temps?
L'adresse netlink (port) est constitué d'un nombre entier de 32 bits. Le port 0 (zéro) est réservé au noyau et fait référence au socket côté noyau de chaque famille de protocoles netlink. Les autres numéros de port font généralement référence à des sockets appartenant à l'espace utilisateur, bien que cela ne soit pas appliqué.
Cette dernière affirmation semble être un mensonge en ce moment. Le noyau utilise un constant as pid et ne pas exporter des fonctions plus versatiles:
if (netlink_insert(sk, 0))
goto out_sock_release;
Je suppose que je peux recompiler le noyau et augmenter la limite de famille d'adresses. Mais ce sont des modules noyau; Je ne devrais pas avoir à faire ça.
Ai-je raté quelque chose?
Selon les sources du noyau, toutes les sockets Netlink côté noyau sont stockées dans le seul tableau pré-alloué ('nl_table') et indexées par numéro de protocole. Donc, vous ne pouvez pas avoir plus de 32 sockets netlink (taille de tableau). Mais rien ne vous empêche d'utiliser un socket unique et de lui envoyer des messages en fonction d'un champ prédéfini dans ces messages. De cette façon, vous aurez plusieurs prises "virtuelles". – Tsyvarev
@Tsyvarev en d'autres termes ... Je devrais coder un nouveau module spécial qui créerait une socket ... et ensuite multiplexer les messages de cette socket à travers les autres modules. Tu as raison; C'est une façon de le résoudre, même si c'est beaucoup plus difficile que cela devrait probablement l'être. Peut-être que cela finira par être la réponse acceptée, bien que je préfère attendre pour voir plus d'opinions pendant un moment. –