aboutsummaryrefslogtreecommitdiffstats
path: root/src/libmsc/iucs_ranap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libmsc/iucs_ranap.c')
-rw-r--r--src/libmsc/iucs_ranap.c42
1 files changed, 38 insertions, 4 deletions
diff --git a/src/libmsc/iucs_ranap.c b/src/libmsc/iucs_ranap.c
index abf18123b..57cd50eed 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;
}