Change in osmo-mgw[master]: mgw: Introduce VTY cmd 'rtp bind-ip-v6' command

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

pespin gerrit-no-reply at lists.osmocom.org
Tue Sep 8 17:55:37 UTC 2020


pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-mgw/+/19970 )

Change subject: mgw: Introduce VTY cmd 'rtp bind-ip-v6' command
......................................................................

mgw: Introduce VTY cmd 'rtp bind-ip-v6' command

This commit allows for fully IPv6 systems to work fine. However, if a
remote endpoint still wants to use IPv4, it will fail since at this
point osmo-mgw still doesn't re-bind the local end of the connection to
an IPv4 after having initially bound it to an IPv6 one. This kind of
scenarios get fixed in next commits.

TODO: really bind the socket if a different IP address is requested.

Change-Id: I8ed94bd3f674f498e6ba315f44a351fff9c1be15
---
M include/osmocom/mgcp/mgcp.h
M src/libosmo-mgcp/mgcp_network.c
M src/libosmo-mgcp/mgcp_vty.c
3 files changed, 53 insertions(+), 15 deletions(-)

Approvals:
  Jenkins Builder: Verified
  dexter: Looks good to me, but someone else must approve; Verified
  pespin: Looks good to me, approved
  laforge: Looks good to me, but someone else must approve



diff --git a/include/osmocom/mgcp/mgcp.h b/include/osmocom/mgcp/mgcp.h
index 75e531b..f3f225e 100644
--- a/include/osmocom/mgcp/mgcp.h
+++ b/include/osmocom/mgcp/mgcp.h
@@ -95,7 +95,8 @@
  */
 struct mgcp_port_range {
 	/* addr or NULL to fall-back to default */
-	char *bind_addr;
+	char *bind_addr_v4;
+	char *bind_addr_v6;
 
 	/* dynamically allocated */
 	int range_start;
diff --git a/src/libosmo-mgcp/mgcp_network.c b/src/libosmo-mgcp/mgcp_network.c
index 6ecb945..84f3604 100644
--- a/src/libosmo-mgcp/mgcp_network.c
+++ b/src/libosmo-mgcp/mgcp_network.c
@@ -102,9 +102,11 @@
 	char ipbuf[INET6_ADDRSTRLEN];
 	int rc;
 	endp = conn->conn->endp;
+	bool rem_addr_set = !addr_is_any(&conn->end.addr);
+	char *bind_addr;
 
 	/* Try probing the local IP-Address */
-	if (endp->cfg->net_ports.bind_addr_probe && !addr_is_any(&conn->end.addr)) {
+	if (endp->cfg->net_ports.bind_addr_probe && rem_addr_set) {
 		rc = osmo_sock_local_ip(addr, osmo_sockaddr_ntop(&conn->end.addr.u.sa, ipbuf));
 		if (rc < 0)
 			LOGPCONN(conn->conn, DRTP, LOGL_ERROR,
@@ -118,21 +120,31 @@
 	}
 
 	/* Select from preconfigured IP-Addresses. We don't have bind_addr for Osmux (yet?). */
-	if (endp->cfg->net_ports.bind_addr) {
+	if (rem_addr_set) {
 		/* Check there is a bind IP for the RTP traffic configured,
 		 * if so, use that IP-Address */
-		osmo_strlcpy(addr, endp->cfg->net_ports.bind_addr, INET6_ADDRSTRLEN);
+		bind_addr = conn->end.addr.u.sa.sa_family == AF_INET6 ?
+				endp->cfg->net_ports.bind_addr_v6 :
+				endp->cfg->net_ports.bind_addr_v4;
+	} else {
+		/* Choose any of the bind addresses, preferring v6 over v4 */
+		bind_addr = endp->cfg->net_ports.bind_addr_v6;
+		if (!bind_addr)
+			bind_addr = endp->cfg->net_ports.bind_addr_v4;
+	}
+	if (bind_addr) {
 		LOGPCONN(conn->conn, DRTP, LOGL_DEBUG,
 			 "using configured rtp bind ip as local bind ip %s\n",
-			 addr);
+			 bind_addr);
 	} else {
 		/* No specific bind IP is configured for the RTP traffic, so
 		 * assume the IP where we listen for incoming MGCP messages
 		 * as bind IP */
-		osmo_strlcpy(addr, endp->cfg->source_addr, INET6_ADDRSTRLEN);
+		bind_addr = endp->cfg->source_addr;
 		LOGPCONN(conn->conn, DRTP, LOGL_DEBUG,
-			"using mgcp bind ip as local rtp bind ip: %s\n", addr);
+			"using mgcp bind ip as local rtp bind ip: %s\n", bind_addr);
 	}
+	osmo_strlcpy(addr, bind_addr, INET6_ADDRSTRLEN);
 }
 
 /* This does not need to be a precision timestamp and
diff --git a/src/libosmo-mgcp/mgcp_vty.c b/src/libosmo-mgcp/mgcp_vty.c
index 8ea1cdd..aa27d41 100644
--- a/src/libosmo-mgcp/mgcp_vty.c
+++ b/src/libosmo-mgcp/mgcp_vty.c
@@ -71,9 +71,12 @@
 	vty_out(vty, " rtp port-range %u %u%s",
 		g_cfg->net_ports.range_start, g_cfg->net_ports.range_end,
 		VTY_NEWLINE);
-	if (g_cfg->net_ports.bind_addr)
+	if (g_cfg->net_ports.bind_addr_v4)
 		vty_out(vty, " rtp bind-ip %s%s",
-			g_cfg->net_ports.bind_addr, VTY_NEWLINE);
+			g_cfg->net_ports.bind_addr_v4, VTY_NEWLINE);
+	if (g_cfg->net_ports.bind_addr_v6)
+		vty_out(vty, " rtp bind-ip-v6 %s%s",
+			g_cfg->net_ports.bind_addr_v6, VTY_NEWLINE);
 	if (g_cfg->net_ports.bind_addr_probe)
 		vty_out(vty, " rtp ip-probing%s", VTY_NEWLINE);
 	else
@@ -500,12 +503,11 @@
 
 DEFUN(cfg_mgcp_rtp_bind_ip,
       cfg_mgcp_rtp_bind_ip_cmd,
-      "rtp bind-ip " VTY_IPV46_CMD,
+      "rtp bind-ip A.B.C.D",
       RTP_STR "Bind endpoints facing the Network\n"
-      "IPv4 Address to bind to\n"
-      "IPv6 Address to bind to\n")
+      "IPv4 Address to bind to\n")
 {
-	osmo_talloc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr, argv[0]);
+	osmo_talloc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr_v4, argv[0]);
 	return CMD_SUCCESS;
 }
 ALIAS_DEPRECATED(cfg_mgcp_rtp_bind_ip,
@@ -519,8 +521,8 @@
       NO_STR RTP_STR "Bind endpoints facing the Network\n"
       "Address to bind to\n")
 {
-	talloc_free(g_cfg->net_ports.bind_addr);
-	g_cfg->net_ports.bind_addr = NULL;
+	talloc_free(g_cfg->net_ports.bind_addr_v4);
+	g_cfg->net_ports.bind_addr_v4 = NULL;
 	return CMD_SUCCESS;
 }
 ALIAS_DEPRECATED(cfg_mgcp_rtp_no_bind_ip,
@@ -529,6 +531,27 @@
 		 NO_STR RTP_STR "Bind endpoints facing the Network\n"
 		 "Address to bind to\n")
 
+DEFUN(cfg_mgcp_rtp_bind_ip_v6,
+      cfg_mgcp_rtp_bind_ip_v6_cmd,
+      "rtp bind-ip-v6 " VTY_IPV6_CMD,
+      RTP_STR "Bind endpoints facing the Network\n"
+      "IPv6 Address to bind to\n")
+{
+	osmo_talloc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr_v6, argv[0]);
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_mgcp_rtp_no_bind_ip_v6,
+cfg_mgcp_rtp_no_bind_ip_v6_cmd,
+"no rtp bind-ip-v6",
+NO_STR RTP_STR "Bind endpoints facing the Network\n"
+"Address to bind to\n")
+{
+	talloc_free(g_cfg->net_ports.bind_addr_v6);
+	g_cfg->net_ports.bind_addr_v6 = NULL;
+	return CMD_SUCCESS;
+}
+
 DEFUN(cfg_mgcp_rtp_net_bind_ip_probing,
       cfg_mgcp_rtp_net_bind_ip_probing_cmd,
       "rtp ip-probing",
@@ -1527,8 +1550,10 @@
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_port_range_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_cmd);
+	install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_v6_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_cmd);
+	install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_v6_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_probing_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_probing_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-mgw/+/19970
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-mgw
Gerrit-Branch: master
Gerrit-Change-Id: I8ed94bd3f674f498e6ba315f44a351fff9c1be15
Gerrit-Change-Number: 19970
Gerrit-PatchSet: 2
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <pmaier at sysmocom.de>
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-Reviewer: pespin <pespin at sysmocom.de>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200908/6b56385f/attachment.htm>


More information about the gerrit-log mailing list