From 55afe0072b435a0d9abc2db934ec9f17d4fb07dd Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Wed, 21 Mar 2018 13:46:34 +0100 Subject: trx_toolkit: Add cmdline arg to set bind addr Previous hardcoded default of 0.0.0.0 was inappropiate in some scenarios, as it sets the SRC addr of the packets sent through the socket based on the routing. For instance, if iface IF1 has assigned two IP addresses A and B, A being the first addr of the interface, and osmo-bts-trx is configured with "osmotrx ip local A" and "osmotrx ip remote B", the following happens: CMD POWER OFF src=A:5801 dst=B:5701 RSP POWER OFF src=A:5701 dst=A:5701 <-- A is assigned as src addr. But osmo-bts-trx is waiting for packets from B:5701, and the packet is dropped with ICMP Unreachable. If addr binding is forced in fake_trx to B, then everthing's fine. Let's extend the UDPLink in order to allow manual, but optional setting of bind address, and add a corresponding cmdline argument to all executables. Change-Id: I7be18fef40967fb7551f4115f22cbbd9cdb0840d --- src/target/trx_toolkit/burst_gen.py | 17 +++++++++++------ src/target/trx_toolkit/burst_send.py | 17 +++++++++++------ src/target/trx_toolkit/clck_gen.py | 2 +- src/target/trx_toolkit/ctrl_cmd.py | 13 +++++++++---- src/target/trx_toolkit/ctrl_if_bb.py | 4 ++-- src/target/trx_toolkit/ctrl_if_bts.py | 4 ++-- src/target/trx_toolkit/fake_trx.py | 33 ++++++++++++++++++++------------- src/target/trx_toolkit/udp_link.py | 4 ++-- 8 files changed, 58 insertions(+), 36 deletions(-) (limited to 'src/target/trx_toolkit') diff --git a/src/target/trx_toolkit/burst_gen.py b/src/target/trx_toolkit/burst_gen.py index 4bc036ea..d83f1378 100755 --- a/src/target/trx_toolkit/burst_gen.py +++ b/src/target/trx_toolkit/burst_gen.py @@ -39,6 +39,7 @@ from data_msg import * class Application: # Application variables remote_addr = "127.0.0.1" + bind_addr = "0.0.0.0" base_port = 5700 conn_mode = "TRX" output_file = None @@ -70,11 +71,11 @@ class Application: def run(self): # Init DATA interface with TRX or L1 if self.conn_mode == "TRX": - self.data_if = DATAInterface(self.remote_addr, - self.base_port + 2, self.base_port + 102) + self.data_if = DATAInterface(self.remote_addr, self.base_port + 2, + self.bind_addr, self.base_port + 102) elif self.conn_mode == "L1": - self.data_if = DATAInterface(self.remote_addr, - self.base_port + 102, self.base_port + 2) + self.data_if = DATAInterface(self.remote_addr, self.base_port + 102, + self.bind_addr, self.base_port + 2) # Init random burst generator burst_gen = RandBurstGen() @@ -149,6 +150,7 @@ class Application: " -o --output-file Write bursts to a capture file\n" \ " -m --conn-mode Send bursts to: TRX (default) / L1\n" \ " -r --remote-addr Set remote address (default %s)\n" \ + " -b --bind-addr Set local address (default %s)\n" \ " -p --base-port Set base port number (default %d)\n\n" s += " Burst generation\n" \ @@ -161,7 +163,7 @@ class Application: " --toa Set ToA in symbols (default random)\n" \ " --toa256 Set ToA in 1/256 symbol periods\n" - print(s % (self.remote_addr, self.base_port)) + print(s % (self.remote_addr, self.bind_addr, self.base_port)) if msg is not None: print(msg) @@ -169,12 +171,13 @@ class Application: def parse_argv(self): try: opts, args = getopt.getopt(sys.argv[1:], - "o:m:r:p:b:c:f:t:h", + "o:m:r:b:p:b:c:f:t:h", [ "help", "output-file=" "conn-mode=", "remote-addr=", + "bind-addr=", "base-port=", "burst-type=", "burst-count=", @@ -200,6 +203,8 @@ class Application: self.conn_mode = v elif o in ("-r", "--remote-addr"): self.remote_addr = v + elif o in ("-b", "--bind-addr"): + self.bind_addr = v elif o in ("-p", "--base-port"): self.base_port = int(v) diff --git a/src/target/trx_toolkit/burst_send.py b/src/target/trx_toolkit/burst_send.py index 7405c901..f6c85ba0 100755 --- a/src/target/trx_toolkit/burst_send.py +++ b/src/target/trx_toolkit/burst_send.py @@ -37,6 +37,7 @@ from data_msg import * class Application: # Application variables remote_addr = "127.0.0.1" + bind_addr = "0.0.0.0" base_port = 5700 conn_mode = "TRX" @@ -65,12 +66,12 @@ class Application: def run(self): # Init DATA interface with TRX or L1 if self.conn_mode == "TRX": - self.data_if = DATAInterface(self.remote_addr, - self.base_port + 2, self.base_port + 102) + self.data_if = DATAInterface(self.remote_addr, self.base_port + 2, + self.bind_addr, self.base_port + 102) l12trx = True elif self.conn_mode == "L1": - self.data_if = DATAInterface(self.remote_addr, - self.base_port + 102, self.base_port + 2) + self.data_if = DATAInterface(self.remote_addr, self.base_port + 102, + self.bind_addr, self.base_port + 2) l12trx = False else: self.print_help("[!] Unknown connection type") @@ -124,6 +125,7 @@ class Application: s += " TRX interface specific\n" \ " -m --conn-mode Send bursts to: TRX (default) / L1\n" \ " -r --remote-addr Set remote address (default %s)\n" \ + " -b --bind-addr Set bind address (default %s)\n" \ " -p --base-port Set base port number (default %d)\n\n" s += " Burst source\n" \ @@ -138,7 +140,7 @@ class Application: " --frame-num-lt NUM TDMA frame number lower than NUM\n" \ " --frame-num-gt NUM TDMA frame number greater than NUM\n" - print(s % (self.remote_addr, self.base_port)) + print(s % (self.remote_addr, self.bind_addr, self.base_port)) if msg is not None: print(msg) @@ -146,11 +148,12 @@ class Application: def parse_argv(self): try: opts, args = getopt.getopt(sys.argv[1:], - "m:r:p:i:h", + "m:r:b:p:i:h", [ "help", "conn-mode=", "remote-addr=", + "bind-addr=", "base-port=", "capture-file=", "msg-skip=", @@ -177,6 +180,8 @@ class Application: self.conn_mode = v elif o in ("-r", "--remote-addr"): self.remote_addr = v + elif o in ("-b", "--bind-addr"): + self.bind_addr = v elif o in ("-p", "--base-port"): self.base_port = int(v) diff --git a/src/target/trx_toolkit/clck_gen.py b/src/target/trx_toolkit/clck_gen.py index 4b86c31a..b488770e 100755 --- a/src/target/trx_toolkit/clck_gen.py +++ b/src/target/trx_toolkit/clck_gen.py @@ -102,7 +102,7 @@ class Application: signal.signal(signal.SIGINT, self.sig_handler) def run(self): - self.link = UDPLink("127.0.0.1", 5800, 5700) + self.link = UDPLink("127.0.0.1", 5800, "0.0.0.0", 5700) self.clck = CLCKGen([self.link], ind_period = 51) self.clck.start() diff --git a/src/target/trx_toolkit/ctrl_cmd.py b/src/target/trx_toolkit/ctrl_cmd.py index 0791f85c..e56105a8 100755 --- a/src/target/trx_toolkit/ctrl_cmd.py +++ b/src/target/trx_toolkit/ctrl_cmd.py @@ -36,6 +36,7 @@ from udp_link import UDPLink class Application: # Application variables remote_addr = "127.0.0.1" + bind_addr = "0.0.0.0" base_port = 5700 bind_port = 0 fuzzing = False @@ -48,8 +49,8 @@ class Application: signal.signal(signal.SIGINT, self.sig_handler) # Init UDP connection - self.ctrl_link = UDPLink(self.remote_addr, - self.base_port + 1, self.bind_port) + self.ctrl_link = UDPLink(self.remote_addr, self.base_port + 1, + self.bind_addr, self.bind_port) # Debug print print("[i] Init CTRL interface (%s)" \ @@ -64,9 +65,10 @@ class Application: " -r --remote-addr Set remote address (default %s)\n" \ " -p --base-port Set base port number (default %d)\n" \ " -P --bind-port Set local port number (default: random)\n" \ + " -b --bind-addr Set local address (default %s)\n" \ " -f --fuzzing Send raw payloads (without CMD)\n" \ - print(s % (self.remote_addr, self.base_port)) + print(s % (self.remote_addr, self.base_port, self.bind_addr)) if msg is not None: print(msg) @@ -74,12 +76,13 @@ class Application: def parse_argv(self): try: opts, args = getopt.getopt(sys.argv[1:], - "r:p:P:fh", + "r:p:P:b:fh", [ "help", "fuzzing", "base-port=", "bind-port=", + "bind-addr=", "remote-addr=", ]) except getopt.GetoptError as err: @@ -93,6 +96,8 @@ class Application: elif o in ("-r", "--remote-addr"): self.remote_addr = v + elif o in ("-b", "--bind-addr"): + self.bind_addr = v elif o in ("-p", "--base-port"): self.base_port = int(v) elif o in ("-P", "--bind-port"): diff --git a/src/target/trx_toolkit/ctrl_if_bb.py b/src/target/trx_toolkit/ctrl_if_bb.py index a1ccd0d1..3de14ef7 100644 --- a/src/target/trx_toolkit/ctrl_if_bb.py +++ b/src/target/trx_toolkit/ctrl_if_bb.py @@ -32,8 +32,8 @@ class CTRLInterfaceBB(CTRLInterface): tx_freq = None pm = None - def __init__(self, remote_addr, remote_port, bind_port): - CTRLInterface.__init__(self, remote_addr, remote_port, bind_port) + def __init__(self, remote_addr, remote_port, bind_addr, bind_port): + CTRLInterface.__init__(self, remote_addr, remote_port, bind_addr, bind_port) print("[i] Init CTRL interface for BB (%s)" % self.desc_link()) def parse_cmd(self, request): diff --git a/src/target/trx_toolkit/ctrl_if_bts.py b/src/target/trx_toolkit/ctrl_if_bts.py index 231641a6..14886178 100644 --- a/src/target/trx_toolkit/ctrl_if_bts.py +++ b/src/target/trx_toolkit/ctrl_if_bts.py @@ -33,8 +33,8 @@ class CTRLInterfaceBTS(CTRLInterface): tx_freq = None pm = None - def __init__(self, remote_addr, remote_port, bind_port): - CTRLInterface.__init__(self, remote_addr, remote_port, bind_port) + def __init__(self, remote_addr, remote_port, bind_addr, bind_port): + CTRLInterface.__init__(self, remote_addr, remote_port, bind_addr, bind_port) print("[i] Init CTRL interface for BTS (%s)" % self.desc_link()) def parse_cmd(self, request): diff --git a/src/target/trx_toolkit/fake_trx.py b/src/target/trx_toolkit/fake_trx.py index 1fcd3df9..b818b2a9 100755 --- a/src/target/trx_toolkit/fake_trx.py +++ b/src/target/trx_toolkit/fake_trx.py @@ -42,6 +42,7 @@ class Application: # Application variables bts_addr = "127.0.0.1" bb_addr = "127.0.0.1" + trx_bind_addr = "0.0.0.0" bts_base_port = 5700 bb_base_port = 6700 @@ -60,12 +61,12 @@ class Application: def run(self): # Init TRX CTRL interface for BTS - self.bts_ctrl = CTRLInterfaceBTS(self.bts_addr, - self.bts_base_port + 101, self.bts_base_port + 1) + self.bts_ctrl = CTRLInterfaceBTS(self.bts_addr, self.bts_base_port + 101, + self.trx_bind_addr, self.bts_base_port + 1) # Init TRX CTRL interface for BB - self.bb_ctrl = CTRLInterfaceBB(self.bb_addr, - self.bb_base_port + 101, self.bb_base_port + 1) + self.bb_ctrl = CTRLInterfaceBB(self.bb_addr, self.bb_base_port + 101, + self.trx_bind_addr, self.bb_base_port + 1) # Power measurement emulation # Noise: -120 .. -105 @@ -77,10 +78,10 @@ class Application: self.bb_ctrl.pm = self.pm # Init DATA links - self.bts_data = UDPLink(self.bts_addr, - self.bts_base_port + 102, self.bts_base_port + 2) - self.bb_data = UDPLink(self.bb_addr, - self.bb_base_port + 102, self.bb_base_port + 2) + self.bts_data = UDPLink(self.bts_addr, self.bts_base_port + 102, + self.trx_bind_addr, self.bts_base_port + 2) + self.bb_data = UDPLink(self.bb_addr, self.bb_base_port + 102, + self.trx_bind_addr, self.bb_base_port + 2) # BTS <-> BB burst forwarding self.burst_fwd = BurstForwarder(self.bts_data, self.bb_data) @@ -94,8 +95,8 @@ class Application: self.bb_ctrl.burst_fwd = self.burst_fwd # Provide clock to BTS - self.bts_clck = UDPLink(self.bts_addr, - self.bts_base_port + 100, self.bts_base_port) + self.bts_clck = UDPLink(self.bts_addr, self.bts_base_port + 100, + self.trx_bind_addr, self.bts_base_port) self.clck_gen = CLCKGen([self.bts_clck]) self.bts_ctrl.clck_gen = self.clck_gen @@ -142,7 +143,8 @@ class Application: " -R --bts-addr Set BTS remote address (default %s)\n" \ " -r --bb-addr Set BB remote address (default %s)\n" \ " -P --bts-base-port Set BTS base port number (default %d)\n" \ - " -p --bb-base-port Set BB base port number (default %d)\n\n" + " -p --bb-base-port Set BB base port number (default %d)\n" \ + " -b --trx-bind-addr Set TRX bind address (default %s)\n\n" s += " Simulation\n" \ " --rand-dl-rssi Enable DL RSSI randomization\n" \ @@ -151,7 +153,8 @@ class Application: " --rand-ul-toa Enable UL ToA randomization\n" print(s % (self.bts_addr, self.bb_addr, - self.bts_base_port, self.bb_base_port)) + self.bts_base_port, self.bb_base_port, + self.trx_bind_addr)) if msg is not None: print(msg) @@ -159,11 +162,12 @@ class Application: def parse_argv(self): try: opts, args = getopt.getopt(sys.argv[1:], - "R:r:P:p:h", + "R:r:P:p:b:h", [ "help", "bts-addr=", "bb-addr=", "bts-base-port=", "bb-base-port=", + "trx-bind-addr=", "rand-dl-rssi", "rand-ul-rssi", "rand-dl-toa", "rand-ul-toa", ]) @@ -186,6 +190,9 @@ class Application: elif o in ("-p", "--bb-base-port"): self.bb_base_port = int(v) + elif o in ("-b", "--trx-bind-addr"): + self.trx_bind_addr = v + # Message field randomization elif o == "rand-dl-rssi": self.randomize_dl_rssi = True diff --git a/src/target/trx_toolkit/udp_link.py b/src/target/trx_toolkit/udp_link.py index 56d9c37c..b378b635 100644 --- a/src/target/trx_toolkit/udp_link.py +++ b/src/target/trx_toolkit/udp_link.py @@ -25,10 +25,10 @@ import socket class UDPLink: - def __init__(self, remote_addr, remote_port, bind_port = 0): + def __init__(self, remote_addr, remote_port, bind_addr = '0.0.0.0', bind_port = 0): self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - self.sock.bind(('0.0.0.0', bind_port)) + self.sock.bind((bind_addr, bind_port)) self.sock.setblocking(0) # Save remote info -- cgit v1.2.3