mirror of
https://github.com/markqvist/Reticulum.git
synced 2024-12-14 18:34:25 -05:00
Add interface scope for link-local IPv6 addresses
This commit is contained in:
parent
49dba483a9
commit
1282061701
@ -419,31 +419,29 @@ class TCPServerInterface(Interface):
|
|||||||
def get_address_for_if(name, bind_port, prefer_ipv6=False):
|
def get_address_for_if(name, bind_port, prefer_ipv6=False):
|
||||||
import RNS.vendor.ifaddr.niwrapper as netinfo
|
import RNS.vendor.ifaddr.niwrapper as netinfo
|
||||||
ifaddr = netinfo.ifaddresses(name)
|
ifaddr = netinfo.ifaddresses(name)
|
||||||
|
|
||||||
if len(ifaddr) < 1:
|
if len(ifaddr) < 1:
|
||||||
raise SystemError(f"No addresses available on specified kernel interface \"{name}\" for TCPServerInterface to bind to")
|
raise SystemError(f"No addresses available on specified kernel interface \"{name}\" for TCPServerInterface to bind to")
|
||||||
|
|
||||||
if prefer_ipv6 and netinfo.AF_INET6 in ifaddr:
|
if prefer_ipv6 and netinfo.AF_INET6 in ifaddr:
|
||||||
bind_ip = ifaddr[netinfo.AF_INET6][0]["addr"]
|
bind_ip = ifaddr[netinfo.AF_INET6][0]["addr"]
|
||||||
|
if bind_ip.lower().startswith("fe80::"):
|
||||||
|
# We'll need to add the interface as scope for link-local addresses
|
||||||
return TCPServerInterface.get_address_for_host(f"{bind_ip}%{name}", bind_port)
|
return TCPServerInterface.get_address_for_host(f"{bind_ip}%{name}", bind_port)
|
||||||
|
else:
|
||||||
|
return TCPServerInterface.get_address_for_host(bind_ip, bind_port)
|
||||||
elif netinfo.AF_INET in ifaddr:
|
elif netinfo.AF_INET in ifaddr:
|
||||||
bind_ip = ifaddr[netinfo.AF_INET][0]["addr"]
|
bind_ip = ifaddr[netinfo.AF_INET][0]["addr"]
|
||||||
return (bind_ip, bind_port)
|
return (bind_ip, bind_port)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise SystemError(f"No addresses available on specified kernel interface \"{name}\" for TCPServerInterface to bind to")
|
raise SystemError(f"No addresses available on specified kernel interface \"{name}\" for TCPServerInterface to bind to")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_address_for_host(name, bind_port):
|
def get_address_for_host(name, bind_port):
|
||||||
address_info = socket.getaddrinfo(name, bind_port, proto=socket.IPPROTO_TCP)[0]
|
address_info = socket.getaddrinfo(name, bind_port, proto=socket.IPPROTO_TCP)[0]
|
||||||
|
|
||||||
if address_info[0] == socket.AF_INET6:
|
if address_info[0] == socket.AF_INET6:
|
||||||
return (name, bind_port, address_info[4][2], address_info[4][3])
|
return (name, bind_port, address_info[4][2], address_info[4][3])
|
||||||
|
|
||||||
elif address_info[0] == socket.AF_INET:
|
elif address_info[0] == socket.AF_INET:
|
||||||
return (name, bind_port)
|
return (name, bind_port)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise SystemError(f"No suitable kernel interface available for address \"{name}\" for TCPServerInterface to bind to")
|
raise SystemError(f"No suitable kernel interface available for address \"{name}\" for TCPServerInterface to bind to")
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user