[MERGED] libosmo-netif[master]: stream+datagram: Allow local bind + connect for client sockets

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/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Mon Apr 10 06:47:19 UTC 2017


Harald Welte has submitted this change and it was merged.

Change subject: stream+datagram: Allow local bind + connect for client sockets
......................................................................


stream+datagram: Allow local bind + connect for client sockets

This uses the new osmo_sock_init2() features introduced in libosmocore
Change-Id Idab124bcca47872f55311a82d6818aed590965e6 to bind *and*
connect a given socket during creation.

Change-Id: I013f4cc10b26d332d52d231f252bb0f03df8c54b
---
M include/osmocom/netif/datagram.h
M include/osmocom/netif/stream.h
M src/datagram.c
M src/stream.c
4 files changed, 48 insertions(+), 7 deletions(-)

Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/include/osmocom/netif/datagram.h b/include/osmocom/netif/datagram.h
index 33d3d30..b7ecfe3 100644
--- a/include/osmocom/netif/datagram.h
+++ b/include/osmocom/netif/datagram.h
@@ -8,6 +8,8 @@
 
 void osmo_dgram_tx_set_addr(struct osmo_dgram_tx *conn, const char *addr);
 void osmo_dgram_tx_set_port(struct osmo_dgram_tx *conn, uint16_t port);
+void osmo_dgram_tx_set_local_addr(struct osmo_dgram_tx *conn, const char *addr);
+void osmo_dgram_tx_set_local_port(struct osmo_dgram_tx *conn, uint16_t port);
 void osmo_dgram_tx_set_data(struct osmo_dgram_tx *conn, void *data);
 
 int osmo_dgram_tx_open(struct osmo_dgram_tx *conn);
diff --git a/include/osmocom/netif/stream.h b/include/osmocom/netif/stream.h
index 254b4c5..63eccf8 100644
--- a/include/osmocom/netif/stream.h
+++ b/include/osmocom/netif/stream.h
@@ -48,6 +48,8 @@
 void osmo_stream_cli_set_addr(struct osmo_stream_cli *cli, const char *addr);
 void osmo_stream_cli_set_port(struct osmo_stream_cli *cli, uint16_t port);
 void osmo_stream_cli_set_proto(struct osmo_stream_cli *cli, uint16_t proto);
+void osmo_stream_cli_set_local_addr(struct osmo_stream_cli *cli, const char *addr);
+void osmo_stream_cli_set_local_port(struct osmo_stream_cli *cli, uint16_t port);
 void osmo_stream_cli_set_data(struct osmo_stream_cli *cli, void *data);
 void osmo_stream_cli_set_reconnect_timeout(struct osmo_stream_cli *cli, int timeout);
 void *osmo_stream_cli_get_data(struct osmo_stream_cli *cli);
diff --git a/src/datagram.c b/src/datagram.c
index 6316552..cb2a64f 100644
--- a/src/datagram.c
+++ b/src/datagram.c
@@ -12,6 +12,7 @@
 
 #include <osmocom/core/linuxlist.h>
 #include <osmocom/core/select.h>
+#include <osmocom/core/utils.h>
 #include <osmocom/gsm/tlv.h>
 #include <osmocom/core/msgb.h>
 #include <osmocom/core/logging.h>
@@ -40,6 +41,8 @@
 	struct llist_head		tx_queue;
 	const char			*addr;
 	uint16_t			port;
+	char				*local_addr;
+	uint16_t			local_port;
 	int (*write_cb)(struct osmo_dgram_tx *conn);
 	void				*data;
 	unsigned int			flags;
@@ -140,6 +143,26 @@
 	conn->flags |= OSMO_DGRAM_CLI_F_RECONF;
 }
 
+/*! \brief Set the local address from which we transmit
+ *  \param[in] conn Datagram Transmitter to modify
+ *  \param[in] addr Local IP address */
+void
+osmo_dgram_tx_set_local_addr(struct osmo_dgram_tx *conn, const char *addr)
+{
+	osmo_talloc_replace_string(conn, &conn->local_addr, addr);
+	conn->flags |= OSMO_DGRAM_CLI_F_RECONF;
+}
+
+/*! \brief Set the local port from which we transmit
+ *  \param[in] conn Datagram Transmitter to modify
+ *  \param[in] port Local Port Number */
+void
+osmo_dgram_tx_set_local_port(struct osmo_dgram_tx *conn, uint16_t port)
+{
+	conn->local_port = port;
+	conn->flags |= OSMO_DGRAM_CLI_F_RECONF;
+}
+
 /*! \brief Set application private data of the datagram transmitter
  *  \param[in] conn Datagram Transmitter to modify
  *  \param[in] data User-specific data (available in call-back functions) */
@@ -169,9 +192,9 @@
 
 	conn->flags &= ~OSMO_DGRAM_CLI_F_RECONF;
 
-	ret = osmo_sock_init(AF_INET, SOCK_DGRAM, IPPROTO_UDP,
-			     conn->addr, conn->port,
-			     OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_NONBLOCK);
+	ret = osmo_sock_init2(AF_INET, SOCK_DGRAM, IPPROTO_UDP,
+			      conn->local_addr, conn->local_port, conn->addr, conn->port,
+			      OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_NONBLOCK);
 	if (ret < 0)
 		return ret;
 
diff --git a/src/stream.c b/src/stream.c
index e71e420..52521d7 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -12,6 +12,7 @@
 
 #include <osmocom/core/timer.h>
 #include <osmocom/core/select.h>
+#include <osmocom/core/utils.h>
 #include <osmocom/gsm/tlv.h>
 #include <osmocom/core/msgb.h>
 #include <osmocom/core/logging.h>
@@ -82,6 +83,7 @@
 	enum osmo_stream_cli_state	state;
 	const char			*addr;
 	uint16_t			port;
+	char				*local_addr;
 	uint16_t			local_port;
 	uint16_t			proto;
 	int (*connect_cb)(struct osmo_stream_cli *srv);
@@ -277,7 +279,7 @@
 	cli->flags |= OSMO_STREAM_CLI_F_RECONF;
 }
 
-/*! \brief Set the local port number for the socket
+/*! \brief Set the local port number for the socket (to be bound to)
  *  \param[in] cli Stream Client to modify
  *  \param[in] port Local port number
  */
@@ -285,6 +287,17 @@
 osmo_stream_cli_set_local_port(struct osmo_stream_cli *cli, uint16_t port)
 {
 	cli->local_port = port;
+	cli->flags |= OSMO_STREAM_CLI_F_RECONF;
+}
+
+/*! \brief Set the local address for the socket (to be bound to)
+ *  \param[in] cli Stream Client to modify
+ *  \param[in] port Local host name
+ */
+void
+osmo_stream_cli_set_local_addr(struct osmo_stream_cli *cli, const char *addr)
+{
+	osmo_talloc_replace_string(cli, &cli->local_addr, addr);
 	cli->flags |= OSMO_STREAM_CLI_F_RECONF;
 }
 
@@ -376,9 +389,10 @@
 
 	cli->flags &= ~OSMO_STREAM_CLI_F_RECONF;
 
-	ret = osmo_sock_init(AF_INET, SOCK_STREAM, cli->proto,
-			     cli->addr, cli->port,
-			     OSMO_SOCK_F_CONNECT);
+	ret = osmo_sock_init2(AF_INET, SOCK_STREAM, cli->proto,
+			      cli->local_addr, cli->local_port,
+			      cli->addr, cli->port,
+			      OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND);
 	if (ret < 0) {
 		if (reconnect && errno == ECONNREFUSED)
 			osmo_stream_cli_reconnect(cli);

-- 
To view, visit https://gerrit.osmocom.org/2251
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I013f4cc10b26d332d52d231f252bb0f03df8c54b
Gerrit-PatchSet: 3
Gerrit-Project: libosmo-netif
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder



More information about the gerrit-log mailing list