2017-07-28 11:30:24 +00:00
|
|
|
/* TITAN REW encode/decode definitions for 3GPP TS 44.060 RLC/MAC Blocks */
|
|
|
|
module RLCMAC_Types {
|
|
|
|
import from General_Types all;
|
|
|
|
import from Osmocom_Types all;
|
|
|
|
import from GSM_Types all;
|
|
|
|
|
|
|
|
/* TS 44.060 10.4.7 */
|
|
|
|
type enumerated MacPayloadType {
|
|
|
|
MAC_PT_RLC_DATA ('00'B),
|
|
|
|
MAC_PT_RLCMAC_NO_OPT ('01'B),
|
|
|
|
MAC_PT_RLCMAC_OPT ('10'B),
|
|
|
|
MAC_PT_RESERVED ('11'B)
|
|
|
|
} with { variant "FIELDLENGTH(2)" };
|
|
|
|
|
|
|
|
/* TS 44.060 10.4.5 */
|
|
|
|
type enumerated MacRrbp {
|
|
|
|
RRBP_Nplus13_mod_2715648 ('00'B),
|
|
|
|
RRBP_Nplus17_or_18_mod_2715648 ('01'B),
|
|
|
|
RRBP_Nplus22_or_22_mod_2715648 ('10'B),
|
|
|
|
RRBP_Nplus26_mod_2715648 ('11'B)
|
|
|
|
} with { variant "FIELDLENGTH(2)" };
|
|
|
|
|
|
|
|
/* Partof DL RLC data block and DL RLC/MAC ctrl block */
|
|
|
|
type record DlMacHeader {
|
|
|
|
MacPayloadType payload_type,
|
|
|
|
MacRrbp rrbp,
|
|
|
|
boolean rrbp_valid,
|
|
|
|
uint3_t usf
|
|
|
|
} with {
|
|
|
|
variant (rrbp_valid) "FIELDLENGTH(1)"
|
|
|
|
};
|
|
|
|
|
|
|
|
/* TS 44.060 10.4.10a */
|
|
|
|
type enumerated PowerReduction {
|
|
|
|
PWR_RED_0_to_3dB ('00'B),
|
|
|
|
PWR_RED_3_to_7dB ('01'B),
|
|
|
|
PWR_RED_7_to_10dB ('10'B),
|
|
|
|
PWR_RED_RESERVED ('11'B)
|
|
|
|
} with { variant "FIELDLENGTH(2)" };
|
|
|
|
|
|
|
|
/* TS 44.060 10.4.9d */
|
|
|
|
type enumerated DirectionBit {
|
|
|
|
DIR_UPLINK_TBF ('0'B),
|
|
|
|
DIR_DOWNLINK_TBF ('1'B)
|
|
|
|
} with { variant "FIELDLENGTH(1)" };
|
|
|
|
|
|
|
|
type record TfiOctet {
|
|
|
|
/* PR, TFI, D */
|
|
|
|
PowerReduction pr,
|
|
|
|
uint5_t tfi,
|
|
|
|
DirectionBit d
|
|
|
|
} with { variant "" };
|
|
|
|
|
|
|
|
type record RbsnExtOctet {
|
|
|
|
uint3_t rbsn_e,
|
|
|
|
BIT1 fs_e,
|
|
|
|
BIT4 spare
|
|
|
|
} with { variant "" };
|
|
|
|
|
|
|
|
type record DlCtrlOptOctets {
|
|
|
|
/* RBSN, RTI, FS, AC (optional, depending on mac_hdr.payload_type) */
|
|
|
|
BIT1 rbsn,
|
|
|
|
uint5_t rti,
|
|
|
|
boolean fs,
|
|
|
|
boolean tfi_octet_present,
|
|
|
|
TfiOctet tfi optional,
|
|
|
|
RbsnExtOctet rbsn_ext optional
|
|
|
|
} with {
|
|
|
|
variant (fs) "FIELDLENGTH(1)"
|
|
|
|
variant (tfi_octet_present) "FIELDLENGTH(1)"
|
|
|
|
variant (tfi) "PRESENCE(tfi_octet_present = true)"
|
|
|
|
variant (rbsn_ext) "PRESENCE(rbsn='1'B, fs=false)"
|
|
|
|
};
|
|
|
|
|
|
|
|
/* TS 44.060 10.3.1 Downlink RLC/MAC control block */
|
|
|
|
type record RlcmacDlCtrlBlock {
|
|
|
|
DlMacHeader mac_hdr,
|
|
|
|
DlCtrlOptOctets opt optional,
|
|
|
|
octetstring payload
|
|
|
|
} with {
|
|
|
|
variant (opt) "PRESENCE(mac_hdr.payload_type = MAC_PT_RLCMAC_OPT)"
|
|
|
|
};
|
|
|
|
|
|
|
|
external function enc_RlcmacDlCtrlBlock(in RlcmacDlCtrlBlock si) return octetstring
|
|
|
|
with { extension "prototype(convert) encode(RAW)" };
|
|
|
|
external function dec_RlcmacDlCtrlBlock(in octetstring stream) return RlcmacDlCtrlBlock
|
|
|
|
with { extension "prototype(convert) decode(RAW)" };
|
|
|
|
|
|
|
|
type record UlMacCtrlHeader {
|
2017-07-30 22:05:23 +00:00
|
|
|
MacPayloadType payload_type,
|
2017-07-28 11:30:24 +00:00
|
|
|
BIT5 spare,
|
|
|
|
boolean retry
|
|
|
|
} with { variant (retry) "FIELDLENGTH(1)" };
|
|
|
|
|
|
|
|
/* TS 44.060 10.3.2 UplinkRLC/MAC control block */
|
|
|
|
type record RlcmacUlCtrlBlock {
|
|
|
|
UlMacCtrlHeader mac_hdr,
|
|
|
|
octetstring payload
|
|
|
|
} with { variant "" };
|
|
|
|
|
|
|
|
external function enc_RlcmacUlCtrlBlock(in RlcmacUlCtrlBlock si) return octetstring
|
|
|
|
with { extension "prototype(convert) encode(RAW)" };
|
|
|
|
external function dec_RlcmacUlCtrlBlock(in octetstring stream) return RlcmacUlCtrlBlock
|
|
|
|
with { extension "prototype(convert) decode(RAW)" };
|
|
|
|
|
|
|
|
/* a single RLC block / LLC-segment */
|
2017-07-30 20:38:03 +00:00
|
|
|
type record LlcBlockHdr {
|
2017-07-28 11:30:24 +00:00
|
|
|
uint6_t length_ind,
|
|
|
|
/* 1 = new LLC PDU starts */
|
|
|
|
BIT1 more,
|
|
|
|
/* 0 = another extension octet after LLC PDU, 1 = no more extension octets */
|
2017-07-30 20:38:03 +00:00
|
|
|
boolean e
|
2017-07-28 11:30:24 +00:00
|
|
|
} with {
|
2017-07-30 20:38:03 +00:00
|
|
|
variant (e) "FIELDLENGTH(1)"
|
2017-07-28 11:30:24 +00:00
|
|
|
};
|
2017-07-30 20:38:03 +00:00
|
|
|
type record LlcBlock {
|
|
|
|
/* Header is only present if LI field was present */
|
|
|
|
LlcBlockHdr hdr,
|
|
|
|
octetstring payload
|
|
|
|
} with { variant "" };
|
|
|
|
type record of LlcBlock LlcBlocks;
|
2017-07-28 11:30:24 +00:00
|
|
|
|
|
|
|
/* TS 44.060 10.2.1 Downlink RLC data block */
|
2017-07-30 20:38:03 +00:00
|
|
|
type record DlMacHdrDataExt {
|
2017-07-28 11:30:24 +00:00
|
|
|
/* Octet 1 */
|
|
|
|
PowerReduction pr,
|
|
|
|
BIT1 spare,
|
|
|
|
uint4_t tfi, /* 3 or 4? */
|
|
|
|
boolean fbi,
|
2017-07-30 20:38:03 +00:00
|
|
|
/* Octet 2 */
|
2017-07-28 11:30:24 +00:00
|
|
|
uint7_t bsn,
|
2017-07-30 20:38:03 +00:00
|
|
|
boolean e
|
|
|
|
} with {
|
|
|
|
variant (e) "FIELDLENGTH(1)"
|
|
|
|
};
|
|
|
|
type record DlMacDataHeader {
|
|
|
|
DlMacHeader mac_hdr,
|
|
|
|
DlMacHdrDataExt hdr_ext
|
2017-07-28 11:30:24 +00:00
|
|
|
} with { variant "" };
|
2017-07-30 20:38:03 +00:00
|
|
|
type record RlcmacDlDataBlock {
|
|
|
|
DlMacDataHeader mac_hdr,
|
|
|
|
/* Octet 3..M / N: manual C++ Decoder */
|
|
|
|
LlcBlocks blocks
|
|
|
|
} with {
|
|
|
|
variant ""
|
|
|
|
};
|
2017-07-28 11:30:24 +00:00
|
|
|
|
2017-07-30 20:38:03 +00:00
|
|
|
external function enc_RlcmacDlDataBlock(in RlcmacDlDataBlock si) return octetstring;
|
|
|
|
external function dec_RlcmacDlDataBlock(in octetstring stream) return RlcmacDlDataBlock;
|
2017-07-28 11:30:24 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* TS 44.060 10.2.2 */
|
|
|
|
type record UlMacDataHeader {
|
2017-07-30 20:38:03 +00:00
|
|
|
/* Octet 0 */
|
2017-07-30 22:05:23 +00:00
|
|
|
MacPayloadType payload_type,
|
2017-07-28 11:30:24 +00:00
|
|
|
uint4_t countdown,
|
|
|
|
boolean stall_ind,
|
2017-07-30 20:38:03 +00:00
|
|
|
boolean retry,
|
|
|
|
/* Octet 1 */
|
|
|
|
BIT1 spare,
|
|
|
|
boolean pfi_ind,
|
|
|
|
uint5_t tfi,
|
|
|
|
boolean tlli_ind,
|
|
|
|
/* Octet 2 */
|
|
|
|
uint7_t bsn,
|
|
|
|
boolean e
|
2017-07-28 11:30:24 +00:00
|
|
|
} with {
|
2017-07-30 20:38:03 +00:00
|
|
|
variant (stall_ind) "FIELDLENGTH(1)"
|
|
|
|
variant (retry) "FIELDLENGTH(1)"
|
|
|
|
variant (pfi_ind) "FIELDLENGTH(1)"
|
|
|
|
variant (tlli_ind) "FIELDLENGTH(1)"
|
|
|
|
variant (e) "FIELDLENGTH(1)"
|
2017-07-28 11:30:24 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
type record RlcMacUlPfi {
|
|
|
|
uint7_t pfi,
|
|
|
|
boolean m
|
|
|
|
} with {
|
|
|
|
variant (m) "FIELDLENGTH(1)"
|
|
|
|
};
|
|
|
|
|
|
|
|
/* TS 44.060 10.2.2 */
|
|
|
|
type record RlcmacUlDataBlock {
|
|
|
|
/* MAC header */
|
|
|
|
UlMacDataHeader mac_hdr,
|
2017-07-30 20:38:03 +00:00
|
|
|
/* Octet 3 ... M (optional): manual C++ Decoder */
|
|
|
|
GprsTlli tlli optional,
|
|
|
|
RlcMacUlPfi pfi optional,
|
|
|
|
LlcBlocks blocks
|
2017-07-28 11:30:24 +00:00
|
|
|
} with {
|
2017-07-30 20:38:03 +00:00
|
|
|
variant (tlli) "PRESENCE(mac_hdr.tlli_ind = true)"
|
|
|
|
variant (pfi) "PRESENCE(mac_hdr.pfi_ind = true)"
|
2017-07-28 11:30:24 +00:00
|
|
|
};
|
|
|
|
|
2017-07-30 20:38:03 +00:00
|
|
|
external function enc_RlcmacUlDataBlock(in RlcmacUlDataBlock si) return octetstring;
|
|
|
|
external function dec_RlcmacUlDataBlock(in octetstring stream) return RlcmacUlDataBlock;
|
2017-07-28 11:30:24 +00:00
|
|
|
|
2017-07-30 22:05:23 +00:00
|
|
|
type union RlcmacUlBlock {
|
|
|
|
RlcmacUlDataBlock data,
|
|
|
|
RlcmacUlCtrlBlock ctrl
|
|
|
|
} with {
|
|
|
|
variant "TAG(data, mac_hdr.payload_type = MAC_PT_RLC_DATA;
|
|
|
|
ctrl, mac_hdr.payload_type = MAC_PT_RLCMAC_NO_OPT;
|
|
|
|
ctrl, mac_hdr.payload_type = MAC_PT_RLCMAC_OPT)"
|
|
|
|
};
|
|
|
|
|
2017-07-31 15:33:56 +00:00
|
|
|
/* as the sub-types (RlcmacDl*Block) are not using the RAW coder, we cannot
|
|
|
|
* use auto-generated functions here, as they would decode those sub-types
|
|
|
|
* based on the RAW coder, not baed on the manual C++ functions */
|
|
|
|
external function enc_RlcmacUlBlock(in RlcmacUlBlock si) return octetstring;
|
|
|
|
external function dec_RlcmacUlBlock(in octetstring stream) return RlcmacUlBlock;
|
2017-07-30 22:05:23 +00:00
|
|
|
|
|
|
|
type union RlcmacDlBlock {
|
|
|
|
RlcmacDlDataBlock data,
|
|
|
|
RlcmacDlCtrlBlock ctrl
|
|
|
|
} with {
|
|
|
|
variant "TAG(data, mac_hdr.mac_hdr.payload_type = MAC_PT_RLC_DATA;
|
|
|
|
ctrl, mac_hdr.payload_type = MAC_PT_RLCMAC_NO_OPT;
|
|
|
|
ctrl, mac_hdr.payload_type = MAC_PT_RLCMAC_OPT)"
|
|
|
|
};
|
|
|
|
|
2017-07-31 15:33:56 +00:00
|
|
|
/* as the sub-types (RlcmacDl*Block) are not using the RAW coder, we cannot
|
|
|
|
* use auto-generated functions here, as they would decode those sub-types
|
|
|
|
* based on the RAW coder, not baed on the manual C++ functions */
|
|
|
|
external function enc_RlcmacDlBlock(in RlcmacDlBlock si) return octetstring;
|
|
|
|
external function dec_RlcmacDlBlock(in octetstring stream) return RlcmacDlBlock;
|
2017-07-30 22:05:23 +00:00
|
|
|
|
2017-07-28 11:30:24 +00:00
|
|
|
} with { encode "RAW"; variant "FIELDORDER(msb)" }
|