pespin has uploaded this change for review.

View Change

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)

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

Gerrit-MessageType: newchange
Gerrit-Project: osmo-pcap
Gerrit-Branch: master
Gerrit-Change-Id: Id63c7047bbc49ed5991b14fecfb3835972442165
Gerrit-Change-Number: 39307
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>