1b3a65823851f8ad28d214ad005765bf6b9805480David Rochberg# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2b3a65823851f8ad28d214ad005765bf6b9805480David Rochberg# Use of this source code is governed by a BSD-style license that can be
3b3a65823851f8ad28d214ad005765bf6b9805480David Rochberg# found in the LICENSE file.
4b3a65823851f8ad28d214ad005765bf6b9805480David Rochberg
5b3a65823851f8ad28d214ad005765bf6b9805480David Rochberg"""Constants, enums, and basic types for cellular base station emulation."""
6b3a65823851f8ad28d214ad005765bf6b9805480David Rochberg
7b3a65823851f8ad28d214ad005765bf6b9805480David RochbergDEFAULT_TIMEOUT = 10
8b3a65823851f8ad28d214ad005765bf6b9805480David Rochberg
9b3a65823851f8ad28d214ad005765bf6b9805480David Rochberg
108f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochbergdef Enum(enum_name, items):
11e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan    """Build a class with a member for each item.
129f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg
13e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan    Arguments:
14e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan      members: A list of items for the enum.  They must be valid python
15e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan       identifiers
16e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan    """
17e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan    class output(object):
18e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        pass
199f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg
20e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan    for item in items:
21e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        setattr(output, item, enum_name + ':' + item)
229f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg
23e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan    return output
249f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg
259f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg
268f72603f571bad5197dcd8fe04c210b38dac71bcDavid RochbergTechnology = Enum('Technology', [
279f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg    'GPRS',
289f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg    'EGPRS',
299f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg    'WCDMA',
309f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg    'HSDPA',
31c3df3886dfd11de46b744b8c98a7443b704d87afJason Glasgow    'HSUPA',
329f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg    'HSDUPA',
339f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg    'HSPA_PLUS',
349f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg    'CDMA_2000',
358f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'EVDO_1X',
369f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg    'LTE'
37e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan])
389f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg
395cf6379550561ad2def92cbafcd05f34851eefb5David RochbergTechnologyFamily = Enum('TechnologyFamily', [
405cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg    'UMTS',
415cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg    'CDMA',
42630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    'LTE'
43e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan])
445cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg
455cf6379550561ad2def92cbafcd05f34851eefb5David RochbergTechnologyToFamily = {
465cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg    Technology.GPRS: TechnologyFamily.UMTS,
475cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg    Technology.EGPRS: TechnologyFamily.UMTS,
485cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg    Technology.WCDMA: TechnologyFamily.UMTS,
495cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg    Technology.HSDPA: TechnologyFamily.UMTS,
50c3df3886dfd11de46b744b8c98a7443b704d87afJason Glasgow    Technology.HSUPA: TechnologyFamily.UMTS,
515cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg    Technology.HSDUPA: TechnologyFamily.UMTS,
525cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg    Technology.HSPA_PLUS: TechnologyFamily.UMTS,
535cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg    Technology.CDMA_2000: TechnologyFamily.CDMA,
545cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg    Technology.EVDO_1X: TechnologyFamily.CDMA,
55630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    Technology.LTE: TechnologyFamily.LTE,
565cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg}
575cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg
585cf6379550561ad2def92cbafcd05f34851eefb5David Rochberg
598f72603f571bad5197dcd8fe04c210b38dac71bcDavid RochbergUeGsmDataStatus = Enum('GsmDataStatus', [
609f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg    'NONE',
619f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg    'IDLE',
629f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg    'ATTACHING',
632b92e830cedcc866ad028bea0e65f2bd4929708bDavid Rochberg    'ATTACHED',
649f21ba40e6135220f6f4bdca6c1ddf96910d2b20David Rochberg    'DETACHING',
658f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'PDP_ACTIVATING',
668f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'PDP_ACTIVE',
678f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'PDP_DEACTIVATING',
68e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan])
69b3a65823851f8ad28d214ad005765bf6b9805480David Rochberg
708f72603f571bad5197dcd8fe04c210b38dac71bcDavid RochbergUeC2kDataStatus = Enum('C2kDataStatus', [
718f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'OFF',
728f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'DORMANT',
738f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'DATA_CONNECTED',
748f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg])
758f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg
768f72603f571bad5197dcd8fe04c210b38dac71bcDavid RochbergUeEvdoDataStatus = Enum('EvdoDataStatus', [
778f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'CONNECTION_CLOSING',
788f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'CONNECTION_NEGOTIATE',
798f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'CONNECTION_REQUEST',
808f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'DATA_CONNECTED',
818f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'DORMANT',
828f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'HANDOFF',
838f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'IDLE',
848f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'PAGING',
858f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'SESSION_CLOSING',
868f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'SESSION_NEGOTIATE',
878f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'SESSION_OPEN',
888f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'UATI_REQUEST',
898f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg])
908f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg
91630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert# todo(byronk): Move this LTE specific data into the LTE call_box object
92630f29391fabb13a6e6d191fa747e81512bcb726Byron KubertUeLteDataStatus = Enum('LteDataStatus', [
93630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    'OFF',
94630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    'IDLE',
95630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    'CONNECTED',
96630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    'REGISTERED',
97630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    'LOOPBACK',
98630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    'RELEASE',
99630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    'UNAVAILABLE',
100630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert])
1018f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg
1028f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg# Each cell technology has a different connection state machine.  For
1038f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg# generic tests, we want to abstract that away.  UeGenericDataStatus
1048f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg# is this abstraction, and RatToGenericDataStatus is a map from
1058f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg# specific states to this generic status.
1068f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg
1078f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg
1088f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg# TODO(rochberg):  Do we need connecting/disconnecting for this level of test?
1098f72603f571bad5197dcd8fe04c210b38dac71bcDavid RochbergUeGenericDataStatus = Enum('UeGenericDataStatus', [
1108f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'NONE',             # UE not seen or in transition to/from REGISTERED
1118f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'REGISTERED',       # Network knows about UE
1128f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'CONNECTED',        # Data can be sent
1138f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'CONNECTING',
1148f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    'DISCONNECTING',
115e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan])
1168f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg
1178f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg
1188f72603f571bad5197dcd8fe04c210b38dac71bcDavid RochbergRatToGenericDataStatus = {
1198f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeGsmDataStatus.NONE: UeGenericDataStatus.NONE,
1208f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeGsmDataStatus.IDLE: UeGenericDataStatus.NONE,
1218f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeGsmDataStatus.ATTACHING: UeGenericDataStatus.NONE, # Transition
1222b92e830cedcc866ad028bea0e65f2bd4929708bDavid Rochberg    UeGsmDataStatus.ATTACHED: UeGenericDataStatus.REGISTERED,
1238f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeGsmDataStatus.DETACHING: UeGenericDataStatus.NONE, # Transition
1248f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeGsmDataStatus.PDP_ACTIVATING: UeGenericDataStatus.CONNECTING,
1258f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeGsmDataStatus.PDP_ACTIVE: UeGenericDataStatus.CONNECTED,
1268f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeGsmDataStatus.PDP_DEACTIVATING: UeGenericDataStatus.DISCONNECTING,
1278f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg
1288f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeC2kDataStatus.OFF: UeGenericDataStatus.NONE,
1298f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeC2kDataStatus.DORMANT: UeGenericDataStatus.CONNECTED,
1308f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeC2kDataStatus.DATA_CONNECTED: UeGenericDataStatus.CONNECTED,
1318f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg
1328f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeEvdoDataStatus.CONNECTION_CLOSING: UeGenericDataStatus.DISCONNECTING,
1338f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeEvdoDataStatus.CONNECTION_NEGOTIATE: UeGenericDataStatus.CONNECTING,
1348f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeEvdoDataStatus.CONNECTION_REQUEST: UeGenericDataStatus.CONNECTING,
1358f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeEvdoDataStatus.DATA_CONNECTED: UeGenericDataStatus.CONNECTED,
1368f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeEvdoDataStatus.DORMANT: UeGenericDataStatus.CONNECTED,
1378f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeEvdoDataStatus.HANDOFF: UeGenericDataStatus.CONNECTING,
1388f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeEvdoDataStatus.IDLE: UeGenericDataStatus.CONNECTED,
1398f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeEvdoDataStatus.PAGING: UeGenericDataStatus.CONNECTED,
1408f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeEvdoDataStatus.SESSION_CLOSING: UeGenericDataStatus.DISCONNECTING,
1418f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeEvdoDataStatus.SESSION_NEGOTIATE: UeGenericDataStatus.CONNECTING,
1428f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeEvdoDataStatus.SESSION_OPEN: UeGenericDataStatus.REGISTERED,
1438f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg    UeEvdoDataStatus.UATI_REQUEST: UeGenericDataStatus.NONE,
144630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    UeLteDataStatus.OFF: UeGenericDataStatus.NONE,
145630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    UeLteDataStatus.IDLE: UeGenericDataStatus.NONE,
146630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    UeLteDataStatus.CONNECTED: UeGenericDataStatus.CONNECTED,
147630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    UeLteDataStatus.REGISTERED: UeGenericDataStatus.REGISTERED,
148630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    UeLteDataStatus.LOOPBACK: UeGenericDataStatus.NONE,
149630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    UeLteDataStatus.RELEASE: UeGenericDataStatus.DISCONNECTING,
150630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert    UeLteDataStatus.UNAVAILABLE: UeGenericDataStatus.NONE
1518f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg}
1528f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg
1538f72603f571bad5197dcd8fe04c210b38dac71bcDavid Rochberg
154b3a65823851f8ad28d214ad005765bf6b9805480David Rochbergclass Power(object):
155e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan    """Useful power levels, in dBm."""
156e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan    OFF = -200
157e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan    DEFAULT = -35
158b3a65823851f8ad28d214ad005765bf6b9805480David Rochberg
159b3a65823851f8ad28d214ad005765bf6b9805480David Rochberg
160b3a65823851f8ad28d214ad005765bf6b9805480David Rochbergclass SmsAddress(object):
161e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan    def __init__(self, address, address_type='INAT', address_plan='ISDN'):
162e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        """Constructs an SMS address.
163e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan
164e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        For expediency, the address type arguments come from the GPIB
165e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        commands for the Agilent 8960.  See
166e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        http://wireless.agilent.com/rfcomms/refdocs/
167e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan               gsmgprs/gprsla_hpib_sms.html#CIHDGBIH
168e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan
169e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        Arguments:
170e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan            address:  1-10 octets
171e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan            address_type:  INAT, NAT, NET, SUBS, ALPH, ABBR, RES
172e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan            address_plan:  ISDN, DATA, TEL, SCS1, SCS2, PRIV, NATional,
173e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan                           ERMes, RES
174e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        """
175e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        self.address = address
176e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        self.address_type = address_type
177e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        self.address_plan = address_plan
178b3a65823851f8ad28d214ad005765bf6b9805480David Rochberg
179630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert
180b3a65823851f8ad28d214ad005765bf6b9805480David Rochbergclass TestEnvironment(object):
181e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan    def __init__(self, event_loop):
182e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        pass
183e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan
184e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan    def RequestBaseStations(self,
185e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan                            configuration,
186e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan                            requirements_list):
187e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        """Requests a set of base stations that satisfy the given requirements.
188e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan
189e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        Arguments:
190e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan            configuration:  configuration dictionary
191e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan            requirements_list: A list of lists of technologies that must be
192e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan                               supported
193e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan
194e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        Returns: a list of base stations.
195e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        """
196e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        pass
197e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan
198e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan    def TimedOut(self):
199e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        """Called by base stations when an expected event hasn't occurred."""
200e5c6fd854508a2335ae6ce18b9651cee5a1004afBen Chan        pass
201