if (icsk->icsk_af_ops->conn_request(sk, skb) < 0) return 1; kfree_skb(skb); return 0; } goto discard; case TCP_SYN_SENT: ... return 0; } int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) { ... __u32 isn = TCP_SKB_CB(skb)->when; //重传时间戳 stru...
tp->rx_opt.saw_tstamp =0;//处理SYN_SENT状态下接收到的TCP段queued = tcp_rcv_synsent_state_process(sk, skb, th);if(queued >=0)returnqueued;//处理完第二次握手后,还需要处理带外数据tcp_urg(sk, skb, th); __kfree_skb(skb);//检测是否有数据需要发送tcp_data_snd_check(sk);return0; ...
skb || !tcp_skb_pcount(skb)); tp = tcp_sk(sk); //如果还有其他进程使用skb,就需要复制skb if (clone_it) { skb_mstamp_get(&skb->skb_mstamp); TCP_SKB_CB(skb)->tx.in_flight = TCP_SKB_CB(skb)->end_seq - tp->snd_una; tcp_rate_skb_sent(sk, skb); if (unlikely(skb_...
inttcp_v4_rcv(struct sk_buff *skb) { // 根据ip、端口等信息 获取sock。 sk = __inet_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest); if(!sk) gotono_tcp_socket; no_tcp_socket: // 检查数据包有没有出错 if(skb->len < (th->doff <<2) || tcp_checksum_complete(skb)) ...
有时可以用atomic_inc和atomic_dec函数来直接增加或减小users,但是,通常还是使用函数skb_get和kfree_skb来操作这个变量。 unsigned inttruesize 这是缓冲区的总长度,包括sk_buff结构和数据部分。如果申请一个len字节的缓冲区,alloc_skb函数会把它初始化成len+sizeof(sk_buff)。
tcp_init_nondata_skb(buff, tp->write_seq++, TCPHDR_SYN); tcp_mstamp_refresh(tp); tp->retrans_stamp = tcp_time_stamp(tp); 1. 2. 3. 4. 5. 6. 7. 8. 9. 如下为函数tcp_mstamp_refresh,注意,tcp_mstamp时间戳使用的是微秒单位,以上的retrans_stamp时间戳使用的是毫秒为单位,即TCP时钟...
struct tcp_skb_cb { __u32 seq; /* Starting sequence number */ } 1. 2. 3. 如果在这个范围内疯狂猜测seq数值,并构造对应的包,发到目的机器,虽然概率低,但是总是能被试出来,从而实现RST攻击。这种乱棍打死老师傅的方式,就是所谓的合法窗口盲打(blind in-window attacks)。
...struct tcp_skb_cb { __u32 seq; Starting sequence number __u32 end_seq; SEQ + FIN + SYN + datalen __u8 tcp_flags; tcp头部标志,位于第13个字节tcp[13]) ... }; 然后,tcp_push调用了__tcp_push_pending_frames(sk, mss_now, nonagle);函数发送数据: void ...
为了可以正确统计这些数据,内核给每个 tcp 包(tcp_skb_cb)添加了sacked字段标记该数据包当前的状态。 __u8 sacked; /* State flags for SACK. */#define TCPCB_SACKED_ACKED 0x01 /* SKB ACK'd by a SACK block */#define TCPCB_SACKED_RETRANS 0x02 /* SKB retransmitted */#define TCPCB_LOST 0x...
简要来看就是sack会使用tcp_skb_cb,tcp_skb_cb最大数量是17,导致tcp_skb_cb合并时tcp_gso_segs字段溢出,触发kernel panic[跪了],话说为什么16要加一。。。【转发】@InfoQ:#小Q分享# 近日,Linux 内核发现三...