h4_recv.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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 <asm/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. static inline struct sk_buff *h4_recv_buf(struct hci_dev *hdev,
  36. struct sk_buff *skb,
  37. const unsigned char *buffer,
  38. int count,
  39. const struct h4_recv_pkt *pkts,
  40. int pkts_count)
  41. {
  42. /* Check for error from previous call */
  43. if (IS_ERR(skb))
  44. skb = NULL;
  45. while (count) {
  46. int i, len;
  47. if (!skb) {
  48. for (i = 0; i < pkts_count; i++) {
  49. if (buffer[0] != (&pkts[i])->type)
  50. continue;
  51. skb = bt_skb_alloc((&pkts[i])->maxlen,
  52. GFP_ATOMIC);
  53. if (!skb)
  54. return ERR_PTR(-ENOMEM);
  55. hci_skb_pkt_type(skb) = (&pkts[i])->type;
  56. hci_skb_expect(skb) = (&pkts[i])->hlen;
  57. break;
  58. }
  59. /* Check for invalid packet type */
  60. if (!skb)
  61. return ERR_PTR(-EILSEQ);
  62. count -= 1;
  63. buffer += 1;
  64. }
  65. len = min_t(uint, hci_skb_expect(skb) - skb->len, count);
  66. skb_put_data(skb, buffer, len);
  67. count -= len;
  68. buffer += len;
  69. /* Check for partial packet */
  70. if (skb->len < hci_skb_expect(skb))
  71. continue;
  72. for (i = 0; i < pkts_count; i++) {
  73. if (hci_skb_pkt_type(skb) == (&pkts[i])->type)
  74. break;
  75. }
  76. if (i >= pkts_count) {
  77. kfree_skb(skb);
  78. return ERR_PTR(-EILSEQ);
  79. }
  80. if (skb->len == (&pkts[i])->hlen) {
  81. u16 dlen;
  82. switch ((&pkts[i])->lsize) {
  83. case 0:
  84. /* No variable data length */
  85. dlen = 0;
  86. break;
  87. case 1:
  88. /* Single octet variable length */
  89. dlen = skb->data[(&pkts[i])->loff];
  90. hci_skb_expect(skb) += dlen;
  91. if (skb_tailroom(skb) < dlen) {
  92. kfree_skb(skb);
  93. return ERR_PTR(-EMSGSIZE);
  94. }
  95. break;
  96. case 2:
  97. /* Double octet variable length */
  98. dlen = get_unaligned_le16(skb->data +
  99. (&pkts[i])->loff);
  100. hci_skb_expect(skb) += dlen;
  101. if (skb_tailroom(skb) < dlen) {
  102. kfree_skb(skb);
  103. return ERR_PTR(-EMSGSIZE);
  104. }
  105. break;
  106. default:
  107. /* Unsupported variable length */
  108. kfree_skb(skb);
  109. return ERR_PTR(-EILSEQ);
  110. }
  111. if (!dlen) {
  112. /* No more data, complete frame */
  113. (&pkts[i])->recv(hdev, skb);
  114. skb = NULL;
  115. }
  116. } else {
  117. /* Complete frame */
  118. (&pkts[i])->recv(hdev, skb);
  119. skb = NULL;
  120. }
  121. }
  122. return skb;
  123. }