diff --git a/package/mcd/mcd.hash b/package/mcd/mcd.hash index d8575d93..2c504841 100644 --- a/package/mcd/mcd.hash +++ b/package/mcd/mcd.hash @@ -1,2 +1,2 @@ -sha256 dcd639c77689c432e84e63267202c00958fb1032e066ae355e3cbc68d9fcd063 mcd-2.3.tar.gz +sha256 896c455c1a013a153cbf3186b5f87b7a3344b8939603c0f09e534de714a32e65 mcd-2.4.tar.gz sha256 99a0480db163445c5a1a5bf7f85bc37cbb5be8c40e9e441291ad78e8d4252d0b LICENSE diff --git a/package/mcd/mcd.mk b/package/mcd/mcd.mk index 77fa3693..b8478d0b 100644 --- a/package/mcd/mcd.mk +++ b/package/mcd/mcd.mk @@ -4,7 +4,7 @@ # ################################################################################ -MCD_VERSION = 2.3 +MCD_VERSION = 2.4 MCD_SITE = https://github.com/kernelkit/mcd/releases/download/v$(MCD_VERSION) MCD_LICENSE = BSD-3-Clause MCD_LICENSE_FILES = LICENSE diff --git a/src/confd/yang/confd.inc b/src/confd/yang/confd.inc index 83bea27e..a3c64651 100644 --- a/src/confd/yang/confd.inc +++ b/src/confd/yang/confd.inc @@ -47,7 +47,7 @@ MODULES=( "ieee802-ethernet-interface@2019-06-21.yang" "infix-ethernet-interface@2024-02-27.yang" "infix-factory-default@2023-06-28.yang" - "infix-interfaces@2026-04-09.yang -e vlan-filtering" + "infix-interfaces@2026-04-29.yang -e vlan-filtering" "ietf-crypto-types -e cleartext-symmetric-keys" "infix-crypto-types@2026-02-14.yang" "ietf-keystore -e symmetric-keys" diff --git a/src/confd/yang/confd/infix-if-bridge.yang b/src/confd/yang/confd/infix-if-bridge.yang index c3af782c..3e4d32a2 100644 --- a/src/confd/yang/confd/infix-if-bridge.yang +++ b/src/confd/yang/confd/infix-if-bridge.yang @@ -29,6 +29,11 @@ submodule infix-if-bridge { contact "kernelkit@googlegroups.com"; description "Linux bridge extension for ietf-interfaces."; + revision 2026-04-29 { + description "Add operational state for multicast router ports per bridge."; + reference "internal"; + } + revision 2025-10-28 { description "Prevent IP addresses on bridge ports."; reference "internal"; @@ -389,6 +394,12 @@ submodule infix-if-bridge { } default 125; } + + leaf-list router-ports { + config false; + description "Ports with detected multicast routers, learned by IGMP/MLD snooping."; + type if:interface-ref; + } } } diff --git a/src/confd/yang/confd/infix-if-bridge@2025-10-28.yang b/src/confd/yang/confd/infix-if-bridge@2026-04-29.yang similarity index 100% rename from src/confd/yang/confd/infix-if-bridge@2025-10-28.yang rename to src/confd/yang/confd/infix-if-bridge@2026-04-29.yang diff --git a/src/confd/yang/confd/infix-interfaces.yang b/src/confd/yang/confd/infix-interfaces.yang index 0ace0fe2..03c9c8a6 100644 --- a/src/confd/yang/confd/infix-interfaces.yang +++ b/src/confd/yang/confd/infix-interfaces.yang @@ -41,6 +41,11 @@ module infix-interfaces { contact "kernelkit@googlegroups.com"; description "Linux bridge and lag extensions for ietf-interfaces."; + revision 2026-04-29 { + description "Add operational state for multicast router ports per bridge."; + reference "internal"; + } + revision 2026-04-09 { description "Add ptp-capabilities submodule for per-interface PTP timestamping info."; reference "internal"; diff --git a/src/confd/yang/confd/infix-interfaces@2026-04-09.yang b/src/confd/yang/confd/infix-interfaces@2026-04-29.yang similarity index 100% rename from src/confd/yang/confd/infix-interfaces@2026-04-09.yang rename to src/confd/yang/confd/infix-interfaces@2026-04-29.yang diff --git a/src/statd/python/yanger/ietf_interfaces/bridge.py b/src/statd/python/yanger/ietf_interfaces/bridge.py index 3c3bbd8c..218962ba 100644 --- a/src/statd/python/yanger/ietf_interfaces/bridge.py +++ b/src/statd/python/yanger/ietf_interfaces/bridge.py @@ -218,6 +218,13 @@ def mctl(ifname, vid, mctldata): return {} +def mctl_router_ports(brname, mctldata): + for entry in mctldata.get("multicast-router-ports", []): + if entry.get("bridge") == brname: + return entry.get("ports", []) + return [] + + def multicast_filters(iplink, vid): filt = ["dev", iplink["ifname"]] + (["vid", str(vid)] if vid else []) brmdb = HOST.run_json(["bridge", "-j", "mdb", "show"] + filt)[0]["mdb"] @@ -253,6 +260,9 @@ def multicast(iplink, info, mctldata): if interval := mctlq.get("interval"): mcast["query-interval"] = interval + if ports := mctl_router_ports(iplink["ifname"], mctldata): + mcast["router-ports"] = ports + return mcast