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)

--
To view, visit https://gerrit.osmocom.org/c/osmo-pcap/+/39307?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: osmo-pcap
Gerrit-Branch: master
Gerrit-Change-Id: Id63c7047bbc49ed5991b14fecfb3835972442165
Gerrit-Change-Number: 39307
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>

Reply via email to