Change in osmo-hnodeb[master]: Move hnbap related code to hnbap.c/h

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

pespin gerrit-no-reply at lists.osmocom.org
Tue Nov 2 12:00:33 UTC 2021


pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-hnodeb/+/26000 )

Change subject: Move hnbap related code to hnbap.c/h
......................................................................

Move hnbap related code to hnbap.c/h

Change-Id: I8356421169bebe1d411b05b19241ea639dc3f733
---
M include/osmocom/hnodeb/Makefile.am
A include/osmocom/hnodeb/hnbap.h
M include/osmocom/hnodeb/hnodeb.h
M src/osmo-hnodeb/Makefile.am
A src/osmo-hnodeb/hnbap.c
M src/osmo-hnodeb/main.c
M src/osmo-hnodeb/vty.c
7 files changed, 261 insertions(+), 197 deletions(-)

Approvals:
  pespin: Verified
  fixeria: Looks good to me, approved



diff --git a/include/osmocom/hnodeb/Makefile.am b/include/osmocom/hnodeb/Makefile.am
index 339f8a3..f6c91b4 100644
--- a/include/osmocom/hnodeb/Makefile.am
+++ b/include/osmocom/hnodeb/Makefile.am
@@ -1,4 +1,5 @@
 noinst_HEADERS = \
+	hnbap.h \
 	hnodeb.h \
 	ranap.h \
 	rua.h \
diff --git a/include/osmocom/hnodeb/hnbap.h b/include/osmocom/hnodeb/hnbap.h
new file mode 100644
index 0000000..22f6d25
--- /dev/null
+++ b/include/osmocom/hnodeb/hnbap.h
@@ -0,0 +1,31 @@
+/* (C) 2015 by Daniel Willmann <dwillmann at sysmocom.de>
+ * (C) 2021 by sysmocom - s.f.m.c. GmbH <info at sysmocom.de>
+ * Author: Pau Espin Pedrol <pespin at sysmocom.de>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/lienses/>.
+ *
+ */
+#pragma once
+
+#include <asn1c/ANY.h>
+
+struct hnb;
+struct msg;
+
+int hnb_hnbap_rx(struct hnb *hnb, struct msgb *msg);
+
+int hnb_ue_register_tx(struct hnb *hnb, const char *imsi_str);
+void hnb_send_register_req(struct hnb *hnb);
+void hnb_send_deregister_req(struct hnb *hnb);
diff --git a/include/osmocom/hnodeb/hnodeb.h b/include/osmocom/hnodeb/hnodeb.h
index e36311e..b283145 100644
--- a/include/osmocom/hnodeb/hnodeb.h
+++ b/include/osmocom/hnodeb/hnodeb.h
@@ -103,9 +103,6 @@
 void hnb_nas_rx_dtap(struct hnb *hnb, void *data, int len);
 void hnb_rx_secmode_cmd(struct hnb *hnb, long ip_alg);
 
-int hnb_ue_register_tx(struct hnb *hnb, const char *imsi_str);
-void hnb_send_register_req(struct hnb *hnb);
-void hnb_send_deregister_req(struct hnb *hnb);
 struct msgb *gen_initue_lu(int is_ps, uint32_t conn_id, const char *imsi);
 
 extern void *tall_hnb_ctx;
diff --git a/src/osmo-hnodeb/Makefile.am b/src/osmo-hnodeb/Makefile.am
index d1cd3ec..1162944 100644
--- a/src/osmo-hnodeb/Makefile.am
+++ b/src/osmo-hnodeb/Makefile.am
@@ -31,6 +31,7 @@
 osmo_hnodeb_SOURCES = \
 	main.c \
 	debug.c \
+	hnbap.c \
 	ranap.c \
 	rua.c \
 	vty.c \
diff --git a/src/osmo-hnodeb/hnbap.c b/src/osmo-hnodeb/hnbap.c
new file mode 100644
index 0000000..7e54004
--- /dev/null
+++ b/src/osmo-hnodeb/hnbap.c
@@ -0,0 +1,226 @@
+/* (C) 2015 by Daniel Willmann <dwillmann at sysmocom.de>
+ * (C) 2021 by sysmocom - s.f.m.c. GmbH <info at sysmocom.de>
+ * Author: Pau Espin Pedrol <pespin at sysmocom.de>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/lienses/>.
+ *
+ */
+
+#include <errno.h>
+
+#include <asn1c/ANY.h>
+
+#include <osmocom/core/msgb.h>
+#include <osmocom/netif/stream.h>
+
+#include <osmocom/hnbap/hnbap_common.h>
+#include <osmocom/hnbap/hnbap_ies_defs.h>
+
+#include <osmocom/ranap/iu_helpers.h> /* ranap_bcd_decode() */
+
+#include <osmocom/hnodeb/hnbap.h>
+#include <osmocom/hnodeb/hnodeb.h>
+
+static int hnb_rx_hnb_register_acc(struct hnb *hnb, ANY_t *in)
+{
+	int rc;
+	HNBAP_HNBRegisterAcceptIEs_t accept;
+
+	rc = hnbap_decode_hnbregisteraccepties(&accept, in);
+	if (rc < 0) {
+	}
+
+	hnb->rnc_id = accept.rnc_id;
+	printf("HNB Register accept with RNC ID %u\n", hnb->rnc_id);
+
+	hnbap_free_hnbregisteraccepties(&accept);
+	return 0;
+}
+
+static int hnb_rx_ue_register_acc(struct hnb *hnb, ANY_t *in)
+{
+	int rc;
+	uint32_t ctx_id;
+	HNBAP_UERegisterAcceptIEs_t accept;
+	char imsi[16];
+
+	rc = hnbap_decode_ueregisteraccepties(&accept, in);
+	if (rc < 0) {
+		return rc;
+	}
+
+	if (accept.uE_Identity.present != HNBAP_UE_Identity_PR_iMSI) {
+		printf("Wrong type in UE register accept\n");
+		return -1;
+	}
+
+	ctx_id = asn1bitstr_to_u24(&accept.context_ID);
+
+	ranap_bcd_decode(imsi, sizeof(imsi), accept.uE_Identity.choice.iMSI.buf,
+			accept.uE_Identity.choice.iMSI.size);
+	printf("UE Register accept for IMSI %s, context %u\n", imsi, ctx_id);
+
+	hnb->ctx_id = ctx_id;
+	hnbap_free_ueregisteraccepties(&accept);
+
+	return 0;
+}
+
+int hnb_hnbap_rx(struct hnb *hnb, struct msgb *msg)
+{
+	HNBAP_HNBAP_PDU_t _pdu, *pdu = &_pdu;
+	asn_dec_rval_t dec_ret;
+	int rc;
+
+	memset(pdu, 0, sizeof(*pdu));
+	dec_ret = aper_decode(NULL, &asn_DEF_HNBAP_HNBAP_PDU, (void **) &pdu,
+			      msg->data, msgb_length(msg), 0, 0);
+	if (dec_ret.code != RC_OK) {
+		LOGP(DMAIN, LOGL_ERROR, "Error in ASN.1 decode\n");
+		return -EINVAL;
+	}
+
+	if (pdu->present != HNBAP_HNBAP_PDU_PR_successfulOutcome) {
+		printf("Unexpected HNBAP message received\n");
+	}
+
+	switch (pdu->choice.successfulOutcome.procedureCode) {
+	case HNBAP_ProcedureCode_id_HNBRegister:
+		/* Get HNB id and send UE Register request */
+		rc = hnb_rx_hnb_register_acc(hnb, &pdu->choice.successfulOutcome.value);
+		break;
+	case HNBAP_ProcedureCode_id_UERegister:
+		rc = hnb_rx_ue_register_acc(hnb, &pdu->choice.successfulOutcome.value);
+		break;
+	default:
+		rc = -ENOSPC;
+		break;
+	}
+
+	return rc;
+}
+
+int hnb_ue_register_tx(struct hnb *hnb, const char *imsi_str)
+{
+	struct msgb *msg;
+	int rc, imsi_len;
+
+	uint8_t imsi_buf[16];
+
+	HNBAP_UERegisterRequest_t request_out;
+	HNBAP_UERegisterRequestIEs_t request;
+	memset(&request, 0, sizeof(request));
+
+	request.uE_Identity.present = HNBAP_UE_Identity_PR_iMSI;
+
+	imsi_len = ranap_imsi_encode(imsi_buf, sizeof(imsi_buf), imsi_str);
+	OCTET_STRING_fromBuf(&request.uE_Identity.choice.iMSI, (const char*)imsi_buf, imsi_len);
+
+	request.registration_Cause = HNBAP_Registration_Cause_normal;
+	request.uE_Capabilities.access_stratum_release_indicator = HNBAP_Access_stratum_release_indicator_rel_6;
+	request.uE_Capabilities.csg_capability = HNBAP_CSG_Capability_not_csg_capable;
+
+	memset(&request_out, 0, sizeof(request_out));
+	rc = hnbap_encode_ueregisterrequesties(&request_out, &request);
+	OSMO_ASSERT(rc == 0);
+
+	msg = hnbap_generate_initiating_message(HNBAP_ProcedureCode_id_UERegister,
+						HNBAP_Criticality_reject,
+						&asn_DEF_HNBAP_UERegisterRequest,
+						&request_out);
+
+	ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_HNBAP_UERegisterRequest, &request_out);
+
+	msgb_sctp_ppid(msg) = IUH_PPI_HNBAP;
+
+	return osmo_wqueue_enqueue(&hnb->wqueue, msg);
+}
+
+void hnb_send_register_req(struct hnb *hnb)
+{
+	HNBAP_HNBRegisterRequest_t request_out;
+	struct msgb *msg;
+	int rc;
+	uint16_t lac, sac;
+	uint8_t rac;
+	uint32_t cid;
+	uint8_t plmn[] = {0x09, 0xf1, 0x99};
+	char identity[50] = "ATestHNB@";
+
+	HNBAP_HNBRegisterRequestIEs_t request;
+	memset(&request, 0, sizeof(request));
+
+	lac = 0xc0fe;
+	sac = 0xabab;
+	rac = 0x42;
+	cid = 0xadceaab;
+
+	asn1_u16_to_str(&request.lac, &lac, lac);
+	asn1_u16_to_str(&request.sac, &sac, sac);
+	asn1_u8_to_str(&request.rac, &rac, rac);
+	asn1_u28_to_bitstring(&request.cellIdentity, &cid, cid);
+
+	request.hnB_Identity.hNB_Identity_Info.buf = (uint8_t*) identity;
+	request.hnB_Identity.hNB_Identity_Info.size = strlen(identity);
+
+	request.plmNidentity.buf = plmn;
+	request.plmNidentity.size = 3;
+
+
+
+	memset(&request_out, 0, sizeof(request_out));
+	rc = hnbap_encode_hnbregisterrequesties(&request_out, &request);
+	if (rc < 0) {
+		printf("Could not encode HNB register request IEs\n");
+	}
+
+	msg = hnbap_generate_initiating_message(HNBAP_ProcedureCode_id_HNBRegister,
+						HNBAP_Criticality_reject,
+						&asn_DEF_HNBAP_HNBRegisterRequest,
+						&request_out);
+
+
+	msgb_sctp_ppid(msg) = IUH_PPI_HNBAP;
+
+	osmo_wqueue_enqueue(&hnb->wqueue, msg);
+}
+
+void hnb_send_deregister_req(struct hnb *hnb)
+{
+	struct msgb *msg;
+	int rc;
+
+	HNBAP_HNBDe_RegisterIEs_t request;
+	memset(&request, 0, sizeof(request));
+
+	request.cause.present = HNBAP_Cause_PR_misc;
+	request.cause.choice.misc = HNBAP_CauseMisc_o_and_m_intervention;
+
+	HNBAP_HNBDe_Register_t request_out;
+	memset(&request_out, 0, sizeof(request_out));
+	rc = hnbap_encode_hnbde_registeries(&request_out, &request);
+	if (rc < 0) {
+		printf("Could not encode HNB deregister request IEs\n");
+	}
+
+	msg = hnbap_generate_initiating_message(HNBAP_ProcedureCode_id_HNBDe_Register,
+						HNBAP_Criticality_reject,
+						&asn_DEF_HNBAP_HNBDe_Register,
+						&request_out);
+
+	msgb_sctp_ppid(msg) = IUH_PPI_HNBAP;
+
+	osmo_wqueue_enqueue(&hnb->wqueue, msg);
+}
diff --git a/src/osmo-hnodeb/main.c b/src/osmo-hnodeb/main.c
index 0fcb909..3abfc7c 100644
--- a/src/osmo-hnodeb/main.c
+++ b/src/osmo-hnodeb/main.c
@@ -51,8 +51,6 @@
 
 #include <osmocom/crypt/auth.h>
 
-#include <osmocom/hnbap/hnbap_common.h>
-#include <osmocom/hnbap/hnbap_ies_defs.h>
 #include <osmocom/rua/rua_msg_factory.h>
 #include <osmocom/ranap/iu_helpers.h>
 
@@ -67,6 +65,7 @@
 #include <osmocom/ranap/RANAP_DirectTransfer.h>
 #include <osmocom/ranap/ranap_common.h>
 
+#include <osmocom/hnodeb/hnbap.h>
 #include <osmocom/hnodeb/rua.h>
 #include <osmocom/hnodeb/ranap.h>
 #include <osmocom/hnodeb/vty.h>
@@ -81,87 +80,6 @@
 
 struct msgb *rua_new_udt(struct msgb *inmsg);
 
-int hnb_ue_register_tx(struct hnb *hnb, const char *imsi_str)
-{
-	struct msgb *msg;
-	int rc, imsi_len;
-
-	uint8_t imsi_buf[16];
-
-	HNBAP_UERegisterRequest_t request_out;
-	HNBAP_UERegisterRequestIEs_t request;
-	memset(&request, 0, sizeof(request));
-
-	request.uE_Identity.present = HNBAP_UE_Identity_PR_iMSI;
-
-	imsi_len = ranap_imsi_encode(imsi_buf, sizeof(imsi_buf), imsi_str);
-	OCTET_STRING_fromBuf(&request.uE_Identity.choice.iMSI, (const char*)imsi_buf, imsi_len);
-
-	request.registration_Cause = HNBAP_Registration_Cause_normal;
-	request.uE_Capabilities.access_stratum_release_indicator = HNBAP_Access_stratum_release_indicator_rel_6;
-	request.uE_Capabilities.csg_capability = HNBAP_CSG_Capability_not_csg_capable;
-
-	memset(&request_out, 0, sizeof(request_out));
-	rc = hnbap_encode_ueregisterrequesties(&request_out, &request);
-	OSMO_ASSERT(rc == 0);
-
-	msg = hnbap_generate_initiating_message(HNBAP_ProcedureCode_id_UERegister,
-						HNBAP_Criticality_reject,
-						&asn_DEF_HNBAP_UERegisterRequest,
-						&request_out);
-
-	ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_HNBAP_UERegisterRequest, &request_out);
-
-	msgb_sctp_ppid(msg) = IUH_PPI_HNBAP;
-
-	return osmo_wqueue_enqueue(&hnb->wqueue, msg);
-}
-
-static int hnb_rx_hnb_register_acc(struct hnb *hnb, ANY_t *in)
-{
-	int rc;
-	HNBAP_HNBRegisterAcceptIEs_t accept;
-
-	rc = hnbap_decode_hnbregisteraccepties(&accept, in);
-	if (rc < 0) {
-	}
-
-	hnb->rnc_id = accept.rnc_id;
-	printf("HNB Register accept with RNC ID %u\n", hnb->rnc_id);
-
-	hnbap_free_hnbregisteraccepties(&accept);
-	return 0;
-}
-
-static int hnb_rx_ue_register_acc(struct hnb *hnb, ANY_t *in)
-{
-	int rc;
-	uint32_t ctx_id;
-	HNBAP_UERegisterAcceptIEs_t accept;
-	char imsi[16];
-
-	rc = hnbap_decode_ueregisteraccepties(&accept, in);
-	if (rc < 0) {
-		return rc;
-	}
-
-	if (accept.uE_Identity.present != HNBAP_UE_Identity_PR_iMSI) {
-		printf("Wrong type in UE register accept\n");
-		return -1;
-	}
-
-	ctx_id = asn1bitstr_to_u24(&accept.context_ID);
-
-	ranap_bcd_decode(imsi, sizeof(imsi), accept.uE_Identity.choice.iMSI.buf,
-			accept.uE_Identity.choice.iMSI.size);
-	printf("UE Register accept for IMSI %s, context %u\n", imsi, ctx_id);
-
-	hnb->ctx_id = ctx_id;
-	hnbap_free_ueregisteraccepties(&accept);
-
-	return 0;
-}
-
 static struct msgb *gen_nas_id_resp()
 {
 	uint8_t id_resp[] = {
@@ -440,40 +358,6 @@
 	/* TODO reply */
 }
 
-int hnb_hnbap_rx(struct hnb *hnb, struct msgb *msg)
-{
-	HNBAP_HNBAP_PDU_t _pdu, *pdu = &_pdu;
-	asn_dec_rval_t dec_ret;
-	int rc;
-
-	memset(pdu, 0, sizeof(*pdu));
-	dec_ret = aper_decode(NULL, &asn_DEF_HNBAP_HNBAP_PDU, (void **) &pdu,
-			      msg->data, msgb_length(msg), 0, 0);
-	if (dec_ret.code != RC_OK) {
-		LOGP(DMAIN, LOGL_ERROR, "Error in ASN.1 decode\n");
-		return -EINVAL;
-	}
-
-	if (pdu->present != HNBAP_HNBAP_PDU_PR_successfulOutcome) {
-		printf("Unexpected HNBAP message received\n");
-	}
-
-	switch (pdu->choice.successfulOutcome.procedureCode) {
-	case HNBAP_ProcedureCode_id_HNBRegister:
-		/* Get HNB id and send UE Register request */
-		rc = hnb_rx_hnb_register_acc(hnb, &pdu->choice.successfulOutcome.value);
-		break;
-	case HNBAP_ProcedureCode_id_UERegister:
-		rc = hnb_rx_ue_register_acc(hnb, &pdu->choice.successfulOutcome.value);
-		break;
-	default:
-		rc = -ENOSPC;
-		break;
-	}
-
-	return rc;
-}
-
 extern void direct_transfer_nas_pdu_print(ANY_t *in);
 
 static int hnb_read_cb(struct osmo_fd *fd)
@@ -557,83 +441,6 @@
 	return rc;
 }
 
-void hnb_send_register_req(struct hnb *hnb)
-{
-	HNBAP_HNBRegisterRequest_t request_out;
-	struct msgb *msg;
-	int rc;
-	uint16_t lac, sac;
-	uint8_t rac;
-	uint32_t cid;
-	uint8_t plmn[] = {0x09, 0xf1, 0x99};
-	char identity[50] = "ATestHNB@";
-
-	HNBAP_HNBRegisterRequestIEs_t request;
-	memset(&request, 0, sizeof(request));
-
-	lac = 0xc0fe;
-	sac = 0xabab;
-	rac = 0x42;
-	cid = 0xadceaab;
-
-	asn1_u16_to_str(&request.lac, &lac, lac);
-	asn1_u16_to_str(&request.sac, &sac, sac);
-	asn1_u8_to_str(&request.rac, &rac, rac);
-	asn1_u28_to_bitstring(&request.cellIdentity, &cid, cid);
-
-	request.hnB_Identity.hNB_Identity_Info.buf = (uint8_t*) identity;
-	request.hnB_Identity.hNB_Identity_Info.size = strlen(identity);
-
-	request.plmNidentity.buf = plmn;
-	request.plmNidentity.size = 3;
-
-
-
-	memset(&request_out, 0, sizeof(request_out));
-	rc = hnbap_encode_hnbregisterrequesties(&request_out, &request);
-	if (rc < 0) {
-		printf("Could not encode HNB register request IEs\n");
-	}
-
-	msg = hnbap_generate_initiating_message(HNBAP_ProcedureCode_id_HNBRegister,
-						HNBAP_Criticality_reject,
-						&asn_DEF_HNBAP_HNBRegisterRequest,
-						&request_out);
-
-
-	msgb_sctp_ppid(msg) = IUH_PPI_HNBAP;
-
-	osmo_wqueue_enqueue(&hnb->wqueue, msg);
-}
-
-void hnb_send_deregister_req(struct hnb *hnb)
-{
-	struct msgb *msg;
-	int rc;
-
-	HNBAP_HNBDe_RegisterIEs_t request;
-	memset(&request, 0, sizeof(request));
-
-	request.cause.present = HNBAP_Cause_PR_misc;
-	request.cause.choice.misc = HNBAP_CauseMisc_o_and_m_intervention;
-
-	HNBAP_HNBDe_Register_t request_out;
-	memset(&request_out, 0, sizeof(request_out));
-	rc = hnbap_encode_hnbde_registeries(&request_out, &request);
-	if (rc < 0) {
-		printf("Could not encode HNB deregister request IEs\n");
-	}
-
-	msg = hnbap_generate_initiating_message(HNBAP_ProcedureCode_id_HNBDe_Register,
-						HNBAP_Criticality_reject,
-						&asn_DEF_HNBAP_HNBDe_Register,
-						&request_out);
-
-	msgb_sctp_ppid(msg) = IUH_PPI_HNBAP;
-
-	osmo_wqueue_enqueue(&hnb->wqueue, msg);
-}
-
 static struct vty_app_info vty_info = {
 	.name		= "OsmohNodeB",
 	.version	= "0",
diff --git a/src/osmo-hnodeb/vty.c b/src/osmo-hnodeb/vty.c
index ccca6d0..a1bb885 100644
--- a/src/osmo-hnodeb/vty.c
+++ b/src/osmo-hnodeb/vty.c
@@ -32,6 +32,7 @@
 #include <osmocom/ranap/ranap_common.h>
 #include <osmocom/ranap/ranap_msg_factory.h>
 
+#include <osmocom/hnodeb/hnbap.h>
 #include <osmocom/hnodeb/vty.h>
 #include <osmocom/hnodeb/hnodeb.h>
 

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

Gerrit-Project: osmo-hnodeb
Gerrit-Branch: master
Gerrit-Change-Id: I8356421169bebe1d411b05b19241ea639dc3f733
Gerrit-Change-Number: 26000
Gerrit-PatchSet: 2
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy at sysmocom.de>
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/20211102/ef69e550/attachment.htm>


More information about the gerrit-log mailing list