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: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent cf1bce1d
...@@ -9027,11 +9027,19 @@ void mgmt_new_conn_param(struct hci_dev *hdev, bdaddr_t *bdaddr, ...@@ -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, ...@@ -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)
......
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