Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 41a0a4a8 authored by Nick Pelly's avatar Nick Pelly
Browse files

Set RFCOMM SO_SNDBUF size to 70 KB for large RFCOMM writes.

With a 64 KB OBEX MTU, net/rfcomm/sock.c:rfcomm_sock_sendmsg() quietly drops data.

The default SO_SNDBUF is 24 KB. Empircally, 36 KB still drops, and 38 KB no longer drops (this is because SO_SNDBUF is doubled in net/core/sock.c and then there is OBEX/RFCOMM overhead). Set to 70 KB so we have plenty of room to spare.

See http://b/2090000 to investigate this in more detail later.
parent 66360af8
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -54,6 +54,8 @@ static const int TYPE_RFCOMM = 1;
static const int TYPE_SCO = 2;
static const int TYPE_L2CAP = 3;  // TODO: Test l2cap code paths

static const int RFCOMM_SO_SNDBUF = 70 * 1024;  // 70 KB send buffer

static struct asocket *get_socketData(JNIEnv *env, jobject obj) {
    struct asocket *s =
            (struct asocket *) env->GetIntField(obj, field_mSocketData);
@@ -87,6 +89,7 @@ static void initSocketNative(JNIEnv *env, jobject obj) {

    int fd;
    int lm = 0;
    int sndbuf;
    jboolean auth;
    jboolean encrypt;
    jint type;
@@ -131,7 +134,16 @@ static void initSocketNative(JNIEnv *env, jobject obj) {

    if (lm) {
        if (setsockopt(fd, SOL_RFCOMM, RFCOMM_LM, &lm, sizeof(lm))) {
            LOGV("setsockopt() failed, throwing");
            LOGV("setsockopt(RFCOMM_LM) failed, throwing");
            jniThrowIOException(env, errno);
            return;
        }
    }

    if (type == TYPE_RFCOMM) {
        sndbuf = RFCOMM_SO_SNDBUF;
        if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &sndbuf, sizeof(sndbuf))) {
            LOGV("setsockopt(SO_SNDBUF) failed, throwing");
            jniThrowIOException(env, errno);
            return;
        }
@@ -274,16 +286,21 @@ static void bindListenNative(JNIEnv *env, jobject obj) {
    }

    if (bind(s->fd, addr, addr_sz)) {
        LOGV("...bind(%d) gave errno %d", s->fd, errno);
        jniThrowIOException(env, errno);
        return;
    }

    if (listen(s->fd, 1)) {
        LOGV("...listen(%d) gave errno %d", s->fd, errno);
        jniThrowIOException(env, errno);
        return;
    }

    LOGV("...bindListenNative(%d) success", s->fd);

    return;

#endif
    jniThrowIOException(env, ENOSYS);
}