Aller au contenu principal

8.2.2. Finite State Machine (Machine à états finis)

8.2.2. Finite State Machine (Machine à états finis)

État Idle (Inactif) :

  Initialement, la FSM de pair BGP est dans l'état Idle. Ci-après, la FSM de pair BGP sera raccourcie en FSM BGP.

Dans cet état, la FSM BGP refuse toutes les connexions BGP entrantes pour ce pair. Aucune ressource n'est allouée au pair. En réponse à un événement ManualStart (Événement 1) ou un événement AutomaticStart (Événement 3), le système local :

- initialise toutes les ressources BGP pour la connexion de pair,

- définit ConnectRetryCounter à zéro,

- démarre le ConnectRetryTimer avec la valeur initiale,

- initie une connexion TCP vers l'autre pair BGP,

- écoute une connexion qui peut être initiée par le pair BGP distant, et

- change son état en Connect.

L'événement ManualStop (Événement 2) et l'événement AutomaticStop (Événement 8) sont ignorés dans l'état Idle.

En réponse à un événement ManualStart_with_PassiveTcpEstablishment (Événement 4) ou un événement AutomaticStart_with_PassiveTcpEstablishment (Événement 5), le système local :

- initialise toutes les ressources BGP,

- définit le ConnectRetryCounter à zéro,

- démarre le ConnectRetryTimer avec la valeur initiale,

- écoute une connexion qui peut être initiée par le pair distant, et

- change son état en Active.

La valeur exacte du ConnectRetryTimer est une question locale, mais elle DEVRAIT (SHOULD) être suffisamment grande pour permettre l'initialisation TCP.

Si l'attribut DampPeerOscillations est défini à TRUE, les trois événements supplémentaires suivants peuvent se produire dans l'état Idle :

- AutomaticStart_with_DampPeerOscillations (Événement 6),

- AutomaticStart_with_DampPeerOscillations_and_
PassiveTcpEstablishment (Événement 7),

- IdleHoldTimer_Expires (Événement 13).

Lors de la réception de ces 3 événements, le système local utilisera ces événements pour empêcher les oscillations de pairs. La méthode pour empêcher l'oscillation de pairs persistante est hors du champ d'application de ce document.

Tout autre événement (Événements 9-12, 15-28) reçu dans l'état Idle n'entraîne pas de changement dans l'état du système local.

État Connect (Connexion) :

  Dans cet état, la FSM BGP attend que la connexion TCP soit terminée.

Les événements de démarrage (Événements 1, 3-7) sont ignorés dans l'état Connect.

En réponse à un événement ManualStop (Événement 2), le système local :

- abandonne la connexion TCP,

- libère toutes les ressources BGP,

- définit ConnectRetryCounter à zéro,

- arrête le ConnectRetryTimer et définit ConnectRetryTimer à zéro, et

- change son état en Idle.

En réponse à l'événement ConnectRetryTimer_Expires (Événement 9), le système local :

- abandonne la connexion TCP,

- redémarre le ConnectRetryTimer,

- arrête le DelayOpenTimer et réinitialise le temporisateur à zéro,

- initie une connexion TCP vers l'autre pair BGP,

- continue d'écouter une connexion qui peut être initiée par le pair BGP distant, et

- reste dans l'état Connect.

Si l'événement DelayOpenTimer_Expires (Événement 12) se produit dans l'état Connect, le système local :

- envoie un message OPEN à son pair,

- définit le HoldTimer à une grande valeur, et

- change son état en OpenSent.

Si la FSM BGP reçoit un événement TcpConnection_Valid (Événement 14), la connexion TCP est traitée et la connexion reste dans l'état Connect.

Si la FSM BGP reçoit un événement Tcp_CR_Invalid (Événement 15), le système local rejette la connexion TCP et la connexion reste dans l'état Connect.

Si la connexion TCP réussit (Événement 16 ou Événement 17), le système local vérifie l'attribut DelayOpen avant le traitement. Si l'attribut DelayOpen est défini à TRUE, le système local :

- arrête le ConnectRetryTimer (s'il est en cours d'exécution) et définit le ConnectRetryTimer à zéro,

- définit le DelayOpenTimer à la valeur initiale, et

- reste dans l'état Connect.

Si l'attribut DelayOpen est défini à FALSE, le système local :

- arrête le ConnectRetryTimer (s'il est en cours d'exécution) et définit le ConnectRetryTimer à zéro,

- termine l'initialisation BGP

- envoie un message OPEN à son pair,

- définit le HoldTimer à une grande valeur, et

- change son état en OpenSent.

Une valeur HoldTimer de 4 minutes est suggérée.

Si la connexion TCP échoue (Événement 18), le système local vérifie le DelayOpenTimer. Si le DelayOpenTimer est en cours d'exécution, le système local :

- redémarre le ConnectRetryTimer avec la valeur initiale,

- arrête le DelayOpenTimer et réinitialise sa valeur à zéro,

- continue d'écouter une connexion qui peut être initiée par le pair BGP distant, et

- change son état en Active.

Si le DelayOpenTimer n'est pas en cours d'exécution, le système local :

- arrête le ConnectRetryTimer à zéro,

- abandonne la connexion TCP,

- libère toutes les ressources BGP, et

- change son état en Idle.

Si un message OPEN est reçu pendant que le DelayOpenTimer est en cours d'exécution (Événement 20), le système local :

- arrête le ConnectRetryTimer (s'il est en cours d'exécution) et définit le ConnectRetryTimer à zéro,

- termine l'initialisation BGP,

- arrête et efface le DelayOpenTimer (définit la valeur à zéro),

- envoie un message OPEN,

- envoie un message KEEPALIVE,

- si la valeur initiale du HoldTimer est non nulle,

- démarre le KeepaliveTimer avec la valeur initiale et

- réinitialise le HoldTimer à la valeur négociée,

sinon, si la valeur initiale du HoldTimer est zéro,

- réinitialise le KeepaliveTimer et

- réinitialise la valeur du HoldTimer à zéro,

- et change son état en OpenConfirm.

Si la valeur du champ de système autonome est la même que le numéro de système autonome local, définissez le statut de connexion sur une connexion interne ; sinon, ce sera "externe".

Si la vérification de l'en-tête de message BGP (Événement 21) ou la vérification du message OPEN détecte une erreur (Événement 22) (voir Section 6.2), le système local :

- (optionnellement) Si l'attribut SendNOTIFICATIONwithoutOPEN est défini à TRUE, alors le système local envoie d'abord un message NOTIFICATION avec le code d'erreur approprié, puis

- arrête le ConnectRetryTimer (s'il est en cours d'exécution) et définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si un message NOTIFICATION est reçu avec une erreur de version (Événement 24), le système local vérifie le DelayOpenTimer. Si le DelayOpenTimer est en cours d'exécution, le système local :

- arrête le ConnectRetryTimer (s'il est en cours d'exécution) et définit le ConnectRetryTimer à zéro,

- arrête et réinitialise le DelayOpenTimer (définit à zéro),

- libère toutes les ressources BGP,

- abandonne la connexion TCP, et

- change son état en Idle.

Si le DelayOpenTimer n'est pas en cours d'exécution, le système local :

- arrête le ConnectRetryTimer et définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à True, et

- change son état en Idle.

En réponse à tout autre événement (Événements 8, 10-11, 13, 19, 23, 25-28), le système local :

- si le ConnectRetryTimer est en cours d'exécution, arrête et réinitialise le ConnectRetryTimer (définit à zéro),

- si le DelayOpenTimer est en cours d'exécution, arrête et réinitialise le DelayOpenTimer (définit à zéro),

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à True, et

- change son état en Idle.

État Active :

  Dans cet état, la FSM BGP tente d'acquérir un pair en écoutant et en acceptant une connexion TCP.

Les événements de démarrage (Événements 1, 3-7) sont ignorés dans l'état Active.

En réponse à un événement ManualStop (Événement 2), le système local :

- Si le DelayOpenTimer est en cours d'exécution et que l'attribut de session SendNOTIFICATIONwithoutOPEN est défini, le système local envoie une NOTIFICATION avec un Cease,

- libère toutes les ressources BGP, y compris l'arrêt du DelayOpenTimer

- abandonne la connexion TCP,

- définit ConnectRetryCounter à zéro,

- arrête le ConnectRetryTimer et définit le ConnectRetryTimer à zéro, et

- change son état en Idle.

En réponse à un événement ConnectRetryTimer_Expires (Événement 9), le système local :

- redémarre le ConnectRetryTimer (avec la valeur initiale),

- initie une connexion TCP vers l'autre pair BGP,

- continue d'écouter une connexion TCP qui peut être initiée par un pair BGP distant, et

- change son état en Connect.

Si le système local reçoit un événement DelayOpenTimer_Expires (Événement 12), le système local :

- définit le ConnectRetryTimer à zéro,

- arrête et efface le DelayOpenTimer (définit à zéro),

- termine l'initialisation BGP,

- envoie le message OPEN à son pair distant,

- définit son temporisateur de maintien à une grande valeur, et

- change son état en OpenSent.

Une valeur HoldTimer de 4 minutes est également suggérée pour cette transition d'état.

Si le système local reçoit un événement TcpConnection_Valid (Événement 14), le système local traite les drapeaux de connexion TCP et reste dans l'état Active.

Si le système local reçoit un événement Tcp_CR_Invalid (Événement 15), le système local rejette la connexion TCP et reste dans l'état Active.

En réponse au succès d'une connexion TCP (Événement 16 ou Événement 17), le système local vérifie l'attribut optionnel DelayOpen avant le traitement.

Si l'attribut DelayOpen est défini à TRUE, le système local :

- arrête le ConnectRetryTimer et définit le ConnectRetryTimer à zéro,

- définit le DelayOpenTimer à la valeur initiale (DelayOpenTime), et

- reste dans l'état Active.

Si l'attribut DelayOpen est défini à FALSE, le système local :

- définit le ConnectRetryTimer à zéro,

- termine l'initialisation BGP,

- envoie le message OPEN à son pair,

- définit son HoldTimer à une grande valeur, et

- change son état en OpenSent.

Une valeur HoldTimer de 4 minutes est suggérée comme "grande valeur" pour le HoldTimer.

Si le système local reçoit un événement TcpConnectionFails (Événement 18), le système local :

- redémarre le ConnectRetryTimer (avec la valeur initiale),

- arrête et efface le DelayOpenTimer (définit la valeur à zéro),

- libère toutes les ressources BGP,

- incrémente le ConnectRetryCounter de 1,

- effectue optionnellement l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si un message OPEN est reçu et que le DelayOpenTimer est en cours d'exécution (Événement 20), le système local :

- arrête le ConnectRetryTimer (s'il est en cours d'exécution) et définit le ConnectRetryTimer à zéro,

- arrête et efface le DelayOpenTimer (définit à zéro),

- termine l'initialisation BGP,

- envoie un message OPEN,

- envoie un message KEEPALIVE,

- si la valeur du HoldTimer est non nulle,

- démarre le KeepaliveTimer à la valeur initiale,

- réinitialise le HoldTimer à la valeur négociée,

sinon si le HoldTimer est zéro

- réinitialise le KeepaliveTimer (définit à zéro),

- réinitialise le HoldTimer à zéro, et

- change son état en OpenConfirm.

Si la valeur du champ de système autonome est la même que le numéro de système autonome local, définissez le statut de connexion sur une connexion interne ; sinon, ce sera externe.

Si la vérification de l'en-tête de message BGP (Événement 21) ou la vérification du message OPEN détecte une erreur (Événement 22) (voir Section 6.2), le système local :

- (optionnellement) envoie un message NOTIFICATION avec le code d'erreur approprié si l'attribut SendNOTIFICATIONwithoutOPEN est défini à TRUE,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si un message NOTIFICATION est reçu avec une erreur de version (Événement 24), le système local vérifie le DelayOpenTimer. Si le DelayOpenTimer est en cours d'exécution, le système local :

- arrête le ConnectRetryTimer (s'il est en cours d'exécution) et définit le ConnectRetryTimer à zéro,

- arrête et réinitialise le DelayOpenTimer (définit à zéro),

- libère toutes les ressources BGP,

- abandonne la connexion TCP, et

- change son état en Idle.

Si le DelayOpenTimer n'est pas en cours d'exécution, le système local :

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

En réponse à tout autre événement (Événements 8, 10-11, 13, 19, 23, 25-28), le système local :

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de un,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

OpenSent :

  Dans cet état, la FSM BGP attend un message OPEN de son pair.

Les événements de démarrage (Événements 1, 3-7) sont ignorés dans l'état OpenSent.

Si un événement ManualStop (Événement 2) est émis dans l'état OpenSent, le système local :

- envoie la NOTIFICATION avec un Cease,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- définit le ConnectRetryCounter à zéro, et

- change son état en Idle.

Si un événement AutomaticStop (Événement 8) est émis dans l'état OpenSent, le système local :

- envoie la NOTIFICATION avec un Cease,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si le HoldTimer_Expires (Événement 10), le système local :

- envoie un message NOTIFICATION avec le code d'erreur Hold Timer Expired,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si un événement TcpConnection_Valid (Événement 14), Tcp_CR_Acked (Événement 16) ou TcpConnectionConfirmed (Événement 17) est reçu, une deuxième connexion TCP peut être en cours. Cette deuxième connexion TCP est suivie selon le traitement de collision de connexion (Section 6.8) jusqu'à ce qu'un message OPEN soit reçu.

Une demande de connexion TCP pour un port invalide (Tcp_CR_Invalid (Événement 15)) est ignorée.

Si un événement TcpConnectionFails (Événement 18) est reçu, le système local :

- ferme la connexion BGP,

- redémarre le ConnectRetryTimer,

- continue d'écouter une connexion qui peut être initiée par le pair BGP distant, et

- change son état en Active.

Lorsqu'un message OPEN est reçu, tous les champs sont vérifiés pour l'exactitude. S'il n'y a pas d'erreurs dans le message OPEN (Événement 19), le système local :

- réinitialise le DelayOpenTimer à zéro,

- définit le ConnectRetryTimer BGP à zéro,

- envoie un message KEEPALIVE, et

- définit un KeepaliveTimer (via le texte ci-dessous)

- définit le HoldTimer selon la valeur négociée (voir Section 4.2),

- change son état en OpenConfirm.

Si la valeur de temps de maintien négociée est zéro, alors le HoldTimer et le KeepaliveTimer ne sont pas démarrés. Si la valeur du champ Système autonome est la même que le numéro de système autonome local, alors la connexion est une connexion "interne" ; sinon, c'est une connexion "externe". (Cela aura un impact sur le traitement UPDATE comme décrit ci-dessous.)

Si la vérification de l'en-tête de message BGP (Événement 21) ou la vérification du message OPEN détecte une erreur (Événement 22)(voir Section 6.2), le système local :

- envoie un message NOTIFICATION avec le code d'erreur approprié,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est TRUE, et

- change son état en Idle.

Les mécanismes de détection de collision (Section 6.8) doivent être appliqués lorsqu'un message BGP OPEN valide est reçu (Événement 19 ou Événement 20). Veuillez vous référer à la Section 6.8 pour les détails de la comparaison.

Un événement CollisionDetectDump se produit lorsque l'implémentation BGP détermine, par des moyens hors du champ d'application de ce document, qu'une collision de connexion s'est produite.

Si une connexion dans l'état OpenSent est déterminée comme étant la connexion qui doit être fermée, un OpenCollisionDump (Événement 23) est signalé à la machine à états. Si un tel événement est reçu dans l'état OpenSent, le système local :

- envoie une NOTIFICATION avec un Cease,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si un message NOTIFICATION est reçu avec une erreur de version (Événement 24), le système local :

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP, et

- change son état en Idle.

En réponse à tout autre événement (Événements 9, 11-13, 20, 25-28), le système local :

- envoie la NOTIFICATION avec le code d'erreur Finite State Machine Error,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

État OpenConfirm :

  Dans cet état, BGP attend un message KEEPALIVE ou NOTIFICATION.

Tout événement de démarrage (Événements 1, 3-7) est ignoré dans l'état OpenConfirm.

En réponse à un événement ManualStop (Événement 2) initié par l'opérateur, le système local :

- envoie le message NOTIFICATION avec un Cease,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- définit le ConnectRetryCounter à zéro,

- définit le ConnectRetryTimer à zéro, et

- change son état en Idle.

En réponse à l'événement AutomaticStop initié par le système (Événement 8), le système local :

- envoie le message NOTIFICATION avec un Cease,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si l'événement HoldTimer_Expires (Événement 10) se produit avant qu'un message KEEPALIVE ne soit reçu, le système local :

- envoie le message NOTIFICATION avec le code d'erreur Hold Timer Expired,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si le système local reçoit un événement KeepaliveTimer_Expires (Événement 11), le système local :

- envoie un message KEEPALIVE,

- redémarre le KeepaliveTimer, et

- reste dans l'état OpenConfirmed.

En cas d'événement TcpConnection_Valid (Événement 14) ou de succès d'une connexion TCP (Événement 16 ou Événement 17) pendant OpenConfirm, le système local doit suivre la deuxième connexion.

Si une connexion TCP est tentée avec un port invalide (Événement 15), le système local ignorera la deuxième tentative de connexion.

Si le système local reçoit un événement TcpConnectionFails (Événement 18) du TCP sous-jacent ou un message NOTIFICATION (Événement 25), le système local :

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si le système local reçoit un message NOTIFICATION avec une erreur de version (NotifMsgVerErr (Événement 24)), le système local :

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP, et

- change son état en Idle.

Si le système local reçoit un message OPEN valide (BGPOpen (Événement 19)), la fonction de détection de collision est traitée selon la Section 6.8. Si cette connexion doit être abandonnée en raison d'une collision de connexion, le système local :

- envoie une NOTIFICATION avec un Cease,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP (envoie TCP FIN),

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si un message OPEN est reçu, tous les champs sont vérifiés pour l'exactitude. Si la vérification de l'en-tête de message BGP (BGPHeaderErr (Événement 21)) ou la vérification du message OPEN détecte une erreur (voir Section 6.2) (BGPOpenMsgErr (Événement 22)), le système local :

- envoie un message NOTIFICATION avec le code d'erreur approprié,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si, lors du traitement d'un autre message OPEN, l'implémentation BGP détermine, par un moyen hors du champ d'application de ce document, qu'une collision de connexion s'est produite et que cette connexion doit être fermée, le système local émettra un événement OpenCollisionDump (Événement 23). Lorsque le système local reçoit un événement OpenCollisionDump (Événement 23), le système local :

- envoie une NOTIFICATION avec un Cease,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si le système local reçoit un message KEEPALIVE (KeepAliveMsg (Événement 26)), le système local :

- redémarre le HoldTimer et

- change son état en Established.

En réponse à tout autre événement (Événements 9, 12-13, 20, 27-28), le système local :

- envoie une NOTIFICATION avec un code de Finite State Machine Error,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

État Established (Établi) :

  Dans l'état Established, la FSM BGP peut échanger des messages UPDATE, NOTIFICATION et KEEPALIVE avec son pair.

Tout événement de démarrage (Événements 1, 3-7) est ignoré dans l'état Established.

En réponse à un événement ManualStop (initié par un opérateur) (Événement 2), le système local :

- envoie le message NOTIFICATION avec un Cease,

- définit le ConnectRetryTimer à zéro,

- supprime toutes les routes associées à cette connexion,

- libère les ressources BGP,

- abandonne la connexion TCP,

- définit le ConnectRetryCounter à zéro, et

- change son état en Idle.

En réponse à un événement AutomaticStop (Événement 8), le système local :

- envoie une NOTIFICATION avec un Cease,

- définit le ConnectRetryTimer à zéro

- supprime toutes les routes associées à cette connexion,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Une raison pour un événement AutomaticStop est : Un BGP reçoit des messages UPDATE avec un nombre de préfixes pour un pair donné tel que le total de préfixes reçus dépasse le nombre maximum de préfixes configuré. Le système local déconnecte automatiquement le pair.

Si l'événement HoldTimer_Expires se produit (Événement 10), le système local :

- envoie un message NOTIFICATION avec le code d'erreur Hold Timer Expired,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si l'événement KeepaliveTimer_Expires se produit (Événement 11), le système local :

- envoie un message KEEPALIVE, et

- redémarre son KeepaliveTimer, sauf si la valeur HoldTime négociée est zéro.

Chaque fois que le système local envoie un message KEEPALIVE ou UPDATE, il redémarre son KeepaliveTimer, sauf si la valeur HoldTime négociée est zéro.

Un TcpConnection_Valid (Événement 14), reçu pour un port valide, fera suivre la deuxième connexion.

Une connexion TCP invalide (événement Tcp_CR_Invalid (Événement 15)) sera ignorée.

En réponse à une indication que la connexion TCP est établie avec succès (Événement 16 ou Événement 17), la deuxième connexion DOIT (SHALL) être suivie jusqu'à ce qu'elle envoie un message OPEN.

Si un message OPEN valide (BGPOpen (Événement 19)) est reçu et si l'attribut optionnel CollisionDetectEstablishedState est TRUE, le message OPEN sera vérifié pour voir s'il entre en collision (Section 6.8) avec une autre connexion. Si l'implémentation BGP détermine que cette connexion doit être terminée, elle traitera un événement OpenCollisionDump (Événement 23). Si cette connexion doit être terminée, le système local :

- envoie une NOTIFICATION avec un Cease,

- définit le ConnectRetryTimer à zéro,

- supprime toutes les routes associées à cette connexion,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si le DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

Si le système local reçoit un message NOTIFICATION (Événement 24 ou Événement 25) ou un TcpConnectionFails (Événement 18) du TCP sous-jacent, le système local :

- définit le ConnectRetryTimer à zéro,

- supprime toutes les routes associées à cette connexion,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- change son état en Idle.

Si le système local reçoit un message KEEPALIVE (Événement 26), le système local :

- redémarre son HoldTimer, si la valeur HoldTime négociée est non nulle, et

- reste dans l'état Established.

Si le système local reçoit un message UPDATE (Événement 27), le système local :

- traite le message,

- redémarre son HoldTimer, si la valeur HoldTime négociée est non nulle, et

- reste dans l'état Established.

Si le système local reçoit un message UPDATE et que la procédure de gestion des erreurs de message UPDATE (voir Section 6.3) détecte une erreur (Événement 28), le système local :

- envoie un message NOTIFICATION avec une erreur Update,

- définit le ConnectRetryTimer à zéro,

- supprime toutes les routes associées à cette connexion,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.

En réponse à tout autre événement (Événements 9, 12-13, 20-22), le système local :

- envoie un message NOTIFICATION avec le code d'erreur Finite State Machine Error,

- supprime toutes les routes associées à cette connexion,

- définit le ConnectRetryTimer à zéro,

- libère toutes les ressources BGP,

- abandonne la connexion TCP,

- incrémente le ConnectRetryCounter de 1,

- (optionnellement) effectue l'amortissement des oscillations de pairs si l'attribut DampPeerOscillations est défini à TRUE, et

- change son état en Idle.