/* Generate internal stack event */ void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data) { struct hci_event_hdr *hdr; struct hci_ev_stack_internal *ev; struct sk_buff *skb; skb = bt_skb_alloc(HCI_EVENT_HDR_SIZE + sizeof(*ev) + dlen, GFP_ATOMIC); if (!skb) return; hdr = (void *) skb_put(skb, HCI_EVENT_HDR_SIZE); hdr->evt = HCI_EV_STACK_INTERNAL; hdr->plen = sizeof(*ev) + dlen; ev = (void *) skb_put(skb, sizeof(*ev) + dlen); ev->type = type; memcpy(ev->data, data, dlen); bt_cb(skb)->incoming = 1; __net_timestamp(skb); bt_cb(skb)->pkt_type = HCI_EVENT_PKT; skb->dev = (void *) hdev; hci_send_to_sock(hdev, skb); kfree_skb(skb); }
/* General internal stack event */ void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data) { hci_event_hdr *eh; evt_stack_internal *si; struct sk_buff *skb; int size; void *ptr; size = HCI_EVENT_HDR_SIZE + EVT_STACK_INTERNAL_SIZE + dlen; skb = bluez_skb_alloc(size, GFP_ATOMIC); if (!skb) return; ptr = skb_put(skb, size); eh = ptr; eh->evt = EVT_STACK_INTERNAL; eh->plen = EVT_STACK_INTERNAL_SIZE + dlen; ptr += HCI_EVENT_HDR_SIZE; si = ptr; si->type = type; memcpy(si->data, data, dlen); skb->pkt_type = HCI_EVENT_PKT; skb->dev = (void *) hdev; hci_send_to_sock(hdev, skb); kfree_skb(skb); }