Une règle WAN se compose des trois sections suivantes :
La section Declaration d'une règle contient les définitions des variables locales et des variables issues d'une requête client. Ces définitions sont utilisées dans les sections Selector et Provider. Ces variables sont stockées avec les variables système.
Les déclarations de variables sont séparées par des points-virgules. Vous pouvez combiner plusieurs déclarations du même type sur une seule ligne ou vous pouvez les renvoyer chacune sur une nouvelle ligne. Le nombre de lignes est indifférent. Vous trouverez ci-dessous un exemple de section Declaration :
REQUIRED INT R1;
REQUIRED TIME R2;
REQUIRED BOOLEAN R3,R4;
REQUIRED NETADDRESS R5,R6;
OPTIONAL INT P1 := 10;
OPTIONAL BOOLEAN := FALSE;
LOCAL INT L1 :=10;
LOCAL INT L2;
LOCAL TIME L3;
LOCAL BOOLEAN L4 :=TRUE, L5 :=FALSE;
LOCAL NETADDRESS L6;
Chaque type de trafic dispose de ses propres déclarations obligatoires et facultatives. Les règles qui ne comportent pas les variables obligatoires ne fonctionnent pas. Les déclarations facultatives doivent disposer d'une valeur qui sert de valeur par défaut si aucune valeur n'est transmise. Le gestionnaire de trafic WAN fournit des symboles système (variables prédéfinies) à utiliser avec tous les types de trafic.
Chaque déclaration se compose de trois parties :
Les étendues valides sont répertoriées dans Tableau 93.
Tableau 93. Étendues de déclarations valides
Les types valides sont répertoriés dans Tableau 94.
Tableau 94. Types de déclarations valides
Vous ne pouvez pas affecter de valeurs aux types Time et Netaddress dans la section Declaration. Si ces types ne sont associés à aucune valeur, ils en reçoivent dans les sections Selector ou Provider. Seuls les types uniques sont initialisés dans la section Declaration.
Les noms de variable sont des chaînes sans limitation de longueur dans lesquelles sont combinés des caractères alphanumériques. Étant donné que seuls les 31 premiers caractères sont utilisés, une variable doit commencer par une chaîne unique de 31 caractères. Un nom de variable doit commencer par un caractère alphabétique, sinon le symbole est interprété en tant que constante numérique.
Les noms de variables font la distinction entre les majuscules et les minuscules. Par exemple, la variable R1 est différente de la variable r1. Le caractère de soulignement (_) est autorisé dans les noms de variable.
Les valeurs d'une déclaration doivent être des constantes plutôt que des variables ou des expressions. Par conséquent, la déclaration LOCAL INT L2 := L3; n'est pas autorisée. Une valeur d'initialisation de variable dans la section Declaration peut être modifiée dans les sections Selector et Provider de la règle.
La section Selector d'une règle commence par le mot-clé SELECTOR et se termine par le mot-clé END. Les sections Selector sont évaluées afin de déterminer la règle chargée à utiliser.
Les sections Selector de toutes les règles actuellement chargées sont exécutées afin d'identifier la règle prioritaire. Lors de cette évaluation, la section retourne une priorité comprise entre 0 et 100. Une priorité 0 signifie que la règle ne doit pas être utilisée. Une priorité comprise entre 1 et 99 signifie que la règle est utilisée si aucune autre ne présente une valeur supérieure. Enfin, une priorité 100 signifie que la règle doit impérativement être utilisée.
Le résultat d'une section Selector est indiqué dans une déclaration RETURN. Si aucune déclaration RETURN n'est générée, le système retourne par défaut une valeur nulle. Vous trouverez ci-dessous un exemple de section Selector :
SELECTOR
RETURN 49;
END
Lorsque les sections Selector de différentes règles sont évaluées, plusieurs règles peuvent retourner la même valeur. Dans ce cas, il est impossible de déterminer la règle sélectionnée. Lorsqu'aucun autre élément ne les distingue, une règle de serveur est prioritaire par rapport à une règle WAN.
Pour plus d'informations sur la rédaction des déclarations, reportez-vous à Blocs utilisés au sein de sections de règles. Voir aussi Section Provider.
La section Provider commence par le mot-clé PROVIDER et se termine par le mot-clé END. Le corps de la section Provider se compose d'une liste de déclarations.
Cette liste de déclarations doit générer une valeur indiquant l'opération suggérée pour la règle (SEND ou DONT_SEND).
Les résultats d'une section Provider sont fournis dans une déclaration RETURN. Si aucune déclaration RETURN n'est générée, la valeur par défaut SEND est retournée.
Vous trouverez ci-dessous un exemple de section Provider :
PROVIDER
RETURN SEND;
END
Pour plus d'informations sur la rédaction des déclarations, reportez-vous à Blocs utilisés au sein de sections de règles.
Sauf indication contraire, les instructions et blocs suivants peuvent être utilisés dans les sections Selector et Provider d'une règle WAN. Pour plus d'informations sur la façon dont sont utilisés les blocs dans la section Declaration d'une règle, consultez Section Declaration.
Vous pouvez indiquer des commentaires en plaçant le signe /* au début de la ligne et le signe */ à la fin. Par exemple :
/* Ceci est un commentaire. */
Vous pouvez également signaler les commentaires en insérant les symboles // à la fin d'une ligne, juste avant les commentaires. Par exemple :
IF L2 > L3 THEN //Ceci est un commentaire.
Les instructions IF-THEN permettent de définir les conditions qui détermineront l'exécution d'un bloc de déclarations.
Exemples :
IF expression_booléenne THEN déclarations
END
IF expression_booléenne THEN déclarations
ELSE déclarations
END
IF expression_booléenne THEN déclarations
ELSIF expression_booléenne THEN déclarations
END
Il s'agit de la première clause d'une instruction IF-THEN. Une évaluation permet de savoir si l'expression booléenne est TRUE ou FALSE. Si elle est TRUE, les déclarations qui la suivent sont exécutées. Si elle est FALSE, le processus passe directement à la déclaration ELSE, ELSIF ou END suivante.
Cette déclaration marque le début des déclarations exécutées lorsque toutes les instructions IF-THEN et ELSIF qui précèdent sont FALSE. Par exemple :
IF expression_booléenne THEN instructions
ELSIF expression_booléenne THEN instructions
ELSIF expression_booléenne THEN instructions
ELSE instructions
END
L'expression booléenne est évaluée si la déclaration IF-THEN qui précède est FALSE. Une évaluation permet de savoir si la déclaration ELSIF est TRUE ou FALSE. Si elle est TRUE, les déclarations qui la suivent sont exécutées. Si elle est FALSE, le processus passe directement à la déclaration ELSE, ELSIF ou END suivante. Par exemple :
IF expression_booléenne THEN instructions
ELSIF expression_booléenne THEN instructions
ELSIF expression_booléenne THEN instructions
END
La déclaration END met fin à un bloc IF-THEN.
La commande RETURN fournit les résultats des sections Selector et Provider.
Dans une section Selector, la déclaration RETURN fournit l'entier qui définit la priorité de la règle. La commande RETURN assigne à une règle une priorité comprise entre 0 et 100. Une priorité 0 signifie que la règle ne doit pas être utilisée. Une priorité comprise entre 1 et 99 signifie que la règle est utilisée si aucune autre ne présente une valeur supérieure. Enfin, une priorité 100 signifie que la règle doit impérativement être utilisée. Si aucune déclaration RETURN n'est générée dans aucune section Selector, le système retourne par défaut une valeur nulle.
La déclaration doit obligatoirement se terminer par un point-virgule. Par exemple :
RETURN 49;
RETURN L2;
RETURN 39+7;
Dans une section Provider, la déclaration RETURN fournit le résultat SEND ou DONT_SEND. Si aucune déclaration RETURN n'est générée, la valeur par défaut SEND est retournée.
La déclaration doit obligatoirement se terminer par un point-virgule. Par exemple :
RETURN SEND;
RETURN DONT_SEND;
RETURN L1;
La déclaration d'assignation modifie la valeur d'un symbole à l'aide des caractères :=. La variable définie par l'utilisateur ou par le système est indiquée en premier, suivie du signe := et de la valeur, de la variable ou de l'opération. La déclaration d'assignation doit se terminer par un point-virgule. Par exemple :
variable.champ:=expression; variable:=expression;
t1 et t2 sont du type TIME, i1 et i2 du type INTEGER, et b1 et b2 sont des assignations booléennes valides :
t1 := t2;
b1 := t1 < t2;
i1 := t1.mday - 15;
b2 := t2.year < 2000
Assignations non valides :
b1 := 10 < i2 < 12;
(10 < i2) est booléenne. Or une valeur BOOLEAN ne peut pas être comparée à une valeur INTEGER.
Vous pouvez utiliser b1 := (10 < i2) AND (i2 < 12); à la place. Par exemple :
b2 := i1;
b2 est de type BOOLEAN et i1, de type INTEGER. Il s'agit donc de types incompatibles.
Vous pouvez utiliser b2 := i1 > 0; à la place.
Le système procède à une vérification stricte du type. Vous n'êtes pas autorisé à assigner une valeur INT à une variable TIME.
Vous pouvez inclure des opérateurs arithmétiques dans des déclarations d'assignation, des déclarations RETURN ou des blocs IF. Les opérateurs valides sont les suivants :
Les opérateurs arithmétiques vous permettent uniquement d'utiliser des variables de type INT. N'utilisez pas de variables de type TIME, NETADDRESS et BOOLEAN dans des expressions arithmétiques.
Évitez de procéder à des opérations générant un résultat inférieur à -2147483648 ou supérieur à +2147483648. Évitez également les divisions par zéro.
Vous pouvez utiliser les opérateurs relationnels dans des blocs IF. Les opérateurs valides sont les suivants :
Tous les opérateurs relationnels peuvent être utilisés avec les variables de type TIME et INT. Vous pouvez également utiliser < > et = avec des variables de type NET ADDRESS et BOOLEAN.
Les opérateurs valides sont les suivants :
Vous pouvez utiliser des opérateurs de bits sur des variables de type INT afin de retourner un entier. Les opérateurs valides sont les suivants :
Les règles de priorité suivantes sont respectées lors du traitement d'expressions complexes. Les opérateurs présentant le même niveau de priorité sont traités de gauche à droite. L'ordre respecté est le suivant :
Si vous n'êtes pas sûr de l'ordre de priorité, utilisez des parenthèses. Par exemple, si les valeurs A, B et C sont des entiers ou des variables, la combinaison A<B<C n'est pas autorisée. A<B retourne une valeur booléenne, et non un entier. Cette valeur ne peut donc pas être comparée à l'entier C. En revanche, la syntaxe de l'instruction (A<B) AND (B<C) est correcte.
Vous pouvez utiliser les déclarations PRINT pour envoyer du texte et des symboles vers l'écran d'affichage du gestionnaire de trafic WAN du serveur et dans le fichier journal.
Les instructions PRINT peuvent comporter autant d'arguments que nécessaire. Il peut s'agir de chaînes de constantes, de noms de symboles ou de membres, d'entiers ou de valeurs booléennes, séparés par des virgules.
Les chaînes de constantes doivent figurer entre guillemets (""). Les déclarations PRINT doivent se terminer par un point-virgule (;). Par exemple :
PRINT "INT=",10,"BOOL=",TRUE,"SYM=",R1;
Les variables TIME et NETADDRESS utilisent des déclarations PRINT formatées. Les symboles TIME sont imprimés de la manière suivante :
m:j:a h:m
Les variables NETADDRESS sont imprimées de la manière suivante :
Type longueur données
Type peut être IP ou IPX, longueur désigne le nombre d'octets et données correspondent à la chaîne d'adresse hexadécimale.