TaoBing
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2003-01-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1378回复:0

TCP: split a fast path and a slow path

楼主#
更多 发布于:2002-10-30 15:39
问题发生在tcp_input.c(ipv4)中的tcp_rcv_established分检fast和slow时:
if (tcp_header_len == sizeof(struct tcphdr) + TCPOLEN_TSTAMP_ALIGNED) {
__u32 *ptr = (__u32 *)(th + 1);

/* No? Slow path! */
if (*ptr != __constant_ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16)
    | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP))
goto slow_path;

tp->saw_tstamp = 1;
++ptr;
tp->rcv_tsval = ntohl(*ptr);
++ptr;
tp->rcv_tsecr = ntohl(*ptr);

/* If PAWS failed, check it more carefully in slow path */
if ((s32)(tp->rcv_tsval - tp->ts_recent) < 0)
goto slow_path;
...
}
/***************************************************/

问题1:
     __u32 *ptc=(_u32 *)(th+1);后会得到什么值?
问题2:
     if(*ptr!=...) 是说fast path必须满足*ptr=...条件。那么这个条件是什么?何时满足?
问题3:
     RTTM、PAWS是什么?
/* PAWS/RTTM data */
        __u32 rcv_tsval; /* Time stamp value             */
        __u32 rcv_tsecr; /* Time stamp echo reply         */
        __u32 ts_recent; /* Time stamp to echo next */
        long ts_recent_stamp;/* Time we stored ts_recent (for aging) */
 这是sock.h中的tcp_opt。他们在实际中起什么作用?

问题4:
/**********************************************************/
if (tp->ucopy.task == current &&
   tp->copied_seq == tp->rcv_nxt &&
   len - tcp_header_len <= tp->ucopy.len &&
   sk->lock.users) {
fast 处理....
}
/**********************************************************/
结合以前的条件语句,只有满足*ptr=__con...并tp->tsval-tp->ts_recent>=0,  skb->len>tcp_head_len,  还有tp->ucopy.task==...时才会进入fast path(直接复制到socket的用户空间)。
那么,用文字怎样描述?谁能帮我列出应满足的全部或部分条件。分段的数据是否会执行fast path?
比如:收到序号连续的段a,b,c,d。但FIN标志在e上(e尚未收到)。a,b,c,d时顺序到达的。甚至e也在收到d后到达。这种情况下是否有可能进入fast path?

 望提示或指点
***********************  不胜感激!
游客

返回顶部