2017-10-10 4 views
0

Je suis novice au noyau Linux. J'écris le module noyau, ce module gère plusieurs flux vocaux UDP. Pour ce module, je souhaite enregistrer plusieurs ports UDP de différents flux vocaux dans le noyau, afin que les autres trafics UDP ne puissent pas utiliser ces ports UDP. Selon moi, créer une socket et une liaison est un moyen.Comment enregistrer les ports UDP dans le noyau Linux et créer un hook pour cette plage de ports

Je veux également créer une fonction de hook pour ces ports vocaux UDP, de sorte que chaque fois que les paquets de voix reçus il appelleront ma fonction de crochet.

J'ai quelques questions:

  • Y at-il une meilleure façon d'enregistrer plusieurs ports UDP dans le noyau Linux, autres que la création de socket et le liant?
  • Comment créer une fonction de connexion et l'appeler pour ces ports vocaux UDP multiples enregistrés?
+2

Je dois demander - pourquoi faites-vous cela dans le noyau? –

+1

@ShacharShemesh: Si vous n'aviez pas demandé, je l'aurais fait. On dirait un problème XY pour moi. – Olaf

+0

Vous devriez poser une question spécifique pour un problème particulier. Puisque Stack Overflow cache la raison Close de votre part: * "Veuillez éditer la question pour la limiter à un problème spécifique avec suffisamment de détails pour identifier une réponse adéquate Évitez de poser plusieurs questions distinctes à la fois Voir la page Comment demander pour clarifier question. "* – jww

Répondre

1

La réponse courte est la suivante: Si vous devez demander, alors vous ne devriez pas le faire.

est ici la version plus longue:

programmation TCP/IP est l'un de ces domaines où l'API est orienté vers l'espace utilisateur de l'utiliser. Le résultat est qu'il n'y a pas de moyen facile de créer des sockets TCP/IP (qui inclut UDP) à partir du noyau.

Même si vous l'avez géré, les API que vous avez ne sont pas adaptées. Le code va essayer de manipuler la mémoire de l'espace utilisateur, la notification de l'espace utilisateur, etc. lorsque vous l'utilisez.

Un développeur de noyau assez expérimenté peut, probablement, le retirer. Quelqu'un qui doit aller à Stack Overflow pour commencer, cependant, n'est probablement pas assez expérimenté. Ce qui nous ramène à la question initiale: pourquoi voulez-vous écrire un tel code dans le noyau de toute façon? La voix sur IP est un protocole compliqué. Le débogage du code dans le noyau est considérablement plus difficile que le débogage du code de l'espace utilisateur, sans parler de la récupération des erreurs lorsque les choses tournent mal. Si vous écrivez un code qui doit absolument avoir de hautes performances et une faible latence, je vous suggère de regarder votre solution sur un espace utilisateur pur (c'est-à-dire sans noyau). Cette solution est . Il vous permet de recevoir les paquets réseau directement dans les tampons de l'espace utilisateur. Malheureusement, ce n'est pas non plus une solution conçue pour les débutants. Comme il n'y a pas de noyau impliqué, l'interface doit être exclusivement utilisée pour DPDK. Cela signifie également que vous devez écrire votre propre pile UDP pour le supporter. DPDK n'est pas un outil simple à utiliser, mais si vous devez avoir la plus haute bande passante absolue avec la plus faible latence absolue, c'est la meilleure solution. Probablement mieux que d'écrire toute la pile VoIP dans le noyau. Si ce n'est pas ce dont vous avez besoin, utilisez simplement des outils de programmation normaux.