Bluetooth: L2CAP: Add module option to enable ECRED mode
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tue, 3 Mar 2020 00:56:21 +0000 (16:56 -0800)
committerMarcel Holtmann <marcel@holtmann.org>
Sun, 8 Mar 2020 09:05:40 +0000 (10:05 +0100)
This should make it safe to have the code upstream without affecting
stable systems since there are a few details not sort out with ECRED
mode e.g: how to initiate multiple connections at once.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
include/net/bluetooth/l2cap.h
net/bluetooth/l2cap_core.c
net/bluetooth/l2cap_sock.c

index f466cdc..537aaea 100644 (file)
@@ -958,6 +958,7 @@ static inline long l2cap_chan_no_get_sndtimeo(struct l2cap_chan *chan)
 }
 
 extern bool disable_ertm;
+extern bool enable_ecred;
 
 int l2cap_init_sockets(void);
 void l2cap_cleanup_sockets(void);
index 6b24db7..697c0f7 100644 (file)
@@ -45,6 +45,7 @@
 #define LE_FLOWCTL_MAX_CREDITS 65535
 
 bool disable_ertm;
+bool enable_ecred;
 
 static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN | L2CAP_FEAT_UCD;
 
@@ -5849,6 +5850,9 @@ static inline int l2cap_ecred_conn_req(struct l2cap_conn *conn,
        int i, num_scid;
        bool defer = false;
 
+       if (!enable_ecred)
+               return -EINVAL;
+
        if (cmd_len < sizeof(*req) || cmd_len - sizeof(*req) % sizeof(u16)) {
                result = L2CAP_CR_LE_INVALID_PARAMS;
                goto response;
@@ -6092,6 +6096,9 @@ static inline int l2cap_ecred_reconf_req(struct l2cap_conn *conn,
        struct l2cap_chan *chan;
        int i, num_scid;
 
+       if (!enable_ecred)
+               return -EINVAL;
+
        if (cmd_len < sizeof(*req) || cmd_len - sizeof(*req) % sizeof(u16)) {
                result = L2CAP_CR_LE_INVALID_PARAMS;
                goto respond;
@@ -7723,7 +7730,12 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
        case L2CAP_MODE_BASIC:
                break;
        case L2CAP_MODE_LE_FLOWCTL:
+               break;
        case L2CAP_MODE_EXT_FLOWCTL:
+               if (!enable_ecred) {
+                       err = -EOPNOTSUPP;
+                       goto done;
+               }
                break;
        case L2CAP_MODE_ERTM:
        case L2CAP_MODE_STREAMING:
@@ -8301,3 +8313,6 @@ void l2cap_exit(void)
 
 module_param(disable_ertm, bool, 0644);
 MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");
+
+module_param(enable_ecred, bool, 0644);
+MODULE_PARM_DESC(enable_ecred, "Enable enhanced credit flow control mode");
index 44114db..0c636be 100644 (file)
@@ -273,7 +273,12 @@ static int l2cap_sock_listen(struct socket *sock, int backlog)
        switch (chan->mode) {
        case L2CAP_MODE_BASIC:
        case L2CAP_MODE_LE_FLOWCTL:
+               break;
        case L2CAP_MODE_EXT_FLOWCTL:
+               if (!enable_ecred) {
+                       err = -EOPNOTSUPP;
+                       goto done;
+               }
                break;
        case L2CAP_MODE_ERTM:
        case L2CAP_MODE_STREAMING: