return ssize;
}
+
+/**
+ * Set transport metrics for a peer and a direction
+ *
+ * @param handle transport handle
+ * @param peer the peer to set the metric for
+ * @param inbound set inbound direction (GNUNET_YES or GNUNET_NO)
+ * @param outbound set outbound direction (GNUNET_YES or GNUNET_NO)
+ * @param ats the metric as ATS information
+ * @param ats_count the number of metrics
+ *
+ * Supported ATS values:
+ * GNUNET_ATS_QUALITY_NET_DELAY (value in ms)
+ * GNUNET_ATS_QUALITY_NET_DISTANCE (value in count(hops))
+ *
+ * Example
+ * To enforce a delay of 10 ms for peer p1 in sending direction use:
+ *
+ * struct GNUNET_ATS_Information ats;
+ * ats.type = ntohl (GNUNET_ATS_QUALITY_NET_DELAY);
+ * ats.value = ntohl (10);
+ * GNUNET_TRANSPORT_set_traffic_metric (th, p1, TM_SEND, &ats, 1);
+ *
+ * Note:
+ * Delay restrictions in receiving direction will be enforced with
+ * 1 message delay.
+ */
void
GNUNET_TRANSPORT_set_traffic_metric (struct GNUNET_TRANSPORT_Handle *handle,
const struct GNUNET_PeerIdentity *peer,
- int direction,
+ int inbound,
+ int outbound,
const struct GNUNET_ATS_Information *ats,
size_t ats_count)
{
GNUNET_assert (NULL != handle);
GNUNET_assert (NULL != peer);
- GNUNET_assert (direction >= TM_SEND);
- GNUNET_assert (direction <= TM_BOTH);
+ GNUNET_assert ((outbound == GNUNET_YES) || (outbound == GNUNET_NO));
+ GNUNET_assert ((inbound == GNUNET_YES) || (inbound == GNUNET_NO));
+ if ((GNUNET_NO == inbound) && (GNUNET_NO == outbound))
+ return;
if (0 == ats_count)
return;
msg = GNUNET_malloc (len);
msg->header.size = htons (len);
msg->header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_TRAFFIC_METRIC);
- msg->direction = htons (direction);
+ msg->direction = htons (0 + outbound + 2 * inbound);
msg->ats_count = htons (ats_count);
msg->peer = (*peer);
memcpy (&msg[1], ats, ats_count * sizeof (struct GNUNET_ATS_Information));