Bluetooth: L2CAP_BR: Add mode optional support

Add mode optional support for BR l2cap connect initiator role.

If `chan->rx.optional` is true, set the mode to basic mode instead of
return error code `-ENOTSUP`.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
This commit is contained in:
Lyle Zhu 2024-11-08 20:23:03 +08:00 committed by Anas Nashif
commit 88bd18b6cd

View file

@ -1999,15 +1999,27 @@ static int l2cap_br_check_chan_config(struct bt_conn *conn, struct bt_l2cap_br_c
if ((br_chan->rx.mode == BT_L2CAP_BR_LINK_MODE_FC) &&
(((br_chan_sig->info_feat_mask & L2CAP_FEAT_FC_MASK) == 0) ||
((L2CAP_EXTENDED_FEAT_MASK & L2CAP_FEAT_FC_MASK) == 0))) {
LOG_ERR("Invalid mode %u", br_chan->rx.mode);
return -ENOTSUP;
if (!br_chan->rx.optional) {
LOG_ERR("Invalid mode %u", br_chan->rx.mode);
return -ENOTSUP;
}
LOG_WRN("Unsupp mode %u, set basic mode", br_chan->rx.mode);
br_chan->rx.mode = BT_L2CAP_BR_LINK_MODE_BASIC;
break;
}
if ((br_chan->rx.mode == BT_L2CAP_BR_LINK_MODE_RET) &&
(((br_chan_sig->info_feat_mask & L2CAP_FEAT_RET_MASK) == 0) ||
((L2CAP_EXTENDED_FEAT_MASK & L2CAP_FEAT_RET_MASK) == 0))) {
LOG_ERR("Invalid mode %u", br_chan->rx.mode);
return -ENOTSUP;
if (!br_chan->rx.optional) {
LOG_ERR("Invalid mode %u", br_chan->rx.mode);
return -ENOTSUP;
}
LOG_WRN("Unsupp mode %u, set basic mode", br_chan->rx.mode);
br_chan->rx.mode = BT_L2CAP_BR_LINK_MODE_BASIC;
break;
}
if (((br_chan_sig->info_feat_mask & L2CAP_FEAT_ENH_RET_MASK) != 0) &&
@ -2023,15 +2035,27 @@ static int l2cap_br_check_chan_config(struct bt_conn *conn, struct bt_l2cap_br_c
case BT_L2CAP_BR_LINK_MODE_ERET:
if (((br_chan_sig->info_feat_mask & L2CAP_FEAT_ENH_RET_MASK) == 0) ||
((L2CAP_EXTENDED_FEAT_MASK & L2CAP_FEAT_ENH_RET_MASK) == 0)) {
LOG_ERR("Invalid mode %u", br_chan->rx.mode);
return -ENOTSUP;
if (!br_chan->rx.optional) {
LOG_ERR("Invalid mode %u", br_chan->rx.mode);
return -ENOTSUP;
}
LOG_WRN("Unsupp mode %u, set basic mode", br_chan->rx.mode);
br_chan->rx.mode = BT_L2CAP_BR_LINK_MODE_BASIC;
break;
}
break;
case BT_L2CAP_BR_LINK_MODE_STREAM:
if (((br_chan_sig->info_feat_mask & L2CAP_FEAT_STREAM_MASK) == 0) ||
((L2CAP_EXTENDED_FEAT_MASK & L2CAP_FEAT_STREAM_MASK) == 0)) {
LOG_ERR("Invalid mode %u", br_chan->rx.mode);
return -ENOTSUP;
if (!br_chan->rx.optional) {
LOG_ERR("Invalid mode %u", br_chan->rx.mode);
return -ENOTSUP;
}
LOG_WRN("Unsupp mode %u, set basic mode", br_chan->rx.mode);
br_chan->rx.mode = BT_L2CAP_BR_LINK_MODE_BASIC;
break;
}
break;
default: