gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [gnunet] branch master updated (40dc727 -> e85571c)


From: gnunet
Subject: [GNUnet-SVN] [gnunet] branch master updated (40dc727 -> e85571c)
Date: Sun, 27 Nov 2016 20:09:38 +0100

This is an automated email from the git hooks/post-receive script.

grothoff pushed a change to branch master
in repository gnunet.

    from 40dc727  add output
     new e6538aa  change return value to use -1 on error, as 0 is a legal 
packet size
     new 198a5a9  implement reading STUN data from interface in gnunet-nat
     new e85571c  implement reading STUN data from interface in gnunet-nat: 
update doc

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 doc/man/gnunet-nat.1             |   2 +-
 src/gns/gnunet-dns2gns.c         |  11 ++--
 src/include/gnunet_network_lib.h |   2 +-
 src/nat/gnunet-nat.c             | 116 ++++++++++++++++++++++++++++++++++++++-
 src/util/network.c               |   8 +--
 5 files changed, 127 insertions(+), 12 deletions(-)

diff --git a/doc/man/gnunet-nat.1 b/doc/man/gnunet-nat.1
index 01d96af..190b9d8 100644
--- a/doc/man/gnunet-nat.1
+++ b/doc/man/gnunet-nat.1
@@ -49,7 +49,7 @@ Use PORT as our external port for advertising for incoming 
requests.
 
 .B
 .IP "\-s,  \-\-stun"
-Enable processing of STUN requests. (Not implemented).
+Enable processing of STUN requests. 
 
 .B
 .IP "\-t,  \-\-tcp"
diff --git a/src/gns/gnunet-dns2gns.c b/src/gns/gnunet-dns2gns.c
index 73d5eab..f583037 100644
--- a/src/gns/gnunet-dns2gns.c
+++ b/src/gns/gnunet-dns2gns.c
@@ -533,17 +533,20 @@ read_dns4 (void *cls)
       return; /* read error!? */
     }
   {
-    char buf[size];
+    char buf[size + 1];
 
     addrlen = sizeof (v4);
     GNUNET_break (size ==
                  GNUNET_NETWORK_socket_recvfrom (listen_socket4,
                                                  buf,
-                                                 size,
+                                                 size + 1,
                                                  (struct sockaddr *) &v4,
                                                  &addrlen));
-    handle_request (listen_socket4, &v4, addrlen,
-                   buf, size);
+    handle_request (listen_socket4,
+                   &v4,
+                   addrlen,
+                   buf,
+                   size);
   }
 }
 
diff --git a/src/include/gnunet_network_lib.h b/src/include/gnunet_network_lib.h
index 8064140..beca838 100644
--- a/src/include/gnunet_network_lib.h
+++ b/src/include/gnunet_network_lib.h
@@ -244,7 +244,7 @@ GNUNET_NETWORK_socket_listen (const struct 
GNUNET_NETWORK_Handle *desc,
  * How much data is available to be read on this descriptor?
  *
  * @param desc socket
- * @returns #GNUNET_NO if no data is available, or on error!
+ * @returns #GNUNET_SYSERR if no data is available, or on error!
  */
 ssize_t
 GNUNET_NETWORK_socket_recvfrom_amount (const struct GNUNET_NETWORK_Handle 
*desc);
diff --git a/src/nat/gnunet-nat.c b/src/nat/gnunet-nat.c
index 01dfa3d..0db1ffb 100644
--- a/src/nat/gnunet-nat.c
+++ b/src/nat/gnunet-nat.c
@@ -105,6 +105,16 @@ static struct GNUNET_NAT_Test *nt;
  */
 static struct GNUNET_NAT_Handle *nh;
 
+/**
+ * Listen socket for STUN processing.
+ */ 
+static struct GNUNET_NETWORK_Handle *ls;
+
+/**
+ * Task for reading STUN packets.
+ */
+static struct GNUNET_SCHEDULER_Task *rtask;
+
 
 /**
  * Test if all activities have finished, and if so,
@@ -119,6 +129,8 @@ test_finished ()
     return;
   if (NULL != nh)
     return;
+  if (NULL != rtask)
+    return;
   GNUNET_SCHEDULER_shutdown ();
 }
 
@@ -290,6 +302,63 @@ do_shutdown (void *cls)
     GNUNET_NAT_unregister (nh);
     nh = NULL;
   }
+  if (NULL != ls)
+  {
+    GNUNET_NETWORK_socket_close (ls);
+    ls = NULL;
+  }
+  if (NULL != rtask)
+  {
+    GNUNET_SCHEDULER_cancel (rtask);
+    rtask = NULL;
+  }
+}
+
+
+/**
+ * Task to receive incoming packets for STUN processing.
+ */
+static void
+stun_read_task (void *cls)
+{
+  ssize_t size;
+  
+  rtask = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
+                                        ls,
+                                        &stun_read_task,
+                                        NULL);
+  size = GNUNET_NETWORK_socket_recvfrom_amount (ls);
+  if (size > 0)
+  {
+    GNUNET_break (0);
+    GNUNET_SCHEDULER_shutdown ();
+    global_ret = 1;
+    return;
+  }
+  {
+    char buf[size + 1];
+    struct sockaddr_storage sa;
+    socklen_t salen = sizeof (sa);
+    ssize_t ret;
+    
+    ret = GNUNET_NETWORK_socket_recvfrom (ls,
+                                         buf,
+                                         size + 1,
+                                         (struct sockaddr *) &sa,
+                                         &salen);
+    if (ret != size)
+    {
+      GNUNET_break (0);
+      GNUNET_SCHEDULER_shutdown ();
+      global_ret = 1;
+      return;
+    }
+    (void) GNUNET_NAT_stun_handle_packet (nh,
+                                         (const struct sockaddr *) &sa,
+                                         salen,
+                                         buf,
+                                         ret);
+  }
 }
 
 
@@ -418,6 +487,9 @@ run (void *cls,
                              NULL);
   }
 
+  GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
+                                NULL);
+
   if (NULL != remote_addr)
   {
     int ret;
@@ -464,8 +536,48 @@ run (void *cls,
                                      &auto_config_cb,
                                      NULL);
   }
-  GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
-                                NULL);
+
+  if (do_stun)
+  {
+    if (NULL == local_addr)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
+                 "Require local address to support STUN requests\n");
+      global_ret = 1;
+      GNUNET_SCHEDULER_shutdown ();
+      return;
+    }
+    if (IPPROTO_UDP != proto)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
+                 "STUN only supported over UDP\n");
+      global_ret = 1;
+      GNUNET_SCHEDULER_shutdown ();
+      return;
+    }
+    ls = GNUNET_NETWORK_socket_create (af,
+                                      SOCK_DGRAM,
+                                      IPPROTO_UDP);
+    if (GNUNET_OK !=
+       GNUNET_NETWORK_socket_bind (ls,
+                                   local_sa,
+                                   local_len))
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                 "Failed to bind to %s: %s\n",
+                 GNUNET_a2s (local_sa,
+                             local_len),
+                 STRERROR (errno));
+      global_ret = 1;
+      GNUNET_SCHEDULER_shutdown ();
+      return;
+    }
+    rtask = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
+                                          ls,
+                                          &stun_read_task,
+                                          NULL);
+  }
+
   test_finished ();
 }
 
diff --git a/src/util/network.c b/src/util/network.c
index 5aeb015..67f2801 100644
--- a/src/util/network.c
+++ b/src/util/network.c
@@ -770,7 +770,7 @@ GNUNET_NETWORK_socket_listen (const struct 
GNUNET_NETWORK_Handle *desc,
  * How much data is available to be read on this descriptor?
  *
  * @param desc socket
- * @returns #GNUNET_NO if no data is available, or on error!
+ * @returns #GNUNET_SYSERR if no data is available, or on error!
  */
 ssize_t
 GNUNET_NETWORK_socket_recvfrom_amount (const struct GNUNET_NETWORK_Handle 
*desc)
@@ -784,9 +784,9 @@ GNUNET_NETWORK_socket_recvfrom_amount (const struct 
GNUNET_NETWORK_Handle *desc)
   error = ioctl (desc->fd,
                  FIONREAD,
                  &pending);
-  if (error == 0)
+  if (0 == error)
     return (ssize_t) pending;
-  return GNUNET_NO;
+  return GNUNET_SYSERR;
 #else
   u_long pending;
 
@@ -795,7 +795,7 @@ GNUNET_NETWORK_socket_recvfrom_amount (const struct 
GNUNET_NETWORK_Handle *desc)
                        &pending);
   if (error != SOCKET_ERROR)
     return (ssize_t) pending;
-  return GNUNET_NO;
+  return GNUNET_SYSERR;
 #endif
 }
 

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]