Bluetooth: Don't send RFC for Basic Mode if only it is supported
authorGustavo F. Padovan <padovan@profusion.mobi>
Wed, 4 Aug 2010 02:49:29 +0000 (23:49 -0300)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 4 Aug 2010 14:23:00 +0000 (07:23 -0700)
If the remote side doesn't support Enhanced Retransmission Mode neither
Streaming Mode, we shall not send the RFC option.

Some devices that only supports Basic Mode do not understanding the RFC
option. This patch fixes the regression found with these devices.

Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/l2cap.c

index 9ba1e8eee37c7b1ae49c3a242bdefa176462659f..0f34e12751470f11d11e4400278fed4759c4999b 100644 (file)
@@ -2527,6 +2527,10 @@ done:
                if (pi->imtu != L2CAP_DEFAULT_MTU)
                        l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->imtu);
 
+               if (!(pi->conn->feat_mask & L2CAP_FEAT_ERTM) &&
+                               !(pi->conn->feat_mask & L2CAP_FEAT_STREAMING))
+                       break;
+
                rfc.mode            = L2CAP_MODE_BASIC;
                rfc.txwin_size      = 0;
                rfc.max_transmit    = 0;
@@ -2534,6 +2538,8 @@ done:
                rfc.monitor_timeout = 0;
                rfc.max_pdu_size    = 0;
 
+               l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
+                                                       (unsigned long) &rfc);
                break;
 
        case L2CAP_MODE_ERTM:
@@ -2546,6 +2552,9 @@ done:
                if (L2CAP_DEFAULT_MAX_PDU_SIZE > pi->conn->mtu - 10)
                        rfc.max_pdu_size = cpu_to_le16(pi->conn->mtu - 10);
 
+               l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
+                                                       (unsigned long) &rfc);
+
                if (!(pi->conn->feat_mask & L2CAP_FEAT_FCS))
                        break;
 
@@ -2566,6 +2575,9 @@ done:
                if (L2CAP_DEFAULT_MAX_PDU_SIZE > pi->conn->mtu - 10)
                        rfc.max_pdu_size = cpu_to_le16(pi->conn->mtu - 10);
 
+               l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
+                                                       (unsigned long) &rfc);
+
                if (!(pi->conn->feat_mask & L2CAP_FEAT_FCS))
                        break;
 
@@ -2577,9 +2589,6 @@ done:
                break;
        }
 
-       l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
-                                               (unsigned long) &rfc);
-
        /* FIXME: Need actual value of the flush timeout */
        //if (flush_to != L2CAP_DEFAULT_FLUSH_TO)
        //   l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO, 2, pi->flush_to);