From ea0c3203db95518c75258bf5c6bb350a3ffb56fc Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Mon, 18 Dec 2017 18:27:43 +0100 Subject: osmo-bsc: Move user plane/voice related bits into sub-structure This clarifies which members of the struct are for what. Change-Id: I618822e6f2d48adce25f9df5c25acbce7c858412 --- include/osmocom/bsc/osmo_bsc.h | 34 +++++++++++++++++----------------- src/osmo-bsc/osmo_bsc_api.c | 2 +- src/osmo-bsc/osmo_bsc_audio.c | 14 +++++++------- src/osmo-bsc/osmo_bsc_bssap.c | 25 ++++++++++++------------- src/osmo-bsc/osmo_bsc_ctrl.c | 2 +- src/osmo-bsc/osmo_bsc_mgcp.c | 10 +++++----- src/osmo-bsc/osmo_bsc_sigtran.c | 4 ++-- 7 files changed, 45 insertions(+), 46 deletions(-) diff --git a/include/osmocom/bsc/osmo_bsc.h b/include/osmocom/bsc/osmo_bsc.h index 131007bb6..485c83648 100644 --- a/include/osmocom/bsc/osmo_bsc.h +++ b/include/osmocom/bsc/osmo_bsc.h @@ -26,23 +26,23 @@ struct osmo_bsc_sccp_con { int ciphering_handled; /* for audio handling */ - uint16_t cic; - uint32_t rtp_ip; - int rtp_port; - - /* RTP address of the remote end (assigned by MSC through assignment - * request) */ - struct sockaddr_storage aoip_rtp_addr_remote; - - /* Local RTP address (reported back to the MSC by us with the - * assignment complete message) */ - struct sockaddr_storage aoip_rtp_addr_local; - - /* storage to keep states of the MGCP connection handler, the - * handler is created when an assignment request is received - * and is terminated when the assignment complete message is - * sent */ - struct mgcp_ctx *mgcp_ctx; + struct { + uint16_t cic; + uint32_t rtp_ip; + int rtp_port; + /* RTP address of the remote end (assigned by MSC through assignment request) */ + struct sockaddr_storage aoip_rtp_addr_remote; + + /* Local RTP address (reported back to the MSC by us with the + * assignment complete message) */ + struct sockaddr_storage aoip_rtp_addr_local; + + /* storage to keep states of the MGCP connection handler, the + * handler is created when an assignment request is received + * and is terminated when the assignment complete message is + * sent */ + struct mgcp_ctx *mgcp_ctx; + } user_plane; /* for advanced ping/pong */ int send_ping; diff --git a/src/osmo-bsc/osmo_bsc_api.c b/src/osmo-bsc/osmo_bsc_api.c index 152b81837..a2a863068 100644 --- a/src/osmo-bsc/osmo_bsc_api.c +++ b/src/osmo-bsc/osmo_bsc_api.c @@ -435,7 +435,7 @@ static void bsc_assign_compl(struct gsm_subscriber_connection *conn, uint8_t rr_ struct msgb *resp; return_when_not_connected(conn); - if (is_ipaccess_bts(conn->bts) && conn->sccp_con->rtp_ip) { + if (is_ipaccess_bts(conn->bts) && conn->sccp_con->user_plane.rtp_ip) { /* NOTE: In a network that makes use of an IPA base station * and AoIP, we have to wait until the BTS reports its RTP * IP/Port combination back to BSC via RSL. Unfortunately, the diff --git a/src/osmo-bsc/osmo_bsc_audio.c b/src/osmo-bsc/osmo_bsc_audio.c index 0c11b85e3..82367f074 100644 --- a/src/osmo-bsc/osmo_bsc_audio.c +++ b/src/osmo-bsc/osmo_bsc_audio.c @@ -57,17 +57,17 @@ static int handle_abisip_signal(unsigned int subsys, unsigned int signal, /* we can ask it to connect now */ LOGP(DMSC, LOGL_DEBUG, "Connecting BTS to port: %d conn: %d\n", - con->sccp_con->rtp_port, lchan->abis_ip.conn_id); + con->sccp_con->user_plane.rtp_port, lchan->abis_ip.conn_id); /* If AoIP is in use, the rtp_ip, which has been communicated * via the A interface as connect_ip */ - if(con->sccp_con->rtp_ip) - rtp_ip = con->sccp_con->rtp_ip; + if(con->sccp_con->user_plane.rtp_ip) + rtp_ip = con->sccp_con->user_plane.rtp_ip; else rtp_ip = ntohl(INADDR_ANY); rc = rsl_ipacc_mdcx(lchan, rtp_ip, - con->sccp_con->rtp_port, + con->sccp_con->user_plane.rtp_port, lchan->abis_ip.rtp_payload2); if (rc < 0) { LOGP(DMSC, LOGL_ERROR, "Failed to send MDCX: %d\n", rc); @@ -84,13 +84,13 @@ static int handle_abisip_signal(unsigned int subsys, unsigned int signal, * inform the logic that controls the MGW about the new * connection info */ LOGP(DMSC, LOGL_INFO,"RTP connection handover initiated...\n"); - mgcp_handover(con->sccp_con->mgcp_ctx, con->ho_lchan); - } else if (is_ipaccess_bts(con->bts) && con->sccp_con->rtp_ip) { + mgcp_handover(con->sccp_con->user_plane.mgcp_ctx, con->ho_lchan); + } else if (is_ipaccess_bts(con->bts) && con->sccp_con->user_plane.rtp_ip) { /* NOTE: This is only relevant on AoIP networks with * IPA based base stations. See also osmo_bsc_api.c, * function bsc_assign_compl() */ LOGP(DMSC, LOGL_INFO, "Tx MSC ASSIGN COMPL (POSTPONED)\n"); - mgcp_ass_complete(con->sccp_con->mgcp_ctx, lchan); + mgcp_ass_complete(con->sccp_con->user_plane.mgcp_ctx, lchan); } break; } diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c index aea3994ee..6f2d0f4a0 100644 --- a/src/osmo-bsc/osmo_bsc_bssap.c +++ b/src/osmo-bsc/osmo_bsc_bssap.c @@ -361,13 +361,13 @@ static int bssmap_handle_clear_command(struct osmo_bsc_sccp_con *conn, return -1; } - if (conn->mgcp_ctx) { + if (conn->user_plane.mgcp_ctx) { /* NOTE: This is the AoIP case, osmo-bsc has to negotiate with * the MGCP-GW. For this an mgcp_ctx should be created that * contains the FSM and some system data. When the connection * is removed from the MGCP-GW, then osmo_bsc_sigtran_send() * calls osmo_bsc_sigtran_send(). */ - mgcp_clear_complete(conn->mgcp_ctx, resp); + mgcp_clear_complete(conn->user_plane.mgcp_ctx, resp); } else { /* NOTE: This is the SCCP-Lite case, since we do not handle * the MGCP-GW switching ourselves, we may skip everything @@ -535,11 +535,9 @@ static int bssmap_handle_assignm_req(struct osmo_bsc_sccp_con *conn, /* Detect if a CIC code is present, if so, we use the classic ip.access * method to calculate the RTP port */ if (TLVP_PRESENT(&tp, GSM0808_IE_CIRCUIT_IDENTITY_CODE)) { - conn->cic = - osmo_load16be(TLVP_VAL - (&tp, GSM0808_IE_CIRCUIT_IDENTITY_CODE)); - timeslot = conn->cic & 0x1f; - multiplex = (conn->cic & ~0x1f) >> 5; + conn->user_plane.cic = osmo_load16be(TLVP_VAL(&tp, GSM0808_IE_CIRCUIT_IDENTITY_CODE)); + timeslot = conn->user_plane.cic & 0x1f; + multiplex = (conn->user_plane.cic & ~0x1f) >> 5; } else if (TLVP_PRESENT(&tp, GSM0808_IE_AOIP_TRASP_ADDR)) { /* Decode AoIP transport address element */ data = TLVP_VAL(&tp, GSM0808_IE_AOIP_TRASP_ADDR); @@ -621,15 +619,16 @@ static int bssmap_handle_assignm_req(struct osmo_bsc_sccp_con *conn, * reasons, functional wise it would not matter when exactly * the network side RTP connection is made, as long it is made * before we return with the assignment complete message. */ - memcpy(&conn->aoip_rtp_addr_remote, &rtp_addr, sizeof(rtp_addr)); + memcpy(&conn->user_plane.aoip_rtp_addr_remote, &rtp_addr, sizeof(rtp_addr)); /* Create an assignment request using the MGCP fsm. This FSM * is directly started when its created (now) and will also * take care about the further processing (creating RTP * endpoints, calling gsm0808_assign_req(), responding to * the assignment request etc... */ - conn->mgcp_ctx = mgcp_assignm_req(msc->network, msc->network->mgw.client, conn, chan_mode, full_rate); - if (!conn->mgcp_ctx) { + conn->user_plane.mgcp_ctx = mgcp_assignm_req(msc->network, msc->network->mgw.client, + conn, chan_mode, full_rate); + if (!conn->user_plane.mgcp_ctx) { LOGP(DMSC, LOGL_ERROR, "MGCP GW failure, rejecting assignment... (id=%i)\n", conn->conn_id); goto reject; } @@ -641,8 +640,8 @@ static int bssmap_handle_assignm_req(struct osmo_bsc_sccp_con *conn, * (the MSC does that for us). We set conn->rtp_ip to 0 and check * on this later. By this we know that we have to behave accordingly * to sccp-lite. */ - conn->rtp_port = mgcp_timeslot_to_port(multiplex, timeslot, msc->rtp_base); - conn->rtp_ip = 0; + conn->user_plane.rtp_port = mgcp_timeslot_to_port(multiplex, timeslot, msc->rtp_base); + conn->user_plane.rtp_ip = 0; return gsm0808_assign_req(conn->conn, chan_mode, full_rate); } @@ -849,7 +848,7 @@ int bssmap_send_aoip_ass_compl(struct gsm_lchan *lchan) lchan->abis_ip.ass_compl.chosen_channel, lchan->abis_ip.ass_compl.encr_alg_id, lchan->abis_ip.ass_compl.speech_mode, - &conn->sccp_con->aoip_rtp_addr_local, + &conn->sccp_con->user_plane.aoip_rtp_addr_local, &sc, NULL); diff --git a/src/osmo-bsc/osmo_bsc_ctrl.c b/src/osmo-bsc/osmo_bsc_ctrl.c index 633089247..8c9dfe7a9 100644 --- a/src/osmo-bsc/osmo_bsc_ctrl.c +++ b/src/osmo-bsc/osmo_bsc_ctrl.c @@ -552,7 +552,7 @@ static int set_net_ussd_notify(struct ctrl_cmd *cmd, void *data) if (!conn->sccp_con) continue; - if (conn->sccp_con->cic != cic) + if (conn->sccp_con->user_plane.cic != cic) continue; /* diff --git a/src/osmo-bsc/osmo_bsc_mgcp.c b/src/osmo-bsc/osmo_bsc_mgcp.c index f5efa95be..ebd13d6dc 100644 --- a/src/osmo-bsc/osmo_bsc_mgcp.c +++ b/src/osmo-bsc/osmo_bsc_mgcp.c @@ -231,8 +231,8 @@ static void crcx_for_bts_resp_cb(struct mgcp_response *r, void *priv) /* Set the connection details in the conn struct. The code that * controls the BTS via RSL will take these values and signal them * to the BTS via RSL/IPACC */ - conn->rtp_port = r->audio_port; - conn->rtp_ip = osmo_ntohl(inet_addr(r->audio_ip)); + conn->user_plane.rtp_port = r->audio_port; + conn->user_plane.rtp_ip = osmo_ntohl(inet_addr(r->audio_ip)); /* Notify the FSM that we got the response. */ osmo_fsm_inst_dispatch(mgcp_ctx->fsm, EV_CRCX_BTS_RESP, mgcp_ctx); @@ -428,7 +428,7 @@ static void fsm_crcx_net_cb(struct osmo_fsm_inst *fi, uint32_t event, void *data * identifier. However, the MGW does not support IPv6 yet. This is * why we stop here in case some MSC tries to signal IPv6 AoIP * transport identifiers */ - if (conn->aoip_rtp_addr_remote.ss_family != AF_INET) { + if (conn->user_plane.aoip_rtp_addr_remote.ss_family != AF_INET) { LOGPFSML(fi, LOGL_ERROR, "CRCX/NET: endpoint:%x MSC uses unsupported address format in AoIP transport identifier -- aborting...\n", rtp_endpoint); @@ -436,7 +436,7 @@ static void fsm_crcx_net_cb(struct osmo_fsm_inst *fi, uint32_t event, void *data return; } - sin = (struct sockaddr_in *)&conn->aoip_rtp_addr_remote; + sin = (struct sockaddr_in *)&conn->user_plane.aoip_rtp_addr_remote; addr = inet_ntoa(sin->sin_addr); port = osmo_ntohs(sin->sin_port); LOGPFSML(fi, LOGL_DEBUG, "CRCX/NET: MSC expects RTP input on address %s:%u\n", addr, port); @@ -512,7 +512,7 @@ static void crcx_for_net_resp_cb(struct mgcp_response *r, void *priv) r->audio_ip, r->audio_port); /* Store address */ - sin = (struct sockaddr_in *)&conn->aoip_rtp_addr_local; + sin = (struct sockaddr_in *)&conn->user_plane.aoip_rtp_addr_local; sin->sin_family = AF_INET; sin->sin_addr.s_addr = inet_addr(r->audio_ip); sin->sin_port = osmo_ntohs(r->audio_port); diff --git a/src/osmo-bsc/osmo_bsc_sigtran.c b/src/osmo-bsc/osmo_bsc_sigtran.c index 7669b67b7..67f870378 100644 --- a/src/osmo-bsc/osmo_bsc_sigtran.c +++ b/src/osmo-bsc/osmo_bsc_sigtran.c @@ -385,8 +385,8 @@ int osmo_bsc_sigtran_del_conn(struct osmo_bsc_sccp_con *conn) } /* Remove mgcp context if existant */ - if (conn->mgcp_ctx) - mgcp_free_ctx(conn->mgcp_ctx); + if (conn->user_plane.mgcp_ctx) + mgcp_free_ctx(conn->user_plane.mgcp_ctx); llist_del(&conn->entry); talloc_free(conn); -- cgit v1.2.3