Hardening consulting

Un aperçu du compositeur FreeRds

J'ai posté récemment une première version d'un backend FreeRds pour weston, le compositeur de référence de wayland.

Dans cette article, je vais détailler un peu le fonctionnement de ce nouveau compositeur. Ceux qui ont déjà lu mon article sur le compositeur FreeRdp ne seront pas perdu.

FreeRds et weston

FreeRds est un projet en cours, son but est de fournir un serveur RDP en se servant de la librairie FreeRdp. Xrdp était basé sur le code de rdesktop, on peut voir FreeRds est son successeur mais basé sur FreeRdp.

Voilà un schéma simplifié d'architecture de couplage FreeRds / weston, avec weston qui crée le contenu à afficher:

FreeRDS compositor

FreeRds et son out-service communiquent en utilisant deux canaux: une socket unix qui sert de canal de commandes, et une mémoire partagée pour le shared framebuffer. FreeRds va s'occuper de tout ce qui concerne la gestion du RDP, le "seul" travail de weston sera de gérer le contenu à afficher.

À l'initialisation, FreeRds va se connecter sur la socket unix créée par weston. Il s'en suit une négociation:

  • FreeRds envoie un paquet d'information avec notamment la taille du desktop du client RDP, le type et la disposition du clavier ;
  • weston créé une seat avec le fichier xkb correspondant à la disposition clavier Rdp ;
  • weston créé un segment de mémoire partagée et renvoie l'id à FreeRds par le biais d'un paquet SharedFramebuffer ;
  • FreeRds répond avec un paquet vblank qui indique que le framebuffer est prêt pour utilisation.

Quand on a de l'activité des clients weston:

  • les clients wayland mettent à jour le contenu de leurs surfaces ;
  • weston construit l'image globale du bureau en composant les différentes surfaces ;
  • weston met à jour la région modifiée dans la mémoire partagée, et envoie un paquet refreshRect. Tant que FreeRds n'a pas répondu avec un paquet vblank, les changements seront accumulés coté weston sans être envoyés à FreeRds ;
  • FreeRds reçoit le paquet refreshRect, il encode la région à rafraîchir en utilisant le codec approprié (données brut, compressées ou non, remoteFx ou Ns codec). Un paquet VBlank est envoyé à Weston.

Futur

C'est un premier jet, même si le résultat est complètement fonctionnel. Quelques amélioration possibles:

  • gérer le paquet SUPPRESS_OUTPUT: le compositeur pourrait se geler pour arrêter d'envoyer des paquets à FreeRds ;
  • gérer les paquets extended keyboard events: ce code n'est pas implémenté ;
  • créer un protocole wayland spécifique qui permettrait aux clients wayland d'interagir avec FreeRds. La partie intéressante est les différents channels RDP: le son, le clipboard, ... Ou bien mon rêve de science-fiction: jouer des vidéos coté client en utilisant le channel TSMF du RDP (décodage et rendu de la vidéo fait coté client). Si quelqu'un est prêt à le financer, je travaille dessus !

Liens

Quelques liens et sources qui ont servi pour cette article: