2020-01-17 13:27:11 +00:00
|
|
|
|
# -*- coding: UTF-8 -*-
|
|
|
|
|
#/**
|
|
|
|
|
# * Software Name : pycrate
|
|
|
|
|
# * Version : 0.4
|
|
|
|
|
# *
|
|
|
|
|
# * Copyright 2020. Benoit Michau. P1sec.
|
|
|
|
|
# *
|
|
|
|
|
# * This library is free software; you can redistribute it and/or
|
|
|
|
|
# * modify it under the terms of the GNU Lesser General Public
|
|
|
|
|
# * License as published by the Free Software Foundation; either
|
|
|
|
|
# * version 2.1 of the License, or (at your option) any later version.
|
|
|
|
|
# *
|
|
|
|
|
# * This library 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
|
|
|
|
|
# * Lesser General Public License for more details.
|
|
|
|
|
# *
|
|
|
|
|
# * You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
# * License along with this library; if not, write to the Free Software
|
|
|
|
|
# * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
|
|
|
# * MA 02110-1301 USA
|
|
|
|
|
# *
|
|
|
|
|
# *--------------------------------------------------------
|
|
|
|
|
# * File Name : pycrate_osmo/L1CTL.py
|
|
|
|
|
# * Created : 2020-01-14
|
|
|
|
|
# * Authors : Benoit Michau
|
|
|
|
|
# *--------------------------------------------------------
|
|
|
|
|
#*/
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# osmocom-bb l1ctl_proto.h wrapper
|
|
|
|
|
# https://gerrit.osmocom.org/plugins/gitiles/osmocom-bb/+/master/include/l1ctl_proto.h
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
|
|
from pycrate_core.utils import *
|
|
|
|
|
from pycrate_core.elt import *
|
|
|
|
|
from pycrate_core.base import *
|
|
|
|
|
from pycrate_core.repr import *
|
|
|
|
|
|
|
|
|
|
from pycrate_mobile.TS48058_Abis import *
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# Enumerations
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
|
|
# message types
|
|
|
|
|
L1CTL_NONE = 0
|
|
|
|
|
L1CTL_FBSB_REQ = 1
|
|
|
|
|
L1CTL_FBSB_CONF = 2
|
|
|
|
|
L1CTL_DATA_IND = 3
|
|
|
|
|
L1CTL_RACH_REQ = 4
|
|
|
|
|
L1CTL_DM_EST_REQ = 5
|
|
|
|
|
L1CTL_DATA_REQ = 6
|
|
|
|
|
L1CTL_RESET_IND = 7
|
|
|
|
|
L1CTL_PM_REQ = 8 # power measurement
|
|
|
|
|
L1CTL_PM_CONF = 9 # power measurement
|
|
|
|
|
L1CTL_ECHO_REQ = 10
|
|
|
|
|
L1CTL_ECHO_CONF = 11
|
|
|
|
|
L1CTL_RACH_CONF = 12
|
|
|
|
|
L1CTL_RESET_REQ = 13
|
|
|
|
|
L1CTL_RESET_CONF = 14
|
|
|
|
|
L1CTL_DATA_CONF = 15
|
|
|
|
|
L1CTL_CCCH_MODE_REQ = 16
|
|
|
|
|
L1CTL_CCCH_MODE_CONF = 17
|
|
|
|
|
L1CTL_DM_REL_REQ = 18
|
|
|
|
|
L1CTL_PARAM_REQ = 19
|
|
|
|
|
L1CTL_DM_FREQ_REQ = 20
|
|
|
|
|
L1CTL_CRYPTO_REQ = 21
|
|
|
|
|
L1CTL_SIM_REQ = 22
|
|
|
|
|
L1CTL_SIM_CONF = 23
|
|
|
|
|
L1CTL_TCH_MODE_REQ = 24
|
|
|
|
|
L1CTL_TCH_MODE_CONF = 25
|
|
|
|
|
L1CTL_NEIGH_PM_REQ = 26
|
|
|
|
|
L1CTL_NEIGH_PM_IND = 27
|
|
|
|
|
L1CTL_TRAFFIC_REQ = 28
|
|
|
|
|
L1CTL_TRAFFIC_CONF = 29
|
|
|
|
|
L1CTL_TRAFFIC_IND = 30
|
|
|
|
|
L1CTL_BURST_IND = 31
|
|
|
|
|
# configure TBF for uplink/downlink (GPRS)
|
|
|
|
|
L1CTL_TBF_CFG_REQ = 32
|
|
|
|
|
L1CTL_TBF_CFG_CONF = 33
|
|
|
|
|
L1CTL_DATA_TBF_REQ = 34
|
|
|
|
|
L1CTL_DATA_TBF_CONF = 35
|
|
|
|
|
# Extended (11-bit) RACH (see 3GPP TS 05.02, section 5.2.7)
|
|
|
|
|
L1CTL_EXT_RACH_REQ = 36
|
|
|
|
|
|
|
|
|
|
L1CTLMsgType_dict = {
|
|
|
|
|
0 : 'L1CTL_NONE',
|
|
|
|
|
1 : 'L1CTL_FBSB_REQ',
|
|
|
|
|
2 : 'L1CTL_FBSB_CONF',
|
|
|
|
|
3 : 'L1CTL_DATA_IND',
|
|
|
|
|
4 : 'L1CTL_RACH_REQ',
|
|
|
|
|
5 : 'L1CTL_DM_EST_REQ',
|
|
|
|
|
6 : 'L1CTL_DATA_REQ',
|
|
|
|
|
7 : 'L1CTL_RESET_IND',
|
|
|
|
|
8 : 'L1CTL_PM_REQ',
|
|
|
|
|
9 : 'L1CTL_PM_CONF',
|
|
|
|
|
10 : 'L1CTL_ECHO_REQ',
|
|
|
|
|
11 : 'L1CTL_ECHO_CONF',
|
|
|
|
|
12 : 'L1CTL_RACH_CONF',
|
|
|
|
|
13 : 'L1CTL_RESET_REQ',
|
|
|
|
|
14 : 'L1CTL_RESET_CONF',
|
|
|
|
|
15 : 'L1CTL_DATA_CONF',
|
|
|
|
|
16 : 'L1CTL_CCCH_MODE_REQ',
|
|
|
|
|
17 : 'L1CTL_CCCH_MODE_CONF',
|
|
|
|
|
18 : 'L1CTL_DM_REL_REQ',
|
|
|
|
|
19 : 'L1CTL_PARAM_REQ',
|
|
|
|
|
20 : 'L1CTL_DM_FREQ_REQ',
|
|
|
|
|
21 : 'L1CTL_CRYPTO_REQ',
|
|
|
|
|
22 : 'L1CTL_SIM_REQ',
|
|
|
|
|
23 : 'L1CTL_SIM_CONF',
|
|
|
|
|
24 : 'L1CTL_TCH_MODE_REQ',
|
|
|
|
|
25 : 'L1CTL_TCH_MODE_CONF',
|
|
|
|
|
26 : 'L1CTL_NEIGH_PM_REQ',
|
|
|
|
|
27 : 'L1CTL_NEIGH_PM_IND',
|
|
|
|
|
28 : 'L1CTL_TRAFFIC_REQ',
|
|
|
|
|
29 : 'L1CTL_TRAFFIC_CONF',
|
|
|
|
|
30 : 'L1CTL_TRAFFIC_IND',
|
|
|
|
|
31 : 'L1CTL_BURST_IND',
|
|
|
|
|
32 : 'L1CTL_TBF_CFG_REQ',
|
|
|
|
|
33 : 'L1CTL_TBF_CFG_CONF',
|
|
|
|
|
34 : 'L1CTL_DATA_TBF_REQ',
|
|
|
|
|
35 : 'L1CTL_DATA_TBF_CONF',
|
|
|
|
|
36 : 'L1CTL_EXT_RACH_REQ'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# CCCH mode
|
|
|
|
|
L1CTL_CCCH_MODE_NONE = 0
|
|
|
|
|
L1CTL_CCCH_MODE_NON_COMBINED = 1
|
|
|
|
|
L1CTL_CCCH_MODE_COMBINED = 2
|
|
|
|
|
L1CTL_CCCH_MODE_COMBINED_CBCH = 3
|
|
|
|
|
|
|
|
|
|
L1CTLCCCHMode_dict = {
|
|
|
|
|
0 : 'L1CTL_CCCH_MODE_NONE',
|
|
|
|
|
1 : 'L1CTL_CCCH_MODE_NON_COMBINED',
|
|
|
|
|
2 : 'L1CTL_CCCH_MODE_COMBINED',
|
|
|
|
|
3 : 'L1CTL_CCCH_MODE_COMBINED_CBCH'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# TCH mode (from gsm_04_08.h)
|
|
|
|
|
GSM48_CMODE_SIGN = 0x00,
|
|
|
|
|
GSM48_CMODE_SPEECH_V1 = 0x01,
|
|
|
|
|
GSM48_CMODE_SPEECH_EFR = 0x21,
|
|
|
|
|
GSM48_CMODE_SPEECH_AMR = 0x41,
|
|
|
|
|
GSM48_CMODE_DATA_14k5 = 0x0f,
|
|
|
|
|
GSM48_CMODE_DATA_12k0 = 0x03,
|
|
|
|
|
GSM48_CMODE_DATA_6k0 = 0x0b,
|
|
|
|
|
GSM48_CMODE_DATA_3k6 = 0x23,
|
|
|
|
|
|
|
|
|
|
GSM48ChanMode_dict = {
|
|
|
|
|
0 : 'GSM48_CMODE_SIGN',
|
|
|
|
|
1 : 'GSM48_CMODE_SPEECH_V1',
|
|
|
|
|
33: 'GSM48_CMODE_SPEECH_EFR',
|
|
|
|
|
65: 'GSM48_CMODE_SPEECH_AMR',
|
|
|
|
|
15: 'GSM48_CMODE_DATA_14k5',
|
|
|
|
|
3 : 'GSM48_CMODE_DATA_12k0',
|
|
|
|
|
11: 'GSM48_CMODE_DATA_6k0',
|
|
|
|
|
35: 'GSM48_CMODE_DATA_3k6',
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# neighbour mode
|
|
|
|
|
L1CTL_NEIGH_MODE_NONE = 0
|
|
|
|
|
L1CTL_NEIGH_MODE_PM = 1
|
|
|
|
|
L1CTL_NEIGH_MODE_SB = 2
|
|
|
|
|
|
|
|
|
|
L1CTLNeighMode_dict = {
|
|
|
|
|
0 : 'L1CTL_NEIGH_MODE_NONE',
|
|
|
|
|
1 : 'L1CTL_NEIGH_MODE_PM',
|
|
|
|
|
2 : 'L1CTL_NEIGH_MODE_SB'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Coding Scheme
|
|
|
|
|
L1CTL_CS_NONE = 0
|
|
|
|
|
L1CTL_CS1 = 1
|
|
|
|
|
L1CTL_CS2 = 2
|
|
|
|
|
L1CTL_CS3 = 3
|
|
|
|
|
L1CTL_CS4 = 4
|
|
|
|
|
L1CTL_MCS1 = 5
|
|
|
|
|
L1CTL_MCS2 = 6
|
|
|
|
|
L1CTL_MCS3 = 7
|
|
|
|
|
L1CTL_MCS4 = 8
|
|
|
|
|
L1CTL_MCS5 = 9
|
|
|
|
|
L1CTL_MCS6 = 10
|
|
|
|
|
L1CTL_MCS7 = 11
|
|
|
|
|
L1CTL_MCS8 = 12
|
|
|
|
|
L1CTL_MCS9 = 13
|
|
|
|
|
|
|
|
|
|
L1CTLCodScheme_dict = {
|
|
|
|
|
0 : 'L1CTL_CS_NONE',
|
|
|
|
|
1 : 'L1CTL_CS1',
|
|
|
|
|
2 : 'L1CTL_CS2',
|
|
|
|
|
3 : 'L1CTL_CS3',
|
|
|
|
|
4 : 'L1CTL_CS4',
|
|
|
|
|
5 : 'L1CTL_MCS1',
|
|
|
|
|
6 : 'L1CTL_MCS2',
|
|
|
|
|
7 : 'L1CTL_MCS3',
|
|
|
|
|
8 : 'L1CTL_MCS4',
|
|
|
|
|
9 : 'L1CTL_MCS5',
|
|
|
|
|
10: 'L1CTL_MCS6',
|
|
|
|
|
11: 'L1CTL_MCS7',
|
|
|
|
|
12: 'L1CTL_MCS8',
|
|
|
|
|
13: 'L1CTL_MCS9',
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# baseband reset
|
|
|
|
|
L1CTL_RES_T_BOOT = 0
|
|
|
|
|
L1CTL_RES_T_FULL = 1
|
|
|
|
|
L1CTL_RES_T_SCHED = 2
|
|
|
|
|
|
|
|
|
|
L1CTLReset_dict = {
|
|
|
|
|
0 : 'L1CTL_RES_T_BOOT',
|
|
|
|
|
1 : 'L1CTL_RES_T_FULL',
|
|
|
|
|
2 : 'L1CTL_RES_T_SCHED',
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-01-22 01:17:42 +00:00
|
|
|
|
class ARFCNFlags(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint('PCS', bl=1),
|
|
|
|
|
Uint('Uplink', bl=1),
|
2022-05-13 14:07:18 +00:00
|
|
|
|
Uint('spare', bl=4),
|
2020-01-22 01:17:42 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
class ARFCNBand(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
ARFCNFlags('Flags'),
|
2022-05-13 14:07:18 +00:00
|
|
|
|
Uint('ARFCN', bl=10),
|
2020-01-22 01:17:42 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
2020-01-17 13:27:11 +00:00
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# Message parameters
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
|
|
###
|
|
|
|
|
# downlink info
|
|
|
|
|
# down from the BTS
|
|
|
|
|
###
|
|
|
|
|
|
|
|
|
|
class L1CTLInfoDL(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
ChannelNumber(), # GSM 08.58 channel number (9.3.1)
|
|
|
|
|
LinkIdentifier(), # GSM 08.58 link identifier (9.3.2)
|
2020-01-22 01:17:42 +00:00
|
|
|
|
ARFCNBand('ARFCN'),
|
2020-01-17 13:27:11 +00:00
|
|
|
|
Uint32('FrameNr'),
|
|
|
|
|
Uint8('RxLevel'), # 0 .. 63 in typical GSM notation (dBm+110)
|
|
|
|
|
Uint8('SNR'), # Signal/Noise Ration (dB)
|
|
|
|
|
Uint8('NumBitErr'),
|
|
|
|
|
Uint8('FireCRC'),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# new CCCH was found. This is following the header
|
|
|
|
|
class L1CTLFBSBConf(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
L1CTLInfoDL(),
|
|
|
|
|
Uint16('InitialFreqErr'),
|
|
|
|
|
Uint8('Result'),
|
|
|
|
|
Uint8('BSIC')
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# CCCH mode was changed
|
|
|
|
|
class L1CTLCCCHModeConf(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint8('CCCHMode', dic=L1CTLCCCHMode_dict),
|
|
|
|
|
Uint24('pad', rep=REPR_HEX)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# TCH mode was changed
|
|
|
|
|
class L1CTLTCHModeConf(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
L1CTLInfoDL(),
|
|
|
|
|
Uint8('TCHMode', dic=GSM48ChanMode_dict),
|
|
|
|
|
Uint8('AudioMode', ),
|
|
|
|
|
Uint16('pad', rep=REPR_HEX)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# data on the CCCH was found. This is following the header
|
|
|
|
|
class L1CTLDataInd(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
L1CTLInfoDL(),
|
|
|
|
|
Buf('Payload', bl=184, rep=REPR_HEX) # 23 bytes, GSM broadcast
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# traffic from the network
|
2022-01-14 09:00:27 +00:00
|
|
|
|
class L1CTLTrafficInd(Envelope):
|
2020-01-17 13:27:11 +00:00
|
|
|
|
_GEN = (
|
|
|
|
|
L1CTLInfoDL(),
|
|
|
|
|
Buf('Payload', rep=REPR_HEX)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
###
|
|
|
|
|
# uplink info
|
|
|
|
|
###
|
|
|
|
|
|
|
|
|
|
class L1CTLInfoUL(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
ChannelNumber(), # GSM 08.58 channel number (9.3.1)
|
|
|
|
|
LinkIdentifier(), # GSM 08.58 link identifier (9.3.2)
|
|
|
|
|
Uint16('pad', rep=REPR_HEX),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class L1CTLInfoULTBF(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint8('TBFNumber'),
|
|
|
|
|
Uint8('CodingScheme', dic=L1CTLCodScheme_dict),
|
|
|
|
|
Uint16('pad', rep=REPR_HEX),
|
|
|
|
|
Buf('Payload', rep=REPR_HEX)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# FBSB flags
|
|
|
|
|
class L1CTLFBSBFlags(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint('pad', bl=5, rep=REPR_HEX),
|
|
|
|
|
Uint('SB', bl=1),
|
|
|
|
|
Uint('FB1', bl=1),
|
|
|
|
|
Uint('FB0', bl=1)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# msg for FBSB_REQ
|
|
|
|
|
# the l1_info_ul header is in front
|
|
|
|
|
class L1CTLFBSBReq(Envelope):
|
|
|
|
|
_GEN = (
|
2020-01-22 01:17:42 +00:00
|
|
|
|
ARFCNBand('ARFCN'),
|
2020-01-17 13:27:11 +00:00
|
|
|
|
Uint16('Timeout'), # in TDMA frames
|
|
|
|
|
Uint16('FreqErrThres1'),
|
|
|
|
|
Uint16('FreqErrThres2'),
|
|
|
|
|
Uint8('NumFreqErrAvg'),
|
|
|
|
|
L1CTLFBSBFlags(),
|
|
|
|
|
Uint8('SynchInfoIdx'),
|
|
|
|
|
Uint8('CCCHMode', dic=L1CTLCCCHMode_dict),
|
|
|
|
|
Uint8('RXLevExp') # expected signal level
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# msg for CCCH_MODE_REQ
|
|
|
|
|
# the l1_info_ul header is in front
|
|
|
|
|
class L1CTLCCCHModeReq(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint8('CCCHMode', dic=L1CTLCCCHMode_dict),
|
|
|
|
|
Uint24('pad', rep=REPR_HEX)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# audio mode
|
|
|
|
|
class L1CTLAudioMode(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint('pad', bl=4),
|
|
|
|
|
Uint('RXTrafficInd', bl=1),
|
|
|
|
|
Uint('RXSpeaker', bl=1),
|
|
|
|
|
Uint('TXTrafficReq', bl=1),
|
|
|
|
|
Uint('TXMicrophone', bl=1)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# msg for TCH_MODE_REQ
|
|
|
|
|
# the l1_info_ul header is in front
|
|
|
|
|
class L1CTLTCHModeReq(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
L1CTLInfoUL(),
|
|
|
|
|
Uint8('TCHMode', dic=GSM48ChanMode_dict),
|
|
|
|
|
L1CTLAudioMode(),
|
|
|
|
|
Uint16('pad', rep=REPR_HEX)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# msg for RACH_REQ
|
|
|
|
|
# the l1_info_ul header is in front
|
|
|
|
|
class L1CTLRACHReq(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
L1CTLInfoUL(),
|
|
|
|
|
Uint8('RA'),
|
|
|
|
|
Uint8('Combined'),
|
|
|
|
|
Uint16('Offset')
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# RA: establishment cause + random ref
|
|
|
|
|
# 0b101xxxxx = emergency call
|
|
|
|
|
# 0b000xxxxx = LocUpdate (without NECI)
|
|
|
|
|
# 0b111xxxxx = SDCCH (without NECI)
|
|
|
|
|
# 0b0000xxxx = LocUpdate (with NECI)
|
|
|
|
|
# 0b0001xxxx = SDCCH (with NECI)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# msg for EXT_RACH_REQ
|
|
|
|
|
# the l1_info_ul header is in front
|
|
|
|
|
class L1CTLExtRACHReq(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
L1CTLInfoUL(),
|
|
|
|
|
Uint16('RA11'),
|
|
|
|
|
Uint8('SynchSeq'),
|
|
|
|
|
Uint8('Combined'),
|
|
|
|
|
Uint16('Offset')
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# the l1_info_ul header is in front
|
|
|
|
|
class L1CTLParamReq(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
L1CTLInfoUL(),
|
|
|
|
|
Int8('TA'),
|
|
|
|
|
Uint8('TXPower'),
|
|
|
|
|
Uint16('pad', rep=REPR_HEX),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class L1CTLDataReq(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
L1CTLInfoUL(),
|
|
|
|
|
Buf('Payload', rep=REPR_HEX)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class L1CTL_H0(Envelope):
|
|
|
|
|
_GEN = (
|
2020-01-22 01:17:42 +00:00
|
|
|
|
ARFCNBand('ARFCN'),
|
2022-05-13 14:14:57 +00:00
|
|
|
|
Buf('Pad', bl=138 * 8, rep=REPR_HEX)
|
2020-01-17 13:27:11 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class L1CTL_H1(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint8('HSN'),
|
|
|
|
|
Uint8('MAIO'),
|
|
|
|
|
Uint8('N'),
|
|
|
|
|
Uint8('pad', rep=REPR_HEX)
|
|
|
|
|
) + tuple(
|
|
|
|
|
Uint16('MA_%i' % i) for i in range(64)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class L1CTLDMEstReq(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint8('TSC'),
|
|
|
|
|
Uint8('H'),
|
|
|
|
|
Alt('L1CTL_H', GEN={
|
|
|
|
|
0 : L1CTL_H0(),
|
|
|
|
|
1 : L1CTL_H1()},
|
|
|
|
|
DEFAULT=L1CTL_H0(),
|
|
|
|
|
sel=lambda self: self.get_env()['H'].get_val()),
|
|
|
|
|
Uint8('TCHMode', dic=GSM48ChanMode_dict),
|
|
|
|
|
L1CTLAudioMode()
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class L1CTLDMFreqReq(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint16('FN'),
|
|
|
|
|
Uint8('TSC'),
|
|
|
|
|
Uint8('H'),
|
|
|
|
|
Alt('L1CTL_H', GEN={
|
|
|
|
|
0 : L1CTL_H0(),
|
|
|
|
|
1 : L1CTL_H1()},
|
|
|
|
|
DEFAULT=L1CTL_H0(),
|
|
|
|
|
sel=lambda self: self.get_env()['H'].get_val()),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# SIM auth computation
|
|
|
|
|
class L1CTLCryptoReq(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint8('Algo'),
|
|
|
|
|
Uint8('KeyLen'),
|
|
|
|
|
Buf('Key', rep=REPR_HEX)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
Envelope.__init__(self, *args, **kwargs)
|
|
|
|
|
self[1].set_valauto(lambda: self[2].get_len())
|
|
|
|
|
self[2].set_blauto(lambda: self[1].get_val()<<3)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# power measurement
|
|
|
|
|
class L1CTLPMReq(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint8('Type'),
|
|
|
|
|
Uint24('pad', rep=REPR_HEX),
|
|
|
|
|
Envelope('ARFCNRange', GEN=(
|
2020-01-22 01:17:42 +00:00
|
|
|
|
ARFCNBand('ARFCNFrom'),
|
|
|
|
|
ARFCNBand('ARFCNTo'))
|
2020-01-17 13:27:11 +00:00
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class L1CTLPMConf(Array):
|
|
|
|
|
_GEN = Envelope('ARFCNPM', GEN=(
|
|
|
|
|
Uint16('ARFCN'),
|
|
|
|
|
Uint8('PM'),
|
|
|
|
|
Uint8('PM2')
|
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# demodulated burst indicator
|
|
|
|
|
class L1CTLBurstInd(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint32('FrameNumber'),
|
2020-01-22 01:17:42 +00:00
|
|
|
|
ARFCNBand('ARFCN'), # ARFCN + band + ul indicator
|
2020-01-17 13:27:11 +00:00
|
|
|
|
ChannelNumber(), # GSM 08.58 channel number (9.3.1)
|
|
|
|
|
Uint8('Flags'), # BI_FLG_xxx + burst_id = 2LSBs
|
|
|
|
|
Uint8('RXLevel'), # 0 .. 63 in typical GSM notation (dBm+110)
|
|
|
|
|
Uint8('SNR'), # Reported SNR >> 8 (0-255)
|
|
|
|
|
Buf('Bits', bl=120, rep=REPR_HEX), # 114 bits + 2 steal bits. Filled MSB first
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# baseband reset
|
|
|
|
|
class L1CTLReset(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint8('Type', dic=L1CTLReset_dict),
|
|
|
|
|
Uint24('pad', rep=REPR_HEX)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# neighbour cell measurement
|
|
|
|
|
class L1CTLNeighPMReq(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint8('N'),
|
|
|
|
|
Uint8('pad', rep=REPR_HEX),
|
2020-01-22 01:17:42 +00:00
|
|
|
|
Array('ARFCNs', GEN=ARFCNBand('ARFCN'), num=64),
|
2020-01-17 13:27:11 +00:00
|
|
|
|
Array('TNs', GEN=Uint8('TN'), num=64)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class L1CTLNeighPMInd(Array):
|
|
|
|
|
_GEN = Envelope('NeighPM', GEN=(
|
2020-01-22 01:17:42 +00:00
|
|
|
|
ARFCNBand('ARFCN'),
|
2020-01-17 13:27:11 +00:00
|
|
|
|
Uint8('PM'),
|
|
|
|
|
Uint8('PM2'),
|
|
|
|
|
Uint8('TN'),
|
|
|
|
|
Uint8('pad', rep=REPR_HEX)
|
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# traffic data to network
|
|
|
|
|
class L1CTLTrafficReq(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
L1CTLInfoUL(),
|
|
|
|
|
Buf('Payload', rep=REPR_HEX)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# GPRS resources request
|
|
|
|
|
class L1CTLTBFCfgReq(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint8('TBFNumber'), # future support for multiple concurrent TBFs. 0 for now
|
|
|
|
|
Uint8('IsUplink'), # is this about an UL TBF (1) or DL (0)
|
|
|
|
|
Uint16('pad', rep=REPR_HEX),
|
|
|
|
|
Array('USFs', GEN=Uint8('USF', val=0xff), num=8) # one USF for each TN, or 255 for invalid/unused
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# L1CTL Message
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
|
|
class L1CTLHdr(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
Uint8('Type', dic=L1CTLMsgType_dict),
|
|
|
|
|
Uint8('Flags'),
|
|
|
|
|
Uint16('pad', bl=16, rep=REPR_HEX)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class L1CTLMsg(Envelope):
|
|
|
|
|
_GEN = (
|
|
|
|
|
L1CTLHdr(),
|
|
|
|
|
Alt('Params', hier=1, GEN={
|
|
|
|
|
1 : L1CTLFBSBReq(),
|
|
|
|
|
2 : L1CTLFBSBConf(),
|
|
|
|
|
3 : L1CTLDataInd(),
|
|
|
|
|
4 : L1CTLRACHReq(),
|
|
|
|
|
5 : L1CTLDMEstReq(),
|
|
|
|
|
6 : L1CTLDataReq(),
|
|
|
|
|
7 : L1CTLReset(),
|
|
|
|
|
8 : L1CTLPMReq(),
|
|
|
|
|
9 : L1CTLPMConf(),
|
|
|
|
|
10 : Buf('Payload', rep=REPR_HEX),
|
|
|
|
|
11 : Buf('Payload', rep=REPR_HEX),
|
|
|
|
|
12 : L1CTLInfoDL('L1CTLRACHConf'),
|
|
|
|
|
13 : L1CTLReset(),
|
|
|
|
|
14 : L1CTLReset(),
|
|
|
|
|
15 : L1CTLDataInd(),
|
|
|
|
|
16 : L1CTLCCCHModeReq(),
|
|
|
|
|
17 : L1CTLCCCHModeConf(),
|
|
|
|
|
18 : Buf('none', rep=REPR_HEX), # ?
|
|
|
|
|
19 : L1CTLParamReq(),
|
|
|
|
|
20 : L1CTLDMFreqReq(),
|
|
|
|
|
21 : L1CTLCryptoReq(),
|
|
|
|
|
22 : Buf('APDU', rep=REPR_HEX),
|
|
|
|
|
23 : Buf('APDU', rep=REPR_HEX),
|
|
|
|
|
24 : L1CTLTCHModeReq(),
|
|
|
|
|
25 : L1CTLTCHModeConf(),
|
|
|
|
|
26 : L1CTLNeighPMReq(),
|
|
|
|
|
27 : L1CTLNeighPMInd(),
|
|
|
|
|
28 : L1CTLTrafficReq(),
|
|
|
|
|
29 : Buf('none', rep=REPR_HEX), # ?
|
|
|
|
|
30 : L1CTLTrafficInd(),
|
|
|
|
|
31 : L1CTLBurstInd(),
|
|
|
|
|
32 : L1CTLTBFCfgReq(),
|
|
|
|
|
33 : Buf('none', rep=REPR_HEX), # ?
|
|
|
|
|
#34 : ???
|
|
|
|
|
#35 : ???
|
|
|
|
|
36 : L1CTLExtRACHReq()
|
|
|
|
|
},
|
|
|
|
|
DEFAULT=Buf('unk', rep=REPR_HEX),
|
|
|
|
|
sel=lambda self: self.get_env()[0][0].get_val())
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
'''
|
|
|
|
|
0 : 'L1CTL_NONE',
|
|
|
|
|
1 : 'L1CTL_FBSB_REQ', #
|
|
|
|
|
2 : 'L1CTL_FBSB_CONF', #
|
|
|
|
|
3 : 'L1CTL_DATA_IND', #
|
|
|
|
|
4 : 'L1CTL_RACH_REQ', #
|
|
|
|
|
5 : 'L1CTL_DM_EST_REQ', #
|
|
|
|
|
6 : 'L1CTL_DATA_REQ', #
|
|
|
|
|
7 : 'L1CTL_RESET_IND', #
|
|
|
|
|
8 : 'L1CTL_PM_REQ', #
|
|
|
|
|
9 : 'L1CTL_PM_CONF', #
|
|
|
|
|
10 : 'L1CTL_ECHO_REQ', #
|
|
|
|
|
11 : 'L1CTL_ECHO_CONF', #
|
|
|
|
|
12 : 'L1CTL_RACH_CONF', #
|
|
|
|
|
13 : 'L1CTL_RESET_REQ', #
|
|
|
|
|
14 : 'L1CTL_RESET_CONF', #
|
|
|
|
|
15 : 'L1CTL_DATA_CONF', #
|
|
|
|
|
16 : 'L1CTL_CCCH_MODE_REQ', #
|
|
|
|
|
17 : 'L1CTL_CCCH_MODE_CONF', #
|
|
|
|
|
18 : 'L1CTL_DM_REL_REQ', #
|
|
|
|
|
19 : 'L1CTL_PARAM_REQ', #
|
|
|
|
|
20 : 'L1CTL_DM_FREQ_REQ', #
|
|
|
|
|
21 : 'L1CTL_CRYPTO_REQ', #
|
|
|
|
|
22 : 'L1CTL_SIM_REQ', #
|
|
|
|
|
23 : 'L1CTL_SIM_CONF', #
|
|
|
|
|
24 : 'L1CTL_TCH_MODE_REQ', #
|
|
|
|
|
25 : 'L1CTL_TCH_MODE_CONF', #
|
|
|
|
|
26 : 'L1CTL_NEIGH_PM_REQ', #
|
|
|
|
|
27 : 'L1CTL_NEIGH_PM_IND', #
|
|
|
|
|
28 : 'L1CTL_TRAFFIC_REQ',
|
|
|
|
|
29 : 'L1CTL_TRAFFIC_CONF',
|
|
|
|
|
30 : 'L1CTL_TRAFFIC_IND',
|
|
|
|
|
31 : 'L1CTL_BURST_IND',
|
|
|
|
|
32 : 'L1CTL_TBF_CFG_REQ',
|
|
|
|
|
33 : 'L1CTL_TBF_CFG_CONF',
|
|
|
|
|
34 : 'L1CTL_DATA_TBF_REQ',
|
|
|
|
|
35 : 'L1CTL_DATA_TBF_CONF',
|
|
|
|
|
36 : 'L1CTL_EXT_RACH_REQ'
|
|
|
|
|
'''
|