Bluetooth: Convert HCI_CONN_MASTER flag to a conn->role variable
Having a dedicated u8 role variable in the hci_conn struct greatly simplifies tracking of the role, since this is the native way that it's represented on the HCI level. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
Родитель
ba165a90b5
Коммит
40bef302f6
|
@ -371,6 +371,7 @@ struct hci_conn {
|
|||
__u16 state;
|
||||
__u8 mode;
|
||||
__u8 type;
|
||||
__u8 role;
|
||||
bool out;
|
||||
__u8 attempt;
|
||||
__u8 dev_class[3];
|
||||
|
@ -540,7 +541,6 @@ enum {
|
|||
HCI_CONN_POWER_SAVE,
|
||||
HCI_CONN_REMOTE_OOB,
|
||||
HCI_CONN_FLUSH_KEY,
|
||||
HCI_CONN_MASTER,
|
||||
HCI_CONN_ENCRYPT,
|
||||
HCI_CONN_AUTH,
|
||||
HCI_CONN_SECURE,
|
||||
|
|
|
@ -66,8 +66,7 @@ static void hci_acl_create_connection(struct hci_conn *conn)
|
|||
|
||||
conn->state = BT_CONNECT;
|
||||
conn->out = true;
|
||||
|
||||
set_bit(HCI_CONN_MASTER, &conn->flags);
|
||||
conn->role = HCI_ROLE_MASTER;
|
||||
|
||||
conn->attempt++;
|
||||
|
||||
|
@ -335,7 +334,7 @@ static void hci_conn_timeout(struct work_struct *work)
|
|||
* event handling and hci_clock_offset_evt function.
|
||||
*/
|
||||
if (conn->type == ACL_LINK &&
|
||||
test_bit(HCI_CONN_MASTER, &conn->flags)) {
|
||||
conn->role == HCI_ROLE_MASTER) {
|
||||
struct hci_dev *hdev = conn->hdev;
|
||||
struct hci_cp_read_clock_offset cp;
|
||||
|
||||
|
@ -786,8 +785,8 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
|
|||
goto create_conn;
|
||||
}
|
||||
|
||||
conn->out = true;
|
||||
set_bit(HCI_CONN_MASTER, &conn->flags);
|
||||
conn->out = true;
|
||||
conn->role = HCI_ROLE_MASTER;
|
||||
|
||||
params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
|
||||
if (params) {
|
||||
|
@ -1076,7 +1075,7 @@ int hci_conn_switch_role(struct hci_conn *conn, __u8 role)
|
|||
{
|
||||
BT_DBG("hcon %p", conn);
|
||||
|
||||
if (!role && test_bit(HCI_CONN_MASTER, &conn->flags))
|
||||
if (role == conn->role)
|
||||
return 1;
|
||||
|
||||
if (!test_and_set_bit(HCI_CONN_RSWITCH_PEND, &conn->flags)) {
|
||||
|
@ -1151,7 +1150,7 @@ static u32 get_link_mode(struct hci_conn *conn)
|
|||
{
|
||||
u32 link_mode = 0;
|
||||
|
||||
if (test_bit(HCI_CONN_MASTER, &conn->flags))
|
||||
if (conn->role == HCI_ROLE_MASTER)
|
||||
link_mode |= HCI_LM_MASTER;
|
||||
|
||||
if (test_bit(HCI_CONN_ENCRYPT, &conn->flags))
|
||||
|
|
|
@ -101,12 +101,8 @@ static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb)
|
|||
hci_dev_lock(hdev);
|
||||
|
||||
conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
|
||||
if (conn) {
|
||||
if (rp->role)
|
||||
clear_bit(HCI_CONN_MASTER, &conn->flags);
|
||||
else
|
||||
set_bit(HCI_CONN_MASTER, &conn->flags);
|
||||
}
|
||||
if (conn)
|
||||
conn->role = rp->role;
|
||||
|
||||
hci_dev_unlock(hdev);
|
||||
}
|
||||
|
@ -1420,8 +1416,8 @@ static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
|
|||
if (!conn) {
|
||||
conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr);
|
||||
if (conn) {
|
||||
conn->out = true;
|
||||
set_bit(HCI_CONN_MASTER, &conn->flags);
|
||||
conn->out = true;
|
||||
conn->role = HCI_ROLE_MASTER;
|
||||
} else
|
||||
BT_ERR("No memory for new connection");
|
||||
}
|
||||
|
@ -2924,12 +2920,8 @@ static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
|||
|
||||
conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
|
||||
if (conn) {
|
||||
if (!ev->status) {
|
||||
if (ev->role)
|
||||
clear_bit(HCI_CONN_MASTER, &conn->flags);
|
||||
else
|
||||
set_bit(HCI_CONN_MASTER, &conn->flags);
|
||||
}
|
||||
if (!ev->status)
|
||||
conn->role = ev->role;
|
||||
|
||||
clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
|
||||
|
||||
|
@ -4116,10 +4108,9 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
|||
|
||||
conn->dst_type = ev->bdaddr_type;
|
||||
|
||||
if (ev->role == HCI_ROLE_MASTER) {
|
||||
conn->role = ev->role;
|
||||
if (conn->role == HCI_ROLE_MASTER)
|
||||
conn->out = true;
|
||||
set_bit(HCI_CONN_MASTER, &conn->flags);
|
||||
}
|
||||
|
||||
/* If we didn't have a hci_conn object previously
|
||||
* but we're in master role this must be something
|
||||
|
@ -4527,7 +4518,7 @@ static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
|
|||
return send_conn_param_neg_reply(hdev, handle,
|
||||
HCI_ERROR_INVALID_LL_PARAMS);
|
||||
|
||||
if (test_bit(HCI_CONN_MASTER, &hcon->flags)) {
|
||||
if (hcon->role == HCI_ROLE_MASTER) {
|
||||
struct hci_conn_params *params;
|
||||
u8 store_hint;
|
||||
|
||||
|
|
|
@ -1487,7 +1487,7 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn)
|
|||
* been configured for this connection. If not, then trigger
|
||||
* the connection update procedure.
|
||||
*/
|
||||
if (!test_bit(HCI_CONN_MASTER, &hcon->flags) &&
|
||||
if (hcon->role == HCI_ROLE_SLAVE &&
|
||||
(hcon->le_conn_interval < hcon->le_conn_min_interval ||
|
||||
hcon->le_conn_interval > hcon->le_conn_max_interval)) {
|
||||
struct l2cap_conn_param_update_req req;
|
||||
|
@ -5227,7 +5227,7 @@ static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
|
|||
u16 min, max, latency, to_multiplier;
|
||||
int err;
|
||||
|
||||
if (!test_bit(HCI_CONN_MASTER, &hcon->flags))
|
||||
if (hcon->role != HCI_ROLE_MASTER)
|
||||
return -EINVAL;
|
||||
|
||||
if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
|
||||
|
|
|
@ -445,7 +445,7 @@ static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
|
|||
* Confirms and the slave Enters the passkey.
|
||||
*/
|
||||
if (method == OVERLAP) {
|
||||
if (test_bit(HCI_CONN_MASTER, &hcon->flags))
|
||||
if (hcon->role == HCI_ROLE_MASTER)
|
||||
method = CFM_PASSKEY;
|
||||
else
|
||||
method = REQ_PASSKEY;
|
||||
|
@ -686,7 +686,7 @@ static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
|
|||
if (skb->len < sizeof(*req))
|
||||
return SMP_INVALID_PARAMS;
|
||||
|
||||
if (test_bit(HCI_CONN_MASTER, &conn->hcon->flags))
|
||||
if (conn->hcon->role != HCI_ROLE_SLAVE)
|
||||
return SMP_CMD_NOTSUPP;
|
||||
|
||||
if (!test_and_set_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags))
|
||||
|
@ -755,7 +755,7 @@ static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
|
|||
if (skb->len < sizeof(*rsp))
|
||||
return SMP_INVALID_PARAMS;
|
||||
|
||||
if (!test_bit(HCI_CONN_MASTER, &conn->hcon->flags))
|
||||
if (conn->hcon->role != HCI_ROLE_MASTER)
|
||||
return SMP_CMD_NOTSUPP;
|
||||
|
||||
skb_pull(skb, sizeof(*rsp));
|
||||
|
@ -903,7 +903,7 @@ static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
|
|||
if (skb->len < sizeof(*rp))
|
||||
return SMP_INVALID_PARAMS;
|
||||
|
||||
if (!test_bit(HCI_CONN_MASTER, &conn->hcon->flags))
|
||||
if (hcon->role != HCI_ROLE_MASTER)
|
||||
return SMP_CMD_NOTSUPP;
|
||||
|
||||
sec_level = authreq_to_seclevel(rp->auth_req);
|
||||
|
@ -961,7 +961,7 @@ int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
|
|||
if (sec_level > hcon->pending_sec_level)
|
||||
hcon->pending_sec_level = sec_level;
|
||||
|
||||
if (test_bit(HCI_CONN_MASTER, &hcon->flags))
|
||||
if (hcon->role == HCI_ROLE_MASTER)
|
||||
if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
|
||||
return 0;
|
||||
|
||||
|
@ -981,7 +981,7 @@ int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
|
|||
hcon->pending_sec_level > BT_SECURITY_MEDIUM)
|
||||
authreq |= SMP_AUTH_MITM;
|
||||
|
||||
if (test_bit(HCI_CONN_MASTER, &hcon->flags)) {
|
||||
if (hcon->role == HCI_ROLE_MASTER) {
|
||||
struct smp_cmd_pairing cp;
|
||||
|
||||
build_pairing_cmd(conn, &cp, NULL, authreq);
|
||||
|
|
Загрузка…
Ссылка в новой задаче