Module Name:    src
Committed By:   plunky
Date:           Tue Feb  8 21:59:50 UTC 2011

Modified Files:
        src/usr.sbin/btpand: client.c server.c

Log Message:
the default socket rcvbuf for L2CAP is only 4Kbytes which is only
2 and a bit ethernet packets. Check and increase SO_RCVBUF on startup
so that we have buffers for 10 complete packets, should solve a
reported problem with overruns at higher connection speeds (our L2CAP
does not have any flow control).

(the default can still be adjusted upwards using sysctl)


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/usr.sbin/btpand/client.c
cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/btpand/server.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/btpand/client.c
diff -u src/usr.sbin/btpand/client.c:1.4 src/usr.sbin/btpand/client.c:1.5
--- src/usr.sbin/btpand/client.c:1.4	Tue May 12 21:50:38 2009
+++ src/usr.sbin/btpand/client.c	Tue Feb  8 21:59:50 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: client.c,v 1.4 2009/05/12 21:50:38 plunky Exp $	*/
+/*	$NetBSD: client.c,v 1.5 2011/02/08 21:59:50 plunky Exp $	*/
 
 /*-
  * Copyright (c) 2008-2009 Iain Hibbert
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: client.c,v 1.4 2009/05/12 21:50:38 plunky Exp $");
+__RCSID("$NetBSD: client.c,v 1.5 2011/02/08 21:59:50 plunky Exp $");
 
 #include <bluetooth.h>
 #include <errno.h>
@@ -45,7 +45,7 @@
 	struct sockaddr_bt sa;
 	channel_t *chan;
 	socklen_t len;
-	int fd;
+	int fd, bufsize;
 	uint16_t mru, mtu;
 
 	if (bdaddr_any(&remote_bdaddr))
@@ -102,6 +102,19 @@
 		exit(EXIT_FAILURE);
 	}
 
+	len = sizeof(bufsize);
+	if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &bufsize, &len) == -1) {
+		log_err("Could not read SO_RCVBUF");
+		exit(EXIT_FAILURE);
+	}
+	if (bufsize < 10 * mru) {
+		bufsize = 10 * mru;
+		if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &bufsize,
+		    sizeof(bufsize)) == -1)
+			log_info("Could not increase SO_RCVBUF (from %d)",
+			    bufsize);
+	}
+
 	len = sizeof(mtu);
 	if (getsockopt(fd, BTPROTO_L2CAP, SO_L2CAP_OMTU, &mtu, &len) == -1) {
 		log_err("Could not get L2CAP OMTU: %m");

Index: src/usr.sbin/btpand/server.c
diff -u src/usr.sbin/btpand/server.c:1.6 src/usr.sbin/btpand/server.c:1.7
--- src/usr.sbin/btpand/server.c:1.6	Sun Oct 25 19:28:45 2009
+++ src/usr.sbin/btpand/server.c	Tue Feb  8 21:59:50 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: server.c,v 1.6 2009/10/25 19:28:45 plunky Exp $	*/
+/*	$NetBSD: server.c,v 1.7 2011/02/08 21:59:50 plunky Exp $	*/
 
 /*-
  * Copyright (c) 2008-2009 Iain Hibbert
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: server.c,v 1.6 2009/10/25 19:28:45 plunky Exp $");
+__RCSID("$NetBSD: server.c,v 1.7 2011/02/08 21:59:50 plunky Exp $");
 
 #include <sys/ioctl.h>
 
@@ -134,7 +134,7 @@
 	struct sockaddr_bt ra, la;
 	channel_t *chan;
 	socklen_t len;
-	int fd, n;
+	int fd, n, bufsize;
 	uint16_t mru, mtu;
 
 	assert(server_count < server_limit);
@@ -163,6 +163,20 @@
 		return;
 	}
 
+	len = sizeof(bufsize);
+	if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &bufsize, &len) == -1) {
+		log_err("Could not read SO_RCVBUF");
+		close(fd);
+		return;
+	}
+	if (bufsize < 10 * mru) {
+		bufsize = 10 * mru;
+		if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &bufsize,
+		    sizeof(bufsize)) == -1)
+			log_info("Could not increase SO_RCVBUF (from %d)",
+			    bufsize);
+	}
+
 	len = sizeof(mtu);
 	if (getsockopt(fd, BTPROTO_L2CAP, SO_L2CAP_OMTU, &mtu, &len) == -1) {
 		log_err("Could not get L2CAP OMTU: %m");

Reply via email to