Commit c71e97bf authored by Johan Hedberg's avatar Johan Hedberg Committed by Gustavo F. Padovan

Bluetooth: Add management events for controller addition & removal

This patch adds Bluetooth Management interface events for controller
addition and removal. The events correspond to the existing HCI_DEV_REG
and HCI_DEV_UNREG stack internal events.
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@nokia.com>
Acked-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarGustavo F. Padovan <padovan@profusion.mobi>
parent f7b64e69
...@@ -662,6 +662,8 @@ void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb); ...@@ -662,6 +662,8 @@ void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb);
/* Management interface */ /* Management interface */
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len); int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len);
int mgmt_index_added(u16 index);
int mgmt_index_removed(u16 index);
/* HCI info for socket */ /* HCI info for socket */
#define hci_pi(sk) ((struct hci_pinfo *) sk) #define hci_pi(sk) ((struct hci_pinfo *) sk)
......
...@@ -75,3 +75,13 @@ struct mgmt_ev_controller_error { ...@@ -75,3 +75,13 @@ struct mgmt_ev_controller_error {
__le16 index; __le16 index;
__u8 error_code; __u8 error_code;
} __packed; } __packed;
#define MGMT_EV_INDEX_ADDED 0x0004
struct mgmt_ev_index_added {
__le16 index;
} __packed;
#define MGMT_EV_INDEX_REMOVED 0x0005
struct mgmt_ev_index_removed {
__le16 index;
} __packed;
...@@ -960,6 +960,7 @@ int hci_register_dev(struct hci_dev *hdev) ...@@ -960,6 +960,7 @@ int hci_register_dev(struct hci_dev *hdev)
} }
} }
mgmt_index_added(hdev->id);
hci_notify(hdev, HCI_DEV_REG); hci_notify(hdev, HCI_DEV_REG);
return id; return id;
...@@ -989,6 +990,7 @@ int hci_unregister_dev(struct hci_dev *hdev) ...@@ -989,6 +990,7 @@ int hci_unregister_dev(struct hci_dev *hdev)
for (i = 0; i < NUM_REASSEMBLY; i++) for (i = 0; i < NUM_REASSEMBLY; i++)
kfree_skb(hdev->reassembly[i]); kfree_skb(hdev->reassembly[i]);
mgmt_index_removed(hdev->id);
hci_notify(hdev, HCI_DEV_UNREG); hci_notify(hdev, HCI_DEV_UNREG);
if (hdev->rfkill) { if (hdev->rfkill) {
......
...@@ -265,3 +265,44 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen) ...@@ -265,3 +265,44 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
kfree(buf); kfree(buf);
return err; return err;
} }
static int mgmt_event(u16 event, void *data, u16 data_len)
{
struct sk_buff *skb;
struct mgmt_hdr *hdr;
skb = alloc_skb(sizeof(*hdr) + data_len, GFP_ATOMIC);
if (!skb)
return -ENOMEM;
bt_cb(skb)->channel = HCI_CHANNEL_CONTROL;
hdr = (void *) skb_put(skb, sizeof(*hdr));
hdr->opcode = cpu_to_le16(event);
hdr->len = cpu_to_le16(data_len);
memcpy(skb_put(skb, data_len), data, data_len);
hci_send_to_sock(NULL, skb);
kfree_skb(skb);
return 0;
}
int mgmt_index_added(u16 index)
{
struct mgmt_ev_index_added ev;
put_unaligned_le16(index, &ev.index);
return mgmt_event(MGMT_EV_INDEX_ADDED, &ev, sizeof(ev));
}
int mgmt_index_removed(u16 index)
{
struct mgmt_ev_index_added ev;
put_unaligned_le16(index, &ev.index);
return mgmt_event(MGMT_EV_INDEX_REMOVED, &ev, sizeof(ev));
}
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