aboutsummaryrefslogtreecommitdiff
path: root/src/core/gnunet-service-core_sessions.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/gnunet-service-core_sessions.c')
-rw-r--r--src/core/gnunet-service-core_sessions.c128
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
710GSC_SESSIONS_handle_client_request_info (void *cls, struct GNUNET_SERVER_Client *client, 710GSC_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