|
14 | 14 | import prefs |
15 | 15 | import config |
16 | 16 |
|
| 17 | +def get_ipv6_addr_tuple(addr, port): |
| 18 | + """ |
| 19 | + Returns appropriate tuple for IPv6 socket bind/connect/sendto. |
| 20 | + Python 3.13+ requires 4-tuple (host, port, flowinfo, scope_id) for |
| 21 | + link-local addresses. This format is backward compatible with older Python. |
| 22 | + """ |
| 23 | + if '%' in addr: |
| 24 | + ip_part, scope_name = addr.split('%', 1) |
| 25 | + scope_id = socket.if_nametoindex(scope_name) |
| 26 | + else: |
| 27 | + ip_part = addr |
| 28 | + scope_id = 0 |
| 29 | + return (ip_part, port, 0, scope_id) |
| 30 | + |
17 | 31 | class RegRequest(): |
18 | 32 | def __init__(self, ident, hostname, ip_info, port, auth_port, api_version): |
19 | 33 | self.api_version = api_version |
@@ -142,10 +156,12 @@ def request(self): |
142 | 156 | remote_ip, _, ip_version = self.ip_info.get_usable_ip() |
143 | 157 |
|
144 | 158 | try: |
145 | | - ip = remote_ip if ip_version == socket.AF_INET else "[%s]" % (remote_ip,) |
146 | 159 | server_sock = socket.socket(ip_version, socket.SOCK_DGRAM) |
147 | 160 | server_sock.settimeout(5.0) |
148 | | - server_sock.sendto(REQUEST, (ip, self.port)) |
| 161 | + if ip_version == socket.AF_INET6: |
| 162 | + server_sock.sendto(REQUEST, get_ipv6_addr_tuple(remote_ip, self.port)) |
| 163 | + else: |
| 164 | + server_sock.sendto(REQUEST, (remote_ip, self.port)) |
149 | 165 |
|
150 | 166 | reply, addr = server_sock.recvfrom(2000) |
151 | 167 |
|
@@ -182,7 +198,10 @@ def serve_cert_thread(self, ip_version): |
182 | 198 | try: |
183 | 199 | server_sock = socket.socket(ip_version, socket.SOCK_DGRAM) |
184 | 200 | server_sock.settimeout(1.0) |
185 | | - server_sock.bind((local_ip, self.port)) |
| 201 | + if ip_version == socket.AF_INET6: |
| 202 | + server_sock.bind(get_ipv6_addr_tuple(local_ip, self.port)) |
| 203 | + else: |
| 204 | + server_sock.bind((local_ip, self.port)) |
186 | 205 | except socket.error as e: |
187 | 206 | logging.critical("Could not create udp socket for cert requests: %s" % str(e)) |
188 | 207 | return |
|
0 commit comments