gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r38194 - gnunet/src/nat


From: gnunet
Subject: [GNUnet-SVN] r38194 - gnunet/src/nat
Date: Mon, 24 Oct 2016 23:04:38 +0200

Author: grothoff
Date: 2016-10-24 23:04:38 +0200 (Mon, 24 Oct 2016)
New Revision: 38194

Modified:
   gnunet/src/nat/nat.h
   gnunet/src/nat/nat_api.c
Log:
more work on new nat library

Modified: gnunet/src/nat/nat.h
===================================================================
--- gnunet/src/nat/nat.h        2016-10-24 20:16:19 UTC (rev 38193)
+++ gnunet/src/nat/nat.h        2016-10-24 21:04:38 UTC (rev 38194)
@@ -224,6 +224,10 @@
    */ 
   int32_t add_remove GNUNET_PACKED;
 
+  /**
+   * Type of the address, an `enum GNUNET_NAT_AddressClass` in NBO.
+   */
+  uint32_t addr_class GNUNET_PACKED;
   /* followed by a `struct sockaddr` */
   
 };

Modified: gnunet/src/nat/nat_api.c
===================================================================
--- gnunet/src/nat/nat_api.c    2016-10-24 20:16:19 UTC (rev 38193)
+++ gnunet/src/nat/nat_api.c    2016-10-24 21:04:38 UTC (rev 38194)
@@ -155,8 +155,21 @@
 check_connection_reversal_request (void *cls,
                                   const struct 
GNUNET_NAT_ConnectionReversalRequestedMessage *crm)
 {
-  GNUNET_break (0);
-  return GNUNET_SYSERR;
+  if (ntohs (crm->header.size) !=
+      sizeof (*crm) +
+      ntohs (crm->local_addr_size) +
+      ntohs (crm->remote_addr_size) )
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  if ( (sizeof (struct sockaddr_in) != ntohs (crm->local_addr_size)) ||
+       (sizeof (struct sockaddr_in) != ntohs (crm->remote_addr_size)) )
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  return GNUNET_OK;
 }
 
   
@@ -170,9 +183,15 @@
 handle_connection_reversal_request (void *cls,
                                    const struct 
GNUNET_NAT_ConnectionReversalRequestedMessage *crm)
 {
-  // FIXME: parse
-  // FIXME: call callback!
-  GNUNET_break (0);
+  struct GNUNET_NAT_Handle *nh = cls;
+  const struct sockaddr_in *local_sa = (const struct sockaddr_in *) &crm[1];
+  const struct sockaddr_in *remote_sa = &local_sa[1];
+
+  nh->reversal_callback (nh->callback_cls,
+                        (const struct sockaddr *) local_sa,
+                        sizeof (struct sockaddr_in),
+                        (const struct sockaddr *) remote_sa,
+                        sizeof (struct sockaddr_in));
 }
 
 
@@ -187,8 +206,37 @@
 check_address_change_notification (void *cls,
                                   const struct 
GNUNET_NAT_AddressChangeNotificationMessage *acn)
 {
-  GNUNET_break (0);
-  return GNUNET_SYSERR;
+  size_t alen = ntohs (acn->header.size) - sizeof (*acn);
+
+  switch (alen)
+  {
+  case sizeof (struct sockaddr_in):
+    {
+      const struct sockaddr_in *s4
+       = (const struct sockaddr_in *) &acn[1];
+      if (AF_INET != s4->sin_family)
+      {
+       GNUNET_break (0);
+       return GNUNET_SYSERR;
+      }
+    }
+    break;
+  case sizeof (struct sockaddr_in6):
+    {
+      const struct sockaddr_in6 *s6
+       = (const struct sockaddr_in6 *) &acn[1];
+      if (AF_INET6 != s6->sin6_family)
+      {
+       GNUNET_break (0);
+       return GNUNET_SYSERR;
+      }
+    }
+    break;
+  default:
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  return GNUNET_OK;
 }
 
   
@@ -202,10 +250,48 @@
 handle_address_change_notification (void *cls,
                                    const struct 
GNUNET_NAT_AddressChangeNotificationMessage *acn)
 {
-  // FIXME: parse
-  // FIXME: update ae-DLL
-  // FIXME: call callback!
-  GNUNET_break (0);
+  struct GNUNET_NAT_Handle *nh = cls;
+  size_t alen = ntohs (acn->header.size) - sizeof (*acn);
+  const struct sockaddr *sa = (const struct sockaddr *) &acn[1];
+  enum GNUNET_NAT_AddressClass ac;
+  struct AddrEntry *ae;
+
+  ac = (enum GNUNET_NAT_AddressClass) ntohl (acn->addr_class);
+  if (GNUNET_YES == ntohl (acn->add_remove))
+  {
+    ae = GNUNET_malloc (sizeof (*ae) + alen);
+    ae->addrlen = alen;
+    GNUNET_memcpy (&ae[1],
+                  sa,
+                  alen);
+    GNUNET_CONTAINER_DLL_insert (nh->ae_head,
+                                nh->ae_tail,
+                                ae);
+  }
+  else
+  {
+    for (ae = nh->ae_head; NULL != ae; ae = ae->next)
+      if ( (ae->addrlen == alen) &&
+          (0 == memcmp (&ae[1],
+                        sa,
+                        alen)) )
+       break;
+    if (NULL == ae)
+    {
+      GNUNET_break (0);
+      reconnect (nh);
+      return;
+    }
+    GNUNET_CONTAINER_DLL_remove (nh->ae_head,
+                                nh->ae_tail,
+                                ae);
+    GNUNET_free (ae);
+  }
+  nh->address_callback (nh->callback_cls,
+                       ntohl (acn->add_remove),
+                       ac,
+                       sa,
+                       alen);
 }
 
 




reply via email to

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