struct GNUNET_MQ_Envelope *env;
struct GNUNET_CADET_ConnectionBrokenMessage *bm;
+ if (NULL == target->mqm)
+ return; /* Can't send notification, connection is down! */
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Notifying %s about BROKEN route at %s-%s of connection %s\n",
GCP_2s (target->hop),
bm->peer1 = *peer1;
if (NULL != peer2)
bm->peer2 = *peer2;
+
GCP_request_mq_cancel (target->mqm,
env);
target->mqm = NULL;
{
/* Duplicate CREATE, pass it on, previous one might have been lost! */
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Passing on duplicate CREATE message on connection %s\n",
+ "Passing on duplicate CADET_CONNECTION_CREATE message on connection %s\n",
GNUNET_sh2s (&msg->cid.connection_of_tunnel));
route_message (sender,
&msg->cid,
if (NULL != cc)
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received duplicate CREATE message on connection %s\n",
+ "Received duplicate CADET_CONNECTION_CREATE message on connection %s\n",
GNUNET_sh2s (&msg->cid.connection_of_tunnel));
GCC_handle_duplicate_create (cc);
return;
}
- path = GCPP_get_path_from_route (path_length - 1,
- pids);
origin = GCP_get (&pids[0],
GNUNET_YES);
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received CREATE message from %s via path %s for connection %s\n",
+ "Received CADET_CONNECTION_CREATE message from %s for connection %s, building inverse path\n",
GCP_2s (origin),
- GCPP_2s (path),
GNUNET_sh2s (&msg->cid.connection_of_tunnel));
- GCT_add_inbound_connection (GCT_create_tunnel (origin),
- &msg->cid,
- path);
+ path = GCPP_get_path_from_route (path_length - 1,
+ pids);
+ if (GNUNET_OK !=
+ GCT_add_inbound_connection (GCP_get_tunnel (origin,
+ GNUNET_YES),
+ &msg->cid,
+ path))
+ {
+ /* Send back BROKEN: duplicate connection on the same path,
+ we will use the other one. */
+ struct GNUNET_MQ_Envelope *env;
+ struct GNUNET_CADET_ConnectionBrokenMessage *bm;
+
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Received CADET_CONNECTION_CREATE from %s for %s, but %s already has a connection. Sending BROKEN\n",
+ GCP_2s (sender),
+ GNUNET_sh2s (&msg->cid.connection_of_tunnel),
+ GCPP_2s (path));
+ env = GNUNET_MQ_msg (bm,
+ GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN);
+ bm->cid = msg->cid;
+ bm->peer1 = my_full_id;
+ GCP_send_ooo (sender,
+ env);
+ return;
+ }
return;
}
/* We are merely a hop on the way, check if we can support the route */
struct GNUNET_CADET_ConnectionBrokenMessage *bm;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received CONNECTION_CREATE from %s for %s. Next hop %s:%u is down. Sending BROKEN\n",
+ "Received CADET_CONNECTION_CREATE from %s for %s. Next hop %s:%u is down. Sending BROKEN\n",
GCP_2s (sender),
GNUNET_sh2s (&msg->cid.connection_of_tunnel),
GNUNET_i2s (&pids[off + 1]),
/* Workable route, create routing entry */
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received CONNECTION_CREATE from %s for %s. Next hop %s:%u is up. Creating route\n",
+ "Received CADET_CONNECTION_CREATE from %s for %s. Next hop %s:%u is up. Creating route\n",
GCP_2s (sender),
GNUNET_sh2s (&msg->cid.connection_of_tunnel),
GNUNET_i2s (&pids[off + 1]),
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Received CONNECTION_BROKEN for connection %s. Destroying it.\n",
GNUNET_sh2s (&msg->cid.connection_of_tunnel));
- GCC_destroy (cc);
+ GCC_destroy_without_core (cc);
/* FIXME: also destroy the path up to the specified link! */
return;
"Received CONNECTION_DESTROY for connection %s. Destroying connection.\n",
GNUNET_sh2s (&msg->cid.connection_of_tunnel));
- GCC_destroy (cc);
+ GCC_destroy_without_core (cc);
return;
}