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