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");