[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnunet] 03/03: TRANSPORT: Fix IPv6 setting in UDP communicator.
From: |
gnunet |
Subject: |
[gnunet] 03/03: TRANSPORT: Fix IPv6 setting in UDP communicator. |
Date: |
Fri, 15 Mar 2024 08:35:09 +0100 |
This is an automated email from the git hooks/post-receive script.
martin-schanzenbach pushed a commit to branch master
in repository gnunet.
commit b8da22a9bc54610bb21ccbf982a678e276a47586
Author: Martin Schanzenbach <schanzen@gnunet.org>
AuthorDate: Fri Mar 15 08:34:38 2024 +0100
TRANSPORT: Fix IPv6 setting in UDP communicator.
---
.../gnunet_transport_communication_service.h | 2 +-
src/service/transport/gnunet-communicator-tcp.c | 2 +-
src/service/transport/gnunet-communicator-udp.c | 46 +++++++++++++++++-----
.../transport/transport_api2_communication.c | 10 ++++-
4 files changed, 48 insertions(+), 12 deletions(-)
diff --git a/src/include/gnunet_transport_communication_service.h
b/src/include/gnunet_transport_communication_service.h
index 92facb0e0..ea947911f 100644
--- a/src/include/gnunet_transport_communication_service.h
+++ b/src/include/gnunet_transport_communication_service.h
@@ -74,7 +74,7 @@ extern "C" {
* @param address where to send the message, human-readable
* communicator-specific format, 0-terminated, UTF-8
* @return #GNUNET_OK on success, #GNUNET_SYSERR if the provided address is
- * invalid
+ * invalid, #GNUNET_NO if this address is already (beging) connected to.
*/
typedef int (*GNUNET_TRANSPORT_CommunicatorMqInit) (
void *cls,
diff --git a/src/service/transport/gnunet-communicator-tcp.c
b/src/service/transport/gnunet-communicator-tcp.c
index 2ff7c4fc7..02a547335 100644
--- a/src/service/transport/gnunet-communicator-tcp.c
+++ b/src/service/transport/gnunet-communicator-tcp.c
@@ -3349,7 +3349,7 @@ mq_init (void *cls, const struct GNUNET_PeerIdentity
*peer, const char *address)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Queue for %s already exists or is in construction\n",
address);
- return GNUNET_SYSERR;
+ return GNUNET_NO;
}
switch (in->sa_family)
{
diff --git a/src/service/transport/gnunet-communicator-udp.c
b/src/service/transport/gnunet-communicator-udp.c
index b132080cf..e9496c571 100644
--- a/src/service/transport/gnunet-communicator-udp.c
+++ b/src/service/transport/gnunet-communicator-udp.c
@@ -850,6 +850,11 @@ static struct GNUNET_NAT_Handle *nat;
*/
static uint16_t my_port;
+/**
+ * IPv6 disabled or not.
+ */
+static int disable_v6;
+
/**
* An interface went away, stop broadcasting on it.
@@ -2245,11 +2250,7 @@ udp_address_to_sockaddr (const char *bindto, socklen_t
*sock_len)
bindto);
return NULL;
}
- if ((GNUNET_NO == GNUNET_NETWORK_test_pf (PF_INET6)) ||
- (GNUNET_YES ==
- GNUNET_CONFIGURATION_get_value_yesno (cfg,
- COMMUNICATOR_CONFIG_SECTION,
- "DISABLE_V6")))
+ if (GNUNET_YES == disable_v6)
{
struct sockaddr_in *i4;
@@ -2865,6 +2866,21 @@ mq_init (void *cls, const struct GNUNET_PeerIdentity
*peer, const char *address)
path = &address[strlen (COMMUNICATOR_ADDRESS_PREFIX "-")];
in = udp_address_to_sockaddr (path, &in_len);
+ if (NULL == in)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Failed to setup UDP socket address\n");
+ return GNUNET_SYSERR;
+ }
+ if ((AF_INET6 == in->sa_family) &&
+ (GNUNET_YES == disable_v6))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "IPv6 disabled, skipping %s\n", address);
+ GNUNET_free (in);
+ return GNUNET_SYSERR;
+ }
+
hsh = GNUNET_CRYPTO_hash_context_start ();
GNUNET_CRYPTO_hash_context_read (hsh, in, in_len);
GNUNET_CRYPTO_hash_context_read (hsh, peer, sizeof(*peer));
@@ -2874,9 +2890,9 @@ mq_init (void *cls, const struct GNUNET_PeerIdentity
*peer, const char *address)
if (NULL != receiver)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "receiver %s already exist or is begin connected to\n",
+ "receiver %s already exist or is being connected to\n",
address);
- return GNUNET_SYSERR;
+ return GNUNET_NO;
}
receiver = GNUNET_new (struct ReceiverAddress);
@@ -3054,14 +3070,15 @@ handle_ack_by_sender (void *cls, const struct
GNUNET_HashCode *key, void *value)
struct ReceiverAddress *receiver = value;
struct AckInfo *ai = cls;
- if (0 != GNUNET_memcmp(ai->sender, &receiver->target))
+ if (0 != GNUNET_memcmp (ai->sender, &receiver->target))
{
return GNUNET_YES;
}
- handle_ack((void*) ai->ack, key, receiver);
+ handle_ack ((void*) ai->ack, key, receiver);
return GNUNET_YES;
}
+
/**
* Function called when the transport service has received a
* backchannel message for this communicator (!) via a different return
@@ -3432,7 +3449,18 @@ run (void *cls,
COMMUNICATOR_CONFIG_SECTION,
"REKEY_MAX_BYTES",
&rekey_max_bytes))
+ {
rekey_max_bytes = DEFAULT_REKEY_MAX_BYTES;
+ }
+ disable_v6 = GNUNET_NO;
+ if ((GNUNET_NO == GNUNET_NETWORK_test_pf (PF_INET6)) ||
+ (GNUNET_YES ==
+ GNUNET_CONFIGURATION_get_value_yesno (cfg,
+ COMMUNICATOR_CONFIG_SECTION,
+ "DISABLE_V6")))
+ {
+ disable_v6 = GNUNET_YES;
+ }
in = udp_address_to_sockaddr (bindto, &in_len);
if (NULL == in)
diff --git a/src/service/transport/transport_api2_communication.c
b/src/service/transport/transport_api2_communication.c
index fe7e69158..e0fdad214 100644
--- a/src/service/transport/transport_api2_communication.c
+++ b/src/service/transport/transport_api2_communication.c
@@ -598,8 +598,16 @@ handle_create_queue (void *cls, const struct
GNUNET_TRANSPORT_CreateQueue *cq)
const char *addr = (const char *) &cq[1];
struct GNUNET_TRANSPORT_CreateQueueResponse *cqr;
struct GNUNET_MQ_Envelope *env;
+ int ret = ch->mq_init (ch->mq_init_cls, &cq->receiver, addr);
- if (GNUNET_OK != ch->mq_init (ch->mq_init_cls, &cq->receiver, addr))
+ if (GNUNET_NO == ret)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Address `%s' is already (beging) connected to.\n",
+ addr);
+ env = GNUNET_MQ_msg (cqr, GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_FAIL);
+ }
+ else if (GNUNET_SYSERR == ret)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Address `%s' invalid for this communicator\n",
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.