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.orgReview 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>