Extract IP/MPLS/IPv6 MTU from ZTE interface detail.

Plain MTU alone missed sibling values in filtered show interface output; also clear Filldown between interfaces so optional IPv6 MTU does not leak.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-09-20 11:07:18 +08:00
parent f279431c70
commit a6ea67a8bf
4 changed files with 83 additions and 3 deletions

View file

@ -18,6 +18,9 @@ _IF_HDR_RE = re.compile(
)
_DESC_RE = re.compile(r"^\s*Description:\s*(?P<desc>.*?)\s*$", re.I)
_BW_RE = re.compile(r"^\s*BW\s+(?P<bw>.+?)\s*$", re.I)
_IP_MTU_RE = re.compile(r"^\s*IP\s+MTU\s+(?P<mtu>\d+)\s+bytes", re.I)
_IPV6_MTU_RE = re.compile(r"^\s*IPv6\s+MTU\s+(?P<mtu>\d+)\s+bytes", re.I)
_MPLS_MTU_RE = re.compile(r"^\s*MPLS\s+MTU\s+(?P<mtu>\d+)\s+bytes", re.I)
_MTU_RE = re.compile(r"^\s*MTU\s+(?P<mtu>\d+)\s+bytes", re.I)
_MEDIA_RE = re.compile(r"^\s*The\s+port\s+is\s+(?P<media>\S+)", re.I)
_NEG_RE = re.compile(r"^\s*Negotiation\s+(?P<neg>\S+)", re.I)
@ -39,7 +42,10 @@ def _empty_row(iface: str) -> dict[str, Any]:
"port_media": "",
"negotiation": "",
"bw": "",
"ip_mtu": "",
"mtu": "",
"mpls_mtu": "",
"ipv6_mtu": "",
"rate_period": "",
"input_bps": "",
"output_bps": "",
@ -82,7 +88,10 @@ def _map_fsm_rows(rows: list[dict[str, Any]]) -> list[dict[str, Any]]:
"port_media": row_get(r, "PORT_MEDIA", "port_media")[:32],
"negotiation": row_get(r, "NEGOTIATION", "negotiation")[:32],
"bw": row_get(r, "BW_RAW", "bw")[:64],
"ip_mtu": row_get(r, "IP_MTU", "ip_mtu")[:16],
"mtu": row_get(r, "MTU", "mtu")[:16],
"mpls_mtu": row_get(r, "MPLS_MTU", "mpls_mtu")[:16],
"ipv6_mtu": row_get(r, "IPV6_MTU", "ipv6_mtu")[:16],
"rate_period": row_get(r, "RATE_PERIOD", "rate_period")[:16],
"input_bps": row_get(r, "INPUT_BPS", "input_bps")[:32],
"output_bps": row_get(r, "OUTPUT_BPS", "output_bps")[:32],
@ -136,6 +145,18 @@ def _hand_parse(*, raw_text: str, **_kw: Any) -> list[dict[str, Any]]:
if m:
cur["bw"] = m.group("bw").strip()[:64]
continue
m = _IP_MTU_RE.match(line)
if m:
cur["ip_mtu"] = m.group("mtu")[:16]
continue
m = _IPV6_MTU_RE.match(line)
if m:
cur["ipv6_mtu"] = m.group("mtu")[:16]
continue
m = _MPLS_MTU_RE.match(line)
if m:
cur["mpls_mtu"] = m.group("mtu")[:16]
continue
m = _MTU_RE.match(line)
if m:
cur["mtu"] = m.group("mtu")[:16]

View file

@ -223,7 +223,10 @@ _IFACE_DETAIL_FIELDS: list[FieldDef] = [
FieldDef("in_util", length=16, role="counter", display_name="In Util%"),
FieldDef("out_util", length=16, role="counter", display_name="Out Util%"),
FieldDef("bw", length=64, role="meta", display_name="BW"),
FieldDef("ip_mtu", length=16, role="meta", display_name="IP MTU"),
FieldDef("mtu", length=16, role="meta", display_name="MTU"),
FieldDef("mpls_mtu", length=16, role="meta", display_name="MPLS MTU"),
FieldDef("ipv6_mtu", length=16, role="meta", display_name="IPv6 MTU"),
FieldDef("ifindex", length=32, role="meta", display_name="ifindex"),
FieldDef("description", length=256, role="meta", display_name="描述"),
FieldDef("port_media", length=32, role="meta", display_name="Media"),