Schéma d'une connexion ATM

du type Client/Serveur

Cette page a pour but d'expliquer toutes les opérations à effectuer pour établir une connexion en mode ATM natif entre deux machines. La machine appelante sera appelée client, la machine recevant l'appel sera nommée serveur.

Client

Serveur

Pour le client, comme pour le serveur on utilisera l'include spécifique des cartes FORE:

#include <fore_atm/fore_atm_user.h>

en utilisant à la compilation:

gcc -I/opt/FOREatm/include client.c -L/opt/FOREatm/lib -latm -o client

info est une structure de type Atm_info définie dans le header fore_atm_user.h:

Atm_info info;

Ouverture du device représentant la carte ATM (pour les cartes FORE System, le device est "/dev/fa0")

fd = atm_open("/dev/fa0", O_RDWR, &info);

Activation d'un SAP (Service Access Point):

int sap = 4444; /* doit être > 2048 */

atm_bind(fd, ssap, &ssap, qlen);

Récupération de l'adresse ATM du serveur

Atm_endpoint dst;

atm_gethostbyname(hote, &dst.nsap);

Attente d'une demande de connexion sur le SAP.

int conn_id;
Atm_endpoint calling;
Atm_qos qos;
Aal_type aal = aal_type_5;

atm_listen(fd, &conn_id, &calling, &qos, &aal);

On attends ensuite une demande de connexion d'un client.

Choix du SAP du serveur;

dst.asap = server_sap;

Le SAP est l'équivalent du port en IP.

Attente...

Choix de la qualité de service demandée :

Le client remplit la structure Qos :

Atm_qos qos;

qos.peak_bandwidth.target = 1000;
qos.peak_bandwidth.minimum = 20;
qos.mean_bandwidth.target = 60;
qos.mean_bandwidth.minimum = 40;
qos.mean_burst.target = 2000;
qos.mean_burst.minimum = 100;

ces valeurs, prises arbitrairement ici, sont exprimées en Kbits/s

Demande d'ouverture de la connexion:

Atm_qos_sel qos_selected;

atm_connect(fd, &dst, &qos, &qos_selected, aal, dataflow);

On reçoit en retour la qualité de service réellement obtenue.

Une demande de connexion arrive.

Les variables conn_id, calling, qos et aal permettent au serveur de connaître quelques détails sur la demande de connexion.
Notamment, le serveur doit examiner les paramètres de la QOS requise par le client. Il peut ensuite les ajuster selon la capacité de traitement réservée pour cette connexion.

Attente... Acceptation de la connexion.

Atm_dataflow dataflow = duplex;

atm_accept(fd, fd, conn_id, &qos, dataflow);

Le serveur accepte la connexion, en ayant le dernier mot sur la QOS de cette connexion.

Retour de la commande atm_connect.

On peut vérifier par la variable qos_selected la QOS réellement obtenue.
Envoi de données:

octets_envoyés = atm_send(fd, buffer, octets à envoyer);

Réception des données:

octets_reçus = atm_recv(fd, buffer, taille maxi du buffer);

Fermeture de la connexion:

La connexion est fermée par une commande :

atm_close(fd);

de n'importe laquelle des machines. L'autre machine reçoit alors un message d'erreur ("Connection reset by peer") lui indiquant que la machine distante vient de fermer la connexion. Il lui reste alors à refermer le device par:

atm_close(fd);

Les AAL :

Quelle AAL choisir, pour quel emploi ?

L'AAL 3/4 et 5 seront les plus utilisées, car elle permettent un transfert fiable et simple à utiliser (comme TCP en IP). On imagine difficilement l'utilisation de l'AAL nulle. Ses capacitées se rapprochent de l'UDP en IP, c'est à dire le transfert non fiable d'une seule cellule ATM (48 octets de charge utile). Elle n'implémente pas de contrôle d'erreur, ni de contrôle de flux. Le seul intérêt de l'UDP, c'est à dire la légèreté du protocole, et ici perdue, puisqu'il faut quand même ouvrir une connexion ATM pour pouvoir envoyer une seule cellule, et ce sans aucune garantie...

Entre les AAL 3/4 et l'AAL 5, les différences sont minimes. On préférera donc utiliser l'AAL5 dans les application car sa gestion est plus simple (dixit le poly sur l'ATM).

L'AAL null dispose de fonctions dédiées, qui permettent d'effectuer des opération avancées (comme spécifier ou récuperer le header d'une cellule). Ces fonctions ne nous ont pas du tout servies, et ne sont donc pas citées ici. Son utilisation est aussi plus délicate, puisqu'il faut fournir des cellules entières pour les envoyer (et donc gérer l'eventuel bourrage de la cellule).


Page precedente       Retour au sommaire         Page suivante