From 2d6cf2f9489c67a5cbf69ee0a4d7bc408f792da5 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Mon, 15 Jun 2026 19:35:27 +0000 Subject: [PATCH] [dualtor]: Add IPv6-only mux control-plane support Signed-off-by: Jing Zhang --- src/linkmgrd | 2 +- src/sonic-config-engine/minigraph.py | 13 +++---- .../tests/test_minigraph_case.py | 35 +++++++++++++++++++ src/sonic-platform-daemons | 2 +- 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/linkmgrd b/src/linkmgrd index 65f563308c6..2b496935e0a 160000 --- a/src/linkmgrd +++ b/src/linkmgrd @@ -1 +1 @@ -Subproject commit 65f563308c689e3225fdf3fc249a132350e9879b +Subproject commit 2b496935e0a42263c19a72cd137af5117ececa42 diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 7b49b8b3042..de7f06f8d81 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -2830,13 +2830,14 @@ def get_mux_cable_entries(ports, mux_cable_ports, active_active_ports, neighbors neighbor = neighbors[port]['name'] entry['state'] = 'auto' - if devices[neighbor]['lo_addr'] is not None: + if devices[neighbor]['lo_addr'] is not None or devices[neighbor].get('lo_addr_v6') is not None: # Always force a /32 prefix for server IPv4 loopbacks - server_ipv4_lo_addr = devices[neighbor]['lo_addr'].split("/")[0] - server_ipv4_lo_prefix = ipaddress.ip_network(UNICODE_TYPE(server_ipv4_lo_addr)) - entry['server_ipv4'] = str(server_ipv4_lo_prefix) + if devices[neighbor]['lo_addr'] is not None: + server_ipv4_lo_addr = devices[neighbor]['lo_addr'].split("/")[0] + server_ipv4_lo_prefix = ipaddress.ip_network(UNICODE_TYPE(server_ipv4_lo_addr)) + entry['server_ipv4'] = str(server_ipv4_lo_prefix) - if 'lo_addr_v6' in devices[neighbor] and devices[neighbor]['lo_addr_v6'] is not None: + if devices[neighbor].get('lo_addr_v6') is not None: server_ipv6_lo_addr = devices[neighbor]['lo_addr_v6'].split('/')[0] server_ipv6_lo_prefix = ipaddress.ip_network(UNICODE_TYPE(server_ipv6_lo_addr)) entry['server_ipv6'] = str(server_ipv6_lo_prefix) @@ -2847,7 +2848,7 @@ def get_mux_cable_entries(ports, mux_cable_ports, active_active_ports, neighbors mux_cable_table[port] = entry else: - print("Warning: no server IPv4 loopback found for {}, skipping mux cable table entry".format(neighbor), file=sys.stderr) + print("Warning: no server loopback found for {}, skipping mux cable table entry".format(neighbor), file=sys.stderr) return mux_cable_table diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index 65cf01ec42a..b319425947f 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -445,6 +445,41 @@ def test_minigraph_mux_cable_table(self): expected_table ) + def test_get_mux_cable_entries_ipv6_only_active_active(self): + mux_cable_table = minigraph.get_mux_cable_entries( + ports=['Ethernet8'], + mux_cable_ports=[], + active_active_ports={ + 'Ethernet8': { + 'soc_ipv6': 'fc02:1000::3/128' + } + }, + neighbors={ + 'Ethernet8': { + 'name': 'server01' + } + }, + devices={ + 'server01': { + 'lo_addr': None, + 'lo_addr_v6': 'fc02:1000::2/128' + } + }, + redundancy_type='mixed' + ) + + self.assertEqual( + mux_cable_table, + { + 'Ethernet8': { + 'state': 'auto', + 'server_ipv6': 'fc02:1000::2/128', + 'soc_ipv6': 'fc02:1000::3/128', + 'cable_type': 'active-active' + } + } + ) + def test_dhcp_table(self): argument = ['-m', self.sample_graph, '-p', self.port_config, '-v', "DHCP_RELAY"] expected = { diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index 7215cc9cb52..2d1ba237eea 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit 7215cc9cb52978eda3b28ac16a007375362ac57a +Subproject commit 2d1ba237eea5817ceb47e5b93eaf8b4b2b6b0e59