[PATCH] osmo-hlr[master]: move creation of insert subscriber data messages to a common...

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

Stefan Sperling gerrit-no-reply at lists.osmocom.org
Thu May 3 12:29:19 UTC 2018


Review at  https://gerrit.osmocom.org/7992

move creation of insert subscriber data messages to a common function

Move code to create an Insert Subscriber Data message into a common
function which can be shared by hlr.c and luop.c.

Change-Id: I6a92ca34cdaadca9eacc774bb1ca386c325ba865
Requested-by: neels
Related: OS#2785
---
M src/gsup_server.c
M src/gsup_server.h
M src/hlr.c
M src/luop.c
4 files changed, 98 insertions(+), 57 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-hlr refs/changes/92/7992/1

diff --git a/src/gsup_server.c b/src/gsup_server.c
index 24ba738..e4329a3 100644
--- a/src/gsup_server.c
+++ b/src/gsup_server.c
@@ -24,6 +24,7 @@
 #include <osmocom/core/linuxlist.h>
 #include <osmocom/abis/ipa.h>
 #include <osmocom/abis/ipaccess.h>
+#include <osmocom/gsm/gsm48_ie.h>
 #include <osmocom/gsm/apn.h>
 
 #include "gsup_server.h"
@@ -351,3 +352,47 @@
 	/* FIXME: use real value: */
 	gsup->pdp_infos[0].context_id = 1;
 }
+
+struct osmo_gsup_message *
+osmo_gsup_create_insert_subscriber_data_msg(char *imsi, char *msisdn, enum osmo_gsup_cn_domain cn_domain)
+{
+	struct osmo_gsup_message *gsup;
+	int len;
+	uint8_t *msisdn_enc;
+
+	gsup = talloc_zero(NULL, struct osmo_gsup_message);
+	if (gsup == NULL) {
+		LOGP(DLGSUP, LOGL_ERROR, "IMSI='%s': cannot allocate Insert Subscriber Data Message\n", imsi);
+		return NULL;
+	}
+	gsup->message_type = OSMO_GSUP_MSGT_INSERT_DATA_REQUEST;
+
+	osmo_strlcpy(gsup->imsi, imsi, GSM23003_IMSI_MAX_DIGITS + 1);
+
+	msisdn_enc = talloc_size(gsup, OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN);
+	if (msisdn_enc == NULL) {
+		LOGP(DLGSUP, LOGL_ERROR, "%s: Error: cannot encode MSISDN '%s'; could not allocate buffer\n",
+		     imsi, msisdn);
+		talloc_free(gsup);
+		return NULL;
+	}
+	len = gsm48_encode_bcd_number(msisdn_enc, OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN, 0, msisdn);
+	if (len < 1) {
+		LOGP(DLGSUP, LOGL_ERROR, "%s: Error: cannot encode MSISDN '%s'\n", imsi, msisdn);
+		talloc_free(gsup);
+		return NULL;
+	}
+	gsup->msisdn_enc = msisdn_enc;
+	gsup->msisdn_enc_len = len;
+
+	#pragma message "FIXME: deal with encoding the following data: gsup.hlr_enc"
+
+	gsup->cn_domain = cn_domain;
+	if (gsup->cn_domain == OSMO_GSUP_CN_DOMAIN_PS) {
+		/* FIXME: PDP infos - use more fine-grained access control
+		   instead of wildcard APN */
+		osmo_gsup_configure_wildcard_apn(gsup);
+	}
+
+	return gsup;
+}
diff --git a/src/gsup_server.h b/src/gsup_server.h
index 3d36bff..55a8c3e 100644
--- a/src/gsup_server.h
+++ b/src/gsup_server.h
@@ -6,6 +6,10 @@
 #include <osmocom/abis/ipaccess.h>
 #include <osmocom/gsm/gsup.h>
 
+#ifndef OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN
+#define OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN	43 /* TS 24.008 10.5.4.7 */
+#endif
+
 struct osmo_gsup_conn;
 
 /* Expects message in msg->l2h */
@@ -54,3 +58,5 @@
 void osmo_gsup_server_destroy(struct osmo_gsup_server *gsups);
 
 void osmo_gsup_configure_wildcard_apn(struct osmo_gsup_message *gsup);
+struct osmo_gsup_message *osmo_gsup_create_insert_subscriber_data_msg(char *imsi, char *msisdn,
+								      enum osmo_gsup_cn_domain cn_domain);
diff --git a/src/hlr.c b/src/hlr.c
index 195e5d2..36aad94 100644
--- a/src/hlr.c
+++ b/src/hlr.c
@@ -26,7 +26,6 @@
 #include <osmocom/core/logging.h>
 #include <osmocom/core/application.h>
 #include <osmocom/gsm/gsup.h>
-#include <osmocom/gsm/gsm48_ie.h>
 #include <osmocom/vty/vty.h>
 #include <osmocom/vty/command.h>
 #include <osmocom/vty/telnet_interface.h>
@@ -61,46 +60,28 @@
 		return;
 
 	llist_for_each_entry(co, &g_hlr->gs->clients, list) {
-		struct osmo_gsup_message gsup = {
-			.message_type = OSMO_GSUP_MSGT_INSERT_DATA_REQUEST
-		};
+		struct osmo_gsup_message *gsup;
+		struct msgb *msg_out;
 		uint8_t *peer;
 		int peer_len;
-		uint8_t msisdn_enc[43]; /* TODO use constant; TS 24.008 10.5.4.7 */
-		int len;
-		struct msgb *msg_out;
+		enum osmo_gsup_cn_domain cn_domain;
 
-		peer_len = osmo_gsup_conn_ccm_get(co, &peer, IPAC_IDTAG_SERNR);
-		if (peer_len < 0) {
+		if (co->supports_ps)
+			cn_domain = OSMO_GSUP_CN_DOMAIN_PS;
+		else if (co->supports_cs)
+			cn_domain = OSMO_GSUP_CN_DOMAIN_CS;
+		else {
+			/* We have not yet received a location update from this subscriber .*/
+			continue;
+		}
+
+		gsup = osmo_gsup_create_insert_subscriber_data_msg(subscr->imsi, subscr->msisdn, cn_domain);
+		if (gsup == NULL) {
 			LOGP(DMAIN, LOGL_ERROR,
-			       "IMSI='%s': Cannot notify GSUP client, cannot get peer name "
+			       "IMSI='%s': Cannot notify GSUP client; could not allocate gsup message "
 			       "for %s:%u\n", subscr->imsi,
 			       co && co->conn && co->conn->server? co->conn->server->addr : "unset",
 			       co && co->conn && co->conn->server? co->conn->server->port : 0);
-			continue;
-		}
-
-		osmo_strlcpy(gsup.imsi, subscr->imsi, GSM23003_IMSI_MAX_DIGITS + 1);
-
-		len = gsm48_encode_bcd_number(msisdn_enc, sizeof(msisdn_enc), 0, subscr->msisdn);
-		if (len < 1) {
-			LOGP(DMAIN, LOGL_ERROR, "%s: Error: cannot encode MSISDN '%s'\n",
-			     subscr->imsi, subscr->msisdn);
-			continue;
-		}
-		gsup.msisdn_enc = msisdn_enc;
-		gsup.msisdn_enc_len = len;
-
-		if (co->supports_ps) {
-			gsup.cn_domain = OSMO_GSUP_CN_DOMAIN_PS;
-
-			/* FIXME: PDP infos - use more fine-grained access control
-			   instead of wildcard APN */
-			osmo_gsup_configure_wildcard_apn(&gsup);
-		} else if (co->supports_cs) {
-			gsup.cn_domain = OSMO_GSUP_CN_DOMAIN_CS;
-		} else {
-			/* We have not yet received a location update from this subscriber .*/
 			continue;
 		}
 
@@ -112,10 +93,23 @@
 			       "for %s:%u\n", subscr->imsi,
 			       co && co->conn && co->conn->server? co->conn->server->addr : "unset",
 			       co && co->conn && co->conn->server? co->conn->server->port : 0);
+			talloc_free(gsup);
+			gsup = NULL;
+			continue;
+		}
+		osmo_gsup_encode(msg_out, gsup);
+		talloc_free(gsup);
+		gsup = NULL;
+
+		peer_len = osmo_gsup_conn_ccm_get(co, &peer, IPAC_IDTAG_SERNR);
+		if (peer_len < 0) {
+			LOGP(DMAIN, LOGL_ERROR,
+			       "IMSI='%s': cannot get peer name for connection %s:%u\n", subscr->imsi,
+			       co && co->conn && co->conn->server? co->conn->server->addr : "unset",
+			       co && co->conn && co->conn->server? co->conn->server->port : 0);
 			continue;
 		}
 
-		osmo_gsup_encode(msg_out, &gsup);
 		if (osmo_gsup_addr_send(g_hlr->gs, peer, peer_len, msg_out) < 0) {
 			LOGP(DMAIN, LOGL_ERROR,
 			       "IMSI='%s': Cannot notify GSUP client; send operation failed "
diff --git a/src/luop.c b/src/luop.c
index 7150b64..2d257f3 100644
--- a/src/luop.c
+++ b/src/luop.c
@@ -25,7 +25,6 @@
 #include <errno.h>
 
 #include <osmocom/core/logging.h>
-#include <osmocom/gsm/gsm48_ie.h>
 #include <osmocom/gsm/gsup.h>
 
 #include "gsup_server.h"
@@ -51,6 +50,11 @@
 	struct msgb *msg_out;
 
 	msg_out = msgb_alloc_headroom(1024+16, 16, "GSUP LUOP");
+	if (msg_out == NULL) {
+		LOGP(DMAIN, LOGL_ERROR,
+		       "IMSI='%s': Cannot encode GSUP message; could not allocate msg buffer\n", luop->subscr.imsi);
+		return;
+	}
 	osmo_gsup_encode(msg_out, gsup);
 
 	osmo_gsup_addr_send(luop->gsup_server, luop->peer,
@@ -231,37 +235,29 @@
 /*! Transmit Insert Subscriber Data to new VLR/SGSN */
 void lu_op_tx_insert_subscr_data(struct lu_operation *luop)
 {
-	struct osmo_gsup_message gsup;
-	uint8_t msisdn_enc[43]; /* TODO use constant; TS 24.008 10.5.4.7 */
-	int l;
+	struct hlr_subscriber *subscr = &luop->subscr;
+	struct osmo_gsup_message *gsup;
+	enum osmo_gsup_cn_domain cn_domain;
 
 	OSMO_ASSERT(luop->state == LU_S_LU_RECEIVED ||
 		    luop->state == LU_S_CANCEL_ACK_RECEIVED);
 
-	fill_gsup_msg(&gsup, luop, OSMO_GSUP_MSGT_INSERT_DATA_REQUEST);
+	if (luop->is_ps)
+		cn_domain = OSMO_GSUP_CN_DOMAIN_PS;
+	else
+		cn_domain = OSMO_GSUP_CN_DOMAIN_CS;
 
-	l = gsm48_encode_bcd_number(msisdn_enc, sizeof(msisdn_enc), 0,
-				    luop->subscr.msisdn);
-	if (l < 1) {
+	gsup = osmo_gsup_create_insert_subscriber_data_msg(subscr->imsi, subscr->msisdn, cn_domain);
+	if (gsup == NULL) {
 		LOGP(DMAIN, LOGL_ERROR,
-		     "%s: Error: cannot encode MSISDN '%s'\n",
-		     luop->subscr.imsi, luop->subscr.msisdn);
-		lu_op_tx_error(luop, GMM_CAUSE_PROTO_ERR_UNSPEC);
+		       "IMSI='%s': Cannot notify GSUP client; could not allocate gsup message "
+		       "for %s\n", subscr->imsi, luop->peer);
 		return;
-	}
-	gsup.msisdn_enc = msisdn_enc;
-	gsup.msisdn_enc_len = l;
-
-	#pragma message "FIXME: deal with encoding the following data: gsup.hlr_enc"
-
-	if (luop->is_ps) {
-		/* FIXME: PDP infos - use more fine-grained access control
-		   instead of wildcard APN */
-		osmo_gsup_configure_wildcard_apn(&gsup);
 	}
 
 	/* Send ISD to new VLR/SGSN */
-	_luop_tx_gsup(luop, &gsup);
+	_luop_tx_gsup(luop, gsup);
+	talloc_free(gsup);
 
 	lu_op_statechg(luop, LU_S_ISD_SENT);
 	osmo_timer_schedule(&luop->timer, ISD_TIMEOUT_SECS, 0);

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6a92ca34cdaadca9eacc774bb1ca386c325ba865
Gerrit-PatchSet: 1
Gerrit-Project: osmo-hlr
Gerrit-Branch: master
Gerrit-Owner: Stefan Sperling <ssperling at sysmocom.de>



More information about the gerrit-log mailing list