<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-mgw/+/19888">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mgcp_client: Allow submitting and parsing IPv6 addr in SDP<br><br>Existing mgcp_client_test code required the '.' to trigger the same code<br>path, since with this commit we do extra checks and without a dot the<br>address is not accepted as IPv4 by osmo_ip_str_type().<br><br>Change-Id: I936bf57d37f5f0607dfe7fc66c37e424c3793f9b<br>---<br>M src/libosmo-mgcp-client/mgcp_client.c<br>M tests/mgcp_client/mgcp_client_test.c<br>2 files changed, 33 insertions(+), 10 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/88/19888/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libosmo-mgcp-client/mgcp_client.c b/src/libosmo-mgcp-client/mgcp_client.c</span><br><span>index 146a59d..ae07e92 100644</span><br><span>--- a/src/libosmo-mgcp-client/mgcp_client.c</span><br><span>+++ b/src/libosmo-mgcp-client/mgcp_client.c</span><br><span>@@ -25,6 +25,7 @@</span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/core/byteswap.h></span><br><span> #include <osmocom/core/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/sockaddr_str.h></span><br><span> </span><br><span> #include <osmocom/mgcp_client/mgcp_client.h></span><br><span> #include <osmocom/mgcp_client/mgcp_client_internal.h></span><br><span>@@ -370,20 +371,27 @@</span><br><span> /* Parse a line like "c=IN IP4 10.11.12.13" */</span><br><span> static int mgcp_parse_audio_ip(struct mgcp_response *r, const char *line)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct in_addr ip_test;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct in6_addr ip_test;</span><br><span style="color: hsl(120, 100%, 40%);">+ int family;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (strlen(line) < 16)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (strncmp("c=IN IP", line, 7) != 0)</span><br><span> goto response_parse_failure;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* The current implementation strictly supports IPV4 only ! */</span><br><span style="color: hsl(0, 100%, 40%);">- if (memcmp("c=IN IP4 ", line, 9) != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ line += 7;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (*line != '4' && *line != '6')</span><br><span> goto response_parse_failure;</span><br><span style="color: hsl(120, 100%, 40%);">+ line++;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (*line != ' ')</span><br><span style="color: hsl(120, 100%, 40%);">+ goto response_parse_failure;</span><br><span style="color: hsl(120, 100%, 40%);">+ line++;</span><br><span> </span><br><span> /* Extract IP-Address */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_strlcpy(r->audio_ip, line + 9, sizeof(r->audio_ip));</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_strlcpy(r->audio_ip, line, sizeof(r->audio_ip));</span><br><span> </span><br><span> /* Check IP-Address */</span><br><span style="color: hsl(0, 100%, 40%);">- if (inet_aton(r->audio_ip, &ip_test) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ family = osmo_ip_str_type(r->audio_ip);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (family == AF_UNSPEC)</span><br><span style="color: hsl(120, 100%, 40%);">+ goto response_parse_failure;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (inet_pton(family, r->audio_ip, &ip_test) != 1)</span><br><span> goto response_parse_failure;</span><br><span> </span><br><span> return 0;</span><br><span>@@ -1122,6 +1130,7 @@</span><br><span> unsigned int i;</span><br><span> int rc = 0;</span><br><span> char local_ip[INET6_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+ int local_ip_family, audio_ip_family;</span><br><span> const char *codec;</span><br><span> unsigned int pt;</span><br><span> </span><br><span>@@ -1138,10 +1147,21 @@</span><br><span> msgb_free(msg);</span><br><span> return -2;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ local_ip_family = osmo_ip_str_type(local_ip);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (local_ip_family == AF_UNSPEC) {</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return -2;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_ip_family = osmo_ip_str_type(mgcp_msg->audio_ip);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (audio_ip_family == AF_UNSPEC) {</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return -2;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span> /* Add owner/creator (SDP) */</span><br><span style="color: hsl(0, 100%, 40%);">- rc += msgb_printf(msg, "o=- %x 23 IN IP4 %s\r\n",</span><br><span style="color: hsl(0, 100%, 40%);">- mgcp_msg->call_id, local_ip);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc += msgb_printf(msg, "o=- %x 23 IN IP%c %s\r\n", mgcp_msg->call_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ local_ip_family == AF_INET6 ? '6' : '4',</span><br><span style="color: hsl(120, 100%, 40%);">+ local_ip);</span><br><span> </span><br><span> /* Add session name (none) */</span><br><span> rc += msgb_printf(msg, "s=-\r\n");</span><br><span>@@ -1159,7 +1179,9 @@</span><br><span> msgb_free(msg);</span><br><span> return -2;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- rc += msgb_printf(msg, "c=IN IP4 %s\r\n", mgcp_msg->audio_ip);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc += msgb_printf(msg, "c=IN IP%c %s\r\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_ip_family == AF_INET6 ? '6' : '4',</span><br><span style="color: hsl(120, 100%, 40%);">+ mgcp_msg->audio_ip);</span><br><span> </span><br><span> /* Add time description, active time (SDP) */</span><br><span> rc += msgb_printf(msg, "t=0 0\r\n");</span><br><span>diff --git a/tests/mgcp_client/mgcp_client_test.c b/tests/mgcp_client/mgcp_client_test.c</span><br><span>index db9f4f8..0f305b7 100644</span><br><span>--- a/tests/mgcp_client/mgcp_client_test.c</span><br><span>+++ b/tests/mgcp_client/mgcp_client_test.c</span><br><span>@@ -294,6 +294,7 @@</span><br><span> MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE |</span><br><span> MGCP_MSG_PRESENCE_AUDIO_IP | MGCP_MSG_PRESENCE_AUDIO_PORT);</span><br><span> memset(audio_ip_overflow, 'X', sizeof(audio_ip_overflow));</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_ip_overflow[1] = '.';</span><br><span> audio_ip_overflow[sizeof(audio_ip_overflow) - 1] = '\0';</span><br><span> mgcp_msg.audio_ip = audio_ip_overflow;</span><br><span> msg = mgcp_msg_gen(mgcp, &mgcp_msg);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/19888">change 19888</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/+/19888"/><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: I936bf57d37f5f0607dfe7fc66c37e424c3793f9b </div>
<div style="display:none"> Gerrit-Change-Number: 19888 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>