diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2011-10-12 15:53:48 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2011-10-12 15:53:48 +0000 |
commit | b9045bcd76169f111194a13fc4c581b436883556 (patch) | |
tree | 2c25177bd3f0921902e4c40076b88e5758b52691 | |
parent | baf340d4b64a518aed93a22aba2af761d546e450 (diff) | |
download | gnunet-b9045bcd76169f111194a13fc4c581b436883556.tar.gz gnunet-b9045bcd76169f111194a13fc4c581b436883556.zip |
more expiration
-rw-r--r-- | src/transport/plugin_transport_udp.c | 204 |
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 | */ |
139 | struct PeerSession | 139 | struct 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 | ||
305 | struct PeerSessionIteratorContext | 306 | struct 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 | */ |
320 | struct PeerSession * | 321 | struct Session * |
321 | find_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *peer) | 322 | find_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 | */ |
351 | struct PeerSession * | 352 | struct Session * |
352 | find_inbound_session (struct Plugin *plugin, | 353 | find_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 | */ | ||
375 | static int | ||
376 | destroy_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 | */ | ||
394 | static int | ||
395 | destroy_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 | |||
374 | udp_disconnect (void *cls, const struct GNUNET_PeerIdentity *target) | 413 | udp_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, | |||
447 | static void | 501 | static void |
448 | send_fragment (void *cls, const struct GNUNET_MessageHeader *msg) | 502 | send_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 | ||
456 | static struct PeerSession * | 510 | static struct Session * |
457 | create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target, | 511 | create_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 | ||
798 | static void | ||
799 | invalidation_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 | /** | 1745 | static 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 | */ | ||
1653 | static int | ||
1654 | destroy_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; |