bsp; if (!th->ack || 23. !after(TCP_SKB_CB(skb)->end_seq, tcptw->tw_rcv_nxt) || 24. TCP_SKB_CB(skb)->end_seq == TCP_SKB_CB(skb)->seq) { 25. inet_twsk_put(tw); 26. return TCP_TW_SUCCESS; 27. } 28. 29. 30. /* New data or FIN. If new data arrive after half-duplex close, 31. * reset. 32. */ 33. if (!th->fin || 34. TCP_SKB_CB(skb)->end_seq != tcptw->tw_rcv_nxt + 1) { 35.kill_with_rst: 36. inet_twsk_deschedule(tw, &tcp_death_row); 37. inet_twsk_put(tw); 38. return TCP_TW_RST; 39. } 40. 41. 42. /* FIN arrived, enter true time-wait state. */ 43. tw->tw_substate = TCP_TIME_WAIT; 44. tcptw->tw_rcv_nxt = TCP_SKB_CB(skb)->end_seq; 45. if (tmp_opt.saw_tstamp) { 46. tcptw->tw_ts_recent_stamp = get_seconds(); 47. tcptw->tw_ts_recent = tmp_opt.rcv_tsval; 48. } 49. 50. 51. /* I am shamed, but failed to make it more elegant. 52. * Yes, it is direct reference to IP, which is impossible 53. * to generalize to IPv6. Taking into account that IPv6 54. * do not understand recycling in any case, it not 55. * a big problem in practice. --ANK */ 56. if (tw->tw_family == AF_INET && 57. &nbs上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>
|