<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-mgw/+/24862">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  neels: Looks good to me, but someone else must approve
  dexter: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mgw: rx CRCX: Avoid sending dummy rtp if remote address not provided<br><br>The following sequence of events was seen frequently in a osmo-mgw<br>instance running on the field with heavy traffic:<br>"""<br>endpoint:rtpbridge/1@mgw CRCX: creating new connection ...<br>mgcp_network.c:236 endpoint:rtpbridge/1@mgw CI:1C8CCFA9 Failed to send dummy RTP packet.<br>"""<br><br>Allegedly, that happens because at CRCX time the remote address may<br>still not be known, hence we end up trying to send a dummy rtp packet<br>to, for instance, host 0.0.0.0 port 0, which will of course fail.<br>Let's avoid sending it if the address is not yet known.<br><br>Similary, same issue could be seen during MDCX, since at MDCX we don't<br>necessarily need to have a valid addr+port (there could be several MDCX<br>and only last one set it).<br><br>Finally, the keepalive timer also needs the check, since it iterates<br>over all connections, and it could be that some is still not fully<br>configured.<br><br>Related: SYS#5498<br>Change-Id: I8ceafda691146823b12232b4a804b4ce74acbdc8<br>---<br>M include/osmocom/mgcp/mgcp_network.h<br>M src/libosmo-mgcp/mgcp_network.c<br>M src/libosmo-mgcp/mgcp_protocol.c<br>3 files changed, 16 insertions(+), 5 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/mgcp/mgcp_network.h b/include/osmocom/mgcp/mgcp_network.h</span><br><span>index 1ed00e4..75b342d 100644</span><br><span>--- a/include/osmocom/mgcp/mgcp_network.h</span><br><span>+++ b/include/osmocom/mgcp/mgcp_network.h</span><br><span>@@ -132,6 +132,8 @@</span><br><span>       char local_addr[INET6_ADDRSTRLEN];</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+bool mgcp_rtp_end_remote_addr_available(const struct mgcp_rtp_end *rtp_end);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct mgcp_rtp_tap {</span><br><span>        /* is this tap active (1) or not (0) */</span><br><span>      int enabled;</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_network.c b/src/libosmo-mgcp/mgcp_network.c</span><br><span>index 5b3ea51..d18c7cb 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_network.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_network.c</span><br><span>@@ -88,6 +88,11 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+bool mgcp_rtp_end_remote_addr_available(const struct mgcp_rtp_end *rtp_end)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return rtp_end->rtp_port && !addr_is_any(&rtp_end->addr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Determine the local rtp bind IP-address.</span><br><span>  *  \param[out] addr caller provided memory to store the resulting IP-Address.</span><br><span>  *  \param[in] endp mgcp endpoint, that holds a copy of the VTY parameters.</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_protocol.c b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>index 8d6f6f5..4fb93b0 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>@@ -990,8 +990,9 @@</span><br><span> </span><br><span>     /* Send dummy packet, see also comments in mgcp_keepalive_timer_cb() */</span><br><span>      OSMO_ASSERT(trunk->keepalive_interval >= MGCP_KEEPALIVE_ONCE);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (conn->conn->mode & MGCP_CONN_RECV_ONLY</span><br><span style="color: hsl(0, 100%, 40%);">-        && trunk->keepalive_interval != MGCP_KEEPALIVE_NEVER)</span><br><span style="color: hsl(120, 100%, 40%);">+  if (conn->conn->mode & MGCP_CONN_RECV_ONLY &&</span><br><span style="color: hsl(120, 100%, 40%);">+           mgcp_rtp_end_remote_addr_available(&conn->end) &&</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->keepalive_interval != MGCP_KEEPALIVE_NEVER)</span><br><span>            send_dummy(endp, conn);</span><br><span> </span><br><span>  LOGPCONN(_conn, DLMGCP, LOGL_NOTICE,</span><br><span>@@ -1232,8 +1233,9 @@</span><br><span> </span><br><span>     /* Send dummy packet, see also comments in mgcp_keepalive_timer_cb() */</span><br><span>      OSMO_ASSERT(endp->trunk->keepalive_interval >= MGCP_KEEPALIVE_ONCE);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (conn->conn->mode & MGCP_CONN_RECV_ONLY</span><br><span style="color: hsl(0, 100%, 40%);">-        && endp->trunk->keepalive_interval != MGCP_KEEPALIVE_NEVER)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (conn->conn->mode & MGCP_CONN_RECV_ONLY &&</span><br><span style="color: hsl(120, 100%, 40%);">+           mgcp_rtp_end_remote_addr_available(&conn->end) &&</span><br><span style="color: hsl(120, 100%, 40%);">+      endp->trunk->keepalive_interval != MGCP_KEEPALIVE_NEVER)</span><br><span>           send_dummy(endp, conn);</span><br><span> </span><br><span>  rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_MDCX_SUCCESS));</span><br><span>@@ -1495,7 +1497,9 @@</span><br><span>  for (i = 1; i < trunk->number_endpoints; ++i) {</span><br><span>                struct mgcp_endpoint *endp = trunk->endpoints[i];</span><br><span>                 llist_for_each_entry(conn, &endp->conns, entry) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (conn->mode == MGCP_CONN_RECV_ONLY)</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (conn->type == MGCP_CONN_TYPE_RTP &&</span><br><span style="color: hsl(120, 100%, 40%);">+                        conn->mode == MGCP_CONN_RECV_ONLY &&</span><br><span style="color: hsl(120, 100%, 40%);">+                        mgcp_rtp_end_remote_addr_available(&conn->u.rtp.end))</span><br><span>                            send_dummy(endp, &conn->u.rtp);</span><br><span>               }</span><br><span>    }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/24862">change 24862</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-mgw/+/24862"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-mgw </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I8ceafda691146823b12232b4a804b4ce74acbdc8 </div>
<div style="display:none"> Gerrit-Change-Number: 24862 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>