neels has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-hlr/+/15916 )
Change subject: add osmo_gsup_conn_send_err_reply() ...................................................................... add osmo_gsup_conn_send_err_reply() Remove hlr.c's static gsup_send_err_reply(), and create new osmo_gsup_conn_send_err_reply(), as used in osmo-msc. It includes more of the newer IEs in the response, like an SS/USSD session id. Prepares for adding D-GSM / MS lookup, which will need this function moved to a non-static context. Change-Id: I792fd9993ab2a323af58782a357d71205c43b72a --- M src/gsup_server.c M src/gsup_server.h M src/hlr.c 3 files changed, 41 insertions(+), 23 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-hlr refs/changes/16/15916/1 diff --git a/src/gsup_server.c b/src/gsup_server.c index 2870e9d..b08d6ce 100644 --- a/src/gsup_server.c +++ b/src/gsup_server.c @@ -57,6 +57,39 @@ return 0; } +int osmo_gsup_conn_send_err_reply(struct osmo_gsup_conn *conn, const struct osmo_gsup_message *gsup_orig, + enum gsm48_gmm_cause cause) +{ + struct osmo_gsup_message gsup_reply; + struct msgb *msg_out; + + /* No need to answer if we couldn't parse an ERROR message type, only REQUESTs need an error reply. */ + if (!OSMO_GSUP_IS_MSGT_REQUEST(gsup_orig->message_type)) + return 0; + + gsup_reply = (struct osmo_gsup_message){ + .cause = cause, + .message_type = OSMO_GSUP_TO_MSGT_ERROR(gsup_orig->message_type), + .message_class = gsup_orig->message_class, + + /* RP-Message-Reference is mandatory for SM Service */ + .sm_rp_mr = gsup_orig->sm_rp_mr, + }; + + OSMO_STRLCPY_ARRAY(gsup_reply.imsi, gsup_orig->imsi); + + /* For SS/USSD, it's important to keep both session state and ID IEs */ + if (gsup_orig->session_state != OSMO_GSUP_SESSION_STATE_NONE) { + gsup_reply.session_state = OSMO_GSUP_SESSION_STATE_END; + gsup_reply.session_id = gsup_orig->session_id; + } + + msg_out = osmo_gsup_msgb_alloc("GSUP ERR response"); + OSMO_ASSERT(msg_out); + osmo_gsup_encode(msg_out, &gsup_reply); + return osmo_gsup_conn_send(conn, msg_out); +} + static int osmo_gsup_conn_oap_handle(struct osmo_gsup_conn *conn, struct msgb *msg_rx) { diff --git a/src/gsup_server.h b/src/gsup_server.h index 14f5013..1f67c29 100644 --- a/src/gsup_server.h +++ b/src/gsup_server.h @@ -50,6 +50,8 @@ struct msgb *osmo_gsup_msgb_alloc(const char *label); int osmo_gsup_conn_send(struct osmo_gsup_conn *conn, struct msgb *msg); +int osmo_gsup_conn_send_err_reply(struct osmo_gsup_conn *conn, const struct osmo_gsup_message *gsup_orig, + enum gsm48_gmm_cause cause); int osmo_gsup_conn_ccm_get(const struct osmo_gsup_conn *clnt, uint8_t **addr, uint8_t tag); diff --git a/src/hlr.c b/src/hlr.c index aef890e..0cc0448 100644 --- a/src/hlr.c +++ b/src/hlr.c @@ -456,23 +456,6 @@ return osmo_gsup_conn_send(conn, msg_out); } -static int gsup_send_err_reply(struct osmo_gsup_conn *conn, const char *imsi, - enum osmo_gsup_message_type type_in, uint8_t err_cause) -{ - int type_err = OSMO_GSUP_TO_MSGT_ERROR(type_in); - struct osmo_gsup_message gsup_reply = {0}; - struct msgb *msg_out; - - OSMO_STRLCPY_ARRAY(gsup_reply.imsi, imsi); - gsup_reply.message_type = type_err; - gsup_reply.cause = err_cause; - msg_out = osmo_gsup_msgb_alloc("GSUP ERR response"); - OSMO_ASSERT(msg_out); - osmo_gsup_encode(msg_out, &gsup_reply); - LOGP(DMAIN, LOGL_NOTICE, "Tx %s\n", osmo_gsup_message_type_name(type_err)); - return osmo_gsup_conn_send(conn, msg_out); -} - static int rx_check_imei_req(struct osmo_gsup_conn *conn, const struct osmo_gsup_message *gsup) { struct osmo_gsup_message gsup_reply = {0}; @@ -483,7 +466,7 @@ /* Require IMEI */ if (!gsup->imei_enc) { LOGP(DMAIN, LOGL_ERROR, "%s: missing IMEI\n", gsup->imsi); - gsup_send_err_reply(conn, gsup->imsi, gsup->message_type, GMM_CAUSE_INV_MAND_INFO); + osmo_gsup_conn_send_err_reply(conn, gsup, GMM_CAUSE_INV_MAND_INFO); return -1; } @@ -491,7 +474,7 @@ rc = gsm48_decode_bcd_number2(imei, sizeof(imei), gsup->imei_enc, gsup->imei_enc_len, 0); if (rc < 0) { LOGP(DMAIN, LOGL_ERROR, "%s: failed to decode IMEI (rc: %i)\n", gsup->imsi, rc); - gsup_send_err_reply(conn, gsup->imsi, gsup->message_type, GMM_CAUSE_INV_MAND_INFO); + osmo_gsup_conn_send_err_reply(conn, gsup, GMM_CAUSE_INV_MAND_INFO); return -1; } @@ -499,7 +482,7 @@ if (strlen(imei) != GSM23003_IMEI_NUM_DIGITS_NO_CHK) { LOGP(DMAIN, LOGL_ERROR, "%s: wrong encoded IMEI length (IMEI: '%s', %lu, %i)\n", gsup->imsi, imei, strlen(imei), GSM23003_IMEI_NUM_DIGITS_NO_CHK); - gsup_send_err_reply(conn, gsup->imsi, gsup->message_type, GMM_CAUSE_INV_MAND_INFO); + osmo_gsup_conn_send_err_reply(conn, gsup, GMM_CAUSE_INV_MAND_INFO); return -1; } @@ -509,7 +492,7 @@ if (g_hlr->store_imei) { LOGP(DAUC, LOGL_DEBUG, "IMSI='%s': storing IMEI = %s\n", gsup->imsi, imei); if (db_subscr_update_imei_by_imsi(g_hlr->dbc, gsup->imsi, imei) < 0) { - gsup_send_err_reply(conn, gsup->imsi, gsup->message_type, GMM_CAUSE_INV_MAND_INFO); + osmo_gsup_conn_send_err_reply(conn, gsup, GMM_CAUSE_INV_MAND_INFO); return -1; } } else { @@ -517,7 +500,7 @@ LOGP(DMAIN, LOGL_INFO, "IMSI='%s': has IMEI = %s (consider setting 'store-imei')\n", gsup->imsi, imei); struct hlr_subscriber subscr; if (db_subscr_get_by_imsi(g_hlr->dbc, gsup->imsi, &subscr) < 0) { - gsup_send_err_reply(conn, gsup->imsi, gsup->message_type, GMM_CAUSE_INV_MAND_INFO); + osmo_gsup_conn_send_err_reply(conn, gsup, GMM_CAUSE_INV_MAND_INFO); return -1; } } @@ -626,7 +609,7 @@ * digits is impossible. Even 5 digits is a highly theoretical case */ if (strlen(gsup.imsi) < 5) { /* TODO: move this check to libosmogsm/gsup.c? */ LOGP(DMAIN, LOGL_ERROR, "IMSI too short: %s\n", osmo_quote_str(gsup.imsi, -1)); - gsup_send_err_reply(conn, gsup.imsi, gsup.message_type, GMM_CAUSE_INV_MAND_INFO); + osmo_gsup_conn_send_err_reply(conn, &gsup, GMM_CAUSE_INV_MAND_INFO); msgb_free(msg); return -EINVAL; } -- To view, visit https://gerrit.osmocom.org/c/osmo-hlr/+/15916 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-hlr Gerrit-Branch: master Gerrit-Change-Id: I792fd9993ab2a323af58782a357d71205c43b72a Gerrit-Change-Number: 15916 Gerrit-PatchSet: 1 Gerrit-Owner: neels <nhofm...@sysmocom.de> Gerrit-MessageType: newchange