*/
                if (sample != 0)
                        hcrx->rtt = tfrc_ewma(hcrx->rtt, sample, 9);
-
-       } else if (tfrc_lh_update_i_mean(&hcrx->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 = CCID3_FBACK_PARAM_CHANGE;
        }
-
        /*
         * Check if the periodic once-per-RTT feedback is due; RFC 4342, 10.3
         */
 
 
 /**
  * tfrc_lh_update_i_mean  -  Update the `open' loss interval I_0
- * For recomputing p: returns `true' if p > p_prev  <=>  1/p < 1/p_prev
+ * This updates I_mean as the sequence numbers increase. As a consequence, the
+ * open loss interval I_0 increases, hence p = W_tot/max(I_tot0, I_tot1)
+ * decreases, and thus there is no need to send renewed feedback.
  */
-u8 tfrc_lh_update_i_mean(struct tfrc_loss_hist *lh, struct sk_buff *skb)
+void tfrc_lh_update_i_mean(struct tfrc_loss_hist *lh, struct sk_buff *skb)
 {
        struct tfrc_loss_interval *cur = tfrc_lh_peek(lh);
-       u32 old_i_mean = lh->i_mean;
        s64 len;
 
        if (cur == NULL)                        /* not initialised */
-               return 0;
+               return;
+
+       /* FIXME: should probably also count non-data packets (RFC 4342, 6.1) */
+       if (!dccp_data_packet(skb))
+               return;
 
        len = dccp_delta_seqno(cur->li_seqno, DCCP_SKB_CB(skb)->dccpd_seq) + 1;
 
        if (len - (s64)cur->li_length <= 0)     /* duplicate or reordered */
-               return 0;
+               return;
 
        if (SUB16(dccp_hdr(skb)->dccph_ccval, cur->li_ccval) > 4)
                /*
                cur->li_is_closed = 1;
 
        if (tfrc_lh_length(lh) == 1)            /* due to RFC 3448, 6.3.1 */
-               return 0;
+               return;
 
        cur->li_length = len;
        tfrc_lh_calc_i_mean(lh);
-
-       return (lh->i_mean < old_i_mean);
 }
-EXPORT_SYMBOL_GPL(tfrc_lh_update_i_mean);
 
 /* Determine if `new_loss' does begin a new loss interval [RFC 4342, 10.2] */
 static inline u8 tfrc_lh_is_new_loss(struct tfrc_loss_interval *cur,
 
 
 extern int  tfrc_lh_interval_add(struct tfrc_loss_hist *, struct tfrc_rx_hist *,
                                 u32 (*first_li)(struct sock *), struct sock *);
-extern u8   tfrc_lh_update_i_mean(struct tfrc_loss_hist *lh, struct sk_buff *);
+extern void tfrc_lh_update_i_mean(struct tfrc_loss_hist *lh, struct sk_buff *);
 extern void tfrc_lh_cleanup(struct tfrc_loss_hist *lh);
 
 #endif /* _DCCP_LI_HIST_ */
 
                is_new_loss = tfrc_lh_interval_add(lh, h, calc_first_li, sk);
                __three_after_loss(h);
        }
+
+       /* RFC 3448, 6.1: update I_0, whose growth implies p <= p_prev */
+       if (!is_new_loss)
+               tfrc_lh_update_i_mean(lh, skb);
+
        return is_new_loss;
 }
 EXPORT_SYMBOL_GPL(tfrc_rx_handle_loss);