diff --git a/tools/parser/bnep.c b/tools/parser/bnep.c
index 2da06db..7dc42e4 100644
--- a/tools/parser/bnep.c
+++ b/tools/parser/bnep.c
/*
- HCIDump - HCI packet analyzer
- Copyright (C) 2000-2001 Maxim Krasnyansky <maxk@qualcomm.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2 as
- published by the Free Software Foundation;
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
- IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
- OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
- RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
- USE OR PERFORMANCE OF THIS SOFTWARE.
-
- ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
- TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+ HCIDump - HCI packet analyzer
+ Copyright (C) 2000-2001 Maxim Krasnyansky <maxk@qualcomm.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2 as
+ published by the Free Software Foundation;
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+ OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+ RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+ USE OR PERFORMANCE OF THIS SOFTWARE.
+
+ ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+ TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
*/
/*
#include <netinet/if_ether.h>
#include <arpa/inet.h>
-
-static inline void hex_ndump(int level, struct frame *frm, int num)
-{
- unsigned char *buf = frm->ptr;
- register int i,n;
-
- for (i=0, n=1; i < num; i++, n++) {
- if (n == 1)
- p_indent(level, frm);
- printf("%2.2X ", buf[i]);
- if (n == DUMP_WIDTH) {
- printf("\n");
- n = 0;
- }
- }
- if (i && n!=1)
- printf("\n");
- frm->ptr += num;
- frm->len -= num;
-}
-
+#define PAYLOAD_RAW_DUMP
static char *get_macaddr(struct frame *frm)
{
- static char str[20];
- unsigned char *buf = frm->ptr;
- sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x",
- buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]);
- frm->ptr += 6;
- frm->len -= 6;
- return str;
-}
-
-static void bnep_control(int level, struct frame *frm , int header_length)
-{
- __u8 uuid_size;
- int i, length;
- char* s;
- __u32 uuid = 0;
- __u8 type = get_u8(frm);
-
- switch (type) {
- case BNEP_CONTROL_COMMAND_NOT_UNDERSTOOD:
- printf("Not Understood: type 0x%02x\n", get_u8(frm));
- break;
- case BNEP_SETUP_CONNECTION_REQUEST_MSG:
- uuid_size = get_u8(frm);
- printf("Setup Req: size 0x%x ", uuid_size);
- switch (uuid_size) {
- case 2:
- uuid = get_u16(frm);
- printf("dst 0x%x", uuid);
- if ((s = get_uuid_name(uuid)) != 0)
- printf("(%s)", s);
- uuid = get_u16(frm);
- printf(" src 0x%x", uuid);
- if ((s = get_uuid_name(uuid)) != 0)
- printf("(%s)", s);
- printf("\n");
- break;
- case 4:
- uuid = get_u32(frm);
- printf("dst 0x%x", uuid);
- if ((s = get_uuid_name(uuid)) != 0)
- printf("(%s)", s);
- uuid = get_u32(frm);
- printf(" src 0x%x", uuid);
- if ((s = get_uuid_name(uuid)) != 0)
- printf("(%s)", s);
- printf("\n");
- break;
- case 16:
- uuid = get_u32(frm);
- printf("dst 0x%x", uuid);
- if ((s = get_uuid_name(uuid)) != 0)
- printf("(%s)", s);
- frm->ptr += 12;
- frm->len -= 12;
- uuid = get_u32(frm);
- printf(" src 0x%x", uuid);
- if ((s = get_uuid_name(uuid)) != 0)
- printf("(%s)", s);
- printf("\n");
- frm->ptr += 12;
- frm->len -= 12;
- break;
- default:
- frm->ptr += (uuid_size * 2);
- frm->len -= (uuid_size * 2);
- break;
- }
- break;
- case BNEP_SETUP_CONNECTION_RESPONSE_MSG:
- printf("Setup Rsp: res 0x%04x\n", get_u16(frm));
- break;
- case BNEP_FILTER_NET_TYPE_SET_MSG:
- printf("Filter NetType Set:\n");
- length = get_u16(frm);
- for (i = 0; i < length/4; i++) {
- p_indent(level+1, frm);
- printf("0x%04x - ", get_u16(frm));
- printf("0x%04x\n", get_u16(frm));
- }
- break;
- case BNEP_FILTER_NET_TYPE_RESPONSE_MSG:
- printf("Filter NetType Rsp: res 0x%04x\n", get_u16(frm));
- break;
- case BNEP_FILTER_MULT_ADDR_SET_MSG:
- printf("Filter MultAddr Set:\n");
- length = get_u16(frm);
- for (i = 0; i < length/12; i++) {
- p_indent(level+1, frm);
- printf("%s - ", get_macaddr(frm));
- printf("%s\n", get_macaddr(frm));
- }
- break;
- case BNEP_FILTER_MULT_ADDR_RESPONSE_MSG:
- printf("Filter MultAddr Rsp: res 0x%04x\n", get_u16(frm));
- break;
- default:
- printf("ERROR: Unknown control header Type: 0x%02x Length: 0x%02x\n", type, header_length);
- frm->ptr += header_length - 1;
- frm->len -= header_length - 1;
- return;
- }
+ static char str[20];
+ unsigned char *buf = frm->ptr;
+
+ sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x",
+ buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
+ frm->ptr += 6;
+ frm->len -= 6;
+ return str;
}
-static __u16 bnep_data(int level, struct frame *frm, __u8 type)
+static void bnep_control(int level, struct frame *frm, int header_length)
{
- __u16 proto;
-
- switch (type & 0x7f) {
- case BNEP_COMPRESSED_ETHERNET:
- printf("Compressed ");
- break;
- case BNEP_GENERAL_ETHERNET:
- printf("General ethernet ");
- printf("Dst %s ", get_macaddr(frm));
- printf("Src %s ", get_macaddr(frm));
- break;
- case BNEP_COMPRESSED_ETHERNET_DEST_ONLY:
- printf("Destination only: Dst %s ", get_macaddr(frm));
- break;
- case BNEP_COMPRESSED_ETHERNET_SOURCE_ONLY:
- printf("Source only: Src %s ", get_macaddr(frm));
- break;
- }
- proto = get_u16(frm);
- printf("Protocol: 0x%02x\n", proto);
- return proto;
+ __u8 uuid_size;
+ int i, length;
+ char *s;
+ __u32 uuid = 0;
+ __u8 type = get_u8(frm);
+
+ p_indent(++level, frm);
+ switch (type) {
+ case BNEP_CONTROL_COMMAND_NOT_UNDERSTOOD:
+ printf("Not Understood(0x%02x) type 0x%02x\n", type, get_u8(frm));
+ break;
+ case BNEP_SETUP_CONNECTION_REQUEST_MSG:
+ uuid_size = get_u8(frm);
+ printf("Setup Req(0x%02x) size 0x%02x ", type, uuid_size);
+ switch (uuid_size) {
+ case 2:
+ uuid = get_u16(frm);
+ printf("dst 0x%x", uuid);
+ if ((s = get_uuid_name(uuid)) != 0)
+ printf("(%s)", s);
+ uuid = get_u16(frm);
+ printf(" src 0x%x", uuid);
+ if ((s = get_uuid_name(uuid)) != 0)
+ printf("(%s)", s);
+ printf("\n");
+ break;
+ case 4:
+ uuid = get_u32(frm);
+ printf("dst 0x%x", uuid);
+ if ((s = get_uuid_name(uuid)) != 0)
+ printf("(%s)", s);
+ uuid = get_u32(frm);
+ printf(" src 0x%x", uuid);
+ if ((s = get_uuid_name(uuid)) != 0)
+ printf("(%s)", s);
+ printf("\n");
+ break;
+ case 16:
+ uuid = get_u32(frm);
+ printf("dst 0x%x", uuid);
+ if ((s = get_uuid_name(uuid)) != 0)
+ printf("(%s)", s);
+ frm->ptr += 12;
+ frm->len -= 12;
+ uuid = get_u32(frm);
+ printf(" src 0x%x", uuid);
+ if ((s = get_uuid_name(uuid)) != 0)
+ printf("(%s)", s);
+ printf("\n");
+ frm->ptr += 12;
+ frm->len -= 12;
+ break;
+ default:
+ frm->ptr += (uuid_size * 2);
+ frm->len -= (uuid_size * 2);
+ break;
+ }
+ break;
+ case BNEP_SETUP_CONNECTION_RESPONSE_MSG:
+ printf("Setup Rsp(0x%02x) res 0x%04x\n", type, get_u16(frm));
+ break;
+ case BNEP_FILTER_NET_TYPE_SET_MSG:
+ length = get_u16(frm);
+ printf("Filter NetType Set(0x%02x) len 0x%04x\n", type, length);
+ for (i = 0; i < length / 4; i++) {
+ p_indent(level + 1, frm);
+ printf("0x%04x - ", get_u16(frm));
+ printf("0x%04x\n", get_u16(frm));
+ }
+ break;
+ case BNEP_FILTER_NET_TYPE_RESPONSE_MSG:
+ printf("Filter NetType Rsp(0x%02x) res 0x%04x\n", type, get_u16(frm));
+ break;
+ case BNEP_FILTER_MULT_ADDR_SET_MSG:
+ length = get_u16(frm);
+ printf("Filter MultAddr Set(0x%02x) len 0x%04x\n", type, length);
+ for (i = 0; i < length / 12; i++) {
+ p_indent(level + 1, frm);
+ printf("%s - ", get_macaddr(frm));
+ printf("%s\n", get_macaddr(frm));
+ }
+ break;
+ case BNEP_FILTER_MULT_ADDR_RESPONSE_MSG:
+ printf("Filter MultAddr Rsp(0x%02x) res 0x%04x\n", type, get_u16(frm));
+ break;
+ default:
+ printf("Unknown control type(0x%02x)\n", type);
+ raw_ndump(level + 1, frm, header_length - 1);
+ frm->ptr += header_length - 1;
+ frm->len -= header_length - 1;
+ return;
+ }
}
static void bnep_eval_extension(int level, struct frame *frm)
{
- __u8 type = get_u8(frm);
- int extension = type & 0x80;
- __u8 length = get_u8(frm);
-
- p_indent(level, frm);
- switch (type & 0x7f) {
- case BNEP_EXTENSION_CONTROL:
- printf("BNEP Ext(c): ");
- bnep_control(level, frm , length);
- break;
- default:
- printf("BNEP Ext(c): Unknown extension type 0x%02x len 0x%02x\n",
- type & 0x7f, length);
- //hex_ndump(level+1, frm, length);
- frm->ptr += length;
- frm->len -= length;
- }
-
- if (extension) {
- bnep_eval_extension(level, frm);
- }
+ __u8 type = get_u8(frm);
+ int extension = type & 0x80;
+ __u8 length = get_u8(frm);
+
+ p_indent(level, frm);
+ switch (type & 0x7f) {
+ case BNEP_EXTENSION_CONTROL:
+ printf("Ext Control(0x%02x|%s) len 0x%02x\n", type & 0x7f, extension ? "1" : "0", length);
+ bnep_control(level, frm, length);
+ break;
+ default:
+ printf("Ext Unknown(0x%02x|%s) len 0x%02x\n", type & 0x7f, extension ? "1" : "0", length);
+ raw_ndump(level + 1, frm, length);
+ frm->ptr += length;
+ frm->len -= length;
+ }
+
+ if (extension) {
+ bnep_eval_extension(level, frm);
+ }
}
+#ifndef PAYLOAD_RAW_DUMP
+
static void arp_dump(int level, struct frame *frm)
{
- int i;
- struct ether_arp *arp = (struct ether_arp*)frm->ptr;
-
- printf("Src ");
- for (i = 0; i < 5; i++)
- printf("%02x:", arp->arp_sha[i]);
- printf("%02x", arp->arp_sha[5]);
- printf("(%s) ", inet_ntoa(*(struct in_addr*)&arp->arp_spa));
- printf("Tgt ");
- for (i = 0; i < 5; i++)
- printf("%02x:", arp->arp_tha[i]);
- printf("%02x", arp->arp_tha[5]);
- printf("(%s)\n", inet_ntoa(*(struct in_addr*)&arp->arp_tpa));
- frm->ptr += sizeof(struct ether_arp);
- frm->len -= sizeof(struct ether_arp);
- raw_dump(level, frm); // not needed.
+ int i;
+ struct ether_arp *arp = (struct ether_arp *) frm->ptr;
+
+ printf("Src ");
+ for (i = 0; i < 5; i++)
+ printf("%02x:", arp->arp_sha[i]);
+ printf("%02x", arp->arp_sha[5]);
+ printf("(%s) ", inet_ntoa(*(struct in_addr *) &arp->arp_spa));
+ printf("Tgt ");
+ for (i = 0; i < 5; i++)
+ printf("%02x:", arp->arp_tha[i]);
+ printf("%02x", arp->arp_tha[5]);
+ printf("(%s)\n", inet_ntoa(*(struct in_addr *) &arp->arp_tpa));
+ frm->ptr += sizeof(struct ether_arp);
+ frm->len -= sizeof(struct ether_arp);
+ raw_dump(level, frm); // not needed.
}
static void ip_dump(int level, struct frame *frm)
{
- struct ip *ip = (struct ip *)(frm->ptr);
- int len = ip->ip_hl << 2;
- frm->ptr += len;
- frm->len -= len;
-
- printf("Src %s ", inet_ntoa(*(struct in_addr*)&(ip->ip_src)));
- printf("Dst %s\n", inet_ntoa(*(struct in_addr*)&(ip->ip_dst)));
- p_indent(++level, frm);
-
- switch (ip->ip_p) {
- case IPPROTO_TCP:
- printf("TCP:\n");
- raw_dump(level, frm);
- break;
- case IPPROTO_UDP:
- printf("UDP:\n");
- raw_dump(level, frm);
- break;
- case IPPROTO_ICMP:
- printf("ICMP:\n");
- raw_dump(level, frm);
- break;
- default:
- printf("Unknown Protocol: 0x%02x\n", ip->ip_p);
- raw_dump(level, frm);
-
- }
+ struct ip *ip = (struct ip *) (frm->ptr);
+ int len = ip->ip_hl << 2;
+ frm->ptr += len;
+ frm->len -= len;
+
+ printf("src %s ", inet_ntoa(*(struct in_addr *) &(ip->ip_src)));
+ printf("dst %s\n", inet_ntoa(*(struct in_addr *) &(ip->ip_dst)));
+ p_indent(++level, frm);
+
+ switch (ip->ip_p) {
+ case IPPROTO_TCP:
+ printf("TCP:\n");
+ raw_dump(level, frm);
+ break;
+ case IPPROTO_UDP:
+ printf("UDP:\n");
+ raw_dump(level, frm);
+ break;
+ case IPPROTO_ICMP:
+ printf("ICMP:\n");
+ raw_dump(level, frm);
+ break;
+ default:
+ printf("Unknown Protocol: 0x%02x\n", ip->ip_p);
+ raw_dump(level, frm);
+ }
}
+#endif
+
void bnep_dump(int level, struct frame *frm)
{
- __u8 tmp_8;
- __u8 type = get_u8(frm);
- __u16 proto = 0x0000;
- int extension = type & 0x80;
-
- p_indent(level, frm);
- switch (type & 0x7f) {
- case BNEP_CONTROL:
- printf("BNEP(c): ");
- bnep_control(level, frm , -1);
- break;
- case BNEP_COMPRESSED_ETHERNET:
- case BNEP_GENERAL_ETHERNET:
- case BNEP_COMPRESSED_ETHERNET_DEST_ONLY:
- case BNEP_COMPRESSED_ETHERNET_SOURCE_ONLY:
- printf("BNEP(d): ");
- proto = bnep_data(level, frm, type);
- break;
- default:
- printf("BNEP(d): Unknown packet type: 0x%02x ext %s\n",
- type & 0x7f, extension ? "0x1" : "0x0");
- return;
- }
-
- //Extension info
- if (extension)
- bnep_eval_extension(++level, frm);
-
- //Control packet => No payload info
- if ((type & 0x7f) == BNEP_CONTROL)
- return;
-
- p_indent(level, frm);
- if (proto == 0x8100) { /* 802.1p */
- printf("BNEP(d): 802.1p Header: 0x%02x " , get_u16(frm));
- printf("Ethernet protocol: 0x%02x\n" , get_u16(frm));
- }
-
-
- if (proto == 0x8100) {
- if (frm -> len < 56) {
- printf("BNEP: Packet contains no payload\n");
- return;
- }
-
- frm->ptr += 56;
- frm->len -= 56;
- }
- else {
- if (frm -> len < 60) {
- printf("BNEP: Packet contains no payload\n");
- return;
- }
-
- frm->ptr += 60;
- frm->len -= 60;
- }
-
- printf("BNEP: Payload length: %d (0x%x)\n" , frm->len , frm->len);
- tmp_8 = get_u8(frm);
-
- p_indent(level, frm);
- if (tmp_8 != 0) {
- p_indent(level, frm);
- printf("BNEP: First byte: %d (not equal zero => skip payload analyse) \n" , tmp_8);
- return;
- }
- else {
- int expected_value = 0;
- int pattern_counter = 0;
- do {
- pattern_counter++;
- expected_value = pattern_counter % 256;
- tmp_8 = get_u8(frm);
- } while (expected_value == tmp_8);
-
- printf("BNEP: Last checked byte: %d pattern size: %d (0x%x)\n" , tmp_8 , pattern_counter , pattern_counter);
- }
-
-/*
- switch (proto) {
- case ETHERTYPE_ARP:
- p_indent(++level, frm);
- printf("ARP: ");
- arp_dump(level, frm);
- break;
- case ETHERTYPE_REVARP:
- p_indent(++level, frm);
- printf("RARP: ");
- arp_dump(level, frm);
- break;
- case ETHERTYPE_IP:
- p_indent(++level, frm);
- printf("IP: ");
- ip_dump(level, frm);
- break;
- default:
- raw_dump(level, frm);
- }
-*/
+ __u8 type = get_u8(frm);
+ __u16 proto = 0x0000;
+ int extension = type & 0x80;
+
+ p_indent(level, frm);
+
+ switch (type & 0x7f) {
+ case BNEP_CONTROL:
+ printf("BNEP: Control(0x%02x|%s)\n", type & 0x7f, extension ? "1" : "0");
+ bnep_control(level, frm, -1);
+ break;
+ case BNEP_COMPRESSED_ETHERNET:
+ printf("BNEP: Compressed(0x%02x|%s)\n", type & 0x7f, extension ? "1" : "0");
+ p_indent(++level, frm);
+ proto = get_u16(frm);
+ printf("[proto 0x%04x]\n", proto);
+ break;
+ case BNEP_GENERAL_ETHERNET:
+ printf("BNEP: General ethernet(0x%02x|%s)\n", type & 0x7f, extension ? "1" : "0");
+ p_indent(++level, frm);
+ printf("dst %s ", get_macaddr(frm));
+ printf("src %s ", get_macaddr(frm));
+ proto = get_u16(frm);
+ printf("[proto 0x%04x]\n", proto);
+ break;
+ case BNEP_COMPRESSED_ETHERNET_DEST_ONLY:
+ printf("BNEP: Compressed DestOnly(0x%02x|%s)\n", type & 0x7f, extension ? "1" : "0");
+ p_indent(++level, frm);
+ printf("dst %s ", get_macaddr(frm));
+ proto = get_u16(frm);
+ printf("[proto 0x%04x]\n", proto);
+ break;
+ case BNEP_COMPRESSED_ETHERNET_SOURCE_ONLY:
+ printf("BNEP: Compressed SrcOnly(0x%02x|%s)\n", type & 0x7f, extension ? "1" : "0");
+ p_indent(++level, frm);
+ printf("src %s ", get_macaddr(frm));
+ proto = get_u16(frm);
+ printf("[proto 0x%04x]\n", proto);
+ break;
+ default:
+ printf("(Unknown packet type)\n");
+ return;
+ }
+
+ //Extension info
+ if (extension)
+ bnep_eval_extension(++level, frm);
+
+ //Control packet => No payload info
+ if ((type & 0x7f) == BNEP_CONTROL)
+ return;
+
+ if (proto == 0x8100) { /* 802.1p */
+ p_indent(level, frm);
+ printf("802.1p Header: 0x%04x ", get_u16(frm));
+ proto = get_u16(frm);
+ printf("[proto 0x%04x]\n", proto);
+ }
+
+#ifdef PAYLOAD_RAW_DUMP
+ raw_dump(level, frm);
+#else
+ switch (proto) {
+ case ETHERTYPE_ARP:
+ p_indent(++level, frm);
+ printf("ARP: ");
+ arp_dump(level, frm);
+ break;
+ case ETHERTYPE_REVARP:
+ p_indent(++level, frm);
+ printf("RARP: ");
+ arp_dump(level, frm);
+ break;
+ case ETHERTYPE_IP:
+ p_indent(++level, frm);
+ printf("IP: ");
+ ip_dump(level, frm);
+ break;
+ default:
+ raw_dump(level, frm);
+ }
+#endif
}
-