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.orgHello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/7743 to look at the new patch set (#2). 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/gsup_server.h M src/hlr.c M src/luop.c 3 files changed, 79 insertions(+), 7 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-hlr refs/changes/43/7743/2 diff --git a/src/gsup_server.h b/src/gsup_server.h index 74062d4..1f40f21 100644 --- a/src/gsup_server.h +++ b/src/gsup_server.h @@ -4,6 +4,7 @@ #include <osmocom/core/msgb.h> #include <osmocom/abis/ipa.h> #include <osmocom/abis/ipaccess.h> +#include <osmocom/gsm/gsup.h> struct osmo_gsup_conn; @@ -33,6 +34,8 @@ struct tlv_parsed ccm; unsigned int auc_3g_ind; /*!< IND index used for UMTS AKA SQN */ + + enum osmo_gsup_cn_domain cn_domain; /* Set when first Location Update is received. */ }; diff --git a/src/hlr.c b/src/hlr.c index 4fbc268..80330d1 100644 --- a/src/hlr.c +++ b/src/hlr.c @@ -62,19 +62,72 @@ 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 = { + .message_type = OSMO_GSUP_MSGT_INSERT_DATA_REQUEST + }; + uint8_t *peer; + int peer_len; + uint8_t msisdn_enc[43]; /* TODO use constant; TS 24.008 10.5.4.7 */ + uint8_t apn[APN_MAXLEN]; + int len; + struct msgb *msg_out; + + 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 allocate lu_operation," + "IMSI='%s': Cannot notify GSUP client, cannot get peer 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); + + 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; + + gsup.cn_domain = co->cn_domain; + 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 MSC/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; + } } } diff --git a/src/luop.c b/src/luop.c index 02c41d0..4236dd6 100644 --- a/src/luop.c +++ b/src/luop.c @@ -129,6 +129,8 @@ { uint8_t *peer_addr; struct lu_operation *luop = lu_op_alloc(conn->server); + uint8_t *unit; + int unit_len; int rc = osmo_gsup_conn_ccm_get(conn, &peer_addr, IPAC_IDTAG_SERNR); if (rc < 0) { lu_op_free(luop); @@ -137,6 +139,20 @@ luop->peer = talloc_memdup(luop, peer_addr, rc); + unit_len = osmo_gsup_conn_ccm_get(conn, &unit, IPAC_IDTAG_UNITNAME); + if (conn->cn_domain == 0) { + if (unit_len >= 0) { + /* + * The cast to 'char *' avoids a "pointer targets differ in signedness" + * warning from GCC 7.2.0. + */ + bool is_sgsn = (strncmp((char *)unit, "SGSN", 4) == 0); + conn->cn_domain = is_sgsn ? OSMO_GSUP_CN_DOMAIN_PS : OSMO_GSUP_CN_DOMAIN_CS; + } else { + /* fall back to circuit-switched */ + conn->cn_domain = OSMO_GSUP_CN_DOMAIN_CS; + } + } return luop; } -- To view, visit https://gerrit.osmocom.org/7743 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newpatchset Gerrit-Change-Id: I06c43ece2b48dc63d599000eb6d6d51e08963067 Gerrit-PatchSet: 2 Gerrit-Project: osmo-hlr Gerrit-Branch: master Gerrit-Owner: Stefan Sperling <ssperling at sysmocom.de> Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr at sysmocom.de> Gerrit-Reviewer: neels <nhofmeyr at sysmocom.de>