diff options
author | Christian Grothoff <christian@grothoff.org> | 2015-02-05 16:26:23 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2015-02-05 16:26:23 +0000 |
commit | 3d7aad54ba7e7d2e51f5090eabffb29715854ad8 (patch) | |
tree | 6d565f2b60e7e56d2e06be3e592b71fba7d8d5f8 /src/ats/gnunet-service-ats_preferences.c | |
parent | b2a4dcbce4f56046fbdcd4b114ec7a3feb4793fd (diff) | |
download | gnunet-3d7aad54ba7e7d2e51f5090eabffb29715854ad8.tar.gz gnunet-3d7aad54ba7e7d2e51f5090eabffb29715854ad8.zip |
separating out feedback from preferences
Diffstat (limited to 'src/ats/gnunet-service-ats_preferences.c')
-rw-r--r-- | src/ats/gnunet-service-ats_preferences.c | 168 |
1 files changed, 32 insertions, 136 deletions
diff --git a/src/ats/gnunet-service-ats_preferences.c b/src/ats/gnunet-service-ats_preferences.c index cf0082f9d..f0b50b0eb 100644 --- a/src/ats/gnunet-service-ats_preferences.c +++ b/src/ats/gnunet-service-ats_preferences.c | |||
@@ -17,9 +17,8 @@ | |||
17 | Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 17 | Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
18 | Boston, MA 02111-1307, USA. | 18 | Boston, MA 02111-1307, USA. |
19 | */ | 19 | */ |
20 | |||
21 | /** | 20 | /** |
22 | * @file ats/gnunet-service-ats_performance.c | 21 | * @file ats/gnunet-service-ats_preferences.c |
23 | * @brief ats service, interaction with 'performance' API | 22 | * @brief ats service, interaction with 'performance' API |
24 | * @author Matthias Wachs | 23 | * @author Matthias Wachs |
25 | * @author Christian Grothoff | 24 | * @author Christian Grothoff |
@@ -114,7 +113,6 @@ struct PreferenceClient | |||
114 | /** | 113 | /** |
115 | * Next in DLL | 114 | * Next in DLL |
116 | */ | 115 | */ |
117 | |||
118 | struct PreferenceClient *next; | 116 | struct PreferenceClient *next; |
119 | 117 | ||
120 | /** | 118 | /** |
@@ -133,10 +131,6 @@ struct PreferenceClient | |||
133 | double f_rel_sum[GNUNET_ATS_PreferenceCount]; | 131 | double f_rel_sum[GNUNET_ATS_PreferenceCount]; |
134 | 132 | ||
135 | /** | 133 | /** |
136 | * List of peer preferences for this client | ||
137 | */ | ||
138 | |||
139 | /** | ||
140 | * Head of peer list | 134 | * Head of peer list |
141 | */ | 135 | */ |
142 | struct PreferencePeer *p_head; | 136 | struct PreferencePeer *p_head; |
@@ -147,6 +141,7 @@ struct PreferenceClient | |||
147 | struct PreferencePeer *p_tail; | 141 | struct PreferencePeer *p_tail; |
148 | }; | 142 | }; |
149 | 143 | ||
144 | |||
150 | /** | 145 | /** |
151 | * Preference peer | 146 | * Preference peer |
152 | */ | 147 | */ |
@@ -194,7 +189,6 @@ struct PreferencePeer | |||
194 | */ | 189 | */ |
195 | static struct GNUNET_CONTAINER_MultiPeerMap *preference_peers; | 190 | static struct GNUNET_CONTAINER_MultiPeerMap *preference_peers; |
196 | 191 | ||
197 | |||
198 | /** | 192 | /** |
199 | * Clients in DLL: head | 193 | * Clients in DLL: head |
200 | */ | 194 | */ |
@@ -234,7 +228,7 @@ find_preference_client (void *client) | |||
234 | */ | 228 | */ |
235 | static void | 229 | static void |
236 | update_relative_values_for_peer (const struct GNUNET_PeerIdentity *id, | 230 | update_relative_values_for_peer (const struct GNUNET_PeerIdentity *id, |
237 | enum GNUNET_ATS_PreferenceKind kind, | 231 | enum GNUNET_ATS_PreferenceKind kind, |
238 | struct PeerRelative *rp) | 232 | struct PeerRelative *rp) |
239 | { | 233 | { |
240 | struct PreferenceClient *c_cur; | 234 | struct PreferenceClient *c_cur; |
@@ -283,7 +277,7 @@ update_relative_values_for_peer (const struct GNUNET_PeerIdentity *id, | |||
283 | /* No client had any preferences for this type and any peer */ | 277 | /* No client had any preferences for this type and any peer */ |
284 | rp->f_rel[kind] = DEFAULT_REL_PREFERENCE; | 278 | rp->f_rel[kind] = DEFAULT_REL_PREFERENCE; |
285 | } | 279 | } |
286 | if (backup != rp->f_rel[kind]) | 280 | if (backup != rp->f_rel[kind]) |
287 | GAS_normalized_preference_changed (&rp->id, kind, rp->f_rel[kind]); | 281 | GAS_normalized_preference_changed (&rp->id, kind, rp->f_rel[kind]); |
288 | } | 282 | } |
289 | } | 283 | } |
@@ -493,7 +487,7 @@ update_abs_preference (struct PreferenceClient *c, | |||
493 | * @param client the client | 487 | * @param client the client |
494 | */ | 488 | */ |
495 | void | 489 | void |
496 | GAS_addresses_preference_client_disconnect (void *client) | 490 | GAS_preference_client_disconnect (struct GNUNET_SERVER_Client *client) |
497 | { | 491 | { |
498 | struct GAS_Addresses_Preference_Clients *pc; | 492 | struct GAS_Addresses_Preference_Clients *pc; |
499 | 493 | ||
@@ -513,7 +507,6 @@ GAS_addresses_preference_client_disconnect (void *client) | |||
513 | } | 507 | } |
514 | 508 | ||
515 | 509 | ||
516 | |||
517 | /** | 510 | /** |
518 | * Change the preference for a peer | 511 | * Change the preference for a peer |
519 | * | 512 | * |
@@ -522,11 +515,11 @@ GAS_addresses_preference_client_disconnect (void *client) | |||
522 | * @param kind the preference kind to change | 515 | * @param kind the preference kind to change |
523 | * @param score_abs the new preference score | 516 | * @param score_abs the new preference score |
524 | */ | 517 | */ |
525 | void | 518 | static void |
526 | GAS_addresses_preference_change (void *client, | 519 | preference_change (void *client, |
527 | const struct GNUNET_PeerIdentity *peer, | 520 | const struct GNUNET_PeerIdentity *peer, |
528 | enum GNUNET_ATS_PreferenceKind kind, | 521 | enum GNUNET_ATS_PreferenceKind kind, |
529 | float score_abs) | 522 | float score_abs) |
530 | { | 523 | { |
531 | struct GAS_Addresses_Preference_Clients *pc; | 524 | struct GAS_Addresses_Preference_Clients *pc; |
532 | 525 | ||
@@ -604,114 +597,17 @@ GAS_handle_preference_change (void *cls, | |||
604 | 1, GNUNET_NO); | 597 | 1, GNUNET_NO); |
605 | pi = (const struct PreferenceInformation *) &msg[1]; | 598 | pi = (const struct PreferenceInformation *) &msg[1]; |
606 | for (i = 0; i < nump; i++) | 599 | for (i = 0; i < nump; i++) |
607 | GAS_addresses_preference_change (client, | 600 | preference_change (client, |
608 | &msg->peer, | 601 | &msg->peer, |
609 | (enum GNUNET_ATS_PreferenceKind) | 602 | (enum GNUNET_ATS_PreferenceKind) |
610 | ntohl (pi[i].preference_kind), | 603 | ntohl (pi[i].preference_kind), |
611 | pi[i].preference_value); | 604 | pi[i].preference_value); |
612 | GNUNET_SERVER_receive_done (client, GNUNET_OK); | 605 | GNUNET_SERVER_receive_done (client, GNUNET_OK); |
613 | } | 606 | } |
614 | 607 | ||
615 | 608 | ||
616 | |||
617 | |||
618 | /** | 609 | /** |
619 | * Change the preference for a peer | 610 | * Initialize preferences subsystem. |
620 | * | ||
621 | * @param application the client sending this request | ||
622 | * @param peer the peer id | ||
623 | * @param scope the time interval for this feedback: [now - scope .. now] | ||
624 | * @param kind the preference kind to change | ||
625 | * @param score_abs the new preference score | ||
626 | */ | ||
627 | void | ||
628 | GAS_addresses_preference_feedback (void *application, | ||
629 | const struct GNUNET_PeerIdentity *peer, | ||
630 | const struct GNUNET_TIME_Relative scope, | ||
631 | enum GNUNET_ATS_PreferenceKind kind, | ||
632 | float score_abs) | ||
633 | { | ||
634 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, | ||
635 | "Received `%s' for peer `%s' for client %p\n", | ||
636 | "PREFERENCE FEEDBACK", | ||
637 | GNUNET_i2s (peer), | ||
638 | application); | ||
639 | |||
640 | if (GNUNET_NO == | ||
641 | GNUNET_CONTAINER_multipeermap_contains (GSA_addresses, | ||
642 | peer)) | ||
643 | { | ||
644 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, | ||
645 | "Received `%s' for unknown peer `%s' from client %p\n", | ||
646 | "PREFERENCE FEEDBACK", | ||
647 | GNUNET_i2s (peer), | ||
648 | application); | ||
649 | return; | ||
650 | } | ||
651 | |||
652 | GAS_plugin_preference_feedback (application, | ||
653 | peer, | ||
654 | scope, | ||
655 | kind, | ||
656 | score_abs); | ||
657 | } | ||
658 | |||
659 | |||
660 | /** | ||
661 | * Handle 'preference feedback' messages from clients. | ||
662 | * | ||
663 | * @param cls unused, NULL | ||
664 | * @param client client that sent the request | ||
665 | * @param message the request message | ||
666 | */ | ||
667 | void | ||
668 | GAS_handle_preference_feedback (void *cls, | ||
669 | struct GNUNET_SERVER_Client *client, | ||
670 | const struct GNUNET_MessageHeader *message) | ||
671 | { | ||
672 | const struct FeedbackPreferenceMessage *msg; | ||
673 | const struct PreferenceInformation *pi; | ||
674 | uint16_t msize; | ||
675 | uint32_t nump; | ||
676 | uint32_t i; | ||
677 | |||
678 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
679 | "Received `%s' message\n", | ||
680 | "PREFERENCE_FEEDBACK"); | ||
681 | msize = ntohs (message->size); | ||
682 | if (msize < sizeof (struct FeedbackPreferenceMessage)) | ||
683 | { | ||
684 | GNUNET_break (0); | ||
685 | GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); | ||
686 | return; | ||
687 | } | ||
688 | msg = (const struct FeedbackPreferenceMessage *) message; | ||
689 | nump = ntohl (msg->num_feedback); | ||
690 | if (msize != | ||
691 | sizeof (struct FeedbackPreferenceMessage) + | ||
692 | nump * sizeof (struct PreferenceInformation)) | ||
693 | { | ||
694 | GNUNET_break (0); | ||
695 | GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); | ||
696 | return; | ||
697 | } | ||
698 | GNUNET_STATISTICS_update (GSA_stats, | ||
699 | "# preference feedbacks requests processed", | ||
700 | 1, GNUNET_NO); | ||
701 | pi = (const struct PreferenceInformation *) &msg[1]; | ||
702 | for (i = 0; i < nump; i++) | ||
703 | GAS_addresses_preference_feedback (client, | ||
704 | &msg->peer, | ||
705 | GNUNET_TIME_relative_ntoh(msg->scope), | ||
706 | (enum GNUNET_ATS_PreferenceKind) | ||
707 | ntohl (pi[i].preference_kind), | ||
708 | pi[i].preference_value); | ||
709 | GNUNET_SERVER_receive_done (client, GNUNET_OK); | ||
710 | } | ||
711 | |||
712 | |||
713 | /** | ||
714 | * Shutdown preferences subsystem. | ||
715 | */ | 611 | */ |
716 | void | 612 | void |
717 | GAS_preference_init () | 613 | GAS_preference_init () |
@@ -721,7 +617,6 @@ GAS_preference_init () | |||
721 | preference_peers = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO); | 617 | preference_peers = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO); |
722 | for (i = 0; i < GNUNET_ATS_PreferenceCount; i++) | 618 | for (i = 0; i < GNUNET_ATS_PreferenceCount; i++) |
723 | defvalues.f_rel[i] = DEFAULT_REL_PREFERENCE; | 619 | defvalues.f_rel[i] = DEFAULT_REL_PREFERENCE; |
724 | |||
725 | } | 620 | } |
726 | 621 | ||
727 | 622 | ||
@@ -734,14 +629,19 @@ GAS_preference_init () | |||
734 | * @return #GNUNET_OK to continue | 629 | * @return #GNUNET_OK to continue |
735 | */ | 630 | */ |
736 | static int | 631 | static int |
737 | free_peer (void *cls, const struct GNUNET_PeerIdentity *key, void *value) | 632 | free_peer (void *cls, |
633 | const struct GNUNET_PeerIdentity *key, | ||
634 | void *value) | ||
738 | { | 635 | { |
739 | struct PeerRelative *rp = value; | 636 | struct PeerRelative *rp = value; |
740 | if (GNUNET_YES | 637 | |
741 | == GNUNET_CONTAINER_multipeermap_remove (preference_peers, key, value)) | 638 | if (GNUNET_YES == |
742 | GNUNET_free(rp); | 639 | GNUNET_CONTAINER_multipeermap_remove (preference_peers, |
640 | key, | ||
641 | value)) | ||
642 | GNUNET_free (rp); | ||
743 | else | 643 | else |
744 | GNUNET_break(0); | 644 | GNUNET_break (0); |
745 | return GNUNET_OK; | 645 | return GNUNET_OK; |
746 | } | 646 | } |
747 | 647 | ||
@@ -751,6 +651,7 @@ free_client (struct PreferenceClient *pc) | |||
751 | { | 651 | { |
752 | struct PreferencePeer *next_p; | 652 | struct PreferencePeer *next_p; |
753 | struct PreferencePeer *p; | 653 | struct PreferencePeer *p; |
654 | |||
754 | next_p = pc->p_head; | 655 | next_p = pc->p_head; |
755 | while (NULL != (p = next_p)) | 656 | while (NULL != (p = next_p)) |
756 | { | 657 | { |
@@ -762,9 +663,6 @@ free_client (struct PreferenceClient *pc) | |||
762 | } | 663 | } |
763 | 664 | ||
764 | 665 | ||
765 | |||
766 | |||
767 | |||
768 | /** | 666 | /** |
769 | * Shutdown preferences subsystem. | 667 | * Shutdown preferences subsystem. |
770 | */ | 668 | */ |
@@ -780,7 +678,6 @@ GAS_preference_done () | |||
780 | GNUNET_SCHEDULER_cancel (aging_task); | 678 | GNUNET_SCHEDULER_cancel (aging_task); |
781 | aging_task = NULL; | 679 | aging_task = NULL; |
782 | } | 680 | } |
783 | |||
784 | next_pc = pc_head; | 681 | next_pc = pc_head; |
785 | while (NULL != (pc = next_pc)) | 682 | while (NULL != (pc = next_pc)) |
786 | { | 683 | { |
@@ -788,9 +685,9 @@ GAS_preference_done () | |||
788 | GNUNET_CONTAINER_DLL_remove(pc_head, pc_tail, pc); | 685 | GNUNET_CONTAINER_DLL_remove(pc_head, pc_tail, pc); |
789 | free_client (pc); | 686 | free_client (pc); |
790 | } | 687 | } |
791 | 688 | GNUNET_CONTAINER_multipeermap_iterate (preference_peers, | |
792 | GNUNET_CONTAINER_multipeermap_iterate (preference_peers, | 689 | &free_peer, |
793 | &free_peer, NULL); | 690 | NULL); |
794 | GNUNET_CONTAINER_multipeermap_destroy (preference_peers); | 691 | GNUNET_CONTAINER_multipeermap_destroy (preference_peers); |
795 | 692 | ||
796 | while (NULL != (pcur = preference_clients_head)) | 693 | while (NULL != (pcur = preference_clients_head)) |
@@ -809,8 +706,6 @@ GAS_preference_done () | |||
809 | } | 706 | } |
810 | 707 | ||
811 | 708 | ||
812 | |||
813 | |||
814 | /** | 709 | /** |
815 | * Normalize an updated preference value | 710 | * Normalize an updated preference value |
816 | * | 711 | * |
@@ -911,7 +806,8 @@ GAS_normalization_normalize_preference (void *client, | |||
911 | /* Start aging task */ | 806 | /* Start aging task */ |
912 | if (NULL == aging_task) | 807 | if (NULL == aging_task) |
913 | aging_task = GNUNET_SCHEDULER_add_delayed (PREF_AGING_INTERVAL, | 808 | aging_task = GNUNET_SCHEDULER_add_delayed (PREF_AGING_INTERVAL, |
914 | &preference_aging, NULL ); | 809 | &preference_aging, |
810 | NULL); | ||
915 | 811 | ||
916 | } | 812 | } |
917 | 813 | ||