DeadMaXfr a écrit 16 commentaires

  • [^] # Re: Plusieurs méthodes

    Posté par  . En réponse au message Patron de conception monteur cohérence des objets montés. Évalué à 1.

    Ou utiliser un mutex.

    Tand que la voiture est en construction, le mutex est vérouillé donc pas de démarrage ...
  • # Le routeur à combien de ports ?

    Posté par  . En réponse au message Problème de plage IP. Évalué à 1.

    De mon coté, je pense à un switch ou a un routeur défaillant.

    Il ne possède que X adresse arp dans sa table et il bug quand tu lui ajoute une de trop ...
  • [^] # Re: driver vers quoi ?

    Posté par  . En réponse au message Victoire !. Évalué à 3.

    Le but du module est d'avoir un block device piloté depuis le userland.

    Grâce à cela, il est possible d'avoir un block device où les données transite via un tunnel SSH, ou SSL. Un peut comme NBD mais sécurisé.

    Ou, si l'envie vous prend (comme moi), d'envoyer les requêtes de lecture/écriture sur plusieurs bécanes, avec répartition de charge, redondance, avec cryptage, contrôle d'accès, ...

    On peut imaginer plein de truc, comme avec FUSE, qui a un wikipediaFS http://wikipediafs.sourceforge.net . Ça semble inutile, mais c'est indispensable ! (^_^)
  • [^] # [ SUJET RESOLU ]

    Posté par  . En réponse au message Aide pour débogger un module. Évalué à 1.

    Et oui, tu avais raison !

    C'est bien un while qui pose problème.

    Merci pour ces judicieux conseilles !
  • [^] # Re: Bon c'est peut etre dans les details....

    Posté par  . En réponse au message Aide pour débogger un module. Évalué à 1.

    J'y ai pensé, mais quand c'est freeze du système, il n'y a plus de sortie à la console.

    Pour les while, c'est juste pour être sûr que j'obtient le lock.

    Je vais améliorer ce point là, même si je sais que c'est pas ça.

    Sinon, j'ai compillé le module avec un noyau 2.6.31, avec les nouvelles API. Je vais voir ce que ça donne ...

    To be continued
  • [^] # Re: netlink

    Posté par  . En réponse au message Communication kernel <=> Userland. Évalué à 1.

    Pour Fuse, il y a un chardev (/dev/fuse) qui ce charge de ça.

    Mon problème et que je ne veut pas faire du mono-thread. Avec un chardev, il suffit qu'une requête bloque pour que tout ce qui utilise le chardev se bloque aussi. (dans le cas d'un timeout)

    Je vais creuser du coté de netlink a moins que quelqu'un a une autre idée ?
  • [^] # Re: par défaut droit d'auteur s'applique

    Posté par  . En réponse au message Projet en cours. Évalué à 1.

    Sinon, je n'ai pas compris :
             - Les données qui y transite sont donc privées et ne sont pas soumit à la licence.
    en quoi la licence du code aurait un impact sur les données qu'il manipule ?


    J'ai précisé ce point car je sait que si gcc était sous GPL, tous les programmes compilés avec celui-ci serait sous GPL.

    Ici, j'ai un système SAN qui manipulera des données qui, comme gcc, ne doivent pas se retrouver sous GPL.

    A moins que je m'égare ...
  • # Résolu

    Posté par  . En réponse au message Undefined symbol. Évalué à 1.

    Je vient de comprendre mon erreur.

    J'ai juste oublié le flag -rdynamic

    Dans on souhaite qu'une librairie utilise le contenu du binaire, il faut ajouter -rdynamic au linker.

    Merci
  • [^] # Re: dlopen

    Posté par  . En réponse au message Undefined symbol. Évalué à 1.

    Bonjour,

    Merci pour ces pistes, mais c'est pas ça.

    J'utilise bien RTLD_GLOBAL mais avec RTLD_LAZY.

    Il n'y a pas de doublon sur ce symbole.

    Personnellement, je penche pour le flag RTLD_LAZY. Il semble que si le programme n'utilise pas la class avant le chargement, alors le chargement de la librairie exploitant cette même class ne fonctionne pas.

    J'essaye de confirmer ça ce matin.
  • [^] # Re: Détails?

    Posté par  . En réponse au message Undefined symbol. Évalué à 2.

    Réponses pour tes questions:

    1) La librairie est de moi, et oui, c'est bien le même symbole.

    2) Oui, j'utilise les libtools avec kdevelop.

    3) Oui, je charge les librairies avec dlopen. Les options que j'utilise sont RTLD_LAZY et RTLD_GLOBAL.

    Pour le code minimal, je n'arrive pas à reproduire le bug avec quelque ligne.
    J'essaye ce matin.
  • # [ RESOLU ]

    Posté par  . En réponse au message Raw socket (BUG). Évalué à 3.

    Merci pour vos réponses. Pour ceux que cela interreserait, je poste la solution au problème.
    
    #include pthread.h
    #include sys/socket.h
    #include netpacket/packet.h
    #include net/ethernet.h
    #include arpa/inet.h
    #include sys/ioctl.h
    #include linux/if.h
    #include string.h
    #include stdio.h
    #include errno.h
    
    int sock;
    struct msghdr packet = {0};
    struct sockaddr_ll addr = {0};
    struct iovec iov = {0};
    struct ifreq ifr = { 0 };
    char *name="lo";
    char buffer[1500] = {0};
    pthread_t tid;
    pthread_mutex_t mutex;
    pthread_cond_t cond;
    int recivelen;
    
    fd_set readset;
    struct timeval tv;
    
    static void *reciver(void *arg)
    {
    	int datapresent;
    
    	//synchronisation
    	pthread_mutex_lock(&mutex);
    	pthread_cond_signal(&cond);
    	pthread_mutex_unlock(&mutex);
    
    	//construction du select
    	tv.tv_sec = 1;
    	tv.tv_usec = 0;
    	FD_ZERO(&readset);
    	FD_SET(sock,&readset);
    
    	// données présentes ?
    	datapresent=select(sock+1, &readset,NULL,NULL,&tv);
    
    	if(datapresent<=0)
    	{
    
    		// non
    		printf("timeout\n");
    		return NULL;
    	}
    
    		//oui
    	recivelen=recvmsg(sock,&packet,MSG_DONTWAIT);
    	printf("recvmsg return : %d\n",recivelen);
    	return NULL;
    }
    
    int main()
    {
    	int errorCondition = 0;
    
    	// overture de la socket
    	sock = socket ( PF_PACKET, SOCK_DGRAM, htons ( ETH_P_ALL ) );
    	if ( !sock )
    		return -1;
    
    	// attachement sur le loopback
    	errorCondition = setsockopt ( sock,SOL_SOCKET,SO_BINDTODEVICE,name,2);
    	if ( errorCondition )
    		return errorCondition;
    
    	// recupère l'index de l'interface. Pas utile ici mais on ne sait jamais
    	strcpy ( ifr.ifr_name, name);
    	errorCondition = ioctl ( sock, SIOCGIFINDEX, &ifr );
    	if ( errorCondition )
    		return errorCondition;
    
    	//construction du packet
    	addr.sll_family = AF_PACKET;
    	addr.sll_ifindex = ifr.ifr_ifindex;
    	addr.sll_halen = ETH_ALEN;
    	addr.sll_protocol = htons ( ETH_P_ALL );
    	packet.msg_name=&addr;
    	packet.msg_namelen = sizeof ( struct sockaddr_ll );
    	packet.msg_iov = &iov;
    	packet.msg_iovlen = 1;
    	iov.iov_base=&buffer;
    	iov.iov_len=1500;
    	packet.msg_control = NULL;
    	packet.msg_controllen = 0;
    	packet.msg_flags = 0;
    
    	// initialisation du mutex pour une sychronisation
    	pthread_mutex_init(&mutex,NULL);
    	pthread_cond_init(&cond,NULL);
    
    	// démarrage du thread d'écoute
    	pthread_mutex_lock(&mutex);
    	pthread_create(&tid,NULL,&reciver,NULL);
    
    	// attente du bon démarrage, sinon ça fausse le test
    	pthread_cond_wait(&cond,&mutex);
    	pthread_mutex_unlock(&mutex);
    
    	// attente de la fin du thread 
    	pthread_join(tid,NULL);
    
    	// fermeture avec close.
    	errorCondition = close(sock);
    	if(errorCondition)
    		printf("close fail. errno : %d\n",errno);
    }
    
    
    
  • [^] # Re: ben chez moi

    Posté par  . En réponse au message Raw socket (BUG). Évalué à 1.

    Le but est de vérifier que la fonction recvmsg doit se couper si on ferme la socket.
    Dans le morceau de code donné, je ne boucle pas si la socket reçoit un message. Donc ça se termine bien.
    Par contre, si tu me dit que tu n'as pas de trafic et que la fonction recvmsg se termine en erreur (c'est le but), c'est que j'ai un bug avec mon noyau.

    Pourrais tu faire le test à nouveau ?

    Merci
  • [^] # Re: socket non bloquant...

    Posté par  . En réponse au message Raw socket (BUG). Évalué à 1.

    Pour le mutex => non, car il est délocké avec le pthread_cond_wait

    Pour faire un recvmsg non-bloquant => non car le programme bouclerait et donc 100% de cpu. Pas bien

    Je vais regarder du coté de select. C'est une bonne alternative.
    L'inconvénient c'est que je suit dans l'obligation d'attendre le timeout lors de la fin du programme.
    C'est pour cela que je n'ai pas pensé tout de suite à l'utiliser.

    Si quelqu'un a une solution autre que select, je prend, c'est peut-être une combinaison de chaque qui fera l'affaire
  • [^] # Re: ben chez moi

    Posté par  . En réponse au message Raw socket (BUG). Évalué à 1.

    Ah bon ?

    Tu doit avoir du trafic sur le loopback car le programme écrit reçoit qu'un packet et de n'importe quel type (P_ETH_ALL).

    Coupe tout ce qui utilise le loopback avant de lancer le programme.
  • [^] # Re: Threads

    Posté par  . En réponse au message Raw socket (BUG). Évalué à 1.


    Commençons par les threads : tu ferme la socket pendant sont utilisation par un autre thread. Il te faudrait un mutex dessus pour faire propre.

    Oui, c'est le but. Car recvmsg est un appel bloquant, donc pour l'annuler, un close sur la socket me semblait un bonne idée.


    je pense que ton problème est l'utilisation de shutdown. C'est une fonction servant à fermer une connexion, or les socket raw sont des socket non connectées.


    Comme mis en commentaire dans mon source, c'est normal qu'il ne marche pas.



    Ce que tu peux faire c'est de la fermer avec un close, auquel cas recvmsg te retournera une erreur, ce qui est normal.


    C'est là ou ça ne marche plus. Le recvmsg ne termine pas !

    Comment faire ?
  • [^] # Re: ah

    Posté par  . En réponse au message Programmation d'un nouveau protocol. Évalué à 1.

    Non, pour l'instant, il n'y a pas de dépos officiel. Je sais que je peut en créer un gratuitement sur plein de site mais je préfert attendre d'avoir quelque chose de concret avant de le publier.

    Mais rassure toi, dès que je livrerai quelque chose, je ferai un peu de PUB histoire de voir si ça interrese ...