parser.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2000-2002 Maxim Krasnyansky <maxk@qualcomm.com>
  7. * Copyright (C) 2003-2011 Marcel Holtmann <marcel@holtmann.org>
  8. *
  9. *
  10. */
  11. #ifndef __PARSER_H
  12. #define __PARSER_H
  13. #include <time.h>
  14. #include <sys/time.h>
  15. #include <netinet/in.h>
  16. #include "lib/bluetooth.h"
  17. #include "src/shared/util.h"
  18. struct frame {
  19. void *data;
  20. uint32_t data_len;
  21. void *ptr;
  22. uint32_t len;
  23. uint16_t dev_id;
  24. uint8_t in;
  25. uint8_t central;
  26. uint16_t handle;
  27. uint16_t cid;
  28. uint16_t num;
  29. uint8_t dlci;
  30. uint8_t channel;
  31. unsigned long flags;
  32. struct timeval ts;
  33. int pppdump_fd;
  34. int audio_fd;
  35. };
  36. /* Parser flags */
  37. #define DUMP_WIDTH 20
  38. #define DUMP_ASCII 0x0001
  39. #define DUMP_HEX 0x0002
  40. #define DUMP_EXT 0x0004
  41. #define DUMP_RAW 0x0008
  42. #define DUMP_BPA 0x0010
  43. #define DUMP_TSTAMP 0x0100
  44. #define DUMP_VERBOSE 0x0200
  45. #define DUMP_BTSNOOP 0x1000
  46. #define DUMP_PKTLOG 0x2000
  47. #define DUMP_NOVENDOR 0x4000
  48. #define DUMP_TYPE_MASK (DUMP_ASCII | DUMP_HEX | DUMP_EXT)
  49. /* Parser filter */
  50. #define FILT_LMP 0x0001
  51. #define FILT_HCI 0x0002
  52. #define FILT_SCO 0x0004
  53. #define FILT_L2CAP 0x0008
  54. #define FILT_RFCOMM 0x0010
  55. #define FILT_SDP 0x0020
  56. #define FILT_BNEP 0x0040
  57. #define FILT_CMTP 0x0080
  58. #define FILT_HIDP 0x0100
  59. #define FILT_HCRP 0x0200
  60. #define FILT_AVDTP 0x0400
  61. #define FILT_AVCTP 0x0800
  62. #define FILT_ATT 0x1000
  63. #define FILT_SMP 0x2000
  64. #define FILT_A2MP 0x4000
  65. #define FILT_OBEX 0x00010000
  66. #define FILT_CAPI 0x00020000
  67. #define FILT_PPP 0x00040000
  68. #define FILT_SAP 0x00080000
  69. #define FILT_ERICSSON 0x10000000
  70. #define FILT_CSR 0x1000000a
  71. #define FILT_DGA 0x1000000c
  72. #define STRUCT_OFFSET(type, member) ((uint8_t *)&(((type *)NULL)->member) - \
  73. (uint8_t *)((type *)NULL))
  74. #define STRUCT_END(type, member) (STRUCT_OFFSET(type, member) + \
  75. sizeof(((type *)NULL)->member))
  76. #define DEFAULT_COMPID 65535
  77. struct parser_t {
  78. unsigned long flags;
  79. unsigned long filter;
  80. unsigned short defpsm;
  81. unsigned short defcompid;
  82. int state;
  83. int pppdump_fd;
  84. int audio_fd;
  85. };
  86. extern struct parser_t parser;
  87. void init_parser(unsigned long flags, unsigned long filter,
  88. unsigned short defpsm, unsigned short defcompid,
  89. int pppdump_fd, int audio_fd);
  90. static inline int p_filter(unsigned long f)
  91. {
  92. return !(parser.filter & f);
  93. }
  94. static inline void p_indent(int level, struct frame *f)
  95. {
  96. if (level < 0) {
  97. parser.state = 0;
  98. return;
  99. }
  100. if (!parser.state) {
  101. if (parser.flags & DUMP_TSTAMP) {
  102. if (parser.flags & DUMP_VERBOSE) {
  103. struct tm tm;
  104. time_t t = f->ts.tv_sec;
  105. localtime_r(&t, &tm);
  106. printf("%04d-%02d-%02d %02d:%02d:%02d.%06lu ",
  107. tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
  108. tm.tm_hour, tm.tm_min, tm.tm_sec, f->ts.tv_usec);
  109. } else
  110. printf("%8lu.%06lu ", f->ts.tv_sec, f->ts.tv_usec);
  111. }
  112. printf("%c ", (f->in ? '>' : '<'));
  113. parser.state = 1;
  114. } else
  115. printf(" ");
  116. if (level)
  117. printf("%*c", (level*2), ' ');
  118. }
  119. static inline void p_ba2str(const bdaddr_t *ba, char *str)
  120. {
  121. if (parser.flags & DUMP_NOVENDOR) {
  122. uint8_t b[6];
  123. baswap((bdaddr_t *) b, ba);
  124. sprintf(str, "%2.2X:%2.2X:%2.2X:*:*:*", b[0], b[1], b[2]);
  125. } else
  126. ba2str(ba, str);
  127. }
  128. /* get_uXX functions do byte swaping */
  129. static inline uint8_t p_get_u8(struct frame *frm)
  130. {
  131. uint8_t *u8_ptr = frm->ptr;
  132. frm->ptr += 1;
  133. frm->len -= 1;
  134. return *u8_ptr;
  135. }
  136. static inline uint16_t p_get_u16(struct frame *frm)
  137. {
  138. uint16_t *u16_ptr = frm->ptr;
  139. frm->ptr += 2;
  140. frm->len -= 2;
  141. return get_be16(u16_ptr);
  142. }
  143. static inline uint32_t p_get_u32(struct frame *frm)
  144. {
  145. uint32_t *u32_ptr = frm->ptr;
  146. frm->ptr += 4;
  147. frm->len -= 4;
  148. return get_be32(u32_ptr);
  149. }
  150. static inline uint64_t p_get_u64(struct frame *frm)
  151. {
  152. uint64_t *u64_ptr = frm->ptr;
  153. uint64_t u64 = get_unaligned(u64_ptr), tmp;
  154. frm->ptr += 8;
  155. frm->len -= 8;
  156. tmp = ntohl(u64 & 0xffffffff);
  157. u64 = (tmp << 32) | ntohl(u64 >> 32);
  158. return u64;
  159. }
  160. static inline void p_get_u128(struct frame *frm, uint64_t *l, uint64_t *h)
  161. {
  162. *h = p_get_u64(frm);
  163. *l = p_get_u64(frm);
  164. }
  165. char *get_uuid_name(int uuid);
  166. void set_proto(uint16_t handle, uint16_t psm, uint8_t channel, uint32_t proto);
  167. uint32_t get_proto(uint16_t handle, uint16_t psm, uint8_t channel);
  168. struct frame *add_frame(struct frame *frm);
  169. void del_frame(uint16_t handle, uint8_t dlci);
  170. uint8_t get_opcode(uint16_t handle, uint8_t dlci);
  171. void set_opcode(uint16_t handle, uint8_t dlci, uint8_t opcode);
  172. uint8_t get_status(uint16_t handle, uint8_t dlci);
  173. void set_status(uint16_t handle, uint8_t dlci, uint8_t status);
  174. void l2cap_clear(uint16_t handle);
  175. void ascii_dump(int level, struct frame *frm, int num);
  176. void hex_dump(int level, struct frame *frm, int num);
  177. void ext_dump(int level, struct frame *frm, int num);
  178. void raw_dump(int level, struct frame *frm);
  179. void raw_ndump(int level, struct frame *frm, int num);
  180. void lmp_dump(int level, struct frame *frm);
  181. void hci_dump(int level, struct frame *frm);
  182. void l2cap_dump(int level, struct frame *frm);
  183. void rfcomm_dump(int level, struct frame *frm);
  184. void sdp_dump(int level, struct frame *frm);
  185. void bnep_dump(int level, struct frame *frm);
  186. void cmtp_dump(int level, struct frame *frm);
  187. void hidp_dump(int level, struct frame *frm);
  188. void hcrp_dump(int level, struct frame *frm);
  189. void avdtp_dump(int level, struct frame *frm);
  190. void avctp_dump(int level, struct frame *frm, uint16_t psm);
  191. void avrcp_dump(int level, struct frame *frm, uint8_t hdr, uint16_t psm);
  192. void att_dump(int level, struct frame *frm);
  193. void smp_dump(int level, struct frame *frm);
  194. void sap_dump(int level, struct frame *frm);
  195. void obex_dump(int level, struct frame *frm);
  196. void capi_dump(int level, struct frame *frm);
  197. void ppp_dump(int level, struct frame *frm);
  198. void arp_dump(int level, struct frame *frm);
  199. void ip_dump(int level, struct frame *frm);
  200. void ericsson_dump(int level, struct frame *frm);
  201. void csr_dump(int level, struct frame *frm);
  202. void bpa_dump(int level, struct frame *frm);
  203. void amp_assoc_dump(int level, uint8_t *assoc, uint16_t len);
  204. static inline void parse(struct frame *frm)
  205. {
  206. p_indent(-1, NULL);
  207. if (parser.flags & DUMP_RAW)
  208. raw_dump(0, frm);
  209. else
  210. hci_dump(0, frm);
  211. fflush(stdout);
  212. }
  213. #endif /* __PARSER_H */