aboutsummaryrefslogtreecommitdiff
path: root/src/transport
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2011-10-12 15:53:48 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2011-10-12 15:53:48 +0000
commitb9045bcd76169f111194a13fc4c581b436883556 (patch)
tree2c25177bd3f0921902e4c40076b88e5758b52691 /src/transport
parentbaf340d4b64a518aed93a22aba2af761d546e450 (diff)
downloadgnunet-b9045bcd76169f111194a13fc4c581b436883556.tar.gz
gnunet-b9045bcd76169f111194a13fc4c581b436883556.zip
more expiration
Diffstat (limited to 'src/transport')
-rw-r--r--src/transport/plugin_transport_udp.c204
1 files changed, 152 insertions, 52 deletions
diff --git a/src/transport/plugin_transport_udp.c b/src/transport/plugin_transport_udp.c
index c6ba8ef83..606eb45ce 100644
--- a/src/transport/plugin_transport_udp.c
+++ b/src/transport/plugin_transport_udp.c
@@ -136,7 +136,7 @@ struct Plugin;
136 * Session with another peer. FIXME: why not make this into 136 * Session with another peer. FIXME: why not make this into
137 * a regular 'struct Session' and pass it around!? 137 * a regular 'struct Session' and pass it around!?
138 */ 138 */
139struct PeerSession 139struct Session
140{ 140{
141 141
142 /** 142 /**
@@ -173,6 +173,7 @@ struct PeerSession
173 173
174 struct GNUNET_TIME_Absolute valid_until; 174 struct GNUNET_TIME_Absolute valid_until;
175 175
176 GNUNET_SCHEDULER_TaskIdentifier invalidation_task;
176}; 177};
177 178
178 179
@@ -304,7 +305,7 @@ struct Plugin
304 305
305struct PeerSessionIteratorContext 306struct PeerSessionIteratorContext
306{ 307{
307 struct PeerSession * result; 308 struct Session * result;
308 const void * addr; 309 const void * addr;
309 size_t addrlen; 310 size_t addrlen;
310}; 311};
@@ -317,7 +318,7 @@ struct PeerSessionIteratorContext
317 * @param peer peer's identity 318 * @param peer peer's identity
318 * @return NULL if we have no session 319 * @return NULL if we have no session
319 */ 320 */
320struct PeerSession * 321struct Session *
321find_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *peer) 322find_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *peer)
322{ 323{
323 return GNUNET_CONTAINER_multihashmap_get (plugin->sessions, 324 return GNUNET_CONTAINER_multihashmap_get (plugin->sessions,
@@ -329,7 +330,7 @@ int inbound_session_iterator (void *cls,
329 void *value) 330 void *value)
330{ 331{
331 struct PeerSessionIteratorContext *psc = cls; 332 struct PeerSessionIteratorContext *psc = cls;
332 struct PeerSession *s = value; 333 struct Session *s = value;
333 if (s->addrlen == psc->addrlen) 334 if (s->addrlen == psc->addrlen)
334 { 335 {
335 if (0 == memcmp (&s[1], psc->addr, s->addrlen)) 336 if (0 == memcmp (&s[1], psc->addr, s->addrlen))
@@ -348,7 +349,7 @@ int inbound_session_iterator (void *cls,
348 * @param peer peer's identity 349 * @param peer peer's identity
349 * @return NULL if we have no session 350 * @return NULL if we have no session
350 */ 351 */
351struct PeerSession * 352struct Session *
352find_inbound_session (struct Plugin *plugin, 353find_inbound_session (struct Plugin *plugin,
353 const struct GNUNET_PeerIdentity *peer, 354 const struct GNUNET_PeerIdentity *peer,
354 const void * addr, size_t addrlen) 355 const void * addr, size_t addrlen)
@@ -364,6 +365,44 @@ find_inbound_session (struct Plugin *plugin,
364 365
365 366
366/** 367/**
368 * Destroy a session, plugin is being unloaded.
369 *
370 * @param cls unused
371 * @param key hash of public key of target peer
372 * @param value a 'struct PeerSession*' to clean up
373 * @return GNUNET_OK (continue to iterate)
374 */
375static int
376destroy_session (void *cls, const GNUNET_HashCode * key, void *value)
377{
378 struct Session *peer_session = value;
379
380 if (peer_session->frag != NULL)
381 GNUNET_FRAGMENT_context_destroy (peer_session->frag);
382 GNUNET_free (peer_session);
383 return GNUNET_OK;
384}
385
386/**
387 * Destroy a session, plugin is being unloaded.
388 *
389 * @param cls unused
390 * @param key hash of public key of target peer
391 * @param value a 'struct PeerSession*' to clean up
392 * @return GNUNET_OK (continue to iterate)
393 */
394static int
395destroy_inbound_session (void *cls, const GNUNET_HashCode * key, void *value)
396{
397 struct Session *s = value;
398
399 if (s->invalidation_task != GNUNET_SCHEDULER_NO_TASK)
400 GNUNET_SCHEDULER_cancel(s->invalidation_task);
401 GNUNET_free (s);
402 return GNUNET_OK;
403}
404
405/**
367 * Disconnect from a remote node. Clean up session if we have one for this peer 406 * Disconnect from a remote node. Clean up session if we have one for this peer
368 * 407 *
369 * @param cls closure for this call (should be handle to Plugin) 408 * @param cls closure for this call (should be handle to Plugin)
@@ -374,7 +413,7 @@ static void
374udp_disconnect (void *cls, const struct GNUNET_PeerIdentity *target) 413udp_disconnect (void *cls, const struct GNUNET_PeerIdentity *target)
375{ 414{
376 struct Plugin *plugin = cls; 415 struct Plugin *plugin = cls;
377 struct PeerSession *session; 416 struct Session *session;
378 417
379 session = find_session (plugin, target); 418 session = find_session (plugin, target);
380 if (NULL == session) 419 if (NULL == session)
@@ -383,6 +422,14 @@ udp_disconnect (void *cls, const struct GNUNET_PeerIdentity *target)
383 GNUNET_CONTAINER_multihashmap_remove (plugin->sessions, 422 GNUNET_CONTAINER_multihashmap_remove (plugin->sessions,
384 &target->hashPubKey, 423 &target->hashPubKey,
385 session)); 424 session));
425
426 GNUNET_CONTAINER_multihashmap_get_multiple (plugin->inbound_sessions,
427 &target->hashPubKey,
428 &destroy_inbound_session, NULL);
429 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "sendto");
430 LOG (GNUNET_ERROR_TYPE_ERROR,
431 "UDP DISCONNECT\n");
432
386 plugin->last_expected_delay = GNUNET_FRAGMENT_context_destroy (session->frag); 433 plugin->last_expected_delay = GNUNET_FRAGMENT_context_destroy (session->frag);
387 if (session->cont != NULL) 434 if (session->cont != NULL)
388 session->cont (session->cont_cls, target, GNUNET_SYSERR); 435 session->cont (session->cont_cls, target, GNUNET_SYSERR);
@@ -426,7 +473,14 @@ udp_send (struct Plugin *plugin, const struct sockaddr *sa,
426 return 0; 473 return 0;
427 } 474 }
428 if (GNUNET_SYSERR == sent) 475 if (GNUNET_SYSERR == sent)
476 {
429 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "sendto"); 477 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "sendto");
478 LOG (GNUNET_ERROR_TYPE_ERROR,
479 "UDP transmited %u-byte message to %s (%d: %s)\n",
480 (unsigned int) ntohs (msg->size), GNUNET_a2s (sa, slen),
481 (int) sent, (sent < 0) ? STRERROR (errno) : "ok");
482
483 }
430 LOG (GNUNET_ERROR_TYPE_DEBUG, 484 LOG (GNUNET_ERROR_TYPE_DEBUG,
431 "UDP transmited %u-byte message to %s (%d: %s)\n", 485 "UDP transmited %u-byte message to %s (%d: %s)\n",
432 (unsigned int) ntohs (msg->size), GNUNET_a2s (sa, slen), 486 (unsigned int) ntohs (msg->size), GNUNET_a2s (sa, slen),
@@ -447,18 +501,18 @@ udp_send (struct Plugin *plugin, const struct sockaddr *sa,
447static void 501static void
448send_fragment (void *cls, const struct GNUNET_MessageHeader *msg) 502send_fragment (void *cls, const struct GNUNET_MessageHeader *msg)
449{ 503{
450 struct PeerSession *session = cls; 504 struct Session *session = cls;
451 505
452 udp_send (session->plugin, session->sock_addr, msg); 506 udp_send (session->plugin, session->sock_addr, msg);
453 GNUNET_FRAGMENT_context_transmission_done (session->frag); 507 GNUNET_FRAGMENT_context_transmission_done (session->frag);
454} 508}
455 509
456static struct PeerSession * 510static struct Session *
457create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target, 511create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
458 const void *addr, size_t addrlen, 512 const void *addr, size_t addrlen,
459 GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls) 513 GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls)
460{ 514{
461 struct PeerSession * peer_session; 515 struct Session * peer_session;
462 const struct IPv4UdpAddress *t4; 516 const struct IPv4UdpAddress *t4;
463 const struct IPv6UdpAddress *t6; 517 const struct IPv6UdpAddress *t6;
464 struct sockaddr_in *v4; 518 struct sockaddr_in *v4;
@@ -474,7 +528,7 @@ create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
474 } 528 }
475 t4 = addr; 529 t4 = addr;
476 peer_session = 530 peer_session =
477 GNUNET_malloc (sizeof (struct PeerSession) + 531 GNUNET_malloc (sizeof (struct Session) +
478 sizeof (struct sockaddr_in)); 532 sizeof (struct sockaddr_in));
479 len = sizeof (struct sockaddr_in); 533 len = sizeof (struct sockaddr_in);
480 v4 = (struct sockaddr_in *) &peer_session[1]; 534 v4 = (struct sockaddr_in *) &peer_session[1];
@@ -492,7 +546,7 @@ create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
492 } 546 }
493 t6 = addr; 547 t6 = addr;
494 peer_session = 548 peer_session =
495 GNUNET_malloc (sizeof (struct PeerSession) + 549 GNUNET_malloc (sizeof (struct Session) +
496 sizeof (struct sockaddr_in6)); 550 sizeof (struct sockaddr_in6));
497 len = sizeof (struct sockaddr_in6); 551 len = sizeof (struct sockaddr_in6);
498 v6 = (struct sockaddr_in6 *) &peer_session[1]; 552 v6 = (struct sockaddr_in6 *) &peer_session[1];
@@ -509,6 +563,8 @@ create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
509 return NULL; 563 return NULL;
510 } 564 }
511 565
566 peer_session->valid_until = GNUNET_TIME_absolute_get_zero ();
567 peer_session->invalidation_task = GNUNET_SCHEDULER_NO_TASK;
512 peer_session->addrlen = len; 568 peer_session->addrlen = len;
513 peer_session->target = *target; 569 peer_session->target = *target;
514 peer_session->plugin = plugin; 570 peer_session->plugin = plugin;
@@ -554,8 +610,8 @@ udp_plugin_send (void *cls, const struct GNUNET_PeerIdentity *target,
554 GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls) 610 GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls)
555{ 611{
556 struct Plugin *plugin = cls; 612 struct Plugin *plugin = cls;
557 struct PeerSession *peer_session; 613 struct Session *peer_session;
558 struct PeerSession *inbound_session; 614 struct Session *s;
559 const struct IPv4UdpAddress *t4; 615 const struct IPv4UdpAddress *t4;
560 const struct IPv6UdpAddress *t6; 616 const struct IPv6UdpAddress *t6;
561 size_t mlen = msgbuf_size + sizeof (struct UDPMessage); 617 size_t mlen = msgbuf_size + sizeof (struct UDPMessage);
@@ -578,15 +634,35 @@ udp_plugin_send (void *cls, const struct GNUNET_PeerIdentity *target,
578 /* safety check: comparing address to address stored in session */ 634 /* safety check: comparing address to address stored in session */
579 if ((session != NULL) && (addr != NULL) && (addrlen != 0)) 635 if ((session != NULL) && (addr != NULL) && (addrlen != 0))
580 { 636 {
581 inbound_session = (struct PeerSession *) session; 637 s = session;
582 /* session timed out */ 638 /* session timed out */
583 if (GNUNET_TIME_absolute_get().abs_value > inbound_session->valid_until.abs_value) 639 /*
640 if (GNUNET_TIME_absolute_get().abs_value > s->valid_until.abs_value)
584 { 641 {
585 /* TODO: remove session */ 642 LOG (GNUNET_ERROR_TYPE_ERROR,
586 if (force_address == GNUNET_SYSERR) 643 "UDP Session %X is invalid %u\n", session, force_address);
587 return GNUNET_SYSERR; 644
588 } 645 plugin->env->session_end (plugin->env->cls, &s->target, s);
589 if (0 != memcmp (&inbound_session->target, target, sizeof (struct GNUNET_PeerIdentity))) 646 GNUNET_CONTAINER_multihashmap_remove (plugin->inbound_sessions, &s->target.hashPubKey, s);
647
648 if (s->invalidation_task != GNUNET_SCHEDULER_NO_TASK)
649 {
650 if (s->invalidation_task != GNUNET_SCHEDULER_NO_TASK)
651 GNUNET_SCHEDULER_cancel(s->invalidation_task);
652
653 }
654 GNUNET_free (s);
655 if ((force_address != GNUNET_SYSERR) && (addr != NULL) && (addrlen != 0))
656 {
657 LOG (GNUNET_ERROR_TYPE_ERROR,
658 "goto session_invalid: %X %u %s\n", addr, addrlen, udp_address_to_string(NULL, addr, addrlen));
659 goto session_invalid;
660 }
661 LOG (GNUNET_ERROR_TYPE_ERROR,
662 "return GNUNET_SYSERR;\n");
663 return GNUNET_SYSERR;
664 }*/
665 if (0 != memcmp (&s->target, target, sizeof (struct GNUNET_PeerIdentity)))
590 return GNUNET_SYSERR; 666 return GNUNET_SYSERR;
591 switch (addrlen) 667 switch (addrlen)
592 { 668 {
@@ -598,9 +674,9 @@ udp_plugin_send (void *cls, const struct GNUNET_PeerIdentity *target,
598 return GNUNET_SYSERR; 674 return GNUNET_SYSERR;
599 } 675 }
600 t4 = addr; 676 t4 = addr;
601 if (inbound_session->addrlen != (sizeof (struct sockaddr_in))) 677 if (s->addrlen != (sizeof (struct sockaddr_in)))
602 return GNUNET_SYSERR; 678 return GNUNET_SYSERR;
603 struct sockaddr_in *a4 = (struct sockaddr_in *) inbound_session->sock_addr; 679 struct sockaddr_in *a4 = (struct sockaddr_in *) s->sock_addr;
604 GNUNET_assert (a4->sin_port == t4->u4_port); 680 GNUNET_assert (a4->sin_port == t4->u4_port);
605 GNUNET_assert (0 == memcmp(&a4->sin_addr, &t4->ipv4_addr, sizeof (struct in_addr))); 681 GNUNET_assert (0 == memcmp(&a4->sin_addr, &t4->ipv4_addr, sizeof (struct in_addr)));
606 LOG (GNUNET_ERROR_TYPE_DEBUG, 682 LOG (GNUNET_ERROR_TYPE_DEBUG,
@@ -614,8 +690,8 @@ udp_plugin_send (void *cls, const struct GNUNET_PeerIdentity *target,
614 return GNUNET_SYSERR; 690 return GNUNET_SYSERR;
615 } 691 }
616 t6 = addr; 692 t6 = addr;
617 GNUNET_assert (inbound_session->addrlen == sizeof (struct sockaddr_in6)); 693 GNUNET_assert (s->addrlen == sizeof (struct sockaddr_in6));
618 struct sockaddr_in6 *a6 = (struct sockaddr_in6 *) inbound_session->sock_addr; 694 struct sockaddr_in6 *a6 = (struct sockaddr_in6 *) s->sock_addr;
619 GNUNET_assert (a6->sin6_port == t6->u6_port); 695 GNUNET_assert (a6->sin6_port == t6->u6_port);
620 GNUNET_assert (0 == memcmp(&a6->sin6_addr, &t6->ipv6_addr, sizeof (struct in6_addr))); 696 GNUNET_assert (0 == memcmp(&a6->sin6_addr, &t6->ipv6_addr, sizeof (struct in6_addr)));
621 LOG (GNUNET_ERROR_TYPE_DEBUG, 697 LOG (GNUNET_ERROR_TYPE_DEBUG,
@@ -626,7 +702,7 @@ udp_plugin_send (void *cls, const struct GNUNET_PeerIdentity *target,
626 GNUNET_break_op (0); 702 GNUNET_break_op (0);
627 } 703 }
628 } 704 }
629 705//session_invalid:
630 peer_session = create_session (plugin, target, addr, addrlen, cont, cont_cls); 706 peer_session = create_session (plugin, target, addr, addrlen, cont, cont_cls);
631 if (peer_session == NULL) 707 if (peer_session == NULL)
632 { 708 {
@@ -687,7 +763,7 @@ struct SourceInformation
687 */ 763 */
688 size_t args; 764 size_t args;
689 765
690 struct PeerSession * session; 766 struct Session * session;
691}; 767};
692 768
693 769
@@ -714,11 +790,24 @@ process_inbound_tokenized_messages (void *cls, void *client,
714 distance[1].value = htonl (0); 790 distance[1].value = htonl (0);
715 791
716 LOG (GNUNET_ERROR_TYPE_DEBUG, 792 LOG (GNUNET_ERROR_TYPE_DEBUG,
717 "Giving Session %X %s to transport\n", (struct Session *) si->session, GNUNET_i2s(&si->session->target)); 793 "Giving Session %X %s to transport\n", si->session, GNUNET_i2s(&si->session->target));
718 plugin->env->receive (plugin->env->cls, &si->sender, hdr, distance, 2, (struct Session *) si->session, 794 plugin->env->receive (plugin->env->cls, &si->sender, hdr, distance, 2, si->session,
719 si->arg, si->args); 795 si->arg, si->args);
720} 796}
721 797
798static void
799invalidation_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
800{
801 struct Session * s = cls;
802 s->invalidation_task = GNUNET_SCHEDULER_NO_TASK;
803 LOG (GNUNET_ERROR_TYPE_ERROR,
804 "Session %X (`%s') is now invalid\n", s, GNUNET_a2s (s->sock_addr,s->addrlen));
805
806// s->plugin->env->session_end(s->plugin->env->cls, &s->target, s);
807// GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove(s->plugin->inbound_sessions, &s->target.hashPubKey, s));
808// GNUNET_free (s);
809}
810
722 811
723/** 812/**
724 * We've received a UDP Message. Process it (pass contents to main service). 813 * We've received a UDP Message. Process it (pass contents to main service).
@@ -787,7 +876,7 @@ process_udp_message (struct Plugin *plugin, const struct UDPMessage *msg,
787 GNUNET_i2s (&udp_msg->sender), 876 GNUNET_i2s (&udp_msg->sender),
788 udp_address_to_string(NULL, arg, args)); 877 udp_address_to_string(NULL, arg, args));
789 878
790 struct PeerSession * s = NULL; 879 struct Session * s = NULL;
791 s = find_inbound_session (plugin, &udp_msg->sender, sender_addr, sender_addr_len); 880 s = find_inbound_session (plugin, &udp_msg->sender, sender_addr, sender_addr_len);
792 881
793 if (s != NULL) 882 if (s != NULL)
@@ -812,8 +901,18 @@ process_udp_message (struct Plugin *plugin, const struct UDPMessage *msg,
812 s, 901 s,
813 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)); 902 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
814 } 903 }
815 s->valid_until = GNUNET_TIME_absolute_add(GNUNET_TIME_absolute_get(), GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT); 904 //s->valid_until = GNUNET_TIME_absolute_add(GNUNET_TIME_absolute_get(), GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
816 905 struct GNUNET_TIME_Relative delay = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 10);
906 s->valid_until = GNUNET_TIME_absolute_add(GNUNET_TIME_absolute_get(), delay);
907 if (s->invalidation_task != GNUNET_SCHEDULER_NO_TASK)
908 {
909 GNUNET_SCHEDULER_cancel(s->invalidation_task);
910 s->invalidation_task = GNUNET_SCHEDULER_NO_TASK;
911 LOG (GNUNET_ERROR_TYPE_ERROR,
912 "Rescheduling %X' `%s'\n",
913 s, udp_address_to_string(NULL, arg, args));
914 }
915 s->invalidation_task = GNUNET_SCHEDULER_add_delayed(delay, &invalidation_task, s);
817 /* iterate over all embedded messages */ 916 /* iterate over all embedded messages */
818 si.sender = msg->sender; 917 si.sender = msg->sender;
819 si.arg = arg; 918 si.arg = arg;
@@ -947,7 +1046,7 @@ udp_read (struct Plugin *plugin, struct GNUNET_NETWORK_Handle *rsock)
947 ssize_t ret; 1046 ssize_t ret;
948 const struct GNUNET_MessageHeader *msg; 1047 const struct GNUNET_MessageHeader *msg;
949 const struct GNUNET_MessageHeader *ack; 1048 const struct GNUNET_MessageHeader *ack;
950 struct PeerSession *peer_session; 1049 struct Session *peer_session;
951 const struct UDPMessage *udp; 1050 const struct UDPMessage *udp;
952 struct ReceiveContext *rc; 1051 struct ReceiveContext *rc;
953 struct GNUNET_TIME_Absolute now; 1052 struct GNUNET_TIME_Absolute now;
@@ -963,12 +1062,12 @@ udp_read (struct Plugin *plugin, struct GNUNET_NETWORK_Handle *rsock)
963 GNUNET_break_op (0); 1062 GNUNET_break_op (0);
964 return; 1063 return;
965 } 1064 }
966#if DEBUG_UDP
967 LOG (GNUNET_ERROR_TYPE_DEBUG,
968 "UDP received %u-byte message from `%s'\n", (unsigned int) ret,
969 GNUNET_a2s ((const struct sockaddr *) addr, fromlen));
970#endif
971 msg = (const struct GNUNET_MessageHeader *) buf; 1065 msg = (const struct GNUNET_MessageHeader *) buf;
1066
1067 LOG (GNUNET_ERROR_TYPE_DEBUG,
1068 "UDP received %u-byte message from `%s' type %i\n", (unsigned int) ret,
1069 GNUNET_a2s ((const struct sockaddr *) addr, fromlen), ntohs(msg->type));
1070
972 if (ret != ntohs (msg->size)) 1071 if (ret != ntohs (msg->size))
973 { 1072 {
974 GNUNET_break_op (0); 1073 GNUNET_break_op (0);
@@ -1641,24 +1740,25 @@ libgnunet_plugin_transport_udp_init (void *cls)
1641 return api; 1740 return api;
1642} 1741}
1643 1742
1743/*
1644 1744
1645/** 1745static void invalidation_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1646 * Destroy a session, plugin is being unloaded.
1647 *
1648 * @param cls unused
1649 * @param key hash of public key of target peer
1650 * @param value a 'struct PeerSession*' to clean up
1651 * @return GNUNET_OK (continue to iterate)
1652 */
1653static int
1654destroy_session (void *cls, const GNUNET_HashCode * key, void *value)
1655{ 1746{
1656 struct PeerSession *peer_session = value; 1747 struct Session * s = cls;
1748 struct Plugin * plugin = s->plugin;
1657 1749
1658 GNUNET_FRAGMENT_context_destroy (peer_session->frag); 1750 s->invalidation_task = GNUNET_SCHEDULER_NO_TASK;
1659 GNUNET_free (peer_session); 1751
1660 return GNUNET_OK; 1752 GNUNET_CONTAINER_multihashmap_remove (plugin->inbound_sessions, &s->target.hashPubKey, s);
1753
1754
1755 plugin->env->session_end (plugin->env->cls, &s->target, s);
1756 LOG (GNUNET_ERROR_TYPE_ERROR,
1757 "Session %X is now invalid\n", s);
1758 destroy_session(s, &s->target.hashPubKey, s);
1661} 1759}
1760*/
1761
1662 1762
1663 1763
1664/** 1764/**
@@ -1679,7 +1779,7 @@ libgnunet_plugin_transport_udp_done (void *cls)
1679 NULL); 1779 NULL);
1680 GNUNET_CONTAINER_multihashmap_destroy (plugin->sessions); 1780 GNUNET_CONTAINER_multihashmap_destroy (plugin->sessions);
1681 plugin->sessions = NULL; 1781 plugin->sessions = NULL;
1682 GNUNET_CONTAINER_multihashmap_iterate (plugin->inbound_sessions, &destroy_session, 1782 GNUNET_CONTAINER_multihashmap_iterate (plugin->inbound_sessions, &destroy_inbound_session,
1683 NULL); 1783 NULL);
1684 GNUNET_CONTAINER_multihashmap_destroy (plugin->inbound_sessions); 1784 GNUNET_CONTAINER_multihashmap_destroy (plugin->inbound_sessions);
1685 plugin->inbound_sessions = NULL; 1785 plugin->inbound_sessions = NULL;