# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Constants, enums, and basic types for cellular base station emulation."""
DEFAULT_TIMEOUT = 10
def Enum(enum_name, items):
"""Build a class with a member for each item.
Arguments:
members: A list of items for the enum. They must be valid python
identifiers
"""
class output(object):
pass
for item in items:
setattr(output, item, enum_name + ':' + item)
return output
Technology = Enum('Technology', [
'GPRS',
'EGPRS',
'WCDMA',
'HSDPA',
'HSUPA',
'HSDUPA',
'HSPA_PLUS',
'CDMA_2000',
'EVDO_1X',
'LTE'
])
TechnologyFamily = Enum('TechnologyFamily', [
'UMTS',
'CDMA',
'LTE'
])
TechnologyToFamily = {
Technology.GPRS: TechnologyFamily.UMTS,
Technology.EGPRS: TechnologyFamily.UMTS,
Technology.WCDMA: TechnologyFamily.UMTS,
Technology.HSDPA: TechnologyFamily.UMTS,
Technology.HSUPA: TechnologyFamily.UMTS,
Technology.HSDUPA: TechnologyFamily.UMTS,
Technology.HSPA_PLUS: TechnologyFamily.UMTS,
Technology.CDMA_2000: TechnologyFamily.CDMA,
Technology.EVDO_1X: TechnologyFamily.CDMA,
Technology.LTE: TechnologyFamily.LTE,
}
UeGsmDataStatus = Enum('GsmDataStatus', [
'NONE',
'IDLE',
'ATTACHING',
'ATTACHED',
'DETACHING',
'PDP_ACTIVATING',
'PDP_ACTIVE',
'PDP_DEACTIVATING',
])
UeC2kDataStatus = Enum('C2kDataStatus', [
'OFF',
'DORMANT',
'DATA_CONNECTED',
])
UeEvdoDataStatus = Enum('EvdoDataStatus', [
'CONNECTION_CLOSING',
'CONNECTION_NEGOTIATE',
'CONNECTION_REQUEST',
'DATA_CONNECTED',
'DORMANT',
'HANDOFF',
'IDLE',
'PAGING',
'SESSION_CLOSING',
'SESSION_NEGOTIATE',
'SESSION_OPEN',
'UATI_REQUEST',
])
# todo(byronk): Move this LTE specific data into the LTE call_box object
UeLteDataStatus = Enum('LteDataStatus', [
'OFF',
'IDLE',
'CONNECTED',
'REGISTERED',
'LOOPBACK',
'RELEASE',
'UNAVAILABLE',
])
# Each cell technology has a different connection state machine. For
# generic tests, we want to abstract that away. UeGenericDataStatus
# is this abstraction, and RatToGenericDataStatus is a map from
# specific states to this generic status.
# TODO(rochberg): Do we need connecting/disconnecting for this level of test?
UeGenericDataStatus = Enum('UeGenericDataStatus', [
'NONE', # UE not seen or in transition to/from REGISTERED
'REGISTERED', # Network knows about UE
'CONNECTED', # Data can be sent
'CONNECTING',
'DISCONNECTING',
])
RatToGenericDataStatus = {
UeGsmDataStatus.NONE: UeGenericDataStatus.NONE,
UeGsmDataStatus.IDLE: UeGenericDataStatus.NONE,
UeGsmDataStatus.ATTACHING: UeGenericDataStatus.NONE, # Transition
UeGsmDataStatus.ATTACHED: UeGenericDataStatus.REGISTERED,
UeGsmDataStatus.DETACHING: UeGenericDataStatus.NONE, # Transition
UeGsmDataStatus.PDP_ACTIVATING: UeGenericDataStatus.CONNECTING,
UeGsmDataStatus.PDP_ACTIVE: UeGenericDataStatus.CONNECTED,
UeGsmDataStatus.PDP_DEACTIVATING: UeGenericDataStatus.DISCONNECTING,
UeC2kDataStatus.OFF: UeGenericDataStatus.NONE,
UeC2kDataStatus.DORMANT: UeGenericDataStatus.CONNECTED,
UeC2kDataStatus.DATA_CONNECTED: UeGenericDataStatus.CONNECTED,
UeEvdoDataStatus.CONNECTION_CLOSING: UeGenericDataStatus.DISCONNECTING,
UeEvdoDataStatus.CONNECTION_NEGOTIATE: UeGenericDataStatus.CONNECTING,
UeEvdoDataStatus.CONNECTION_REQUEST: UeGenericDataStatus.CONNECTING,
UeEvdoDataStatus.DATA_CONNECTED: UeGenericDataStatus.CONNECTED,
UeEvdoDataStatus.DORMANT: UeGenericDataStatus.CONNECTED,
UeEvdoDataStatus.HANDOFF: UeGenericDataStatus.CONNECTING,
UeEvdoDataStatus.IDLE: UeGenericDataStatus.CONNECTED,
UeEvdoDataStatus.PAGING: UeGenericDataStatus.CONNECTED,
UeEvdoDataStatus.SESSION_CLOSING: UeGenericDataStatus.DISCONNECTING,
UeEvdoDataStatus.SESSION_NEGOTIATE: UeGenericDataStatus.CONNECTING,
UeEvdoDataStatus.SESSION_OPEN: UeGenericDataStatus.REGISTERED,
UeEvdoDataStatus.UATI_REQUEST: UeGenericDataStatus.NONE,
UeLteDataStatus.OFF: UeGenericDataStatus.NONE,
UeLteDataStatus.IDLE: UeGenericDataStatus.NONE,
UeLteDataStatus.CONNECTED: UeGenericDataStatus.CONNECTED,
UeLteDataStatus.REGISTERED: UeGenericDataStatus.REGISTERED,
UeLteDataStatus.LOOPBACK: UeGenericDataStatus.NONE,
UeLteDataStatus.RELEASE: UeGenericDataStatus.DISCONNECTING,
UeLteDataStatus.UNAVAILABLE: UeGenericDataStatus.NONE
}
class Power(object):
"""Useful power levels, in dBm."""
OFF = -200
DEFAULT = -35
class SmsAddress(object):
def __init__(self, address, address_type='INAT', address_plan='ISDN'):
"""Constructs an SMS address.
For expediency, the address type arguments come from the GPIB
commands for the Agilent 8960. See
http://wireless.agilent.com/rfcomms/refdocs/
gsmgprs/gprsla_hpib_sms.html#CIHDGBIH
Arguments:
address: 1-10 octets
address_type: INAT, NAT, NET, SUBS, ALPH, ABBR, RES
address_plan: ISDN, DATA, TEL, SCS1, SCS2, PRIV, NATional,
ERMes, RES
"""
self.address = address
self.address_type = address_type
self.address_plan = address_plan
class TestEnvironment(object):
def __init__(self, event_loop):
pass
def RequestBaseStations(self,
configuration,
requirements_list):
"""Requests a set of base stations that satisfy the given requirements.
Arguments:
configuration: configuration dictionary
requirements_list: A list of lists of technologies that must be
supported
Returns: a list of base stations.
"""
pass
def TimedOut(self):
"""Called by base stations when an expected event hasn't occurred."""
pass