|
@@ -3071,6 +3071,17 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static inline void set_default_fcs(struct l2cap_pinfo *pi)
|
|
|
+{
|
|
|
+ /* FCS is enabled only in ERTM or streaming mode, if one or both
|
|
|
+ * sides request it.
|
|
|
+ */
|
|
|
+ if (pi->mode != L2CAP_MODE_ERTM && pi->mode != L2CAP_MODE_STREAMING)
|
|
|
+ pi->fcs = L2CAP_FCS_NONE;
|
|
|
+ else if (!(pi->conf_state & L2CAP_CONF_NO_FCS_RECV))
|
|
|
+ pi->fcs = L2CAP_FCS_CRC16;
|
|
|
+}
|
|
|
+
|
|
|
static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
|
|
|
{
|
|
|
struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
|
|
@@ -3135,9 +3146,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
|
|
|
goto unlock;
|
|
|
|
|
|
if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) {
|
|
|
- if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_NO_FCS_RECV) ||
|
|
|
- l2cap_pi(sk)->fcs != L2CAP_FCS_NONE)
|
|
|
- l2cap_pi(sk)->fcs = L2CAP_FCS_CRC16;
|
|
|
+ set_default_fcs(l2cap_pi(sk));
|
|
|
|
|
|
sk->sk_state = BT_CONNECTED;
|
|
|
|
|
@@ -3225,9 +3234,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr
|
|
|
l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE;
|
|
|
|
|
|
if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) {
|
|
|
- if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_NO_FCS_RECV) ||
|
|
|
- l2cap_pi(sk)->fcs != L2CAP_FCS_NONE)
|
|
|
- l2cap_pi(sk)->fcs = L2CAP_FCS_CRC16;
|
|
|
+ set_default_fcs(l2cap_pi(sk));
|
|
|
|
|
|
sk->sk_state = BT_CONNECTED;
|
|
|
l2cap_pi(sk)->next_tx_seq = 0;
|