aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp/ccids/lib
diff options
context:
space:
mode:
Diffstat (limited to 'net/dccp/ccids/lib')
-rw-r--r--net/dccp/ccids/lib/packet_history.c10
-rw-r--r--net/dccp/ccids/lib/packet_history.h16
2 files changed, 26 insertions, 0 deletions
diff --git a/net/dccp/ccids/lib/packet_history.c b/net/dccp/ccids/lib/packet_history.c
index 8ea96903033d..ee34b4564242 100644
--- a/net/dccp/ccids/lib/packet_history.c
+++ b/net/dccp/ccids/lib/packet_history.c
@@ -352,6 +352,16 @@ int tfrc_rx_handle_loss(struct tfrc_rx_hist *h,
352 __three_after_loss(h); 352 __three_after_loss(h);
353 } 353 }
354 354
355 /*
356 * Update moving-average of `s' and the sum of received payload bytes.
357 */
358 if (dccp_data_packet(skb)) {
359 const u32 payload = skb->len - dccp_hdr(skb)->dccph_doff * 4;
360
361 h->packet_size = tfrc_ewma(h->packet_size, payload, 9);
362 h->bytes_recvd += payload;
363 }
364
355 /* RFC 3448, 6.1: update I_0, whose growth implies p <= p_prev */ 365 /* RFC 3448, 6.1: update I_0, whose growth implies p <= p_prev */
356 if (!is_new_loss) 366 if (!is_new_loss)
357 tfrc_lh_update_i_mean(lh, skb); 367 tfrc_lh_update_i_mean(lh, skb);
diff --git a/net/dccp/ccids/lib/packet_history.h b/net/dccp/ccids/lib/packet_history.h
index e9d8097947d5..b7c87a1a2720 100644
--- a/net/dccp/ccids/lib/packet_history.h
+++ b/net/dccp/ccids/lib/packet_history.h
@@ -91,12 +91,16 @@ struct tfrc_rx_hist_entry {
91 * @loss_count: Number of entries in circular history 91 * @loss_count: Number of entries in circular history
92 * @loss_start: Movable index (for loss detection) 92 * @loss_start: Movable index (for loss detection)
93 * @rtt_sample_prev: Used during RTT sampling, points to candidate entry 93 * @rtt_sample_prev: Used during RTT sampling, points to candidate entry
94 * @packet_size: Packet size in bytes (as per RFC 3448, 3.1)
95 * @bytes_recvd: Number of bytes received since last sending feedback
94 */ 96 */
95struct tfrc_rx_hist { 97struct tfrc_rx_hist {
96 struct tfrc_rx_hist_entry *ring[TFRC_NDUPACK + 1]; 98 struct tfrc_rx_hist_entry *ring[TFRC_NDUPACK + 1];
97 u8 loss_count:2, 99 u8 loss_count:2,
98 loss_start:2; 100 loss_start:2;
99#define rtt_sample_prev loss_start 101#define rtt_sample_prev loss_start
102 u32 packet_size,
103 bytes_recvd;
100}; 104};
101 105
102/** 106/**
@@ -140,6 +144,18 @@ static inline bool tfrc_rx_hist_loss_pending(const struct tfrc_rx_hist *h)
140 return h->loss_count > 0; 144 return h->loss_count > 0;
141} 145}
142 146
147/*
148 * Accessor functions to retrieve parameters sampled by the RX history
149 */
150static inline u32 tfrc_rx_hist_packet_size(const struct tfrc_rx_hist *h)
151{
152 if (h->packet_size == 0) {
153 DCCP_WARN("No sample for s, using fallback\n");
154 return TCP_MIN_RCVMSS;
155 }
156 return h->packet_size;
157}
158
143extern void tfrc_rx_hist_add_packet(struct tfrc_rx_hist *h, 159extern void tfrc_rx_hist_add_packet(struct tfrc_rx_hist *h,
144 const struct sk_buff *skb, const u64 ndp); 160 const struct sk_buff *skb, const u64 ndp);
145 161