/** * Function called by ATS to notify the callee that the * assigned bandwidth or address for a given peer was changed. If the * callback is called with address/bandwidth assignments of zero, the * ATS disconnect function will still be called once the disconnect * actually happened. * * @param cls closure * @param address address to use (for peer given in address) * @param session session to use (if available) * @param bandwidth_out assigned outbound bandwidth for the connection, 0 to disconnect from peer * @param bandwidth_in assigned inbound bandwidth for the connection, 0 to disconnect from peer * @param ats ATS information * @param ats_count number of ATS elements */ static void ats_request_address_change (void *cls, const struct GNUNET_HELLO_Address *address, struct Session *session, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in, const struct GNUNET_ATS_Information *ats, uint32_t ats_count) { uint32_t bw_in = ntohl (bandwidth_in.value__); uint32_t bw_out = ntohl (bandwidth_out.value__); /* ATS tells me to disconnect from peer */ if ((bw_in == 0) && (bw_out == 0)) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ATS tells me to disconnect from peer `%s'\n", GNUNET_i2s (&address->peer)); GST_neighbours_force_disconnect (&address->peer); return; } GST_neighbours_switch_to_address (&address->peer, address, session, ats, ats_count, bandwidth_in, bandwidth_out); }
/** * Function called by ATS to notify the callee that the * assigned bandwidth or address for a given peer was changed. If the * callback is called with address/bandwidth assignments of zero, the * ATS disconnect function will still be called once the disconnect * actually happened. * * @param cls closure * @param peer the peer this address is intended for * @param address address to use (for peer given in address) * @param session session to use (if available) * @param bandwidth_out assigned outbound bandwidth for the connection in NBO, * 0 to disconnect from peer * @param bandwidth_in assigned inbound bandwidth for the connection in NBO, * 0 to disconnect from peer * @param ats ATS information * @param ats_count number of @a ats elements */ static void ats_request_address_change (void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) { uint32_t bw_in = ntohl (bandwidth_in.value__); uint32_t bw_out = ntohl (bandwidth_out.value__); if (NULL == peer) { /* ATS service died, all suggestions become invalid! (but we'll keep using the allocations for a little while, to keep going while ATS restarts) */ /* FIXME: We should drop all connections now, as ATS won't explicitly tell us and be unaware of ongoing resource allocations! */ return; } /* ATS tells me to disconnect from peer */ if ((0 == bw_in) && (0 == bw_out)) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "ATS tells me to disconnect from peer `%s'\n", GNUNET_i2s (peer)); GST_neighbours_force_disconnect (peer); return; } GNUNET_assert (NULL != address); GNUNET_STATISTICS_update (GST_stats, "# ATS suggestions received", 1, GNUNET_NO); GST_neighbours_switch_to_address (address, session, bandwidth_in, bandwidth_out); }