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