pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-pcap/+/39307?usp=email )
Change subject: server: Use osmo_sockaddr in remote_addr field ......................................................................
server: Use osmo_sockaddr in remote_addr field
Change-Id: Id63c7047bbc49ed5991b14fecfb3835972442165 --- M include/osmo-pcap/osmo_pcap_server.h M src/osmo_server_network.c M src/osmo_server_vty.c 3 files changed, 35 insertions(+), 17 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-pcap refs/changes/07/39307/1
diff --git a/include/osmo-pcap/osmo_pcap_server.h b/include/osmo-pcap/osmo_pcap_server.h index 8bd1dee..f394c7c 100644 --- a/include/osmo-pcap/osmo_pcap_server.h +++ b/include/osmo-pcap/osmo_pcap_server.h @@ -32,6 +32,7 @@ #include <osmocom/core/select.h> #include <osmocom/core/linuxlist.h> #include <osmocom/core/write_queue.h> +#include <osmocom/core/socket.h>
#include <osmo-pcap/wireformat.h> #include <osmo-pcap/osmo_tls.h> @@ -80,7 +81,7 @@ char *name; char *remote_host; bool store; - struct in_addr remote_addr; + struct osmo_sockaddr rem_addr;
/* Remote connection */ struct osmo_wqueue rem_wq; diff --git a/src/osmo_server_network.c b/src/osmo_server_network.c index c1cc47e..21ff255 100644 --- a/src/osmo_server_network.c +++ b/src/osmo_server_network.c @@ -462,13 +462,15 @@
static int accept_cb(struct osmo_fd *fd, unsigned int when) { - struct osmo_pcap_conn *conn; + struct osmo_pcap_conn *conn = NULL; struct osmo_pcap_server *server; - struct sockaddr_in addr; - socklen_t size = sizeof(addr); + char str[INET6_ADDRSTRLEN]; + struct osmo_sockaddr osa; + socklen_t len = sizeof(osa.u.sas); int new_fd;
- new_fd = accept(fd->fd, (struct sockaddr *) &addr, &size); + memset(&osa, 0, sizeof(osa)); + new_fd = accept(fd->fd, &osa.u.sa, &len); if (new_fd < 0) { LOGP(DSERVER, LOGL_ERROR, "Failed to accept socket: %d\n", errno); return -1; @@ -480,13 +482,20 @@ rate_ctr_inc2(server->ctrg, SERVER_CTR_CONNECT);
llist_for_each_entry(conn, &server->conn, entry) { - if (conn->remote_addr.s_addr == addr.sin_addr.s_addr) { - LOGP(DSERVER, LOGL_NOTICE, - "New connection from %s\n", conn->name); - osmo_pcap_conn_event(conn, "connect", NULL); - new_connection(server, conn, new_fd); - return 0; - } + if (conn->rem_addr.u.sa.sa_family != osa.u.sa.sa_family) + continue; + switch (conn->rem_addr.u.sa.sa_family) { + case AF_INET: + if (conn->rem_addr.u.sin.sin_addr.s_addr != osa.u.sin.sin_addr.s_addr) + continue; + goto found; + case AF_INET6: + if (memcmp(&conn->rem_addr.u.sin6.sin6_addr, &osa.u.sin6.sin6_addr, sizeof(struct in6_addr))) + continue; + goto found; + default: + continue; + }; }
rate_ctr_inc2(server->ctrg, SERVER_CTR_NOCLIENT); @@ -496,10 +505,16 @@ * this client. */
- LOGP(DSERVER, LOGL_ERROR, - "Failed to find client for %s\n", inet_ntoa(addr.sin_addr)); + LOGP(DSERVER, LOGL_ERROR, "Failed to find client for %s\n", + osmo_sockaddr_ntop(&osa.u.sa, str)); close(new_fd); return -1; + +found: + LOGP(DSERVER, LOGL_NOTICE, "New connection from %s\n", conn->name); + osmo_pcap_conn_event(conn, "connect", NULL); + new_connection(server, conn, new_fd); + return 0; }
int osmo_pcap_server_listen(struct osmo_pcap_server *server) diff --git a/src/osmo_server_vty.c b/src/osmo_server_vty.c index eab5cb4..51448ff 100644 --- a/src/osmo_server_vty.c +++ b/src/osmo_server_vty.c @@ -360,9 +360,11 @@ return CMD_WARNING; }
- talloc_free(conn->remote_host); - conn->remote_host = talloc_strdup(pcap_server, remote_host); - inet_aton(remote_host, &conn->remote_addr); + if (osmo_sockaddr_from_str_and_uint(&conn->rem_addr, remote_host, 0) < 0) { + vty_out(vty, "Failed parsing address\n"); + return CMD_WARNING; + } + osmo_talloc_replace_string(pcap_server, &conn->remote_host, remote_host);
/* Checking store and maybe closing a pcap file */ if (!store)