le routeur programmable click u présentation de click : routeur programmable logiciel n mit 2003...
TRANSCRIPT
Le Routeur Programmable Click
Présentation de Click : Routeur Programmable Logiciel
MIT 2003
Toujours maintenu (vour site Web :
http://www.pdos.lcs.mit.edu/click
Diverses fonctionnalités
efficace
Trouver exemples Click sous :
users/enseig/genius/click-1.4.3/elements
Qu ’est-ce Click ?
Routeur programmable
Acheminer les paquets vers la bonne sortie en faisant ou non
des traîtements
Quelques fonctinnalités de base (regroupés dans les éléments
de Click = briques de base)
Analyse de l’en-tête
Mécanisme de branchement
consultation d ’une table de routage
Historique
MIT puis Berkeley 2000-??
Thèse de Eddie Kohler dirigé par Robert Morris et Frans
Kaashoek
Implémentation d‘un routeur Multiprocesseur
annoncé dans un article by Benjie Chen et Eddie Kohler
l‘implémentation n‘a pas été rendu publique
Le Langage CLICK
Décrire l'architecture d'une application de routage des paquets
Language haut niveau, simple, configurable et efficace
Configuration
langage fonctionnal
Elements : Classes C++, Ports
Paramétres de configurations
Méthodes d'interfaces
Paquets
Le Langage CLICK
Connections :
définissent un graphe orienté
lient les éléments entre eux en passant d'un port de sortie
a un port d'entrée.
Exemple Syntaxe : FromDevice(eth0) -> Counter -> Discard ;
Quelques simples éléments branchement sans modification du paquet : tee
Modification de l‘en-tête : strip(8) enlève 8 bits
Vérification de l‘en-tête : Check IP header
CheckIPHeader(18.26.4.255 1.255.255.255)
Strip(8)
Chaîne de configuration
CheckIPHeader(…)
Tee(2)
Chaîne de configuration
Port d‘entrée
Port d‘entrée
Ports de sortie
Port de sortie
Chaîne de configuration
Communications en CLICK
Technique de transfert de paquets entre éléments:
PUSH :L'élément source initie le transfert paquet et l'envoie à l'élément destination (downstream).
PULL : L'élément destination initie le transfert paquet en demandant a l'élément source de retourner un paquet (upstream).
Implémenté par des appels de fonctions virtuels : efficacité
Il y a trois classes des connecteurs : PUSH, PULL et AGNOSTIC. Cette dernère change le caractère de ses ports pour s’adapter aux élements précédents/suivants mais doit être push ou pull pour tous les ports d’un élement
Transition push-pull, pull-push : Fifo
Communications en CLICK
Contrôle du flot de paquets
Les Fifos de CLICK
Stockage des paquets : FIFO
Elément : Queue (elements/stadard/queue.hh)
Port d'entrée de type PUSH
Port de sortie de type PULL
FIFO non bloquante en écriture
Indique qu'elle est vide aux éléments concernés
Indique l'arrivée du premier paquet aux éléments concernés
Jète des paquets selon une politique définie (dropping policy)
Queue
Interdits de Click
cet image comporte 4 erreurs
sortie push de FromDevice est connecté à l’entrée pull de PullDevice
sortie push de FromDevice comporte plusieurs connexions
plusieurs connexions aboutissent à l’entrée de ToDevice
élément agnostique dans un contexte push/pull
l’image d ’en bas est correct
la file compense le différence de contexte
Conçevoir des éléments
C’est du C++
Attention aux appels des fonctions virtuelles
Exemple : Code C++ pour l’élément vide
Un élément composé
Modularité par moyen de C++
Enfilement juste stochastique (stochastic fair queueing)
composé de
élémént de base HashSwitch
élément de base RoundRobin
Sources et cibles de traffic
InfiniteSource
RatedSource
FromLinux
FromDevice
Discard
ToDevice
Voir documentation sur les éléments (il y manquent quelques-uns) et éléments fournis avec la distribution
push
push
Flow-based router context
Recherche en largeur/en profondeur danns le graphe des configurations
Extension importante de la communication par appel des fonctions virtuels
Important entre autres pour RED dropping
Robuste en absence des cycles
Permet entre autres
de suivre le chemin des paquets
de notifier du côte de la fifo l‘élément précédent du fait de sa remplissage
Politique des Fifos (Dropping Policies)
Les fifos sont évidemment non-bloquantes; ceci est une
assumption de base dans le monde des réseaux
Jeter des paquets
en-tête de la fifo
à la queue de la fifo
Stratégies de dropping fournies
RED (Random Early Detection) Dropping : laisser tomber
un paquet au choix
Weighted RED : les paramètres indiquent les priorités
différentes
Un Simple Classifieur
Trois priorités
Jeter des paquets selon la stratégie RED
cherchez l ’erreur
Ordonnancement en Click
Deux stratégies sont implementées parmi des éléments
Round-Robin
Priority-based
Des stratégies plus compliquées sont imaginables mais pas
implémentées
Ordonnancement en CLICK
Ordonnancement : les initiateurs sont ordonnancés
Algorithme d'ordonnancement : Stride scheduling
Un élement qui initie de façon autonôme une requête PUSH ou PULL est ordonnancable et doit être mis dans la file d'attente
Tous les autres éléments sont ordonnancé implicitement
En général, un programme Click s'éxecute en un seul thread
Un appel à une méthode PUSH ou PULL doit retourner à son appelant avant qu'une autre tâche ne commence
Algorithme déterministe d'ordonnancement des tâches Stride Scheduling
Routage IPv4 en Langage Click
Analyser une configuration déjà existante
Algorithme de Routage IPv4
Le Langage Click
Communications en Click
Ordonnancement en Click
Protocole de résolution d ’adresses ARP
IPv4 codé en Click
Evaluation
Un premier routeur : IPv 4
Algorithme de Routage IPv4
Enlever un paquet de la file de sortie
Vérifier si il s‘agit version 4 ou 6
Vérifier l‘addresse destination
Vérifier checksum Stocker champ checksum et effacer En-tete prise comme serie des entiers 16 bit Calculer complement-1 du complement-1 de la somme de ces entiers Comparer a la checksum
Lookup route: chercher l‘addresse destination dans table de routage Recupérer l‘addresse IP du hop prochain
Mise à jour temps de survie (time-to-live TTL) : decrémenter champ TTL et modifier champ checksum
Insérer paquet dans une des files de sortie
IPv4 en Click
Aspects pratiques:
OS: Linux
Routage IPv4 (simplifié) est la plus grande application disponible en Click actuellement
Userlevel
Paquets sont générés par Click
Eléments „InfiniteSource“ et „Discard“ au lieu d‘une entrée et sortie sur Ethernet
ASIM : Kernel patch: paquets entre deux/plusieurs machines
Eléments FromDevice et ToDevice
Deux (vieilles) cartes Ethernet de la marque Tulip
IPv4 Code en Clickc0 :: Classifier(12/0806 20/0001,
12/0806 20/0002, 12/0800, -);c1 :: Classifier(12/0806 20/0001, 12/0806 20/0002, 12/0800, -);Idle -> [0]c0;InfiniteSource(DATA \< // Ethernet header 00 00 c0 ae 67 ef 00 00 00 00 00 00 08 00 // IP header 45 00 00 28 00 00 00 00 40 11 77 c3 01 00 00 01 02 00 00 02 // UDP header 13 69 13 69 00 14 d6 41 // UDP payload 55 44 50 20 70 61 63 6b 65 74 21 0a 04 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 80 04 08 00 80 04 08 53 53 00 00 53 53 00 00 05 00 00 00 00 10 00 00 01 00 00 00 54 53 00 00 54 e3 04 08 54 e3 04 08 d8 01 00 00>, LIMIT 600000, BURST 5, STOP true) -> [0]c1;out0 :: Queue(200) -> Discard;out1 :: Queue(200) -> Discard;tol :: Discard;// An "ARP querier" for each interface.fake_arpq0 :: EtherEncap(0x0800, 00:00:c0:ae:67:ef, 00:00:c0:4f:71:ef); //ARPQuerier(18.26.4.24, 00:00:C0:AE:67:EF);fake_arpq1 :: EtherEncap(0x0800, 00:00:c0:4f:71:ef, 00:00:c0:4f:71:ef); //ARPQuerier(18.26.7.1, 00:00:C0:4F:71:EF);// Deliver ARP responses to ARP queriers as well as Linux.t :: Tee(3);c0[1] -> t;c1[1] -> t;t[0] -> tol;t[1] -> fake_arpq0; // was -> [1]arpq0t[2] -> fake_arpq1; // was -> [1]arpq1
// Connect ARP outputs to the interface queues.fake_arpq0 -> out0;fake_arpq1 -> out1;
// Proxy ARP on eth0 for 18.26.7, as well as cone's IP address.ar0 :: ARPResponder(18.26.4.24 00:00:C0:AE:67:EF, 18.26.7.0/24 00:00:C0:AE:67:EF);c0[0] -> ar0 -> out0;
// Ordinary ARP on eth1.ar1 :: ARPResponder(18.26.7.1 00:00:C0:4F:71:EF);c1[0] -> ar1 -> out1;
// IP routing table. Outputs:// 0: packets for this machine.// 1: packets for 18.26.4.// 2: packets for 18.26.7.// All other packets are sent to output 1, with 18.26.4.1 as the gateway.
rt :: StaticIPLookup(18.26.4.24/32 0, 18.26.4.255/32 0, 18.26.4.0/32 0, 18.26.7.1/32 0, 18.26.7.255/32 0, 18.26.7.0/32 0, 18.26.4.0/24 1, 18.26.7.0/24 2,
0.0.0.0/0 18.26.4.1 1)// Hand incoming IP packets to the routing table.
// CheckIPHeader checks all the lengths and length fields// for sanity.ip :: Strip(14) -> CheckIPHeader(18.26.4.255 1.255.255.255) -> [0]rt;c0[2] -> Paint(1) -> ip;c1[2] -> Paint(2) -> ip;
// IP packets for this machine.// ToHost expects ethernet packets, so cook up a fake header.rt[0] -> EtherEncap(0x0800, 1:1:1:1:1:1, 2:2:2:2:2:2) -> tol;
// These are the main output paths; we've committed to a// particular output device.// Check paint to see if a redirect is required.// Process record route and timestamp IP options.// Fill in missing ip_src fields.// Discard packets that arrived over link-level broadcast or multicast.// Decrement and check the TTL after deciding to forward.// Fragment.// Send outgoing packets through ARP to the interfaces.rt[1] -> DropBroadcasts -> cp1 :: PaintTee(1) -> gio1 :: IPGWOptions(18.26.4.24) -> FixIPSrc(18.26.4.24) -> dt1 :: DecIPTTL -> fr1 :: IPFragmenter(300) -> [0]fake_arpq0;rt[2] -> DropBroadcasts -> cp2 :: PaintTee(2) -> gio2 :: IPGWOptions(18.26.7.1) -> FixIPSrc(18.26.7.1) -> dt2 :: DecIPTTL -> fr2 :: IPFragmenter(300) -> [0]fake_arpq1;
// DecIPTTL[1] emits packets with expired TTLs.// Reply with ICMPs. Rate-limit them?dt1[1] -> ICMPError(18.26.4.24, 11, 0) -> [0]rt;dt2[1] -> ICMPError(18.26.4.24, 11, 0) -> [0]rt;
// Send back ICMP UNREACH/NEEDFRAG messages on big packets with DF set.// This makes path mtu discovery work.fr1[1] -> ICMPError(18.26.7.1, 3, 4) -> [0]rt;fr2[1] -> ICMPError(18.26.7.1, 3, 4) -> [0]rt;
En-tête du paquet IP
c0 :: Classifier(12/0806 20/0001, 12/0806 20/0002, 12/0800, -);c1 :: Classifier(12/0806 20/0001, 12/0806 20/0002, 12/0800, -);Idle -> [0]c0;InfiniteSource(DATA \< // Ethernet header 00 00 c0 ae 67 ef 00 00 00 00 00 00 08 00 // IP header 45 00 00 28 00 00 00 00 40 11 77 c3 01 00 00 01 02 00 00 02 // UDP header 13 69 13 69 00 14 d6 41 // UDP payload 55 44 50 20 70 61 63 6b 65 74 21 0a 04 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 80 04 08 00 80 04 08 53 53 00 00 53 53 00 00 05 00 00 00 00 10 00 00 01 00 00 00 54 53 00 00 54 e3 04 08 54 e3 04 08 d8 01 00 00>, LIMIT 600000, BURST 5, STOP true) -> [0]c1;
ARP (Address Resolution Protocol) Comment établir le lien adresse IP / adresse physique ?
Mise en place dans TCP/IP d’un protocole de bas niveau appelé Address
Resolution Protocol (ARP)
Rôle de ARP : fournir à une machine donnée l'adresse physique
d'une autre machine située sur le même réseau à partir de l'adresse
IP de la machine destinataire
Fournit a la couche liaison un mapping des addresses IP (logiques)
aux addresses physiques
Comparable au fonctionnement de la table de routage
Donner un addresse IP, rendre l‘addresse physique
Si l‘addresse IP n‘existe pas, générer une requête en utilisant un
protocole de contrôle
Enfiler le paquet
0 248 16 31
Type de service Longueur totale (en octets)
Identification Déplacement fragment
Adresse IP Source
Adresse IP Destination
Options IP
4
version HLEN
19
Fanions
Durée de vie Protocole Total de contrôle en-tête
Padding
Données
. . .
Le datagramme ARP Unité de transfert de base est le datagramme, constituée d'un en-tête et
d'un champ de données (de 1,5Ko à 64Ko)
Fake (Faux, simulé) ARP en Click
out0 :: Queue(200) -> Discard;out1 :: Queue(200) -> Discard;tol :: Discard;// An "ARP querier" for each interface.fake_arpq0 :: EtherEncap(0x0800, 00:00:c0:ae:67:ef, 00:00:c0:4f:71:ef); //ARPQuerier(18.26.4.24, 00:00:C0:AE:67:EF);fake_arpq1 :: EtherEncap(0x0800, 00:00:c0:4f:71:ef, 00:00:c0:4f:71:ef); //ARPQuerier(18.26.7.1, 00:00:C0:4F:71:EF);// Deliver ARP responses to ARP queriers as well as Linux.t :: Tee(3);c0[1] -> t;c1[1] -> t;t[0] -> tol;t[1] -> fake_arpq0; // was -> [1]arpq0t[2] -> fake_arpq1; // was -> [1]arpq1// Connect ARP outputs to the interface queues.fake_arpq0 -> out0;fake_arpq1 -> out1;
Fake ARP // Proxy ARP on eth0 for 18.26.7, as well as cone's IP address.ar0 :: ARPResponder(18.26.4.24 00:00:C0:AE:67:EF, 18.26.7.0/24 00:00:C0:AE:67:EF);c0[0] -> ar0 -> out0;// Ordinary ARP on eth1.ar1 :: ARPResponder(18.26.7.1 00:00:C0:4F:71:EF);c1[0] -> ar1 -> out1;// IP routing table. Outputs:// 0: packets for this machine.// 1: packets for 18.26.4.// 2: packets for 18.26.7.// All other packets are sent to output 1, with 18.26.4.1 as the gateway.
rt :: StaticIPLookup(18.26.4.24/32 0,18.26.4.255/32 0,18.26.4.0/32 0,18.26.7.1/32 0,18.26.7.255/32 0,18.26.7.0/32 0,
18.26.4.0/24 1,18.26.7.0/24 2,0.0.0.0/0 18.26.4.1 1) // Hand incoming IP packets to the routing table.// CheckIPHeader checks all the lengths and length fields for sanity.ip :: Strip(14) -> CheckIPHeader(18.26.4.255 1.255.255.255) -> [0]rt;c0[2] -> Paint(1) -> ip;c1[2] -> Paint(2) -> ip;// IP packets for this machine.// ToHost expects ethernet packets, so cook up a fake header.rt[0] -> EtherEncap(0x0800, 1:1:1:1:1:1, 2:2:2:2:2:2) -> tol;
Sorties // These are the main output paths; we've committed to a// particular output device.Check paint to see if a redirect is required.// Process record route and timestamp IP options.// Fill in missing ip_src fields.// Discard packets that arrived over link-level broadcast or multicast.// Decrement and check the TTL after deciding to forward.Fragment.// Send outgoing packets through ARP to the interfaces.rt[1] -> DropBroadcasts -> cp1 :: PaintTee(1) -> gio1 :: IPGWOptions(18.26.4.24) -> FixIPSrc(18.26.4.24) -> dt1 :: DecIPTTL -> fr1 :: IPFragmenter(300) -> [0]fake_arpq0;rt[2] -> DropBroadcasts -> cp2 :: PaintTee(2) -> gio2 :: IPGWOptions(18.26.7.1) -> FixIPSrc(18.26.7.1) -> dt2 :: DecIPTTL -> fr2 :: IPFragmenter(300) -> [0]fake_arpq1;// DecIPTTL[1] emits packets with expired TTLs.// Reply with ICMPs. Rate-limit them?dt1[1] -> ICMPError(18.26.4.24, 11, 0) -> [0]rt;dt2[1] -> ICMPError(18.26.4.24, 11, 0) -> [0]rt;// Send back ICMP UNREACH/NEEDFRAG messages on big packets with DF set.// This makes path mtu discovery work.fr1[1] -> ICMPError(18.26.7.1, 3, 4) -> [0]rt;fr2[1] -> ICMPError(18.26.7.1, 3, 4) -> [0]rt;
Differentiated Services (DiffServ)
Meter(12500)
RatedSplitter(7500)
SetIPDSCP(D)
DiffServ(2)
• Il s‘agit d‘une des implémentations possibles de Nouveaux éléments
©SetIPDSCP changes le tag. Il modifie le champ DSCP (DiffServ
code point field) à valeur fixe puis l‘incrémente successivement
©RatedSplitter(rate) classifie les paquets par rapport à leur taux
d‘arrivée. Au maximum rate paquets sont transmis à la première
sortie, le reste au deuxième
©Meter(rate) envoye le flux entier à sa deuxième sortie une fois le
taux rate atteint
©Shaper(rate) : connexions pull! Il s‘ occupe de la régulation des
temps de départ des paquets : maximum rate requêtes par
seconde
DiffServ(3)
Les éléments aux fonctionnalités de Classification, ordonnancement, déchargement, files d‘attente ont déjà été présentés avant
Le flôt entrant est partagé en quatre, basé sur DSCP
Les trois premiers flux sont limités en taux, le quatrième est soumis à une transmission „best effort“ (le mieux possible)
Les flots limités ont la priorité au flot normal
Limitation s‘effectue differément
A : dropping flots dépassant le 7500 paquets/sec
B : shaped (taillé) sur un taux de 10000, laissant les paquets restants dans la file
C: reclassement des paquets dépassant 12500 paquets/sec comme best-effort
Règles de filtrage pour le Pare-feu
Pare-Feu
Pare-Feu (3)//détermine avec l'entete ethernet si j'ai encapsulé de l'IP
classifier::Classifier(12/0800,-);rr::RoundRobinSched;CIPH:: CheckIPHeader(12.45.67.89, 14);IPF::IPFilter(allow ip src 12.45.67.90);rrfirewall::RoundRobinSched;d::Discard;
//encapsule de l'ipeIP0::EtherEncap(0x0800, 1:2:3:4:5:6, A:B:C:D:E:F);eIP1::EtherEncap(0x0800, 1:2:3:4:5:6, A:B:C:D:E:F);eIP2::EtherEncap(0x0800, 1:2:3:4:5:6, A:B:C:D:E:F);eIP3::EtherEncap(0x0800, 1:2:3:4:5:6, A:B:C:D:E:F);eIP4::EtherEncap(0x0800, 1:2:3:4:5:6, A:B:C:D:E:F);eIP5::EtherEncap(0x0800, 1:2:3:4:5:6, A:B:C:D:E:F);
//n'encapsule pas de l'ipe0::EtherEncap(0x3514, 1:2:3:4:5:6, A:B:C:D:E:F); e1::EtherEncap(0x3514, 1:2:3:4:5:6, A:B:C:D:E:F);
nul0::Null;nul1::Null;
//IpEncap argument => protocole, src, destip0 :: IPEncap(0,12.45.67.89 , 192.68.1.29);ip1 :: IPEncap(0,12.45.67.89 , 192.68.1.27);ip2 :: IPEncap(0,12.45.67.89 , 58.168.21.127);ip3 :: IPEncap(0,12.45.67.89 , 58.189.172.3);ip4 :: IPEncap(0,12.45.67.89 , 59.12.32.153);ip5 :: IPEncap(0,12.45.67.90 , 127.12.132.13);
Pare-Feu (4)
/*********************************** Génération de paquets IP vers l'entrée d'un classifier IP ***********************************/
TimedSource(0.1) -> ip0 -> eIP0 -> Queue(5) -> [0]rr;TimedSource(0.2) -> ip1 -> eIP1 -> Queue(5) -> [1]rr;TimedSource(0.3) -> ip2 -> eIP2 -> Queue(5) -> [2]rr;TimedSource(0.5) -> ip3 -> eIP3 -> Queue(5) -> [3]rr;TimedSource(0.8) -> ip4 -> eIP4 -> Queue(5) -> [4]rr;TimedSource(0.2) -> ip5 -> eIP5 -> Queue(5) -> [5]rr;TimedSource(0.1) -> nul0 -> e0 -> Queue(5) -> [6]rr;TimedSource(0.4) -> nul1 -> e1 -> Queue(5) -> [7]rr;
rr -> Unqueue(5) -> classifier;
/*********************************/
//les paquets ip sont checkés puis filtrésclassifier[0] -> CIPH -> IPF;
//les paquets corrects sont mis en fileIPF -> Queue -> [0]rrfirewall;
//les paquets non ip sont mis en fileclassifier[1] -> Queue -> [1]rrfirewall;
// sortie du firewallrrfirewall -> Unqueue -> Print("data_out\t")-> d;
Evaluation Click (I)
Simple a configurer, reconfigurable à chaud
riche bibliothèque des éléments
facile à créer des nouveaux éléments
permet de se concentrer sur la partie fonctionelle de son code
Difficile d‘entrer dans l‘implémentation si besoin de modifier Click
Documentation relativement insuffisante
Algorithme d‘ordonnancement peu visible
Marche seulement avec une carte Tulip
le côté SMP n‘est pas suffisamment maîtrisé
notre choix de système d‘exploitation (Mutek) a exclu l‘utilisation directe de click (l‘application a du être réecrite en thread POSIX)
Evaluation Click (II)Expériences (confirmés) : On cherche à saturer le système
Efficace!
Mini-passerelle
Simplifications :
tous paquets arrivent sur une entrée
le éseau est relié à deux réseaux locaux
chaque réseau a trois machines dont l ’adresse IP et
l ’adresse MAC sont connus de la passerelle
il existe une adresse de sortie pas défaut où l ’on envoye
les paquets dont l ’adresse ne correspond pas
Mini-Passerelle (2)
Mini-Passerelle(3)
Parties de l ’application :
Dèsencapsulation des trames Ethernet entrantes
Analyses des en-têtes
Quel sus-réseau?
Quelle machine dans un LAN?
Mini-Passerelle (4)
Mini-Passerelle (5)
Declaration ***********************************/
d::Discard;
rr :: RoundRobinSched;rr_S1 :: RoundRobinSched;rr_S2 :: RoundRobinSched;
rr_S1_0 :: RoundRobinSched;rr_S1_1 :: RoundRobinSched;rr_S1_2 :: RoundRobinSched;rr_S1_3 :: RoundRobinSched;rr_S2_0 :: RoundRobinSched;rr_S2_1 :: RoundRobinSched;rr_S2_2 :: RoundRobinSched;rr_S2_3 :: RoundRobinSched;
t_S1 :: Tee(4);t_S2 :: Tee(4);
Mini-Passerelle (6)
e :: EtherEncap(0x0800, 1:2:3:4:5:6, A:B:C:D:E:F);e10 :: EtherEncap(0x0800, 1:1:1:1:1:1, A:A:A:A:A:A);e14 :: EtherEncap(0x0800, 1:1:1:1:1:1, 4:4:4:4:4:4);e15 :: EtherEncap(0x0800, 1:1:1:1:1:1, 5:5:5:5:5:5);e16 :: EtherEncap(0x0800, 1:1:1:1:1:1, 6:6:6:6:6:6);e20 :: EtherEncap(0x0800, 2:2:2:2:2:2, B:B:B:B:B:B);e27 :: EtherEncap(0x0800, 2:2:2:2:2:2, 7:7:7:7:7:7);e28 :: EtherEncap(0x0800, 2:2:2:2:2:2, 8:8:8:8:8:8);e29 :: EtherEncap(0x0800, 2:2:2:2:2:2, 9:9:9:9:9:9);e30 :: EtherEncap(0x0800, 3:3:3:3:3:3, 0:0:0:0:0:0);
ip0 :: IPEncap(0,12.45.67.89 , 192.68.1.29);ip1 :: IPEncap(0,12.45.67.89 , 192.68.1.27);ip2 :: IPEncap(0,12.45.67.89 , 58.168.21.127);ip3 :: IPEncap(0,12.45.67.89 , 58.189.172.3);ip4 :: IPEncap(0,12.45.67.89 , 59.12.32.153);ip5 :: IPEncap(0,12.45.67.89 , 127.12.132.13);ip6 :: IPEncap(0,12.45.67.89 , 192.68.9.84);ip7 :: IPEncap(0,12.45.67.89 , 136.89.74.98);ip8 :: IPEncap(0,12.45.67.89 , 192.68.1.255);ip9 :: IPEncap(0,12.45.67.89 , 58.255.255.255);ip10:: IPEncap(0,12.45.67.89 , 58.210.12.55);ip11:: IPEncap(0,12.45.67.89 , 192.68.1.11);
Mini-Passerelle (7)
S::StaticIPLookup(192.68.1.0/24 1,58.0.0.0/8 2,0.0.0.0/0 0);
S1::StaticIPLookup(192.68.1.27/32 1,192.68.1.29/32 2,192.68.1.201/32 3,192.68.1.255/32 4, //adresse Broadcast0.0.0.0/0 0);
S2::StaticIPLookup(58.137.4.89/32 1,58.168.21.127/32 2,58.189.172.3/32 3,58.255.255.255/32 4, //adresse Broadcast0.0.0.0/0 0);
Mini-Passerelle (8)
/*********************************** Passerrelle ***********************************/
/* Génération des données */TimedSource(0.1) -> ip0 -> Queue(5) -> [0]rr;TimedSource(0.2) -> ip1 -> Queue(5) -> [1]rr;TimedSource(0.3) -> ip2 -> Queue(5) -> [2]rr;TimedSource(0.1) -> ip3 -> Queue(5) -> [3]rr;TimedSource(0.8) -> ip4 -> Queue(5) -> [4]rr;TimedSource(0.2) -> ip5 -> Queue(5) -> [5]rr;TimedSource(0.5) -> ip6 -> Queue(5) -> [6]rr;TimedSource(0.4) -> ip7 -> Queue(5) -> [7]rr;TimedSource(0.9) -> ip8 -> Queue(5) -> [8]rr;TimedSource(0.8) -> ip9 -> Queue(5) -> [9]rr;TimedSource(0.6) -> ip10-> Queue(5) -> [10]rr;TimedSource(0.7) -> ip11-> Queue(5) -> [11]rr;
rr -> Unqueue(5) -> e;
/* Decapsulage des Paquets Ethernet */e -> Strip(14)
-> S;
Mini-Passerelle (9)
rr_S1_0 -> Unqueue(5) -> e10 -> Print("ss réseau1, machine par défault\t\t") -> Queue(5) -> [0]rr_S1;
rr_S1_1 -> Unqueue(5) -> e14 -> Print("ss réseau1, machine 1 : 192.168.001.027\t") -> Queue(5) -> [1]rr_S1;
rr_S1_2 -> Unqueue(5) -> e15 -> Print("ss réseau1, machine 2 : 192.168.001.029\t") -> Queue(5) -> [2]rr_S1;
rr_S1_3 -> Unqueue(5) -> e16 -> Print("ss réseau1, machine 3 : 192.168.001.201\t")-> Queue(5) -> [3]rr_S1;
rr_S2_0 -> Unqueue(5) -> e20 -> Print("ss réseau2, machine par défault\t\t") -> Queue(5) -> [0]rr_S2;
rr_S2_1 -> Unqueue(5) -> e27 -> Print("ss réseau2, machine 1 : 058.137.004.089\t") -> Queue(5) -> [1]rr_S2;
rr_S2_2 -> Unqueue(5) -> e28 -> Print("ss réseau2, machine 2 : 058.168.021.127\t") -> Queue(5) -> [2]rr_S2;
rr_S2_3 -> Unqueue(5) -> e29 -> Print("ss réseau2, machine 3 : 058.189.172.003\t") -> Queue(5) -> [3]rr_S2;
/* Sortie */rr_S1 -> Unqueue(5) -> d;rr_S2 -> Unqueue(5) -> d;
/* Si n'est pas dans le masque de sous réseaux ou est dans le masque l'adresse IP ne correspond pas a une machine
=> sortie par défaut*/
S[0] -> e30 -> Print("Sortie par défault \t\t\t")-> d;
Mini-Passerelle (10)
/* Sous réseaux */
S[1] -> S1;S[2] -> S2;
/* Transmission au Sous Réseau 1 et 2 */S1[4] -> Print("ss réseau1 (Brodcast)\t\t\t")
-> t_S1;S2[4] -> Print("ss réseau2 (Brodcast)\t\t\t")
-> t_S2
S1[0] -> Queue(5) -> [0]rr_S1_0;t_S1[0] -> Queue(5) -> [1]rr_S1_0; S1[1] -> Queue(5) -> [0]rr_S1_1;t_S1[1] -> Queue(5) -> [1]rr_S1_1; S1[2] -> Queue(5) -> [0]rr_S1_2;t_S1[2] -> Queue(5) -> [1]rr_S1_2; S1[3] -> Queue(5) -> [0]rr_S1_3;t_S1[3] -> Queue(5) -> [1]rr_S1_3;
S2[0] -> Queue(5) -> [0]rr_S2_0;t_S2[0] -> Queue(5) -> [1]rr_S2_0; S2[1] -> Queue(5) -> [0]rr_S2_1;t_S2[1] -> Queue(5) -> [1]rr_S2_1; S2[2] -> Queue(5) -> [0]rr_S2_2;t_S2[2] -> Queue(5) -> [1]rr_S2_2; S2[3] -> Queue(5) -> [0]rr_S2_3;t_S2[3] -> Queue(5) -> [1]rr_S2_3;