parser.h revision 771385b888a36bd003e5dbc91b414a4338bf849d
1/*
2   HCIDump - HCI packet analyzer
3   Copyright (C) 2000-2001 Maxim Krasnyansky <maxk@qualcomm.com>
4
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License version 2 as
7   published by the Free Software Foundation;
8
9   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
10   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
11   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
12   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
13   OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
14   RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
15   NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
16   USE OR PERFORMANCE OF THIS SOFTWARE.
17
18   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
19   TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
20*/
21
22/*
23 * $Id$
24 */
25
26#include <sys/socket.h>
27#include <sys/types.h>
28#include <asm/types.h>
29#include <netinet/in.h>
30
31struct frame {
32	void	*data;
33	int	data_len;
34	void	*ptr;
35	int	len;
36	int 	in;
37	int	handle;
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_L2CAP	0x0002
54#define FILT_RFCOMM	0x0004
55#define FILT_SDP	0x0008
56#define FILT_SCO	0x0010
57#define FILT_BNEP       0x0020
58
59#define STRUCT_OFFSET(type, member)  ((uint8_t *)&(((type *)NULL)->member) - \
60                                     (uint8_t *)((type *)NULL))
61
62#define STRUCT_END(type, member)     (STRUCT_OFFSET(type, member) + \
63                                     sizeof(((type *)NULL)->member))
64
65struct parser_t {
66	unsigned long flags;
67	unsigned long filter;
68	unsigned int defpsm;
69	int state;
70};
71
72extern struct parser_t parser;
73
74void init_parser(unsigned long flags, unsigned long filter,
75	unsigned int assume_psm);
76
77static inline int p_filter(unsigned long f)
78{
79	return !(parser.filter & f);
80}
81
82static inline void p_indent(int level, struct frame *f)
83{
84	if (level < 0) {
85		parser.state = 0;
86		return;
87	}
88
89	if (!parser.state) {
90		if (parser.flags & DUMP_TSTAMP)
91			printf("%8lu.%06lu ", f->ts.tv_sec, f->ts.tv_usec);
92		printf("%c ", (f->in ? '>' : '<'));
93		parser.state = 1;
94	} else
95		printf("  ");
96
97	if (level)
98		printf("%*c", (level*2), ' ');
99}
100
101/* get_uXX functions do byte swaping */
102
103static inline __u8 get_u8(struct frame *frm)
104{
105	__u8 *u8_ptr = frm->ptr;
106	frm->ptr += 1;
107	frm->len -= 1;
108	return *u8_ptr;
109}
110
111static inline __u16 get_u16(struct frame *frm)
112{
113	__u16 *u16_ptr = frm->ptr;
114	frm->ptr += 2;
115	frm->len -= 2;
116	return ntohs(*u16_ptr);
117}
118
119static inline __u32 get_u32(struct frame *frm)
120{
121	__u32 *u32_ptr = frm->ptr;
122	frm->ptr += 4;
123	frm->len -= 4;
124	return ntohl(*u32_ptr);
125}
126
127char *get_uuid_name(int uuid);
128
129void raw_dump(int level, struct frame *frm);
130void hci_dump(int level, struct frame *frm);
131void l2cap_dump(int level, struct frame *frm);
132void rfcomm_dump(int level, struct frame *frm);
133void sdp_dump(int level, struct frame *frm);
134void bnep_dump(int level, struct frame *frm);
135
136static inline void parse(struct frame *frm)
137{
138	p_indent(-1, NULL);
139	if (parser.flags & DUMP_RAW)
140		raw_dump(0, frm);
141	else
142		hci_dump(0, frm);
143	fflush(stdout);
144}
145