pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-mgw/+/39762?usp=email )
Change subject: mgw: iuup: Trigger Init on CN-side CRCX if RAN-side was already initialized ......................................................................
mgw: iuup: Trigger Init on CN-side CRCX if RAN-side was already initialized
Prior to this patch, osmo-mgw would wait until first IuUP Data frame would be received on RAN-side (from HNB) to trigger active initialization (Tx IuUP-Init) on CN-side conn towards CN. With this patch, this happens ASAP, whenever the CN-side conn is created by HNBGW when it receives the RAB-ASS-RESP from HNB.
Change-Id: Iab0af88852994e73bfe6c3b27fe196fd655cce03 --- M include/osmocom/mgcp/mgcp_iuup.h M src/libosmo-mgcp/mgcp_endp.c M src/libosmo-mgcp/mgcp_iuup.c 3 files changed, 44 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/62/39762/1
diff --git a/include/osmocom/mgcp/mgcp_iuup.h b/include/osmocom/mgcp/mgcp_iuup.h index 4d2011f..f0af776 100644 --- a/include/osmocom/mgcp/mgcp_iuup.h +++ b/include/osmocom/mgcp/mgcp_iuup.h @@ -31,3 +31,4 @@ int mgcp_conn_iuup_dispatch_rtp(struct msgb *msg); int mgcp_conn_iuup_send_rtp(struct mgcp_conn_rtp *conn_src_rtp, struct mgcp_conn_rtp *conn_dest_rtp, struct msgb *msg); int mgcp_conn_iuup_send_dummy(struct mgcp_conn_rtp *conn_rtp); +int mgcp_conn_iuup_event_rx_crcx_mdcx(struct mgcp_conn_rtp *conn_rtp); diff --git a/src/libosmo-mgcp/mgcp_endp.c b/src/libosmo-mgcp/mgcp_endp.c index 324f67d..28ccd2f 100644 --- a/src/libosmo-mgcp/mgcp_endp.c +++ b/src/libosmo-mgcp/mgcp_endp.c @@ -24,6 +24,7 @@ #include <osmocom/mgcp/mgcp.h> #include <osmocom/mgcp/mgcp_protocol.h> #include <osmocom/mgcp/mgcp_conn.h> +#include <osmocom/mgcp/mgcp_iuup.h> #include <osmocom/mgcp/mgcp_endp.h> #include <osmocom/mgcp/mgcp_trunk.h>
@@ -677,7 +678,7 @@ } break; case MGCP_RTP_IUUP: - break; + return mgcp_conn_iuup_event_rx_crcx_mdcx(conn_rtp); default: return -523; } diff --git a/src/libosmo-mgcp/mgcp_iuup.c b/src/libosmo-mgcp/mgcp_iuup.c index 468ea06..40ca100 100644 --- a/src/libosmo-mgcp/mgcp_iuup.c +++ b/src/libosmo-mgcp/mgcp_iuup.c @@ -753,3 +753,44 @@
return 0; } + +/* To be called every time an CRCX/MDCX is received. + * returns: 0 if conn can continue, MGCP negative code if an error ocurred during setup */ +int mgcp_conn_iuup_event_rx_crcx_mdcx(struct mgcp_conn_rtp *conn_rtp) +{ + struct mgcp_conn *peer_conn; + struct mgcp_conn_rtp *peer_conn_rtp; + OSMO_ASSERT(mgcp_conn_rtp_is_iuup(conn_rtp)); + + /* keep waiting to receive remote address through CRCX/MDCX */ + if (!mgcp_rtp_end_remote_addr_available(&conn_rtp->end)) + return 0; + + /* Conn already IuUP-configured/initialized, nothing to be done. */ + if (conn_rtp->iuup.configured) + return 0; + + /* Reached this point, conn_rtp is an IuUP conn which can be configured + * and was not yet configured. If its sister conn in the endpoint was + * already configured as IuUP "passive", then we know this one can be + * configured as IuUP "active" right now. In that case, do so. + * This usually happens on an HNBGW co-located MGW, where during + * RAB-ASS-REQ the RAN-side conn (sister conn here) was already + * configured and then upon rx of RAB-ASS-RESP it sets up (CRCX) the + * CN-side IuUP conn (rt_conn here). + */ + peer_conn = mgcp_find_dst_conn(conn_rtp->conn); + /* No peer conn yet, nothing to be done. */ + if (!peer_conn) + return 0; + peer_conn_rtp = mgcp_conn_get_conn_rtp(peer_conn); + + if (mgcp_conn_rtp_is_iuup(peer_conn_rtp) && + peer_conn_rtp->iuup.configured && + !conn_rtp->iuup.active_init) { + LOG_CONN_RTP(conn_rtp, LOGL_INFO, "Sister IuUP conn in endp configured as passive, init this one as active\n"); + OSMO_ASSERT(peer_conn_rtp->iuup.init_ind); + _conn_iuup_configure_as_active(conn_rtp, peer_conn_rtp->iuup.init_ind); + } + return 0; +}