From 5d19575a846d8cc6d94bccb4e645896c0de870e6 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 18 Aug 2021 11:00:09 -0500 Subject: [PATCH] Exclude global scope IPv6 when setting up zeroconf interfaces (#54632) --- homeassistant/components/zeroconf/__init__.py | 10 +++++++--- tests/components/zeroconf/test_init.py | 12 ++++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/zeroconf/__init__.py b/homeassistant/components/zeroconf/__init__.py index a85236b6a07..6829c9c5e17 100644 --- a/homeassistant/components/zeroconf/__init__.py +++ b/homeassistant/components/zeroconf/__init__.py @@ -162,10 +162,14 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: interfaces.extend( ipv4["address"] for ipv4 in ipv4s - if not ipaddress.ip_address(ipv4["address"]).is_loopback + if not ipaddress.IPv4Address(ipv4["address"]).is_loopback ) - if adapter["ipv6"] and adapter["index"] not in interfaces: - interfaces.append(adapter["index"]) + if ipv6s := adapter["ipv6"]: + for ipv6_addr in ipv6s: + address = ipv6_addr["address"] + v6_ip_address = ipaddress.IPv6Address(address) + if not v6_ip_address.is_global and not v6_ip_address.is_loopback: + interfaces.append(ipv6_addr["address"]) aio_zc = await _async_get_instance(hass, **zc_args) zeroconf = cast(HaZeroconf, aio_zc.zeroconf) diff --git a/tests/components/zeroconf/test_init.py b/tests/components/zeroconf/test_init.py index 0db8f0f5227..a284c91e4f4 100644 --- a/tests/components/zeroconf/test_init.py +++ b/tests/components/zeroconf/test_init.py @@ -799,7 +799,14 @@ async def test_async_detect_interfaces_setting_empty_route(hass, mock_async_zero hass.bus.async_fire(EVENT_HOMEASSISTANT_STARTED) await hass.async_block_till_done() assert mock_zc.mock_calls[0] == call( - interfaces=[1, "192.168.1.5", "172.16.1.5", 3], ip_version=IPVersion.All + interfaces=[ + "2001:db8::", + "fe80::1234:5678:9abc:def0", + "192.168.1.5", + "172.16.1.5", + "fe80::dead:beef:dead:beef", + ], + ip_version=IPVersion.All, ) @@ -862,5 +869,6 @@ async def test_async_detect_interfaces_explicitly_set_ipv6(hass, mock_async_zero await hass.async_block_till_done() assert mock_zc.mock_calls[0] == call( - interfaces=["192.168.1.5", 1], ip_version=IPVersion.All + interfaces=["192.168.1.5", "fe80::dead:beef:dead:beef"], + ip_version=IPVersion.All, )