This continues previous "Introduce `sb_state' and move
SS_CANTSENDMORE..." diff.
Move socket's SS_CANTRCVMORE and SS_RCVATMARK bits to socket's `so_rcv'
buffer state bits. Moved separately of SS_CANTSENDMORE to make review
and check easier.
As with previous diff, left remaining SS_ bits as is.
Index: sys/kern/sys_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/sys_socket.c,v
retrieving revision 1.57
diff -u -p -r1.57 sys_socket.c
--- sys/kern/sys_socket.c 11 Dec 2022 21:19:08 -0000 1.57
+++ sys/kern/sys_socket.c 11 Dec 2022 23:01:34 -0000
@@ -119,7 +119,7 @@ soo_ioctl(struct file *fp, u_long cmd, c
break;
case SIOCATMARK:
- *(int *)data = (so->so_state&SS_RCVATMARK) != 0;
+ *(int *)data = (so->so_rcv.sb_state & SBS_RCVATMARK) != 0;
break;
default:
@@ -149,7 +149,8 @@ soo_stat(struct file *fp, struct stat *u
memset(ub, 0, sizeof (*ub));
ub->st_mode = S_IFSOCK;
solock(so);
- if ((so->so_state & SS_CANTRCVMORE) == 0 || so->so_rcv.sb_cc != 0)
+ if ((so->so_rcv.sb_state & SBS_CANTRCVMORE) == 0 ||
+ so->so_rcv.sb_cc != 0)
ub->st_mode |= S_IRUSR | S_IRGRP | S_IROTH;
if ((so->so_snd.sb_state & SBS_CANTSENDMORE) == 0)
ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
Index: sys/kern/uipc_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.292
diff -u -p -r1.292 uipc_socket.c
--- sys/kern/uipc_socket.c 11 Dec 2022 21:19:08 -0000 1.292
+++ sys/kern/uipc_socket.c 11 Dec 2022 23:01:34 -0000
@@ -867,7 +867,7 @@ restart:
so->so_error = 0;
goto release;
}
- if (so->so_state & SS_CANTRCVMORE) {
+ if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
if (m)
goto dontblock;
else if (so->so_rcv.sb_cc == 0)
@@ -1023,7 +1023,7 @@ dontblock:
so, so->so_type, m, m->m_type);
#endif
}
- so->so_state &= ~SS_RCVATMARK;
+ so->so_rcv.sb_state &= ~SBS_RCVATMARK;
len = uio->uio_resid;
if (so->so_oobmark && len > so->so_oobmark - offset)
len = so->so_oobmark - offset;
@@ -1100,7 +1100,7 @@ dontblock:
if ((flags & MSG_PEEK) == 0) {
so->so_oobmark -= len;
if (so->so_oobmark == 0) {
- so->so_state |= SS_RCVATMARK;
+ so->so_rcv.sb_state |= SBS_RCVATMARK;
break;
}
} else {
@@ -1120,7 +1120,8 @@ dontblock:
*/
while (flags & MSG_WAITALL && m == NULL && uio->uio_resid > 0 &&
!sosendallatonce(so) && !nextrecord) {
- if (so->so_error || so->so_state & SS_CANTRCVMORE)
+ if (so->so_rcv.sb_state & SBS_CANTRCVMORE ||
+ so->so_error)
break;
SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2");
SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2");
@@ -1160,7 +1161,8 @@ dontblock:
pru_rcvd(so);
}
if (orig_resid == uio->uio_resid && orig_resid &&
- (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) {
+ (flags & MSG_EOR) == 0 &&
+ (so->so_rcv.sb_state & SBS_CANTRCVMORE) == 0) {
sbunlock(so, &so->so_rcv);
goto restart;
}
@@ -1632,13 +1634,13 @@ somove(struct socket *so, int wait)
pru_rcvd(so);
/* Receive buffer did shrink by len bytes, adjust oob. */
- state = so->so_state;
- so->so_state &= ~SS_RCVATMARK;
+ state = so->so_rcv.sb_state;
+ so->so_rcv.sb_state &= ~SBS_RCVATMARK;
oobmark = so->so_oobmark;
so->so_oobmark = oobmark > len ? oobmark - len : 0;
if (oobmark) {
if (oobmark == len)
- so->so_state |= SS_RCVATMARK;
+ so->so_rcv.sb_state |= SBS_RCVATMARK;
if (oobmark >= len)
oobmark = 0;
}
@@ -1647,13 +1649,13 @@ somove(struct socket *so, int wait)
* Handle oob data. If any malloc fails, ignore error.
* TCP urgent data is not very reliable anyway.
*/
- while (((state & SS_RCVATMARK) || oobmark) &&
+ while (((state & SBS_RCVATMARK) || oobmark) &&
(so->so_options & SO_OOBINLINE)) {
struct mbuf *o = NULL;
- if (state & SS_RCVATMARK) {
+ if (state & SBS_RCVATMARK) {
o = m_get(wait, MT_DATA);
- state &= ~SS_RCVATMARK;
+ state &= ~SBS_RCVATMARK;
} else if (oobmark) {
o = m_split(m, oobmark, wait);
if (o) {
@@ -1687,7 +1689,7 @@ somove(struct socket *so, int wait)
if (oobmark) {
oobmark -= 1;
if (oobmark == 0)
- state |= SS_RCVATMARK;
+ state |= SBS_RCVATMARK;
}
m_adj(m, 1);
}
@@ -1714,7 +1716,8 @@ somove(struct socket *so, int wait)
error = EFBIG;
if (error)
so->so_error = error;
- if (((so->so_state & SS_CANTRCVMORE) && so->so_rcv.sb_cc == 0) ||
+ if (((so->so_rcv.sb_state & SBS_CANTRCVMORE) &&
+ so->so_rcv.sb_cc == 0) ||
(sosp->so_snd.sb_state & SBS_CANTSENDMORE) ||
maxreached || error) {
sounsplice(so, sosp, 0);
@@ -1850,7 +1853,7 @@ sosetopt(struct socket *so, int level, i
break;
case SO_RCVBUF:
- if (so->so_state & SS_CANTRCVMORE)
+ if (so->so_rcv.sb_state & SBS_CANTRCVMORE)
return (EINVAL);
if (sbcheckreserve(cnt, so->so_rcv.sb_wat) ||
sbreserve(so, &so->so_rcv, cnt))
@@ -2151,7 +2154,7 @@ filt_soread(struct knote *kn, long hint)
rv = 0;
} else
#endif /* SOCKET_SPLICE */
- if (so->so_state & SS_CANTRCVMORE) {
+ if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
kn->kn_flags |= EV_EOF;
if (kn->kn_flags & __EV_POLL) {
if (so->so_state & SS_ISDISCONNECTED)
@@ -2223,7 +2226,7 @@ filt_soexcept(struct knote *kn, long hin
} else
#endif /* SOCKET_SPLICE */
if (kn->kn_sfflags & NOTE_OOB) {
- if (so->so_oobmark || (so->so_state & SS_RCVATMARK)) {
+ if (so->so_oobmark || (so->so_rcv.sb_state & SBS_RCVATMARK)) {
kn->kn_fflags |= NOTE_OOB;
kn->kn_data -= so->so_oobmark;
rv = 1;
Index: sys/kern/uipc_socket2.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket2.c,v
retrieving revision 1.130
diff -u -p -r1.130 uipc_socket2.c
--- sys/kern/uipc_socket2.c 11 Dec 2022 21:19:08 -0000 1.130
+++ sys/kern/uipc_socket2.c 11 Dec 2022 23:01:35 -0000
@@ -142,7 +142,8 @@ soisdisconnecting(struct socket *so)
{
soassertlocked(so);
so->so_state &= ~SS_ISCONNECTING;
- so->so_state |= (SS_ISDISCONNECTING|SS_CANTRCVMORE);
+ so->so_state |= SS_ISDISCONNECTING;
+ so->so_rcv.sb_state |= SBS_CANTRCVMORE;
so->so_snd.sb_state |= SBS_CANTSENDMORE;
wakeup(&so->so_timeo);
sowwakeup(so);
@@ -154,7 +155,8 @@ soisdisconnected(struct socket *so)
{
soassertlocked(so);
so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING);
- so->so_state |= (SS_CANTRCVMORE|SS_ISDISCONNECTED);
+ so->so_state |= SS_ISDISCONNECTED;
+ so->so_rcv.sb_state |= SBS_CANTRCVMORE;
so->so_snd.sb_state |= SBS_CANTSENDMORE;
wakeup(&so->so_timeo);
sowwakeup(so);
@@ -344,7 +346,7 @@ void
socantrcvmore(struct socket *so)
{
soassertlocked(so);
- so->so_state |= SS_CANTRCVMORE;
+ so->so_rcv.sb_state |= SBS_CANTRCVMORE;
sorwakeup(so);
}
Index: sys/kern/uipc_syscalls.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_syscalls.c,v
retrieving revision 1.207
diff -u -p -r1.207 uipc_syscalls.c
--- sys/kern/uipc_syscalls.c 7 Dec 2022 01:02:28 -0000 1.207
+++ sys/kern/uipc_syscalls.c 11 Dec 2022 23:01:35 -0000
@@ -288,14 +288,14 @@ doaccept(struct proc *p, int sock, struc
goto out_unlock;
}
if ((headfp->f_flag & FNONBLOCK) && head->so_qlen == 0) {
- if (head->so_state & SS_CANTRCVMORE)
+ if (head->so_rcv.sb_state & SBS_CANTRCVMORE)
error = ECONNABORTED;
else
error = EWOULDBLOCK;
goto out_unlock;
}
while (head->so_qlen == 0 && head->so_error == 0) {
- if (head->so_state & SS_CANTRCVMORE) {
+ if (head->so_rcv.sb_state & SBS_CANTRCVMORE) {
head->so_error = ECONNABORTED;
break;
}
Index: sys/miscfs/fifofs/fifo_vnops.c
===================================================================
RCS file: /cvs/src/sys/miscfs/fifofs/fifo_vnops.c,v
retrieving revision 1.97
diff -u -p -r1.97 fifo_vnops.c
--- sys/miscfs/fifofs/fifo_vnops.c 11 Dec 2022 21:19:08 -0000 1.97
+++ sys/miscfs/fifofs/fifo_vnops.c 11 Dec 2022 23:01:35 -0000
@@ -199,7 +199,8 @@ fifo_open(void *v)
}
if (fip->fi_writers == 1) {
solock(rso);
- rso->so_state &= ~(SS_CANTRCVMORE|SS_ISDISCONNECTED);
+ rso->so_state &= ~SS_ISDISCONNECTED;
+ rso->so_rcv.sb_state &= ~SBS_CANTRCVMORE;
sounlock(rso);
if (fip->fi_readers > 0)
wakeup(&fip->fi_readers);
@@ -525,7 +526,7 @@ filt_fiforead(struct knote *kn, long hin
soassertlocked(so);
kn->kn_data = so->so_rcv.sb_cc;
- if (so->so_state & SS_CANTRCVMORE) {
+ if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
kn->kn_flags |= EV_EOF;
if (kn->kn_flags & __EV_POLL) {
if (so->so_state & SS_ISDISCONNECTED)
Index: sys/net/rtsock.c
===================================================================
RCS file: /cvs/src/sys/net/rtsock.c,v
retrieving revision 1.358
diff -u -p -r1.358 rtsock.c
--- sys/net/rtsock.c 17 Oct 2022 14:49:02 -0000 1.358
+++ sys/net/rtsock.c 11 Dec 2022 23:01:35 -0000
@@ -464,7 +464,7 @@ rtm_senddesync(struct socket *so)
* timeout(9), otherwise timeout_del_barrier(9) can't help us.
*/
if ((so->so_state & SS_ISCONNECTED) == 0 ||
- (so->so_state & SS_CANTRCVMORE))
+ (so->so_rcv.sb_state & SBS_CANTRCVMORE))
return;
/* If we are in a DESYNC state, try to send a RTM_DESYNC packet */
@@ -524,7 +524,7 @@ route_input(struct mbuf *m0, struct sock
*/
if ((so0 == so && !(so0->so_options & SO_USELOOPBACK)) ||
!(so->so_state & SS_ISCONNECTED) ||
- (so->so_state & SS_CANTRCVMORE))
+ (so->so_rcv.sb_state & SBS_CANTRCVMORE))
goto next;
/* filter messages that the process does not want */
Index: sys/netinet/raw_ip.c
===================================================================
RCS file: /cvs/src/sys/netinet/raw_ip.c,v
retrieving revision 1.150
diff -u -p -r1.150 raw_ip.c
--- sys/netinet/raw_ip.c 17 Oct 2022 14:49:02 -0000 1.150
+++ sys/netinet/raw_ip.c 11 Dec 2022 23:01:35 -0000
@@ -171,7 +171,7 @@ rip_input(struct mbuf **mp, int *offp, i
rw_enter_write(&rawcbtable.inpt_notify);
mtx_enter(&rawcbtable.inpt_mtx);
TAILQ_FOREACH(inp, &rawcbtable.inpt_queue, inp_queue) {
- if (inp->inp_socket->so_state & SS_CANTRCVMORE)
+ if (inp->inp_socket->so_rcv.sb_state & SBS_CANTRCVMORE)
continue;
#ifdef INET6
if (inp->inp_flags & INP_IPV6)
Index: sys/netinet/tcp_input.c
===================================================================
RCS file: /cvs/src/sys/netinet/tcp_input.c,v
retrieving revision 1.384
diff -u -p -r1.384 tcp_input.c
--- sys/netinet/tcp_input.c 9 Dec 2022 00:24:44 -0000 1.384
+++ sys/netinet/tcp_input.c 11 Dec 2022 23:01:35 -0000
@@ -340,7 +340,7 @@ tcp_flush_queue(struct tcpcb *tp)
nq = TAILQ_NEXT(q, tcpqe_q);
TAILQ_REMOVE(&tp->t_segq, q, tcpqe_q);
ND6_HINT(tp);
- if (so->so_state & SS_CANTRCVMORE)
+ if (so->so_rcv.sb_state & SBS_CANTRCVMORE)
m_freem(q->tcpqe_m);
else
sbappendstream(so, &so->so_rcv, q->tcpqe_m);
@@ -1036,7 +1036,7 @@ findpcb:
* Drop TCP, IP headers and TCP options then add data
* to socket buffer.
*/
- if (so->so_state & SS_CANTRCVMORE)
+ if (so->so_rcv.sb_state & SBS_CANTRCVMORE)
m_freem(m);
else {
if (tp->t_srtt != 0 && tp->rfbuf_ts != 0 &&
@@ -1789,7 +1789,7 @@ trimthenstep6:
* specification, but if we don't get a FIN
* we'll hang forever.
*/
- if (so->so_state & SS_CANTRCVMORE) {
+ if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
tp->t_flags |= TF_BLOCKOUTPUT;
soisdisconnected(so);
tp->t_flags &= ~TF_BLOCKOUTPUT;
@@ -1898,7 +1898,7 @@ step6:
so->so_oobmark = so->so_rcv.sb_cc +
(tp->rcv_up - tp->rcv_nxt) - 1;
if (so->so_oobmark == 0)
- so->so_state |= SS_RCVATMARK;
+ so->so_rcv.sb_state |= SBS_RCVATMARK;
sohasoutofband(so);
tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA);
}
@@ -1941,7 +1941,7 @@ dodata:
/* XXX */
tiflags = th->th_flags & TH_FIN;
tcpstat_pkt(tcps_rcvpack, tcps_rcvbyte, tlen);
ND6_HINT(tp);
- if (so->so_state & SS_CANTRCVMORE)
+ if (so->so_rcv.sb_state & SBS_CANTRCVMORE)
m_freem(m);
else {
m_adj(m, hdroptlen);
Index: sys/netinet/tcp_usrreq.c
===================================================================
RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v
retrieving revision 1.213
diff -u -p -r1.213 tcp_usrreq.c
--- sys/netinet/tcp_usrreq.c 11 Dec 2022 21:19:08 -0000 1.213
+++ sys/netinet/tcp_usrreq.c 11 Dec 2022 23:01:35 -0000
@@ -918,7 +918,7 @@ tcp_rcvoob(struct socket *so, struct mbu
return (error);
if ((so->so_oobmark == 0 &&
- (so->so_state & SS_RCVATMARK) == 0) ||
+ (so->so_rcv.sb_state & SBS_RCVATMARK) == 0) ||
so->so_options & SO_OOBINLINE ||
tp->t_oobflags & TCPOOB_HADDATA) {
error = EINVAL;
Index: sys/netinet/udp_usrreq.c
===================================================================
RCS file: /cvs/src/sys/netinet/udp_usrreq.c,v
retrieving revision 1.304
diff -u -p -r1.304 udp_usrreq.c
--- sys/netinet/udp_usrreq.c 17 Oct 2022 14:49:02 -0000 1.304
+++ sys/netinet/udp_usrreq.c 11 Dec 2022 23:01:35 -0000
@@ -400,7 +400,7 @@ udp_input(struct mbuf **mp, int *offp, i
rw_enter_write(&udbtable.inpt_notify);
mtx_enter(&udbtable.inpt_mtx);
TAILQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue) {
- if (inp->inp_socket->so_state & SS_CANTRCVMORE)
+ if (inp->inp_socket->so_rcv.sb_state & SBS_CANTRCVMORE)
continue;
#ifdef INET6
/* don't accept it if AF does not match */
Index: sys/netinet6/raw_ip6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/raw_ip6.c,v
retrieving revision 1.171
diff -u -p -r1.171 raw_ip6.c
--- sys/netinet6/raw_ip6.c 17 Oct 2022 14:49:02 -0000 1.171
+++ sys/netinet6/raw_ip6.c 11 Dec 2022 23:01:35 -0000
@@ -183,7 +183,7 @@ rip6_input(struct mbuf **mp, int *offp,
rw_enter_write(&rawin6pcbtable.inpt_notify);
mtx_enter(&rawin6pcbtable.inpt_mtx);
TAILQ_FOREACH(in6p, &rawin6pcbtable.inpt_queue, inp_queue) {
- if (in6p->inp_socket->so_state & SS_CANTRCVMORE)
+ if (in6p->inp_socket->so_rcv.sb_state & SBS_CANTRCVMORE)
continue;
if (rtable_l2(in6p->inp_rtableid) !=
rtable_l2(m->m_pkthdr.ph_rtableid))
Index: sys/sys/socketvar.h
===================================================================
RCS file: /cvs/src/sys/sys/socketvar.h,v
retrieving revision 1.113
diff -u -p -r1.113 socketvar.h
--- sys/sys/socketvar.h 11 Dec 2022 21:19:08 -0000 1.113
+++ sys/sys/socketvar.h 11 Dec 2022 23:01:35 -0000
@@ -133,7 +133,9 @@ struct socket {
#define SB_SPLICE 0x20 /* buffer is splice source or
drain */
#define SB_NOINTR 0x40 /* operations not interruptible
*/
-#define SBS_CANTSENDMORE 0x01 /* can't send more data to peer */
+#define SBS_CANTSENDMORE 0x01 /* can't send more data to peer */
+#define SBS_CANTRCVMORE 0x02 /* can't receive more data from
peer */
+#define SBS_RCVATMARK 0x04 /* at mark on input */
void (*so_upcall)(struct socket *so, caddr_t arg, int waitf);
caddr_t so_upcallarg; /* Arg for above */
@@ -149,8 +151,6 @@ struct socket {
#define SS_ISCONNECTED 0x002 /* socket connected to a peer */
#define SS_ISCONNECTING 0x004 /* in process of connecting to
peer */
#define SS_ISDISCONNECTING 0x008 /* in process of disconnecting
*/
-#define SS_CANTRCVMORE 0x020 /* can't receive more data from
peer */
-#define SS_RCVATMARK 0x040 /* at mark on input */
#define SS_ISDISCONNECTED 0x800 /* socket disconnected from
peer */
#define SS_PRIV 0x080 /* privileged for broadcast,
raw... */
@@ -227,8 +227,8 @@ soreadable(struct socket *so)
soassertlocked(so);
if (isspliced(so))
return 0;
- return (so->so_state & SS_CANTRCVMORE) || so->so_qlen || so->so_error ||
- so->so_rcv.sb_cc >= so->so_rcv.sb_lowat;
+ return (so->so_rcv.sb_state & SBS_CANTRCVMORE) || so->so_qlen ||
+ so->so_error || so->so_rcv.sb_cc >= so->so_rcv.sb_lowat;
}
/* can we write something to so? */