Change in osmo-ttcn3-hacks[master]: BSSGP_Emulation: move LLC layer out of BSSGP

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

lynxis lazus gerrit-no-reply at lists.osmocom.org
Tue Aug 7 17:56:37 UTC 2018


lynxis lazus has uploaded this change for review. ( https://gerrit.osmocom.org/10383


Change subject: BSSGP_Emulation: move LLC layer out of BSSGP
......................................................................

BSSGP_Emulation: move LLC layer out of BSSGP

The LLC layer needs to be accessed by the SGSN tests
in order to do multi-BSSGP tests.
Otherwise the sgsn will see LLC frame with wrong sequence
numbers and drop them.

Change-Id: Ie9e9d7da0a78a96f4f431c9085b9e273a39535f1
---
M library/BSSGP_Emulation.ttcn
M sgsn/SGSN_Tests.ttcn
2 files changed, 54 insertions(+), 35 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/83/10383/1

diff --git a/library/BSSGP_Emulation.ttcn b/library/BSSGP_Emulation.ttcn
index ca97ccd..c650fd5 100644
--- a/library/BSSGP_Emulation.ttcn
+++ b/library/BSSGP_Emulation.ttcn
@@ -136,6 +136,14 @@
 	uint9_t n_u_rx_last optional
 };
 
+function f_llc_create(boolean sgsn_role := false) return LLC_Entities {
+	var LLC_Entities llc;
+	for (var integer i := 0; i < 16; i := i+1) {
+		llc[i] := valueof(t_LLC_init(sgsn_role));
+	}
+	return llc;
+}
+
 private template LLC_Entity t_LLC_init(boolean sgsn_role := false) := {
 	sgsn_role := sgsn_role,
 	n_u_tx_next := 0,
@@ -576,13 +584,13 @@
 	}
 }
 
-private function f_llc_get_n_u_tx(inout LLC_Entity llc) return uint9_t {
+function f_llc_get_n_u_tx(inout LLC_Entity llc) return uint9_t {
 	var uint9_t ret := llc.n_u_tx_next;
 	llc.n_u_tx_next := llc.n_u_tx_next + 1;
 	return ret;
 }
 
-private function f_llc_sapi_by_l3_mo(PDU_L3_MS_SGSN l3_mo) return BIT4 {
+function f_llc_sapi_by_l3_mo(PDU_L3_MS_SGSN l3_mo) return BIT4 {
 	if (ischosen(l3_mo.msgs.gprs_mm)) {
 		return c_LLC_SAPI_LLGMM;
 	} else if (ischosen(l3_mo.msgs.gprs_sm)) {
diff --git a/sgsn/SGSN_Tests.ttcn b/sgsn/SGSN_Tests.ttcn
index 54a5fe1..974576f 100644
--- a/sgsn/SGSN_Tests.ttcn
+++ b/sgsn/SGSN_Tests.ttcn
@@ -73,6 +73,7 @@
 type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr {
 	var BSSGP_ConnHdlrPars g_pars;
 	timer g_Tguard;
+	var LLC_Entities llc;
 }
 
 type record SGSN_ConnHdlrNetworkPars {
@@ -301,6 +302,8 @@
 	/* do some common stuff like setting up g_pars */
 	g_pars := pars;
 
+	llc := f_llc_create(false);
+
 	/* register with BSSGP core */
 	f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
 	/* tell GSUP dispatcher to send this IMSI to us */
@@ -335,16 +338,24 @@
 	f_sleep(20.0);
 }
 
+function f_send_llc(template PDU_L3_MS_SGSN l3_mo, integer gb_index := 0) runs on BSSGP_ConnHdlr {
+	var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
+	var BIT4 sapi := f_llc_sapi_by_l3_mo(valueof(l3_mo));
+	var integer n_u := f_llc_get_n_u_tx(llc[bit2int(sapi)]);
+	var octetstring llc_enc := enc_PDU_LLC(valueof(ts_LLC_UI(l3_enc, sapi, '0'B, n_u)));
+	BSSGP[gb_index].send(ts_BSSGP_UL_UD(g_pars.tlli, g_pars.bssgp_cell_id[gb_index], llc_enc));
+}
+
 altstep as_mm_identity() runs on BSSGP_ConnHdlr {
 	var MobileL3_CommonIE_Types.MobileIdentityLV mi;
 	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
 		mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
-		BSSGP[0].send(ts_GMM_ID_RESP(mi));
+		f_send_llc(ts_GMM_ID_RESP(mi));
 		repeat;
 	}
 	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
 		mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
-		BSSGP[0].send(ts_GMM_ID_RESP(mi));
+		f_send_llc(ts_GMM_ID_RESP(mi));
 		repeat;
 	}
 }
@@ -413,7 +424,7 @@
 			l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
 						valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
 		}
-		BSSGP[0].send(l3_mo);
+		f_send_llc(l3_mo);
 	} else {
 		/* wait for identity procedure */
 		f_sleep(1.0);
@@ -519,7 +530,7 @@
 	 * revisionLevelIndicatior is at the wrong place! */
 	attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
 
-	BSSGP[0].send(attach_req);
+	f_send_llc(attach_req);
 	f_gmm_auth(umts_aka_challenge, force_gsm_sres);
 	/* Expect SGSN to perform LU with HLR */
 	f_gmm_gsup_lu_isd();
@@ -528,7 +539,7 @@
 		f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
 	}
 	/* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
-	BSSGP[0].send(ts_GMM_ATTACH_COMPL);
+	f_send_llc(ts_GMM_ATTACH_COMPL);
 }
 
 private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
@@ -580,7 +591,7 @@
 private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	f_send_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	alt {
 	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
 		/* don't send ID Response */
@@ -606,7 +617,7 @@
 private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	f_send_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	alt {
 	[] as_mm_identity();
 	[] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
@@ -626,7 +637,7 @@
 private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	f_send_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	alt {
 	[] as_mm_identity();
 	[] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
@@ -648,7 +659,7 @@
 	var BssgpDecoded bd;
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	f_send_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	f_gmm_auth();
 	/* Expect MSC to perform LU with HLR */
 	GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
@@ -677,7 +688,7 @@
 	var BssgpDecoded bd;
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	f_send_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	f_gmm_auth();
 	/* Expect MSC to perform LU with HLR */
 	GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
@@ -708,7 +719,7 @@
 	var BssgpDecoded bd;
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
+	f_send_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
 	f_gmm_auth();
 	/* Expect MSC to perform LU with HLR */
 	f_gmm_gsup_lu_isd();
@@ -716,7 +727,7 @@
 	BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
 		f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
 	}
-	BSSGP[0].send(ts_GMM_ATTACH_COMPL);
+	f_send_llc(ts_GMM_ATTACH_COMPL);
 	setverdict(pass);
 }
 testcase TC_attach_combined() runs on test_CT {
@@ -734,12 +745,12 @@
 
 	g_pars.net.expect_auth := false;
 
-	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	f_send_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	f_gmm_auth();
 	BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
 		f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
 	}
-	BSSGP[0].send(ts_GMM_ATTACH_COMPL);
+	f_send_llc(ts_GMM_ATTACH_COMPL);
 	setverdict(pass);
 }
 testcase TC_attach_accept_all() runs on test_CT {
@@ -761,7 +772,7 @@
 
 	g_pars.net.expect_auth := false;
 
-	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	f_send_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	alt {
 	[] as_mm_identity();
 	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
@@ -793,7 +804,7 @@
 private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP[0].send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, old_ra, false, omit, omit));
+	f_send_llc(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, old_ra, false, omit, omit));
 	alt {
 	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
 		setverdict(pass);
@@ -831,7 +842,7 @@
 function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge) runs on BSSGP_ConnHdlr {
 	var BssgpDecoded bd;
 	timer T := 5.0;
-	BSSGP[0].send(ts_GMM_DET_REQ_MO(detach_type, power_off));
+	f_send_llc(ts_GMM_DET_REQ_MO(detach_type, power_off));
 	if (expect_purge) {
 		GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
 		GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
@@ -958,7 +969,7 @@
 		recovery := ts_Recovery(apars.ggsn_restart_ctr);
 	}
 
-	BSSGP[0].send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
+	f_send_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
 				     apars.apn, apars.pco));
 	GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
 		f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
@@ -993,7 +1004,7 @@
 	var boolean exp_rej := ispresent(apars.exp_rej_cause);
 	var Gtp1cUnitdata g_ud;
 
-	BSSGP[0].send(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit));
+	f_send_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit));
 	GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
 		var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
 		BSSGP[0].clear;
@@ -1024,7 +1035,7 @@
 
 	alt {
 	[] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {
-		BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
+		f_send_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
 		}
 	[not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
 		repeat;
@@ -1207,7 +1218,7 @@
 /* PDP Context activation for not-attached subscriber; expect fail */
 private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
 	var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
-	BSSGP[0].send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
+	f_send_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
 				     apars.apn, apars.pco));
 	alt {
 	/* We might want toalso actually expect a PDPC CTX ACT REJ? */
@@ -1355,7 +1366,7 @@
 	var OCT1 cause_network_failure := int2oct(38, 1)
 	alt {
 	[] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true))) {
-		BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
+		f_send_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
 		setverdict(pass);
 		}
 	[] as_xid(apars);
@@ -1436,7 +1447,7 @@
 
 	GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
 
-	BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
+	f_send_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
 	setverdict(pass);
 }
 testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
@@ -1519,7 +1530,7 @@
 
 	/* MS: receive a Detach Request */
 	BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?)));
-	BSSGP[0].send(ts_GMM_DET_ACCEPT_MO);
+	f_send_llc(ts_GMM_DET_ACCEPT_MO);
 
 	setverdict(pass);
 }
@@ -1610,7 +1621,7 @@
 	var integer count_req := 0;
 	var MobileL3_CommonIE_Types.MobileIdentityLV mi;
 
-	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
+	f_send_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
 
 	alt {
 		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
@@ -1618,7 +1629,7 @@
 		}
 		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
 			mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
-			BSSGP[0].send(ts_GMM_ID_RESP(mi));
+			f_send_llc(ts_GMM_ID_RESP(mi));
 			repeat;
 		}
 		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
@@ -1658,7 +1669,7 @@
 	/* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
 	g_pars.p_tmsi := 'c0000035'O;
 
-	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
+	f_send_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
 
 	alt {
 		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
@@ -1671,7 +1682,7 @@
 		}
 		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
 			mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
-			BSSGP[0].send(ts_GMM_ID_RESP(mi));
+			f_send_llc(ts_GMM_ID_RESP(mi));
 			repeat;
 		}
 	}
@@ -1732,7 +1743,7 @@
 	/* there is no auth */
 	g_pars.net.expect_auth := false;
 
-	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	f_send_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	f_gmm_auth();
 	alt {
 		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
@@ -1741,7 +1752,7 @@
 		}
 		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) -> value bd {
 			f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
-			BSSGP[0].send(ts_GMM_ATTACH_COMPL);
+			f_send_llc(ts_GMM_ATTACH_COMPL);
 			setverdict(pass);
 		}
 	}
@@ -1778,7 +1789,7 @@
 private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
 	var integer count_req := 0;
 
-	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
+	f_send_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
 	f_gmm_auth();
 
 	alt {
@@ -1815,11 +1826,11 @@
 	var BssgpDecoded bd;
 
 	/* then send RAU */
-	BSSGP[bssgp].send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit));
+	f_send_llc(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit), bssgp);
 	alt {
 	[] BSSGP[bssgp].receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
 		f_process_rau_accept(bd.l3_mt.msgs.gprs_mm.routingAreaUpdateAccept);
-		BSSGP[bssgp].send(ts_GMM_RAU_COMPL);
+		f_send_llc(ts_GMM_RAU_COMPL, bssgp);
 		setverdict(pass);
 		}
 	[] BSSGP[bssgp].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {

-- 
To view, visit https://gerrit.osmocom.org/10383
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie9e9d7da0a78a96f4f431c9085b9e273a39535f1
Gerrit-Change-Number: 10383
Gerrit-PatchSet: 1
Gerrit-Owner: lynxis lazus <lynxis at fe80.eu>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20180807/e8c11263/attachment.htm>


More information about the gerrit-log mailing list