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
Review at https://gerrit.osmocom.org/2801
ofono_client: Implement network registration during connect()
Also add a new simple test to check network registration is working
Change-Id: I1ac9128563ba44f988daa5dfdc3e8c3d0d32a59d
---
M src/osmo_gsm_tester/ofono_client.py
M src/osmo_gsm_tester/osmo_msc.py
M src/osmo_gsm_tester/osmo_nitb.py
M suites/aoip_debug/interactive.py
M suites/aoip_sms/mo_mt_sms.py
M suites/debug/interactive.py
A suites/netreg/register.py
A suites/netreg/register_default.py
A suites/netreg/suite.conf
M suites/sms/mo_mt_sms.py
10 files changed, 178 insertions(+), 9 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/01/2801/1
diff --git a/src/osmo_gsm_tester/ofono_client.py b/src/osmo_gsm_tester/ofono_client.py
index 5494ec2..3ea4e20 100644
--- a/src/osmo_gsm_tester/ofono_client.py
+++ b/src/osmo_gsm_tester/ofono_client.py
@@ -20,6 +20,7 @@
from . import log, test, util, event_loop
from pydbus import SystemBus, Variant
+from threading import Thread
import time
import pprint
@@ -31,6 +32,13 @@
I_MODEM = 'org.ofono.Modem'
I_NETREG = 'org.ofono.NetworkRegistration'
I_SMS = 'org.ofono.MessageManager'
+
+# See https://github.com/intgr/ofono/blob/master/doc/network-api.txt#L78
+NETREG_ST_REGISTERED = 'registered'
+NETREG_ST_ROAMING = 'roaming'
+
+MAX_REGISTER_ATTEMPTS = 3
+
class DeferredHandling:
defer_queue = []
@@ -47,6 +55,9 @@
while DeferredHandling.defer_queue:
handler, args, kwargs = DeferredHandling.defer_queue.pop(0)
handler(*args, **kwargs)
+
+def defer(handler, *args, **kwargs):
+ DeferredHandling.defer_queue.append((handler, args, kwargs))
def dbus_connect(dbus_iface, handler):
'''This function shall be used instead of directly connecting DBus signals.
@@ -72,6 +83,19 @@
def list_modems():
root = systembus_get('/')
return sorted(root.GetModems())
+
+def dbus_async_thread(*args, **kwargs):
+ if len(args) > 2:
+ cb, dbus_method, dbus_args = args
+ res = dbus_method(dbus_args)
+ else:
+ cb, dbus_method = args
+ res = dbus_method()
+ defer(cb, res)
+
+def dbus_async_call(*args):
+ thread = Thread(target = dbus_async_thread, args = args, kwargs={})
+ thread.start()
class ModemDbusInteraction(log.Origin):
'''Work around inconveniences specific to pydbus and ofono.
@@ -255,10 +279,15 @@
self.path = conf.get('path')
self.set_name(self.path)
self.set_log_category(log.C_TST)
+ self.netreg_status = None
+ self.mnc = None
+ self.mcc = None
self.sms_received_list = []
self.dbus = ModemDbusInteraction(self.path)
+ self.register_attempts = 0
self.dbus.required_signals = {
I_SMS: ( ('IncomingMessage', self._on_incoming_message), ),
+ I_NETREG: ( ('PropertyChanged', self._on_netreg_property_changed), ),
}
self.dbus.watch_interfaces()
@@ -319,9 +348,63 @@
def ki(self):
return self.conf.get('ki')
- def connect(self, nitb):
- 'set the modem up to connect to MCC+MNC from NITB config'
- self.log('connect to', nitb)
+ def _on_netreg_property_changed(self, name, value):
+ self.dbg('%r.PropertyChanged() -> %s=%s' % (I_NETREG, name, value))
+
+ def get_netreg_status(self):
+ try:
+ self.netreg_status = self.properties(I_NETREG).get('Status')
+ except Exception:
+ self.netreg_status = None
+ return self.netreg_status
+
+ def is_roaming(self):
+ status = self.get_netreg_status()
+ return status == NETREG_ST_ROAMING
+
+ def is_connected(self):
+ status = self.get_netreg_status()
+ return status == NETREG_ST_REGISTERED or status == NETREG_ST_ROAMING
+
+ def schedule_scan_register(self):
+ if self.register_attempts > MAX_REGISTER_ATTEMPTS:
+ raise RuntimeError('Failed to find Network Operator', self.mcc, self.mnc)
+ self.register_attempts += 1
+ nr = self.dbus.interface(I_NETREG)
+ self.dbg('Scanning for operators...')
+ dbus_async_call(self.register, nr.Scan)
+
+ def register(self, ops):
+ nr = self.dbus.interface(I_NETREG)
+ if self.mcc is None or self.mnc is None:
+ if not self.is_connected():
+ self.log('Registering with the default network...')
+ nr.Register()
+ else:
+ self.log('Already registered with the network')
+ return
+ self.dbg('ops: ', ops);
+ myop = None
+ for op in ops:
+ op_path, op_prop = op
+ self.dbg('Checking operator: ', op_path, op_prop)
+ if op_prop.get('MobileCountryCode') == self.mcc and op_prop.get('MobileNetworkCode') == self.mnc:
+ if op_prop.get('Status') == 'current':
+ self.dbg('Already registered with the network')
+ # return and not try to re-connect, otherwise dbus method returns a fail
+ return
+ myop = op_path
+ break
+ if myop is None:
+ self.dbg('Failed to find Network Operator', self.mcc, self.mnc, 'attempt', self.register_attempts)
+ self.schedule_scan_register()
+ dbus_op = systembus_get(myop)
+ self.dbg('Registering with operator', myop)
+ dbus_op.Register()
+
+ def power_reset(self):
+ 'Power the modem and put it online'
+ self.dbg('Powering on')
if self.is_powered():
self.dbg('is powered')
self.set_online(False)
@@ -331,6 +414,15 @@
self.set_online()
event_loop.wait(self, self.dbus.has_interface, I_NETREG, I_SMS, timeout=10)
+ def connect(self, mcc=None, mnc=None):
+ 'Connect to MCC+MNC from NITB config'
+ self.power_reset()
+ self.log('connect to', mcc, mnc)
+ self.mcc = mcc
+ self.mnc = mnc
+ self.register_attempts = 0
+ self.schedule_scan_register()
+
def sms_send(self, to_msisdn_or_modem, *tokens):
if isinstance(to_msisdn_or_modem, Modem):
to_msisdn = to_msisdn_or_modem.msisdn
diff --git a/src/osmo_gsm_tester/osmo_msc.py b/src/osmo_gsm_tester/osmo_msc.py
index ea539d6..c3b3e5e 100644
--- a/src/osmo_gsm_tester/osmo_msc.py
+++ b/src/osmo_gsm_tester/osmo_msc.py
@@ -37,6 +37,7 @@
self.set_name('osmo-msc_%s' % ip_address.get('addr'))
self.hlr = hlr
self.mgcpgw = mgcpgw
+ self.config = None
def start(self):
self.log('Starting osmo-msc')
@@ -72,6 +73,7 @@
config.overlay(values, self.suite_run.config())
config.overlay(values, dict(msc=dict(ip_address=self.ip_address)))
config.overlay(values, self.mgcpgw.conf_for_msc())
+ self.config = values
self.dbg('MSC CONFIG:\n' + pprint.pformat(values))
@@ -83,6 +85,12 @@
def addr(self):
return self.ip_address.get('addr')
+ def mcc(self):
+ return self.config['msc']['net']['mcc']
+
+ def mnc(self):
+ return self.config['msc']['net']['mnc']
+
def subscriber_attached(self, *modems):
return self.imsi_attached(*[m.imsi() for m in modems])
diff --git a/src/osmo_gsm_tester/osmo_nitb.py b/src/osmo_gsm_tester/osmo_nitb.py
index 1bb1fcf..3d83fb0 100644
--- a/src/osmo_gsm_tester/osmo_nitb.py
+++ b/src/osmo_gsm_tester/osmo_nitb.py
@@ -76,6 +76,7 @@
for bts in self.bts:
bts_list.append(bts.conf_for_bsc())
config.overlay(values, dict(nitb=dict(net=dict(bts_list=bts_list))))
+ self.config = values
self.dbg('NITB CONFIG:\n' + pprint.pformat(values))
@@ -91,6 +92,12 @@
self.bts.append(bts)
bts.set_bsc(self)
+ def mcc(self):
+ return self.config['nitb']['net']['mcc']
+
+ def mnc(self):
+ return self.config['nitb']['net']['mnc']
+
def subscriber_add(self, modem, msisdn=None):
if msisdn is None:
msisdn = self.suite_run.resources_pool.next_msisdn(modem)
diff --git a/suites/aoip_debug/interactive.py b/suites/aoip_debug/interactive.py
index 4f56d5c..35613f4 100755
--- a/suites/aoip_debug/interactive.py
+++ b/suites/aoip_debug/interactive.py
@@ -17,7 +17,10 @@
for m in modems:
hlr.subscriber_add(m)
- m.connect(bsc)
+ m.connect(msc.mcc(), msc.mnc())
+
+for m in modems:
+ wait(m.is_connected)
while True:
cmd = prompt('Enter command: (q)uit (s)ms (g)et-registered (w)ait-registered')
diff --git a/suites/aoip_sms/mo_mt_sms.py b/suites/aoip_sms/mo_mt_sms.py
index b9383ea..828d03a 100755
--- a/suites/aoip_sms/mo_mt_sms.py
+++ b/suites/aoip_sms/mo_mt_sms.py
@@ -21,14 +21,16 @@
hlr.subscriber_add(ms_mo)
hlr.subscriber_add(ms_mt)
-ms_mo.connect(bsc)
-ms_mt.connect(bsc)
+ms_mo.connect(msc.mcc(), msc.mnc())
+ms_mt.connect(msc.mcc(), msc.mnc())
ms_mo.log_info()
ms_mt.log_info()
print('waiting for modems to attach...')
wait(msc.subscriber_attached, ms_mo, ms_mt)
+wait(ms_mo.is_connected)
+wait(ms_mt.is_connected)
sms = ms_mo.sms_send(ms_mt)
wait(ms_mt.sms_was_received, sms)
diff --git a/suites/debug/interactive.py b/suites/debug/interactive.py
index 603e395..951af4f 100755
--- a/suites/debug/interactive.py
+++ b/suites/debug/interactive.py
@@ -13,7 +13,10 @@
for m in modems:
nitb.subscriber_add(m)
- m.connect(nitb)
+ m.connect(nitb.mcc(), nitb.mnc())
+
+for m in modems:
+ wait(m.is_connected)
while True:
cmd = prompt('Enter command: (q)uit (s)ms (g)et-registered (w)ait-registered')
diff --git a/suites/netreg/register.py b/suites/netreg/register.py
new file mode 100755
index 0000000..f8f796c
--- /dev/null
+++ b/suites/netreg/register.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+from osmo_gsm_tester.test import *
+
+print('use resources...')
+nitb = suite.nitb()
+bts = suite.bts()
+ms = suite.modem()
+
+print('start nitb and bts...')
+nitb.bts_add(bts)
+nitb.start()
+bts.start()
+
+nitb.subscriber_add(ms)
+
+ms.connect(nitb.mcc(), nitb.mnc())
+
+print(ms.properties())
+
+wait(nitb.subscriber_attached, ms)
+wait(ms.is_connected)
diff --git a/suites/netreg/register_default.py b/suites/netreg/register_default.py
new file mode 100755
index 0000000..661bcec
--- /dev/null
+++ b/suites/netreg/register_default.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+from osmo_gsm_tester.test import *
+
+print('use resources...')
+nitb = suite.nitb()
+bts = suite.bts()
+ms = suite.modem()
+
+print('start nitb and bts...')
+nitb.bts_add(bts)
+nitb.start()
+bts.start()
+
+nitb.subscriber_add(ms)
+
+ms.connect()
+
+print(ms.properties())
+
+wait(nitb.subscriber_attached, ms)
+wait(ms.is_connected)
diff --git a/suites/netreg/suite.conf b/suites/netreg/suite.conf
new file mode 100644
index 0000000..1bb1dbb
--- /dev/null
+++ b/suites/netreg/suite.conf
@@ -0,0 +1,10 @@
+resources:
+ ip_address:
+ - times: 1
+ bts:
+ - times: 1
+ modem:
+ - times: 1
+
+defaults:
+ timeout: 40s
diff --git a/suites/sms/mo_mt_sms.py b/suites/sms/mo_mt_sms.py
index 860f5e7..a9a09f6 100755
--- a/suites/sms/mo_mt_sms.py
+++ b/suites/sms/mo_mt_sms.py
@@ -14,14 +14,16 @@
nitb.subscriber_add(ms_mo)
nitb.subscriber_add(ms_mt)
-ms_mo.connect(nitb)
-ms_mt.connect(nitb)
+ms_mo.connect(nitb.mcc(), nitb.mnc())
+ms_mt.connect(nitb.mcc(), nitb.mnc())
ms_mo.log_info()
ms_mt.log_info()
print('waiting for modems to attach...')
wait(nitb.subscriber_attached, ms_mo, ms_mt)
+wait(ms_mo.is_connected)
+wait(ms_mt.is_connected)
sms = ms_mo.sms_send(ms_mt)
wait(ms_mt.sms_was_received, sms)
--
To view, visit https://gerrit.osmocom.org/2801
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I1ac9128563ba44f988daa5dfdc3e8c3d0d32a59d
Gerrit-PatchSet: 1
Gerrit-Project: osmo-gsm-tester
Gerrit-Branch: master
Gerrit-Owner: Pau Espin Pedrol <pespin at sysmocom.de>