From 3c4a567e82cc599c2e02c4abc2508f4d79b66a5b Mon Sep 17 00:00:00 2001 From: "Kirill A. Korinsky" Date: Sat, 22 Jun 2024 23:53:23 +0100 Subject: [PATCH] Enable dual-stack on all platform with exception for OpenBSD --- src/aioquic/asyncio/client.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/aioquic/asyncio/client.py b/src/aioquic/asyncio/client.py index 211ae36c..0511414b 100644 --- a/src/aioquic/asyncio/client.py +++ b/src/aioquic/asyncio/client.py @@ -1,7 +1,8 @@ import asyncio import socket +import sys from contextlib import asynccontextmanager -from typing import AsyncGenerator, Callable, Optional, cast +from typing import AsyncGenerator, Callable, Optional, Tuple, Union, cast from ..quic.configuration import QuicConfiguration from ..quic.connection import QuicConnection, QuicTokenHandler @@ -59,12 +60,25 @@ async def connect( token_handler=token_handler, ) + # OpenBSD well known to not support dual-stack + dual_stack = not sys.platform.startswith("openbsd") + + # Use AI_ADDRCONFIG on platforms which doesn't support dual-stack + flags = 0 + if not dual_stack: + flags = socket.AI_ADDRCONFIG + # lookup remote address - infos = await loop.getaddrinfo(host, port, type=socket.SOCK_DGRAM, flags=socket.AI_ADDRCONFIG) + infos = await loop.getaddrinfo(host, port, type=socket.SOCK_DGRAM, flags=flags) + local_tuple: Union[Tuple[str, int], Tuple[str, int, int, int]] addr = infos[0][4] # addr is 2-tuple for AF_INET and 4-tuple for AF_INET6 - if len(addr) == 2: + if dual_stack and len(addr) == 2: + addr = ("::ffff:" + addr[0], addr[1], 0, 0) + local_tuple = ("::", local_port, 0, 0) + sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) + elif len(addr) == 2: local_tuple = ("0.0.0.0", local_port) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) elif len(addr) == 4: @@ -75,6 +89,8 @@ async def connect( completed = False try: + if dual_stack: + sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) sock.bind(local_tuple) completed = True finally: