diff options
author | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2016-09-07 17:52:32 +0200 |
---|---|---|
committer | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2017-03-09 17:12:23 +0100 |
commit | d7befaaf8b44ed1d71b08ca721a074ada4bdca84 (patch) | |
tree | b3c5854d8e44f81e3b75d004498b2e3fa9c72486 | |
parent | 93e5a252c026a047b78ee128afd2c42a589f4853 (diff) |
IuCS: send RANAP CommonID
Add libiu function to send a CommonID message down a UE connection,
iu_tx_common_id(); add also a corresponding stub to libiudummy for linking with
tests.
Add libmsc function msc_tx_common_id() to call the above. Add this mostly to
clearly indicate in msc_ifaces.h that libmsc is calling out of the MSC; also
to do conn->via_iface checking.
Call msc_tx_common_id() after ciphering is established, in
_gsm48_rx_mm_serv_req_sec_cb()'s GSM_SECURITY_SUCCEEDED case.
Change-Id: I576ddd5bbabfc989149debd2f8a9743db6d26043
-rw-r--r-- | openbsc/include/openbsc/iu.h | 1 | ||||
-rw-r--r-- | openbsc/include/openbsc/msc_ifaces.h | 2 | ||||
-rw-r--r-- | openbsc/include/openbsc/vlr.h | 3 | ||||
-rw-r--r-- | openbsc/src/libiu/iu.c | 19 | ||||
-rw-r--r-- | openbsc/src/libmsc/msc_ifaces.c | 19 | ||||
-rw-r--r-- | openbsc/tests/libiudummy/iudummy.c | 6 |
6 files changed, 50 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/iu.h b/openbsc/include/openbsc/iu.h index f973ac1ba..c45fec576 100644 --- a/openbsc/include/openbsc/iu.h +++ b/openbsc/include/openbsc/iu.h @@ -58,5 +58,6 @@ int iu_rab_act(struct ue_conn_ctx *ue_ctx, struct msgb *msg); int iu_rab_deact(struct ue_conn_ctx *ue_ctx, uint8_t rab_id); int iu_tx_sec_mode_cmd(struct ue_conn_ctx *uectx, struct gsm_auth_tuple *tp, int send_ck, int new_key); +int iu_tx_common_id(struct ue_conn_ctx *ue_ctx, const char *imsi); void iu_vty_init(int *asn_debug_p); diff --git a/openbsc/include/openbsc/msc_ifaces.h b/openbsc/include/openbsc/msc_ifaces.h index 83aad92a4..0f2142a20 100644 --- a/openbsc/include/openbsc/msc_ifaces.h +++ b/openbsc/include/openbsc/msc_ifaces.h @@ -45,3 +45,5 @@ int msc_gsm48_tx_mm_serv_rej(struct gsm_subscriber_connection *conn, /* TODO: specific to A interface, move this away */ int msc_gsm0808_tx_cipher_mode(struct gsm_subscriber_connection *conn, int cipher, const uint8_t *key, int len, int include_imeisv); + +int msc_tx_common_id(struct gsm_subscriber_connection *conn); diff --git a/openbsc/include/openbsc/vlr.h b/openbsc/include/openbsc/vlr.h index a72970848..c137e5007 100644 --- a/openbsc/include/openbsc/vlr.h +++ b/openbsc/include/openbsc/vlr.h @@ -186,6 +186,9 @@ struct vlr_ops { int (*tx_cm_serv_acc)(void *msc_conn_ref); int (*tx_cm_serv_rej)(void *msc_conn_ref, enum vlr_proc_arq_result result); + /* FIXME: add tx_common_id() for when auth is complete on UTRAN, see + * msc_tx_common_id(conn) */ + int (*set_ciph_mode)(void *msc_conn_ref, enum vlr_ciph ciph_mode, bool retrieve_imeisv); diff --git a/openbsc/src/libiu/iu.c b/openbsc/src/libiu/iu.c index 8ba6fa49d..696527dca 100644 --- a/openbsc/src/libiu/iu.c +++ b/openbsc/src/libiu/iu.c @@ -256,6 +256,25 @@ int iu_tx_sec_mode_cmd(struct ue_conn_ctx *uectx, struct gsm_auth_tuple *tp, return 0; } +int iu_tx_common_id(struct ue_conn_ctx *uectx, const char *imsi) +{ + struct msgb *msg; + struct osmo_scu_prim *prim; + + LOGP(DRANAP, LOGL_INFO, "Transmitting RANAP CommonID (SUA link %p conn_id %u)\n", + uectx->link, uectx->conn_id); + + msg = ranap_new_msg_common_id(imsi); + msg->l2h = msg->data; + prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim)); + prim->u.data.conn_id = uectx->conn_id; + osmo_prim_init(&prim->oph, SCCP_SAP_USER, + OSMO_SCU_PRIM_N_DATA, + PRIM_OP_REQUEST, msg); + osmo_sua_user_link_down(uectx->link, &prim->oph); + return 0; +} + static int iu_grnc_id_parse(struct iu_grnc_id *dst, struct RANAP_GlobalRNC_ID *src) { diff --git a/openbsc/src/libmsc/msc_ifaces.c b/openbsc/src/libmsc/msc_ifaces.c index 500c99c2e..85e293107 100644 --- a/openbsc/src/libmsc/msc_ifaces.c +++ b/openbsc/src/libmsc/msc_ifaces.c @@ -23,6 +23,10 @@ #include <openbsc/debug.h> #include <openbsc/gsm_data.h> #include <openbsc/msc_ifaces.h> +#include <openbsc/iu.h> +#include <openbsc/gsm_subscriber.h> + +#include "../../bscconfig.h" static int msc_tx(struct gsm_subscriber_connection *conn, struct msgb *msg) { @@ -81,3 +85,18 @@ int msc_gsm48_tx_mm_serv_rej(struct gsm_subscriber_connection *conn, return msc_tx_dtap(conn, msg); } + +int msc_tx_common_id(struct gsm_subscriber_connection *conn) +{ + /* Common ID is only sent over IuCS */ + if (conn->via_ran != RAN_UTRAN_IU) + return 0; + +#ifdef BUILD_IU + return iu_tx_common_id(conn->iu.ue_ctx, conn->subscr->imsi); +#else + LOGP(DMM, LOGL_ERROR, + "Cannot send CommonID: RAN_UTRAN_IU but IuCS support not built\n"); + return -ENOTSUP; +#endif +} diff --git a/openbsc/tests/libiudummy/iudummy.c b/openbsc/tests/libiudummy/iudummy.c index 7052de82c..32ffaa172 100644 --- a/openbsc/tests/libiudummy/iudummy.c +++ b/openbsc/tests/libiudummy/iudummy.c @@ -33,3 +33,9 @@ int iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, uint8_t ra LOGP(DLGLOBAL, LOGL_INFO, "iu_page_ps() dummy called, NOT paging\n"); return 0; } + +int iu_tx_common_id(struct ue_conn_ctx *uectx, const char *imsi) +{ + LOGP(DLGLOBAL, LOGL_INFO, "iu_tx_common_id() dummy called, NOT sending CommonID\n"); + return 0; +} |