[PATCH] osmo-gsm-tester[master]: ofono_client: Implement network registration during connect()

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
Fri May 5 14:05:51 UTC 2017


Review at  https://gerrit.osmocom.org/2484

ofono_client: Implement network registration during connect()

Also add a new simple test to check network registration is working

Change-Id: I3092edc3dd76131da9aeeef6ad5082d1a9009342
---
M src/osmo_gsm_tester/ofono_client.py
M src/osmo_gsm_tester/osmo_nitb.py
A suites/netreg/one_register.py
A suites/netreg/suite.conf
M suites/sms/mo_mt_sms.py
5 files changed, 117 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/84/2484/1

diff --git a/src/osmo_gsm_tester/ofono_client.py b/src/osmo_gsm_tester/ofono_client.py
index 1f0380a..8e4c75e 100644
--- a/src/osmo_gsm_tester/ofono_client.py
+++ b/src/osmo_gsm_tester/ofono_client.py
@@ -32,6 +32,10 @@
 I_NETREG = 'org.ofono.NetworkRegistration'
 I_SMS = 'org.ofono.MessageManager'
 
+# See https://github.com/intgr/ofono/blob/master/doc/network-api.txt#L78
+ST_REGISTERED = 'registered'
+ST_ROAMING = 'roaming'
+
 def poll():
     global glib_main_ctx
     while glib_main_ctx.pending():
@@ -59,6 +63,10 @@
         self._dbus_obj = None
         self._interfaces = set()
         self.sms_received_list = []
+        self.netreg_status = None
+        self.connect_requested = False
+        self.mnc = None
+        self.mcc = None
         # init interfaces and connect to signals:
         self.dbus_obj()
         test.poll()
@@ -145,6 +153,10 @@
                     if retries <= 0:
                         self.err('Interface enabled by signal, but not available:', I_SMS)
                         raise
+        elif interface_name == I_NETREG:
+            self.dbus_obj()[I_NETREG].PropertyChanged.connect(self._on_netreg_property_changed)
+            if self.connect_requested:
+                self.register_async()
 
     def _on_interface_disabled(self, interface_name):
         self.dbg('Interface disabled:', interface_name)
@@ -152,19 +164,75 @@
     def has_interface(self, name):
         return name in self._interfaces
 
-    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.log('%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 == ST_ROAMING
+
+    def is_connected(self):
+        status = self.get_netreg_status()
+        return status == ST_REGISTERED or status == ST_ROAMING
+
+    def register_async_default(self):
+        if nitb == None:
+            return #connect() was not called yet
+        self.log('Registering with the network...', nitb)
+        if self.is_connected():
+            self.log('Already registered with the network')
+            return
+        nr = self.dbus_obj()[I_NETREG]
+        nr.Scan()
+        nr.Register()
+
+    def register_async(self):
+        if self.mcc is None  or self.mnc is None:
+            self.register_async_default()
+            return
+        nr = self.dbus_obj()[I_NETREG]
+        nr.Scan()
+        ops = nr.GetOperators()
+        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:
+                myop = op_path
+                break
+        if myop is None:
+            raise RuntimeError('Failed to find Network Operator ', self.mcc, self.mnc)
+        dbus_op = systembus_get(myop)
+        dbus_op.Register()
+
+    def power_reset(self):
+        'Power the modem and put it online'
+        self.log('Powering on')
         prepowered = self.properties().get('Powered')
         if prepowered is not None and prepowered:
             self.set_online(False)
             self.set_powered(False)
         self.set_powered()
         self.set_online()
-        if not self.has_interface(I_NETREG):
-            self.log('No %r interface, hoping that the modem connects by itself' % I_NETREG)
+
+    def connect(self, mcc=None, mnc=None):
+        'set the modem up to connect to MCC+MNC'
+        self.log('connect to', mcc, mnc)
+        self.mcc = mcc
+        self.mnc = mnc
+        self.connect_requested = True
+        if self.has_interface(I_NETREG):
+            self.register_async()
         else:
-            self.log('Use of %r interface not implemented yet, hoping that the modem connects by itself' % I_NETREG)
+            self.log('No %r interface, delaying registration until it appears' % I_NETREG)
+
 
     def sms_send(self, to_msisdn):
         if hasattr(to_msisdn, 'msisdn'):
diff --git a/src/osmo_gsm_tester/osmo_nitb.py b/src/osmo_gsm_tester/osmo_nitb.py
index 4cd6055..5d78755 100644
--- a/src/osmo_gsm_tester/osmo_nitb.py
+++ b/src/osmo_gsm_tester/osmo_nitb.py
@@ -38,6 +38,7 @@
         self.set_log_category(log.C_RUN)
         self.set_name('osmo-nitb_%s' % nitb_iface.get('addr'))
         self.bts = []
+        self.config = None
 
     def start(self):
         self.log('Starting osmo-nitb')
@@ -73,6 +74,7 @@
         config.overlay(values, dict(nitb=dict(net=dict(bts_list=bts_list))))
 
         self.dbg(conf=values)
+        self.config = values['nitb']
 
         with open(self.config_file, 'w') as f:
             r = template.render('osmo-nitb.cfg', values)
diff --git a/suites/netreg/one_register.py b/suites/netreg/one_register.py
new file mode 100755
index 0000000..9ce9f7e
--- /dev/null
+++ b/suites/netreg/one_register.py
@@ -0,0 +1,22 @@
+#!/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()
+sleep(1)
+assert nitb.running()
+bts.start()
+
+nitb.subscriber_add(ms)
+
+ms.power_reset()
+ms.connect(nitb.config['net']['mcc'], nitb.config['net']['mnc'])
+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..2a82721
--- /dev/null
+++ b/suites/netreg/suite.conf
@@ -0,0 +1,10 @@
+resources:
+  nitb_iface:
+  - times: 1
+  bts:
+  - times: 1
+  modem:
+  - times: 1
+
+defaults:
+  timeout: 60s
diff --git a/suites/sms/mo_mt_sms.py b/suites/sms/mo_mt_sms.py
index 7176197..647972f 100755
--- a/suites/sms/mo_mt_sms.py
+++ b/suites/sms/mo_mt_sms.py
@@ -17,11 +17,18 @@
 nitb.subscriber_add(ms_mo)
 nitb.subscriber_add(ms_mt)
 
-ms_mo.connect(nitb)
-ms_mt.connect(nitb)
+ms_mo.power_reset()
+ms_mt.power_reset()
+
+ms_mo.connect(nitb.config['net']['mcc'], nitb.config['net']['mnc'])
+ms_mt.connect(nitb.config['net']['mcc'], nitb.config['net']['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/2484
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3092edc3dd76131da9aeeef6ad5082d1a9009342
Gerrit-PatchSet: 1
Gerrit-Project: osmo-gsm-tester
Gerrit-Branch: master
Gerrit-Owner: Pau Espin Pedrol <pespin at sysmocom.de>



More information about the gerrit-log mailing list