mirror of https://gitee.com/openkylin/linux.git
tcp: Add tcp_inq to get available receive bytes on socket
Create a common kernel function to get the number of bytes available on a TCP socket. This is based on code in INQ getsockopt and we now call the function for that getsockopt. Signed-off-by: Tom Herbert <tom@herbertland.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
fa9835e52e
commit
473bd239b8
|
@ -1816,4 +1816,28 @@ static inline void skb_set_tcp_pure_ack(struct sk_buff *skb)
|
|||
skb->truesize = 2;
|
||||
}
|
||||
|
||||
static inline int tcp_inq(struct sock *sk)
|
||||
{
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
int answ;
|
||||
|
||||
if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {
|
||||
answ = 0;
|
||||
} else if (sock_flag(sk, SOCK_URGINLINE) ||
|
||||
!tp->urg_data ||
|
||||
before(tp->urg_seq, tp->copied_seq) ||
|
||||
!before(tp->urg_seq, tp->rcv_nxt)) {
|
||||
|
||||
answ = tp->rcv_nxt - tp->copied_seq;
|
||||
|
||||
/* Subtract 1, if FIN was received */
|
||||
if (answ && sock_flag(sk, SOCK_DONE))
|
||||
answ--;
|
||||
} else {
|
||||
answ = tp->urg_seq - tp->copied_seq;
|
||||
}
|
||||
|
||||
return answ;
|
||||
}
|
||||
|
||||
#endif /* _TCP_H */
|
||||
|
|
|
@ -556,20 +556,7 @@ int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg)
|
|||
return -EINVAL;
|
||||
|
||||
slow = lock_sock_fast(sk);
|
||||
if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV))
|
||||
answ = 0;
|
||||
else if (sock_flag(sk, SOCK_URGINLINE) ||
|
||||
!tp->urg_data ||
|
||||
before(tp->urg_seq, tp->copied_seq) ||
|
||||
!before(tp->urg_seq, tp->rcv_nxt)) {
|
||||
|
||||
answ = tp->rcv_nxt - tp->copied_seq;
|
||||
|
||||
/* Subtract 1, if FIN was received */
|
||||
if (answ && sock_flag(sk, SOCK_DONE))
|
||||
answ--;
|
||||
} else
|
||||
answ = tp->urg_seq - tp->copied_seq;
|
||||
answ = tcp_inq(sk);
|
||||
unlock_sock_fast(sk, slow);
|
||||
break;
|
||||
case SIOCATMARK:
|
||||
|
|
Loading…
Reference in New Issue