aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2020-03-10 21:59:31 +0000
committerHarald Welte <laforge@osmocom.org>2020-03-10 21:59:31 +0000
commit92e55269f4d1bcf8e2a13e6047702dd3f5b6520b (patch)
tree5c0dabbeae53124d5a1512f481e3c1cbdf0c6a45
parent979d79872a27130609967d303b32f59aed26b7f4 (diff)
-rwxr-xr-xmncc_mt_loadgen.py89
1 files changed, 79 insertions, 10 deletions
diff --git a/mncc_mt_loadgen.py b/mncc_mt_loadgen.py
index 021d619..4858a73 100755
--- a/mncc_mt_loadgen.py
+++ b/mncc_mt_loadgen.py
@@ -10,6 +10,15 @@
# Licensed under GNU General Public License, Version 2 or at your
# option, any later version.
+
+"""
+Usage:
+
+ ./mncc_mt_loadgen.py [<nr-of-calls> [<ramp-time>]]
+"""
+
+
+
RTPSOURCE_CTRL_IP = "127.0.0.1"
RTPSOURCE_CTRL_PORT = 11111
@@ -137,7 +146,8 @@ class MTCallRtpsource(pykka.ThreadingActor):
# MSC+MGW informs us of the PLMN side IP/port
mncc_rtp_ind = message['rtp']
# tell external rtpsourc to connect to this address
- r = self.ctrl_act.ask({'type':'rtp_connect', 'cname':self.callref,
+ if True:
+ r = self.ctrl_act.ask({'type':'rtp_connect', 'cname':self.callref,
'remote_host': int2ipstr(mncc_rtp_ind.ip),
'remote_port': mncc_rtp_ind.port,
'payload_type':3})
@@ -150,10 +160,30 @@ class MTCallRtpsource(pykka.ThreadingActor):
# Call FSM has reached the NULL state again (call terminated)
# on_stop() will clean up the RTP connection at rtpsource
self.stop()
-
+ elif message['type'] == 'msisdn_called':
+ return self.msisdn_called
+
+established_calls = []
+
+def release(nr=None):
+ global established_calls
+ if nr is None:
+ nr = len(established_calls)
+ for i in reversed(range(len(established_calls))):
+ call = established_calls[i]
+ if nr < 1:
+ break
+ try:
+ call.release()
+ nr -= 1
+ except pykka.exceptions.ActorDeadError:
+ pass
+ del established_calls[i]
+ time.sleep(1)
# capture SIGINT (Ctrl+C) and stop all actors
def sigint_handler(signum, frame):
+ release()
pykka.ActorRegistry.stop_all()
sys.exit(0)
@@ -172,24 +202,63 @@ rtpctrl_act = RtpSourceCtrlActor.start(RTPSOURCE_CTRL_IP, RTPSOURCE_CTRL_PORT)
# convenience wrapper
def mt_call(msisdn_called, msisdn_calling = '123456789', codecs = GSM48.AllCodecs):
+ global established_calls
call_conn = MTCallRtpsource.start(mncc_act, rtpctrl_act, codecs).proxy()
call_conn.start_call(msisdn_called, msisdn_calling)
+ established_calls.append(call_conn)
+ log.info('established: %d' % len(established_calls))
return call_conn
+def sanitize_established_calls():
+ global established_calls
+ dead = []
+ for i in range(len(established_calls)):
+ try:
+ established_calls[i].msisdn_called.get()
+ except pykka.exceptions.ActorDeadError:
+ dead.append(i)
+
+ for i in reversed(dead):
+ del established_calls[i]
+
+
def calls(nr, ramp=1.0):
+ global established_calls
+ sanitize_established_calls()
+ established_msisdns = [int(call.msisdn_called.get()) for call in established_calls]
+ available_msisdns = [msisdn for msisdn in range(90001, 90201) if msisdn not in established_msisdns]
+ log.info('established: %d: %r' % (len(established_msisdns), established_msisdns))
+ log.info('available: %d: %r' % (len(available_msisdns), available_msisdns))
+ if not available_msisdns:
+ log.error('no more MSISDNs available')
+ return
+
for i in range(nr):
- a = 90001 + i
- a = str(a)
+ a = str(available_msisdns[i])
print("%d: mt_call(%r)" % (i, a))
mt_call(a)
time.sleep(ramp)
-log.info("")
-log.info("")
-log.info("Start calls by typing:")
-log.info(" mt_call('90001')")
-log.info("")
-log.info("")
+
+
+if len(sys.argv) > 1:
+
+ nr_of_calls = int(sys.argv[1])
+ ramp_time = 1.0
+ if len(sys.argv) > 2:
+ ramp_time = float(sys.argv[2])
+
+ log.info("Launching %d calls with a ramp time of %.2f" % (nr_of_calls, ramp_time))
+ calls(nr_of_calls, ramp_time)
+
+else:
+
+ log.info("")
+ log.info("")
+ log.info("Start calls by typing:")
+ log.info(" mt_call('90001')")
+ log.info("")
+ log.info("")
# start a shell to enable the user to add more calls as needed
vars = globals().copy()