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.orgHello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/2779 to look at the new patch set (#3). ofono_client: Implement network registration during connect() Also add a new simple test to check network registration is working Change-Id: I8d9eb47eac1044550d3885adb55105c304b0c15c --- 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, 171 insertions(+), 9 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/79/2779/3 diff --git a/src/osmo_gsm_tester/ofono_client.py b/src/osmo_gsm_tester/ofono_client.py index ce937d0..6fb4540 100644 --- a/src/osmo_gsm_tester/ofono_client.py +++ b/src/osmo_gsm_tester/ofono_client.py @@ -32,6 +32,13 @@ 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 +54,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. @@ -263,11 +273,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.dbus.require_features('sms', 'net') self.dbus.required_signals = { I_SMS: ( ('IncomingMessage', self._on_incoming_message), ), + I_NETREG: ( ('PropertyChanged', self._on_netreg_property_changed), ), } self.dbus.watch_interfaces() @@ -328,9 +342,69 @@ 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 register_timeout(self, attempts): + if attempts > MAX_REGISTER_ATTEMPTS: + raise RuntimeError('Failed to find Network Operator', self.mcc, self.mnc) + if not self.register(): + self.dbg('Failed to find Network Operator', self.mcc, self.mnc, 'attempt', attempts) + defer(self.register_timeout, attempts + 1) + + def register_default(self): + if self.is_connected(): + self.log('Already registered with the network') + return True + self.log('Registering with the default network...') + nr = self.dbus.interface(I_NETREG) + nr.Scan() + nr.Register() + return True + + def register(self): + if self.mcc is None or self.mnc is None: + return self.register_default() + nr = self.dbus.interface(I_NETREG) + self.dbg('Scanning for operators...') + ops = nr.Scan() + 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 True + myop = op_path + break + if myop is None: + return False + dbus_op = systembus_get(myop) + self.dbg('Registering with operator', myop) + dbus_op.Register() + return True + + 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) @@ -340,6 +414,17 @@ 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 + if self.dbus.has_interface(I_NETREG): + self.register_timeout(1) + else: + self.raise_exn('Interface %s not present at connect time' % I_NETREG) + 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 96e1caf..6545469 100755 --- a/suites/aoip_sms/mo_mt_sms.py +++ b/suites/aoip_sms/mo_mt_sms.py @@ -21,9 +21,11 @@ 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()) 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.msisdn) 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 7176197..0e58f1a 100755 --- a/suites/sms/mo_mt_sms.py +++ b/suites/sms/mo_mt_sms.py @@ -17,11 +17,13 @@ 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()) print(ms_mo.properties()) print(ms_mt.properties()) 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.msisdn) wait(ms_mt.sms_was_received, sms) -- To view, visit https://gerrit.osmocom.org/2779 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newpatchset Gerrit-Change-Id: I8d9eb47eac1044550d3885adb55105c304b0c15c Gerrit-PatchSet: 3 Gerrit-Project: osmo-gsm-tester Gerrit-Branch: master Gerrit-Owner: Pau Espin Pedrol <pespin at sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr at sysmocom.de>