diff --git a/prrt/cprrt.pxd b/prrt/cprrt.pxd index d83e7d4aa40888168e55cf5bd428fd68200f7744..7817facc51f926a514d3cefb429b4fdb88902027 100644 --- a/prrt/cprrt.pxd +++ b/prrt/cprrt.pxd @@ -157,6 +157,7 @@ cdef extern from "proto/socket.h": uint32_t PrrtSocket_get_pacing_rate(PrrtSocket *s) uint32_t PrrtSocket_get_send_quantum(PrrtSocket *s) uint32_t PrrtSocket_get_pipe(PrrtSocket *s) + uint32_t PrrtSocket_get_delivered(PrrtSocket *s) bint PrrtSocket_get_app_limited(PrrtSocket *socket) diff --git a/prrt/proto/channelStateInformation.c b/prrt/proto/channelStateInformation.c index c302d058f849ec395b851e978f0ee8f6211e2963..4375d1b7d313a006889f7b1fc016d10cc470c5ea 100644 --- a/prrt/proto/channelStateInformation.c +++ b/prrt/proto/channelStateInformation.c @@ -81,8 +81,4 @@ prrtPacketLossRate_t PrrtChannelStateInformation_get_plr(PrrtChannelStateInforma prrtDeliveryRate_t PrrtChannelStateInformation_get_delivery_rate(PrrtChannelStateInformation *csi) { return csi->deliveryRate; -} - -bool PrrtChannelStateInformation_get_app_limited(PrrtChannelStateInformation *csi) { - return csi->appLimited; } \ No newline at end of file diff --git a/prrt/proto/processes/feedbackReceiver.c b/prrt/proto/processes/feedbackReceiver.c index b3957896ab64f3edd8edd2b49e517b8a83b84d9a..2a856f98fbddd0e2087c15390521ce7d1f1e3ded 100644 --- a/prrt/proto/processes/feedbackReceiver.c +++ b/prrt/proto/processes/feedbackReceiver.c @@ -39,17 +39,20 @@ static void handle_feedback(PrrtSocket *prrtSocket, const size_t length) PrrtPacketFeedbackPayload *feedbackPayload = (PrrtPacketFeedbackPayload *) prrtPacket->payload; prrtTimestamp_t forwardTripTimestamp = feedbackPayload->forwardTripTimestamp_us; + PrrtChannelStateInformation_update_rtprop(prrtSocket->receiver->csi, + (prrtTimedelta_t) (receiveTime - forwardTripTimestamp)); + PrrtChannelStateInformation_update_plr(prrtSocket->receiver->csi, feedbackPayload->erasureCount, feedbackPayload->packetCount); - bool valid_sample = PrrtReceiver_updateAndGenerateRateSample(prrtSocket->receiver, feedbackPayload->ackSequenceNumber, feedbackPayload->ackPacketType, receiveTime); + bool valid_sample = PrrtReceiver_updateAndGenerateRateSample(prrtSocket->receiver, feedbackPayload->ackSequenceNumber, feedbackPayload->ackPacketType, receiveTime); + if(prrtSocket->receiver->rateSample != NULL) { + BBR_OnACK(prrtSocket->receiver->bbr, prrtSocket->receiver->csi, prrtSocket->receiver->rateSample, prrtSocket->receiver->packetTracking); + } if(valid_sample) { PrrtChannelStateInformation_update_delivery_rate(prrtSocket->receiver->csi, prrtPacket, prrtSocket->receiver->rateSample); } PrrtChannelStateInformation_update_app_limited(prrtSocket->receiver->csi, prrtSocket->receiver->rateSample->is_app_limited); - PrrtChannelStateInformation_update_rtprop(prrtSocket->receiver->csi, - (prrtTimedelta_t) (receiveTime - forwardTripTimestamp)); - PrrtChannelStateInformation_update_plr(prrtSocket->receiver->csi, feedbackPayload->erasureCount, feedbackPayload->packetCount); error: if(prrtPacket != NULL) { PrrtPacket_destroy(prrtPacket); } diff --git a/prrt/proto/receiver.c b/prrt/proto/receiver.c index 2b7b4224ce1060b5cf49567eda1042e147b72e30..62439c7dca4ed0bef97146a3994bf3ed1c9ba2e4 100644 --- a/prrt/proto/receiver.c +++ b/prrt/proto/receiver.c @@ -129,7 +129,7 @@ void PrrtReceiver_on_application_write(PrrtReceiver *receiver, uint32_t send_que bool PrrtReceiver_generateRateSample(PrrtRateSample *rateSample, PrrtPacketTracking *packetTracking) { /* Clear app-limited field */ - if (packetTracking->app_limited && packetTracking->delivered > packetTracking->app_limited) + if (packetTracking->app_limited > 0 && packetTracking->delivered > packetTracking->app_limited) packetTracking->app_limited = 0; if (rateSample->prior_time == 0) { @@ -183,9 +183,6 @@ bool PrrtReceiver_updateAndGenerateRateSample(PrrtReceiver *recv, prrtSequenceNu check(pthread_cond_broadcast(&recv->pipeNotFullCv) == 0, "Signal failed."); recv->packetTracking->prior_inflight = recv->packetTracking->pipe; - if(recv->rateSample != NULL && result) { - BBR_OnACK(recv->bbr, recv->csi, recv->rateSample, recv->packetTracking); - } return result; error: diff --git a/prrt/proto/socket.c b/prrt/proto/socket.c index 1e5e593b7b4027c25f028b5ed3faa91d3f593360..9ff2e2632e314165a012b71e383bf5af546fbb41 100644 --- a/prrt/proto/socket.c +++ b/prrt/proto/socket.c @@ -640,6 +640,11 @@ prrtByteCount_t PrrtSocket_get_pipe(PrrtSocket *s) { return s->receiver->packetTracking->pipe; }; +prrtByteCount_t PrrtSocket_get_delivered(PrrtSocket *s) { + return s->receiver->packetTracking->delivered; +}; + + float PrrtSocket_get_pacing_gain(PrrtSocket *s) { return BBR_getPacingGain(s->receiver->bbr); } @@ -653,5 +658,5 @@ uint32_t PrrtSocket_get_cycle_index(PrrtSocket *s) { } bool PrrtSocket_get_app_limited(PrrtSocket *s) { - return PrrtChannelStateInformation_get_app_limited(s->receiver->csi); + return s->receiver->rateSample->is_app_limited; } diff --git a/prrt/proto/socket.h b/prrt/proto/socket.h index 8988b001ea3e88d9226050aa7de8b2a71eceabab..0c6b727b1723b485f39e4cda4c2eaaab6fe1d826 100644 --- a/prrt/proto/socket.h +++ b/prrt/proto/socket.h @@ -148,6 +148,7 @@ uint32_t PrrtSocket_get_inflight(PrrtSocket *s); uint32_t PrrtSocket_get_pacing_rate(PrrtSocket *s); prrtByteCount_t PrrtSocket_get_send_quantum(PrrtSocket *s); prrtByteCount_t PrrtSocket_get_pipe(PrrtSocket *s); +prrtByteCount_t PrrtSocket_get_delivered(PrrtSocket *s); #endif // PRRT_SOCKET_H diff --git a/prrt/prrt.pyx b/prrt/prrt.pyx index f5934ffc3289ae6e599bb871c0c4984ca3e97e2c..50b4a23cb7493443008559ce40d317445ce32b29 100644 --- a/prrt/prrt.pyx +++ b/prrt/prrt.pyx @@ -253,6 +253,12 @@ cdef class PrrtSocket: raise Exception("Not a sender.") return cprrt.PrrtSocket_get_pipe(self._c_socket) + property bbr_delivered: + def __get__(self): + if not self.isSender: + raise Exception("Not a sender.") + return cprrt.PrrtSocket_get_delivered(self._c_socket) + property app_limited: def __get__(self): if not self.isSender: