diff --git a/include/osmocom/hlr/gsup_server.h b/include/osmocom/hlr/gsup_server.h index 9c562e22..86ae4ec3 100644 --- a/include/osmocom/hlr/gsup_server.h +++ b/include/osmocom/hlr/gsup_server.h @@ -69,8 +69,6 @@ void osmo_gsup_server_destroy(struct osmo_gsup_server *gsups); int osmo_gsup_configure_wildcard_apn(struct osmo_gsup_message *gsup, uint8_t *apn_buf, size_t apn_buf_size); int osmo_gsup_create_insert_subscriber_data_msg(struct osmo_gsup_message *gsup, const char *imsi, const char *msisdn, - uint8_t *msisdn_enc, size_t msisdn_enc_size, - uint8_t *apn_buf, size_t apn_buf_size, - enum osmo_gsup_cn_domain cn_domain); + enum osmo_gsup_cn_domain cn_domain, void *talloc_ctx); int osmo_gsup_forward_to_local_peer(struct osmo_gsup_server *server, const struct osmo_cni_peer_id *to_peer, struct osmo_gsup_req *req, struct osmo_gsup_message *modified_gsup); diff --git a/src/gsup_server.c b/src/gsup_server.c index f0d8101f..097a854d 100644 --- a/src/gsup_server.c +++ b/src/gsup_server.c @@ -446,19 +446,16 @@ int osmo_gsup_configure_wildcard_apn(struct osmo_gsup_message *gsup, * \param[out] gsup The gsup message to populate. * \param[in] imsi The subscriber's IMSI. * \param[in] msisdn The subscriber's MSISDN. - * \param[out] msisdn_enc A buffer large enough to store the MSISDN in encoded form. - * \param[in] msisdn_enc_size Size of the buffer (must be >= OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN). - * \param[out] apn_buf A buffer large enough to store an APN (required if cn_domain is OSMO_GSUP_CN_DOMAIN_PS). - * \param[in] apn_buf_size Size of APN buffer (must be >= APN_MAXLEN). * \param[in] cn_domain The CN Domain of the subscriber connection. + * \param[in] talloc_ctx To allocation memory for dynamic fields (msisdn, apn) in the gsup field * \returns 0 on success, and negative on error. */ int osmo_gsup_create_insert_subscriber_data_msg(struct osmo_gsup_message *gsup, const char *imsi, const char *msisdn, - uint8_t *msisdn_enc, size_t msisdn_enc_size, - uint8_t *apn_buf, size_t apn_buf_size, - enum osmo_gsup_cn_domain cn_domain) + enum osmo_gsup_cn_domain cn_domain, + void *talloc_ctx) { int len; + uint8_t *msisdn_buf = talloc_size(talloc_ctx, OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN); OSMO_ASSERT(gsup); *gsup = (struct osmo_gsup_message){ @@ -467,27 +464,22 @@ int osmo_gsup_create_insert_subscriber_data_msg(struct osmo_gsup_message *gsup, osmo_strlcpy(gsup->imsi, imsi, sizeof(gsup->imsi)); - if (msisdn_enc_size < OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN) - return -ENOSPC; - - OSMO_ASSERT(msisdn_enc); - len = gsm48_encode_bcd_number(msisdn_enc, msisdn_enc_size, 0, msisdn); + len = gsm48_encode_bcd_number(msisdn_buf, 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); return -ENOSPC; } - gsup->msisdn_enc = msisdn_enc; + gsup->msisdn_enc = msisdn_buf; 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) { - OSMO_ASSERT(apn_buf_size >= APN_MAXLEN); - OSMO_ASSERT(apn_buf); + uint8_t *apn_buf = talloc_size(talloc_ctx, APN_MAXLEN); /* FIXME: PDP infos - use more fine-grained access control instead of wildcard APN */ - osmo_gsup_configure_wildcard_apn(gsup, apn_buf, apn_buf_size); + osmo_gsup_configure_wildcard_apn(gsup, apn_buf, APN_MAXLEN); } return 0; diff --git a/src/hlr.c b/src/hlr.c index 8183d9b9..e3b54acd 100644 --- a/src/hlr.c +++ b/src/hlr.c @@ -85,8 +85,6 @@ osmo_hlr_subscriber_update_notify(struct hlr_subscriber *subscr) llist_for_each_entry(co, &g_hlr->gs->clients, list) { struct osmo_gsup_message gsup = { }; - uint8_t msisdn_enc[OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN]; - uint8_t apn[APN_MAXLEN]; struct msgb *msg_out; uint8_t *peer; int peer_len; @@ -131,8 +129,7 @@ osmo_hlr_subscriber_update_notify(struct hlr_subscriber *subscr) subscr->imsi, cn_domain == OSMO_GSUP_CN_DOMAIN_PS ? "PS" : "CS", osmo_quote_str(peer_compare, -1)); - if (osmo_gsup_create_insert_subscriber_data_msg(&gsup, subscr->imsi, subscr->msisdn, msisdn_enc, - sizeof(msisdn_enc), apn, sizeof(apn), cn_domain) != 0) { + if (osmo_gsup_create_insert_subscriber_data_msg(&gsup, subscr->imsi, subscr->msisdn, cn_domain, OTC_SELECT) != 0) { LOGP(DLGSUP, LOGL_ERROR, "IMSI='%s': Cannot notify GSUP client; could not create gsup message " "for %s:%u\n", subscr->imsi, diff --git a/src/lu_fsm.c b/src/lu_fsm.c index deb180bd..e6ed31af 100644 --- a/src/lu_fsm.c +++ b/src/lu_fsm.c @@ -241,13 +241,11 @@ static void lu_fsm_wait_insert_data_result_onenter(struct osmo_fsm_inst *fi, uin struct lu *lu = fi->priv; struct hlr_subscriber *subscr = &lu->subscr; struct osmo_gsup_message gsup; - uint8_t msisdn_enc[OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN]; - uint8_t apn[APN_MAXLEN]; if (osmo_gsup_create_insert_subscriber_data_msg(&gsup, subscr->imsi, - subscr->msisdn, msisdn_enc, sizeof(msisdn_enc), - apn, sizeof(apn), - lu->is_ps? OSMO_GSUP_CN_DOMAIN_PS : OSMO_GSUP_CN_DOMAIN_CS)) { + subscr->msisdn, + lu->is_ps ? OSMO_GSUP_CN_DOMAIN_PS : OSMO_GSUP_CN_DOMAIN_CS, + OTC_SELECT)) { lu_failure(lu, GMM_CAUSE_NET_FAIL, "cannot encode Insert Subscriber Data message"); return; }