diff options
Diffstat (limited to 'src/core/gnunet-service-core_sessions.c')
-rw-r--r-- | src/core/gnunet-service-core_sessions.c | 128 |
1 files changed, 56 insertions, 72 deletions
diff --git a/src/core/gnunet-service-core_sessions.c b/src/core/gnunet-service-core_sessions.c index b379c3ac7..6e1494373 100644 --- a/src/core/gnunet-service-core_sessions.c +++ b/src/core/gnunet-service-core_sessions.c | |||
@@ -710,102 +710,86 @@ void | |||
710 | GSC_SESSIONS_handle_client_request_info (void *cls, struct GNUNET_SERVER_Client *client, | 710 | GSC_SESSIONS_handle_client_request_info (void *cls, struct GNUNET_SERVER_Client *client, |
711 | const struct GNUNET_MessageHeader *message) | 711 | const struct GNUNET_MessageHeader *message) |
712 | { | 712 | { |
713 | #if 0 | ||
714 | // FIXME! | ||
715 | const struct RequestInfoMessage *rcm; | 713 | const struct RequestInfoMessage *rcm; |
716 | struct GSC_Client *pos; | 714 | struct Session *session; |
717 | struct Neighbour *n; | ||
718 | struct ConfigurationInfoMessage cim; | 715 | struct ConfigurationInfoMessage cim; |
719 | int32_t want_reserv; | 716 | int32_t want_reserv; |
720 | int32_t got_reserv; | 717 | int32_t got_reserv; |
721 | unsigned long long old_preference; | ||
722 | struct GNUNET_TIME_Relative rdelay; | 718 | struct GNUNET_TIME_Relative rdelay; |
723 | 719 | ||
724 | rdelay = GNUNET_TIME_UNIT_ZERO; | 720 | rdelay = GNUNET_TIME_UNIT_ZERO; |
725 | #if DEBUG_CORE_CLIENT | 721 | #if DEBUG_CORE_CLIENT |
726 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Core service receives `%s' request.\n", | 722 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
723 | "Core service receives `%s' request.\n", | ||
727 | "REQUEST_INFO"); | 724 | "REQUEST_INFO"); |
728 | #endif | 725 | #endif |
729 | rcm = (const struct RequestInfoMessage *) message; | 726 | rcm = (const struct RequestInfoMessage *) message; |
730 | n = find_neighbour (&rcm->peer); | 727 | session = find_session (&rcm->peer); |
731 | memset (&cim, 0, sizeof (cim)); | 728 | if (NULL == session) |
732 | if ((n != NULL) && (GNUNET_YES == n->is_connected)) | ||
733 | { | ||
734 | want_reserv = ntohl (rcm->reserve_inbound); | ||
735 | if (n->bw_out_internal_limit.value__ != rcm->limit_outbound.value__) | ||
736 | { | ||
737 | n->bw_out_internal_limit = rcm->limit_outbound; | ||
738 | if (n->bw_out.value__ != | ||
739 | GNUNET_BANDWIDTH_value_min (n->bw_out_internal_limit, | ||
740 | n->bw_out_external_limit).value__) | ||
741 | { | ||
742 | n->bw_out = | ||
743 | GNUNET_BANDWIDTH_value_min (n->bw_out_internal_limit, | ||
744 | n->bw_out_external_limit); | ||
745 | GNUNET_BANDWIDTH_tracker_update_quota (&n->available_recv_window, | ||
746 | n->bw_out); | ||
747 | GNUNET_TRANSPORT_set_quota (transport, &n->peer, n->bw_in, n->bw_out); | ||
748 | handle_peer_status_change (n); | ||
749 | } | ||
750 | } | ||
751 | if (want_reserv < 0) | ||
752 | { | ||
753 | got_reserv = want_reserv; | ||
754 | } | ||
755 | else if (want_reserv > 0) | ||
756 | { | ||
757 | rdelay = | ||
758 | GNUNET_BANDWIDTH_tracker_get_delay (&n->available_recv_window, | ||
759 | want_reserv); | ||
760 | if (rdelay.rel_value == 0) | ||
761 | got_reserv = want_reserv; | ||
762 | else | ||
763 | got_reserv = 0; /* all or nothing */ | ||
764 | } | ||
765 | else | ||
766 | got_reserv = 0; | ||
767 | GNUNET_BANDWIDTH_tracker_consume (&n->available_recv_window, got_reserv); | ||
768 | old_preference = n->current_preference; | ||
769 | n->current_preference += GNUNET_ntohll (rcm->preference_change); | ||
770 | if (old_preference > n->current_preference) | ||
771 | { | ||
772 | /* overflow; cap at maximum value */ | ||
773 | n->current_preference = ULLONG_MAX; | ||
774 | } | ||
775 | update_preference_sum (n->current_preference - old_preference); | ||
776 | #if DEBUG_CORE_QUOTA | ||
777 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
778 | "Received reservation request for %d bytes for peer `%4s', reserved %d bytes, suggesting delay of %llu ms\n", | ||
779 | (int) want_reserv, GNUNET_i2s (&rcm->peer), (int) got_reserv, | ||
780 | (unsigned long long) rdelay.rel_value); | ||
781 | #endif | ||
782 | cim.reserved_amount = htonl (got_reserv); | ||
783 | cim.reserve_delay = GNUNET_TIME_relative_hton (rdelay); | ||
784 | cim.bw_out = n->bw_out; | ||
785 | cim.preference = n->current_preference; | ||
786 | } | ||
787 | else | ||
788 | { | 729 | { |
789 | /* Technically, this COULD happen (due to asynchronous behavior), | 730 | /* Technically, this COULD happen (due to asynchronous behavior), |
790 | * but it should be rare, so we should generate an info event | 731 | * but it should be rare, so we should generate an info event |
791 | * to help diagnosis of serious errors that might be masked by this */ | 732 | * to help diagnosis of serious errors that might be masked by this */ |
792 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 733 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
793 | _ | 734 | _("Client asked for preference change with peer `%s', which is not connected!\n"), |
794 | ("Client asked for preference change with peer `%s', which is not connected!\n"), | ||
795 | GNUNET_i2s (&rcm->peer)); | 735 | GNUNET_i2s (&rcm->peer)); |
796 | GNUNET_SERVER_receive_done (client, GNUNET_OK); | 736 | GNUNET_SERVER_receive_done (client, GNUNET_OK); |
797 | return; | 737 | return; |
798 | } | 738 | } |
739 | |||
740 | want_reserv = ntohl (rcm->reserve_inbound); | ||
741 | if (session->bw_out_internal_limit.value__ != rcm->limit_outbound.value__) | ||
742 | { | ||
743 | session->bw_out_internal_limit = rcm->limit_outbound; | ||
744 | if (session->bw_out.value__ != | ||
745 | GNUNET_BANDWIDTH_value_min (session->bw_out_internal_limit, | ||
746 | session->bw_out_external_limit).value__) | ||
747 | { | ||
748 | session->bw_out = | ||
749 | GNUNET_BANDWIDTH_value_min (session->bw_out_internal_limit, | ||
750 | session->bw_out_external_limit); | ||
751 | GNUNET_BANDWIDTH_tracker_update_quota (&session->available_recv_window, | ||
752 | session->bw_out); | ||
753 | #if 0 | ||
754 | // FIXME: who does this? | ||
755 | GNUNET_TRANSPORT_set_quota (transport, &session->peer, | ||
756 | session->bw_in, | ||
757 | session->bw_out); | ||
758 | #endif | ||
759 | } | ||
760 | } | ||
761 | if (want_reserv < 0) | ||
762 | { | ||
763 | got_reserv = want_reserv; | ||
764 | } | ||
765 | else if (want_reserv > 0) | ||
766 | { | ||
767 | rdelay = | ||
768 | GNUNET_BANDWIDTH_tracker_get_delay (&session->available_recv_window, | ||
769 | want_reserv); | ||
770 | if (rdelay.rel_value == 0) | ||
771 | got_reserv = want_reserv; | ||
772 | else | ||
773 | got_reserv = 0; /* all or nothing */ | ||
774 | } | ||
775 | else | ||
776 | got_reserv = 0; | ||
777 | GNUNET_BANDWIDTH_tracker_consume (&session->available_recv_window, got_reserv); | ||
778 | #if DEBUG_CORE_QUOTA | ||
779 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
780 | "Received reservation request for %d bytes for peer `%4s', reserved %d bytes, suggesting delay of %llu ms\n", | ||
781 | (int) want_reserv, GNUNET_i2s (&rcm->peer), (int) got_reserv, | ||
782 | (unsigned long long) rdelay.rel_value); | ||
783 | #endif | ||
799 | cim.header.size = htons (sizeof (struct ConfigurationInfoMessage)); | 784 | cim.header.size = htons (sizeof (struct ConfigurationInfoMessage)); |
800 | cim.header.type = htons (GNUNET_MESSAGE_TYPE_CORE_CONFIGURATION_INFO); | 785 | cim.header.type = htons (GNUNET_MESSAGE_TYPE_CORE_CONFIGURATION_INFO); |
801 | cim.peer = rcm->peer; | 786 | cim.reserved_amount = htonl (got_reserv); |
787 | cim.reserve_delay = GNUNET_TIME_relative_hton (rdelay); | ||
802 | cim.rim_id = rcm->rim_id; | 788 | cim.rim_id = rcm->rim_id; |
803 | #if DEBUG_CORE_CLIENT | 789 | cim.bw_out = session->bw_out; |
804 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message to client.\n", | 790 | cim.preference = 0; /* FIXME: remove */ |
805 | "CONFIGURATION_INFO"); | 791 | cim.peer = rcm->peer; |
806 | #endif | ||
807 | GSC_CLIENTS_send_to_client (client, &cim.header, GNUNET_NO); | 792 | GSC_CLIENTS_send_to_client (client, &cim.header, GNUNET_NO); |
808 | #endif | ||
809 | GNUNET_SERVER_receive_done (client, GNUNET_OK); | 793 | GNUNET_SERVER_receive_done (client, GNUNET_OK); |
810 | } | 794 | } |
811 | 795 | ||