mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
synced 2025-11-02 21:13:44 +00:00
do not FAIL on CRCX in sendrecv mode
Currently, a CRCX in sendrecv mode results in: DLMGCP ERROR endpoint:rtpbridge/2@mgw CI:7F4C8EDD CRCX: selected connection mode type requires an opposite end! (mgcp_protocol.c:1090) But it is not actually practical, nor logical to require another conn for the 'sendrecv' ConnectionMode. Impractical: If I want to create two conns on an endpoint that both are in 'sendrecv' mode, I have to send two CRCX, one for each conn. At the time of the first CRCX, there cannot be any other conn, so I am currently forced to send a different ConnectionMode in the CRCX, followed by another MDCX later, just to change the first conn to sendrecv. Illogical: In a situation where two conns are currently in sendrecv mode, if I now DLCX one of them, I can legally reach a state with a single conn in sendrecv mode, just as currently forbidden for CRCX. In general, MGCP is not forcing any particular number of connections. Simply start forwarding RTP as soon as there is a remote conn, and not require another explicit MDCX. Related: SYS#6974 SYS#6907 Related: osmo-ttcn3-hacks I00fd854f058f7f53e2f579e8481ca2b9253f08e3 Change-Id: Ic089485543c5c97a35c7ae24fe0f622bf57d1976
This commit is contained in:
@@ -1083,17 +1083,6 @@ mgcp_header_done:
|
||||
|
||||
mgcp_rtp_end_config(endp, 0, &conn->end);
|
||||
|
||||
/* check connection mode setting */
|
||||
if (conn->conn->mode != MGCP_CONN_LOOPBACK
|
||||
&& conn->conn->mode != MGCP_CONN_RECV_ONLY
|
||||
&& osmo_sockaddr_port(&conn->end.addr.u.sa) == 0) {
|
||||
LOGPCONN(_conn, DLMGCP, LOGL_ERROR,
|
||||
"CRCX: selected connection mode type requires an opposite end!\n");
|
||||
error_code = 527;
|
||||
rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_NO_REMOTE_CONN_DESC));
|
||||
goto error2;
|
||||
}
|
||||
|
||||
/* Find a local address for conn based on policy and initial SDP remote
|
||||
information, then find a free port for it */
|
||||
if (mgcp_get_local_addr(conn->end.local_addr, conn) < 0) {
|
||||
@@ -1295,17 +1284,6 @@ mgcp_header_done:
|
||||
if (conn->type == MGCP_RTP_DEFAULT && strcmp(conn->end.codec->subtype_name, "VND.3GPP.IUFP") == 0)
|
||||
rc = mgcp_conn_iuup_init(conn);
|
||||
|
||||
/* check connection mode setting */
|
||||
if (conn->conn->mode != MGCP_CONN_LOOPBACK
|
||||
&& conn->conn->mode != MGCP_CONN_RECV_ONLY
|
||||
&& !mgcp_rtp_end_remote_addr_available(&conn->end)) {
|
||||
LOGPCONN(conn->conn, DLMGCP, LOGL_ERROR,
|
||||
"MDCX: selected connection mode type requires an opposite end!\n");
|
||||
error_code = 527;
|
||||
rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_MDCX_FAIL_NO_REMOTE_CONN_DESC));
|
||||
goto error3;
|
||||
}
|
||||
|
||||
if (mgcp_conn_rtp_is_osmux(conn)) {
|
||||
OSMO_ASSERT(conn->osmux.local_cid_allocated);
|
||||
if (remote_osmux_cid < -1) {
|
||||
|
||||
@@ -145,7 +145,16 @@ static void test_strline(void)
|
||||
"a=ptime:20\r\n"
|
||||
|
||||
#define MDCX4_ADDR0000_RET \
|
||||
"527 18983216 FAIL\r\n"
|
||||
"200 18983216 OK\r\n" \
|
||||
"\r\n" \
|
||||
"v=0\r\n" \
|
||||
"o=- %s 23 IN IP4 0.0.0.0\r\n" \
|
||||
"s=-\r\n" \
|
||||
"c=IN IP4 0.0.0.0\r\n" \
|
||||
"t=0 0\r\n" \
|
||||
"m=audio 16002 RTP/AVP 99\r\n" \
|
||||
"a=rtpmap:99 AMR/8000\r\n" \
|
||||
"a=ptime:20\r\n"
|
||||
|
||||
#define MDCX4 \
|
||||
"MDCX 18983217 1@mgw MGCP 1.0\r\n" \
|
||||
|
||||
@@ -116,9 +116,9 @@ a=ptime:20
|
||||
|
||||
---------8<---------
|
||||
checking response:
|
||||
using message as statically defined for comparison
|
||||
using message with patched conn_id for comparison
|
||||
Response matches our expectations.
|
||||
(response does not contain a connection id)
|
||||
(response contains a connection id)
|
||||
|
||||
================================================
|
||||
Testing MDCX4
|
||||
|
||||
Reference in New Issue
Block a user