Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Réseau
Réseau Forum d'entraide sur la programmation réseau en C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/09/2012, 01h07   #1
channel
Invité de passage
 
Femme
Inscription : septembre 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2012
Messages : 8
Points : 3
Points : 3
Par défaut Simulation de latence en utilisant les hooks

Bonjour,

J'ai comme sujet de PFE : « développement d'un outil de simulation de latence sur flots VOIP » donc ma prof me demande de faire un programme qui permet la simulation de latence. Utilisant les hooks. Et voila, elle m'a donné un programme pour m'aider mais j'ai rien compris :/

Citation:
Netfilter hook
This example shows how to use hook to alter network traffic in the Linux kernel using Netfilter.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/skbuff.h>
 
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/in.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
 
/* Port we want to drop packets on */
static const uint16_t port = 25;
 
/* This is the hook function itself */
static unsigned int hook_func(unsigned int hooknum,
                       struct sk_buff **pskb,
                       const struct net_device *in,
                       const struct net_device *out,
                       int (*okfn)(struct sk_buff *))
{
        struct iphdr *iph = ip_hdr(*pskb);
        struct tcphdr *tcph, tcpbuf;
 
        if (iph->protocol != IPPROTO_TCP)
                return NF_ACCEPT;
 
        tcph = skb_header_pointer(*pskb, ip_hdrlen(*pskb), sizeof(*tcph), &tcpbuf);
        if (tcph == NULL)
                return NF_ACCEPT;
 
        return (tcph->dest == port) ? NF_DROP : NF_ACCEPT;
}
 
/* Used to register our hook function */
static struct nf_hook_ops nfho = {
        .hook     = hook_func,
        .hooknum  = NF_IP_PRE_ROUTING,
        .pf       = NFPROTO_IPV4,
        .priority = NF_IP_PRI_FIRST,
};
 
static __init int my_init(void)
{
        return nf_register_hook(&nfho);
}
 
static __exit void my_exit(void)
{
    nf_unregister_hook(&nfho);
}
 
module_init(my_init);
module_exit(my_exit);
et merci.
channel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2012, 03h06   #2
dahtah
Membre expérimenté
 
Ingénieur sécurité
Inscription : février 2007
Messages : 456
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Australie

Informations professionnelles :
Activité : Ingénieur sécurité
Secteur : Industrie

Informations forums :
Inscription : février 2007
Messages : 456
Points : 520
Points : 520
Bonjour:
  1. ouvre un nouveau topic avec des questions precises. Ne deterre pas un vieux topic de 2 ans.
  2. Utilise la balise code pour mettre en forme le code que tu postes

Citation:
Envoyé par channel Voir le message
j'ai comme sujet de PFE "développement d'un outil de simulation de latence sur flots VOIP" donc ma prof me demande de faire un programme qui permet la simulation de latence .utilisant les hook. et voila elle m'as donné un prog pou m'aider mais j'ai rien compris :/
Qu'est ce que tu n'as pas compris dans ce programme?
De plus, je vois pas vraiment l'interet de developper un tel programme alors que tc permet de gerer la latence, perte de paquet, ... Ca semble plus approprie que de re-ecrire un module noyaux pour ca.

Citation:
Envoyé par channel Voir le message
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/skbuff.h>
 
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/in.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
 
/* Port we want to drop packets on */
static const uint16_t port = 25;
 
/* This is the hook function itself */
static unsigned int hook_func(unsigned int hooknum,
                       struct sk_buff **pskb,
                       const struct net_device *in,
                       const struct net_device *out,
                       int (*okfn)(struct sk_buff *))
{
        struct iphdr *iph = ip_hdr(*pskb);
        struct tcphdr *tcph, tcpbuf;
 
        if (iph->protocol != IPPROTO_TCP)
                return NF_ACCEPT;
 
        tcph = skb_header_pointer(*pskb, ip_hdrlen(*pskb), sizeof(*tcph), &tcpbuf);
        if (tcph == NULL)
                return NF_ACCEPT;
 
        return (tcph->dest == port) ? NF_DROP : NF_ACCEPT;
}
 
/* Used to register our hook function */
static struct nf_hook_ops nfho = {
        .hook     = hook_func,
        .hooknum  = NF_IP_PRE_ROUTING,
        .pf       = NFPROTO_IPV4,
        .priority = NF_IP_PRI_FIRST,
};
 
static __init int my_init(void)
{
        return nf_register_hook(&nfho);
}
 
static __exit void my_exit(void)
{
    nf_unregister_hook(&nfho);
}
 
module_init(my_init);
module_exit(my_exit);
Le programme que tu postes est un module noyaux qui installe un hook netfilter matchant sur les paquets IPv4, avant que la decision de routage soit faites (avant que ip_rcv_finish() soit appelee). C'est un example de comment utiliser un hook netfilter noyaux pour dropper tout packet TCP dont le port destination est 25 (smtp). Le fonction de hook appelee est hook_func. Tout le code ne fait que caster la structure sk_buff (qui contient le paquet en espace noyaux) vers des structures (headers) interpretables (iphdr, tcphdr) afin d'effectuer la comparaison de port pour dropper le paquet.
__________________
http://datanycast.blogspot.com/
dahtah est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 22/09/2012, 19h08   #3
channel
Invité de passage
 
Femme
Inscription : septembre 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2012
Messages : 8
Points : 3
Points : 3
ok merci
channel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 20h20   #4
channel
Invité de passage
 
Femme
Inscription : septembre 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2012
Messages : 8
Points : 3
Points : 3
justement il me demande de comprendre ce programme pour l'installer après comme module sur le noyau linux mais "avec la variation de latence latence " svp si vous avez des tutos pour m'aider de comprendre les differentes instruction et merc
channel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2012, 14h23   #5
supersnail
Membre Expert
 
Avatar de supersnail
 
Homme
Inscription : novembre 2006
Messages : 1 414
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 1 414
Points : 1 895
Points : 1 895
Bonjour,

Te documenter sur le développement de modules noyau sous Linux te serait utile (ainsi que la doc de netfilter), que de chercher des tutos, et pour ça est ton ami, vu qu'il n'y a plus trop de tutos "SdZ-like" dès que tu tripotes le mode noyau.

Bref tout le boulot se fait dans hook_func (cf ce qui a été dit plus haut), et c'est là où tu devras "générer" de la latence si tu es sur un port utilisé par la VoIP, avant d'autoriser le paquet à circuler.
__________________
Toute question technique envoyée en MP ira directement à la poubelle

Un code ne marchera jamais,il n'a jamais reçu la capacité de se déplacer.
Inutile donc de dire "ça marche pas", donnez plûtot des informations précises afin de mieux pouvoir vous aider.


Grand gourou de la -attitude - Sauvons Internet!
supersnail est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2012, 16h24   #6
channel
Invité de passage
 
Femme
Inscription : septembre 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2012
Messages : 8
Points : 3
Points : 3
SVP je veux savoir les rôles de chaque boucle et les pointeurs
channel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2012, 18h32   #7
supersnail
Membre Expert
 
Avatar de supersnail
 
Homme
Inscription : novembre 2006
Messages : 1 414
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 1 414
Points : 1 895
Points : 1 895
Euh... tu veux qu'on te serve le café aussi ? (avec des macarons tant qu'on y est).

A un certain moment, faut un peu arrêter de vouloir être assisté et se débrouiller avec la doc... D'autant plus que le code est facilement compréhensible (et je suis loin d'être un dieu au niveau de la création de modules noyau Linux).
__________________
Toute question technique envoyée en MP ira directement à la poubelle

Un code ne marchera jamais,il n'a jamais reçu la capacité de se déplacer.
Inutile donc de dire "ça marche pas", donnez plûtot des informations précises afin de mieux pouvoir vous aider.


Grand gourou de la -attitude - Sauvons Internet!
supersnail est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 09/10/2012, 20h16   #8
channel
Invité de passage
 
Femme
Inscription : septembre 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2012
Messages : 8
Points : 3
Points : 3
merci mais je bois pas de café je pose la question serieusemnt et j'ai bien dit que je suis debutante si tu me donne un document qui permet de resoudre mon probleme sa sera mieux
channel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2012, 10h23   #9
leternel
Membre Expert
 
Homme Pierre
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 1 178
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 1 178
Points : 2 492
Points : 2 492
Justement, pour te répondre, la plupart d'entre nous irions lire la documentation des fonctions, ce que tu peux très bien faire, dans le seul but de te la répéter.

Reviens poser des questions précises quand tu n'auras pas compris quelque chose de la dite documentation
Nous nous ferons un plaisir de répondre à ces questions là.
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
  • Une variable de moins est une source d'erreur en moins.
  • Un pointeur de moins est une montagne d'erreurs en moins.
  • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
  • La plus sotte des questions est celle qu'on ne pose pas.
leternel est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/10/2012, 16h39   #10
LordMacharius
Membre actif
 
Homme Maxime Estrade
Développeur en systèmes embarqués
Inscription : juillet 2009
Messages : 99
Détails du profil
Informations personnelles :
Nom : Homme Maxime Estrade
Âge : 23
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Développeur en systèmes embarqués
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2009
Messages : 99
Points : 162
Points : 162
Envoyer un message via MSN à LordMacharius
La bonne solution pour t'en sortir c'est de prendre le problème par petits bouts.
Commence par te documenter et fais en une synthèse, histoire de t'y retrouver =)

Personne ne te donnera de solution toute prête pour la simple et bonne raison que ça n'existe pas (surtout en info )
__________________
Estrade Maxime
Estrad_m
Responsable Communication Roll the World.
{Epitech}.5ème Année
LordMacharius est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/10/2012, 23h45   #11
channel
Invité de passage
 
Femme
Inscription : septembre 2012
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2012
Messages : 8
Points : 3
Points : 3
merci pour les conseils
vous pouvez me donner un site ou tuto que se parle à ce type de programmation
channel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2012, 13h56   #12
leternel
Membre Expert
 
Homme Pierre
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 1 178
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 1 178
Points : 2 492
Points : 2 492
Ici même, dans la faq et les cours C, dans la section réseau, dans la section système, par exemple.
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
  • Une variable de moins est une source d'erreur en moins.
  • Un pointeur de moins est une montagne d'erreurs en moins.
  • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
  • La plus sotte des questions est celle qu'on ne pose pas.
leternel est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h57.


 
 
 
 
Partenaires

Hébergement Web