Harald Welte has submitted this change and it was merged.

Change subject: Migrate Gb (NS/BSSGP) code over to Ericsson NS/BSSGP modules
......................................................................


Migrate Gb (NS/BSSGP) code over to Ericsson NS/BSSGP modules

When we started out, Ericsson hadn't released yet their NS and BSSGP
modules.  Let's port our logic over to their encoder/decoders, as they
are more complete (but less regular / more difficult to use).

Change-Id: Icbc4f5d24f3419f99c9a4805f836bddd2849f492
---
M gprs_gb/Test.ttcn
M gprs_gb/gen_links.sh
M gprs_gb/regen_makefile.sh
M library/BSSGP_Emulation.ttcn
M library/NS_CodecPort.ttcn
M library/NS_Emulation.ttcn
A library/Osmocom_Gb_Types.ttcn
7 files changed, 737 insertions(+), 143 deletions(-)

Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/gprs_gb/Test.ttcn b/gprs_gb/Test.ttcn
index 1c3fb50..19cfd26 100644
--- a/gprs_gb/Test.ttcn
+++ b/gprs_gb/Test.ttcn
@@ -4,7 +4,7 @@
        import from Osmocom_Types all;
        import from GSM_Types all;
        import from GSM_RR_Types all;
-       import from BSSGP_Helper_Functions all;
+       import from Osmocom_Gb_Types all;
        import from BSSGP_Types all;
        import from BSSGP_Emulation all;
        import from NS_Types all;
@@ -16,7 +16,7 @@
 
        type record MmContext {
                octetstring     imsi optional,
-               BssgpTlli       tlli,
+               GprsTlli        tlli,
                uint9_t         n_u
        };
 
@@ -59,24 +59,9 @@
                lapdm_component.start(LAPDmStart());
        }
 
-       function f_bssgp_assert_prepr(in octetstring a, in octetstring b) {
-               log("BSSGP Input: ", a);
-               log("BSSGP Expected: ", b);
-               var octetstring a_preprocessed := f_BSSGP_expand_len(a);
-               log("BSSGP Preprocessed: ", a_preprocessed);
-
-               if (a_preprocessed != b) {
-                       setverdict(fail);
-               } else {
-                       setverdict(pass);
-               }
-       }
-
        function f_bssgp_dec_and_log(in octetstring inp) {
                log("BSSGP Input: ", inp);
-               var octetstring inp_p := f_BSSGP_expand_len(inp);
-               log("BSSGP Preprocessed: ", inp_p);
-               var BssgpPdu dec := dec_BssgpPdu(inp_p);
+               var PDU_BSSGP dec := dec_PDU_BSSGP(inp);
                log("BSSGP Decoded: ", dec);
        }
 
@@ -97,18 +82,6 @@
                const octetstring c_gmm_mt_det_req := 
'00bb146ddd0050001682ffff0a8204030e8941c00908050215f0b6'O;
                const octetstring c_gmm_mo_att_cpl := 
'01fb146ddd000004088832f44000c80051e000800e000801c009080339d7bc'O;
 
-               /* single byte length to two byte length */
-               f_bssgp_assert_prepr('04058101'O, '0405000101'O);
-               f_bssgp_assert_prepr('040589000102030405060708'O, 
'04050009000102030405060708'O);
-               /* two byte length to two byte length */
-               f_bssgp_assert_prepr('0405000101'O, '0405000101'O);
-               /* special case: DL-UD + UL-UD */
-               f_bssgp_assert_prepr('00aabbccddeeffaa29822342'O, 
'00aabbccddeeffaa2900022342'O);
-               f_bssgp_assert_prepr('01aabbccddeeffaa29822342'O, 
'01aabbccddeeffaa2900022342'O);
-               /* multiple TLVs */
-               f_bssgp_assert_prepr('234281aa4382bbbb'O, 
'23420001aa430002bbbb'O);
-               f_bssgp_assert_prepr('230080'O, '23000000'O);
-
                f_bssgp_dec_and_log(c_bvc_reset_pcu);
                f_bssgp_dec_and_log(c_bvc_reset_q);
                f_bssgp_dec_and_log(c_status_pcu);
@@ -125,16 +98,14 @@
                f_bssgp_dec_and_log(c_gmm_mt_det_req);
                f_bssgp_dec_and_log(c_gmm_mo_att_cpl);
 
-               log(t_BSSGP_PS_PAGING_IMSI(196, '262420123456789'H));
+               log(ts_BSSGP_PS_PAGING_IMSI(196, '262420123456789'H));
        }
 
        function f_ns_assert_prepr(in octetstring a, in octetstring b) {
                log("NS Input: ", a);
                log("NS Expected: ", b);
-               var octetstring a_preprocessed := f_NS_expand_len(a);
-               log("NS Preprocessed: ", a_preprocessed);
 
-               if (a_preprocessed != b) {
+               if (a != b) {
                        setverdict(fail);
                } else {
                        setverdict(pass);
@@ -143,9 +114,7 @@
 
        function f_ns_dec_and_log(in octetstring inp) {
                log("NS Input: ", inp);
-               var octetstring inp_p := f_NS_expand_len(inp);
-               log("NS Preprocessed: ", inp_p);
-               var NsPdu dec := dec_NsPdu(inp_p);
+               var PDU_NS dec := dec_PDU_NS(inp);
                log("NS Decoded: ", dec);
        }
 
@@ -167,57 +136,6 @@
                f_ns_dec_and_log(c_ns_reset_pcu);
        }
 
-       const BssgpQosProfile c_DefaultQos := { r := 80, spare := '00'B, c_r := 
false, t := false, a := false, precedence := 0 };
-       template BssgpTLV c_DefaultLifetimeTLV := t_BSSGP_IE_Lifetime(65535);
-
-       template BssgpTLV t_BSSGP_IE_LLC_PDU(LlcPdu llc) := t_BssgpIE(LLC_PDU, 
{ other := f_LLC_append_fcs(enc_LlcPdu(llc)) });
-
-       template BssgpPdu t_BSSGP_DL_UD(BssgpTlli tlli, LlcPdu llc, BssgpTLVs 
opt_tlvs := {}) := {
-               pdu_type := DL_UNITDATA,
-               u := {
-                       dl_unitdata := {
-                               tlli := tlli,
-                               qos_profile := c_DefaultQos,
-                               pdu_lifetime := c_DefaultLifetimeTLV,
-                               //tlvs := opt_tlvs & { t_BSSGP_IE_LLC_PDU(llc) }
-                               tlvs := { t_BSSGP_IE_LLC_PDU(llc) }
-                       }
-               }
-       };
-
-       template BssgpPdu t_BSSGP_UL_UD(template BssgpTlli tlli, template 
BssgpCellId cell_id, template octetstring payload) := {
-               pdu_type := UL_UNITDATA,
-               u := {
-                       ul_unitdata := {
-                               tlli := tlli,
-                               qos_profile := ?,
-                               cell_id := { iei := CELL_ID, len := 8, u := { 
cell_id := cell_id } },
-                               tlvs := {
-                                               { iei := ALIGNMENT_OCTETS, len 
:= ?, u := { other := ? } },
-                                               { iei := LLC_PDU, len := ?, u 
:= { other := payload } }
-                               }
-                       }
-               }
-       }
-
-       template BssgpPdu t_BSSGP_PS_PAGING_IMSI(BssgpBvci bvci, hexstring 
imsi) := {
-               pdu_type := PAGING_PS,
-               u := {
-                       other := {
-                               tlvs := { t_BSSGP_IE_Imsi(imsi), 
t_BSSGP_IE_Bvci(bvci), t_BSSGP_IE_Qos(c_DefaultQos) }
-                       }
-               }
-       };
-
-       template BssgpPdu t_BSSGP_PS_PAGING_PTMSI(BssgpBvci bvci, hexstring 
imsi, GsmTmsi ptmsi) := {
-               pdu_type := PAGING_PS,
-               u := {
-                       other := {
-                               tlvs := { t_BSSGP_IE_Imsi(imsi), 
t_BSSGP_IE_Bvci(bvci), t_BSSGP_IE_Qos(c_DefaultQos), t_BSSGP_IE_Tmsi(ptmsi) }
-                       }
-               }
-       };
-
        const octetstring gmm_auth_req := 
'081200102198c72477ea104895e8b959acc58b108182'O;
 
        function tx_gmm(boolean c_r, in octetstring gmm_pdu, LlcSapi sapi := 
LLC_SAPI_GMM) runs on dummy_CT {
@@ -231,9 +149,9 @@
                log(llc);
                g_mmctx.n_u := g_mmctx.n_u + 1;
 
-               log(t_BSSGP_DL_UD(g_mmctx.tlli, llc));
+               log(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_LlcPdu(llc)));
 
-               BSSGP.send(t_BSSGP_DL_UD(g_mmctx.tlli, llc));
+               BSSGP.send(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_LlcPdu(llc)));
        }
 
        function f_bssgp_establish() runs on dummy_CT {
@@ -257,13 +175,13 @@
 
                f_bssgp_establish();
 
-               BSSGP.send(t_BSSGP_PS_PAGING_IMSI(bvci, imsi));
-               BSSGP.send(t_BSSGP_PS_PAGING_PTMSI(bvci, imsi, tmsi));
+               BSSGP.send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
+               BSSGP.send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, tmsi));
 
                while (true) {
-                       var BssgpPdu pdu;
+                       var PDU_BSSGP pdu;
                        alt {
-                               [] BSSGP.receive(BssgpPdu:?) -> value pdu {
+                               [] BSSGP.receive(PDU_BSSGP:?) -> value pdu {
                                        log("BSSGP Rx: ", pdu);
                                }
                                [] BSSGP.receive(t_BssgpStsInd(?, ?, 
BVC_S_UNBLOCKED)) { repeat; }
@@ -404,7 +322,7 @@
                var template RlcmacUlBlock blk := t_RLCMAC_UL_DATA_TLLI(0, 0, 
0, {t_RLCMAC_LLCBLOCK(payload)}, false, tlli);
                L1.send(RLCMAC_ph_data_req:{tbf_id := 0, cs := cs, block := 
blk});
                /* ensure that this LLC-PDU arrives from the right TLLI at the 
(simulated) SGSN */
-               BSSGP.receive(t_BSSGP_UL_UD(tlli, ?, payload));
+               BSSGP.receive(tr_BSSGP_UL_UD(tlli, ?, payload));
 
                /* ensure the MS eceives an UL_ACK_NACK */
                alt {
@@ -428,11 +346,11 @@
                f_single_ul_block(CS1);
 
                while (true) {
-                       var BssgpPdu pdu;
+                       var PDU_BSSGP pdu;
                        var RLCMAC_ph_data_ind dl_msg;
                        alt {
 
-                               [] BSSGP.receive(BssgpPdu:?) -> value pdu {
+                               [] BSSGP.receive(PDU_BSSGP:?) -> value pdu {
                                        log("BSSGP Rx: ", pdu);
                                }
                                [] BSSGP.receive(t_BssgpStsInd(?, ?, 
BVC_S_UNBLOCKED)) { repeat; }
@@ -451,12 +369,12 @@
                f_bssgp_establish();
 
                while (true) {
-                       var BssgpPdu pdu;
+                       var PDU_BSSGP pdu;
                        alt {
-                               [] BSSGP.receive(BssgpPdu:?) -> value pdu {
+                               [] BSSGP.receive(PDU_BSSGP:?) -> value pdu {
                                        log("BSSGP Rx: ", pdu);
                                        //log("GMM Rx: ", 
dec_PDU_L3_MS_SGSN(pdu.payload));
-                                       g_mmctx.tlli := pdu.u.ul_unitdata.tlli;
+                                       g_mmctx.tlli := 
oct2int(pdu.pDU_BSSGP_UL_UNITDATA.tLLI);
                                        tx_gmm(LLC_CR_DL_CMD, gmm_auth_req);
                                }
                                [] BSSGP.receive(t_BssgpStsInd(?, ?, 
BVC_S_UNBLOCKED)) { repeat; }
@@ -494,7 +412,7 @@
 
                f_llc_dec_and_log(c_gmm_att_pcu);
 
-               f_llc_assert(f_LLC_append_fcs(c_gmm_att_pcu_nofcs), 
c_gmm_att_pcu);
+               //f_llc_assert(f_LLC_append_fcs(c_gmm_att_pcu_nofcs), 
c_gmm_att_pcu);
 
                log(valueof(t_LLC_UI(LLC_CR_DL_CMD, g_mmctx.n_u, gmm_auth_req, 
LLC_SAPI_GMM)));
                log(t_LLC_UI(LLC_CR_DL_CMD, g_mmctx.n_u, gmm_auth_req, 
LLC_SAPI_GMM));
diff --git a/gprs_gb/gen_links.sh b/gprs_gb/gen_links.sh
index 32f892f..53b50fa 100755
--- a/gprs_gb/gen_links.sh
+++ b/gprs_gb/gen_links.sh
@@ -31,8 +31,17 @@
 FILES="UD_PT.cc  UD_PT.hh  UD_PortType.ttcn  UD_Types.ttcn"
 gen_links $DIR $FILES
 
+DIR=$BASEDIR/titan.ProtocolModules.NS_v7.3.0/src
+FILES="NS_Types.ttcn"
+gen_links $DIR $FILES
+
+DIR=$BASEDIR/titan.ProtocolModules.BSSGP_v13.0.0/src
+FILES="BSSGP_EncDec.cc  BSSGP_Types.ttcn"
+gen_links $DIR $FILES
+
+
 DIR=../library
 FILES="General_Types.ttcn GSM_Types.ttcn GSM_RR_Types.ttcn Osmocom_Types.ttcn 
RLCMAC_Types.ttcn RLCMAC_CSN1_Types.ttcn RLCMAC_EncDec.cc L1CTL_Types.ttcn 
L1CTL_PortType.ttcn LAPDm_RAW_PT.ttcn LAPDm_Types.ttcn "
-FILES+="NS_Types.ttcn NS_Emulation.ttcn NS_CodecPort.ttcn 
NS_CodecPort_CtrlFunct.ttcn NS_CodecPort_CtrlFunctDef.cc "
-FILES+="BSSGP_Emulation.ttcn BSSGP_Helper.cc BSSGP_Helper_Functions.ttcn 
BSSGP_Types.ttcn "
+FILES+="NS_Emulation.ttcn NS_CodecPort.ttcn NS_CodecPort_CtrlFunct.ttcn 
NS_CodecPort_CtrlFunctDef.cc "
+FILES+="BSSGP_Emulation.ttcn Osmocom_Gb_Types.ttcn "
 gen_links $DIR $FILES
diff --git a/gprs_gb/regen_makefile.sh b/gprs_gb/regen_makefile.sh
index b883d1e..656726b 100755
--- a/gprs_gb/regen_makefile.sh
+++ b/gprs_gb/regen_makefile.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
 
-FILES="*.ttcn BSSGP_Helper.cc IPL4asp_PT.cc IPL4asp_discovery.cc 
TCCConversion.cc TCCInterface.cc NS_CodecPort_CtrlFunctDef.cc UD_PT.cc 
RLCMAC_EncDec.cc"
+FILES="*.ttcn BSSGP_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc 
TCCConversion.cc TCCInterface.cc NS_CodecPort_CtrlFunctDef.cc UD_PT.cc 
RLCMAC_EncDec.cc"
 
 ../regen-makefile.sh Test.ttcn $FILES
diff --git a/library/BSSGP_Emulation.ttcn b/library/BSSGP_Emulation.ttcn
index ac7beb8..70c9c80 100644
--- a/library/BSSGP_Emulation.ttcn
+++ b/library/BSSGP_Emulation.ttcn
@@ -2,7 +2,7 @@
        import from NS_Types all;
        import from NS_Emulation all;
        import from BSSGP_Types all;
-       import from BSSGP_Helper_Functions all;
+       import from Osmocom_Gb_Types all;
        import from IPL4asp_Types all;
 
        type record BssgpStatusIndication {
@@ -24,8 +24,8 @@
 
        /* port from our (internal) point of view */
        type port BSSGP_SP_PT message {
-               in      BssgpPdu;
-               out     BssgpPdu,
+               in      PDU_BSSGP;
+               out     PDU_BSSGP,
                        NsStatusIndication,
                        BssgpStatusIndication,
                        ASP_Event;
@@ -36,8 +36,8 @@
                in      ASP_Event,
                        NsStatusIndication,
                        BssgpStatusIndication,
-                       BssgpPdu;
-               out     BssgpPdu;
+                       PDU_BSSGP;
+               out     PDU_BSSGP;
        } with { extension "internal" };
 
        function BssgpStart() runs on BSSGP_CT {
@@ -65,10 +65,10 @@
        modulepar {
                Nsvci mp_nsei := 96;
                Nsvci mp_bvci := 196;
-               BssgpCellId mp_cellid := { ra_id := { lai := { mcc_mnc := 
'262F42'H, lac := 13135}, rac := 0 }, cell_id := 20960 };
+               BssgpCellId mp_cellid := { ra_id := { lai := { mcc_mnc := 
'26242F'H, lac := 13135}, rac := 0 }, cell_id := 20960 };
        };
 
-       function f_BnsUdReq(template BssgpPdu pdu, BssgpBvci bvci := mp_bvci) 
return NsUnitdataRequest {
+       function f_BnsUdReq(template PDU_BSSGP pdu, BssgpBvci bvci := mp_bvci) 
return NsUnitdataRequest {
                var NsUnitdataRequest udr := {
                        bvci := bvci,
                        nsei := mp_nsei,
@@ -76,13 +76,13 @@
                         * unbound integer value." when trying to send the 
reocrd rather than the octetstring */
                        //sdu := omit,
                        //bssgp := valueof(pdu)
-                       sdu := f_BSSGP_compact_len(enc_BssgpPdu(valueof(pdu))),
+                       sdu := enc_PDU_BSSGP(valueof(pdu)),
                        bssgp := omit
                }
                return udr;
        }
 
-       function f_BnsUdInd(template BssgpPdu pdu, template BssgpBvci bvci := 
mp_bvci) return template NsUnitdataIndication {
+       function f_BnsUdInd(template PDU_BSSGP pdu, template BssgpBvci bvci := 
mp_bvci) return template NsUnitdataIndication {
                var template NsUnitdataIndication udi := {
                        bvci := bvci,
                        nsei := mp_nsei,
@@ -99,9 +99,9 @@
        }
 
        private function f_sendReset() runs on BSSGP_CT {
-               var BssgpPdu pdu := 
valueof(t_BVC_RESET(BSSGP_CAUSE_OM_INTERVENTION, mp_bvci, mp_cellid));
+               var PDU_BSSGP pdu := 
valueof(ts_BVC_RESET(BSSGP_CAUSE_OM_INTERVENTION, mp_bvci, mp_cellid));
                log("PDU: ", pdu);
-               log("ENC: ", enc_BssgpPdu(pdu));
+               log("ENC: ", enc_PDU_BSSGP(pdu));
 
                /* BVC-RESET is always sent via the SIGNALLING BVCI, see Table 
5.4.1 */
                BSCP.send(f_BnsUdReq(pdu, 0));
@@ -119,9 +119,9 @@
                g_T1.start;
        }
 
-       private function f_sendStatus(BssgpCause cause, BssgpPdu pdu) runs on 
BSSGP_CT {
+       private function f_sendStatus(BssgpCause cause, PDU_BSSGP pdu) runs on 
BSSGP_CT {
                /* FIXME: Make sure correct Signaling or PTP BVCI is used! */
-               BSCP.send(f_BnsUdReq(t_BSSGP_STATUS({ t_BSSGP_IE_Cause(cause), 
t_BSSGP_IE_Bvci(mp_bvci), t_BSSGP_IE_PDU(pdu)})));
+               BSCP.send(f_BnsUdReq(ts_BSSGP_STATUS(mp_bvci, cause, pdu)));
        }
 
        altstep as_allstate() runs on BSSGP_CT {
@@ -136,20 +136,20 @@
                }
 
                /* Respond to RESET with correct BVCI/CellID */
-               [] BSCP.receive(f_BnsUdInd(t_BVC_RESET(?, mp_bvci, mp_cellid), 
0)) -> value udi {
+               [] BSCP.receive(f_BnsUdInd(tr_BVC_RESET(?, mp_bvci, mp_cellid), 
0)) -> value udi {
                        log("Rx BVC-RESET for Our BVCI=", mp_bvci);
-                       BSCP.send(f_BnsUdReq(t_BVC_RESET_ACK(mp_bvci, 
mp_cellid), 0));
+                       BSCP.send(f_BnsUdReq(ts_BVC_RESET_ACK(mp_bvci, 
mp_cellid), 0));
                        f_change_state(BVC_S_UNBLOCKED);
                }
 
                /* Respond to RESET for signalling BVCI 0 */
-               [] BSCP.receive(f_BnsUdInd(t_BVC_RESET(?, 0, mp_cellid), 0)) -> 
value udi {
+               [] BSCP.receive(f_BnsUdInd(tr_BVC_RESET(?, 0, mp_cellid), 0)) 
-> value udi {
                        log("Rx BVC-RESET for Signaling BVCI=0");
-                       BSCP.send(f_BnsUdReq(t_BVC_RESET_ACK(0, mp_cellid), 0));
+                       BSCP.send(f_BnsUdReq(ts_BVC_RESET_ACK(0, mp_cellid), 
0));
                }
 
                /* Respond to RESET with wrong NSEI/NSVCI */
-               [] BSCP.receive(f_BnsUdInd(t_BVC_RESET(?, ?, ?), 0)) -> value 
udi {
+               [] BSCP.receive(f_BnsUdInd(tr_BVC_RESET(?, ?, ?), 0)) -> value 
udi {
                        log("Rx BVC-RESET for unknown BVCI");
                        f_sendStatus(BSSGP_CAUSE_BVCI_UNKNOWN, udi.bssgp);
                }
@@ -175,11 +175,11 @@
 
        private function f_ScanEvents() runs on BSSGP_CT {
                var NsUnitdataIndication udi;
-               var BssgpPdu bs_pdu;
+               var PDU_BSSGP bs_pdu;
                var default d;
 
 
-               log("matching against ", t_BVC_RESET(?, mp_bvci, mp_cellid));
+               log("matching against ", tr_BVC_RESET(?, mp_bvci, mp_cellid));
 
                d := activate(as_allstate());
 
@@ -213,28 +213,30 @@
                                        g_T1.stop;
                                        f_change_state(BVC_S_BLOCKED);
                                }
-                               [] 
BSCP.receive(f_BnsUdInd(t_BVC_RESET_ACK(mp_bvci, mp_cellid), 0)) -> value udi {
+                               [] 
BSCP.receive(f_BnsUdInd(tr_BVC_RESET_ACK(mp_bvci, mp_cellid), 0)) -> value udi {
                                        g_T2.stop;
                                        f_change_state(BVC_S_UNBLOCKED);
                                }
 
                                /* simply acknowledge all Flow Control Messages 
*/
+/*
                                [g_sgsn_role] 
BSCP.receive(f_BnsUdInd(t_BVC_FC_BVC)) {
                                        BSCP.send(f_BnsUdReq(t_BVC_FC_BVC_ACK));
                                }
                                [g_sgsn_role] 
BSCP.receive(f_BnsUdInd(t_BVC_FC_MS)) {
                                        BSCP.send(f_BnsUdReq(t_BVC_FC_MS_ACK));
                                }
+*/
 
                                /* BSSGP-UNITDATA PDUs from network to 
NS-UNITDATA.ind to user */
-                               [] 
BSCP.receive(f_BnsUdInd(tr_BSSGP_type(DL_UNITDATA))) -> value udi {
+                               [not g_sgsn_role] 
BSCP.receive(f_BnsUdInd(tr_BSSGP_DL_UD)) -> value udi {
                                        BSSGP_SP.send(udi.bssgp);
                                }
-                               [] 
BSCP.receive(f_BnsUdInd(tr_BSSGP_type(UL_UNITDATA))) -> value udi {
+                               [g_sgsn_role] 
BSCP.receive(f_BnsUdInd(tr_BSSGP_UL_UD)) -> value udi {
                                        BSSGP_SP.send(udi.bssgp);
                                }
                                /* pass virtually any PDU from user to 
NS-UNITDATA PDU on network */
-                               [] BSSGP_SP.receive(BssgpPdu:?) -> value bs_pdu 
{
+                               [] BSSGP_SP.receive(PDU_BSSGP:?) -> value 
bs_pdu {
                                        BSCP.send(f_BnsUdReq(bs_pdu));
                                }
 
diff --git a/library/NS_CodecPort.ttcn b/library/NS_CodecPort.ttcn
index 29f8aa5..82ba55b 100644
--- a/library/NS_CodecPort.ttcn
+++ b/library/NS_CodecPort.ttcn
@@ -2,7 +2,6 @@
 
        import from IPL4asp_PortType all;
        import from IPL4asp_Types all;
-       import from BSSGP_Helper_Functions all;
        import from NS_Types all;
 
        type record NS_RecvFrom {
@@ -11,10 +10,10 @@
                PortNumber      remPort,
                HostName        locName,
                PortNumber      locPort,
-               NsPdu           msg
+               PDU_NS          msg
        }
 
-       template NS_RecvFrom t_NS_RecvFrom(template NsPdu pdu) := {
+       template NS_RecvFrom t_NS_RecvFrom(template PDU_NS pdu) := {
                connId := ?,
                remName := ?,
                remPort := ?,
@@ -25,10 +24,10 @@
 
        type record NS_Send {
                ConnectionId    connId,
-               NsPdu           msg
+               PDU_NS          msg
        }
 
-       template NS_Send t_NS_Send(template ConnectionId connId, template NsPdu 
msg) := {
+       template NS_Send t_NS_Send(template ConnectionId connId, template 
PDU_NS msg) := {
                connId := connId,
                msg := msg
        }
@@ -39,13 +38,13 @@
                pout.remPort := pin.remPort;
                pout.locName := pin.locName;
                pout.locPort := pin.locPort;
-               pout.msg := dec_NsPdu(f_NS_expand_len(pin.msg));
+               pout.msg := dec_PDU_NS(pin.msg);
        } with { extension "prototype(fast)" };
 
        private function NS_to_IPL4_Send(in NS_Send pin, out ASP_Send pout) {
                pout.connId := pin.connId;
                pout.proto := { udp := {} };
-               pout.msg := f_NS_compact_len(enc_NsPdu(pin.msg));
+               pout.msg := enc_PDU_NS(pin.msg);
        } with { extension "prototype(fast)" };
 
        type port NS_CODEC_PT message {
diff --git a/library/NS_Emulation.ttcn b/library/NS_Emulation.ttcn
index 253c91e..5924bbe 100644
--- a/library/NS_Emulation.ttcn
+++ b/library/NS_Emulation.ttcn
@@ -1,7 +1,7 @@
 module NS_Emulation {
        import from NS_Types all;
        import from BSSGP_Types all;
-       import from BSSGP_Helper_Functions all;
+       import from Osmocom_Gb_Types all;
        import from NS_CodecPort all;
        import from NS_CodecPort_CtrlFunct all;
        import from IPL4asp_Types all;
@@ -10,11 +10,11 @@
                BssgpBvci       bvci,
                Nsei            nsei,
                octetstring     sdu optional,
-               BssgpPdu        bssgp optional
+               PDU_BSSGP       bssgp optional
        }
 
        template NsUnitdataRequest t_NsUdReq(template Nsei nsei, template 
BssgpBvci bvci, template octetstring sdu,
-                                            template BssgpPdu bssgp) := {
+                                            template PDU_BSSGP bssgp) := {
                bvci := bvci,
                nsei := nsei,
                sdu := sdu,
@@ -25,14 +25,14 @@
                BssgpBvci       bvci,
                Nsei            nsei,
                octetstring     sdu optional,
-               BssgpPdu        bssgp optional
+               PDU_BSSGP       bssgp optional
        }
 
        template NsUnitdataIndication t_NsUdInd(Nsei nsei, BssgpBvci bvci, 
octetstring sdu) := {
                bvci := bvci,
                nsei := nsei,
                sdu := sdu,
-               bssgp := dec_BssgpPdu(f_BSSGP_expand_len(sdu))
+               bssgp := dec_PDU_BSSGP(sdu)
        }
 
        type record NsStatusIndication {
@@ -186,7 +186,7 @@
                /* default case of handling unknown PDUs */
                [] NSCP.receive(t_NS_RecvFrom(?)) -> value rf {
                        log("Rx Unexpected NS PDU ", rf.msg," in state ", 
g_state);
-                       NSCP.send(t_NS_Send(g_conn_id, 
t_NS_STATUS(NS_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE, rf.msg)));
+                       NSCP.send(t_NS_Send(g_conn_id, 
ts_NS_STATUS(NS_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE, rf.msg)));
                }
                /* Forwarding of ASP_Evet to user */
                [] NSCP.receive(ASP_Event:?) -> value evt { NS_SP.send(evt); }
@@ -250,7 +250,9 @@
                                }
                                /* NS-UNITDATA PDU from network to 
NS-UNITDATA.ind to user */
                                [] NSCP.receive(t_NS_RecvFrom(t_NS_UNITDATA(?, 
?, ?))) -> value rf {
-                                       NS_SP.send(t_NsUdInd(mp_nsei, 
rf.msg.u.unitdata.bvci, rf.msg.u.unitdata.sdu));
+                                       NS_SP.send(t_NsUdInd(mp_nsei,
+                                                            
oct2int(rf.msg.pDU_NS_Unitdata.bVCI),
+                                                            
rf.msg.pDU_NS_Unitdata.nS_SDU));
                                }
                                /* NS-UNITDATA.req from user to NS-UNITDATA PDU 
on network */
                                [] NS_SP.receive(t_NsUdReq(mp_nsei, ?, ?, 
omit)) -> value ud_req {
@@ -259,7 +261,7 @@
                                }
                                [] NS_SP.receive(t_NsUdReq(mp_nsei, ?, omit, 
?)) -> value ud_req {
                                        /* using decoded BSSGP PDU that we need 
to encode first */
-                                       var octetstring enc := 
f_BSSGP_compact_len(enc_BssgpPdu(ud_req.bssgp));
+                                       var octetstring enc := 
enc_PDU_BSSGP(ud_req.bssgp);
                                        NSCP.send(t_NS_Send(g_conn_id, 
t_NS_UNITDATA(t_SduCtrlB, ud_req.bvci, enc)));
                                }
                        }
diff --git a/library/Osmocom_Gb_Types.ttcn b/library/Osmocom_Gb_Types.ttcn
new file mode 100644
index 0000000..641e562
--- /dev/null
+++ b/library/Osmocom_Gb_Types.ttcn
@@ -0,0 +1,664 @@
+module Osmocom_Gb_Types {
+
+       /* This module contains additional definitions and templates that we 
use on top of the
+        * TITAN NS + BSSGP modules */
+
+       import from General_Types all;
+       import from Osmocom_Types all;
+       import from GSM_Types all;
+       import from GSM_RR_Types all;
+       import from BSSGP_Types all
+       import from NS_Types all
+
+       type uint16_t Nsvci;
+       type uint16_t Nsei;
+       type uint16_t BssgpBvci;
+
+       /* TS 48.016 10.3.7 */
+       type enumerated NsPduType {
+               NS_PDUT_NS_UNITDATA     ('00000000'B),
+               NS_PDUT_NS_RESET        ('00000010'B),
+               NS_PDUT_NS_RESET_ACK    ('00000011'B),
+               NS_PDUT_NS_BLOCK        ('00000100'B),
+               NS_PDUT_NS_BLOCK_ACK    ('00000101'B),
+               NS_PDUT_NS_UNBLOCK      ('00000110'B),
+               NS_PDUT_NS_UNBLOCK_ACK  ('00000111'B),
+               NS_PDUT_NS_STATUS       ('00001000'B),
+               NS_PDUT_NS_ALIVE        ('00001010'B),
+               NS_PDUT_NS_ALIVE_ACK    ('00001011'B)
+               /* FIXME: SNS */
+       } with { variant "FIELDLENGTH(8)" };
+
+       /* TS 48.016 10.3 */
+       type enumerated NsIEI {
+               NS_IEI_CAUSE            ('00000000'B),
+               NS_IEI_NSVCI            ('00000001'B),
+               NS_IEI_NS_PDU           ('00000010'B),
+               NS_IEI_BVCI             ('00000011'B),
+               NS_IEI_NSEI             ('00000100'B),
+               NS_IEI_LIST_IPv4        ('00000101'B),
+               NS_IEI_LIST_IPv6        ('00000110'B),
+               NS_IEI_MAX_NUM_NSVC     ('00000111'B),
+               NS_IEI_NUM_IPv4_EP      ('00001000'B),
+               NS_IEI_NUM_IPv6_EP      ('00001001'B),
+               NS_IEI_RESET_FLAG       ('00001010'B),
+               NS_IEI_IP_ADDRESS       ('00001011'B)
+       } with { variant "FIELDLENGTH(8)" };
+
+       /* TS 48.016 10.3.2 */
+       type enumerated NsCause {
+               NS_CAUSE_TRANSIT_NETWORK_FAILURE                ('00000000'B),
+               NS_CAUSE_OM_INTERVENTION                        ('00000001'B),
+               NS_CAUSE_EQUIPMENT_FAILURE                      ('00000010'B),
+               NS_CAUSE_NSVC_BLOCKED                           ('00000011'B),
+               NS_CAUSE_NSVC_UNKNOWN                           ('00000100'B),
+               NS_CAUSE_BVCI_UNKNOWN_AT_NSE                    ('00000101'B),
+               NS_CAUSE_SEMANTICALLY_INCORRECT_PDU             ('00001000'B),
+               NS_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE ('00001010'B),
+               NS_CAUSE_PROTOCOL_ERROR_UNSPEIFIED              ('00001011'B),
+               NS_CAUSE_INVALID_ESSENTIAL_IE                   ('00001100'B),
+               NS_CAUSE_MISSING_ESSENTIAL_IE                   ('00001101'B),
+               NS_CAUSE_INVALID_NR_OF_IPv4_ENDPOINTS           ('00001110'B),
+               NS_CAUSE_INVALID_NR_OF_IPv6_ENDPOINTS           ('00001111'B),
+               NS_CAUSE_INVALID_NR_OF_NSVCS                    ('00010000'B),
+               NS_CAUSE_INVALID_WEIGHTS                        ('00010001'B),
+               NS_CAUSE_UNKNOWN_IP_ENDPOINT                    ('00010010'B),
+               NS_CAUSE_UNKNOWN_IP_ADDRESS                     ('00010011'B),
+               NS_CAUSE_IP_TEST_FAILEDA                        ('00010100'B)
+       } with { variant "FIELDLENGTH(8)" };
+
+       template NS_SDU_ControlBits t_SduCtrlB := {
+               rBit := '0'B,
+               cBit := '0'B,
+               spare := '000000'B
+       }
+
+       function t_NS_IE_CAUSE(template NsCause cause) return template CauseNS {
+               var template CauseNS ret;
+               ret.iEI := '00'O;
+               ret.ext := '1'B;
+               ret.lengthIndicator := { length1 := 1 };
+               if (isvalue(cause)) {
+                       ret.cause := int2oct(enum2int(valueof(cause)), 1);
+               } else {
+                       ret.cause := ?
+               }
+               return ret;
+       }
+
+       private function f_oct_or_wc(template integer inp, integer len) return 
template octetstring {
+               if (isvalue(inp)) {
+                       return int2oct(valueof(inp), len);
+               } else {
+                       return ?
+               }
+       }
+
+       template NS_VCI t_NS_IE_NSVCI(template Nsvci nsvci) := {
+               iEI := '01'O,
+               ext := '1'B,
+               lengthIndicator := {
+                       length1 := 2
+               },
+               nS_VCI := f_oct_or_wc(nsvci, 2)
+       }
+
+       template NSEI_NS t_NS_IE_NSEI(template Nsei nsei) := {
+               iEI:= '04'O,
+               ext := '1'B,
+               lengthIndicator := {
+                       length1 := 2
+               },
+               nSEI := f_oct_or_wc(nsei, 2)
+       }
+
+       template PDU_NS t_NS_RESET(template NsCause cause, template Nsvci 
nsvci, template Nsei nsei) := {
+               pDU_NS_Reset := {
+                       nsPduType := '02'O,
+                       causeNS := t_NS_IE_CAUSE(cause),
+                       nS_VCI := t_NS_IE_NSVCI(nsvci),
+                       nSEI_NS := t_NS_IE_NSEI(nsei)
+               }
+       }
+
+       template PDU_NS t_NS_RESET_ACK(template Nsvci nsvci, template Nsei 
nsei) := {
+               pDU_NS_Reset_Ack := {
+                       nsPduType := '03'O,
+                       nS_VCI := t_NS_IE_NSVCI(nsvci),
+                       nSEI_NS := t_NS_IE_NSEI(nsei)
+               }
+       }
+
+       template PDU_NS t_NS_BLOCK(template NsCause cause, template Nsvci 
nsvci) := {
+               pDU_NS_Block := {
+                       nsPduType := '04'O,
+                       causeNS := t_NS_IE_CAUSE(cause),
+                       nS_VCI := t_NS_IE_NSVCI(nsvci)
+               }
+       }
+
+       template PDU_NS t_NS_BLOCK_ACK(template Nsvci nsvci) := {
+               pDU_NS_Block_Ack := {
+                       nsPduType := '05'O,
+                       nS_VCI := t_NS_IE_NSVCI(nsvci)
+               }
+       }
+
+       template PDU_NS t_NS_UNBLOCK := {
+               pDU_NS_Unblock := {
+                       nsPduType := '06'O
+               }
+       }
+
+       template PDU_NS t_NS_UNBLOCK_ACK := {
+               pDU_NS_Unblock_Ack := {
+                       nsPduType := '07'O
+               }
+       }
+
+       template PDU_NS t_NS_ALIVE := {
+               pDU_NS_Alive := {
+                       nsPduType := '0A'O
+               }
+       }
+
+       template PDU_NS t_NS_ALIVE_ACK := {
+               pDU_NS_Alive_Ack := {
+                       nsPduType := '0B'O
+               }
+       }
+
+       template PDU_NS ts_NS_STATUS(NsCause cause, PDU_NS pdu) := {
+               pDU_NS_Status := {
+                       nsPduType := '08'O,
+                       causeNS := t_NS_IE_CAUSE(cause),
+                       nS_VCI := omit,
+                       nS_PDU := {
+                               iEI := '02'O,
+                               ext := '1'B,
+                               lengthIndicator := {
+                                       length1 := 0 /* overwritten */
+                               },
+                               ns_PDU := enc_PDU_NS(pdu)
+                       },
+                       bVCI_NS := omit,
+                       listofIP4Elements := omit,
+                       listofIP6Elements := omit
+               }
+       }
+
+       template PDU_NS t_NS_UNITDATA(template NS_SDU_ControlBits bits, 
template BssgpBvci bvci, template
+octetstring sdu) := {
+               pDU_NS_Unitdata := {
+                       nsPduType := '00'O,
+                       nS_SDU_ControlBits := bits,
+                       bVCI := f_oct_or_wc(bvci, 2),
+                       nS_SDU := sdu
+               }
+       }
+
+
+       type record BssgpCellId {
+               RoutingAreaIdentification       ra_id,
+               CellIdentity                    cell_id
+       } with { variant "" };
+
+       type enumerated BssgpCause {
+               BSSGP_CAUSE_PROC_OVERLOAD                       ('00'H),
+               BSSGP_CAUSE_EQUIMENT_FAILURE                    ('01'H),
+               BSSGP_CAUSE_TRANSIT_NETWORK_FAILURE             ('02'H),
+               BSSGP_CAUSE_NET_SV_CAP_MOD_GT_ZERO_KBPS         ('03'H),
+               BSSGP_CAUSE_UNKNOWN_MS                          ('04'H),
+               BSSGP_CAUSE_BVCI_UNKNOWN                        ('05'H),
+               BSSGP_CAUSE_CELL_TRAFFIC_CONGESTION             ('06'H),
+               BSSGP_CAUSE_SGSN_CONGESTION                     ('07'H),
+               BSSGP_CAUSE_OM_INTERVENTION                     ('08'H),
+               BSSGP_CAUSE_BVCI_BLOCKED                        ('09'H),
+               BSSGP_CAUSE_PFC_CREATE_FAILURE                  ('0a'H),
+               BSSGP_CAUSE_PFC_PREEMPTED                       ('0b'H),
+               BSSGP_CAUSE_ABQP_NO_MORE_SUPPORTED              ('0c'H),
+               BSSGP_CAUSE_SEMANTICALLY_INCORRECT_PDU          ('20'H),
+               BSSGP_CAUSE_INVALID_MANDATORY_IE                ('21'H),
+               BSSGP_CAUSE_MISSING_MANDATORY_IE                ('22'H),
+               BSSGP_CAUSE_MISSING_CONDITIONAL_IE              ('23'H),
+               BSSGP_CAUSE_UNEXPECTED_CONDITIONAL_IE           ('24'H),
+               BSSGP_CAUSE_CONDITIONAL_IE_ERROR                ('25'H),
+               BSSGP_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE ('26'H),
+               BSSGP_CAUSE_PROTOCOL_ERROR_UNSPECIFIED          ('27'H),
+               BSSGP_CAUSE_PDU_NOT_COMPATIBLE_WITH_FEATURE_SET ('28'H),
+               BSSGP_CAUSE_REQUESTED_INFO_NOT_AVAILABLE        ('29'H),
+               BSSGP_CAUSE_UNKNOWN_DESTINATION_ADDRESS         ('2a'H),
+               BSSGP_CAUSE_UNKNOWN_RIM_APP_IDENTITY            ('2b'H),
+               BSSGP_CAUSE_INVALID_CONTAINER_UNIT_INFO         ('2c'H),
+               BSSGP_CAUSE_PFC_QUEUING                         ('2d'H),
+               BSSGP_CAUSE_PFC_CREATED_SUCCESSFULLY            ('2e'H),
+               BSSGP_CAUSE_T12_EXPIRY                          ('2f'H),
+               BSSGP_CAUSE_MS_UNDER_PS_HANDOVER_TREATMENT      ('30'H),
+               BSSGP_CAUSE_UPLINK_QUALITY                      ('31'H),
+               BSSGP_CAUSE_UPLINK_STRENGTH                     ('32'H),
+               BSSGP_CAUSE_DOWNLINK_QUALITY                    ('33'H),
+               BSSGP_CAUSE_DOWNLINK_STRENGTH                   ('34'H),
+               BSSGP_CAUSE_DISTANCE                            ('35'H),
+               BSSGP_CAUSE_BETTER_CELL                         ('36'H),
+               BSSGP_CAUSE_TRAFFIC                             ('37'H),
+               BSSGP_CAUSE_OM_INTERVENTION2                    ('38'H),
+               BSSGP_CAUSE_MS_BACK_ON_OLD_CHANNEL              ('39'H),
+               BSSGP_CAUSE_T13_EXPIRY                          ('3a'H),
+               BSSGP_CAUSE_T14_EXPIRY                          ('3b'H),
+               BSSGP_CAUSE_NOT_ALL_REQUESTED_PFC_CREATED       ('3c'H)
+       } with { variant "FIELDLENGTH(8)" };
+
+
+       template BVCI t_BSSGP_BVCI(template BssgpBvci bvci) := {
+               iEI := '04'O,
+               ext := '1'B,
+               lengthIndicator := {
+                       length1 := 2
+               },
+               unstructured_value := f_oct_or_wc(bvci, 2)
+       }
+
+       template IMSI_BSSGP tr_BSSGP_IMSI(template hexstring imsi) := {
+               iEI := '0D'O,
+               ext := '1'B,
+               lengthIndicator := ?,
+               type_of_Identity := '001'B,
+               oddevenIndicator := ?,
+               digits := imsi
+       }
+
+       template IMSI_BSSGP ts_BSSGP_IMSI(hexstring imsi) := {
+               iEI := '0D'O,
+               ext := '1'B,
+               lengthIndicator := { length1 := 0 /* overwritten */ },
+               type_of_Identity := '001'B,
+               oddevenIndicator := f_hex_is_odd_length(imsi),
+               digits := imsi
+       }
+
+       template TMSI_BSSGP ts_BSSGP_TMSI(GsmTmsi tmsi) := {
+               iEI := '20'O,
+               ext := '1'B,
+               lengthIndicator := { length1 := 4 },
+               tMSI_Value := int2oct(tmsi, 4)
+       }
+
+       function f_bssgp_length_ind(integer len) return LIN2_2a {
+               var LIN2_2a ret;
+               if (len > 255) {
+                       ret := { length2 := len };
+               } else {
+                       ret := { length1 := len };
+               }
+               return ret;
+       }
+
+       template LLC_PDU ts_BSSGP_LLC_PDU(octetstring pdu) := {
+               iEI := '0D'O,
+               ext := '1'B,
+               lengthIndicator := f_bssgp_length_ind(lengthof(pdu)),
+               lLC_PDU := pdu
+       }
+
+       template LLC_PDU tr_BSSGP_LLC_PDU(template octetstring pdu := ?) := {
+               iEI := '0D'O,
+               ext := '1'B,
+               lengthIndicator := ?,
+               lLC_PDU := pdu
+       }
+
+       function t_BSSGP_CAUSE(template BssgpCause cause) return template 
Cause_BSSGP {
+               var template Cause_BSSGP ret;
+               ret.iEI := '08'O;
+               ret.ext := '1'B;
+               ret.lengthIndicator := { length1 := 1 };
+               if (isvalue(cause)) {
+                       ret.cause_Value := int2oct(enum2int(valueof(cause)), 1);
+               } else {
+                       ret.cause_Value := ?
+               }
+               return ret;
+       }
+
+       function t_BSSGP_IE_CellId(template BssgpCellId cid) return template 
Cell_Identifier {
+               var template Cell_Identifier ret := {
+                       iEI := '08'O,
+                       ext := '1'B,
+                       lengthIndicator := { length1 := 8 },
+                       mccDigit1 := ?,
+                       mccDigit2 := ?,
+                       mccDigit3 := ?,
+                       mncDigit3 := ?,
+                       mncDigit1 := ?,
+                       mncDigit2 := ?,
+                       lac := ?,
+                       rac := ?,
+                       cI_value := ?
+               }
+               if (istemplatekind(cid, "omit")) {
+                       return omit;
+               } else if (istemplatekind(cid, "*")) {
+                       return *;
+               } else if (istemplatekind(cid, "?")) {
+                       return ?;
+               }
+               if (isvalue(cid) and isvalue(cid.ra_id) and 
isvalue(cid.ra_id.lai)) {
+                       if (isvalue(cid.ra_id.lai.mcc_mnc)) {
+                               ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
+                               ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
+                               ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
+                               ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[5];
+                               ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[4];
+                               ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[3];
+                       }
+                       if (isvalue(cid.ra_id.lai.lac)) {
+                               ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
+                       }
+               }
+               if (isvalue(cid) and isvalue(cid.ra_id)) {
+                       ret.rac := f_oct_or_wc(cid.ra_id.rac, 1);
+               }
+               if (isvalue(cid)) {
+                       ret.cI_value := f_oct_or_wc(cid.cell_id, 2);
+               }
+               return ret;
+       }
+
+       template PDU_BSSGP ts_BVC_RESET(BssgpCause cause, BssgpBvci bvci,
+                                       template BssgpCellId cell_id) := {
+               pDU_BSSGP_BVC_RESET := {
+                       bssgpPduType := '22'O,
+                       bVCI := t_BSSGP_BVCI(bvci),
+                       cause := t_BSSGP_CAUSE(cause),
+                       cell_Identifier := t_BSSGP_IE_CellId(cell_id),
+                       feature_bitmap := omit,
+                       extended_Feature_Bitmap := omit
+               }
+       }
+
+       template PDU_BSSGP tr_BVC_RESET(template BssgpCause cause, template 
BssgpBvci bvci,
+                                       template BssgpCellId cell_id) := {
+               pDU_BSSGP_BVC_RESET := {
+                       bssgpPduType := '22'O,
+                       bVCI := t_BSSGP_BVCI(bvci),
+                       cause := t_BSSGP_CAUSE(cause),
+                       cell_Identifier := t_BSSGP_IE_CellId(cell_id),
+                       feature_bitmap := *,
+                       extended_Feature_Bitmap := *
+               }
+       }
+
+       template PDU_BSSGP ts_BVC_RESET_ACK(BssgpBvci bvci, template 
BssgpCellId cell_id) := {
+               pDU_BSSGP_BVC_RESET_ACK := {
+                       bssgpPduType := '23'O,
+                       bVCI := t_BSSGP_BVCI(bvci),
+                       cell_Identifier := t_BSSGP_IE_CellId(cell_id),
+                       feature_bitmap := omit,
+                       extended_Feature_Bitmap := omit
+               }
+       }
+
+       template PDU_BSSGP tr_BVC_RESET_ACK(template BssgpBvci bvci, template 
BssgpCellId cell_id) := {
+               pDU_BSSGP_BVC_RESET_ACK := {
+                       bssgpPduType := '23'O,
+                       bVCI := t_BSSGP_BVCI(bvci),
+                       cell_Identifier := t_BSSGP_IE_CellId(cell_id),
+                       feature_bitmap := *,
+                       extended_Feature_Bitmap := *
+               }
+       }
+
+
+       template PDU_BSSGP t_BVC_UNBLOCK(template BssgpBvci bvci) := {
+               pDU_BSSGP_BVC_UNBLOCK := {
+                       bssgpPduType := '24'O,
+                       bVCI := t_BSSGP_BVCI(bvci)
+               }
+       }
+
+       template PDU_BSSGP t_BVC_UNBLOCK_ACK(template BssgpBvci bvci) := {
+               pDU_BSSGP_BVC_UNBLOCK_ACK := {
+                       bssgpPduType := '25'O,
+                       bVCI := t_BSSGP_BVCI(bvci)
+               }
+       }
+
+       template PDU_BSSGP t_BVC_BLOCK(template BssgpBvci bvci, template 
BssgpCause cause) := {
+               pDU_BSSGP_BVC_BLOCK := {
+                       bssgpPduType := '20'O,
+                       bVCI := t_BSSGP_BVCI(bvci),
+                       cause := t_BSSGP_CAUSE(cause)
+               }
+       }
+
+       template PDU_BSSGP t_BVC_BLOCK_ACK(template BssgpBvci bvci) := {
+               pDU_BSSGP_BVC_BLOCK_ACK := {
+                       bssgpPduType := '21'O,
+                       bVCI := t_BSSGP_BVCI(bvci)
+               }
+       }
+
+       template PDU_BSSGP t_BVC_FC_BVC(uint16_t bmax, uint16_t 
bucket_leak_rate,
+                                       uint16_t bmax_default_ms, uint16_t 
r_default_ms, OCT1 tag) := {
+               pDU_BSSGP_FLOW_CONTROL_BVC := {
+                       bssgpPduType := '26'O,
+                       tag := {
+                               iEI := '1E'O,
+                               ext := '1'B,
+                               lengthIndicator := {
+                                       length1 := 2
+                               },
+                               unstructured_Value := tag
+                       },
+                       bVC_Bucket_Size := {
+                               iEI := '05'O,
+                               ext := '1'B,
+                               lengthIndicator := {
+                                       length1 := 2
+                               },
+                               bmax := f_oct_or_wc(bmax, 2)
+                       },
+                       bucket_Leak_Rate := {
+                               iEI := '03'O,
+                               ext := '1'B,
+                               lengthIndicator := {
+                                       length1 := 1
+                               },
+                               r_Value := f_oct_or_wc(bucket_leak_rate, 2)
+                       },
+                       bmax_default_MS := {
+                               iEI := '01'O,
+                               ext := '1'B,
+                               lengthIndicator := {
+                                       length1 := 2
+                               },
+                               bmax := f_oct_or_wc(bmax_default_ms, 2)
+                       },
+                       r_default_MS := {
+                               iEI := '1C'O,
+                               ext := '1'B,
+                               lengthIndicator := {
+                                       length1 := 2
+                               },
+                               r_default_MS_value := f_oct_or_wc(r_default_ms, 
2)
+                       },
+                       bucket_Full_Ratio := omit,
+                       bVC_Measurement := omit,
+                       flow_Control_Granularity := omit
+               }
+       }
+       template PDU_BSSGP t_BVC_FC_BVC_ACK(template OCT1 tag) := {
+               pDU_BSSGP_FLOW_CONTROL_BVC_ACK := {
+                       bssgpPduType := '27'O,
+                       tag := {
+                               iEI := '1E'O,
+                               ext := '1'B,
+                               lengthIndicator := {
+                                       length1 := 2
+                               },
+                               unstructured_Value := tag
+                       }
+               }
+       }
+
+       template PDU_BSSGP ts_BSSGP_STATUS(template BssgpBvci bvci, template 
BssgpCause cause,
+                                          PDU_BSSGP pdu) := {
+               pDU_BSSGP_STATUS := {
+                       bssgpPduType := '0A'O,
+                       cause := t_BSSGP_CAUSE(cause),
+                       bVCI := t_BSSGP_BVCI(bvci),
+                       pDU_in_Error := {
+                               iEI := '15'O,
+                               ext := '1'B,
+                               lengthIndicator := {
+                                       length1 := 0 /* overwritten */
+                               },
+                               erroneous_BSSGP_PDU := enc_PDU_BSSGP(pdu)
+                       }
+               }
+       }
+
+       template QoS_Profile_V t_defaultQos := {
+               peak_Bit_Rate := int2oct(80, 2),
+               precedence := '000'B,
+               a_bit := '0'B,
+               t_bit := '0'B,
+               c_r_bit := '0'B,
+               peakBitRateGranularity := '00'B
+       }
+
+       template QoS_Profile ts_QoS_TLV(template QoS_Profile_V qos) := {
+               iEI := '18'O,
+               ext := '1'B,
+               lengthIndicator := { length1 := 3 },
+               peak_Bit_Rate := qos.peak_Bit_Rate,
+               precedence := qos.precedence,
+               a_bit := qos.a_bit,
+               t_bit := qos.t_bit,
+               c_r_bit := qos.c_r_bit,
+               peakBitRateGranularity := qos.peakBitRateGranularity
+       }
+
+       template PDU_Lifetime t_DefaultLifetime(uint16_t delay := 65535) := {
+               iEI := '16'O,
+               ext := '1'B,
+               lengthIndicator := {
+                       length1 := 2
+               },
+               delay_Value := f_oct_or_wc(delay, 2)
+       }
+
+       template PDU_BSSGP ts_BSSGP_DL_UD(GprsTlli tlli, octetstring pdu) := {
+               pDU_BSSGP_DL_UNITDATA := {
+                       bssgpPduType := '00'O,
+                       tLLI_current := f_oct_or_wc(tlli, 4),
+                       qoS_Profile := t_defaultQos,
+                       pDU_Lifetime := t_DefaultLifetime(65535),
+                       mS_Radio_Access_Capability := omit,
+                       priority := omit,
+                       dRX_Parameters := omit,
+                       iMSI := omit,
+                       tLLI_old := omit,
+                       pFI := omit,
+                       lSA_Information := omit,
+                       service_UTRAN_CCO := omit,
+                       service_Class_Indicator := omit,
+                       subscriber_Profile_ID_For_RAT_Priority := omit,
+                       redirection_Indication := omit,
+                       redirection_Completed := omit,
+                       unconfirmed_Send_State_Variable := omit,
+                       sCI := omit,
+                       gGSN_PGW_Location := omit,
+                       eDRX_Paremeters := omit,
+                       old_Routing_Area_Identification := omit,
+                       attach_Indicator := omit,
+                       alignment_octets := omit,
+                       lLC_PDU := ts_BSSGP_LLC_PDU(pdu),
+                       initialLLC_PDU := omit
+               }
+       }
+
+       template PDU_BSSGP tr_BSSGP_DL_UD := {
+               pDU_BSSGP_DL_UNITDATA := {
+                       bssgpPduType := '00'O,
+                       tLLI_current := ?,
+                       qoS_Profile := ?,
+                       pDU_Lifetime := ?,
+                       mS_Radio_Access_Capability := *,
+                       priority := *,
+                       dRX_Parameters := *,
+                       iMSI := *,
+                       tLLI_old := *,
+                       pFI := *,
+                       lSA_Information := *,
+                       service_UTRAN_CCO := *,
+                       service_Class_Indicator := *,
+                       subscriber_Profile_ID_For_RAT_Priority := *,
+                       redirection_Indication := *,
+                       redirection_Completed := *,
+                       unconfirmed_Send_State_Variable := *,
+                       sCI := *,
+                       gGSN_PGW_Location := *,
+                       eDRX_Paremeters := *,
+                       old_Routing_Area_Identification := *,
+                       attach_Indicator := *,
+                       alignment_octets := *,
+                       lLC_PDU := tr_BSSGP_LLC_PDU,
+                       initialLLC_PDU := *
+               }
+       }
+
+       template PDU_BSSGP tr_BSSGP_UL_UD(template GprsTlli tlli := ?, template 
BssgpCellId cell_id := ?,
+                                         template octetstring payload := ?) := 
{
+               pDU_BSSGP_UL_UNITDATA := {
+                       bssgpPduType := '01'O,
+                       tLLI := f_oct_or_wc(tlli, 4),
+                       qoS_Profile := ?,
+                       cell_Identifier := t_BSSGP_IE_CellId(cell_id),
+                       pFI := *,
+                       lSA_Identifier_List := *,
+                       redirect_Attempt_Flag := *,
+                       iMSI_BSSGP := *,
+                       unconfirmed_Send_State_Variable := *,
+                       selected_PLMN_ID := *,
+                       selected_Operator := *,
+                       cS_Registered_Operator := *,
+                       alignment_octets := *,
+                       lLC_PDU := tr_BSSGP_LLC_PDU(payload)
+               }
+       }
+
+       template PDU_BSSGP ts_BSSGP_PS_PAGING_IMSI(BssgpBvci bvci, hexstring 
imsi) := {
+               pDU_BSSGP_PAGING_PS := {
+                       bssgpPduType := '06'O,
+                       iMSI := ts_BSSGP_IMSI(imsi),
+                       dRX_Parameters := omit,
+                       paging_Field4 := {
+                               bVCI := t_BSSGP_BVCI(bvci)
+                       },
+                       pFI := omit,
+                       aBQP := omit,
+                       qoS_Profile := ts_QoS_TLV(t_defaultQos),
+                       pTMSI := omit,
+                       eDRX_Paremeters := omit
+               }
+       }
+
+       template PDU_BSSGP ts_BSSGP_PS_PAGING_PTMSI(BssgpBvci bvci, hexstring 
imsi, GsmTmsi tmsi) := {
+               pDU_BSSGP_PAGING_PS := {
+                       bssgpPduType := '06'O,
+                       iMSI := ts_BSSGP_IMSI(imsi),
+                       dRX_Parameters := omit,
+                       paging_Field4 := {
+                               bVCI := t_BSSGP_BVCI(bvci)
+                       },
+                       pFI := omit,
+                       aBQP := omit,
+                       qoS_Profile := ts_QoS_TLV(t_defaultQos),
+                       pTMSI := ts_BSSGP_TMSI(tmsi),
+                       eDRX_Paremeters := omit
+               }
+       }
+
+
+} with { encode "RAW" };

-- 
To view, visit https://gerrit.osmocom.org/6401
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Icbc4f5d24f3419f99c9a4805f836bddd2849f492
Gerrit-PatchSet: 6
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <lafo...@gnumonks.org>
Gerrit-Reviewer: Harald Welte <lafo...@gnumonks.org>
Gerrit-Reviewer: Jenkins Builder

Reply via email to