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.
Unified · Split
| @@ -1816,4 +1816,28 @@ static inline void skb_set_tcp_pure_ack(struct sk_buff *skb) · 1815 unmodified lines | |||
| 1816 | skb->truesize = 2; | 1816 | skb->truesize = 2; |
| 1817 | } | 1817 | } |
| 1818 | 1818 | ||
| 1819 | static inline int tcp_inq(struct sock *sk) | ||
| 1820 | { | ||
| 1821 | struct tcp_sock *tp = tcp_sk(sk); | ||
| 1822 | int answ; | ||
| 1823 | |||
| 1824 | if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { | ||
| 1825 | answ = 0; | ||
| 1826 | } else if (sock_flag(sk, SOCK_URGINLINE) || | ||
| 1827 | !tp->urg_data || | ||
| 1828 | before(tp->urg_seq, tp->copied_seq) || | ||
| 1829 | !before(tp->urg_seq, tp->rcv_nxt)) { | ||
| 1830 | |||
| 1831 | answ = tp->rcv_nxt - tp->copied_seq; | ||
| 1832 | |||
| 1833 | /* Subtract 1, if FIN was received */ | ||
| 1834 | if (answ && sock_flag(sk, SOCK_DONE)) | ||
| 1835 | answ--; | ||
| 1836 | } else { | ||
| 1837 | answ = tp->urg_seq - tp->copied_seq; | ||
| 1838 | } | ||
| 1839 | |||
| 1840 | return answ; | ||
| 1841 | } | ||
| 1842 | |||
| 1819 | #endif /* _TCP_H */ | 1843 | #endif /* _TCP_H */ |
| @@ -556,20 +556,7 @@ int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg) · 555 unmodified lines | |||
| 556 | return -EINVAL; | 556 | return -EINVAL; |
| 557 | 557 | ||
| 558 | slow = lock_sock_fast(sk); | 558 | slow = lock_sock_fast(sk); |
| 559 | if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) | 559 | answ = tcp_inq(sk); |
| 560 | answ = 0; | ||
| 561 | else if (sock_flag(sk, SOCK_URGINLINE) || | ||
| 562 | !tp->urg_data || | ||
| 563 | before(tp->urg_seq, tp->copied_seq) || | ||
| 564 | !before(tp->urg_seq, tp->rcv_nxt)) { | ||
| 565 | |||
| 566 | answ = tp->rcv_nxt - tp->copied_seq; | ||
| 567 | |||
| 568 | /* Subtract 1, if FIN was received */ | ||
| 569 | if (answ && sock_flag(sk, SOCK_DONE)) | ||
| 570 | answ--; | ||
| 571 | } else | ||
| 572 | answ = tp->urg_seq - tp->copied_seq; | ||
| 573 | unlock_sock_fast(sk, slow); | 560 | unlock_sock_fast(sk, slow); |
| 574 | break; | 561 | break; |
| 575 | case SIOCATMARK: | 562 | case SIOCATMARK: |