pespin has uploaded this change for review.

View Change

stream: Use new multiaddr APIs to log whole set of sock addresses

Until now, the used (existing) APIs were only retrieving 1 local and 1
remote address, even if the socket actually handled several, as it's
possible with SCTP multi-homing setups.

Related: SYS#6636
Depends: libosmocore.git Change-Id I48950754ed6f61ee5ffa04a447fab8903f10acc0
Change-Id: I7ae300595825836cc7d6fa07238c0c2f15d14e85
---
M TODO-RELEASE
M include/osmocom/netif/stream.h
M src/stream_cli.c
M src/stream_srv.c
4 files changed, 77 insertions(+), 26 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/libosmo-netif refs/changes/40/35240/1
diff --git a/TODO-RELEASE b/TODO-RELEASE
index 2346129..3c05362 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -7,4 +7,5 @@
# If any interfaces have been added since the last public release: c:r:a + 1.
# If any interfaces have been removed or changed since the last public release: c:r:0.
#library what description / commit summary line
-libosmocore >1.9.0 working osmo_sock_init2_multiaddr2() without setting flag OSMO_SOCK_F_BIND
\ No newline at end of file
+libosmocore >1.9.0 working osmo_sock_init2_multiaddr2() without setting flag OSMO_SOCK_F_BIND
+libosmocore >1.9.0 use osmo_sock_multiaddr_get_name_buf(), osmo_sock_multiaddr_get_ip_and_port()
\ No newline at end of file
diff --git a/include/osmocom/netif/stream.h b/include/osmocom/netif/stream.h
index 218b635..946aee0 100644
--- a/include/osmocom/netif/stream.h
+++ b/include/osmocom/netif/stream.h
@@ -36,7 +36,7 @@
void osmo_stream_srv_link_set_accept_cb(struct osmo_stream_srv_link *link, int (*accept_cb)(struct osmo_stream_srv_link *link, int fd));
void osmo_stream_srv_link_set_data(struct osmo_stream_srv_link *link, void *data);
void *osmo_stream_srv_link_get_data(struct osmo_stream_srv_link *link);
-char *osmo_stream_srv_link_get_sockname(const struct osmo_stream_srv_link *link);
+const char *osmo_stream_srv_link_get_sockname(const struct osmo_stream_srv_link *link);
struct osmo_fd *osmo_stream_srv_link_get_ofd(struct osmo_stream_srv_link *link);
bool osmo_stream_srv_link_is_opened(const struct osmo_stream_srv_link *link);
int osmo_stream_srv_link_open(struct osmo_stream_srv_link *link);
diff --git a/src/stream_cli.c b/src/stream_cli.c
index 4f2963d..e075161 100644
--- a/src/stream_cli.c
+++ b/src/stream_cli.c
@@ -96,7 +96,7 @@

struct osmo_stream_cli {
char *name;
- char sockname[OSMO_SOCK_NAME_MAXLEN];
+ char sockname[OSMO_STREAM_MAX_ADDRS * OSMO_SOCK_NAME_MAXLEN];
enum osmo_stream_mode mode;
union {
struct osmo_fd ofd;
@@ -351,7 +351,8 @@
osmo_fd_write_disable(&cli->ofd);

/* Update sockname based on socket info: */
- osmo_sock_get_name_buf(cli->sockname, sizeof(cli->sockname), osmo_stream_cli_get_fd(cli));
+ osmo_sock_multiaddr_get_name_buf(cli->sockname, sizeof(cli->sockname),
+ osmo_stream_cli_get_fd(cli), cli->proto);

LOGSCLI(cli, LOGL_INFO, "connection established\n");
cli->state = STREAM_CLI_STATE_CONNECTED;
@@ -685,9 +686,10 @@
* \returns Socket description or NULL in case of error */
char *osmo_stream_cli_get_sockname(const struct osmo_stream_cli *cli)
{
- static char buf[OSMO_SOCK_NAME_MAXLEN];
+ static char buf[OSMO_STREAM_MAX_ADDRS * OSMO_SOCK_NAME_MAXLEN];

- osmo_sock_get_name_buf(buf, OSMO_SOCK_NAME_MAXLEN, osmo_stream_cli_get_fd(cli));
+ osmo_sock_multiaddr_get_name_buf(buf, sizeof(buf),
+ osmo_stream_cli_get_fd(cli), cli->proto);

return buf;
}
@@ -989,7 +991,7 @@
#ifdef HAVE_LIBSCTP
case IPPROTO_SCTP:
{
- char log_pfx[128];
+ char log_pfx[4096];
snprintf(log_pfx, sizeof(log_pfx), "CLICONN(%s,%s)", cli->name ? : "", cli->sockname);
ret = stream_sctp_recvmsg_wrapper(cli->ofd.fd, msg, log_pfx);
break;
diff --git a/src/stream_srv.c b/src/stream_srv.c
index 42b04ad..75b7526 100644
--- a/src/stream_srv.c
+++ b/src/stream_srv.c
@@ -85,7 +85,7 @@
struct osmo_stream_srv_link {
struct osmo_fd ofd;
char *name;
- char sockname[OSMO_SOCK_NAME_MAXLEN];
+ char sockname[OSMO_STREAM_MAX_ADDRS * INET6_ADDRSTRLEN + OSMO_STREAM_MAX_ADDRS + 2 + 6 + 1];
char *addr[OSMO_STREAM_MAX_ADDRS];
uint8_t addrcnt;
uint16_t port;
@@ -338,23 +338,55 @@
return link->data;
}

+/* Similar to osmo_sock_multiaddr_get_name_buf(), but aimed at listening sockets (only local part): */
+static char *get_local_sockname_buf(char *buf, size_t buf_len, int fd, int proto)
+{
+ char hostbuf[OSMO_STREAM_MAX_ADDRS][INET6_ADDRSTRLEN];
+ size_t num_hostbuf = ARRAY_SIZE(hostbuf);
+ char portbuf[6];
+ struct osmo_strbuf sb = { .buf = buf, .len = buf_len };
+ bool is_v6 = false;
+ bool need_more_bufs;
+ unsigned int i;
+ int rc;
+
+ rc = osmo_sock_multiaddr_get_ip_and_port(fd, proto, &hostbuf[0][0],
+ &num_hostbuf, sizeof(hostbuf[0]),
+ portbuf, sizeof(portbuf), true);
+ if (rc < 0)
+ return NULL;
+
+ is_v6 = false;
+ need_more_bufs = num_hostbuf > ARRAY_SIZE(hostbuf);
+ if (need_more_bufs)
+ num_hostbuf = ARRAY_SIZE(hostbuf);
+
+ if (num_hostbuf > 1)
+ OSMO_STRBUF_PRINTF(sb, "(");
+ else if ((is_v6 = !!strchr(hostbuf[0], ':'))) /* IPv6, add [] to separate from port. */
+ OSMO_STRBUF_PRINTF(sb, "[");
+
+ for (i = 0; i < num_hostbuf - 1; i++)
+ OSMO_STRBUF_PRINTF(sb, "%s|", hostbuf[i]);
+ OSMO_STRBUF_PRINTF(sb, "%s", hostbuf[i]);
+
+ if (num_hostbuf > 1)
+ OSMO_STRBUF_PRINTF(sb, ")");
+ else if (is_v6)
+ OSMO_STRBUF_PRINTF(sb, "]");
+ if (need_more_bufs)
+ OSMO_STRBUF_PRINTF(sb, "<need-more-bufs!>");
+ OSMO_STRBUF_PRINTF(sb, ":%s", portbuf);
+
+ return buf;
+}
+
/*! \brief Get description of the stream server link e. g. 127.0.0.1:1234
* \param[in] link Stream Server Link to examine
* \returns Link description or NULL in case of error */
-char *osmo_stream_srv_link_get_sockname(const struct osmo_stream_srv_link *link)
+const char *osmo_stream_srv_link_get_sockname(const struct osmo_stream_srv_link *link)
{
- static char buf[INET6_ADDRSTRLEN + 6];
- int rc = osmo_sock_get_local_ip(link->ofd.fd, buf, INET6_ADDRSTRLEN);
- if (rc < 0)
- return NULL;
-
- buf[strnlen(buf, INET6_ADDRSTRLEN + 6)] = ':';
-
- rc = osmo_sock_get_local_ip_port(link->ofd.fd, buf + strnlen(buf, INET6_ADDRSTRLEN + 6), 6);
- if (rc < 0)
- return NULL;
-
- return buf;
+ return link->sockname;
}

/*! \brief Get Osmocom File Descriptor of the stream server link
@@ -435,7 +467,7 @@
return -EIO;
}

- OSMO_STRLCPY_ARRAY(link->sockname, osmo_stream_srv_link_get_sockname(link));
+ get_local_sockname_buf(link->sockname, sizeof(link->sockname), link->ofd.fd, link->proto);
return 0;
}

@@ -513,7 +545,7 @@
struct osmo_stream_srv {
struct osmo_stream_srv_link *srv;
char *name;
- char sockname[OSMO_SOCK_NAME_MAXLEN];
+ char sockname[OSMO_STREAM_MAX_ADDRS * OSMO_SOCK_NAME_MAXLEN];
enum osmo_stream_mode mode;
union {
struct osmo_fd ofd;
@@ -704,7 +736,8 @@
conn->data = data;
INIT_LLIST_HEAD(&conn->tx_queue);

- osmo_sock_get_name_buf(conn->sockname, sizeof(conn->sockname), fd);
+ osmo_sock_multiaddr_get_name_buf(conn->sockname, sizeof(conn->sockname),
+ fd, link->proto);

if (osmo_fd_register(&conn->ofd) < 0) {
LOGSSRV(conn, LOGL_ERROR, "could not register FD\n");
@@ -734,7 +767,7 @@
conn->mode = OSMO_STREAM_MODE_OSMO_IO;
conn->srv = link;

- osmo_sock_get_name_buf(conn->sockname, sizeof(conn->sockname), fd);
+ osmo_sock_multiaddr_get_name_buf(conn->sockname, sizeof(conn->sockname), fd, link->proto);

conn->iofd = osmo_iofd_setup(conn, fd, conn->sockname,
OSMO_IO_FD_MODE_READ_WRITE, &srv_ioops, conn);
@@ -949,7 +982,7 @@
#ifdef HAVE_LIBSCTP
case IPPROTO_SCTP:
{
- char log_pfx[128];
+ char log_pfx[4096];
snprintf(log_pfx, sizeof(log_pfx), "SRV(%s,%s)", conn->name ? : "", conn->sockname);
ret = stream_sctp_recvmsg_wrapper(conn->ofd.fd, msg, log_pfx);
break;

To view, visit change 35240. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: libosmo-netif
Gerrit-Branch: master
Gerrit-Change-Id: I7ae300595825836cc7d6fa07238c0c2f15d14e85
Gerrit-Change-Number: 35240
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>
Gerrit-MessageType: newchange