From 6382409194a05509600f6d08d0b9c3580cd571cd Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Thu, 19 Aug 2021 19:56:35 +0200 Subject: [PATCH] Added config options for UDP interface binding to network interface instead of IP. --- RNS/Interfaces/UDPInterface.py | 18 +++++++++++++++++- RNS/Reticulum.py | 22 ++++++++++++++++++---- setup.py | 2 +- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/RNS/Interfaces/UDPInterface.py b/RNS/Interfaces/UDPInterface.py index 622b43f..ab2622e 100644 --- a/RNS/Interfaces/UDPInterface.py +++ b/RNS/Interfaces/UDPInterface.py @@ -1,18 +1,34 @@ from .Interface import Interface import socketserver import threading +import netifaces import socket import time import sys import RNS + class UDPInterface(Interface): - def __init__(self, owner, name, bindip=None, bindport=None, forwardip=None, forwardport=None): + @staticmethod + def get_address_for_if(name): + return netifaces.ifaddresses(name)[netifaces.AF_INET][0]['addr'] + + def get_broadcast_for_if(name): + return netifaces.ifaddresses(name)[netifaces.AF_INET][0]['broadcast'] + + def __init__(self, owner, name, device=None, bindip=None, bindport=None, forwardip=None, forwardport=None): self.IN = True self.OUT = False self.name = name + if device != None: + if bindip == None: + bindip = UDPInterface.get_broadcast_for_if(device) + if forwardip == None: + forwardip = UDPInterface.get_broadcast_for_if(device) + + if (bindip != None and bindport != None): self.receives = True self.bind_ip = bindip diff --git a/RNS/Reticulum.py b/RNS/Reticulum.py index fec65a5..68d9741 100755 --- a/RNS/Reticulum.py +++ b/RNS/Reticulum.py @@ -217,13 +217,27 @@ class Reticulum: try: if ("interface_enabled" in c) and c.as_bool("interface_enabled") == True: if c["type"] == "UDPInterface": + device = c["device"] if "device" in c else None + port = int(c["port"]) if "port" in c else None + listen_ip = c["listen_ip"] if "listen_ip" in c else None + listen_port = int(c["listen_port"]) if "listen_port" in c else None + forward_ip = c["forward_ip"] if "forward_ip" in c else None + forward_port = int(c["forward_port"]) if "forward_port" in c else None + + if port != None: + if listen_port == None: + listen_port = port + if forward_port == None: + forward_port = port + interface = UDPInterface.UDPInterface( RNS.Transport, name, - c["listen_ip"], - int(c["listen_port"]), - c["forward_ip"], - int(c["forward_port"]) + device, + listen_ip, + listen_port, + forward_ip, + forward_port ) if "outgoing" in c and c.as_bool("outgoing") == True: diff --git a/setup.py b/setup.py index a4a1deb..868f8ea 100644 --- a/setup.py +++ b/setup.py @@ -20,6 +20,6 @@ setuptools.setup( "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], - install_requires=['cryptography>=3.4.7', 'pyserial'], + install_requires=['cryptography>=3.4.7', 'pyserial', 'netifaces>=0.10.4'], python_requires='>=3.5', ) \ No newline at end of file