Closed HDwayne closed 7 months ago
libbpf propose la fonction bpf_map__lookupelem ( avec 2 "" entre map et lookup, pas 1) qui marche avec tous les types de maps . pour accéder à la map faut accéder à l'attribut "maps" du squelette puis à la map via son nom ( skel->maps.nom_de_la_map ). Doc trouvable ici : https://libbpf.readthedocs.io/en/latest/api.html . Je ferais un truc demain pour test .
Bon grosso modo, de ce que j'ai pu voir, la structure bpf_program_data rend impossible l'accès aux maps en utilisant le squelette (le programme ne connaît pas les champs de la structure en raison du type void *). De même pour les noms des maps (ces derniers ne sont pas renseignés dans la structure). Va falloir changer la structure et le prog en général pour que ça fonctionne. De plus, si un programme contient plusieurs maps, il faudra sélectionner celle que l'on veut (on ne veut pas forcément tout écrire dans les logs ). Enfin, pour récupérer les valeurs contenues dans les maps, il est nécessaire de connaître le type des indices et des valeurs, lesquels ne sont pas forcément les mêmes pour toutes les maps. Donc, c'est globalement assez difficile ce que tu essayes de faire mdr . Si c'était pour un seul programme ça marcherait bien, mais là on parle d'un nombre inconnu de programme qui seront chargés dans le kernel par le même prog user space.
j'ai pas beaucoup de solutions à te proposer sur ce coup là. J'ai une idée de comment faire pour que chaque squelette soit correctement typé et de comment obtenir le nom des maps. Mais pour les types, ça me parait chaud.
Je pense qu'il n'est pas nécessaire de réaliser la boucle permettant d'afficher les valeurs des maps. Trouver une solution générique et exhaustive, permettant de gérer l'ensemble des types de map ainsi que des types de clé valeurs semble compliqué et consommateur de temps dans le projet.
Je propose l'alternative suivante : https://github.com/ebpfdev/explorer. C'est un outil sous licence MIT permettant d'accéder aux maps et programmes à partir d'une interface web. Cet outil tourne sur docker. Sachant l'existence de celui-ci, je me demande s'il est vraiment nécessaire de développer une boucle générique pour accéder aux informations des maps. Notons que eBPF quick est une petite solution ayant pour vocation de réaliser des tests sur les fonctionnalités et le comportement d'eBPF.
J'attends vos avis sur le sujet 🐝
La boucle terminant sous un signal fonctionne. Cependant, je rencontre des difficultés pour récupérer les maps afin d'afficher les valeurs. Pourrais-tu y jeter un coup d'œil ?
NOTE : L'objectif final est de ne sera pas d'afficher les résultats sur la sortie standard mais plutôt de générer un fichier de logs pour chaque programme exécuté.