|
@@ -1510,9 +1510,9 @@ static struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off)
|
|
|
|
|
|
while ((skb = skb_peek(&sk->sk_receive_queue)) != NULL) {
|
|
|
offset = seq - TCP_SKB_CB(skb)->seq;
|
|
|
- if (tcp_hdr(skb)->syn)
|
|
|
+ if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)
|
|
|
offset--;
|
|
|
- if (offset < skb->len || tcp_hdr(skb)->fin) {
|
|
|
+ if (offset < skb->len || (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)) {
|
|
|
*off = offset;
|
|
|
return skb;
|
|
|
}
|
|
@@ -1585,7 +1585,7 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
|
|
|
if (offset + 1 != skb->len)
|
|
|
continue;
|
|
|
}
|
|
|
- if (tcp_hdr(skb)->fin) {
|
|
|
+ if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) {
|
|
|
sk_eat_skb(sk, skb, false);
|
|
|
++seq;
|
|
|
break;
|
|
@@ -1722,11 +1722,11 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
|
|
break;
|
|
|
|
|
|
offset = *seq - TCP_SKB_CB(skb)->seq;
|
|
|
- if (tcp_hdr(skb)->syn)
|
|
|
+ if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)
|
|
|
offset--;
|
|
|
if (offset < skb->len)
|
|
|
goto found_ok_skb;
|
|
|
- if (tcp_hdr(skb)->fin)
|
|
|
+ if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)
|
|
|
goto found_fin_ok;
|
|
|
WARN(!(flags & MSG_PEEK),
|
|
|
"recvmsg bug 2: copied %X seq %X rcvnxt %X fl %X\n",
|
|
@@ -1959,7 +1959,7 @@ skip_copy:
|
|
|
if (used + offset < skb->len)
|
|
|
continue;
|
|
|
|
|
|
- if (tcp_hdr(skb)->fin)
|
|
|
+ if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)
|
|
|
goto found_fin_ok;
|
|
|
if (!(flags & MSG_PEEK)) {
|
|
|
sk_eat_skb(sk, skb, copied_early);
|
|
@@ -2160,8 +2160,10 @@ void tcp_close(struct sock *sk, long timeout)
|
|
|
* reader process may not have drained the data yet!
|
|
|
*/
|
|
|
while ((skb = __skb_dequeue(&sk->sk_receive_queue)) != NULL) {
|
|
|
- u32 len = TCP_SKB_CB(skb)->end_seq - TCP_SKB_CB(skb)->seq -
|
|
|
- tcp_hdr(skb)->fin;
|
|
|
+ u32 len = TCP_SKB_CB(skb)->end_seq - TCP_SKB_CB(skb)->seq;
|
|
|
+
|
|
|
+ if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)
|
|
|
+ len--;
|
|
|
data_was_unread += len;
|
|
|
__kfree_skb(skb);
|
|
|
}
|