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