| 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)" } |