Module Name: src Committed By: christos Date: Sun Dec 16 17:46:58 UTC 2018
Modified Files: src/sys/netinet: dccp_usrreq.c tcp_usrreq.c src/sys/sys: socketvar.h Log Message: sbspace() does not return negative values anymore and that broke OOB data sending. Instead of depending on negative values, account for the 1024 bytes sosend() adds so that it can use all the space here in a separate function sbspace_oob(). Idea from mlelstv@ To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.21 src/sys/netinet/dccp_usrreq.c cvs rdiff -u -r1.221 -r1.222 src/sys/netinet/tcp_usrreq.c cvs rdiff -u -r1.158 -r1.159 src/sys/sys/socketvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netinet/dccp_usrreq.c diff -u src/sys/netinet/dccp_usrreq.c:1.20 src/sys/netinet/dccp_usrreq.c:1.21 --- src/sys/netinet/dccp_usrreq.c:1.20 Fri Sep 14 01:09:51 2018 +++ src/sys/netinet/dccp_usrreq.c Sun Dec 16 12:46:58 2018 @@ -1,5 +1,5 @@ /* $KAME: dccp_usrreq.c,v 1.67 2005/11/03 16:05:04 nishida Exp $ */ -/* $NetBSD: dccp_usrreq.c,v 1.20 2018/09/14 05:09:51 maxv Exp $ */ +/* $NetBSD: dccp_usrreq.c,v 1.21 2018/12/16 17:46:58 christos Exp $ */ /* * Copyright (c) 2003 Joacim Häggmark, Magnus Erixzon, Nils-Erik Mattsson @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dccp_usrreq.c,v 1.20 2018/09/14 05:09:51 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dccp_usrreq.c,v 1.21 2018/12/16 17:46:58 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -2157,7 +2157,7 @@ dccp_send(struct socket *so, struct mbuf } } - if (sbspace(&so->so_snd) < -512) { + if (sbspace_oob(&so->so_snd) == 0) { INP_UNLOCK(inp); error = ENOBUFS; goto release; Index: src/sys/netinet/tcp_usrreq.c diff -u src/sys/netinet/tcp_usrreq.c:1.221 src/sys/netinet/tcp_usrreq.c:1.222 --- src/sys/netinet/tcp_usrreq.c:1.221 Sat Nov 24 12:05:54 2018 +++ src/sys/netinet/tcp_usrreq.c Sun Dec 16 12:46:58 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_usrreq.c,v 1.221 2018/11/24 17:05:54 maxv Exp $ */ +/* $NetBSD: tcp_usrreq.c,v 1.222 2018/12/16 17:46:58 christos Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -99,7 +99,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.221 2018/11/24 17:05:54 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.222 2018/12/16 17:46:58 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -1154,7 +1154,7 @@ tcp_sendoob(struct socket *so, struct mb ostate = tcp_debug_capture(tp, PRU_SENDOOB); s = splsoftnet(); - if (sbspace(&so->so_snd) < -512) { + if (sbspace_oob(&so->so_snd) == 0) { m_freem(m); splx(s); return ENOBUFS; Index: src/sys/sys/socketvar.h diff -u src/sys/sys/socketvar.h:1.158 src/sys/sys/socketvar.h:1.159 --- src/sys/sys/socketvar.h:1.158 Wed Aug 1 19:35:32 2018 +++ src/sys/sys/socketvar.h Sun Dec 16 12:46:58 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: socketvar.h,v 1.158 2018/08/01 23:35:32 rjs Exp $ */ +/* $NetBSD: socketvar.h,v 1.159 2018/12/16 17:46:58 christos Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -412,6 +412,21 @@ sbspace(const struct sockbuf *sb) return lmin(sb->sb_hiwat - sb->sb_cc, sb->sb_mbmax - sb->sb_mbcnt); } +static __inline u_long +sbspace_oob(const struct sockbuf *sb) +{ + u_long hiwat = sb->sb_hiwat; + + if (hiwat < ULONG_MAX - 1024) + hiwat += 1024; + + KASSERT(solocked(sb->sb_so)); + + if (hiwat <= sb->sb_cc || sb->sb_mbmax <= sb->sb_mbcnt) + return 0; + return lmin(hiwat - sb->sb_cc, sb->sb_mbmax - sb->sb_mbcnt); +} + /* do we have to send all at once on a socket? */ static __inline int sosendallatonce(const struct socket *so)