osmo-ttcn3-hacks/library/L1CTL_Types.ttcn

450 lines
11 KiB
Plaintext

/* Data Types / Encoding / Decoding for OsmocomBB L1CTL interface */
/* (C) 2017 by Harald Welte <laforge@gnumonks.org>, derived from l1ctl_proto.h
* (C) 2010 by Harald Welte + Holger Hans Peter Freyther */
module L1CTL_Types {
import from General_Types all;
import from GSM_Types all;
import from Osmocom_Types all;
type enumerated L1ctlMsgType {
L1CTL_NONE,
L1CTL_FBSB_REQ,
L1CTL_FBSB_CONF,
L1CTL_DATA_IND,
L1CTL_RACH_REQ,
L1CTL_DM_EST_REQ,
L1CTL_DATA_REQ,
L1CTL_RESET_IND,
L1CTL_PM_REQ, /* power measurement */
L1CTL_PM_CONF, /* power measurement */
L1CTL_ECHO_REQ,
L1CTL_ECHO_CONF,
L1CTL_RACH_CONF,
L1CTL_RESET_REQ,
L1CTL_RESET_CONF,
L1CTL_DATA_CONF,
L1CTL_CCCH_MODE_REQ,
L1CTL_CCCH_MODE_CONF,
L1CTL_DM_REL_REQ,
L1CTL_PARAM_REQ,
L1CTL_DM_FREQ_REQ,
L1CTL_CRYPTO_REQ,
L1CTL_SIM_REQ,
L1CTL_SIM_CONF,
L1CTL_TCH_MODE_REQ,
L1CTL_TCH_MODE_CONF,
L1CTL_NEIGH_PM_REQ,
L1CTL_NEIGH_PM_IND,
L1CTL_TRAFFIC_REQ,
L1CTL_TRAFFIC_CONF,
L1CTL_TRAFFIC_IND
} with { variant "FIELDLENGTH(8)" };
type enumerated L1ctlCcchMode {
CCCH_MODE_NONE (0),
CCCH_MODE_NON_COMBINED,
CCCH_MODE_COMBINED
} with { variant "FIELDLENGTH(8)" };
type enumerated L1ctlNeighMode {
NEIGH_MODE_NONE (0),
NEIGH_MODE_PM,
NEIGH_MODE_SB
} with { variant "FIELDLENGTH(8)" };
type enumerated L1ctlResetType {
L1CTL_RES_T_BOOT (0),
L1CTL_RES_T_FULL,
L1CTL_RES_T_SCHED
} with { variant "FIELDLENGTH(8)" };
const integer TRAFFIC_DATA_LEN := 40;
type record L1ctlHdrFlags {
BIT7 padding,
boolean f_done
} with { variant "" };
type record L1ctlHeader {
L1ctlMsgType msg_type,
L1ctlHdrFlags flags,
OCT2 padding
} with { variant "" };
template L1ctlHeader t_L1ctlHeader(template L1ctlMsgType msg_type) := {
msg_type := msg_type,
flags := { padding := '0000000'B, f_done := false },
padding := '0000'O
};
type record L1ctlDlInfo {
RslChannelNr chan_nr,
RslLinkId link_id,
Arfcn arfcn,
uint32_t frame_nr,
GsmRxLev rx_level,
uint8_t snr,
uint8_t num_biterr,
uint8_t fire_crc
} with { variant "" };
type record L1ctlFbsbConf {
int16_t initial_freq_err,
uint8_t result,
uint8_t bsic
} with { variant "" };
type record L1ctlCcchModeConf {
L1ctlCcchMode ccch_mode,
OCT3 padding
} with { variant "" };
/* gsm48_chan_mode */
type uint8_t L1ctlTchMode;
type record L1ctlAudioMode {
BIT4 padding,
boolean tx_microphone,
boolean tx_traffic_req,
boolean rx_speaker,
boolean rx_traffic_ind
} with { variant "" };
template L1ctlAudioMode t_L1CTL_AudioModeNone := { '0000'B, false, false, false, false };
type record L1ctlTchModeConf {
L1ctlTchMode tch_mode,
L1ctlAudioMode audio_mode,
OCT2 padding
} with { variant "" };
type record L1ctlDataInd {
octetstring payload length(23)
} with { variant "" };
type union L1ctlDlPayload {
L1ctlFbsbConf fbsb_conf,
L1ctlCcchModeConf ccch_mode_conf,
L1ctlTchModeConf tch_mode_conf,
L1ctlDataInd data_ind,
L1ctlTrafficReq traffic_ind,
octetstring other
} with { variant "" };
type record L1ctlDlMessage {
L1ctlHeader header,
L1ctlDlInfo dl_info optional,
L1ctlDlPayload payload
} with { variant (dl_info) "PRESENCE(header.msg_type = L1CTL_FBSB_CONF,
header.msg_type = L1CTL_RACH_CONF,
header.msg_type = L1CTL_DATA_IND,
header.msg_type = L1CTL_DATA_CONF,
header.msg_type = L1CTL_TRAFFIC_IND)"
variant (payload) "CROSSTAG(fbsb_conf, header.msg_type = L1CTL_FBSB_CONF;
ccch_mode_conf, header.msg_type = L1CTL_CCCH_MODE_CONF;
tch_mode_conf, header.msg_type = L1CTL_TCH_MODE_CONF;
data_ind, header.msg_type = L1CTL_DATA_IND;
traffic_ind, header.msg_type = L1CTL_TRAFFIC_IND;
other, OTHERWISE;
)" };
external function enc_L1ctlDlMessage(in L1ctlDlMessage msg) return octetstring
with { extension "prototype(convert) encode(RAW)" };
external function dec_L1ctlDlMessage(in octetstring stream) return L1ctlDlMessage
with { extension "prototype(convert) decode(RAW)" };
type record L1ctlUlInfo {
RslChannelNr chan_nr,
RslLinkId link_id,
OCT2 padding
} with { variant "" };
type record L1ctlFbsbFlags {
BIT5 padding,
boolean sb,
boolean fb1,
boolean fb0
} with { variant "" };
template L1ctlFbsbFlags t_L1CTL_FBSB_F_ALL := {
padding := '00000'B,
sb := true,
fb1 := true,
fb0 := true
};
type record L1ctlFbsbReq {
Arfcn arfcn,
uint16_t timeout_tdma_frames,
uint16_t freq_err_thresh1,
uint16_t freq_err_thresh2,
uint8_t num_freqerr_avg,
L1ctlFbsbFlags flags,
uint8_t sync_info_idx,
L1ctlCcchMode ccch_mode,
GsmRxLev rxlev_exp
} with { variant "" };
type record L1ctlCcchModeReq {
L1ctlTchMode tch_mode,
L1ctlAudioMode audio_mode,
OCT2 padding
} with { variant "" };
type record L1ctlTchModeReq {
L1ctlTchMode tch_mode,
L1ctlAudioMode audio_mode,
OCT2 padding
} with { variant "" };
type record L1ctlRachReq {
uint8_t ra,
uint8_t combined,
uint16_t offset
} with { variant "" };
type record L1ctlParReq {
int8_t ta,
uint8_t tx_power,
OCT2 padding
} with { variant "" };
type record L1ctlH1 {
uint8_t hsn,
uint8_t maio,
uint8_t n,
OCT1 padding,
bitstring ma length(64)
} with { variant "" };
type record L1ctlDmEstReq {
GsmTsc tsc,
uint8_t h,
Arfcn arfcn optional,
L1ctlH1 hopping optional,
L1ctlTchMode tch_mode,
L1ctlAudioMode audio_mode
} with { variant (arfcn) "PRESENCE(h = 0)"
variant (hopping) "PRESENCE(h = 1)" };
type record L1ctlReset {
L1ctlResetType reset_type,
OCT3 padding
} with { variant "" };
type record L1ctlTrafficReq {
octetstring data length(TRAFFIC_DATA_LEN)
} with { variant "" };
type union L1ctlUlPayload {
L1ctlFbsbReq fbsb_req,
L1ctlCcchModeReq ccch_mode_req,
L1ctlTchModeReq tch_mode_req,
L1ctlRachReq rach_req,
L1ctlParReq par_req,
L1ctlDmEstReq dm_est_req,
L1ctlReset reset_req,
//L1ctlNeighPmReq neigh_pm_req,
L1ctlTrafficReq traffic_req,
octetstring other
} with { variant "" };
type record L1ctlUlMessage {
L1ctlHeader header,
L1ctlUlInfo ul_info optional,
L1ctlUlPayload payload
} with { variant (ul_info) "PRESENCE(header.msg_type = L1CTL_RACH_REQ,
header.msg_type = L1CTL_PARAM_REQ,
header.msg_type = L1CTL_CRYPTO_REQ,
header.msg_type = L1CTL_DATA_REQ,
header.msg_type = L1CTL_DM_EST_REQ,
header.msg_type = L1CTL_DM_FREQ_REQ,
header.msg_type = L1CTL_DM_REL_REQ,
header.msg_type = L1CTL_TRAFFIC_REQ)"
variant (payload) "CROSSTAG(fbsb_req, header.msg_type = L1CTL_FBSB_REQ;
ccch_mode_req, header.msg_type = L1CTL_CCCH_MODE_REQ;
tch_mode_req, header.msg_type = L1CTL_TCH_MODE_REQ;
rach_req, header.msg_type = L1CTL_RACH_REQ;
par_req, header.msg_type = L1CTL_PARAM_REQ;
dm_est_req, header.msg_type = L1CTL_DM_EST_REQ;
reset_req, header.msg_type = L1CTL_RESET_REQ;
traffic_req, header.msg_type = L1CTL_TRAFFIC_REQ;
other, OTHERWISE;
)" };
external function enc_L1ctlUlMessage(in L1ctlUlMessage msg) return octetstring
with { extension "prototype(convert) encode(RAW)" };
external function dec_L1ctlUlMessage(in octetstring stream) return L1ctlUlMessage
with { extension "prototype(convert) decode(RAW)" };
type record L1ctlUlMessageLV {
uint16_t len,
L1ctlUlMessage msg
} with { variant (len) "LENGTHTO(msg)" };
external function enc_L1ctlUlMessageLV(in L1ctlUlMessageLV msg) return octetstring
with { extension "prototype(convert) encode(RAW)" };
external function dec_L1ctlUlMessageLV(in octetstring stream) return L1ctlUlMessageLV
with { extension "prototype(convert) decode(RAW)" };
type record L1ctlDlMessageLV {
uint16_t len,
L1ctlDlMessage msg
} with { variant (len) "LENGTHTO(msg)" };
external function enc_L1ctlDlMessageLV(in L1ctlDlMessageLV msg) return octetstring
with { extension "prototype(convert) encode(RAW)" };
external function dec_L1ctlDlMessageLV(in octetstring stream) return L1ctlDlMessageLV
with { extension "prototype(convert) decode(RAW)" };
/* for generating RESET_REQ */
template L1ctlUlMessage t_L1ctlResetReq(template L1ctlResetType rst_type) := {
header := t_L1ctlHeader(L1CTL_RESET_REQ),
ul_info := omit,
payload := {
reset_req := {
reset_type := rst_type,
padding := '000000'O
}
}
};
/* for generating FBSB_REQ */
template L1ctlUlMessage t_L1CTL_FBSB_REQ(template Arfcn arfcn, template L1ctlFbsbFlags flags, uint8_t sync_info_idx, L1ctlCcchMode ccch_mode, GsmRxLev rxlev_exp) := {
header := t_L1ctlHeader(L1CTL_FBSB_REQ),
ul_info := omit,
payload := {
fbsb_req := {
arfcn := arfcn,
timeout_tdma_frames := 10,
freq_err_thresh1 := 10000,
freq_err_thresh2 := 800,
num_freqerr_avg := 3,
flags := flags,
sync_info_idx := sync_info_idx,
ccch_mode := ccch_mode,
rxlev_exp := rxlev_exp
}
}
};
/* for matching against incoming FBSB_CONF */
template L1ctlDlMessage t_L1CTL_FBSB_CONF(template uint8_t result) := {
header := t_L1ctlHeader(L1CTL_FBSB_CONF),
dl_info := ?,
payload := {
fbsb_conf := {
initial_freq_err := ?,
result := result,
bsic := ?
}
}
};
template L1ctlUlMessage t_L1CTL_RACH_REQ(uint8_t ra, uint8_t combined, uint16_t offset) := {
header := t_L1ctlHeader(L1CTL_RACH_REQ),
ul_info := {
chan_nr := t_RslChanNr_RACH(0),
link_id := ts_RslLinkID_DCCH(0),
padding := '0000'O
},
payload := {
rach_req := {
ra := ra,
combined := combined,
offset := offset
}
}
}
template L1ctlUlMessage t_L1CTL_DM_EST_REQ(Arfcn arfcn, RslChannelNr chan_nr, GsmTsc tsc) := {
header := t_L1ctlHeader(L1CTL_DM_EST_REQ),
ul_info := {
chan_nr := chan_nr,
link_id := ts_RslLinkID_DCCH(0),
padding := '0000'O
},
payload := {
dm_est_req := {
tsc := tsc,
h := 0,
arfcn := arfcn,
hopping := omit,
tch_mode := 0,
audio_mode := t_L1CTL_AudioModeNone
}
}
}
template L1ctlUlMessage t_L1CTL_DM_REL_REQ(RslChannelNr chan_nr) := {
header := t_L1ctlHeader(L1CTL_DM_REL_REQ),
ul_info := {
chan_nr := chan_nr,
link_id := ts_RslLinkID_DCCH(0),
padding := '0000'O
},
payload := {
other := ''O
}
}
template L1ctlUlMessage t_L1CTL_DATA_REQ(template RslChannelNr chan_nr, template RslLinkId link_id, octetstring l2_data) := {
header := t_L1ctlHeader(L1CTL_DATA_REQ),
ul_info := {
chan_nr := chan_nr,
link_id := link_id,
padding := '0000'O
},
payload := {
other := l2_data
}
}
/* for matching against incoming RACH_CONF */
template L1ctlDlMessage t_L1CTL_RACH_CONF := {
header := t_L1ctlHeader(L1CTL_RACH_CONF),
dl_info := ?,
payload := ?
};
/* for matching against incoming RACH_CONF */
template L1ctlDlMessage t_L1CTL_DATA_IND(template RslChannelNr chan_nr) := {
header := t_L1ctlHeader(L1CTL_DATA_IND),
dl_info := {
chan_nr := chan_nr,
link_id := ?,
arfcn := ?,
frame_nr := ?,
rx_level := ?,
snr := ?,
num_biterr := ?,
fire_crc := ?
},
payload := {
data_ind := ?
}
};
template GsmRrMessage t_RR_IMM_ASS(uint8_t ra, uint8_t fn) := {
header := t_RrHeader(IMMEDIATE_ASSIGNMENT, ?),
payload := {
imm_ass := {
ded_or_tbf := ?,
page_mode := ?,
chan_desc := ?,
pkt_chan_desc := omit,
req_ref := f_compute_ReqRef(ra, fn),
timing_advance := ?,
mobile_allocation := ?
}
}
};
} with { encode "RAW" };