Commit 5504c3a3 authored by Marcel Holtmann's avatar Marcel Holtmann

Bluetooth: Use individual flags for certain management events

Instead of hiding everything behind a general managment events flag,
introduce indivdual flags that allow fine control over which events are
send to a given management channel.
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
parent 37d3a1fa
...@@ -208,7 +208,10 @@ enum { ...@@ -208,7 +208,10 @@ enum {
HCI_MGMT_INDEX_EVENTS, HCI_MGMT_INDEX_EVENTS,
HCI_MGMT_UNCONF_INDEX_EVENTS, HCI_MGMT_UNCONF_INDEX_EVENTS,
HCI_MGMT_EXT_INDEX_EVENTS, HCI_MGMT_EXT_INDEX_EVENTS,
HCI_MGMT_GENERIC_EVENTS, HCI_MGMT_OPTION_EVENTS,
HCI_MGMT_SETTING_EVENTS,
HCI_MGMT_DEV_CLASS_EVENTS,
HCI_MGMT_LOCAL_NAME_EVENTS,
HCI_MGMT_OOB_DATA_EVENTS, HCI_MGMT_OOB_DATA_EVENTS,
}; };
......
...@@ -1164,7 +1164,10 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr, ...@@ -1164,7 +1164,10 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
hci_sock_set_flag(sk, HCI_MGMT_INDEX_EVENTS); hci_sock_set_flag(sk, HCI_MGMT_INDEX_EVENTS);
hci_sock_set_flag(sk, HCI_MGMT_UNCONF_INDEX_EVENTS); hci_sock_set_flag(sk, HCI_MGMT_UNCONF_INDEX_EVENTS);
hci_sock_set_flag(sk, HCI_MGMT_GENERIC_EVENTS); hci_sock_set_flag(sk, HCI_MGMT_OPTION_EVENTS);
hci_sock_set_flag(sk, HCI_MGMT_SETTING_EVENTS);
hci_sock_set_flag(sk, HCI_MGMT_DEV_CLASS_EVENTS);
hci_sock_set_flag(sk, HCI_MGMT_LOCAL_NAME_EVENTS);
} }
break; break;
} }
......
...@@ -256,13 +256,6 @@ static int mgmt_limited_event(u16 event, struct hci_dev *hdev, void *data, ...@@ -256,13 +256,6 @@ static int mgmt_limited_event(u16 event, struct hci_dev *hdev, void *data,
flag, skip_sk); flag, skip_sk);
} }
static int mgmt_generic_event(u16 event, struct hci_dev *hdev, void *data,
u16 len, struct sock *skip_sk)
{
return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
HCI_MGMT_GENERIC_EVENTS, skip_sk);
}
static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 len, static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 len,
struct sock *skip_sk) struct sock *skip_sk)
{ {
...@@ -579,8 +572,8 @@ static int new_options(struct hci_dev *hdev, struct sock *skip) ...@@ -579,8 +572,8 @@ static int new_options(struct hci_dev *hdev, struct sock *skip)
{ {
__le32 options = get_missing_options(hdev); __le32 options = get_missing_options(hdev);
return mgmt_generic_event(MGMT_EV_NEW_CONFIG_OPTIONS, hdev, &options, return mgmt_limited_event(MGMT_EV_NEW_CONFIG_OPTIONS, hdev, &options,
sizeof(options), skip); sizeof(options), HCI_MGMT_OPTION_EVENTS, skip);
} }
static int send_options_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev) static int send_options_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
...@@ -1007,8 +1000,8 @@ static int new_settings(struct hci_dev *hdev, struct sock *skip) ...@@ -1007,8 +1000,8 @@ static int new_settings(struct hci_dev *hdev, struct sock *skip)
{ {
__le32 ev = cpu_to_le32(get_current_settings(hdev)); __le32 ev = cpu_to_le32(get_current_settings(hdev));
return mgmt_generic_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, return mgmt_limited_event(MGMT_EV_NEW_SETTINGS, hdev, &ev,
sizeof(ev), skip); sizeof(ev), HCI_MGMT_SETTING_EVENTS, skip);
} }
int mgmt_new_settings(struct hci_dev *hdev) int mgmt_new_settings(struct hci_dev *hdev)
...@@ -3000,8 +2993,8 @@ static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data, ...@@ -3000,8 +2993,8 @@ static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
if (err < 0) if (err < 0)
goto failed; goto failed;
err = mgmt_generic_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, err = mgmt_limited_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data,
data, len, sk); len, HCI_MGMT_LOCAL_NAME_EVENTS, sk);
goto failed; goto failed;
} }
...@@ -6502,8 +6495,9 @@ void __mgmt_power_off(struct hci_dev *hdev) ...@@ -6502,8 +6495,9 @@ void __mgmt_power_off(struct hci_dev *hdev)
mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status); mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status);
if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0)
mgmt_generic_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev,
zero_cod, sizeof(zero_cod), NULL); zero_cod, sizeof(zero_cod),
HCI_MGMT_DEV_CLASS_EVENTS, NULL);
new_settings(hdev, match.sk); new_settings(hdev, match.sk);
...@@ -7100,8 +7094,8 @@ void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, ...@@ -7100,8 +7094,8 @@ void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match); mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match);
if (!status) if (!status)
mgmt_generic_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
dev_class, 3, NULL); 3, HCI_MGMT_DEV_CLASS_EVENTS, NULL);
if (match.sk) if (match.sk)
sock_put(match.sk); sock_put(match.sk);
...@@ -7130,8 +7124,8 @@ void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status) ...@@ -7130,8 +7124,8 @@ void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
return; return;
} }
mgmt_generic_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev), mgmt_limited_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
cmd ? cmd->sk : NULL); HCI_MGMT_LOCAL_NAME_EVENTS, cmd ? cmd->sk : NULL);
} }
static inline bool has_uuid(u8 *uuid, u16 uuid_count, u8 (*uuids)[16]) static inline bool has_uuid(u8 *uuid, u16 uuid_count, u8 (*uuids)[16])
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment