Chapitre 9 : Gestion des erreurs

9.1 Modèle de gestion des erreurs

La gestion des erreurs de DTP suit un modèle en trois phases « Détecter-Notifier-Récupérer » :

  1. Détecter : identifier les conditions anormales
  2. Notifier : envoyer les informations d'erreur au pair distant ou à la couche supérieure
  3. Récupérer : prendre des mesures de récupération en fonction du type d'erreur

9.2 Système de codes d'erreur

DTP définit un code d'erreur unique pour chaque type d'erreur, réparti en huit plages par module fonctionnel :

Catégorie d'erreurPlage de codesStratégie de traitement
Erreurs de traitement de trame1xxxRejeter la trame + notifier l'émetteur + journaliser
Erreurs de chiffrement2xxxRejeter la trame + notifier l'émetteur + peut déclencher une renégociation de clé
Erreurs d'Agreement3xxxRejeter le Fragment + notifier l'émetteur + peut déclencher une renégociation
Erreurs DAG4xxxRejeter le Fragment + notifier l'émetteur, ou mettre en cache et attendre
Erreurs de session5xxxTenter la récupération de session + en cas d'échec, fermer et notifier la couche supérieure
Erreurs de reprise6xxxSuspendre l'envoi + notifier l'application de couche supérieure
Erreurs de version7xxxEnvoyer une notification d'incompatibilité de version + tenter une rétrogradation
Erreurs de permission8xxxRejeter l'opération + notifier le demandeur

9.3 Référence des codes d'erreur

Erreurs de traitement de trame (1xxx)

Code d'erreurNomDescription
1001FRAME_DESERIALIZATION_FAILEDÉchec de la désérialisation de la trame
1002FRAME_INVALID_FORMATFormat de trame invalide

Erreurs de chiffrement (2xxx)

Code d'erreurNomDescription
2001DECRYPTION_FAILEDÉchec du déchiffrement du Payload
2002KEY_NOT_READYClé non prête (CAP non terminé)

Erreurs d'Agreement (3xxx)

Code d'erreurNomDescription
3001AGREEMENT_NOT_FOUNDAgreement non trouvé
3002AGREEMENT_EXPIREDAgreement expiré
3003AGREEMENT_NEGOTIATION_FAILEDÉchec de la négociation de l'Agreement

Erreurs DAG (4xxx)

Code d'erreurNomDescription
4001DAG_CYCLE_DETECTEDCycle DAG détecté
4002DAG_DEPENDENCY_UNRESOLVEDDépendance DAG non résolue

Erreurs de session (5xxx)

Code d'erreurNomDescription
5001SESSION_NOT_FOUNDSession non trouvée
5002SESSION_TIMEOUTTimeout de session
5003SESSION_RESTORE_FAILEDÉchec de la restauration de session

Erreurs de reprise (6xxx)

Code d'erreurNomDescription
6001BUFFER_FULLCache plein
6002RETRANSMISSION_TIMEOUTTimeout de retransmission

Erreurs de version (7xxx)

Code d'erreurNomDescription
7001VERSION_INCOMPATIBLEVersion incompatible

Erreurs de permission (8xxx)

Code d'erreurNomDescription
8001PERMISSION_DENIEDPermission refusée
8002OBSERVER_WRITE_DENIEDOpération d'écriture de l'observateur refusée

9.4 Mécanisme de notification d'erreur

Les notifications d'erreur sont transmises via des trames de contrôle (Control Frames), contenant les informations suivantes :

ChampDescription
errorCodeCode d'erreur
errorMessageMessage de description de l'erreur
relatedFrameIdID de la trame ayant déclenché l'erreur (optionnel)
relatedAgreementIdID de l'Agreement associé (optionnel)
detailsDétails supplémentaires (optionnel)

9.5 Scénarios d'erreur clés

Échec de désérialisation

Lorsqu'un LogicalFrame reçu ne peut pas être correctement désérialisé :

  1. Rejeter la trame
  2. Envoyer une notification d'erreur FRAME_DESERIALIZATION_FAILED (1001) à l'émetteur

Échec de déchiffrement

Lorsque le payload d'un LogicalFrame reçu ne peut pas être correctement déchiffré :

  1. Rejeter la trame
  2. Envoyer une notification d'erreur DECRYPTION_FAILED (2001) à l'émetteur
  3. Si les échecs consécutifs dépassent le seuil, déclencher une renégociation de clé CAP

Détection de cycle DAG

Lorsque les relations de dépendance déclarées d'un Fragment formeraient un cycle dans le DAG :

  1. Rejeter le Fragment
  2. Renvoyer une erreur DAG_CYCLE_DETECTED (4001)

Agreement inconnu

Lorsqu'un Fragment référence un Agreement_ID qui n'existe pas chez le récepteur :

  1. Rejeter le Fragment
  2. Renvoyer une erreur AGREEMENT_NOT_FOUND (3001)

Clé non prête

Lorsqu'une tentative d'envoi de données est effectuée mais que l'échange de clés CAP n'est pas encore terminé :

  1. Refuser l'envoi
  2. Renvoyer une erreur KEY_NOT_READY (2002) à l'appelant de couche supérieure

Cache plein

Lorsque le cache de Fragments non acquittés de l'émetteur atteint sa limite de capacité :

  1. Suspendre l'envoi de nouveaux Fragments
  2. Envoyer une notification BUFFER_FULL (6001) à l'application de couche supérieure

Violation de privilège d'observateur

Lorsqu'un observateur tente d'initier une requête ou de modifier un agreement :

  1. Rejeter l'opération
  2. Renvoyer une erreur OBSERVER_WRITE_DENIED (8002)