[PATCH] osmo-hlr[master]: rewrite subscriber_update_notify() without calls into luop

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
Tue Apr 10 17:31:40 UTC 2018


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

rewrite subscriber_update_notify() without calls into luop

This function relied on implementation details of the luop code.
Port what is necessary for an independent Insert Subscriber Data
Tx operation from the luop code into this function.

A next possible step would be to try to merge both of these
into a common implementation, but that is left for future work.

The TTCN3 test TC_vty_msisdn_isd is still passing (it currently
triggers the "circuit switched domain" case because it does not
advertise itself as an SGSN in the IPA unit name).

Change-Id: I06c43ece2b48dc63d599000eb6d6d51e08963067
Related: OS#2785
---
M src/hlr.c
1 file changed, 76 insertions(+), 7 deletions(-)


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

diff --git a/src/hlr.c b/src/hlr.c
index 4fbc268..d06cf0a 100644
--- a/src/hlr.c
+++ b/src/hlr.c
@@ -62,19 +62,88 @@
 		return;
 
 	llist_for_each_entry(co, &g_hlr->gs->clients, list) {
-		struct lu_operation *luop = lu_op_alloc_conn(co);
-		if (!luop) {
+		struct osmo_gsup_message gsup;
+		uint8_t *unit;
+		int unit_len;
+		uint8_t *peer;
+		int peer_len;
+		uint8_t msisdn_enc[43]; /* TODO use constant; TS 24.008 10.5.4.7 */
+		bool is_ps;
+		uint8_t apn[APN_MAXLEN];
+		int len;
+		struct msgb *msg_out;
+
+		unit_len = osmo_gsup_conn_ccm_get(co, &unit, IPAC_IDTAG_UNITNAME);
+		if (unit_len < 0) {
 			LOGP(DMAIN, LOGL_ERROR,
-			       "IMSI='%s': Cannot notify GSUP client, cannot allocate lu_operation,"
+			       "IMSI='%s': Cannot notify GSUP client, cannot get unit name"
 			       " 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;
 		}
-		luop->subscr = *subscr;
-		luop->state = LU_S_LU_RECEIVED; /* Pretend we received a location update. */
-		lu_op_tx_insert_subscr_data(luop);
-		lu_op_free(luop);
+
+		peer_len = osmo_gsup_conn_ccm_get(co, &peer, IPAC_IDTAG_SERNR);
+		if (peer_len < 0) {
+			LOGP(DMAIN, LOGL_ERROR,
+			       "IMSI='%s': Cannot notify GSUP client, cannot get peer address "
+			       " 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;
+		}
+
+		memset(&gsup, 0, sizeof(gsup));
+		gsup.message_type = OSMO_GSUP_MSGT_INSERT_DATA_REQUEST;
+		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;
+
+		/* XXX Cast to 'char *' avoids a "pointer targets differ in signedness" warning from GCC 7.2.0. */
+		is_ps = (strncmp((char *)unit, "SGSN", 4) == 0);
+		gsup.cn_domain = is_ps ? OSMO_GSUP_CN_DOMAIN_PS : OSMO_GSUP_CN_DOMAIN_CS;
+
+		if (gsup.cn_domain == OSMO_GSUP_CN_DOMAIN_PS) {
+			/* FIXME: PDP infos - use more fine-grained access control
+			   instead of wildcard APN */
+			len = osmo_apn_from_str(apn, sizeof(apn), "*");
+			if (len > 0) {
+				gsup.pdp_infos[0].apn_enc = apn;
+				gsup.pdp_infos[0].apn_enc_len = len;
+				gsup.pdp_infos[0].have_info = 1;
+				gsup.num_pdp_infos = 1;
+				/* FIXME: use real value: */
+				gsup.pdp_infos[0].context_id = 1;
+			}
+		}
+
+		/* Send ISD to VLR/SGSN */
+		msg_out = msgb_alloc_headroom(1024+16, 16, "GSUP ISD UPDATE");
+		if (msg_out == NULL) {
+			LOGP(DMAIN, LOGL_ERROR,
+			       "IMSI='%s': Cannot notify GSUP client; could not allocate msg buffer "
+			       " 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_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 "
+			       " 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;
+		}
 	}
 }
 

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I06c43ece2b48dc63d599000eb6d6d51e08963067
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