diff --git a/CHANGELOG.md b/CHANGELOG.md index 28ee58f..538bded 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # CHANGELOG — Set-OPS +## 2026-08-02 (suite 15) — `underlay.stp.mode` aligné sur le matériel + +`mode: mstp`, parce que c'est le mode d'usine du commutateur (`show spanning-tree` : +IEEE 802.1s, *Force Version 3*). Sur une étoile sans lien redondant, l'instance 0 de MSTP se +comporte comme un RSTP : changer de mode aurait donné le même résultat, au risque près de +toucher à un protocole qui fonctionne déjà. + +Le devis énonce désormais sa propre incertitude là où elle est : **en MSTP la priorité se +règle souvent par instance**, alors que la forme émise est globale. Le générateur le dit +plutôt que de laisser croire à une syntaxe vérifiée — `show spanning-tree` donne l'état du +protocole, jamais la forme d'entrée des commandes. + +Corrigé au passage : le commentaire de la section 6 disait « RSTP » en dur alors que le mode +est déclaré. Il le dérive. + ## 2026-08-02 (suite 14) — le spanning-tree du matériel : MSTP, actif, priorité par défaut `show spanning-tree` sur le commutateur Binardat corrige une déduction fausse et en apporte diff --git a/scripts/devis_reseau.py b/scripts/devis_reseau.py index 47447e5..af57200 100644 --- a/scripts/devis_reseau.py +++ b/scripts/devis_reseau.py @@ -174,13 +174,23 @@ def _stp_lignes(dialecte: str, mode: str, priorite: int) -> list[str]: """Mode + priorite de pont, dans la forme du dialecte. Cisco IOS parle `rapid-pvst` (RSTP par VLAN) ; les plateformes generiques parlent - `rstp` et une priorite globale. NON VERIFIE sur Binardat : a confronter au - `show running-config` du materiel, comme les `ip route`. + `rstp`/`mstp` et une priorite globale. + + FORME NON VERIFIEE : `show spanning-tree` donne l'ETAT du protocole, pas la syntaxe + d'entree. En MSTP notamment, la priorite se regle souvent PAR INSTANCE — la forme + globale ci-dessous pourrait etre refusee. A confronter a `spanning-tree ?` en mode + configuration. """ if dialecte == "cisco": return [f"spanning-tree mode {'rapid-pvst' if mode == 'rstp' else mode}", f"spanning-tree vlan 1-4094 priority {priorite}"] - return [f"spanning-tree mode {mode}", f"spanning-tree priority {priorite}"] + lignes = [f"spanning-tree mode {mode}", f"spanning-tree priority {priorite}"] + if mode == "mstp": + lignes.append(f"! ^ en MSTP, la priorite est souvent portee par une INSTANCE " + f"(ex. `spanning-tree mst 0 priority {priorite}`).") + lignes.append("! Forme a confirmer par `spanning-tree ?` ; celle-ci reprend la " + "syntaxe globale.") + return lignes def section_stp(underlay: dict | None, dialecte: str) -> list[str]: @@ -203,7 +213,7 @@ def section_stp(underlay: dict | None, dialecte: str) -> list[str]: f"! {r_nom} est le CENTRE de l'etoile : tous les chemins passent par lui.", "! On en fait le pont racine plutot que de laisser une election arbitraire", "! le decider — l'arbre logique suit alors le cablage physique.", - "! Aucun lien redondant en etoile : RSTP est un filet, pas une necessite."] + f"! Aucun lien redondant en etoile : {mode.upper()} est un filet, pas une necessite."] out += _stp_lignes(dialecte, mode, underlay_mod.STP_PRIORITE_RACINE) out += ["!", "! Les ports de bord sont declares AVEC leur interface (sections 4 et 4b),",