[CCID3]: Hook up CCID3 with new Loss Intervals Database
This hooks up the TFRC Loss Interval database with CCID 3 packet reception.
Signed-off-by: Gerrit Renker <[EMAIL PROTECTED]>
---
net/dccp/ccids/ccid3.c | 47 +++++++++++++++++++----------------------------
net/dccp/ccids/ccid3.h | 8 ++++----
2 files changed, 23 insertions(+), 32 deletions(-)
--- a/net/dccp/ccids/ccid3.h
+++ b/net/dccp/ccids/ccid3.h
@@ -135,8 +135,8 @@ enum ccid3_hc_rx_states {
* @ccid3hcrx_rtt - Receiver estimate of RTT (RFC 4342, 8.1)
* @ccid3hcrx_pinv - Reciprocal of Loss Event Rate p (RFC 4342, sec. 8.5)
* @ccid3hcrx_tstamp_last_feedback - Time at which last feedback was sent
- * @ccid3hcrx_hist - Packet history exported by TFRC module
- * @ccid3hcrx_li_hist - Loss Interval History
+ * @ccid3hcrx_hist - Packet history, exported by TFRC module
+ * @ccid3hcrx_li_hist - Loss Interval database, exported by TFRC module
* @ccid3hcrx_elapsed_time - Time since packet reception
*/
struct ccid3_hc_rx_sock {
@@ -146,10 +146,10 @@ struct ccid3_hc_rx_sock {
u32 ccid3hcrx_bytes_recv;
u32 ccid3hcrx_x_recv;
u32 ccid3hcrx_rtt;
- u32 ccid3hcrx_pinv;
+#define ccid3hcrx_pinv ccid3hcrx_li_hist.i_mean
struct timeval ccid3hcrx_tstamp_last_feedback;
struct tfrc_rx_hist ccid3hcrx_hist;
- struct list_head ccid3hcrx_li_hist;
+ struct tfrc_loss_hist ccid3hcrx_li_hist;
u32 ccid3hcrx_elapsed_time;
};
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -720,24 +720,6 @@ static inline void ccid3_hc_rx_update_s(
TFRC_EWMA(hcrx->ccid3hcrx_s, len, 9);
}
-/* returns: 1 when p > p_prev (i.e. when feedback is required); 0 else */
-static int ccid3_hc_rx_update_p(struct ccid3_hc_rx_sock *hcrx)
-{
- struct list_head *li_hist = &hcrx->ccid3hcrx_li_hist;
- u32 pinv_prev = hcrx->ccid3hcrx_pinv;
-
- /* XXX subsequent patch
- hcrx->ccid3hcrx_pinv = dccp_li_hist_calc_i_mean(li_hist);
- */
- if (hcrx->ccid3hcrx_pinv == 0) {
- DCCP_BUG("non-empty LI history and yet I_mean == 0!");
- return 0;
- }
-
- /* exploit that p > p_prev <=> 1/p < 1/p_prev */
- return (hcrx->ccid3hcrx_pinv < pinv_prev);
-}
-
static void ccid3_hc_rx_send_feedback(struct sock *sk, struct sk_buff *skb)
{
struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
@@ -886,9 +868,11 @@ static void ccid3_hc_rx_packet_recv(stru
/*
* Handle pending losses and otherwise check for new loss
*/
- if (tfrc_rx_loss_pending(&hcrx->ccid3hcrx_hist)) {
-
- do_feedback = tfrc_rx_handle_loss(&hcrx->ccid3hcrx_hist, skb,
ndp);
+ if (tfrc_rx_loss_pending(&hcrx->ccid3hcrx_hist) &&
+ tfrc_rx_handle_loss(&hcrx->ccid3hcrx_hist,
+ &hcrx->ccid3hcrx_li_hist,
+ skb, ndp, ccid3_first_li, sk) ) {
+ do_feedback = 1;
goto sending_feedback;
}
@@ -901,15 +885,24 @@ static void ccid3_hc_rx_packet_recv(stru
if (unlikely(!is_data_packet))
goto update_records;
- if (list_empty(&hcrx->ccid3hcrx_li_hist)) { /* no loss so far: p = 0 */
-
+ if (! tfrc_lh_is_initialised(&hcrx->ccid3hcrx_li_hist)) {
+ /*
+ * Empty loss history: no loss so far, hence p stays 0.
+ * Sample RTT values, since an RTT estimate is required for the
+ * computation of p when the first loss occurs; RFC 3448, 6.3.1.
+ */
sample = tfrc_rx_sample_rtt(&hcrx->ccid3hcrx_hist, skb);
if (sample != 0)
TFRC_EWMA(hcrx->ccid3hcrx_rtt, sample, 9);
- } else if (ccid3_hc_rx_update_p(hcrx)) /* recompute p; RFC 3448, 6.1 */
+ } else if (tfrc_lh_update_i_mean(&hcrx->ccid3hcrx_li_hist, skb))
+ /*
+ * Step (3) of [RFC 3448, 6.1]: Recompute I_mean and, if I_mean
+ * has decreased (resp. p has increased), send feedback now.
+ */
do_feedback = 1;
+
/* check if the periodic once-per-RTT feedback is due; RFC 4342, 10.3 */
if (SUB16(dccp_hdr(skb)->dccph_ccval, hcrx->ccid3hcrx_last_counter) > 3)
do_feedback = 1;
@@ -932,7 +925,7 @@ static int ccid3_hc_rx_init(struct ccid
if (tfrc_rx_hist_init(&hcrx->ccid3hcrx_hist))
return 1;
- INIT_LIST_HEAD(&hcrx->ccid3hcrx_li_hist);
+ tfrc_lh_init(&hcrx->ccid3hcrx_li_hist);
hcrx->ccid3hcrx_state = TFRC_RSTATE_NO_DATA;
hcrx->ccid3hcrx_s = 0;
hcrx->ccid3hcrx_rtt = 0;
@@ -948,9 +941,7 @@ static void ccid3_hc_rx_exit(struct sock
ccid3_hc_rx_set_state(sk, TFRC_RSTATE_TERM);
tfrc_rx_hist_cleanup(&hcrx->ccid3hcrx_hist);
-
- /* Empty loss interval history */
- dccp_li_hist_purge(ccid3_li_hist, &hcrx->ccid3hcrx_li_hist);
+ tfrc_lh_cleanup(&hcrx->ccid3hcrx_li_hist);
}
static void ccid3_hc_rx_get_info(struct sock *sk, struct tcp_info *info)
-
To unsubscribe from this list: send the line "unsubscribe dccp" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html