阅读:1378回复:0
TCP: split a fast path and a slow path
问题发生在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? 望提示或指点 *********************** 不胜感激! |
|