mgcp: use osmo-mgw to switch rtp streams
in the current implementation we still use osmo-bsc_mgcp, which
has many problems and is also obsoleted by osmo-mgw.
integrate osmo-mgw and re-implement the current switching using
an osmo fsm.
Depends: osmo-mgw Iab6a6038e7610c62f34e642cd49c93d11151252c
Depends: osmo-iuh I3c1a0455c5f25cae41ee19229d6daf299e023062
Closes: OS#2605
Change-Id: Ieea9630358b3963261fa1993cf1f3b563ff23538
diff --git a/src/libmsc/iucs_ranap.c b/src/libmsc/iucs_ranap.c
index abf1812..57cd50e 100644
--- a/src/libmsc/iucs_ranap.c
+++ b/src/libmsc/iucs_ranap.c
@@ -28,6 +28,8 @@
#include <osmocom/ranap/ranap_ies_defs.h>
#include <osmocom/ranap/iu_client.h>
+#include <osmocom/ranap/RANAP_IuTransportAssociation.h>
+#include <osmocom/ranap/iu_helpers.h>
#include <osmocom/msc/debug.h>
#include <osmocom/msc/gsm_data.h>
@@ -36,22 +38,54 @@
#include <osmocom/msc/vlr.h>
#include <osmocom/msc/iucs_ranap.h>
#include <osmocom/msc/osmo_msc.h>
+#include <osmocom/msc/msc_mgcp.h>
+
+#include <asn1c/asn1helpers.h>
/* To continue authorization after a Security Mode Complete */
int gsm0408_authorize(struct gsm_subscriber_connection *conn);
-static int iucs_rx_rab_assign(struct gsm_subscriber_connection *conn,
- RANAP_RAB_SetupOrModifiedItemIEs_t *setup_ies)
+static int iucs_rx_rab_assign(struct gsm_subscriber_connection *conn, RANAP_RAB_SetupOrModifiedItemIEs_t * setup_ies)
{
uint8_t rab_id;
RANAP_RAB_SetupOrModifiedItem_t *item = &setup_ies->raB_SetupOrModifiedItem;
+ RANAP_TransportLayerAddress_t *transp_layer_addr;
+ RANAP_IuTransportAssociation_t *transp_assoc;
+ uint16_t port = 0;
+ int rc;
+ char addr[INET_ADDRSTRLEN];
rab_id = item->rAB_ID.buf[0];
LOGP(DIUCS, LOGL_NOTICE,
- "Received RAB assignment event for %s rab_id=%hhd\n",
- vlr_subscr_name(conn->vsub), rab_id);
+ "Received RAB assignment event for %s rab_id=%hhd\n", vlr_subscr_name(conn->vsub), rab_id);
+ if (item->iuTransportAssociation && item->transportLayerAddress) {
+ transp_layer_addr = item->transportLayerAddress;
+ transp_assoc = item->iuTransportAssociation;
+
+ rc = ranap_transp_assoc_decode(&port, transp_assoc);
+ if (rc != 0) {
+ LOGP(DIUCS, LOGL_ERROR,
+ "Unable to decode RTP port in RAB assignment (%s rab_id=%hhd)\n",
+ vlr_subscr_name(conn->vsub), rab_id);
+ return 0;
+ }
+
+ rc = ranap_transp_layer_addr_decode(addr, sizeof(addr), transp_layer_addr);
+ if (rc != 0) {
+ LOGP(DIUCS, LOGL_ERROR,
+ "Unable to decode IP-Address in RAB assignment (%s rab_id=%hhd)\n",
+ vlr_subscr_name(conn->vsub), rab_id);
+ return 0;
+ }
+
+ return msc_mgcp_ass_complete(conn, port, addr);
+ }
+
+ LOGP(DIUCS, LOGL_ERROR,
+ "RAB assignment lacks RTP connection information. (%s rab_id=%hhd)\n",
+ vlr_subscr_name(conn->vsub), rab_id);
return 0;
}