| # osmo_gsm_tester: Base class for Mobile Stations (MS) |
| # |
| # Copyright (C) 2016-2017 by sysmocom - s.f.m.c. GmbH |
| # |
| # Author: Neels Hofmeyr <neels@hofmeyr.de> |
| # |
| # This program is free software: you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as |
| # published by the Free Software Foundation, either version 3 of the |
| # License, or (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| |
| from abc import ABCMeta, abstractmethod |
| from ..core import log |
| from ..core import schema |
| |
| def on_register_schemas(): |
| resource_schema = { |
| 'type': schema.STR, |
| 'label': schema.STR, |
| 'path': schema.STR, |
| 'imsi': schema.IMSI, |
| 'ki': schema.KI, |
| 'opc': schema.OPC, |
| 'auth_algo': schema.AUTH_ALGO, |
| 'apn_ipaddr': schema.IPV4, |
| 'ciphers[]': schema.CIPHER, |
| 'features[]': schema.MODEM_FEATURE |
| } |
| schema.register_resource_schema('modem', resource_schema) |
| |
| class MS(log.Origin, metaclass=ABCMeta): |
| """Base for everything about mobile/modem and SIMs.""" |
| |
| ############## |
| # PROTECTED |
| ############## |
| def __init__(self, name, conf): |
| super().__init__(log.C_TST, name) |
| self._conf = conf |
| self.msisdn = None |
| |
| ######################## |
| # PUBLIC - INTERNAL API |
| ######################## |
| @abstractmethod |
| def cleanup(self): |
| """Cleans up resources allocated.""" |
| pass |
| |
| def get_instance_by_type(testenv, conf): |
| """Allocate a MS child class based on type. Opts are passed to the newly created object.""" |
| ms_type = conf.get('type') |
| if ms_type is None: |
| # Map None to ofono for forward compability |
| ms_type = 'ofono' |
| |
| if ms_type == 'ofono': |
| from .ms_ofono import Modem |
| ms_class = Modem |
| elif ms_type == 'osmo-mobile': |
| from .ms_osmo_mobile import MSOsmoMobile |
| ms_class = MSOsmoMobile |
| elif ms_type == 'srsue': |
| from .ms_srs import srsUE |
| ms_class = srsUE |
| elif ms_type == 'amarisoftue': |
| from .ms_amarisoft import AmarisoftUE |
| ms_class = AmarisoftUE |
| else: |
| raise log.Error('MS type not supported:', ms_type) |
| return ms_class(testenv, conf) |
| |
| @abstractmethod |
| def is_registered(self, mcc_mnc=None): |
| '''Check whether MS is considered registered with the target network. In |
| 2G networks, and MS is registered if it had a successful Location Update |
| in CS. In 4G networks, an UE is considered registered with the core |
| network if it has obtained and IP address. If MCC/MNC are given it tries |
| to manually register against that specific network.''' |
| pass |
| |
| @abstractmethod |
| def get_assigned_addr(self, ipv6=False): |
| ''' Returns last assigned IP address ''' |
| pass |
| |
| ################### |
| # PUBLIC (test API included) |
| ################### |
| def imsi(self): |
| return self._conf.get('imsi') |
| |
| def ki(self): |
| return self._conf.get('ki') |
| |
| def opc(self): |
| return self._conf.get('opc', None) |
| |
| def apn_ipaddr(self): |
| return self._conf.get('apn_ipaddr', 'dynamic') |
| |
| def auth_algo(self): |
| return self._conf.get('auth_algo', None) |
| |
| def set_msisdn(self, msisdn): |
| self.msisdn = msisdn |
| |
| def msisdn(self): |
| return self.msisdn |
| |
| def get_counter(self, counter_name): |
| raise log.Error('get_counter() not implemented!') |