diff options
-rw-r--r-- | net/ipv4/tcp.c | 18 | ||||
-rw-r--r-- | net/ipv4/tcp_input.c | 10 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 1 | ||||
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 1 |
4 files changed, 17 insertions, 13 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 541f26a67ba2..070aeff1b131 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -1510,9 +1510,9 @@ static struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off) | |||
1510 | 1510 | ||
1511 | while ((skb = skb_peek(&sk->sk_receive_queue)) != NULL) { | 1511 | while ((skb = skb_peek(&sk->sk_receive_queue)) != NULL) { |
1512 | offset = seq - TCP_SKB_CB(skb)->seq; | 1512 | offset = seq - TCP_SKB_CB(skb)->seq; |
1513 | if (tcp_hdr(skb)->syn) | 1513 | if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN) |
1514 | offset--; | 1514 | offset--; |
1515 | if (offset < skb->len || tcp_hdr(skb)->fin) { | 1515 | if (offset < skb->len || (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)) { |
1516 | *off = offset; | 1516 | *off = offset; |
1517 | return skb; | 1517 | return skb; |
1518 | } | 1518 | } |
@@ -1585,7 +1585,7 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, | |||
1585 | if (offset + 1 != skb->len) | 1585 | if (offset + 1 != skb->len) |
1586 | continue; | 1586 | continue; |
1587 | } | 1587 | } |
1588 | if (tcp_hdr(skb)->fin) { | 1588 | if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) { |
1589 | sk_eat_skb(sk, skb, false); | 1589 | sk_eat_skb(sk, skb, false); |
1590 | ++seq; | 1590 | ++seq; |
1591 | break; | 1591 | break; |
@@ -1722,11 +1722,11 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
1722 | break; | 1722 | break; |
1723 | 1723 | ||
1724 | offset = *seq - TCP_SKB_CB(skb)->seq; | 1724 | offset = *seq - TCP_SKB_CB(skb)->seq; |
1725 | if (tcp_hdr(skb)->syn) | 1725 | if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN) |
1726 | offset--; | 1726 | offset--; |
1727 | if (offset < skb->len) | 1727 | if (offset < skb->len) |
1728 | goto found_ok_skb; | 1728 | goto found_ok_skb; |
1729 | if (tcp_hdr(skb)->fin) | 1729 | if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) |
1730 | goto found_fin_ok; | 1730 | goto found_fin_ok; |
1731 | WARN(!(flags & MSG_PEEK), | 1731 | WARN(!(flags & MSG_PEEK), |
1732 | "recvmsg bug 2: copied %X seq %X rcvnxt %X fl %X\n", | 1732 | "recvmsg bug 2: copied %X seq %X rcvnxt %X fl %X\n", |
@@ -1959,7 +1959,7 @@ skip_copy: | |||
1959 | if (used + offset < skb->len) | 1959 | if (used + offset < skb->len) |
1960 | continue; | 1960 | continue; |
1961 | 1961 | ||
1962 | if (tcp_hdr(skb)->fin) | 1962 | if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) |
1963 | goto found_fin_ok; | 1963 | goto found_fin_ok; |
1964 | if (!(flags & MSG_PEEK)) { | 1964 | if (!(flags & MSG_PEEK)) { |
1965 | sk_eat_skb(sk, skb, copied_early); | 1965 | sk_eat_skb(sk, skb, copied_early); |
@@ -2160,8 +2160,10 @@ void tcp_close(struct sock *sk, long timeout) | |||
2160 | * reader process may not have drained the data yet! | 2160 | * reader process may not have drained the data yet! |
2161 | */ | 2161 | */ |
2162 | while ((skb = __skb_dequeue(&sk->sk_receive_queue)) != NULL) { | 2162 | while ((skb = __skb_dequeue(&sk->sk_receive_queue)) != NULL) { |
2163 | u32 len = TCP_SKB_CB(skb)->end_seq - TCP_SKB_CB(skb)->seq - | 2163 | u32 len = TCP_SKB_CB(skb)->end_seq - TCP_SKB_CB(skb)->seq; |
2164 | tcp_hdr(skb)->fin; | 2164 | |
2165 | if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) | ||
2166 | len--; | ||
2165 | data_was_unread += len; | 2167 | data_was_unread += len; |
2166 | __kfree_skb(skb); | 2168 | __kfree_skb(skb); |
2167 | } | 2169 | } |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index f97003ad0af5..8f639a4face9 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -4093,7 +4093,7 @@ static void tcp_ofo_queue(struct sock *sk) | |||
4093 | __skb_unlink(skb, &tp->out_of_order_queue); | 4093 | __skb_unlink(skb, &tp->out_of_order_queue); |
4094 | __skb_queue_tail(&sk->sk_receive_queue, skb); | 4094 | __skb_queue_tail(&sk->sk_receive_queue, skb); |
4095 | tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq; | 4095 | tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq; |
4096 | if (tcp_hdr(skb)->fin) | 4096 | if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) |
4097 | tcp_fin(sk); | 4097 | tcp_fin(sk); |
4098 | } | 4098 | } |
4099 | } | 4099 | } |
@@ -4513,7 +4513,7 @@ restart: | |||
4513 | * - bloated or contains data before "start" or | 4513 | * - bloated or contains data before "start" or |
4514 | * overlaps to the next one. | 4514 | * overlaps to the next one. |
4515 | */ | 4515 | */ |
4516 | if (!tcp_hdr(skb)->syn && !tcp_hdr(skb)->fin && | 4516 | if (!(TCP_SKB_CB(skb)->tcp_flags & (TCPHDR_SYN | TCPHDR_FIN)) && |
4517 | (tcp_win_from_space(skb->truesize) > skb->len || | 4517 | (tcp_win_from_space(skb->truesize) > skb->len || |
4518 | before(TCP_SKB_CB(skb)->seq, start))) { | 4518 | before(TCP_SKB_CB(skb)->seq, start))) { |
4519 | end_of_skbs = false; | 4519 | end_of_skbs = false; |
@@ -4532,7 +4532,8 @@ restart: | |||
4532 | /* Decided to skip this, advance start seq. */ | 4532 | /* Decided to skip this, advance start seq. */ |
4533 | start = TCP_SKB_CB(skb)->end_seq; | 4533 | start = TCP_SKB_CB(skb)->end_seq; |
4534 | } | 4534 | } |
4535 | if (end_of_skbs || tcp_hdr(skb)->syn || tcp_hdr(skb)->fin) | 4535 | if (end_of_skbs || |
4536 | (TCP_SKB_CB(skb)->tcp_flags & (TCPHDR_SYN | TCPHDR_FIN))) | ||
4536 | return; | 4537 | return; |
4537 | 4538 | ||
4538 | while (before(start, end)) { | 4539 | while (before(start, end)) { |
@@ -4579,8 +4580,7 @@ restart: | |||
4579 | skb = tcp_collapse_one(sk, skb, list); | 4580 | skb = tcp_collapse_one(sk, skb, list); |
4580 | if (!skb || | 4581 | if (!skb || |
4581 | skb == tail || | 4582 | skb == tail || |
4582 | tcp_hdr(skb)->syn || | 4583 | (TCP_SKB_CB(skb)->tcp_flags & (TCPHDR_SYN | TCPHDR_FIN))) |
4583 | tcp_hdr(skb)->fin) | ||
4584 | return; | 4584 | return; |
4585 | } | 4585 | } |
4586 | } | 4586 | } |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 7881b96d2b72..006b045716d8 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -1638,6 +1638,7 @@ int tcp_v4_rcv(struct sk_buff *skb) | |||
1638 | TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + | 1638 | TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + |
1639 | skb->len - th->doff * 4); | 1639 | skb->len - th->doff * 4); |
1640 | TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); | 1640 | TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); |
1641 | TCP_SKB_CB(skb)->tcp_flags = tcp_flag_byte(th); | ||
1641 | TCP_SKB_CB(skb)->tcp_tw_isn = 0; | 1642 | TCP_SKB_CB(skb)->tcp_tw_isn = 0; |
1642 | TCP_SKB_CB(skb)->ip_dsfield = ipv4_get_dsfield(iph); | 1643 | TCP_SKB_CB(skb)->ip_dsfield = ipv4_get_dsfield(iph); |
1643 | TCP_SKB_CB(skb)->sacked = 0; | 1644 | TCP_SKB_CB(skb)->sacked = 0; |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 1835480336ac..de51a88bec6f 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1415,6 +1415,7 @@ static int tcp_v6_rcv(struct sk_buff *skb) | |||
1415 | TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + | 1415 | TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + |
1416 | skb->len - th->doff*4); | 1416 | skb->len - th->doff*4); |
1417 | TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); | 1417 | TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); |
1418 | TCP_SKB_CB(skb)->tcp_flags = tcp_flag_byte(th); | ||
1418 | TCP_SKB_CB(skb)->tcp_tw_isn = 0; | 1419 | TCP_SKB_CB(skb)->tcp_tw_isn = 0; |
1419 | TCP_SKB_CB(skb)->ip_dsfield = ipv6_get_dsfield(hdr); | 1420 | TCP_SKB_CB(skb)->ip_dsfield = ipv6_get_dsfield(hdr); |
1420 | TCP_SKB_CB(skb)->sacked = 0; | 1421 | TCP_SKB_CB(skb)->sacked = 0; |