Home | History | Annotate | Download | only in parser
      1 /*
      2  *
      3  *  BlueZ - Bluetooth protocol stack for Linux
      4  *
      5  *  Copyright (C) 2003-2011  Marcel Holtmann <marcel (at) holtmann.org>
      6  *
      7  *
      8  *  This program is free software; you can redistribute it and/or modify
      9  *  it under the terms of the GNU General Public License as published by
     10  *  the Free Software Foundation; either version 2 of the License, or
     11  *  (at your option) any later version.
     12  *
     13  *  This program is distributed in the hope that it will be useful,
     14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  *  GNU General Public License for more details.
     17  *
     18  *  You should have received a copy of the GNU General Public License
     19  *  along with this program; if not, write to the Free Software
     20  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     21  *
     22  */
     23 
     24 #ifdef HAVE_CONFIG_H
     25 #include <config.h>
     26 #endif
     27 
     28 #include <stdio.h>
     29 #include <errno.h>
     30 #include <unistd.h>
     31 #include <stdlib.h>
     32 #include <string.h>
     33 
     34 #include <sys/types.h>
     35 #include <netinet/in.h>
     36 
     37 #include "parser.h"
     38 
     39 static char *type2str(uint8_t head)
     40 {
     41 	switch (head & 0xf0) {
     42 	case 0x00:
     43 		return "Handshake";
     44 	case 0x10:
     45 		return "Control";
     46 	case 0x40:
     47 		return "Get report";
     48 	case 0x50:
     49 		return "Set report";
     50 	case 0x60:
     51 		return "Get protocol";
     52 	case 0x70:
     53 		return "Set protocol";
     54 	case 0x80:
     55 		return "Get idle";
     56 	case 0x90:
     57 		return "Set idle";
     58 	case 0xa0:
     59 		return "Data";
     60 	case 0xb0:
     61 		return "Data continuation";
     62 	default:
     63 		return "Reserved";
     64 	}
     65 }
     66 
     67 static char *result2str(uint8_t head)
     68 {
     69 	switch (head & 0x0f) {
     70 	case 0x00:
     71 		return "Successful";
     72 	case 0x01:
     73 		return "Not ready";
     74 	case 0x02:
     75 		return "Invalid report ID";
     76 	case 0x03:
     77 		return "Unsupported request";
     78 	case 0x04:
     79 		return "Invalid parameter";
     80 	case 0x0e:
     81 		return "Unknown";
     82 	case 0x0f:
     83 		return "Fatal";
     84 	default:
     85 		return "Reserved";
     86 	}
     87 }
     88 
     89 static char *operation2str(uint8_t head)
     90 {
     91 	switch (head & 0x0f) {
     92 	case 0x00:
     93 		return "No operation";
     94 	case 0x01:
     95 		return "Hard reset";
     96 	case 0x02:
     97 		return "Soft reset";
     98 	case 0x03:
     99 		return "Suspend";
    100 	case 0x04:
    101 		return "Exit suspend";
    102 	case 0x05:
    103 		return "Virtual cable unplug";
    104 	default:
    105 		return "Reserved";
    106 	}
    107 }
    108 
    109 static char *report2str(uint8_t head)
    110 {
    111 	switch (head & 0x03) {
    112 	case 0x00:
    113 		return "Other report";
    114 	case 0x01:
    115 		return "Input report";
    116 	case 0x02:
    117 		return "Output report";
    118 	case 0x03:
    119 		return "Feature report";
    120 	default:
    121 		return "Reserved";
    122 	}
    123 }
    124 
    125 static char *protocol2str(uint8_t head)
    126 {
    127 	switch (head & 0x01) {
    128 	case 0x00:
    129 		return "Boot protocol";
    130 	case 0x01:
    131 		return "Report protocol";
    132 	default:
    133 		return "Reserved";
    134 	}
    135 }
    136 
    137 void hidp_dump(int level, struct frame *frm)
    138 {
    139 	uint8_t hdr;
    140 	char *param;
    141 
    142 	hdr = get_u8(frm);
    143 
    144 	switch (hdr & 0xf0) {
    145 	case 0x00:
    146 		param = result2str(hdr);
    147 		break;
    148 	case 0x10:
    149 		param = operation2str(hdr);
    150 		break;
    151 	case 0x60:
    152 	case 0x70:
    153 		param = protocol2str(hdr);
    154 		break;
    155 	case 0x40:
    156 	case 0x50:
    157 	case 0xa0:
    158 	case 0xb0:
    159 		param = report2str(hdr);
    160 		break;
    161 	default:
    162 		param = "";
    163 		break;
    164 	}
    165 
    166 	p_indent(level, frm);
    167 
    168 	printf("HIDP: %s: %s\n", type2str(hdr), param);
    169 
    170 	raw_dump(level, frm);
    171 }
    172