parser.h revision 803752117135528b1adebf0fa045596e188a996d
1/*
2 *
3 *  Bluetooth packet analyzer - Common parser functions
4 *
5 *  Copyright (C) 2000-2002  Maxim Krasnyansky <maxk@qualcomm.com>
6 *  Copyright (C) 2003-2004  Marcel Holtmann <marcel@holtmann.org>
7 *
8 *
9 *  This program is free software; you can redistribute it and/or modify
10 *  it under the terms of the GNU General Public License as published by
11 *  the Free Software Foundation; either version 2 of the License, or
12 *  (at your option) any later version.
13 *
14 *  This program is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this program; if not, write to the Free Software
21 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22 *
23 *
24 *  $Id$
25 */
26
27#ifndef __PARSER_H
28#define __PARSER_H
29
30struct frame {
31	void	*data;
32	int	data_len;
33	void	*ptr;
34	int	len;
35	int	in;
36	int	handle;
37	int	cid;
38	long	flags;
39	struct	timeval ts;
40};
41
42/* Parser flags */
43#define DUMP_WIDTH	20
44
45#define DUMP_HEX	0x01
46#define DUMP_ASCII	0x02
47#define DUMP_TYPE_MASK	(DUMP_HEX | DUMP_ASCII)
48#define DUMP_TSTAMP	0x04
49#define DUMP_RAW	0x08
50
51/* Parser filter */
52#define FILT_HCI	0x0001
53#define FILT_SCO	0x0002
54#define FILT_L2CAP	0x0004
55#define FILT_RFCOMM	0x0008
56#define FILT_SDP	0x0010
57#define FILT_BNEP	0x0020
58#define FILT_CMTP	0x0040
59#define FILT_HIDP	0x0080
60#define FILT_HCRP	0x0100
61#define FILT_AVDTP	0x0200
62
63#define FILT_CAPI	0x00010000
64
65#define STRUCT_OFFSET(type, member)  ((uint8_t *)&(((type *)NULL)->member) - \
66                                     (uint8_t *)((type *)NULL))
67
68#define STRUCT_END(type, member)     (STRUCT_OFFSET(type, member) + \
69                                     sizeof(((type *)NULL)->member))
70
71struct parser_t {
72	unsigned long flags;
73	unsigned long filter;
74	unsigned int defpsm;
75	int state;
76};
77
78extern struct parser_t parser;
79
80void init_parser(unsigned long flags, unsigned long filter,
81	unsigned int assume_psm);
82
83static inline int p_filter(unsigned long f)
84{
85	return !(parser.filter & f);
86}
87
88static inline void p_indent(int level, struct frame *f)
89{
90	if (level < 0) {
91		parser.state = 0;
92		return;
93	}
94
95	if (!parser.state) {
96		if (parser.flags & DUMP_TSTAMP)
97			printf("%8lu.%06lu ", f->ts.tv_sec, f->ts.tv_usec);
98		printf("%c ", (f->in ? '>' : '<'));
99		parser.state = 1;
100	} else
101		printf("  ");
102
103	if (level)
104		printf("%*c", (level*2), ' ');
105}
106
107/* get_uXX functions do byte swaping */
108
109/* use memmove to prevent gcc from using builtin memcpy */
110#define get_unaligned(p) \
111	({ __typeof__(*(p)) t; memmove(&t, (p), sizeof(t)); t; })
112
113static inline uint8_t get_u8(struct frame *frm)
114{
115	uint8_t *u8_ptr = frm->ptr;
116	frm->ptr += 1;
117	frm->len -= 1;
118	return *u8_ptr;
119}
120
121static inline uint16_t get_u16(struct frame *frm)
122{
123	uint16_t *u16_ptr = frm->ptr;
124	frm->ptr += 2;
125	frm->len -= 2;
126	return ntohs(get_unaligned(u16_ptr));
127}
128
129static inline uint32_t get_u32(struct frame *frm)
130{
131	uint32_t *u32_ptr = frm->ptr;
132	frm->ptr += 4;
133	frm->len -= 4;
134	return ntohl(get_unaligned(u32_ptr));
135}
136
137static inline uint64_t get_u64(struct frame *frm)
138{
139	uint64_t *u64_ptr = frm->ptr;
140	uint64_t u64 = get_unaligned(u64_ptr), tmp;
141	frm->ptr += 8;
142	frm->len -= 8;
143	tmp = ntohl(u64 & 0xffffffff);
144	u64 = (tmp << 32) | ntohl(u64 >> 32);
145	return u64;
146}
147
148static inline void get_u128(struct frame *frm, uint64_t *l, uint64_t *h)
149{
150	*h = get_u64(frm);
151	*l = get_u64(frm);
152}
153
154char *get_uuid_name(int uuid);
155
156void set_proto(uint16_t handle, uint16_t psm, uint32_t proto);
157uint32_t get_proto(uint16_t handle, uint16_t psm);
158
159void ascii_dump(int level, struct frame *frm, int num);
160void hex_dump(int level, struct frame *frm, int num);
161void raw_dump(int level, struct frame *frm);
162void raw_ndump(int level, struct frame *frm, int num);
163
164void hci_dump(int level, struct frame *frm);
165void l2cap_dump(int level, struct frame *frm);
166void rfcomm_dump(int level, struct frame *frm);
167void sdp_dump(int level, struct frame *frm);
168void bnep_dump(int level, struct frame *frm);
169void cmtp_dump(int level, struct frame *frm);
170void hidp_dump(int level, struct frame *frm);
171void hcrp_dump(int level, struct frame *frm);
172void avdtp_dump(int level, struct frame *frm);
173
174void capi_dump(int level, struct frame *frm);
175
176static inline void parse(struct frame *frm)
177{
178	p_indent(-1, NULL);
179	if (parser.flags & DUMP_RAW)
180		raw_dump(0, frm);
181	else
182		hci_dump(0, frm);
183	fflush(stdout);
184}
185
186#endif /* __PARSER_H */
187