Hi Ian McDonald, The result is p is always be 0, and the TFRC formula will never be used to determine the sending rate at the sender side. Actually the sending rate will be stable at last due to other constraints.
Regards, Zhou Bin -----Original Message----- From: Ian McDonald [mailto:[EMAIL PROTECTED] Sent: Friday, December 09, 2005 4:33 AM To: #ZHOU BIN# Cc: [email protected] Subject: Re: A doubt on the behavior of a TFRC receiver in the code On 11/29/05, #ZHOU BIN# <[EMAIL PROTECTED]> wrote: > Hi all, > > I met some problems when studying the following section of source code, which > is about the behavior of a TFRC receiver: > > static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb) > { > . > 993 ins = dccp_rx_hist_add_packet(ccid3_rx_hist, &hcrx->ccid3hcrx_hist, > &hcrx->ccid3hcrx_li_hist, packet); > if (DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK) > return; > 999 switch (hcrx->ccid3hcrx_state) { > case TFRC_RSTATE_NO_DATA: > . > return; > 1008 case TFRC_RSTATE_DATA: > hcrx->ccid3hcrx_bytes_recv += skb->len - > dccp_hdr(skb)->dccph_doff * 4; > 1011 if (ins != 0) > 1012 break; > dccp_timestamp(sk, &now); > if (timeval_delta(&now, &hcrx->ccid3hcrx_tstamp_last_ack) >= > hcrx->ccid3hcrx_rtt) { > hcrx->ccid3hcrx_tstamp_last_ack = now; > ccid3_hc_rx_send_feedback(sk); > } > return; > default: > . > return; > } > /* Dealing with packet loss */ > . > 1032 ccid3_hc_rx_detect_loss(sk); > p_prev = hcrx->ccid3hcrx_p; > /* Calculate loss event rate */ > if (!list_empty(&hcrx->ccid3hcrx_li_hist)) > /* Scaling up by 1000000 as fixed decimal */ > hcrx->ccid3hcrx_p = 1000000 / > dccp_li_hist_calc_i_mean(&hcrx->ccid3hcrx_li_hist); > if (hcrx->ccid3hcrx_p > p_prev) { > ccid3_hc_rx_send_feedback(sk); > return; > } > } > > According to RFC 3448 section 6.1, > > "When a data packet is received, the receiver performs the following steps: > 1) Add the packet to the packet history. > 2) Let the previous value of p be p_prev. Calculate the new value of p as > described in Section 5. > 3) If p > p_prev, cause the feedback timer to expire, and perform the > actions described in Section 6.2 > If p <= p_prev no action need be performed." > > To my way of thinking, the step 1 is done in line 993. However, the step 2 > and 3 have no chance to be done in most cases: in the switch process starting > from line 999, the only possibility to jump out to the "p" calculation (line > 1032) is the variable "ins" is not be 0 (line 1011 and 1012). But ins=1 only > happens when unordered packet is received. This is quite different from what > RFC says. > > What's wrong in my analysis? > I agree with you after reading through the analysis and the DCCP CCID3 spec and RFC 3448. Have a go at providing a patch or at the very least update the Todo list for DCCP at http://linux-net.osdl.org/index.php/TODO#DCCP Thanks for finding this! What effect does it have on performance? I would suspect it would cause data to be sent too fast but haven't done more analysis... Ian -- Ian McDonald http://wand.net.nz/~iam4 WAND Network Research Group University of Waikato New Zealand - 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

