avdtp: Enable MTU auto tunning
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Wed, 19 Feb 2020 00:32:22 +0000 (16:32 -0800)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 12 Apr 2021 09:00:48 +0000 (14:30 +0530)
This uses BT_PHY to check if kernel is able to do MTU auto tunning
which is enabled by forcing the input MTU to 0.

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
profiles/audio/avdtp.c

index 8fc54ba..bf002ba 100644 (file)
@@ -430,6 +430,7 @@ struct avdtp {
 
        struct avdtp_stream *pending_open;
 
+       uint32_t phy;
        uint16_t imtu;
        uint16_t omtu;
 
@@ -2763,6 +2764,9 @@ static void avdtp_connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
        if (!session->io)
                session->io = g_io_channel_ref(chan);
 
+       /* Check if kernel supports reading packet types */
+       bt_io_get(chan, NULL, BT_IO_OPT_PHY, &session->phy, BT_IO_OPT_INVALID);
+
        bt_io_get(chan, &err,
                        BT_IO_OPT_OMTU, &session->omtu,
                        BT_IO_OPT_IMTU, &session->imtu,
@@ -2894,7 +2898,8 @@ static GIOChannel *l2cap_connect(struct avdtp *session)
                                BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
                                BT_IO_OPT_IMTU, 895,
                                BT_IO_OPT_INVALID);
-       } else {
+       }
+       else {
                io = bt_io_connect(avdtp_connect_cb, session,
                                NULL, &err,
                                BT_IO_OPT_SOURCE_BDADDR, src,
@@ -2905,14 +2910,26 @@ static GIOChannel *l2cap_connect(struct avdtp *session)
                                BT_IO_OPT_INVALID);
        }
 #else
-       io = bt_io_connect(avdtp_connect_cb, session,
-                               NULL, &err,
-                               BT_IO_OPT_SOURCE_BDADDR, src,
-                               BT_IO_OPT_DEST_BDADDR,
-                               device_get_address(session->device),
-                               BT_IO_OPT_PSM, AVDTP_PSM,
-                               BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
-                               BT_IO_OPT_INVALID);
+       if (session->phy)
+               io = bt_io_connect(avdtp_connect_cb, session,
+                                       NULL, &err,
+                                       BT_IO_OPT_SOURCE_BDADDR, src,
+                                       BT_IO_OPT_DEST_BDADDR,
+                                       device_get_address(session->device),
+                                       BT_IO_OPT_PSM, AVDTP_PSM,
+                                       BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
+                                       /* Set Input MTU to 0 to auto-tune */
+                                       BT_IO_OPT_IMTU, 0,
+                                       BT_IO_OPT_INVALID);
+       else
+               io = bt_io_connect(avdtp_connect_cb, session,
+                                       NULL, &err,
+                                       BT_IO_OPT_SOURCE_BDADDR, src,
+                                       BT_IO_OPT_DEST_BDADDR,
+                                       device_get_address(session->device),
+                                       BT_IO_OPT_PSM, AVDTP_PSM,
+                                       BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
+                                       BT_IO_OPT_INVALID);
 #endif
 
        if (!io) {