Change in osmo-pcu[master]: gprs_bssgp_rim: add serving BSS NACC application

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/.

laforge gerrit-no-reply at lists.osmocom.org
Wed Feb 3 08:29:43 UTC 2021


laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-pcu/+/22368 )

Change subject: gprs_bssgp_rim: add serving BSS NACC application
......................................................................

gprs_bssgp_rim: add serving BSS NACC application

Answer an incoming RAN INFORMATION REQUEST RIM PDU with RAN INFORMATION
PDU that contains system information type 1, 3 and 13

Depends: osmo-bts I5138ab183793e7eee4dc494318d984e9f1f56932
Change-Id: Id72118120c14984d2fb1b918b41fac4868150d41
Related: SYS#5103
---
M src/bts.h
M src/gprs_bssgp_rim.c
M src/pcu_l1_if.cpp
3 files changed, 131 insertions(+), 13 deletions(-)

Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved



diff --git a/src/bts.h b/src/bts.h
index ea15caf..e67668c 100644
--- a/src/bts.h
+++ b/src/bts.h
@@ -219,6 +219,10 @@
 	uint8_t n3105;
 	struct gprs_rlcmac_trx trx[8];
 
+	uint8_t si1[GSM_MACBLOCK_LEN];
+	bool si1_is_set;
+	uint8_t si3[GSM_MACBLOCK_LEN];
+	bool si3_is_set;
 	uint8_t si13[GSM_MACBLOCK_LEN];
 	bool si13_is_set;
 
diff --git a/src/gprs_bssgp_rim.c b/src/gprs_bssgp_rim.c
index a191fff..5f6f750 100644
--- a/src/gprs_bssgp_rim.c
+++ b/src/gprs_bssgp_rim.c
@@ -23,6 +23,9 @@
 #include <osmocom/gsm/tlv.h>
 #include <osmocom/gprs/gprs_ns.h>
 #include <osmocom/core/prim.h>
+#include <pcu_l1_if.h>
+#include <gprs_rlcmac.h>
+#include <bts.h>
 
 #include "gprs_debug.h"
 #include "gprs_pcu.h"
@@ -54,6 +57,59 @@
 	memcpy(&to_pdu->routing_info_src, &from_pdu->routing_info_dest, sizeof(to_pdu->routing_info_src));
 }
 
+/* Fill NACC application container with data (cell identifier, sysinfo) */
+#define SI_HDR_LEN 2
+static void fill_app_cont_nacc(struct bssgp_ran_inf_app_cont_nacc *app_cont, const struct gprs_rlcmac_bts *bts)
+{
+	struct bssgp_bvc_ctx *bctx = the_pcu->bssgp.bctx;
+
+	gprs_ra_id_ci_to_cgi_ps(&app_cont->reprt_cell, &bctx->ra_id, bctx->cell_id);
+	app_cont->num_si = 0;
+
+	/* Note: The BTS struct stores the system information including its pseudo header. The RIM application
+	 * container defines the system information without pseudo header, so we need to chop it off. */
+
+	if (bts->si1_is_set) {
+		app_cont->si[app_cont->num_si] = bts->si1 + SI_HDR_LEN;
+		app_cont->num_si++;
+	}
+
+	if (bts->si3_is_set) {
+		app_cont->si[app_cont->num_si] = bts->si3 + SI_HDR_LEN;
+		app_cont->num_si++;
+	}
+
+	if (bts->si13_is_set) {
+		app_cont->si[app_cont->num_si] = bts->si13 + SI_HDR_LEN;
+		app_cont->num_si++;
+	}
+
+	/* Note: It is possible that the resulting PDU will not contain any system information, even if this is
+	 * an unlikely case since the BTS immediately updates the system information after startup. The
+	 * specification permits to send zero system information, see also: 3GPP TS 48.018 section 11.3.63.2.1 */
+}
+
+/* Format a RAN INFORMATION PDU that contains the requested system information */
+static void format_response_pdu(struct bssgp_ran_information_pdu *resp_pdu, struct bssgp_ran_information_pdu *req_pdu,
+				const struct gprs_rlcmac_bts *bts)
+{
+	memset(resp_pdu, 0, sizeof(*resp_pdu));
+	mirror_rim_routing_info(resp_pdu, req_pdu);
+
+	resp_pdu->decoded.rim_cont = (struct bssgp_ran_inf_rim_cont) {
+		.app_id = BSSGP_RAN_INF_APP_ID_NACC,
+		.seq_num = 1,	/* single report has only one message in response */
+		.pdu_ind = {
+			    .pdu_type_ext = RIM_PDU_TYPE_SING_REP,
+			     },
+		.prot_ver = 1,
+	};
+
+	fill_app_cont_nacc(&resp_pdu->decoded.rim_cont.u.app_cont_nacc, bts);
+	resp_pdu->decoded_present = true;
+	resp_pdu->rim_cont_iei = BSSGP_IE_RI_RIM_CONTAINER;
+}
+
 /* Format a RAN INFORMATION ERROR PDU */
 static void format_response_pdu_err(struct bssgp_ran_information_pdu *resp_pdu,
 				    const struct bssgp_ran_information_pdu *req_pdu)
@@ -167,6 +223,7 @@
 	struct bssgp_ran_information_pdu resp_pdu;
 	struct osmo_cell_global_id_ps dst_addr;
 	struct gprs_rlcmac_bts *bts;
+	int rc;
 
 	OSMO_ASSERT (bp->oph.sap == SAP_BSSGP_RIM);
 
@@ -210,7 +267,15 @@
 	/* Handle incoming RIM container */
 	switch (pdu->rim_cont_iei) {
 	case BSSGP_IE_RI_REQ_RIM_CONTAINER:
-		LOGPRIM(nsei, LOGL_NOTICE, "Responding to RAN INFORMATION REQUEST not yet implemented!\n");
+		rc = osmo_cgi_ps_cmp(&dst_addr, &pdu->decoded.req_rim_cont.u.app_cont_nacc.reprt_cell);
+		if (rc != 0) {
+			LOGPRIM(nsei, LOGL_ERROR, "reporting cell in RIM application container does not match destination cell in RIM routing info -- rejected.\n");
+			format_response_pdu_err(&resp_pdu, pdu);
+		} else {
+			LOGPRIM(nsei, LOGL_INFO, "Responding to RAN INFORMATION REQUEST ...\n");
+			format_response_pdu(&resp_pdu, pdu, bts);
+		}
+		bssgp_tx_rim(&resp_pdu, nsei);
 		break;
 	case BSSGP_IE_RI_RIM_CONTAINER:
 		return handle_ran_info_response(pdu, bts);
diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp
index d7590e1..9873469 100644
--- a/src/pcu_l1_if.cpp
+++ b/src/pcu_l1_if.cpp
@@ -42,6 +42,7 @@
 #include <osmocom/gprs/gprs_ns2.h>
 #include <osmocom/gsm/l1sap.h>
 #include <osmocom/gsm/protocol/gsm_04_08.h>
+#include <osmocom/gsm/sysinfo.h>
 }
 
 #include <gprs_rlcmac.h>
@@ -290,21 +291,69 @@
 
 static int pcu_rx_data_ind_bcch(struct gprs_rlcmac_bts *bts, uint8_t *data, uint8_t len)
 {
-	if (len == 0) {
+	switch (len) {
+	case 0:
+		/* Due to historical reasons also accept a completely empty message as
+		 * revoke command for SI13. */
+		LOGP(DL1IF, LOGL_ERROR,
+		     "Received PCU data indication that contains no data -- Revoked SI13.\n");
 		bts->si13_is_set = false;
-		LOGP(DL1IF, LOGL_INFO, "Received PCU data indication with empty SI13: cache cleaned\n");
-		return 0;
-	}
 
-	if (len != GSM_MACBLOCK_LEN) {
-		LOGP(DL1IF, LOGL_ERROR, "Received PCU data indication with SI13 with unexpected length %u\n", len);
+		return 0;
+	case 1:
+		/* Revoke SI, type is identified by a single byte which is coded after
+		 * enum osmo_sysinfo_type. */
+		switch (data[0]) {
+		case SYSINFO_TYPE_1:
+			bts->si1_is_set = false;
+			break;
+		case SYSINFO_TYPE_3:
+			bts->si3_is_set = false;
+			break;
+		case SYSINFO_TYPE_13:
+			bts->si13_is_set = false;
+			break;
+		default:
+			LOGP(DL1IF, LOGL_ERROR,
+			     "Received PCU data indication that contains an unsupported system information identifier (%02x,OSMO) -- ignored.\n", data[0]);
+			return -EINVAL;
+		}
+		LOGP(DPCU, LOGL_DEBUG,
+		     "Received PCU data indication: Revoked SI%s\n",
+		     get_value_string(osmo_sitype_strs, data[0]));
+		return 0;
+	case GSM_MACBLOCK_LEN:
+		/* Update SI, type is identified by the RR sysinfo type, which is the
+		 * 3rd byte in the buffer. */
+		switch (data[2]) {
+		case GSM48_MT_RR_SYSINFO_1:
+			memcpy(bts->si1, data, GSM_MACBLOCK_LEN);
+			bts->si1_is_set = true;
+			break;
+		case GSM48_MT_RR_SYSINFO_3:
+			memcpy(bts->si3, data, GSM_MACBLOCK_LEN);
+			bts->si3_is_set = true;
+			break;
+		case GSM48_MT_RR_SYSINFO_13:
+			memcpy(bts->si13, data, GSM_MACBLOCK_LEN);
+			bts->si13_is_set = true;
+			break;
+		default:
+			LOGP(DL1IF, LOGL_ERROR,
+			     "Received PCU data indication that contains an unsupported system information identifier (%02x,RR) -- ignored.\n", data[2]);
+			return -EINVAL;
+		}
+		LOGP(DPCU, LOGL_DEBUG,
+		     "Received PCU data indication: Updated %s: %s\n",
+		     gsm48_pdisc_msgtype_name(data[1], data[2]),
+		     osmo_hexdump_nospc(data + 1, GSM_MACBLOCK_LEN));
+		return 0;
+	default:
+		LOGP(DL1IF, LOGL_ERROR,
+		     "Received PCU data indication with unexpected data length: %u -- ignored.\n",
+		     len);
 		return -EINVAL;
 	}
-
-	memcpy(bts->si13, data, GSM_MACBLOCK_LEN);
-	bts->si13_is_set = true;
-
-	return 0;
 }
 
 static int pcu_rx_data_ind(struct gprs_rlcmac_bts *bts, struct gsm_pcu_if_data *data_ind)
@@ -782,7 +831,7 @@
 
 static int pcu_rx_susp_req(struct gprs_rlcmac_bts *bts, struct gsm_pcu_if_susp_req *susp_req)
 {
-	struct bssgp_bvc_ctx *bctx = bts->pcu->bssgp.bctx;
+	struct bssgp_bvc_ctx *bctx = the_pcu->bssgp.bctx;
 	GprsMs *ms;
 	struct gprs_rlcmac_dl_tbf *dl_tbf;
 	struct gprs_rlcmac_ul_tbf *ul_tbf;

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-pcu/+/22368
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Change-Id: Id72118120c14984d2fb1b918b41fac4868150d41
Gerrit-Change-Number: 22368
Gerrit-PatchSet: 11
Gerrit-Owner: dexter <pmaier at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy at sysmocom.de>
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-Reviewer: pespin <pespin at sysmocom.de>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210203/8baf65c9/attachment.htm>


More information about the gerrit-log mailing list