-/* ****************** GNUNET_CORE_peer_change_preference ******************** */
-
-
-struct GNUNET_CORE_InformationRequestContext
-{
-
- /**
- * Our connection to the service.
- */
- struct GNUNET_CORE_Handle *h;
-
- /**
- * Link to control message, NULL if CM was sent.
- */
- struct ControlMessage *cm;
-
- /**
- * Link to peer record.
- */
- struct PeerRecord *pr;
-};
-
-
-/**
- * CM was sent, remove link so we don't double-free.
- *
- * @param cls the 'struct GNUNET_CORE_InformationRequestContext'
- * @param success were we successful?
- */
-static void
-change_preference_send_continuation (void *cls, int success)
-{
- struct GNUNET_CORE_InformationRequestContext *irc = cls;
-
- irc->cm = NULL;
-}
-
-
-/**
- * Obtain statistics and/or change preferences for the given peer.
- *
- * @param h core handle
- * @param peer identifies the peer
- * @param amount reserve N bytes for receiving, negative
- * amounts can be used to undo a (recent) reservation;
- * @param preference increase incoming traffic share preference by this amount;
- * in the absence of "amount" reservations, we use this
- * preference value to assign proportional bandwidth shares
- * to all connected peers
- * @param info function to call with the resulting configuration information
- * @param info_cls closure for info
- * @return NULL on error
- */
-struct GNUNET_CORE_InformationRequestContext *
-GNUNET_CORE_peer_change_preference (struct GNUNET_CORE_Handle *h,
- const struct GNUNET_PeerIdentity *peer,
- int32_t amount, uint64_t preference,
- GNUNET_CORE_PeerConfigurationInfoCallback
- info, void *info_cls)
-{
- struct GNUNET_CORE_InformationRequestContext *irc;
- struct PeerRecord *pr;
- struct RequestInfoMessage *rim;
- struct ControlMessage *cm;
-
- pr = GNUNET_CONTAINER_multihashmap_get (h->peers, &peer->hashPubKey);
- if (NULL == pr)
- {
- /* attempt to change preference on peer that is not connected */
- GNUNET_assert (0);
- return NULL;
- }
- if (pr->pcic != NULL)
- {
- /* second change before first one is done */
- GNUNET_break (0);
- return NULL;
- }
- irc = GNUNET_malloc (sizeof (struct GNUNET_CORE_InformationRequestContext));
- irc->h = h;
- irc->pr = pr;
- cm = GNUNET_malloc (sizeof (struct ControlMessage) +
- sizeof (struct RequestInfoMessage));
- cm->cont = &change_preference_send_continuation;
- cm->cont_cls = irc;
- irc->cm = cm;
- rim = (struct RequestInfoMessage *) &cm[1];
- rim->header.size = htons (sizeof (struct RequestInfoMessage));
- rim->header.type = htons (GNUNET_MESSAGE_TYPE_CORE_REQUEST_INFO);
- rim->rim_id = htonl (pr->rim_id = h->rim_id_gen++);
- rim->limit_outbound = GNUNET_BANDWIDTH_VALUE_MAX; // FIXME: remove entirely soon...
- rim->reserve_inbound = htonl (amount);
- rim->preference_change = GNUNET_htonll (preference);
- rim->peer = *peer;
-#if DEBUG_CORE
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Queueing CHANGE PREFERENCE request for peer `%s' with RIM %u\n",
- GNUNET_i2s (peer), (unsigned int) pr->rim_id);
-#endif
- GNUNET_CONTAINER_DLL_insert_tail (h->control_pending_head,
- h->control_pending_tail, cm);
- pr->pcic = info;
- pr->pcic_cls = info_cls;
- pr->pcic_ptr = irc; /* for free'ing irc */
- if (NULL != h->client)
- trigger_next_request (h, GNUNET_NO);
- return irc;
-}
-
-
-/**
- * Cancel request for getting information about a peer.
- * Note that an eventual change in preference, trust or bandwidth
- * assignment MAY have already been committed at the time,
- * so cancelling a request is NOT sure to undo the original
- * request. The original request may or may not still commit.
- * The only thing cancellation ensures is that the callback
- * from the original request will no longer be called.
- *
- * @param irc context returned by the original GNUNET_CORE_peer_get_info call
- */
-void
-GNUNET_CORE_peer_change_preference_cancel (struct
- GNUNET_CORE_InformationRequestContext
- *irc)
-{
- struct GNUNET_CORE_Handle *h = irc->h;
- struct PeerRecord *pr = irc->pr;
-
- GNUNET_assert (pr->pcic_ptr == irc);
- if (irc->cm != NULL)
- {
- GNUNET_CONTAINER_DLL_remove (h->control_pending_head,
- h->control_pending_tail, irc->cm);
- GNUNET_free (irc->cm);
- }
- pr->pcic = NULL;
- pr->pcic_cls = NULL;
- pr->pcic_ptr = NULL;
- GNUNET_free (irc);
-}
-
-