Ça a vraiment besoin d’être aussi profond ? Un LD_PRELOAD ne suffirait pas à faire ce que tu veux ?
Encore une fois (t’inquiète t’es loin d’être le seul) ça aide beaucoup de dire ce qu’on veut réellement faire, et non pas comment on croit qu’on veut le faire.
En fait pour tout vous dire, je cherche à transformer cet appel TCP en appel SCTP, je cherche à rendre le support SCTP transparent pour l’utilisateur et les applications.
Mon but final est donc de convertir les massages TCP venant des applications en messages SCTP sur le réseau et inversement sur le retour.
J’aimerais commencer par une simple association voir juste un log des messages TCP.
implémentation kernel : compliquée à développer, peu portable, mais s’applique à tous les programmes sans distinction
implémentation dans une bibliothèque LD_PRELOAD : simple à développer, plus portable, mais ne s’applique que si l’utilisateur le demande explicitement
Si tu veux mon avis, commence déjà par faire fonctionner ça en LD_PRELOAD, t’auras déjà bien assez de boulot. De toutes façons la majorité du code que tu vas écrire sera réutilisable donc si tu veux passer plus tard à une implémentation kernel (pour rendre l’ensemble transparent pour l’utilisateur) t’auras pas grand chose à changer, et en attendant tu pourras bosser dessus sans mettre en danger la stabilité de ta machine de test (puisque seuls les programmes démarrés explicitement avec cette option en bénéficieront) ni avoir à recompiler le kernel, ce qui est un gain de temps non négligeable.
Je ne connais pas shim (c’est pas le nom d’une chanteuse ?), mais je vois plusieurs méthodes pour arriver à tes fins :
[ul]
[li]avec LDPRELOAD ça te permet d’intercepter les appels à une bibliothèque (ou a un appel système) tu peut faire ce que tu veux avec[/li]
[li]avec un proxy, tu créer un deamon qui accepte les connexions TCP et qui crée des connexions SCTP[/li][/ul]
Oui j’ai déjà étudié la solution du proxy, je suis pas contre un tuto/code dailleur mais en fait c’est plus la solution « shim » qu’il faut que je commence a développer. J’ai une semaine
Je vais me pencher sur cette solution, LDPRELOAD alors, je vous tiens au jus. Je suis pas contre un petit boost non plus vu le temps de dev. que j’ai. Je ne suis pas doué en programmation
Edit :
On m’a dis de regarder dans la libc6 car la création et l’usage de socket sont dans la section 2 du man, donc des appels noyaux.
J’ai récupérer les sources (apt-get source libc6) et il me faut trouver comment la libc6 encapsule ces appels pour les modifiers. Juste ?
Pour la partie kernel je ne pourrai pas t’aider, mais je suis étonné que le LD_PRELOAD ne convienne pas. Un outil comme tsocks fait grosso modo ce que tu veux faire :
intercepter les connexions réseau en provenance d’une application
utiliser une autre méthode de transport (en l’occurrence un proxy SOCKS) de manière transparente pour l’appli
Seul bémol, tsocks n’intercepte que les appels à connect() car c’est tout ce qui est nécessaire pour passer par un proxy SOCKS, mais le principe pour les autres appels reste le même.
Vu que c’est open source tu peux peut-être t’en inspirer ?