[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

Reply via email to