h4_recv.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. *
  4. * Generic Bluetooth HCI UART driver
  5. *
  6. * Copyright (C) 2015-2018 Intel Corporation
  7. */
  8. #include <linux/unaligned.h>
  9. struct h4_recv_pkt {
  10. u8 type; /* Packet type */
  11. u8 hlen; /* Header length */
  12. u8 loff; /* Data length offset in header */
  13. u8 lsize; /* Data length field size */
  14. u16 maxlen; /* Max overall packet length */
  15. int (*recv)(struct hci_dev *hdev, struct sk_buff *skb);
  16. };
  17. #define H4_RECV_ACL \
  18. .type = HCI_ACLDATA_PKT, \
  19. .hlen = HCI_ACL_HDR_SIZE, \
  20. .loff = 2, \
  21. .lsize = 2, \
  22. .maxlen = HCI_MAX_FRAME_SIZE \
  23. #define H4_RECV_SCO \
  24. .type = HCI_SCODATA_PKT, \
  25. .hlen = HCI_SCO_HDR_SIZE, \
  26. .loff = 2, \
  27. .lsize = 1, \
  28. .maxlen = HCI_MAX_SCO_SIZE
  29. #define H4_RECV_EVENT \
  30. .type = HCI_EVENT_PKT, \
  31. .hlen = HCI_EVENT_HDR_SIZE, \
  32. .loff = 1, \
  33. .lsize = 1, \
  34. .maxlen = HCI_MAX_EVENT_SIZE
  35. #define H4_RECV_ISO \
  36. .type = HCI_ISODATA_PKT, \
  37. .hlen = HCI_ISO_HDR_SIZE, \
  38. .loff = 2, \
  39. .lsize = 2, \
  40. .maxlen = HCI_MAX_FRAME_SIZE
  41. static inline struct sk_buff *h4_recv_buf(struct hci_dev *hdev,
  42. struct sk_buff *skb,
  43. const unsigned char *buffer,
  44. int count,
  45. const struct h4_recv_pkt *pkts,
  46. int pkts_count)
  47. {
  48. /* Check for error from previous call */
  49. if (IS_ERR(skb))
  50. skb = NULL;
  51. while (count) {
  52. int i, len;
  53. if (!skb) {
  54. for (i = 0; i < pkts_count; i++) {
  55. if (buffer[0] != (&pkts[i])->type)
  56. continue;
  57. skb = bt_skb_alloc((&pkts[i])->maxlen,
  58. GFP_ATOMIC);
  59. if (!skb)
  60. return ERR_PTR(-ENOMEM);
  61. hci_skb_pkt_type(skb) = (&pkts[i])->type;
  62. hci_skb_expect(skb) = (&pkts[i])->hlen;
  63. break;
  64. }
  65. /* Check for invalid packet type */
  66. if (!skb)
  67. return ERR_PTR(-EILSEQ);
  68. count -= 1;
  69. buffer += 1;
  70. }
  71. len = min_t(uint, hci_skb_expect(skb) - skb->len, count);
  72. skb_put_data(skb, buffer, len);
  73. count -= len;
  74. buffer += len;
  75. /* Check for partial packet */
  76. if (skb->len < hci_skb_expect(skb))
  77. continue;
  78. for (i = 0; i < pkts_count; i++) {
  79. if (hci_skb_pkt_type(skb) == (&pkts[i])->type)
  80. break;
  81. }
  82. if (i >= pkts_count) {
  83. kfree_skb(skb);
  84. return ERR_PTR(-EILSEQ);
  85. }
  86. if (skb->len == (&pkts[i])->hlen) {
  87. u16 dlen;
  88. switch ((&pkts[i])->lsize) {
  89. case 0:
  90. /* No variable data length */
  91. dlen = 0;
  92. break;
  93. case 1:
  94. /* Single octet variable length */
  95. dlen = skb->data[(&pkts[i])->loff];
  96. hci_skb_expect(skb) += dlen;
  97. if (skb_tailroom(skb) < dlen) {
  98. kfree_skb(skb);
  99. return ERR_PTR(-EMSGSIZE);
  100. }
  101. break;
  102. case 2:
  103. /* Double octet variable length */
  104. dlen = get_unaligned_le16(skb->data +
  105. (&pkts[i])->loff);
  106. hci_skb_expect(skb) += dlen;
  107. if (skb_tailroom(skb) < dlen) {
  108. kfree_skb(skb);
  109. return ERR_PTR(-EMSGSIZE);
  110. }
  111. break;
  112. default:
  113. /* Unsupported variable length */
  114. kfree_skb(skb);
  115. return ERR_PTR(-EILSEQ);
  116. }
  117. if (!dlen) {
  118. /* No more data, complete frame */
  119. (&pkts[i])->recv(hdev, skb);
  120. skb = NULL;
  121. }
  122. } else {
  123. /* Complete frame */
  124. (&pkts[i])->recv(hdev, skb);
  125. skb = NULL;
  126. }
  127. }
  128. return skb;
  129. }