static int l2cap_send_rsp(struct l2cap_conn *conn, __u8 ident, __u8 code, __u16 len, void *data) { struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data); BT_DBG("code 0x%2.2x", code); if (!skb) return -ENOMEM; return hci_send_acl(conn->hcon, skb, 0); }
static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data) { struct sk_buff *skb = smp_build_cmd(conn, code, len, data); BT_DBG("code 0x%2.2x", code); if (!skb) return; hci_send_acl(conn->hcon, NULL, skb, 0); }
static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data) { struct sk_buff *skb = smp_build_cmd(conn, code, len, data); BT_DBG("code 0x%2.2x", code); if (!skb) return; hci_send_acl(conn->hcon, skb, 0); mod_timer(&conn->security_timer, jiffies + msecs_to_jiffies(SMP_TIMEOUT)); }
static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data) { struct sk_buff *skb = smp_build_cmd(conn, code, len, data); BT_DBG("code 0x%2.2x", code); if (!skb) return; skb->priority = HCI_PRIO_MAX; hci_send_acl(conn->hchan, skb, 0); cancel_delayed_work_sync(&conn->security_timer); schedule_delayed_work(&conn->security_timer, SMP_TIMEOUT); }
static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data) { struct sk_buff *skb = smp_build_cmd(conn, code, len, data); BT_DBG("code 0x%2.2x", code); if (!skb) return; skb->priority = HCI_PRIO_MAX; hci_send_acl(conn->hcon, skb, 0); /* SSBT :: NEO + (0213) */ del_timer_sync(&conn->security_timer); mod_timer(&conn->security_timer, jiffies + msecs_to_jiffies(SMP_TIMEOUT)); }
void hci_handle_transport_event(u8 channel, u8* buffer, u16 size) { switch (channel) { case BT_COMMAND_CHANNEL: hci_send_command(buffer, size); break; case BT_EVENT_CHANNEL: hci_event_received(buffer, size); break; case BT_ACL_IN_CHANNEL: hci_acl_received(buffer, size); break; case BT_ACL_OUT_CHANNEL: hci_send_acl(buffer, size); break; } }
static int l2cap_chan_send(struct sock *sk, struct msghdr *msg, int len) { struct l2cap_conn *conn = l2cap_pi(sk)->conn; struct sk_buff *skb, **frag; int err, hlen, count, sent=0; l2cap_hdr *lh; BT_DBG("sk %p len %d", sk, len); /* First fragment (with L2CAP header) */ if (sk->type == SOCK_DGRAM) hlen = L2CAP_HDR_SIZE + 2; else hlen = L2CAP_HDR_SIZE; count = MIN(conn->mtu - hlen, len); skb = bluez_skb_send_alloc(sk, hlen + count, msg->msg_flags & MSG_DONTWAIT, &err); if (!skb) return err; /* Create L2CAP header */ lh = (l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); lh->cid = __cpu_to_le16(l2cap_pi(sk)->dcid); lh->len = __cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE)); if (sk->type == SOCK_DGRAM) put_unaligned(l2cap_pi(sk)->psm, (__u16 *) skb_put(skb, 2)); if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count)) { err = -EFAULT; goto fail; } sent += count; len -= count; /* Continuation fragments (no L2CAP header) */ frag = &skb_shinfo(skb)->frag_list; while (len) { count = MIN(conn->mtu, len); *frag = bluez_skb_send_alloc(sk, count, msg->msg_flags & MSG_DONTWAIT, &err); if (!*frag) goto fail; if (memcpy_fromiovec(skb_put(*frag, count), msg->msg_iov, count)) { err = -EFAULT; goto fail; } sent += count; len -= count; frag = &(*frag)->next; } if ((err = hci_send_acl(conn->hcon, skb, 0)) < 0) goto fail; return sent; fail: kfree_skb(skb); return err; }