X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fcore%2Fcore_api.c;h=e9a38271bf317cce14072f629e842e521ca4fa6d;hb=9706e822ff61a85bf2353d2c233eb766ffc13323;hp=c3d7fd79859759f6a87a978c04c0588e6cf4f0ef;hpb=5c95af3375a6924e5714263ff8ef746602391e26;p=oweals%2Fgnunet.git diff --git a/src/core/core_api.c b/src/core/core_api.c index c3d7fd798..e9a38271b 100644 --- a/src/core/core_api.c +++ b/src/core/core_api.c @@ -544,6 +544,8 @@ request_next_transmission (struct PeerRecord *pr) trigger_next_request (h, GNUNET_NO); return; } + if (th->cm != NULL) + return; /* already done */ GNUNET_assert (pr->prev == NULL); GNUNET_assert (pr->next == NULL); pr->timeout_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining (th->timeout), @@ -919,7 +921,7 @@ main_notify_handler (void *cls, &cnm->peer, sizeof (struct GNUNET_PeerIdentity))) { - /* disconnect from self!? */ + /* connect to self!? */ GNUNET_break (0); return; } @@ -985,7 +987,6 @@ main_notify_handler (void *cls, if (NULL == h->status_events) { GNUNET_break (0); - break; } if (msize < sizeof (struct PeerStatusNotifyMessage)) { @@ -1038,14 +1039,7 @@ main_notify_handler (void *cls, return; } ntm = (const struct NotifyTrafficMessage *) msg; - if (0 == memcmp (&h->me, - &ntm->peer, - sizeof (struct GNUNET_PeerIdentity))) - { - /* self-change!? */ - GNUNET_break (0); - return; - } + ats_count = ntohl (ntm->ats_count); if ( (msize < sizeof (struct NotifyTrafficMessage) + ats_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information) + sizeof (struct GNUNET_MessageHeader)) || @@ -1237,7 +1231,13 @@ main_notify_handler (void *cls, return; } if (pr->rim_id != ntohl (cim->rim_id)) - break; + { +#if DEBUG_CORE + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Reservation ID mismatch in notification...\n"); +#endif + break; + } pcic = pr->pcic; pr->pcic = NULL; if (pcic != NULL) @@ -1478,9 +1478,9 @@ GNUNET_CORE_disconnect (struct GNUNET_CORE_Handle *handle) /** * Ask the core to call "notify" once it is ready to transmit the - * given number of bytes to the specified "target". If we are not yet - * connected to the specified peer, a call to this function will cause - * us to try to establish a connection. + * given number of bytes to the specified "target". Must only be + * called after a connection to the respective peer has been + * established (and the client has been informed about this). * * @param handle connection to core service * @param priority how important is the message? @@ -1524,6 +1524,7 @@ GNUNET_CORE_notify_transmit_ready (struct GNUNET_CORE_Handle *handle, GNUNET_SERVER_MAX_MESSAGE_SIZE); th = GNUNET_malloc (sizeof (struct GNUNET_CORE_TransmitHandle)); th->peer = pr; + GNUNET_assert(NULL != notify); th->get_message = notify; th->get_message_cls = notify_cls; th->timeout = GNUNET_TIME_relative_to_absolute (maxdelay); @@ -1715,7 +1716,9 @@ peer_request_connect_cont (void *cls, * @param peer who should we connect to * @param cont function to call once the request has been completed (or timed out) * @param cont_cls closure for cont - * @return NULL on error (cont will not be called), otherwise handle for cancellation + * + * @return NULL on error or already connected, + * otherwise handle for cancellation */ struct GNUNET_CORE_PeerRequestHandle * GNUNET_CORE_peer_request_connect (struct GNUNET_CORE_Handle *h, @@ -1727,6 +1730,11 @@ GNUNET_CORE_peer_request_connect (struct GNUNET_CORE_Handle *h, struct GNUNET_CORE_PeerRequestHandle *ret; struct ControlMessage *cm; struct ConnectMessage *msg; + + if (NULL != GNUNET_CONTAINER_multihashmap_get (h->peers, + &peer->hashPubKey)) + return NULL; /* Already connected, means callback should have happened already! */ + cm = GNUNET_malloc (sizeof (struct ControlMessage) + sizeof (struct ConnectMessage));