[PATCH] osmocom-bb[fixeria/trx]: trx_toolkit: Add cmdline arg to set bind addr

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Pau Espin Pedrol gerrit-no-reply at lists.osmocom.org
Wed Mar 21 13:32:09 UTC 2018


Hello Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/7410

to look at the new patch set (#2).

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 bidning is force din fake_trx to B, then everthing's fine.

Change-Id: I7be18fef40967fb7551f4115f22cbbd9cdb0840d
---
M src/target/trx_toolkit/burst_gen.py
M src/target/trx_toolkit/burst_send.py
M src/target/trx_toolkit/clck_gen.py
M src/target/trx_toolkit/ctrl_cmd.py
M src/target/trx_toolkit/ctrl_if_bb.py
M src/target/trx_toolkit/ctrl_if_bts.py
M src/target/trx_toolkit/fake_trx.py
M src/target/trx_toolkit/udp_link.py
8 files changed, 58 insertions(+), 36 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/10/7410/2

diff --git a/src/target/trx_toolkit/burst_gen.py b/src/target/trx_toolkit/burst_gen.py
index 4bc036e..4d6ecda 100755
--- a/src/target/trx_toolkit/burst_gen.py
+++ b/src/target/trx_toolkit/burst_gen.py
@@ -39,6 +39,7 @@
 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 @@
 	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 @@
 			 "  -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 @@
 			 "     --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 @@
 	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 @@
 				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 7405c90..b354df0 100755
--- a/src/target/trx_toolkit/burst_send.py
+++ b/src/target/trx_toolkit/burst_send.py
@@ -37,6 +37,7 @@
 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 @@
 	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 @@
 		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 @@
 			 "  --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 @@
 	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 @@
 				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 4b86c31..b488770 100755
--- a/src/target/trx_toolkit/clck_gen.py
+++ b/src/target/trx_toolkit/clck_gen.py
@@ -102,7 +102,7 @@
 		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 0791f85..e2ee0f1 100755
--- a/src/target/trx_toolkit/ctrl_cmd.py
+++ b/src/target/trx_toolkit/ctrl_cmd.py
@@ -36,6 +36,7 @@
 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 @@
 		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 @@
 			 "  -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 @@
 	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 @@
 
 			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 a1ccd0d..3de14ef 100644
--- a/src/target/trx_toolkit/ctrl_if_bb.py
+++ b/src/target/trx_toolkit/ctrl_if_bb.py
@@ -32,8 +32,8 @@
 	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 231641a..1488617 100644
--- a/src/target/trx_toolkit/ctrl_if_bts.py
+++ b/src/target/trx_toolkit/ctrl_if_bts.py
@@ -33,8 +33,8 @@
 	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 1fcd3df..18b7414 100755
--- a/src/target/trx_toolkit/fake_trx.py
+++ b/src/target/trx_toolkit/fake_trx.py
@@ -42,6 +42,7 @@
 	# 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 @@
 
 	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 @@
 		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 @@
 		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 @@
 			 "  -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 @@
 			 "  --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 @@
 	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 @@
 			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 56d9c37..b378b63 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

-- 
To view, visit https://gerrit.osmocom.org/7410
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I7be18fef40967fb7551f4115f22cbbd9cdb0840d
Gerrit-PatchSet: 2
Gerrit-Project: osmocom-bb
Gerrit-Branch: fixeria/trx
Gerrit-Owner: Pau Espin Pedrol <pespin at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Vadim Yanitskiy <axilirator at gmail.com>
Gerrit-Reviewer: fixeria <axilirator at gmail.com>



More information about the gerrit-log mailing list