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)

Reply via email to