module LLC_Types { import from General_Types all; import from Osmocom_Types all; /* TS 44.064 Chapter 6.2 */ type record LlcAddressField { BIT1 pd ('0'B), boolean c_r, BIT2 reserved, LlcSapi sapi } with { variant (c_r) "FIELDLENGTH(1)" }; template LlcAddressField t_LLC_Addr(template boolean c_r, template LlcSapi sapi) := { pd := '0'B, c_r := c_r, reserved := '00'B, sapi := sapi }; const boolean LLC_CR_DL_CMD := true; const boolean LLC_CR_DL_RSP := false; const boolean LLC_CR_UL_CMD := false; const boolean LLC_CR_UL_RSP := true; template LlcAddressField t_LLC_Addr_DlCmd(template LlcSapi sapi) := t_LLC_Addr(true, sapi); template LlcAddressField t_LLC_Addr_DlRsp(template LlcSapi sapi) := t_LLC_Addr(false, sapi); template LlcAddressField t_LLC_Addr_UlCmd(template LlcSapi sapi) := t_LLC_Addr(false, sapi); template LlcAddressField t_LLC_Addr_UlRsp(template LlcSapi sapi) := t_LLC_Addr(true, sapi); type enumerated LlcSapi { LLC_SAPI_RESERVED_0 ('0000'B), LLC_SAPI_GMM ('0001'B), LLC_SAPI_TOM2 ('0010'B), LLC_SAPI_LL3 ('0011'B), LLC_SAPI_RESERVED_4 ('0100'B), LLC_SAPI_LL5 ('0101'B), LLC_SAPI_RESERVED_6 ('0110'B), LLC_SAPI_SMS ('0111'B), LLC_SAPI_TOM8 ('1000'B), LLC_SAPI_LL9 ('1001'B), LLC_SAPI_RESERVED_10 ('1010'B), LLC_SAPI_LL11 ('1011'B), LLC_SAPI_RESERVED_12 ('1100'B), LLC_SAPI_RESERVED_13 ('1101'B), LLC_SAPI_RESERVED_14 ('1110'B), LLC_SAPI_RESERVED_15 ('1111'B) } with { variant "FIELDLENGTH(4)" }; /* TS 44.064 Chapter 6.3 */ type record LlcCtrlFieldI { BIT1 presence ('0'B), boolean a, BIT1 spare, uint9_t n_s, BIT1 spare2, uint9_t n_r, LlcCtrlS s } with { variant (a) "FIELDLENGTH(1)" }; /* TS 44.064 Chapter 6.3 */ type record LlcCtrlFieldS { BIT2 presence ('10'B), boolean a, BIT2 spare, uint9_t n_r, LlcCtrlS s } with { variant (a) "FIELDLENGTH(1)" }; /* TS 44.064 Chapter 6.3 */ type record LlcCtrlFieldUI { BIT3 presence ('110'B), BIT2 spare, uint9_t n_u, boolean e, boolean pm } with { variant (e) "FIELDLENGTH(1)" variant (pm) "FIELDLENGTH(1)" }; template LlcCtrlFieldUI t_LlcCtrlUI(template uint8_t n_u) := { presence := '110'B, spare := '00'B, n_u := n_u, e := false, pm := true }; /* TS 44.064 Chapter 6.3 */ type record LlcCtrlFieldU { BIT3 presence ('111'B), boolean p_f, LlcCtrlM m } with { variant (p_f) "FIELDLENGTH(1)" }; /* TS 44.064 Chapter 6.4 */ type enumerated LlcCtrlS { LLC_S_RR ('00'B), LLC_S_ACK ('01'B), LLC_S_RNR ('10'B), LLC_S_SACK ('11'B) } with { variant "FIELDLENGTH(2)" }; /* TS 44.064 Chapter 6.4 */ type enumerated LlcCtrlM { LLC_M_DM ('0001'B), LLC_M_DISC ('0100'B), LLC_M_UA ('0110'B), LLC_M_SABM ('0111'B), LLC_M_FRMR ('1000'B), LLC_M_XID ('1011'B), LLC_M_NULL ('0000'B) } with { variant "FIELDLENGTH(4)" }; type union LlcCtrlUnion { LlcCtrlFieldI i, LlcCtrlFieldS s, LlcCtrlFieldUI ui, LlcCtrlFieldU u } with { variant "TAG(i, presence = '0'B; s, presence = '10'B; ui, presence = '110'B; u, presence = '111'B)" variant "FIELDORDER(msb)" }; external function enc_LlcCtrlUnion(in LlcCtrlUnion pdu) return octetstring with { extension "prototype(convert) encode(RAW)" }; external function dec_LlcCtrlUnion(in octetstring stream) return LlcCtrlUnion with { extension "prototype(convert) decode(RAW)" }; type uint24_t LlcFcs; type record LlcPdu { LlcAddressField addr, LlcCtrlUnion ctrl, octetstring payload//, //LlcFcs fcs } with { variant "" }; external function enc_LlcPdu(in LlcPdu pdu) return octetstring with { extension "prototype(convert) encode(RAW)" }; external function dec_LlcPdu(in octetstring stream) return LlcPdu with { extension "prototype(convert) decode(RAW)" }; template LlcPdu t_LLC_UI(template boolean c_r, template uint8_t n_u, template octetstring payload, template LlcSapi sapi := LLC_SAPI_GMM) := { addr := t_LLC_Addr(c_r, sapi), ctrl := { ui := t_LlcCtrlUI(n_u) }, payload := payload }; } with { encode "RAW"; variant "FIELDORDER(msb)" }