From d04db9d90758d2abd572336942fd7e9246d41a22 Mon Sep 17 00:00:00 2001 From: Daniel Willmann Date: Wed, 16 Mar 2016 10:35:09 +0100 Subject: libiu: Replace RAB assignment response callback with a general one The new iu event callback will now be called for RAB assignment response, IU release and security mode complete --- openbsc/src/gprs/sgsn_libgtp.c | 29 +++++++++++++++++++++++++++-- openbsc/src/gprs/sgsn_main.c | 4 ++-- openbsc/src/libiu/iu.c | 17 +++++++---------- 3 files changed, 36 insertions(+), 14 deletions(-) (limited to 'openbsc/src') diff --git a/openbsc/src/gprs/sgsn_libgtp.c b/openbsc/src/gprs/sgsn_libgtp.c index e48c103f1..1077cce5d 100644 --- a/openbsc/src/gprs/sgsn_libgtp.c +++ b/openbsc/src/gprs/sgsn_libgtp.c @@ -393,14 +393,16 @@ reject: } /* Callback for RAB assignment response */ -int sgsn_ranap_rab_ass_resp(struct ue_conn_ctx *ctx, uint8_t rab_id, RANAP_RAB_SetupOrModifiedItemIEs_t *setup_ies) +int sgsn_ranap_rab_ass_resp(struct ue_conn_ctx *ctx, RANAP_RAB_SetupOrModifiedItemIEs_t *setup_ies) { - int rc = -1; + uint8_t rab_id; struct sgsn_mm_ctx *mm; struct sgsn_pdp_ctx *pdp = NULL; uint32_t gtp_tei; RANAP_RAB_SetupOrModifiedItem_t *item = &setup_ies->raB_SetupOrModifiedItem; + rab_id = item->rAB_ID.buf[0]; + mm = sgsn_mm_ctx_by_ue_ctx(ctx); /* XXX: Error handling */ @@ -427,6 +429,29 @@ int sgsn_ranap_rab_ass_resp(struct ue_conn_ctx *ctx, uint8_t rab_id, RANAP_RAB_S } +int sgsn_ranap_iu_event(struct ue_conn_ctx *ctx, int type, void *data) +{ + int rc = -1; + + switch (type) { + case IU_EVENT_RAB_ASSIGN: + rc = sgsn_ranap_rab_ass_resp(ctx, (RANAP_RAB_SetupOrModifiedItemIEs_t *)data); + break; + case IU_EVENT_IU_RELEASE: + /* Clean up ue_conn_ctx here */ + break; + case IU_EVENT_SECURITY_MODE_COMPLETE: + /* Continue authentication here */ + break; + default: + LOGP(DRANAP, LOGL_NOTICE, "Unknown event received: %i\n", type); + rc = -1; + break; + } + return rc; +} + + /* Confirmation of a PDP Context Delete */ static int delete_pdp_conf(struct pdp_t *pdp, void *cbp, int cause) { diff --git a/openbsc/src/gprs/sgsn_main.c b/openbsc/src/gprs/sgsn_main.c index ff9841205..01a11218e 100644 --- a/openbsc/src/gprs/sgsn_main.c +++ b/openbsc/src/gprs/sgsn_main.c @@ -305,7 +305,7 @@ static const struct log_info gprs_log_info = { int asn_debug; -int sgsn_ranap_rab_ass_resp(struct ue_conn_ctx *ctx, uint8_t rab_id, struct RANAP_RAB_SetupOrModifiedItemIEs_s *setup_ies); +int sgsn_ranap_iu_event(struct ue_conn_ctx *ctx, int type, void *data); int main(int argc, char **argv) { @@ -422,7 +422,7 @@ int main(int argc, char **argv) } asn_debug = 0; - iu_init(tall_bsc_ctx, "127.0.0.2", 14001, gsm0408_gprs_rcvmsg_iu, sgsn_ranap_rab_ass_resp); + iu_init(tall_bsc_ctx, "127.0.0.2", 14001, gsm0408_gprs_rcvmsg_iu, sgsn_ranap_iu_event); if (daemonize) { rc = osmo_daemonize(); diff --git a/openbsc/src/libiu/iu.c b/openbsc/src/libiu/iu.c index 6f0078f31..2381c3c1c 100644 --- a/openbsc/src/libiu/iu.c +++ b/openbsc/src/libiu/iu.c @@ -35,7 +35,7 @@ void *talloc_asn1_ctx; iu_recv_cb_t global_iu_recv_cb = NULL; -iu_rab_ass_resp_cb_t global_iu_rab_ass_resp_cb = NULL; +iu_event_cb_t global_iu_event_cb = NULL; static LLIST_HEAD(ue_conn_ctx_list); @@ -252,23 +252,20 @@ static int ranap_handle_co_iu_rel_req(struct ue_conn_ctx *ctx, RANAP_Iu_ReleaseR static int ranap_handle_co_rab_ass_resp(struct ue_conn_ctx *ctx, RANAP_RAB_AssignmentResponseIEs_t *ies) { int rc = -1; - uint8_t rab_id; LOGP(DRANAP, LOGL_INFO, "RAB Asignment Response:"); if (ies->presenceMask & RAB_ASSIGNMENTRESPONSEIES_RANAP_RAB_SETUPORMODIFIEDLIST_PRESENT) { /* TODO: Iterate over list of SetupOrModifiedList IEs and handle each one */ RANAP_IE_t *ranap_ie = ies->raB_SetupOrModifiedList.raB_SetupOrModifiedList_ies.list.array[0]; RANAP_RAB_SetupOrModifiedItemIEs_t setup_ies; - RANAP_RAB_SetupOrModifiedItem_t *item = &setup_ies.raB_SetupOrModifiedItem; + rc = ranap_decode_rab_setupormodifieditemies_fromlist(&setup_ies, &ranap_ie->value); if (rc) { LOGP(DRANAP, LOGL_ERROR, "Error in ranap_decode_rab_setupormodifieditemies()\n"); return rc; } - rab_id = item->rAB_ID.buf[0]; - - rc = global_iu_rab_ass_resp_cb(ctx, rab_id, &setup_ies); + rc = global_iu_event_cb(ctx, IU_EVENT_RAB_ASSIGN, &setup_ies); ranap_free_rab_setupormodifieditemies(&setup_ies); } @@ -311,12 +308,12 @@ static void cn_ranap_handle_co(void *ctx, ranap_message *message) case RANAP_ProcedureCode_id_SecurityModeControl: /* Security Mode Complete */ LOGP(DRANAP, LOGL_NOTICE, "FIXME: Handle security mode complete\n"); - rc = -1; + rc = global_iu_event_cb(ctx, IU_EVENT_SECURITY_MODE_COMPLETE, NULL); break; case RANAP_ProcedureCode_id_Iu_Release: /* Iu Release Complete */ LOGP(DRANAP, LOGL_NOTICE, "FIXME: Handle Iu release complete\n"); - rc = -1; + rc = global_iu_event_cb(ctx, IU_EVENT_IU_RELEASE, NULL); break; default: rc = -1; @@ -476,13 +473,13 @@ static int sccp_sap_up(struct osmo_prim_hdr *oph, void *link) } int iu_init(void *ctx, const char *listen_addr, uint16_t listen_port, - iu_recv_cb_t iu_recv_cb, iu_rab_ass_resp_cb_t iu_rab_ass_resp_cb) + iu_recv_cb_t iu_recv_cb, iu_event_cb_t iu_event_cb) { struct osmo_sua_user *user; talloc_asn1_ctx = talloc_named_const(ctx, 1, "asn1"); global_iu_recv_cb = iu_recv_cb; - global_iu_rab_ass_resp_cb = iu_rab_ass_resp_cb; + global_iu_event_cb = iu_event_cb; osmo_sua_set_log_area(DSUA); user = osmo_sua_user_create(ctx, sccp_sap_up, ctx); return osmo_sua_server_listen(user, listen_addr, listen_port); -- cgit v1.2.3