mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-05-24 10:39:52 +00:00
Bluetooth: mgmt: Make use of mgmt_send_event_skb in MGMT_EV_DEVICE_CONNECTED
This makes use of mgmt_alloc_skb to build MGMT_EV_DEVICE_CONNECTED so the data is copied directly to skb that is then sent using mgmt_send_event_skb eliminating the necessity of intermediary buffers. Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
cf1bce1de7
commit
e96741437e
1 changed files with 18 additions and 8 deletions
|
@ -9027,11 +9027,19 @@ void mgmt_new_conn_param(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||||
void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn,
|
void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn,
|
||||||
u8 *name, u8 name_len)
|
u8 *name, u8 name_len)
|
||||||
{
|
{
|
||||||
char buf[512];
|
struct sk_buff *skb;
|
||||||
struct mgmt_ev_device_connected *ev = (void *) buf;
|
struct mgmt_ev_device_connected *ev;
|
||||||
u16 eir_len = 0;
|
u16 eir_len = 0;
|
||||||
u32 flags = 0;
|
u32 flags = 0;
|
||||||
|
|
||||||
|
if (conn->le_adv_data_len > 0)
|
||||||
|
skb = mgmt_alloc_skb(hdev, MGMT_EV_DEVICE_CONNECTED,
|
||||||
|
conn->le_adv_data_len);
|
||||||
|
else
|
||||||
|
skb = mgmt_alloc_skb(hdev, MGMT_EV_DEVICE_CONNECTED,
|
||||||
|
2 + name_len + 5);
|
||||||
|
|
||||||
|
ev = skb_put(skb, sizeof(*ev));
|
||||||
bacpy(&ev->addr.bdaddr, &conn->dst);
|
bacpy(&ev->addr.bdaddr, &conn->dst);
|
||||||
ev->addr.type = link_to_bdaddr(conn->type, conn->dst_type);
|
ev->addr.type = link_to_bdaddr(conn->type, conn->dst_type);
|
||||||
|
|
||||||
|
@ -9045,24 +9053,26 @@ void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn,
|
||||||
* adding any BR/EDR data to the LE adv.
|
* adding any BR/EDR data to the LE adv.
|
||||||
*/
|
*/
|
||||||
if (conn->le_adv_data_len > 0) {
|
if (conn->le_adv_data_len > 0) {
|
||||||
memcpy(&ev->eir[eir_len],
|
skb_put_data(skb, conn->le_adv_data, conn->le_adv_data_len);
|
||||||
conn->le_adv_data, conn->le_adv_data_len);
|
|
||||||
eir_len = conn->le_adv_data_len;
|
eir_len = conn->le_adv_data_len;
|
||||||
} else {
|
} else {
|
||||||
if (name_len > 0)
|
if (name_len > 0) {
|
||||||
eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
|
eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
|
||||||
name, name_len);
|
name, name_len);
|
||||||
|
skb_put(skb, eir_len);
|
||||||
|
}
|
||||||
|
|
||||||
if (memcmp(conn->dev_class, "\0\0\0", 3) != 0)
|
if (memcmp(conn->dev_class, "\0\0\0", 3) != 0) {
|
||||||
eir_len = eir_append_data(ev->eir, eir_len,
|
eir_len = eir_append_data(ev->eir, eir_len,
|
||||||
EIR_CLASS_OF_DEV,
|
EIR_CLASS_OF_DEV,
|
||||||
conn->dev_class, 3);
|
conn->dev_class, 3);
|
||||||
|
skb_put(skb, 5);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ev->eir_len = cpu_to_le16(eir_len);
|
ev->eir_len = cpu_to_le16(eir_len);
|
||||||
|
|
||||||
mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
|
mgmt_event_skb(skb, NULL);
|
||||||
sizeof(*ev) + eir_len, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void disconnect_rsp(struct mgmt_pending_cmd *cmd, void *data)
|
static void disconnect_rsp(struct mgmt_pending_cmd *cmd, void *data)
|
||||||
|
|
Loading…
Add table
Reference in a new issue