d84867322bb3ff5a221276f26e227459c6134800
[obnox/wireshark/wip.git] / plugins / unistim / packet-unistim.c
1 /* packet-unistim.c
2   * Routines for unistim packet dissection
3   * Copyright 2007 Don Newton <dnewton@cypresscom.net>
4   *
5   * $Id$
6   *
7   * Wireshark - Network traffic analyzer
8   * By Gerald Combs <gerald@wireshark.org>
9   * Copyright 1998 Gerald Combs
10   *
11   * This program is free software; you can redistribute it and/or
12   * modify it under the terms of the GNU General Public License
13   * as published by the Free Software Foundation; either version 2
14   * of the License, or (at your option) any later version.
15   *
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   *
21   * You should have received a copy of the GNU General Public License
22   * along with this program; if not, write to the Free Software
23   * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24  */
25
26
27 #ifdef HAVE_CONFIG_H
28 # include "config.h"
29 #endif
30
31 #include <glib.h>
32 #include <epan/packet.h>
33 #include <epan/tap.h>
34 #include <epan/emem.h>
35 #include <epan/expert.h>
36 #include <epan/address.h>
37 #include <epan/prefs.h>
38 #include <epan/dissectors/packet-rtp.h>
39 #include <epan/dissectors/packet-rtcp.h>
40 #include <string.h>
41 #include "packet-unistim.h"
42 #include "defines.h"
43 #include "audio.h"
44 #include "basic.h"
45 #include "display.h"
46 #include "network.h"
47 #include "key.h"
48 #include "broadcast.h"
49 #include "uftp.h"
50
51 /* Don't set this to 5000 until this dissector is made a heuristic one!
52    It collides (at least) with tapa. */
53 static guint global_unistim_port = 0;
54
55 static unistim_info_t *uinfo;
56 static int unistim_tap = -1;
57
58 void proto_reg_handoff_unistim(void);
59 static void dissect_payload(proto_tree *unistim_tree,tvbuff_t *tvb,gint offset, packet_info *pinfo);
60 static void dissect_unistim(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
61
62 static gint dissect_broadcast_switch(proto_tree *msg_tree,
63                                      tvbuff_t *tvb,gint offset,guint msg_len);
64 static gint dissect_audio_switch(proto_tree *msg_tree,packet_info *pinfo,
65                                    tvbuff_t *tvb,gint offset,guint msg_len);
66 static gint dissect_display_switch(proto_tree *msg_tree,
67                                    tvbuff_t *tvb,gint offset,guint msg_len);
68 static gint dissect_key_indicator_switch(proto_tree *msg_tree,
69                                    tvbuff_t *tvb,gint offset,guint msg_len);
70 static gint dissect_basic_switch(proto_tree *msg_tree,
71                                    tvbuff_t *tvb,gint offset,guint msg_len);
72 static gint dissect_network_switch(proto_tree *msg_tree,
73                                    tvbuff_t *tvb,gint offset,guint msg_len);
74 static gint dissect_broadcast_phone(proto_tree *msg_tree,
75                                    tvbuff_t *tvb,gint offset,guint msg_len);
76 static gint dissect_audio_phone(proto_tree *msg_tree,
77                                    tvbuff_t *tvb,gint offset,guint msg_len);
78 static gint dissect_display_phone(proto_tree *msg_tree,
79                                    tvbuff_t *tvb,gint offset,guint msg_len);
80 static gint dissect_key_indicator_phone(proto_tree *msg_tree,
81                                    tvbuff_t *tvb,gint offset,guint msg_len);
82 static gint dissect_basic_phone(proto_tree *msg_tree,
83                                    tvbuff_t *tvb,gint offset,guint msg_len);
84 static gint dissect_network_phone(proto_tree *msg_tree,
85                                    tvbuff_t *tvb,gint offset,guint msg_len);
86 static gint dissect_unistim_message(proto_tree *unistim_tree, packet_info *pinfo, 
87                                    tvbuff_t *tvb,gint offset);
88 static gint dissect_uftp_message(proto_tree *unistim_tree, packet_info *pinfo, 
89                                    tvbuff_t *tvb,gint offset);
90
91
92 static void set_ascii_item(proto_tree *unistim_tree, tvbuff_t *tvb,
93                            gint offset,guint msg_len);
94 static void set_ascii_null_term_item(proto_tree *msg_tree,tvbuff_t *tvb, 
95                                      gint offset,guint msg_len, char *label);
96
97
98 static int proto_unistim = -1;
99 static int hf_unistim_seq_nu = -1;
100 static int hf_unistim_packet_type = -1;
101 static int hf_unistim_payload = -1;
102 static int hf_unistim_cmd_add = -1;
103 static int hf_unistim_len =-1;
104 static int hf_terminal_id=-1;
105 static int hf_basic_bit_field=-1;
106 static const true_false_string basic_bit_yn={
107    "For Following Byte",
108    "For Following Byte"
109 };
110
111 static int hf_basic_switch_cmd=-1;
112 static int hf_basic_phone_cmd=-1;
113 static int hf_broadcast_switch_cmd=-1;
114 static int hf_broadcast_phone_cmd=-1;
115 static int hf_audio_switch_cmd=-1;
116 static int hf_audio_phone_cmd=-1;
117 static int hf_display_switch_cmd=-1;
118 static int hf_display_phone_cmd=-1;
119 static int hf_key_switch_cmd=-1;
120 static int hf_key_phone_cmd=-1;
121 static int hf_network_switch_cmd=-1;
122 static int hf_network_phone_cmd=-1;
123
124 static int hf_generic_data=-1;
125 static int hf_generic_string=-1;
126
127 static gint ett_unistim = -1;
128
129 static const value_string packet_names[]={
130    {0,"NAK"},
131    {1,"ACK"},
132    {2,"Payload"},
133    {0,NULL}
134 };
135
136 static const value_string payload_names[]={
137    {0x00,"NULL Protocol"},
138    {0x01,"Aggregate Unistim"},
139    {0x02,"Aggregate Unistim with Terminal ID"},
140    {0x03,"UFTP"},
141    {0xff,"Free Form Protocol"},
142    {0,NULL}
143 };
144
145 static const range_string sequence_numbers[]={
146  {0x00,0xFFFFFFFE,"Normal Sequence Number"},
147  {0xFFFFFFFF,0xFFFFFFFF, "RESET Sequence Number"},
148  {0,0,NULL}
149 };
150
151 static const value_string command_address[]={
152         {0x11,"Broadcast Manager Switch"},
153         {0x16,"Audio Manager Switch"},
154         {0x17,"Display Manager Switch"},
155         {0x19,"Key/Indicator Manager Switch"},
156         {0x1a,"Basic Manager Switch"},
157         {0x1e,"Network Manager Switch"},
158         {0x91,"Broadcast Manager Phone"},
159         {0x96,"Audio Manager Phone"},
160         {0x97,"Display Manager Phone"},
161         {0x99,"Key/Indicator Manager Phone"},
162         {0x9a,"Basic Manager Phone"},
163         {0x9e,"Network Manager Phone"},
164         {0,NULL}
165 };
166
167 #include "header_field.h"
168
169 void
170 proto_register_unistim(void){
171
172    module_t* unistim_module;
173
174 /* Setup protocol subtree array */
175
176    static gint *ett[] = {
177          &ett_unistim
178    };
179
180    proto_unistim=proto_register_protocol("UNISTIM Protocol", "UNISTIM", "unistim");
181
182    proto_register_subtree_array(ett,array_length(ett));
183    proto_register_field_array(proto_unistim,hf,array_length(hf));
184
185    unistim_tap = register_tap("unistim");
186
187    unistim_module = prefs_register_protocol(proto_unistim, proto_reg_handoff_unistim);
188
189    prefs_register_uint_preference(unistim_module, "udp.port", "UNISTIM UDP port",
190                                   "UNISTIM port (default 5000)", 10, &global_unistim_port);
191 }
192
193 void 
194 proto_reg_handoff_unistim(void) {
195    static gboolean initialized = FALSE;
196    static dissector_handle_t unistim_handle;
197    static guint unistim_port;
198
199    if (!initialized) {
200       unistim_handle=create_dissector_handle(dissect_unistim,proto_unistim);
201       dissector_add_handle("udp.port", unistim_handle);  /* for "decode as" */
202       initialized=TRUE;
203    } else {
204       if (unistim_port != 0) {
205          dissector_delete("udp.port",unistim_port,unistim_handle);
206       }
207    }
208
209    if (global_unistim_port != 0) {
210       dissector_add("udp.port",global_unistim_port,unistim_handle);
211    }
212    unistim_port = global_unistim_port;
213 }
214
215
216 static void
217 dissect_unistim(tvbuff_t *tvb,packet_info *pinfo,proto_tree *tree){
218    gint offset=0;
219    proto_item *ti= NULL;
220    proto_item *ti1= NULL;
221    proto_tree *overall_unistim_tree = NULL;
222    proto_tree *rudpm_tree=NULL;
223    if(check_col(pinfo->cinfo,COL_PROTOCOL))
224          col_set_str(pinfo->cinfo,COL_PROTOCOL,"UNISTIM");
225       /* Clear out stuff in the info column */
226    if (check_col(pinfo->cinfo,COL_INFO)) {
227          col_clear(pinfo->cinfo,COL_INFO);
228     }
229     ti = proto_tree_add_item(tree,proto_unistim,tvb,offset,-1,FALSE);
230     overall_unistim_tree = proto_item_add_subtree(ti,ett_unistim);
231     ti1=proto_tree_add_text(overall_unistim_tree,tvb,offset,5,"Reliable UDP");
232     rudpm_tree=proto_item_add_subtree(ti1,ett_unistim);
233
234     proto_tree_add_item(rudpm_tree,hf_unistim_seq_nu,tvb,offset,4,FALSE);
235
236     /* Allocate new mem for queueing */
237     uinfo = se_alloc(sizeof(unistim_info_t));
238
239     /* Clear tap struct */
240     uinfo->rudp_type = 0;
241     uinfo->payload_type = 0;
242     uinfo->sequence = tvb_get_ntohl(tvb,offset);
243     uinfo->termid = 0;
244     uinfo->key_val = -1;
245     uinfo->key_state = -1;
246     uinfo->hook_state = -1;
247     uinfo->stream_connect = -1;
248     uinfo->trans_connect = -1;
249     uinfo->set_termid = -1;
250     uinfo->string_data = NULL;
251     uinfo->key_buffer = NULL;
252     SET_ADDRESS(&uinfo->it_ip, AT_NONE, 0, NULL);
253     SET_ADDRESS(&uinfo->ni_ip, AT_NONE, 0, NULL);
254     uinfo->it_port = 0;
255
256     offset+=4;
257     proto_tree_add_item(rudpm_tree,hf_unistim_packet_type,tvb,offset,1,FALSE);
258     uinfo->rudp_type = tvb_get_guint8(tvb,offset);
259
260     switch(tvb_get_guint8(tvb,offset)) {
261           case 0x00:
262               /*NAK*/
263               if (check_col(pinfo->cinfo, COL_INFO))
264                      col_add_fstr(pinfo->cinfo, COL_INFO, "NAK for seq -   0x%X",
265                                    tvb_get_ntohl(tvb, offset-4));
266               break;
267           case 0x01:
268               /*ACK*/
269               if (check_col(pinfo->cinfo, COL_INFO))
270                      col_add_fstr(pinfo->cinfo, COL_INFO, "ACK for seq -   0x%X",
271                                    tvb_get_ntohl(tvb, offset-4));
272               break;
273           case 0x02:
274               if (check_col(pinfo->cinfo, COL_INFO))
275                      col_add_fstr(pinfo->cinfo, COL_INFO, "Payload seq -   0x%X",
276                                    tvb_get_ntohl(tvb, offset-4));
277               offset+=1;
278               dissect_payload(overall_unistim_tree,tvb,offset,pinfo);
279               break;
280           default:
281               if (check_col(pinfo->cinfo, COL_INFO))
282                      col_add_fstr(pinfo->cinfo, COL_INFO, "Unknown seq -   0x%X",
283                                    tvb_get_ntohl(tvb, offset-4));
284               break;
285     }
286
287     /* Queue packet for tap */
288     tap_queue_packet(unistim_tap, pinfo, uinfo);
289 }
290
291 static void
292 dissect_payload(proto_tree *overall_unistim_tree,tvbuff_t *tvb, gint offset, packet_info *pinfo){
293       proto_item *ti;
294       proto_tree *unistim_tree;
295       guint payload_proto=tvb_get_guint8(tvb,offset);
296
297       /* Payload type for tap */
298       uinfo->payload_type = payload_proto;
299
300       ti=proto_tree_add_item(overall_unistim_tree,hf_unistim_payload,
301                              tvb,offset,1,FALSE);
302       offset+=1;
303       unistim_tree=proto_item_add_subtree(ti,ett_unistim);
304
305       switch(payload_proto){
306          case 0x00:
307    /*NULL PROTO - NOTHING LEFT TO DO*/
308             return;
309          case 0x01:
310    /*UNISTIM only so no term id but further payload work*/
311             /* Collect info for tap */
312             /* If no term id then packet sourced from NI */
313             COPY_ADDRESS(&(uinfo->ni_ip), &(pinfo->src));
314             COPY_ADDRESS(&(uinfo->it_ip), &(pinfo->dst));
315             uinfo->it_port = pinfo->destport;
316             break;
317          case 0x02:
318    /*UNISTIM with term id*/
319             /* Termid packs are always sourced from the it, so collect relevant infos */
320             COPY_ADDRESS(&(uinfo->ni_ip),&(pinfo->dst));
321             COPY_ADDRESS(&(uinfo->it_ip),&(pinfo->src));
322             uinfo->it_port = pinfo->srcport;
323             uinfo->termid = tvb_get_ntohl(tvb,offset);
324
325             proto_tree_add_item(unistim_tree,hf_terminal_id,tvb,offset,4,FALSE);
326             offset+=4;
327             break;
328          case 0x03:
329    /* UFTP */
330             offset = dissect_uftp_message(unistim_tree,pinfo,tvb,offset);
331             break;
332          case 0xff:
333    /*TODO flesh this out probably only for init*/
334             break;
335       }
336
337    /* Handle UFTP seperately because it is significantly different 
338       than standard UNISTIM */
339    while (tvb_length_remaining(tvb, offset) > 0)
340       offset = dissect_unistim_message(unistim_tree,pinfo,tvb,offset);
341
342 }
343
344 static gint
345 dissect_uftp_message(proto_tree *unistim_tree,packet_info *pinfo _U_,tvbuff_t *tvb,gint offset){
346
347         guint command;
348         guint str_len;
349         guint dat_len;
350         proto_item *ti;
351         proto_tree *msg_tree;
352
353         ti = proto_tree_add_text(unistim_tree,tvb,offset,-1,"UFTP CMD");
354
355         msg_tree = proto_item_add_subtree(ti,ett_unistim);
356
357         command=tvb_get_guint8(tvb,offset);
358
359         proto_tree_add_item(msg_tree,hf_uftp_command,tvb,offset,1,FALSE);
360
361         offset += 1;
362
363         switch(command)
364         {
365                 case 0x80:
366                         /* Connection request */
367                         /* Nothing to do */
368                         break;
369                 
370                 case 0x81:
371                         /* Connection Details */
372                         /* Get datablock size */
373                         proto_tree_add_item(msg_tree,hf_uftp_datablock_size,tvb,offset,2,FALSE);
374                         offset+=2;
375                         /* Get datablock limit b4 flow control */
376                         proto_tree_add_item(msg_tree,hf_uftp_datablock_limit,tvb,offset,1,FALSE);
377                         offset+=1;
378                         /* Get filename */
379                         str_len = tvb_length_remaining(tvb, offset);
380                         proto_tree_add_item(msg_tree,hf_uftp_filename,tvb,offset,str_len,FALSE);
381                         offset += str_len;
382                         break;
383
384                 case 0x82:
385                         /* Flow Control off */
386                         /* Nothing to do */
387                         break;
388                 
389                 case 0x00:
390                         /* Connection Granted */
391                         /* Nothing to do */
392                         break;
393
394                 case 0x01:
395                         /* Connection Denied */
396                         /* Nothing to do */
397                         break;
398
399                 case 0x02:
400                         /* File Data Block */
401                         /* Raw Data.. */
402                         dat_len = tvb_length_remaining(tvb, offset);
403                         proto_tree_add_item(msg_tree,hf_uftp_datablock,tvb,offset,dat_len,FALSE);
404                         offset += dat_len;
405                         break;
406         }
407
408         return offset;
409         
410 }
411
412
413 static gint
414 dissect_unistim_message(proto_tree *unistim_tree,packet_info *pinfo,tvbuff_t *tvb,gint offset){
415    guint address;
416    guint msg_len;
417    proto_item *ti;
418    proto_tree *msg_tree;
419
420    ti = proto_tree_add_text(unistim_tree,tvb,offset,-1,"Unistim CMD");
421
422    msg_tree = proto_item_add_subtree(ti,ett_unistim);
423
424    address=tvb_get_guint8(tvb,offset);
425
426    proto_tree_add_item(msg_tree,hf_unistim_cmd_add,tvb,offset,1,FALSE);
427
428    offset+=1;
429    msg_len=tvb_get_guint8(tvb,offset);
430
431    if (msg_len<=2)
432    {
433      ti=proto_tree_add_item(msg_tree,hf_unistim_len,tvb,offset,1,FALSE);
434      expert_add_info_format(pinfo,ti,PI_MALFORMED,PI_ERROR,"Length too short");
435      return tvb_length(tvb);
436    } else {
437      proto_item_set_len(ti,msg_len);
438      proto_tree_add_item(msg_tree,hf_unistim_len,tvb,offset,1,FALSE);
439    }
440
441    offset+=1;
442    /*from switch*/
443    switch(address){
444       case 0x00:
445    /*Nothing*/
446          break;
447       case 0x11:
448    /*Broadcast Manager Switch*/
449          offset = dissect_broadcast_switch(msg_tree,tvb,offset,msg_len-2);
450          break;
451       case 0x16:
452    /*Audio Manager Switch*/
453          offset = dissect_audio_switch(msg_tree,pinfo,tvb,offset,msg_len-2);
454          break;
455       case 0x17:
456    /*Display Manager Switch*/
457          offset = dissect_display_switch(msg_tree,tvb,offset,msg_len-2);
458          break;
459       case 0x19:
460    /*Key Indicator Manager Switch*/
461          offset = dissect_key_indicator_switch(msg_tree,tvb,offset,msg_len-2);
462          break;
463       case 0x1a:
464    /*Basic Manager Switch*/
465          offset = dissect_basic_switch(msg_tree,tvb,offset,msg_len-2);
466          break;
467       case 0x1e:
468    /*Network Manager Switch*/
469          offset = dissect_network_switch(msg_tree,tvb,offset,msg_len-2);
470          break;
471       case 0x91:
472    /*Broadcast Manager phone*/
473          offset = dissect_broadcast_phone(msg_tree,tvb,offset,msg_len-2);
474          break;
475       case 0x96:
476    /*Audio Manager phone*/
477          offset = dissect_audio_phone(msg_tree,tvb,offset,msg_len-2);
478          break;
479       case 0x97:
480    /*Display Manager phone*/
481          offset = dissect_display_phone(msg_tree,tvb,offset,msg_len-2);
482          break;
483       case 0x99:
484    /*Key/Indicator Manager phone*/
485          offset = dissect_key_indicator_phone(msg_tree,tvb,offset,msg_len-2);
486          break;
487       case 0x9a:
488    /*Basic Manager phone*/
489          offset = dissect_basic_phone(msg_tree,tvb,offset,msg_len-2);
490          break;
491       case 0x9e:
492    /*Network Manager Switch*/
493          offset = dissect_network_phone(msg_tree,tvb,offset,msg_len-2);
494          break;
495       default:
496    /*See some undocumented messages.  Don't want to miss the ones we understand*/
497          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len-2,FALSE);
498
499          offset+=(msg_len-2);
500    }
501
502    return offset;
503 }
504
505
506    /*DONE*/
507 static gint
508 dissect_basic_phone(proto_tree *msg_tree,
509                     tvbuff_t *tvb,gint offset, guint msg_len){
510    guint basic_cmd;
511    proto_item *ti;
512
513    basic_cmd=tvb_get_guint8(tvb,offset);
514
515    ti=proto_tree_add_item(msg_tree,hf_basic_phone_cmd,tvb,offset,1,FALSE);
516
517    offset+=1;msg_len-=1;
518    switch(basic_cmd){
519
520       case 0x00:
521    /*Basic Manager Attributes Info*/
522          proto_tree_add_item(msg_tree,hf_basic_phone_eeprom_stat_cksum,
523                              tvb,offset,1,FALSE);
524          offset+=1;
525          proto_tree_add_item(msg_tree,hf_basic_phone_eeprom_dynam,
526                              tvb,offset,1,FALSE);
527          offset+=1;
528          proto_tree_add_item(msg_tree,hf_basic_phone_eeprom_net_config_cksum,
529                              tvb,offset,1,FALSE);
530          offset+=1;
531          break;
532       case 0x01:
533    /*Basic Manager Options Report*/
534          proto_tree_add_item(msg_tree,hf_basic_switch_options_secure,
535                              tvb,offset,1,FALSE);
536          offset+=1;
537          break;
538       case 0x02:
539    /*Firmware Version*/
540          proto_tree_add_item(msg_tree,hf_basic_phone_fw_ver,
541                              tvb,offset,msg_len,FALSE);
542          offset+=msg_len;
543          break;
544       case 0x03:
545    /*IT Type*/
546          proto_tree_add_item(msg_tree,hf_basic_it_type,tvb,offset,1,FALSE);
547          offset+=1;
548          break;
549       case 0x07:
550    /*Hardware ID*/
551          proto_tree_add_item(msg_tree,hf_basic_phone_hw_id,
552                              tvb,offset,msg_len,FALSE);
553          offset+=msg_len;
554          break;
555       case 0x08:
556    /*Product Engineering Code*/
557          proto_tree_add_item(msg_tree,hf_basic_prod_eng_code,
558                              tvb,offset,msg_len,FALSE);
559          offset+=msg_len;
560          break;
561       case 0x09:
562    /*Grey Market Info*/
563          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
564          offset+=msg_len;
565          break;
566       case 0x0a:
567    /*Encapsulate Command*/
568          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
569          offset+=msg_len;
570          break;
571       case 0x11:
572    /*Phone Ethernet address*/
573          proto_tree_add_item(msg_tree,hf_basic_ether_address,
574                              tvb,offset,msg_len,FALSE);
575          offset+=msg_len;
576          break;
577       case 0x0b:
578    /*not in pdf but get them*/
579          set_ascii_item(msg_tree,tvb,offset,msg_len);
580          offset+=msg_len;
581          break;
582       case 0xff:
583    /*Reserved*/
584          break;
585       default:
586          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
587          offset+=msg_len;
588    }
589
590    return offset;
591 }
592    /*DONE*/
593 static gint
594 dissect_basic_switch(proto_tree *msg_tree,
595                      tvbuff_t *tvb,gint offset,guint msg_len){
596    guint basic_cmd;
597    basic_cmd=tvb_get_guint8(tvb,offset);
598    proto_tree_add_item(msg_tree,hf_basic_switch_cmd,tvb,offset,1,FALSE);
599    offset+=1;msg_len-=1;
600    switch(basic_cmd){
601       case 0x01:
602    /*Query Basic Manager*/
603          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
604          proto_tree_add_item(msg_tree,hf_basic_switch_query_attr,
605                              tvb,offset,1,FALSE);
606          proto_tree_add_item(msg_tree,hf_basic_switch_query_opts,
607                              tvb,offset,1,FALSE);
608          proto_tree_add_item(msg_tree,hf_basic_switch_query_fw,
609                              tvb,offset,1,FALSE);
610          proto_tree_add_item(msg_tree,hf_basic_switch_query_hw_id,
611                              tvb,offset,1,FALSE);
612          proto_tree_add_item(msg_tree,hf_basic_switch_query_it_type,
613                              tvb,offset,1,FALSE);
614          proto_tree_add_item(msg_tree,hf_basic_switch_query_prod_eng_code,
615                              tvb,offset,1,FALSE);
616          proto_tree_add_item(msg_tree,hf_basic_switch_query_gray_mkt_info,
617                              tvb,offset,1,FALSE);
618          offset+=1;
619          break;
620       case 0x02:
621    /*Basic Manager Options*/
622          proto_tree_add_item(msg_tree,hf_basic_switch_options_secure,
623                              tvb,offset,1,FALSE);
624          offset+=1;
625          break;
626       case 0x06:
627    /*EEprom Write*/
628          proto_tree_add_item(msg_tree,hf_basic_switch_element_id,
629                              tvb,offset,1,FALSE);
630          offset+=1;
631          proto_tree_add_item(msg_tree,hf_basic_switch_eeprom_data,
632                              tvb,offset,msg_len,FALSE);
633          offset+=1;
634          break;
635       case 0x07:
636    /*Assign Terminal ID*/
637          /* Set tap info */
638          uinfo->set_termid = 1;
639
640          proto_tree_add_item(msg_tree,hf_basic_switch_terminal_id,
641                              tvb,offset,msg_len,FALSE);
642          offset+=msg_len;
643          break;
644       case 0x08:
645    /*Encapsulate Command*/
646          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
647          offset+=msg_len;
648          break;
649       case 0x0f:
650    /*showing up in captures but not in pdf*/
651          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
652          offset+=msg_len;
653       case 0xff:
654    /*Reserved*/
655          break;
656       default:
657          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
658          offset+=msg_len;
659
660    }
661
662    return offset;
663 }
664
665
666    /*DONE*/
667 static gint
668 dissect_broadcast_switch(proto_tree *msg_tree,
669                          tvbuff_t *tvb,gint offset, guint msg_len){
670    guint bcast_cmd;
671    guint year,month,day,hour,minute,second;
672    proto_item *date_label;
673    proto_item *time_label;
674    proto_tree *date_tree;
675    proto_tree *time_tree;
676    bcast_cmd=tvb_get_guint8(tvb,offset);
677    proto_tree_add_item(msg_tree,hf_broadcast_switch_cmd,tvb,offset,1,FALSE);
678    offset+=1;
679    switch(bcast_cmd){
680       case 0x00:
681    /*Accessory Sync Update   -   len=3 */
682          break;
683       case 0x01:
684    /*Logical Icon Update*/
685          proto_tree_add_item(msg_tree,hf_basic_bit_field,
686                              tvb,offset,1,FALSE);
687          proto_tree_add_item(msg_tree,hf_broadcast_icon_state,
688                              tvb,offset,1,FALSE);
689          proto_tree_add_item(msg_tree,hf_broadcast_icon_cadence,
690                              tvb,offset,1,FALSE);
691          offset+=1;
692          break;
693       case 0x02:
694    /*Time and Date Download*/
695          year=tvb_get_guint8(tvb,offset);
696          month=tvb_get_guint8(tvb,offset+1);
697          day=tvb_get_guint8(tvb,offset+2);
698          hour=tvb_get_guint8(tvb,offset+3);
699          minute=tvb_get_guint8(tvb,offset+4);
700          second=tvb_get_guint8(tvb,offset+5);
701          date_label=proto_tree_add_text(msg_tree,tvb,offset,3,
702                                         "Date %i/%i/%i",month,day,year%100);
703          date_tree=proto_item_add_subtree(date_label,ett_unistim);
704          proto_tree_add_item(date_tree,hf_broadcast_year,tvb,offset,1,FALSE);
705          offset+=1;
706          proto_tree_add_item(date_tree,hf_broadcast_month,tvb,offset,1,FALSE);
707          offset+=1;
708          proto_tree_add_item(date_tree,hf_broadcast_day,tvb,offset,1,FALSE);
709          offset+=1;
710
711          time_label=proto_tree_add_text(msg_tree,tvb,offset,3,
712                                         "Time %i:%i:%i",hour,minute,second);
713          time_tree=proto_item_add_subtree(time_label,ett_unistim);
714          proto_tree_add_item(time_tree,hf_broadcast_hour,tvb,offset,1,FALSE);
715          offset+=1;
716          proto_tree_add_item(time_tree,hf_broadcast_minute,tvb,offset,1,FALSE);
717          offset+=1;
718          proto_tree_add_item(time_tree,hf_broadcast_second,tvb,offset,1,FALSE);
719          offset+=1;
720          break;
721       case 0x03:
722    /*Set Default Character Table Config */
723          /* UGLY may work may not*/
724          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
725          offset+=msg_len;
726          break;
727       case 0xff:
728    /*Reserved*/
729          break;
730       default:
731          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
732          offset+=msg_len;
733    }
734
735    return offset;
736 }
737    /*DONE Haven't seen any phone broadcasts, wouldn't expect to*/
738 static gint
739 dissect_broadcast_phone(proto_tree *msg_tree,
740                         tvbuff_t *tvb, gint offset,guint msg_len){
741
742    proto_tree_add_item(msg_tree,hf_generic_data, tvb,offset,msg_len,FALSE);
743    offset+=msg_len;
744
745    return offset;
746 }
747
748    /*DONE*/
749 static gint
750 dissect_display_switch(proto_tree *msg_tree,
751                        tvbuff_t *tvb, gint offset,guint msg_len){
752    guint clear_mask;
753    guint highlight_cmd;
754    guint time_date_mask;
755    guint display_cmd;
756    guint address_byte;
757    guint movement_byte;
758    proto_tree *address_tree;
759    proto_item *tmp_ti;
760    display_cmd=tvb_get_guint8(tvb,offset);
761    proto_tree_add_item(msg_tree,hf_display_switch_cmd,tvb,offset,1,FALSE);
762    offset+=1;msg_len-=1;
763
764    switch(display_cmd){
765       case 0x01:
766    /*Restore Default Character Table Configuration length = 3*/
767          break;
768       case 0x04:
769    /*Arrow*/
770          proto_tree_add_item(msg_tree,hf_display_arrow,tvb,offset,1,FALSE);
771          offset+=1;
772          break;
773       case 0x05:
774    /*Query Status Bar Icon*/
775          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
776          offset+=msg_len;
777          break;
778       case 0x06:
779    /*Highlight Off length = 3*/
780          break;
781       case 0x07:
782    /*Highlight On length = 3*/
783          break;
784       case 0x09:
785    /*Restore Time and Date length  = 3*/
786          break;
787       case 0x0a:
788    /*Clear Time and Date length  = 3*/
789          break;
790       case 0x0b:
791    /*Call Duration Timer*/
792          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
793          proto_tree_add_item(msg_tree,hf_display_call_timer_mode,tvb,offset,
794                              1,FALSE);
795          proto_tree_add_item(msg_tree,hf_display_call_timer_reset,tvb,offset,
796                              1,FALSE);
797          proto_tree_add_item(msg_tree,hf_display_call_timer_display,tvb,offset,
798                              1,FALSE);
799          proto_tree_add_item(msg_tree,hf_display_call_timer_delay,tvb,offset,
800                              1,FALSE);
801          offset+=1;msg_len-=1;
802          proto_tree_add_item(msg_tree,hf_display_call_timer_id,tvb,offset,
803                              1,FALSE);
804          offset+=1;msg_len-=1;
805          break;
806       case 0x0c:
807    /*Query Display Manager*/
808          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
809          offset+=msg_len;
810          break;
811       case 0x0d:
812    /*Download Call Duration Timer Delay*/
813          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
814          offset+=msg_len;
815          break;
816       case 0x0e:
817    /*Disable Display Field*/
818          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
819          offset+=msg_len;
820          break;
821       case 0x0f:
822    /*Clear Field*/
823          clear_mask=tvb_get_guint8(tvb,offset);
824    /*need to know which paths to take*/
825          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
826          proto_tree_add_item(msg_tree,hf_display_clear_numeric,
827                              tvb,offset,1,FALSE);
828          proto_tree_add_item(msg_tree,hf_display_clear_context,
829                              tvb,offset,1,FALSE);
830          proto_tree_add_item(msg_tree,hf_display_clear_date,
831                              tvb,offset,1,FALSE);
832
833          proto_tree_add_item(msg_tree,hf_display_clear_time,
834                              tvb,offset,1,FALSE);
835          proto_tree_add_item(msg_tree,hf_display_clear_line,
836                              tvb,offset,1,FALSE);
837          proto_tree_add_item(msg_tree,hf_display_clear_status_bar_icon,
838                              tvb,offset,1,FALSE);
839          proto_tree_add_item(msg_tree,hf_display_clear_softkey,
840                              tvb,offset,1,FALSE);
841          proto_tree_add_item(msg_tree,hf_display_clear_softkey_label,
842                              tvb,offset,1,FALSE);
843          offset+=1;msg_len-=1;
844          if((clear_mask&DISPLAY_CLEAR_LINE)==DISPLAY_CLEAR_LINE){
845             proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
846             proto_tree_add_item(msg_tree,hf_display_clear_line_1,
847                                 tvb,offset,1,FALSE);
848             proto_tree_add_item(msg_tree,hf_display_clear_line_2,
849                                 tvb,offset,1,FALSE);
850             proto_tree_add_item(msg_tree,hf_display_clear_line_3,
851                                 tvb,offset,1,FALSE);
852             proto_tree_add_item(msg_tree,hf_display_clear_line_4,
853                                 tvb,offset,1,FALSE);
854             proto_tree_add_item(msg_tree,hf_display_clear_line_5,
855                                 tvb,offset,1,FALSE);
856             proto_tree_add_item(msg_tree,hf_display_clear_line_6,
857                                 tvb,offset,1,FALSE);
858             proto_tree_add_item(msg_tree,hf_display_clear_line_7,
859                                 tvb,offset,1,FALSE);
860             proto_tree_add_item(msg_tree,hf_display_clear_line_8,
861                                 tvb,offset,1,FALSE);
862             offset+=1;msg_len-=1;
863          }
864          if((clear_mask&DISPLAY_CLEAR_STATUS_BAR_ICON)==
865                         DISPLAY_CLEAR_STATUS_BAR_ICON){
866             proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
867             proto_tree_add_item(msg_tree,hf_display_clear_status_bar_icon_1,
868                                 tvb,offset,1,FALSE);
869             proto_tree_add_item(msg_tree,hf_display_clear_status_bar_icon_2,
870                                 tvb,offset,1,FALSE);
871             proto_tree_add_item(msg_tree,hf_display_clear_status_bar_icon_3,
872                                 tvb,offset,1,FALSE);
873             proto_tree_add_item(msg_tree,hf_display_clear_status_bar_icon_4,
874                                 tvb,offset,1,FALSE);
875             proto_tree_add_item(msg_tree,hf_display_clear_status_bar_icon_5,
876                                 tvb,offset,1,FALSE);
877             proto_tree_add_item(msg_tree,hf_display_clear_status_bar_icon_6,
878                                 tvb,offset,1,FALSE);
879             proto_tree_add_item(msg_tree,hf_display_clear_status_bar_icon_7,
880                                 tvb,offset,1,FALSE);
881             proto_tree_add_item(msg_tree,hf_display_clear_status_bar_icon_8,
882                                 tvb,offset,1,FALSE);
883             offset+=1;msg_len-=1;
884          }
885          if((clear_mask&DISPLAY_CLEAR_SOFTKEY)==DISPLAY_CLEAR_SOFTKEY){
886             proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
887             proto_tree_add_item(msg_tree,hf_display_clear_soft_key_1,
888                                 tvb,offset,1,FALSE);
889             proto_tree_add_item(msg_tree,hf_display_clear_soft_key_2,
890                                 tvb,offset,1,FALSE);
891             proto_tree_add_item(msg_tree,hf_display_clear_soft_key_3,
892                                 tvb,offset,1,FALSE);
893             proto_tree_add_item(msg_tree,hf_display_clear_soft_key_4,
894                                 tvb,offset,1,FALSE);
895             proto_tree_add_item(msg_tree,hf_display_clear_soft_key_5,
896                                 tvb,offset,1,FALSE);
897             proto_tree_add_item(msg_tree,hf_display_clear_soft_key_6,
898                                 tvb,offset,1,FALSE);
899             proto_tree_add_item(msg_tree,hf_display_clear_soft_key_7,
900                                 tvb,offset,1,FALSE);
901             proto_tree_add_item(msg_tree,hf_display_clear_soft_key_8,
902                                 tvb,offset,1,FALSE);
903             offset+=1;msg_len-=1;
904          }
905          if((clear_mask&DISPLAY_CLEAR_SOFTKEY_LABEL)==DISPLAY_CLEAR_SOFTKEY_LABEL){
906             proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
907             proto_tree_add_item(msg_tree,hf_display_clear_sk_label_key_id,tvb,offset,1,FALSE);
908             proto_tree_add_item(msg_tree,hf_display_clear_all_slks,tvb,offset,1,FALSE);
909             offset+=1;msg_len-=1;
910          }
911          break;
912       case 0x10:
913    /*Cursor Control*/
914          movement_byte=tvb_get_guint8(tvb,offset);
915          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
916          proto_tree_add_item(msg_tree,hf_display_cursor_move_cmd,tvb,offset,1,FALSE);
917          proto_tree_add_item(msg_tree,hf_display_cursor_blink,tvb,offset,1,FALSE);
918          offset+=1;msg_len-=1;
919          if(msg_len==0){
920    /*turn cursor off*/
921             break;
922          }
923          if((movement_byte&0x01)==0x01){
924             address_byte=tvb_get_guint8(tvb,offset);
925             proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
926             proto_tree_add_item(msg_tree,hf_display_write_address_numeric,
927                                 tvb,offset,1,FALSE);
928             proto_tree_add_item(msg_tree,hf_display_write_address_context,
929                                 tvb,offset,1,FALSE);
930             proto_tree_add_item(msg_tree,hf_display_write_address_line,
931                                 tvb,offset,1,FALSE);
932             proto_tree_add_item(msg_tree,hf_display_write_address_soft_key,
933                                 tvb,offset,1,FALSE);
934             if((address_byte&DISPLAY_WRITE_ADDRESS_SOFT_KEY_FLAG)==
935                              DISPLAY_WRITE_ADDRESS_SOFT_KEY_FLAG)
936                proto_tree_add_item(msg_tree,
937                                    hf_display_write_address_softkey_id,
938                                    tvb,offset,1,FALSE);
939             offset+=1;msg_len-=1;
940             if(msg_len==0){
941    /*turn cursor off*/
942                break;
943             }
944          }
945          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
946          proto_tree_add_item(msg_tree,hf_display_write_address_char_pos,
947                              tvb,offset,1,FALSE);
948          proto_tree_add_item(msg_tree,hf_display_write_address_line_number,
949                              tvb,offset,1,FALSE);
950          offset+=1;msg_len-=1;
951          break;
952       case 0x12:
953    /*Display Scroll with Data (before)*/
954          set_ascii_item(msg_tree,tvb,offset,msg_len);
955          offset+=msg_len;
956          break;
957       case 0x13:
958    /*Display Scroll with Data (after)*/
959          set_ascii_item(msg_tree,tvb,offset,msg_len);
960          offset+=msg_len;
961          break;
962       case 0x14:
963    /*Status Bar Icon Update*/
964          proto_tree_add_item(msg_tree,hf_basic_bit_field, tvb,offset,1,FALSE);
965          proto_tree_add_item(msg_tree,hf_icon_id,tvb,offset,1,FALSE);
966          offset+=1;
967          proto_tree_add_item(msg_tree,hf_basic_bit_field, tvb,offset,1,FALSE);
968          proto_tree_add_item(msg_tree,hf_broadcast_icon_state,
969                              tvb,offset,1,FALSE);
970          proto_tree_add_item(msg_tree,hf_broadcast_icon_cadence,
971                              tvb,offset,1,FALSE);
972          offset+=1;
973          break;
974       case 0x15:
975    /*Month Labels Download*/
976          set_ascii_item(msg_tree,tvb,offset,msg_len);
977          offset+=msg_len;
978          break;
979       case 0x16:
980    /*Call Duration Timer Label Download*/
981          set_ascii_item(msg_tree,tvb,offset,msg_len);
982          offset+=1;msg_len-=1;
983          break;
984       case 0x17:
985    /*Time and Date Format*/
986          time_date_mask=tvb_get_guint8(tvb,offset);
987          if((time_date_mask&DISPLAY_USE_TIME_FORMAT)==DISPLAY_USE_TIME_FORMAT){
988             proto_tree_add_item(msg_tree,hf_display_time_format,tvb,offset,1,FALSE);
989          }
990          if((time_date_mask&DISPLAY_USE_DATE_FORMAT)==DISPLAY_USE_DATE_FORMAT){
991             proto_tree_add_item(msg_tree,hf_display_date_format,tvb,offset,1,FALSE);
992          }
993          proto_tree_add_item(msg_tree,hf_display_use_time_format,tvb,offset,1,FALSE);
994          proto_tree_add_item(msg_tree,hf_display_use_date_format,tvb,offset,1,FALSE);
995          offset+=1;msg_len-=1;
996          break;
997       case 0x18:
998    /*address|no control|no tag|no*/
999          set_ascii_item(msg_tree,tvb,offset,msg_len);
1000          offset+=msg_len;
1001          break;
1002       case 0x19:
1003    /*address|yes control|no tag|no*/
1004          tmp_ti=proto_tree_add_text(msg_tree,tvb,offset,0,"Address");
1005
1006          address_tree=proto_item_add_subtree(tmp_ti,ett_unistim);
1007          address_byte=tvb_get_guint8(tvb,offset);
1008          proto_tree_add_item(address_tree,hf_basic_bit_field,
1009                              tvb,offset,1,FALSE);
1010          proto_tree_add_item(address_tree,hf_display_write_address_numeric,
1011                              tvb,offset,1,FALSE);
1012          proto_tree_add_item(address_tree,hf_display_write_address_context,
1013                              tvb,offset,1,FALSE);
1014          proto_tree_add_item(address_tree,hf_display_write_address_line,
1015                              tvb,offset,1,FALSE);
1016          proto_tree_add_item(address_tree,hf_display_write_address_soft_key,
1017                              tvb,offset,1,FALSE);
1018          proto_tree_add_item(address_tree,hf_display_write_address_soft_label,
1019                              tvb,offset,1,FALSE);
1020
1021          if((address_byte&DISPLAY_WRITE_ADDRESS_SOFT_KEY_FLAG)==
1022                           DISPLAY_WRITE_ADDRESS_SOFT_KEY_FLAG){
1023             proto_tree_add_item(address_tree,
1024                                 hf_display_write_address_softkey_id,
1025                                 tvb,offset,1,FALSE);
1026          }
1027          offset+=1;msg_len-=1;
1028          if((address_byte&DISPLAY_WRITE_ADDRESS_SOFT_LABEL_FLAG)==
1029              DISPLAY_WRITE_ADDRESS_SOFT_LABEL_FLAG){
1030             proto_tree_add_item(address_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1031             proto_tree_add_item(address_tree,
1032                                 hf_display_write_address_char_pos,
1033                                 tvb,offset,1,FALSE);
1034             if((address_byte&DISPLAY_WRITE_ADDRESS_LINE_FLAG)!=
1035                              DISPLAY_WRITE_ADDRESS_LINE_FLAG){
1036                offset+=1;msg_len-=1;
1037             }
1038          }
1039          if((address_byte&DISPLAY_WRITE_ADDRESS_LINE_FLAG)==
1040              DISPLAY_WRITE_ADDRESS_LINE_FLAG){
1041             proto_tree_add_item(address_tree,
1042                                 hf_display_write_address_line_number,
1043                                 tvb,offset,1,FALSE);
1044             offset+=1;msg_len-=1;
1045          }
1046          if(msg_len>0){
1047             /* I'm guessing this will work flakily at best */
1048             uinfo->string_data = tvb_get_string(tvb,offset,msg_len);
1049             set_ascii_item(msg_tree,tvb,offset,msg_len);
1050          }
1051
1052          offset+=msg_len;
1053          break;
1054       case 0x1a:
1055    /*address|no control|yes tag|no*/
1056          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1057          proto_tree_add_item(msg_tree,hf_display_write_cursor_move,
1058                              tvb,offset,1,FALSE);
1059          proto_tree_add_item(msg_tree,hf_display_write_clear_left,
1060                              tvb,offset,1,FALSE);
1061          proto_tree_add_item(msg_tree,hf_display_write_clear_right,
1062                              tvb,offset,1,FALSE);
1063          proto_tree_add_item(msg_tree,hf_display_write_shift_left,
1064                              tvb,offset,1,FALSE);
1065          proto_tree_add_item(msg_tree,hf_display_write_shift_right,
1066                              tvb,offset,1,FALSE);
1067          proto_tree_add_item(msg_tree,hf_display_write_highlight,
1068                              tvb,offset,1,FALSE);
1069          offset+=1;msg_len-=1;
1070          set_ascii_item(msg_tree,tvb,offset,msg_len);
1071          offset+=msg_len;
1072          proto_tree_add_item(msg_tree,hf_generic_string,
1073                              tvb,offset,msg_len,FALSE);
1074          offset+=msg_len;
1075          break;
1076       case 0x1b:
1077    /*address|yes control|yes tag|no*/
1078          tmp_ti=proto_tree_add_text(msg_tree,tvb,offset,0,"Address Data");
1079          address_tree=proto_item_add_subtree(tmp_ti,ett_unistim);
1080          address_byte=tvb_get_guint8(tvb,offset);
1081          proto_tree_add_item(address_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1082          proto_tree_add_item(address_tree,
1083                              hf_display_write_address_numeric,
1084                              tvb,offset,1,FALSE);
1085          proto_tree_add_item(address_tree,
1086                              hf_display_write_address_context,
1087                              tvb,offset,1,FALSE);
1088          proto_tree_add_item(address_tree,
1089                              hf_display_write_address_line,
1090                              tvb,offset,1,FALSE);
1091          proto_tree_add_item(address_tree,
1092                              hf_display_write_address_soft_key,
1093                              tvb,offset,1,FALSE);
1094          proto_tree_add_item(address_tree,
1095                              hf_display_write_address_soft_label,
1096                              tvb,offset,1,FALSE);
1097          if((address_byte&DISPLAY_WRITE_ADDRESS_SOFT_KEY_FLAG)==
1098                           DISPLAY_WRITE_ADDRESS_SOFT_KEY_FLAG){
1099             proto_tree_add_item(address_tree,hf_display_write_address_softkey_id,
1100                                 tvb,offset,1,FALSE);
1101             offset+=1; msg_len-=1;
1102          }
1103          if((address_byte&DISPLAY_WRITE_ADDRESS_SOFT_LABEL_FLAG)==
1104                           DISPLAY_WRITE_ADDRESS_SOFT_LABEL_FLAG){
1105             proto_tree_add_item(address_tree,
1106                                 hf_display_write_address_char_pos,
1107                                 tvb,offset,1,FALSE);
1108             if((address_byte&DISPLAY_WRITE_ADDRESS_LINE_FLAG)!=
1109                              DISPLAY_WRITE_ADDRESS_LINE_FLAG)
1110                offset+=1;msg_len-=1;
1111          }
1112          if((address_byte&DISPLAY_WRITE_ADDRESS_LINE_FLAG)==
1113                           DISPLAY_WRITE_ADDRESS_LINE_FLAG){
1114             proto_tree_add_item(address_tree,
1115                                 hf_display_write_address_line_number,
1116                                 tvb,offset,1,FALSE);
1117             offset+=1;msg_len-=1;
1118          }
1119          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1120          proto_tree_add_item(msg_tree,hf_display_write_cursor_move,
1121                              tvb,offset,1,FALSE);
1122          proto_tree_add_item(msg_tree,hf_display_write_clear_left,
1123                              tvb,offset,1,FALSE);
1124          proto_tree_add_item(msg_tree,hf_display_write_clear_right,
1125                              tvb,offset,1,FALSE);
1126          proto_tree_add_item(msg_tree,hf_display_write_shift_left,
1127                              tvb,offset,1,FALSE);
1128          proto_tree_add_item(msg_tree,hf_display_write_shift_right,
1129                              tvb,offset,1,FALSE);
1130          proto_tree_add_item(msg_tree,hf_display_write_highlight,
1131                              tvb,offset,1,FALSE);
1132          offset+=1;msg_len-=1;
1133          set_ascii_item(msg_tree,tvb,offset,msg_len);
1134          offset+=msg_len;
1135          break;
1136       case 0x1c:
1137    /*address|no control|no tag|yes*/
1138          proto_tree_add_item(msg_tree,hf_display_write_tag,tvb,offset,1,FALSE);
1139          offset+=1;msg_len-=1;
1140          set_ascii_item(msg_tree,tvb,offset,msg_len);
1141          offset+=msg_len;
1142          break;
1143       case 0x1d:
1144    /*address|yes control|no tag|yes*/
1145          tmp_ti=proto_tree_add_text(msg_tree,tvb,offset,0,"Address Data");
1146          address_tree=proto_item_add_subtree(tmp_ti,ett_unistim);
1147          address_byte=tvb_get_guint8(tvb,offset);
1148          proto_tree_add_item(address_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1149          proto_tree_add_item(address_tree,hf_display_write_address_numeric,tvb,
1150                              offset,1,FALSE);
1151          proto_tree_add_item(address_tree,hf_display_write_address_context,
1152                              tvb,offset,1,FALSE);
1153          proto_tree_add_item(address_tree,hf_display_write_address_line,
1154                              tvb,offset,1,FALSE);
1155          proto_tree_add_item(address_tree,hf_display_write_address_soft_key,
1156                              tvb,offset,1,FALSE);
1157          proto_tree_add_item(address_tree,hf_display_write_address_soft_label,
1158                              tvb,offset,1,FALSE);
1159          if((address_byte&DISPLAY_WRITE_ADDRESS_SOFT_KEY_FLAG)==
1160              DISPLAY_WRITE_ADDRESS_SOFT_KEY_FLAG)
1161             proto_tree_add_item(address_tree,
1162                                 hf_display_write_address_softkey_id,
1163                                 tvb,offset,1,FALSE);
1164          offset+=1; msg_len-=1;
1165          if((address_byte&DISPLAY_WRITE_ADDRESS_SOFT_LABEL_FLAG)==
1166              DISPLAY_WRITE_ADDRESS_SOFT_LABEL_FLAG){
1167             proto_tree_add_item(address_tree,
1168                                 hf_display_write_address_char_pos,
1169                                 tvb,offset,1,FALSE);
1170             if((address_byte&DISPLAY_WRITE_ADDRESS_LINE_FLAG)!=
1171                 DISPLAY_WRITE_ADDRESS_LINE_FLAG)
1172                offset+=1;msg_len-=1;
1173          }
1174          if((address_byte&DISPLAY_WRITE_ADDRESS_LINE_FLAG)==
1175              DISPLAY_WRITE_ADDRESS_LINE_FLAG){
1176             proto_tree_add_item(address_tree,hf_display_write_address_line_number,
1177                                 tvb,offset,1,FALSE);
1178             offset+=1;msg_len-=1;
1179          }
1180          set_ascii_item(msg_tree,tvb,offset,msg_len);
1181          offset+=msg_len;
1182          break;
1183       case 0x1e:
1184    /*address|no control|yes tag|yes*/
1185          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1186          proto_tree_add_item(msg_tree,hf_display_write_cursor_move,
1187                              tvb,offset,1,FALSE);
1188          proto_tree_add_item(msg_tree,hf_display_write_clear_left,
1189                              tvb,offset,1,FALSE);
1190          proto_tree_add_item(msg_tree,hf_display_write_clear_right,
1191                              tvb,offset,1,FALSE);
1192          proto_tree_add_item(msg_tree,hf_display_write_shift_left,
1193                              tvb,offset,1,FALSE);
1194          proto_tree_add_item(msg_tree,hf_display_write_shift_right,
1195                              tvb,offset,1,FALSE);
1196          proto_tree_add_item(msg_tree,hf_display_write_highlight,
1197                              tvb,offset,1,FALSE);
1198          offset+=1;msg_len-=1;
1199
1200          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1201          offset+=msg_len;
1202          proto_tree_add_item(msg_tree,hf_display_write_tag,tvb,offset,1,FALSE);
1203          offset+=1;msg_len-=1;
1204          set_ascii_item(msg_tree,tvb,offset,msg_len);
1205          offset+=msg_len;
1206          break;
1207       case 0x1f:
1208    /*address|yes control|yes tag|yes*/
1209          tmp_ti=proto_tree_add_text(msg_tree,tvb,offset,0,"Address");
1210          address_tree=proto_item_add_subtree(tmp_ti,ett_unistim);
1211          address_byte=tvb_get_guint8(tvb,offset);
1212          proto_tree_add_item(address_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1213          proto_tree_add_item(address_tree,hf_display_write_address_numeric,
1214                              tvb,offset,1,FALSE);
1215          proto_tree_add_item(address_tree,hf_display_write_address_context,
1216                              tvb,offset,1,FALSE);
1217          proto_tree_add_item(address_tree,hf_display_write_address_line,
1218                              tvb,offset,1,FALSE);
1219          proto_tree_add_item(address_tree,hf_display_write_address_soft_key,
1220                              tvb,offset,1,FALSE);
1221          proto_tree_add_item(address_tree,hf_display_write_address_soft_label,
1222                              tvb,offset,1,FALSE);
1223          if((address_byte&DISPLAY_WRITE_ADDRESS_SOFT_KEY_FLAG)==
1224                           DISPLAY_WRITE_ADDRESS_SOFT_KEY_FLAG)
1225             proto_tree_add_item(address_tree,hf_display_write_address_softkey_id,
1226                                 tvb,offset,1,FALSE);
1227          offset+=1; msg_len-=1;
1228          proto_tree_add_item(msg_tree,hf_generic_string,
1229                              tvb,offset,msg_len,FALSE);
1230          offset+=msg_len;
1231          if((address_byte&DISPLAY_WRITE_ADDRESS_SOFT_LABEL_FLAG)==
1232                           DISPLAY_WRITE_ADDRESS_SOFT_LABEL_FLAG){
1233             proto_tree_add_item(address_tree,hf_display_write_address_char_pos,
1234                                 tvb,offset,1,FALSE);
1235             if((address_byte&DISPLAY_WRITE_ADDRESS_SOFT_LABEL_FLAG)!=
1236                              DISPLAY_WRITE_ADDRESS_SOFT_LABEL_FLAG)
1237                offset+=1;msg_len-=1;
1238          }
1239          if((address_byte&DISPLAY_WRITE_ADDRESS_LINE_FLAG)==
1240                           DISPLAY_WRITE_ADDRESS_LINE_FLAG){
1241             proto_tree_add_item(address_tree,
1242                                 hf_display_write_address_line_number,
1243                                 tvb,offset,1,FALSE);
1244             offset+=1;msg_len-=1;
1245          } 
1246          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1247          proto_tree_add_item(msg_tree,hf_display_write_cursor_move,
1248                              tvb,offset,1,FALSE);
1249          proto_tree_add_item(msg_tree,hf_display_write_clear_left,
1250                              tvb,offset,1,FALSE);
1251          proto_tree_add_item(msg_tree,hf_display_write_clear_right,
1252                              tvb,offset,1,FALSE);
1253          proto_tree_add_item(msg_tree,hf_display_write_shift_left,
1254                              tvb,offset,1,FALSE);
1255          proto_tree_add_item(msg_tree,hf_display_write_shift_right,
1256                              tvb,offset,1,FALSE);
1257          proto_tree_add_item(msg_tree,hf_display_write_highlight,
1258                              tvb,offset,1,FALSE);
1259          offset+=1;msg_len-=1;
1260          proto_tree_add_item(msg_tree,hf_display_write_tag,
1261                              tvb,offset,1,FALSE);
1262          offset+=1;msg_len-=1;
1263          set_ascii_item(msg_tree,tvb,offset,msg_len);
1264          offset+=msg_len;
1265          break;
1266       case 0x20:
1267    /*Context Info Bar Format*/
1268          while(msg_len>0){
1269             proto_tree_add_item(msg_tree,hf_display_context_format,tvb,offset,1,FALSE);
1270             proto_tree_add_item(msg_tree,hf_display_context_field,tvb,offset,1,FALSE);
1271             offset+=1;msg_len-=1;
1272          }
1273          break;
1274       case 0x21:
1275    /*Set Default Character Table Configuration VERY UGLY*/
1276          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1277          offset+=msg_len;
1278          break;
1279       case 0x22:
1280    /*Special Character Download*/
1281          proto_tree_add_item(msg_tree,hf_display_char_address,tvb,offset,1,FALSE);
1282          offset+=1;msg_len-=1;
1283          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1284          offset+=msg_len;
1285          break;
1286       case 0x23:
1287    /*Highlighted Field Definition*/
1288          highlight_cmd=tvb_get_guint8(tvb,offset);
1289          proto_tree_add_item(msg_tree,hf_display_cursor_numeric,tvb,offset,1,FALSE);
1290          proto_tree_add_item(msg_tree,hf_display_cursor_context ,tvb,offset,1,FALSE);
1291          proto_tree_add_item(msg_tree,hf_display_cursor_line,tvb,offset,1,FALSE);
1292          proto_tree_add_item(msg_tree,hf_display_cursor_softkey,tvb,offset,1,FALSE);
1293          proto_tree_add_item(msg_tree,hf_display_cursor_softkey_id,tvb,offset,1,FALSE);
1294          offset+=1;msg_len-=1;proto_tree_add_item(msg_tree,hf_display_hlight_start,tvb,offset,1,FALSE);
1295          offset+=1;msg_len-=1;
1296          proto_tree_add_item(msg_tree,hf_display_hlight_end,tvb,offset,1,FALSE);
1297          offset+=1;msg_len-=1;
1298          if(msg_len==0)
1299              break;
1300          if((highlight_cmd&DISPLAY_CURSOR_LINE)==DISPLAY_CURSOR_LINE){
1301            proto_tree_add_item(msg_tree,hf_display_cursor_char_pos,tvb,offset,1,FALSE);
1302            proto_tree_add_item(msg_tree,hf_display_cursor_line_number,tvb,offset,1,FALSE);
1303            offset+=1;msg_len-=1;
1304          }
1305          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1306          offset+=msg_len;
1307          break;
1308       case 0x24:
1309    /*Contrast*/
1310          proto_tree_add_item(msg_tree,hf_display_contrast,tvb,offset,1,FALSE);
1311          offset+=1;msg_len-=1;
1312          break;
1313       case 0x25:
1314    /*Caller Log Download*/
1315          proto_tree_add_item(msg_tree,hf_broadcast_hour,tvb,offset,msg_len,FALSE);
1316          offset+=1;msg_len-=1;
1317          proto_tree_add_item(msg_tree,hf_broadcast_minute,tvb,offset,msg_len,FALSE);
1318          offset+=1;msg_len-=1;
1319          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1320          offset+=msg_len;
1321          break;
1322       case 0x30:
1323    /*Layered Softkey Text Download*/
1324          proto_tree_add_item(msg_tree,hf_display_layer_skey_id,tvb,offset,1,FALSE);
1325          offset+=1;msg_len-=1;
1326          proto_tree_add_item(msg_tree,hf_display_layer_number,tvb,offset,1,FALSE);
1327          offset+=1;msg_len-=1;
1328          set_ascii_item(msg_tree,tvb,offset,msg_len);
1329          offset+=msg_len;
1330          break;
1331       case 0x31:
1332    /*Layered Softkey Clear*/
1333          proto_tree_add_item(msg_tree,hf_display_layer_skey_id,tvb,offset,1,FALSE);
1334          proto_tree_add_item(msg_tree,hf_display_layer_all_skeys,tvb,offset,msg_len,FALSE);
1335          offset+=1;msg_len-=1;
1336          proto_tree_add_item(msg_tree,hf_display_layer_number,tvb,offset,1,FALSE);
1337          offset+=1;msg_len-=1;
1338          break;
1339       case 0x32:
1340    /*Set Visible Softkey Layer*/
1341          proto_tree_add_item(msg_tree,hf_display_layer_skey_id,tvb,offset,1,FALSE);
1342          proto_tree_add_item(msg_tree,hf_display_layer_all_skeys,tvb,offset,msg_len,FALSE);
1343          offset+=1;msg_len-=1;
1344          proto_tree_add_item(msg_tree,hf_display_layer_number,tvb,offset,1,FALSE);
1345          offset+=1;msg_len-=1;
1346          break;
1347       case 0x33:
1348    /*Layered Softkey Cadence Download*/
1349          proto_tree_add_item(msg_tree,hf_display_layer_skey_id,tvb,offset,1,FALSE);
1350          proto_tree_add_item(msg_tree,hf_display_once_or_cyclic,tvb,offset,msg_len,FALSE);
1351          offset+=1;msg_len-=1;
1352          while(msg_len>0){
1353             proto_tree_add_item(msg_tree,hf_display_layer_number,tvb,offset,1,FALSE);
1354             offset+=1;msg_len-=1;
1355             proto_tree_add_item(msg_tree,hf_display_layer_duration,tvb,offset,1,FALSE);
1356             offset+=1;msg_len-=1;
1357          }
1358          break;
1359       case 0x34:
1360    /*Layered Softkey Cadencing On*/
1361         proto_tree_add_item(msg_tree,hf_display_layer_skey_id,tvb,offset,1,FALSE);
1362         offset+=1;msg_len-=1;
1363         break;
1364       case 0x35:
1365    /*Layered Softkey Cadencing Off*/
1366          proto_tree_add_item(msg_tree,hf_display_layer_skey_id,tvb,offset,1,FALSE);
1367          offset+=1;msg_len-=1;
1368          break;
1369       case 0xff:
1370    /*Reserved*/
1371          break;
1372       default:
1373          proto_tree_add_item(msg_tree,hf_generic_data,
1374                              tvb,offset,msg_len,FALSE);
1375          offset+=msg_len;
1376    }
1377
1378    return offset;
1379 }
1380    /*DONE*/
1381 static gint
1382 dissect_display_phone(proto_tree *msg_tree,
1383                       tvbuff_t *tvb,gint offset,guint msg_len){
1384    guint display_cmd;
1385    guint highlight_cmd;
1386    display_cmd=tvb_get_guint8(tvb,offset);
1387    proto_tree_add_item(msg_tree,hf_display_phone_cmd,tvb,offset,1,FALSE);
1388    offset+=1;
1389    switch(display_cmd){
1390       case 0x00:
1391    /*Display Manager Attributes Info*/
1392          proto_tree_add_item(msg_tree,hf_display_line_width,tvb,offset,1,FALSE);
1393          proto_tree_add_item(msg_tree,hf_display_lines,tvb,offset,1,FALSE);
1394          offset+=1;msg_len-=1;
1395          proto_tree_add_item(msg_tree,hf_display_softkey_width,tvb,offset,1,FALSE);
1396          proto_tree_add_item(msg_tree,hf_display_softkeys,tvb,offset,1,FALSE);
1397          proto_tree_add_item(msg_tree,hf_display_icon,tvb,offset,1,FALSE);
1398          offset+=1;msg_len-=1;
1399          proto_tree_add_item(msg_tree,hf_display_softlabel_key_width,tvb,offset,1,FALSE);
1400          proto_tree_add_item(msg_tree,hf_display_context_width,tvb,offset,1,FALSE);
1401          offset+=1;msg_len-=1;
1402          proto_tree_add_item(msg_tree,hf_display_numeric_width,tvb,offset,1,FALSE);
1403          proto_tree_add_item(msg_tree,hf_display_time_width,tvb,offset,1,FALSE);
1404          proto_tree_add_item(msg_tree,hf_display_date_width,tvb,offset,1,FALSE);
1405          offset+=1;msg_len-=1;
1406          proto_tree_add_item(msg_tree,hf_display_char_dload,tvb,offset,1,FALSE);
1407          proto_tree_add_item(msg_tree,hf_display_freeform_icon_dload,tvb,offset,1,FALSE);
1408          proto_tree_add_item(msg_tree,hf_display_icon_type,tvb,offset,1,FALSE);
1409          offset+=1;msg_len-=1;
1410          proto_tree_add_item(msg_tree,hf_display_charsets,tvb,offset,1,FALSE);
1411          offset+=1;msg_len-=1;
1412
1413          break;
1414       case 0x01:
1415    /*Contrast Level Report*/
1416          proto_tree_add_item(msg_tree,hf_display_contrast,tvb,offset,1,FALSE);
1417          offset+=1;msg_len-=1;
1418          break;
1419       case 0x02:
1420    /*Cursor Location Report*/
1421          proto_tree_add_item(msg_tree,hf_display_cursor_numeric,tvb,offset,1,FALSE);
1422          proto_tree_add_item(msg_tree,hf_display_cursor_context ,tvb,offset,1,FALSE);
1423          proto_tree_add_item(msg_tree,hf_display_cursor_line,tvb,offset,1,FALSE);
1424          proto_tree_add_item(msg_tree,hf_display_cursor_softkey,tvb,offset,1,FALSE);
1425          proto_tree_add_item(msg_tree,hf_display_cursor_softkey_id,tvb,offset,1,FALSE);
1426          offset+=1;msg_len-=1;
1427          proto_tree_add_item(msg_tree,hf_display_cursor_char_pos,tvb,offset,1,FALSE);
1428          proto_tree_add_item(msg_tree,hf_display_cursor_line_number,tvb,offset,1,FALSE);
1429          offset+=1;msg_len-=1;
1430          break;
1431       case 0x03:
1432    /*Highlight Status On*/
1433          highlight_cmd=tvb_get_guint8(tvb,offset);
1434          proto_tree_add_item(msg_tree,hf_display_cursor_numeric,tvb,offset,1,FALSE);
1435          proto_tree_add_item(msg_tree,hf_display_cursor_context ,tvb,offset,1,FALSE);
1436          proto_tree_add_item(msg_tree,hf_display_cursor_line,tvb,offset,1,FALSE);
1437          proto_tree_add_item(msg_tree,hf_display_cursor_softkey,tvb,offset,1,FALSE);
1438          proto_tree_add_item(msg_tree,hf_display_cursor_softkey_id,tvb,offset,1,FALSE);
1439          offset+=1;msg_len-=1;proto_tree_add_item(msg_tree,hf_display_hlight_start,tvb,offset,1,FALSE);
1440          offset+=1;msg_len-=1;
1441          proto_tree_add_item(msg_tree,hf_display_hlight_end,tvb,offset,1,FALSE);
1442          offset+=1;msg_len-=1;
1443          if((highlight_cmd&DISPLAY_CURSOR_LINE)==DISPLAY_CURSOR_LINE){
1444            proto_tree_add_item(msg_tree,hf_display_cursor_char_pos,tvb,offset,1,FALSE);
1445            proto_tree_add_item(msg_tree,hf_display_cursor_line_number,tvb,offset,1,FALSE);
1446            offset+=1;msg_len-=1;
1447          }
1448          break;
1449       case 0x04:
1450    /*Current Character Table Configuration Status   VERY UGLY*/
1451          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1452          offset+=msg_len;
1453          break;
1454       case 0x05:
1455    /*Default Character Table Configuration Status   VERY UGLY*/
1456          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1457          offset+=msg_len;
1458          break;
1459       case 0x06:
1460    /*Timer And Date Format Report*/
1461          proto_tree_add_item(msg_tree,hf_display_time_format,tvb,offset,1,FALSE);
1462          proto_tree_add_item(msg_tree,hf_display_date_format,tvb,offset,1,FALSE);
1463          offset+=1;msg_len-=1;
1464          break;
1465       case 0x07:
1466    /*Status Bar Icon State Report*/
1467          proto_tree_add_item(msg_tree,hf_icon_id,tvb,offset,msg_len,FALSE);
1468          offset+=1;msg_len-=1;
1469          proto_tree_add_item(msg_tree,hf_broadcast_icon_state,tvb,offset,msg_len,FALSE);
1470          proto_tree_add_item(msg_tree,hf_broadcast_icon_cadence,tvb,offset,msg_len,FALSE);
1471          offset+=1;msg_len-=1;
1472          break;
1473       case 0x0a:
1474    /*Highlight Status Off length = 3*/
1475          break;
1476       case 0xff:
1477    /*Reserved*/
1478          break;
1479       default:
1480          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1481          offset+=msg_len;
1482    }
1483
1484    return offset;
1485 }
1486
1487
1488 static gint
1489 dissect_key_indicator_switch(proto_tree *msg_tree, 
1490                              tvbuff_t *tvb, gint offset,guint msg_len){
1491    guint key_cmd;
1492    key_cmd=tvb_get_guint8(tvb,offset);
1493    proto_tree_add_item(msg_tree,hf_key_switch_cmd,tvb,offset,1,FALSE);
1494    offset+=1;msg_len-=1;
1495    switch(key_cmd){
1496       case 0x00:
1497    /*LED Update*/
1498          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1499          proto_tree_add_item(msg_tree,hf_key_led_cadence,tvb,offset,1,FALSE);
1500          proto_tree_add_item(msg_tree,hf_key_led_id,tvb,offset,1,FALSE);
1501          offset+=1;msg_len-=1;
1502          break;
1503       case 0x01:
1504    /*Query Hookswitch length = 3 */
1505          break;
1506       case 0x02:
1507    /*User Activity Timer Stop length = 3*/
1508          break;
1509       case 0x03:
1510    /*User Activity Timer Start length = 3*/
1511          break;
1512       case 0x04:
1513    /*Downloadable Free Form Icon Access (Hardcoded) length of 3*/
1514          break;
1515       case 0x05:
1516    /*Downloadable Free Form Icon Access (Downloadable) length of 3*/
1517          break;
1518       case 0x06:
1519    /*Query Key/Indicator Manager*/
1520          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1521          offset+=msg_len;
1522          break;
1523       case 0x07:
1524    /*Key/Indicator Manager Options*/
1525          proto_tree_add_item(msg_tree,hf_keys_send_key_rel,tvb,offset,1,FALSE);
1526          proto_tree_add_item(msg_tree,hf_keys_enable_vol,tvb,offset,1,FALSE);
1527          proto_tree_add_item(msg_tree,hf_keys_conspic_prog_key,tvb,offset,1,FALSE);
1528          proto_tree_add_item(msg_tree,hf_keys_acd_super_control,tvb,offset,1,FALSE);
1529          proto_tree_add_item(msg_tree,hf_keys_local_dial_feedback,tvb,offset,1,FALSE);
1530          offset+=1;msg_len-=1;
1531          break;
1532       case 0x08:
1533    /*Logical Icon Mapping*/
1534          proto_tree_add_item(msg_tree,hf_key_icon_id,tvb,offset,1,FALSE);
1535          proto_tree_add_item(msg_tree,hf_keys_admin_command,tvb,offset,1,FALSE);
1536          offset+=1;msg_len-=1;
1537          proto_tree_add_item(msg_tree,hf_keys_logical_icon_id,tvb,offset,2,FALSE);
1538          offset+=2;msg_len-=2;
1539          break;
1540       case 0x09:
1541    /*Key Repeat Timer Download*/
1542          proto_tree_add_item(msg_tree,hf_keys_repeat_timer_one,tvb,offset,1,FALSE);
1543          offset+=1;msg_len-=1;
1544          proto_tree_add_item(msg_tree,hf_keys_repeat_timer_two,tvb,offset,1,FALSE);
1545          offset+=1;msg_len-=1;
1546          break;
1547       case 0x0a:
1548    /*Query LED State*/
1549          proto_tree_add_item(msg_tree,hf_keys_led_id,tvb,offset,1,FALSE);
1550          offset+=1;msg_len-=1;
1551          break;
1552       case 0x0b:
1553    /*Query Phone Icon State*/
1554          proto_tree_add_item(msg_tree,hf_keys_phone_icon_id,tvb,offset,1,FALSE);
1555          offset+=1;msg_len-=1;
1556          break;
1557       case 0x0c:
1558    /*Indicator Cadence Download*/
1559          while(msg_len>0){
1560             proto_tree_add_item(msg_tree,hf_keys_cadence_on_time,tvb,offset,1,FALSE);
1561             offset+=1;msg_len-=1;
1562             proto_tree_add_item(msg_tree,hf_keys_cadence_off_time,tvb,offset,1,FALSE);
1563             offset+=1;msg_len-=1;
1564          }
1565          break;
1566       case 0x0d:
1567    /*User Activity Timer Download*/
1568          proto_tree_add_item(msg_tree,hf_keys_user_activity_timeout,tvb,offset,1,FALSE);
1569          offset+=1;msg_len-=1;
1570          break;
1571       case 0x0e:
1572    /*Free Form Icon Download*/
1573          proto_tree_add_item(msg_tree,hf_key_icon_id,tvb,offset,1,FALSE);
1574          offset+=1;msg_len-=1;
1575          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1576          offset+=msg_len;
1577          break;
1578       case 0x0f:
1579    /*Phone Icon Update*/
1580          proto_tree_add_item(msg_tree,hf_key_icon_id,tvb,offset,1,FALSE);
1581          offset+=1;msg_len-=1;
1582          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1583          proto_tree_add_item(msg_tree,hf_broadcast_icon_state,tvb,offset,1,FALSE);
1584          proto_tree_add_item(msg_tree,hf_broadcast_icon_cadence,tvb,offset,1,FALSE);
1585          offset+=1;msg_len-=1;
1586          break;
1587       case 0xff:
1588    /*Reserved*/
1589          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1590          offset+=msg_len;
1591          break;
1592       default:
1593          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1594          offset+=msg_len;
1595    }
1596
1597    return offset;
1598 }
1599
1600 /*DONE*/
1601 static gint
1602 dissect_key_indicator_phone(proto_tree *msg_tree,
1603                             tvbuff_t *tvb,gint offset, guint msg_len){
1604    guint key_cmd;
1605    key_cmd=tvb_get_guint8(tvb,offset);
1606    proto_tree_add_item(msg_tree,hf_key_phone_cmd,tvb,offset,1,FALSE);
1607    offset+=1;msg_len-=1;
1608    switch(key_cmd){
1609       case 0x00:
1610    /*Key Event*/
1611          /* Set the tap info */
1612          uinfo->key_state = tvb_get_guint8(tvb,offset);
1613          uinfo->key_state >>= 6;
1614          /* Extract the key code */
1615          uinfo->key_val = (tvb_get_guint8(tvb,offset) & 0x3F);
1616
1617          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1618          proto_tree_add_item(msg_tree,hf_key_code,tvb,offset,1,FALSE);
1619          proto_tree_add_item(msg_tree,hf_key_command,tvb,offset,1,FALSE);
1620          offset+=1;
1621          break;
1622       case 0x01:
1623    /*LED Status Report*/
1624          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1625          offset+=msg_len;
1626          break;
1627       case 0x03:
1628    /*On Hook length = 3*/
1629          /* Set tap info.. */
1630          uinfo->hook_state = 0;
1631
1632          break;
1633       case 0x04:
1634    /*Off Hook length = 3*/
1635          /* Set tap info.. */
1636          uinfo->hook_state = 1;
1637
1638          break;
1639       case 0x05:
1640    /*User Activity Timer Expired length = 3*/
1641          break;
1642       case 0x06:
1643    /*Hookswitch State (on hook) length = 3*/
1644          break;
1645       case 0x07:
1646    /*Hookswitch State (off hook) length = 3*/
1647          break;
1648       case 0x08:
1649    /*Key/Indicator Manager Attributes Info*/
1650          proto_tree_add_item(msg_tree,hf_key_programmable_keys,tvb,offset,1,FALSE);
1651          proto_tree_add_item(msg_tree,hf_keys_soft_keys,tvb,offset,1,FALSE);
1652          offset+=1;msg_len-=1;
1653          proto_tree_add_item(msg_tree,hf_keys_hd_key,tvb,offset,1,FALSE);
1654          proto_tree_add_item(msg_tree,hf_keys_mute_key,tvb,offset,1,FALSE);
1655          proto_tree_add_item(msg_tree,hf_keys_quit_key,tvb,offset,1,FALSE);
1656          proto_tree_add_item(msg_tree,hf_keys_copy_key,tvb,offset,1,FALSE);
1657          proto_tree_add_item(msg_tree,hf_keys_mwi_key,tvb,offset,1,FALSE);
1658          offset+=1;msg_len-=1;
1659          proto_tree_add_item(msg_tree,hf_keys_num_nav_keys,tvb,offset,1,FALSE);
1660          proto_tree_add_item(msg_tree,hf_keys_num_conspic_keys,tvb,offset,1,FALSE);
1661          offset+=1;msg_len-=1;
1662
1663          break;
1664       case 0x09:
1665    /*Key/Indicator Manager Options Report*/
1666          proto_tree_add_item(msg_tree,hf_keys_send_key_rel,tvb,offset,1,FALSE);
1667          proto_tree_add_item(msg_tree,hf_keys_enable_vol,tvb,offset,1,FALSE);
1668          proto_tree_add_item(msg_tree,hf_keys_conspic_prog_key,tvb,offset,1,FALSE);
1669          proto_tree_add_item(msg_tree,hf_keys_acd_super_control,tvb,offset,1,FALSE);
1670          proto_tree_add_item(msg_tree,hf_keys_local_dial_feedback,tvb,offset,1,FALSE);
1671          offset+=1;msg_len-=1;
1672          break;
1673       case 0x0a:
1674    /*Phone Icon Status Report*/
1675          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1676          offset+=msg_len;
1677          break;
1678       case 0xff:
1679    /*Reserved*/
1680          break;
1681       default:
1682          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1683          offset+=msg_len;
1684    }
1685
1686    return offset;
1687 }
1688
1689
1690 /*Done*/
1691 static gint
1692 dissect_network_switch(proto_tree *msg_tree,
1693                        tvbuff_t *tvb,gint offset, guint msg_len){
1694    guint network_cmd; 
1695    network_cmd=tvb_get_guint8(tvb,offset);
1696    proto_tree_add_item(msg_tree,hf_network_switch_cmd,tvb,offset,1,FALSE);
1697    offset+=1;msg_len-=1;
1698    switch(network_cmd){
1699       case 0x02:
1700    /*Soft Reset done*/
1701          break;
1702       case 0x03:
1703    /*Hard Reset done*/
1704          break;
1705       case 0x04:
1706    /*Query Network Manager*/
1707          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1708          proto_tree_add_item(msg_tree,hf_net_diag_flag,tvb,offset,1,FALSE);
1709          proto_tree_add_item(msg_tree,hf_net_managers_flag,tvb,offset,1,FALSE);
1710          proto_tree_add_item(msg_tree,hf_net_attributes_flag,tvb,offset,1,FALSE);
1711          proto_tree_add_item(msg_tree,hf_net_serv_info_flag,tvb,offset,1,FALSE);
1712          proto_tree_add_item(msg_tree,hf_net_options_flag,tvb,offset,1,FALSE);
1713          proto_tree_add_item(msg_tree,hf_net_sanity_flag,tvb,offset,1,FALSE);
1714          offset+=1;
1715          break;
1716       case 0x05:
1717    /*Network Manager Options*/
1718          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1719          proto_tree_add_item(msg_tree,hf_net_enable_diag,tvb,offset,1,FALSE);
1720          proto_tree_add_item(msg_tree,hf_net_enable_rudp,tvb,offset,1,FALSE);
1721          offset+=1;
1722          break;
1723       case 0x06:
1724    /*QoS Configuration*/
1725          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1726          offset+=msg_len;
1727          break;
1728       case 0x09:
1729    /*Set RTCP Source Description Item*/
1730          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1731          offset+=msg_len;
1732          break;
1733       case 0x0b:
1734    /*Download Server Information*/
1735          proto_tree_add_item(msg_tree,hf_net_server_id,tvb,offset,1,FALSE);
1736          offset+=1;
1737          proto_tree_add_item(msg_tree,hf_net_server_port,tvb,offset,2,FALSE);
1738          offset+=2;
1739          proto_tree_add_item(msg_tree,hf_net_server_action,tvb,offset,1,FALSE);
1740          offset+=1;
1741          proto_tree_add_item(msg_tree,hf_net_server_retry_count,tvb,offset,1,FALSE);
1742          offset+=1;
1743          proto_tree_add_item(msg_tree,hf_net_server_failover_id,tvb,offset,1,FALSE);
1744          offset+=1;
1745          proto_tree_add_item(msg_tree,hf_net_server_ip_address,tvb,offset,4,FALSE);
1746          offset+=4;
1747          break;
1748       case 0x0c:
1749    /*Server Switch*/
1750          proto_tree_add_item(msg_tree,hf_net_server_id,tvb,offset,1,FALSE);
1751          offset+=1;
1752          break;
1753       case 0x0d:
1754    /*Query Network Configuration Element*/
1755          proto_tree_add_item(msg_tree,hf_net_server_config_element,
1756                              tvb,offset-1,1,FALSE);
1757          offset+=1;
1758          break;
1759       case 0x0e:
1760    /*Download Software Upgrade*/
1761          proto_tree_add_item(msg_tree,hf_net_file_xfer_mode,tvb,offset,1,FALSE);
1762          proto_tree_add_item(msg_tree,hf_net_force_download,tvb,offset,1,FALSE);
1763          proto_tree_add_item(msg_tree,hf_net_use_file_server_port,tvb,offset,1,FALSE);
1764          proto_tree_add_item(msg_tree,hf_net_use_local_port,tvb,offset,1,FALSE);
1765          offset+=1;msg_len-=1;
1766          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,1,FALSE);
1767          offset+=1;msg_len-=1;
1768          set_ascii_null_term_item(msg_tree,tvb,offset,msg_len,"Full Pathname :");
1769          set_ascii_null_term_item(msg_tree,tvb,offset,msg_len,"File Identifier :");
1770          proto_tree_add_item(msg_tree,hf_net_file_server_port,tvb,offset,2,FALSE);
1771          offset+=2;msg_len-=2;
1772          proto_tree_add_item(msg_tree,hf_net_local_port,tvb,offset,2,FALSE);
1773          offset+=2;msg_len-=2;
1774          proto_tree_add_item(msg_tree,hf_net_file_server_address,tvb,offset,4,FALSE);
1775          offset+=4;msg_len-=4;
1776          break;
1777       case 0x0f:
1778    /*Set RTCP Report Interval*/
1779          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1780          offset+=msg_len;
1781          break;
1782       case 0x10:
1783    /*Set Primary Server*/
1784          proto_tree_add_item(msg_tree,hf_net_server_id,tvb,offset,1,FALSE);
1785          offset+=1;
1786          break;
1787       case 0x12:
1788    /*Reset Watchdog*/
1789       proto_tree_add_item(msg_tree,hf_net_server_time_out,
1790                           tvb,offset,2,FALSE);
1791          offset+=2;
1792          break;
1793       case 0x13:
1794    /*Set Recovery Procedure Time Interval*/
1795          proto_tree_add_item(msg_tree,hf_net_server_recovery_time_low,
1796                              tvb,offset,2,FALSE);
1797          offset+=2;
1798          proto_tree_add_item(msg_tree,hf_net_server_recovery_time_high,
1799                              tvb,offset,2,FALSE);
1800          offset+=2;
1801          break;
1802       case 0x14:
1803    /*Transport Reliability Layer Parameters Download*/
1804          proto_tree_add_item(msg_tree,hf_generic_data,
1805                              tvb,offset,msg_len,FALSE);
1806          offset+=msg_len;
1807          break;
1808       case 0xff:
1809    /*Reserved*/
1810          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1811          offset+=msg_len;
1812          break;
1813       default:
1814          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1815          offset+=msg_len;
1816
1817    }
1818
1819    return offset;
1820 }
1821
1822 /*DONE*/
1823 static gint
1824 dissect_network_phone(proto_tree *msg_tree, 
1825                       tvbuff_t *tvb,gint offset, guint msg_len){
1826    guint network_cmd;
1827    proto_tree *server_tree;
1828    proto_item *server;
1829    guint i;
1830    network_cmd=tvb_get_guint8(tvb,offset);
1831    proto_tree_add_item(msg_tree,hf_network_phone_cmd,tvb,offset,1,FALSE);
1832    offset+=1;
1833    switch(network_cmd){
1834       case 0x00:
1835    /*Soft Reset Ack done length = 3*/
1836          break;
1837       case 0x01:
1838    /*Sanity OK done length = 3*/
1839          break;
1840       case 0x02:
1841    /*Network Manager Attributes Info*/
1842          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1843          offset+=msg_len;
1844          break;
1845       case 0x03:
1846    /*Network Manager Diagnostic Info*/
1847          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1848          proto_tree_add_item(msg_tree,hf_net_phone_rx_ovr_flag,
1849                              tvb,offset,1,FALSE);
1850          proto_tree_add_item(msg_tree,hf_net_phone_tx_ovr_flag,
1851                              tvb,offset,1,FALSE);
1852          proto_tree_add_item(msg_tree,hf_net_phone_rx_empty_flag,
1853                              tvb,offset,1,FALSE);
1854          proto_tree_add_item(msg_tree,hf_net_phone_invalid_msg_flag,
1855                              tvb,offset,1,FALSE);
1856          proto_tree_add_item(msg_tree,hf_net_phone_eeprom_insane_flag,
1857                              tvb,offset,1,FALSE);
1858          proto_tree_add_item(msg_tree,hf_net_phone_eeprom_unsafe_flag,
1859                              tvb,offset,1,FALSE);
1860          offset+=1;
1861          break;
1862       case 0x04:
1863    /*Manager IDs*/
1864          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1865          offset+=msg_len;
1866          break;
1867       case 0x05:
1868    /*Network Manager Options Report*/
1869          proto_tree_add_boolean(msg_tree,hf_net_phone_diag,tvb,offset,1,FALSE);
1870          proto_tree_add_item(msg_tree,hf_net_phone_rudp,tvb,offset,1,FALSE);
1871          offset+=1;
1872          break;
1873       case 0x08:
1874    /*Resume Connection with Server done*/
1875          break;
1876       case 0x09:
1877    /*Suspend Connection with Server done*/
1878          break;
1879       case 0x0b:
1880    /*Network Configuration Element Report*/
1881          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1882          offset+=msg_len;
1883          break;
1884       case 0x0c:
1885    /*Server Information Report*/
1886          proto_tree_add_item(msg_tree,hf_net_phone_primary_server_id,
1887                              tvb,offset,1,FALSE);
1888          offset+=1;msg_len-=1;
1889          for (i=1; msg_len>8; i++){ 
1890    /*if less than 9 not full report so punt*/
1891 /*          guint16 port_num;
1892             port_num=tvb_get_ntohs(tvb,offset);
1893             if(port_num<1064)
1894                break;
1895 */
1896             server=proto_tree_add_text(msg_tree,tvb,offset,9,
1897                                        "Server (S%d) Server ID: %X",i,i-1);
1898             server_tree=proto_item_add_subtree(server,ett_unistim);
1899             proto_tree_add_item(server_tree,
1900                                 hf_net_phone_server_port,
1901                                 tvb,offset,2,FALSE);
1902             offset+=2;msg_len-=2;
1903             proto_tree_add_item(server_tree,
1904                                 hf_net_phone_server_action,
1905                                 tvb,offset,1,FALSE);
1906             offset+=1;msg_len-=1;
1907             proto_tree_add_item(server_tree,
1908                                 hf_net_phone_server_retry_count,
1909                                 tvb,offset,1,FALSE);
1910             offset+=1;msg_len-=1;
1911             proto_tree_add_item(server_tree,
1912                                 hf_net_phone_server_failover_id,
1913                                 tvb,offset,1,FALSE);
1914             offset+=1;msg_len-=1;
1915             proto_tree_add_item(server_tree,hf_net_phone_server_ip,
1916                                 tvb,offset,4,FALSE);
1917             offset+=4;msg_len-=4;
1918          }
1919          break;
1920       case 0xff:
1921    /*Reserved*/
1922          break;
1923       default:
1924          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
1925          offset+=msg_len;
1926    }
1927
1928    return offset;
1929 }
1930 /*DONE*/
1931 static gint
1932 dissect_audio_switch(proto_tree *msg_tree,packet_info *pinfo,
1933                                     tvbuff_t *tvb,gint offset,guint msg_len){
1934    proto_tree *param_tree;
1935    proto_item *param;
1936    guint audio_cmd;
1937    guint apb_op_code;
1938    guint apb_data_len;
1939    guint vocoder_param;
1940    audio_cmd=tvb_get_guint8(tvb,offset);
1941    proto_tree_add_item(msg_tree,hf_audio_switch_cmd,tvb,offset,1,FALSE);
1942    offset+=1;msg_len-=1;
1943    switch(audio_cmd){
1944    case 0x00:
1945    /*Query Audio Manager*/
1946       proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1947       proto_tree_add_item(msg_tree,hf_audio_mgr_attr,tvb,offset,1,FALSE);
1948       proto_tree_add_item(msg_tree,hf_audio_mgr_opts,tvb,offset,1,FALSE);
1949       proto_tree_add_item(msg_tree,hf_audio_mgr_alert,tvb,offset,1,FALSE);
1950       proto_tree_add_item(msg_tree,hf_audio_mgr_adj_rx_vol,tvb,offset,1,FALSE);
1951       proto_tree_add_item(msg_tree,hf_audio_mgr_def_rx_vol,tvb,offset,1,FALSE);
1952       proto_tree_add_item(msg_tree,hf_audio_mgr_handset,tvb,offset,1,FALSE);
1953       proto_tree_add_item(msg_tree,hf_audio_mgr_headset,tvb,offset,1,FALSE);
1954       offset+=1;
1955       proto_tree_add_item(msg_tree,hf_audio_default_rx_vol_id,
1956                           tvb,offset,1,FALSE);
1957       offset+=1;
1958       break;
1959    case 0x01:
1960    /*Query Supervisor Headset Status*/
1961       /*done*/
1962       break;
1963    case 0x02:
1964    /*Audio Manager Options*/
1965       proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1966       proto_tree_add_item(msg_tree,hf_audio_mgr_opt_max_vol,
1967                           tvb,offset,1,FALSE);
1968       proto_tree_add_item(msg_tree,hf_audio_mgr_opt_adj_vol,
1969                           tvb,offset,1,FALSE);
1970       proto_tree_add_item(msg_tree,hf_audio_mgr_opt_aa_rx_vol_rpt,
1971                           tvb,offset,1,FALSE);
1972       proto_tree_add_item(msg_tree,hf_audio_mgr_opt_hs_on_air,
1973                           tvb,offset,1,FALSE);
1974       proto_tree_add_item(msg_tree,hf_audio_mgr_opt_hd_on_air,
1975                           tvb,offset,1,FALSE);
1976       proto_tree_add_item(msg_tree,hf_audio_mgr_opt_noise_squelch,
1977                           tvb,offset,1,FALSE);
1978       offset+=1;
1979          break;
1980       case 0x04:
1981    /*Mute/Unmute*/
1982          while(msg_len>0){
1983             proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
1984             proto_tree_add_item(msg_tree,hf_audio_mgr_mute,tvb,offset,1,FALSE);
1985             proto_tree_add_item(msg_tree,hf_audio_mgr_tx_rx,tvb,offset,1,FALSE);
1986             offset+=1;msg_len-=1;
1987             proto_tree_add_item(msg_tree,hf_audio_mgr_stream_id,
1988                                 tvb,offset,1,FALSE);
1989             offset+=1;msg_len-=1;
1990          }
1991          break;
1992       case 0x10:
1993    /*Transducer Based Tone On*/
1994          proto_tree_add_item(msg_tree,
1995                              hf_audio_mgr_transducer_based_tone_id,
1996                              tvb,offset,1,FALSE);
1997          proto_tree_add_item(msg_tree,hf_audio_mgr_attenuated,
1998                              tvb,offset,1,FALSE);
1999          offset+=1;
2000          break;
2001       case 0x11:
2002    /*Transducer Based Tone Off*/
2003          proto_tree_add_item(msg_tree,hf_audio_mgr_transducer_based_tone_id,
2004                              tvb,offset,1,FALSE);
2005          offset+=1;
2006          break;
2007       case 0x12:
2008    /*Alerting Tone Configuration*/
2009          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
2010          proto_tree_add_item(msg_tree,hf_audio_mgr_warbler_select,
2011                              tvb,offset,1,FALSE);
2012          proto_tree_add_item(msg_tree,hf_audio_mgr_transducer_routing,
2013                              tvb,offset,1,FALSE);
2014          offset+=1;
2015          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
2016          proto_tree_add_item(msg_tree,hf_audio_mgr_tone_vol_range,
2017                              tvb,offset,1,FALSE);
2018          proto_tree_add_item(msg_tree,hf_audio_mgr_cadence_select,
2019                              tvb,offset,1,FALSE);
2020          offset+=1;
2021          break;
2022       case 0x13:
2023    /*Special Tone Configuration*/
2024          proto_tree_add_item(msg_tree,hf_audio_mgr_transducer_routing,
2025                              tvb,offset,1,FALSE);
2026          offset+=1;
2027          proto_tree_add_item(msg_tree,hf_audio_mgr_tone_vol_range,
2028                              tvb,offset,1,FALSE);
2029          offset+=1;
2030          proto_tree_add_item(msg_tree,hf_audio_special_tone,tvb,offset,1,FALSE);
2031          offset+=1;
2032          break;
2033       case 0x14:
2034    /*Paging Tone Configuration*/
2035          proto_tree_add_item(msg_tree,hf_audio_mgr_transducer_routing,
2036                              tvb,offset,1,FALSE);
2037          offset+=1;
2038          proto_tree_add_item(msg_tree,hf_audio_mgr_tone_vol_range,
2039                              tvb,offset,1,FALSE);
2040          proto_tree_add_item(msg_tree,hf_audio_mgr_cadence_select,
2041                              tvb,offset,1,FALSE);
2042          offset+=1;
2043          break;
2044       case 0x15:
2045    /*Alerting Tone Cadence Download*/
2046          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
2047          offset+=msg_len;
2048          break;
2049    /*TODO UGLY*/
2050       case 0x17:
2051    /*Paging Tone Cadence Download*/
2052          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
2053          offset+=msg_len;
2054          break;
2055    /*TODO UGLY*/
2056       case 0x18:
2057    /*Transducer Based Tone Volume Level*/
2058          proto_tree_add_item(msg_tree,hf_basic_bit_field,
2059                              tvb,offset,1,FALSE);
2060          proto_tree_add_item(msg_tree,
2061                              hf_audio_mgr_transducer_based_tone_id,
2062                              tvb,offset,1,FALSE);
2063          proto_tree_add_item(msg_tree,hf_audio_tone_level,tvb,offset,1,FALSE);
2064          offset+=1;
2065          break;
2066       case 0x1a:
2067    /*Visual Transducer Based Tone Enable*/
2068          proto_tree_add_item(msg_tree,hf_audio_visual_tones,
2069                              tvb,offset,1,FALSE);
2070          offset+=1;
2071          break;
2072       case 0x1b:
2073    /*Stream Based Tone On*/
2074          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
2075          proto_tree_add_item(msg_tree,hf_audio_stream_based_tone_id,
2076                              tvb,offset,1,FALSE);
2077          proto_tree_add_item(msg_tree,hf_audio_stream_based_tone_rx_tx,
2078                              tvb,offset,1,FALSE);
2079          proto_tree_add_item(msg_tree,hf_audio_stream_based_tone_mute,
2080                              tvb,offset,1,FALSE);
2081          offset+=1;
2082          proto_tree_add_item(msg_tree,hf_audio_stream_id,tvb,offset,1,FALSE);
2083          offset+=1;
2084          proto_tree_add_item(msg_tree,hf_audio_stream_based_volume,tvb,offset,1,FALSE);
2085          offset+=1;
2086          break;
2087       case 0x1c:
2088    /*Stream Based Tone Off*/
2089          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
2090          proto_tree_add_item(msg_tree,hf_audio_stream_based_tone_id,
2091                              tvb,offset,1,FALSE);
2092          proto_tree_add_item(msg_tree,hf_audio_stream_based_tone_rx_tx,
2093                              tvb,offset,1,FALSE);
2094          offset+=1;
2095          proto_tree_add_item(msg_tree,hf_audio_stream_id,tvb,offset,1,FALSE);
2096          offset+=1;
2097          break;
2098       case 0x1d:
2099    /*Stream Based Tone Frequency Component List Download*/
2100          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
2101          offset+=msg_len;
2102          break;
2103       case 0x1e:
2104    /*Stream Based Tone Cadence Download*/
2105          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
2106          offset+=msg_len;
2107          break;
2108       case 0x20:
2109    /*Select Adjustable Rx Volume*/
2110          proto_tree_add_item(msg_tree,hf_audio_default_rx_vol_id,
2111                              tvb,offset,1,FALSE);
2112          break;
2113       case 0x21:
2114    /*Set APB's Rx Volume Level*/
2115          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
2116          offset+=msg_len;
2117          break;
2118       case 0x22:
2119    /*Change Adjustable Rx Volume (quieter) DONE*/
2120          proto_tree_add_item(msg_tree,hf_generic_data,
2121                              tvb,offset,msg_len,FALSE);
2122          offset+=msg_len;
2123          break;
2124       case 0x23:
2125    /*Change Adjustable Rx Volume (louder) DONE*/
2126          proto_tree_add_item(msg_tree,hf_generic_data,
2127                              tvb,offset,msg_len,FALSE);
2128          offset+=msg_len;
2129          break;
2130       case 0x24:
2131    /*Adjust Default Rx Volume(quieter)*/
2132          proto_tree_add_item(msg_tree,hf_audio_default_rx_vol_id,
2133                              tvb,offset,1,FALSE);
2134          break;
2135       case 0x25:
2136    /*Adjust Default Rx Volume(louder)*/
2137          proto_tree_add_item(msg_tree,hf_audio_default_rx_vol_id,
2138                              tvb,offset,1,FALSE);
2139          break;
2140       case 0x28:
2141    /*APB Download*/
2142          proto_tree_add_item(msg_tree,hf_audio_apb_number,tvb,offset,1,FALSE);
2143          offset+=1;msg_len-=1;
2144          while(msg_len>0){
2145             apb_op_code=tvb_get_guint8(tvb,offset);
2146             proto_tree_add_item(msg_tree,hf_audio_apb_op_code,tvb,
2147                                 offset,1,FALSE);
2148             offset+=1;msg_len-=1;
2149             if(apb_op_code>0x39){
2150    /*should have a len + data*/
2151                apb_data_len=tvb_get_guint8(tvb,offset);
2152                proto_tree_add_item(msg_tree,hf_audio_apb_param_len,tvb,
2153                                    offset,1,FALSE);
2154                offset+=1;msg_len-=1;
2155                proto_tree_add_item(msg_tree,hf_audio_apb_data,tvb,
2156                                    offset,apb_data_len,FALSE);
2157                offset+=apb_data_len;msg_len-=apb_data_len;
2158             }
2159          }
2160          break;
2161       case 0x30:
2162    /*Open Audio Stream*/
2163          /* Set the tap info */
2164          uinfo->stream_connect = 1;
2165
2166          proto_tree_add_item(msg_tree,hf_audio_rx_stream_id,tvb,offset,1,FALSE);
2167          offset+=1;msg_len-=1;
2168          proto_tree_add_item(msg_tree,hf_audio_tx_stream_id,tvb,offset,1,FALSE);
2169          offset+=1;msg_len-=1;
2170          proto_tree_add_item(msg_tree,hf_rx_vocoder_type,tvb,offset,1,FALSE);
2171          offset+=1;msg_len-=1;
2172          proto_tree_add_item(msg_tree,hf_tx_vocoder_type,tvb,offset,1,FALSE);
2173          offset+=1;msg_len-=1;
2174          proto_tree_add_item(msg_tree,hf_frames_per_packet,tvb,offset,1,FALSE);
2175          offset+=1;msg_len-=1;
2176          proto_tree_add_item(msg_tree,hf_audio_tos,tvb,offset,1,FALSE);
2177          proto_tree_add_item(msg_tree,hf_audio_precedence,tvb,offset,1,FALSE);
2178          proto_tree_add_item(msg_tree,hf_audio_frf_11,tvb,offset,1,FALSE);
2179          offset+=1;msg_len-=1;
2180          proto_tree_add_item(msg_tree,hf_rtcp_bucket_id,
2181                              tvb,offset,1,FALSE);
2182          offset+=1;msg_len-=1;
2183          proto_tree_add_item(msg_tree,hf_generic_data,
2184                              tvb,offset,4,FALSE);
2185          offset+=4;msg_len-=4;
2186          proto_tree_add_item(msg_tree,hf_audio_lcl_rtp_port,
2187                              tvb,offset,2,FALSE);
2188          offset+=2;msg_len-=2;
2189          proto_tree_add_item(msg_tree,hf_audio_lcl_rtcp_port,
2190                              tvb,offset,2,FALSE);
2191          offset+=2;msg_len-=2;
2192
2193          proto_tree_add_item(msg_tree,hf_audio_far_rtp_port,
2194                              tvb,offset,2,FALSE);
2195          offset+=2;msg_len-=2;
2196          proto_tree_add_item(msg_tree,hf_audio_far_rtcp_port,
2197                              tvb,offset,2,FALSE);
2198          offset+=2;msg_len-=2;
2199
2200          /* Sometimes the open stream does not specify an endpoint */
2201          /* In this circumstance the packet is truncated at the far end */
2202          /* rtp port */
2203          if(msg_len > 0){
2204             proto_tree_add_item(msg_tree,hf_audio_far_ip_add,tvb,offset,4,FALSE);
2205             offset+=4;msg_len-=4;
2206             {
2207                guint32 far_ip_addr;
2208                address far_addr;
2209                guint16 far_port;
2210
2211                far_ip_addr = tvb_get_ipv4(tvb, offset-4);
2212                SET_ADDRESS(&far_addr, AT_IPv4, 4, &far_ip_addr);
2213
2214                far_port = tvb_get_ntohs(tvb, offset-8);
2215                rtp_add_address(pinfo, &far_addr, far_port, 0, "UNISTIM", pinfo->fd->num, NULL);
2216
2217                far_port = tvb_get_ntohs(tvb, offset-6);
2218                rtcp_add_address(pinfo, &far_addr, far_port, 0, "UNISTIM", pinfo->fd->num);
2219             }
2220          }
2221          break;
2222       case 0x31:
2223    /*Close Audio Stream*/
2224          /* Set the tap info */
2225          uinfo->stream_connect = 0;
2226
2227          proto_tree_add_item(msg_tree,hf_audio_rx_stream_id,tvb,offset,1,FALSE);
2228          offset+=1;msg_len-=1;
2229          proto_tree_add_item(msg_tree,hf_audio_tx_stream_id,tvb,offset,1,FALSE);
2230          offset+=1;msg_len-=1;
2231          break;
2232       case 0x32:
2233    /*Connect Transducer*/
2234          /* Tap info again */
2235          uinfo->trans_connect = 1;
2236
2237          proto_tree_add_item(msg_tree,hf_basic_bit_field, tvb,offset,1,FALSE); 
2238          proto_tree_add_item(msg_tree,hf_audio_transducer_pair,tvb,offset,1,FALSE);
2239          proto_tree_add_item(msg_tree,hf_audio_rx_enable,tvb,offset,1,FALSE);
2240          proto_tree_add_item(msg_tree,hf_audio_tx_enable,tvb,offset,1,FALSE);
2241          offset+=1;msg_len-=1;
2242          proto_tree_add_item(msg_tree,hf_basic_bit_field, tvb,offset,1,FALSE); 
2243          proto_tree_add_item(msg_tree,hf_audio_apb_number,tvb,offset,1,FALSE);
2244          proto_tree_add_item(msg_tree,hf_audio_sidetone_disable,tvb,offset,1,FALSE);
2245          proto_tree_add_item(msg_tree,hf_audio_destruct_additive,tvb,offset,1,FALSE);
2246          proto_tree_add_item(msg_tree,hf_audio_dont_force_active,tvb,offset,1,FALSE);
2247          offset+=1;msg_len-=1;
2248          while(msg_len>0){ 
2249             proto_tree_add_item(msg_tree,hf_audio_mgr_stream_id,tvb,offset,1,TRUE);
2250             offset+=1;msg_len-=1;
2251          }
2252          break;
2253       case 0x34:
2254    /*Filter Block Download*/
2255          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
2256          offset+=msg_len;
2257          break;
2258       case 0x37:
2259    /*Query RTCP Statistics*/
2260          proto_tree_add_item(msg_tree,hf_audio_rtcp_bucket_id,tvb,offset,1,FALSE);
2261          proto_tree_add_item(msg_tree,hf_audio_clear_bucket,tvb,offset,1,FALSE);
2262
2263          offset+=1;msg_len-=1;
2264          break;
2265       case 0x38:
2266    /*Configure Vocoder Parameters*/
2267          proto_tree_add_item(msg_tree,hf_audio_mgr_stream_id,tvb,offset,1,TRUE);
2268          offset+=1;msg_len-=1;
2269          proto_tree_add_item(msg_tree,hf_audio_vocoder_id,tvb,offset,1,FALSE),
2270          offset+=1;msg_len-=1;
2271          while(msg_len>0){
2272             param=proto_tree_add_text(msg_tree,tvb,offset,0,"Param");
2273             param_tree=proto_item_add_subtree(param,ett_unistim);
2274             vocoder_param=tvb_get_guint8(tvb,offset);
2275             proto_tree_add_item(param_tree,hf_basic_bit_field,
2276                                 tvb,offset,1,FALSE);
2277             proto_tree_add_item(param_tree,hf_audio_vocoder_param,
2278                                 tvb,offset,1,FALSE);
2279             proto_tree_add_item(param_tree,hf_audio_vocoder_entity,
2280                                 tvb,offset,1,FALSE);
2281             offset+=1;msg_len-=1;
2282             if((vocoder_param&0x0a)==0x0a){
2283                proto_tree_add_item(param_tree,hf_audio_vocoder_annexa,
2284                                    tvb,offset,1,FALSE);
2285                proto_tree_add_item(param_tree,hf_audio_vocoder_annexb,
2286                                    tvb,offset,1,FALSE);
2287                offset+=1;msg_len-=1;
2288             }
2289             else if((vocoder_param&0x0b)==0x0b){
2290                proto_tree_add_item(param_tree,hf_audio_sample_rate,
2291                                    tvb,offset,1,FALSE);
2292                offset+=1;msg_len-=1;
2293             }
2294             else if((vocoder_param&0x0c)==0x0c){
2295                proto_tree_add_item(param_tree,hf_audio_rtp_type,
2296                                    tvb,offset,1,FALSE);
2297                offset+=1;msg_len-=1;
2298             }
2299             else if((vocoder_param&0x20)==0x20){
2300                proto_tree_add_item(param_tree,hf_audio_bytes_per_frame,
2301                                    tvb,offset,2,FALSE);
2302                offset+=2;msg_len-=2;
2303             }
2304          }
2305          break;
2306       case 0x39:
2307    /*Query RTCP Bucket's SDES Information*/
2308          proto_tree_add_item(msg_tree,hf_audio_source_descr,tvb,offset,msg_len,FALSE);
2309          proto_tree_add_item(msg_tree,hf_audio_sdes_rtcp_bucket,tvb,offset,msg_len,FALSE);
2310          offset+=1;msg_len-=1;
2311          break;
2312       case 0x3a:
2313    /*Jitter Buffer Parameters Configuration*/
2314          proto_tree_add_item(msg_tree,hf_audio_rx_stream_id,tvb,offset,1,FALSE);
2315          offset+=1;msg_len-=1;
2316          proto_tree_add_item(msg_tree,hf_audio_desired_jitter,tvb,offset,1,FALSE);
2317          offset+=1;msg_len-=1;
2318          proto_tree_add_item(msg_tree,hf_audio_high_water_mark,tvb,offset,1,FALSE);
2319          offset+=1;msg_len-=1;
2320          proto_tree_add_item(msg_tree,hf_audio_early_packet_resync_thresh,tvb,
2321                              offset,4,FALSE);
2322          offset+=4;msg_len-=4;
2323          proto_tree_add_item(msg_tree,hf_audio_late_packet_resync_thresh,tvb,
2324                              offset,4,FALSE);
2325          offset+=4;msg_len-=4;
2326          break;
2327       case 0x3b:
2328    /*Resolve Port Mapping*/
2329          proto_tree_add_item(msg_tree,hf_audio_resolve_phone_port,tvb,offset,1,FALSE);
2330          offset+=2;msg_len-=2;
2331          proto_tree_add_item(msg_tree,hf_audio_far_end_echo_port,tvb,offset,1,FALSE);
2332          offset+=2;msg_len-=2;
2333          proto_tree_add_item(msg_tree,hf_audio_far_end_ip_address,tvb,offset,1,FALSE);
2334          offset+=4;msg_len-=4;
2335          break;
2336       case 0x3c:
2337    /*Port Mpping Discovery Ack*/
2338          proto_tree_add_item(msg_tree,hf_audio_nat_port,tvb,offset,1,FALSE);
2339          offset+=2;msg_len-=2;
2340          proto_tree_add_item(msg_tree,hf_audio_nat_ip_address,tvb,offset,1,FALSE);
2341          offset+=4;msg_len-=4;
2342          break;
2343       case 0x3d:
2344    /*Query Audio Stream Status*/
2345          proto_tree_add_item(msg_tree,hf_audio_direction_code,tvb,offset,1,FALSE);
2346          offset+=1;msg_len-=1;
2347          proto_tree_add_item(msg_tree,hf_audio_mgr_stream_id,tvb,offset,1,FALSE);
2348          offset+=1;msg_len-=1;
2349          break;
2350       case 0xff:
2351    /*Reserved*/
2352       default:
2353          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
2354          offset+=msg_len;
2355    }
2356
2357    return offset;
2358 }
2359
2360 /*DONE*/
2361 static gint
2362 dissect_audio_phone(proto_tree *msg_tree,
2363                                  tvbuff_t *tvb,gint offset,guint msg_len){
2364    guint audio_cmd;
2365    guint apb_op_code;
2366    guint apb_data_len;
2367    guint stream_dir;
2368    guint stream_state;
2369    audio_cmd=tvb_get_guint8(tvb,offset);
2370    proto_tree_add_item(msg_tree,hf_audio_phone_cmd,tvb,offset,1,FALSE);
2371    offset+=1;msg_len-=1;
2372    switch(audio_cmd){
2373       case 0x00:
2374    /*Handset Connected length =3*/
2375          /* Set the tap info */
2376          uinfo->hook_state = 1;
2377          break;
2378       case 0x01:
2379    /*Handset Disconnected length =3*/
2380          /* Set the tap info */
2381          uinfo->hook_state = 0;
2382          break;
2383       case 0x02:
2384    /*Headset Connected length =3*/
2385          /* Set the tap info */
2386          uinfo->hook_state = 1;
2387          break;
2388       case 0x03:
2389    /*Headset Disconnected length =3*/
2390          /* Set the tap info */
2391          uinfo->hook_state = 0;
2392          break;
2393       case 0x04:
2394    /*Supervisor Headset Connected length =3*/
2395          /* Set the tap info */
2396          uinfo->hook_state = 1;
2397          break;
2398       case 0x05:
2399    /*Supervisor Headset Disconnected length =3*/
2400          /* Set the tap info */
2401          uinfo->hook_state = 0;
2402          break;
2403       case 0x07:
2404    /*Audio Manager Attributes Info*/
2405        proto_tree_add_item(msg_tree,hf_audio_hf_support,tvb,1,msg_len,FALSE);
2406          offset+=1;msg_len-=1;
2407          while(msg_len>0){
2408           proto_tree_add_item(msg_tree,hf_rx_vocoder_type,tvb,offset,1,FALSE);
2409           offset+=1;msg_len-=1;
2410          }
2411          break;
2412       case 0x08:
2413    /*Audio Manager Options Report*/
2414          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
2415          proto_tree_add_item(msg_tree,hf_audio_opt_rpt_max,tvb,offset,1,FALSE);
2416          proto_tree_add_item(msg_tree,hf_audio_opt_rpt_adj_vol,tvb,offset,1,FALSE);
2417          proto_tree_add_item(msg_tree,hf_audio_opt_rpt_auto_adj_vol,tvb,offset,1,FALSE);
2418          proto_tree_add_item(msg_tree,hf_audio_opt_rpt_hs_on_air,tvb,offset,1,FALSE);
2419          proto_tree_add_item(msg_tree,hf_audio_opt_rpt_hd_on_air,tvb,offset,1,FALSE);
2420          proto_tree_add_item(msg_tree,hf_audio_opt_rpt_noise_squelch,tvb,offset,1,FALSE);
2421          offset+=1;msg_len-=1;
2422          break;
2423       case 0x09:
2424    /*Adjustable Rx Volume Report*/
2425          proto_tree_add_item(msg_tree,hf_basic_bit_field,tvb,offset,1,FALSE);
2426          proto_tree_add_item(msg_tree,hf_audio_rx_vol_apb_rpt,tvb,offset,1,FALSE);
2427          proto_tree_add_item(msg_tree,hf_audio_rx_vol_vol_up,tvb,offset,1,FALSE);
2428          proto_tree_add_item(msg_tree,hf_audio_rx_vol_vol_floor,tvb,offset,1,FALSE);
2429          proto_tree_add_item(msg_tree,hf_audio_rx_vol_vol_ceiling,tvb,offset,1,FALSE);
2430          offset+=1;msg_len-=1;
2431          break;
2432       case 0x0a:
2433    /*Adjustable Rx Volume Information*/
2434          proto_tree_add_item(msg_tree,hf_audio_current_adj_vol_id,tvb,offset,1,FALSE);
2435          proto_tree_add_item(msg_tree,hf_audio_rx_vol_apb_rpt,tvb,offset,1,FALSE);
2436          proto_tree_add_item(msg_tree,hf_audio_rx_vol_vol_up,tvb,offset,1,FALSE);
2437          proto_tree_add_item(msg_tree,hf_audio_rx_vol_vol_floor,tvb,offset,1,FALSE);
2438          proto_tree_add_item(msg_tree,hf_audio_rx_vol_vol_ceiling,tvb,offset,1,FALSE);
2439          offset+=1;msg_len-=1;
2440          proto_tree_add_item(msg_tree,hf_audio_current_rx_level,tvb,offset,1,FALSE);
2441          offset+=1;msg_len-=1;
2442          proto_tree_add_item(msg_tree,hf_audio_current_rx_range,tvb,offset,1,FALSE);
2443          offset+=1;msg_len-=1;
2444          break;
2445       case 0x0b:
2446    /*APB's Default Rx Volume Value*/
2447          proto_tree_add_item(msg_tree,hf_audio_current_adj_vol_id,tvb,offset,1,FALSE);
2448          proto_tree_add_item(msg_tree,hf_audio_rx_vol_apb_rpt,tvb,offset,1,FALSE);
2449          proto_tree_add_item(msg_tree,hf_audio_rx_vol_vol_up,tvb,offset,1,FALSE);
2450          proto_tree_add_item(msg_tree,hf_audio_rx_vol_vol_floor,tvb,offset,1,FALSE);
2451          proto_tree_add_item(msg_tree,hf_audio_rx_vol_vol_ceiling,tvb,offset,1,FALSE);
2452          offset+=1;msg_len-=1;
2453          proto_tree_add_item(msg_tree,hf_audio_current_rx_level,tvb,offset,1,FALSE);
2454          offset+=1;msg_len-=1;
2455          proto_tree_add_item(msg_tree,hf_audio_current_rx_range,tvb,offset,1,FALSE);
2456          offset+=1;msg_len-=1;
2457          break;
2458       case 0x0c:
2459    /*Alerting Tone Select*/
2460          proto_tree_add_item(msg_tree,hf_audio_cadence_select,tvb,offset,1,FALSE);
2461          proto_tree_add_item(msg_tree,hf_audio_warbler_select,tvb,offset,1,FALSE);
2462          offset+=1;msg_len-=1;
2463          break;
2464       case 0x0e:
2465    /*RTCP Statistics Report UGLY*/
2466          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
2467          offset+=msg_len;
2468          break;
2469       case 0x0f:
2470    /*Open Audio Stream Report*/
2471          proto_tree_add_item(msg_tree,hf_audio_open_stream_rpt,tvb,offset,1,FALSE);
2472          offset+=1;msg_len-=1;
2473          break;
2474       case 0x10:
2475    /*RTCP Bucket SDES Information Report*/
2476          proto_tree_add_item(msg_tree,hf_audio_sdes_rpt_source_desc,tvb,offset,1,FALSE);
2477          proto_tree_add_item(msg_tree,hf_audio_sdes_rpt_buk_id,tvb,offset,1,FALSE);
2478          offset+=1;msg_len-=1;
2479          set_ascii_item(msg_tree,tvb,offset,msg_len);
2480          offset+=msg_len;
2481          break;
2482       case 0x11:
2483    /*Port Mapping Discovery*/
2484          proto_tree_add_item(msg_tree,hf_audio_phone_port,tvb,offset,2,FALSE);
2485          offset+=2;msg_len-=2;
2486          proto_tree_add_item(msg_tree,hf_audio_phone_ip,tvb,offset,4,FALSE);
2487          offset+=4;msg_len-=4;
2488          break;
2489       case 0x12:
2490    /*Resolve Port Mapping*/
2491          proto_tree_add_item(msg_tree,hf_audio_nat_listen_port,tvb,offset,2,FALSE);
2492          offset+=2;msg_len-=2;
2493          proto_tree_add_item(msg_tree,hf_audio_nat_ip,tvb,offset,4,FALSE);
2494          offset+=4;msg_len-=4;
2495          proto_tree_add_item(msg_tree,hf_audio_nat_add_len,tvb,offset,1,FALSE);
2496          offset+=1;msg_len-=1;
2497          proto_tree_add_item(msg_tree,hf_audio_phone_port,tvb,offset,2,FALSE);
2498          offset+=2;msg_len-=2;
2499          proto_tree_add_item(msg_tree,hf_audio_phone_ip,tvb,offset,4,FALSE);
2500          offset+=4;msg_len-=4;
2501          proto_tree_add_item(msg_tree,hf_audio_phone_add_len,tvb,offset,1,FALSE);
2502          offset+=1;msg_len-=1;
2503          break;
2504       case 0x13:
2505    /*Audio Stream Status Report*/
2506          stream_dir=tvb_get_guint8(tvb,offset);
2507          proto_tree_add_item(msg_tree,hf_audio_stream_direction_code,tvb,offset,1,FALSE);
2508          offset+=1;msg_len-=1;
2509          proto_tree_add_item(msg_tree,hf_audio_mgr_stream_id,tvb,offset,1,FALSE);
2510          offset+=1;msg_len-=1;
2511          stream_state=tvb_get_guint8(tvb,offset);
2512          proto_tree_add_item(msg_tree,hf_audio_stream_state,tvb,offset,1,FALSE);
2513          offset+=1;msg_len-=1;
2514          if((AUDIO_STREAM_STATE&stream_state)!=AUDIO_STREAM_STATE)
2515            break;
2516          if((AUDIO_STREAM_DIRECTION_RX&stream_dir)==AUDIO_STREAM_DIRECTION_RX)
2517             proto_tree_add_item(msg_tree,hf_rx_vocoder_type,tvb,offset,1,FALSE);
2518          else if((AUDIO_STREAM_DIRECTION_TX&stream_dir)==AUDIO_STREAM_DIRECTION_TX)
2519             proto_tree_add_item(msg_tree,hf_tx_vocoder_type,tvb,offset,1,FALSE);
2520          else
2521             proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,1,FALSE);
2522          offset+=1;msg_len-=1;
2523          proto_tree_add_item(msg_tree,hf_frames_per_packet,tvb,offset,1,FALSE);
2524          offset+=1;msg_len-=1;
2525          proto_tree_add_item(msg_tree,hf_audio_tos,tvb,offset,1,FALSE);
2526          proto_tree_add_item(msg_tree,hf_audio_precedence,tvb,offset,1,FALSE);
2527          proto_tree_add_item(msg_tree,hf_audio_frf_11,tvb,offset,1,FALSE);
2528          offset+=1;msg_len-=1;
2529          proto_tree_add_item(msg_tree,hf_rtcp_bucket_id,tvb,offset,1,FALSE);
2530          offset+=1;msg_len-=1;
2531          proto_tree_add_item(msg_tree,hf_audio_lcl_rtp_port,tvb,offset,2,FALSE);
2532          offset+=2;msg_len-=2;
2533          proto_tree_add_item(msg_tree,hf_audio_lcl_rtcp_port,tvb,offset,2,FALSE);
2534          offset+=2;msg_len-=2;
2535          proto_tree_add_item(msg_tree,hf_audio_far_rtp_port,tvb,offset,2,FALSE);
2536          offset+=2;msg_len-=2;
2537          proto_tree_add_item(msg_tree,hf_audio_far_rtcp_port,tvb,offset,2,FALSE);
2538          offset+=2;msg_len-=2;
2539          proto_tree_add_item(msg_tree,hf_audio_far_ip_add,tvb,offset,4,FALSE);
2540          offset+=4;msg_len-=4;
2541          proto_tree_add_item(msg_tree,hf_audio_transducer_list_length,tvb,offset,1,FALSE);
2542          offset+=1;msg_len-=1;
2543          while(msg_len>0){
2544             proto_tree_add_item(msg_tree,hf_audio_transducer_pair,tvb,offset,1,FALSE);
2545             offset+=1;msg_len-=1;
2546          }
2547       case 0x14:
2548    /*Query APB Response*/
2549          proto_tree_add_item(msg_tree,hf_audio_apb_number,tvb,offset,1,FALSE);
2550          offset+=1;msg_len-=1;
2551          while(msg_len>0){
2552            apb_op_code=tvb_get_guint8(tvb,offset);
2553            proto_tree_add_item(msg_tree,hf_audio_apb_op_code,tvb,
2554                             offset,1,FALSE);
2555            offset+=1;msg_len-=1;
2556            if(apb_op_code>0x39){
2557               /*should have a len + data*/
2558               apb_data_len=tvb_get_guint8(tvb,offset);
2559               proto_tree_add_item(msg_tree,hf_audio_apb_param_len,tvb,
2560                              offset,1,FALSE);
2561               offset+=1;msg_len-=1;
2562               proto_tree_add_item(msg_tree,hf_audio_apb_data,tvb,
2563                              offset,apb_data_len,FALSE);
2564               offset+=apb_data_len;msg_len-=apb_data_len;
2565            }
2566          }
2567          break;
2568       case 0xff:
2569    /*Reserved*/
2570          break;
2571       default:
2572          proto_tree_add_item(msg_tree,hf_generic_data,tvb,offset,msg_len,FALSE);
2573          offset+=msg_len;
2574    }
2575
2576    return offset;
2577 }
2578
2579 static void
2580 set_ascii_item(proto_tree *msg_tree,tvbuff_t *tvb, gint offset,guint msg_len){
2581    char *buffer=NULL;
2582    guint16 buffer_index=0;
2583    guint16 msg_index=0;
2584    guint8 character;
2585    char *label="DATA: ";
2586    #define MAX_BUFFER 1024
2587    buffer=ep_alloc(MAX_BUFFER);
2588
2589    g_snprintf(buffer,MAX_BUFFER,"%s",label);
2590    buffer_index=strlen(label);
2591
2592    while((buffer_index<MAX_BUFFER-2)&&(msg_index<msg_len)){
2593       character=tvb_get_guint8(tvb,offset+msg_index);
2594       msg_index++;
2595       if((character>0x1f)&&(character<0x7f)){
2596          /*g_vsnprintf called in proto_tree_add_text blows up if you end up with %s as text so escape %*/
2597          if(character=='%'){
2598             buffer[buffer_index]='%';
2599             buffer_index++;
2600          }
2601          buffer[buffer_index]=character;
2602          buffer_index++;
2603       }
2604       else{
2605          buffer[buffer_index]='.';
2606          buffer_index++;
2607       }
2608    }
2609    buffer[buffer_index]='\0';
2610
2611    proto_tree_add_text(msg_tree,tvb,offset,msg_len,"%s",buffer);
2612 }
2613
2614 static void
2615 set_ascii_null_term_item(proto_tree *msg_tree,tvbuff_t *tvb, gint offset,guint msg_len,char *label){
2616    char *buffer=NULL;
2617    guint16 buffer_index=0;
2618    guint16 msg_index=0;
2619    guint8 character;
2620    #define MAX_BUFFER 1024
2621    buffer=ep_alloc(MAX_BUFFER);
2622
2623    g_snprintf(buffer,MAX_BUFFER,"%s",label);
2624    buffer_index=strlen(label);
2625
2626    while((buffer_index<MAX_BUFFER-2)&&(msg_index<msg_len)){
2627       character=tvb_get_guint8(tvb,offset+msg_index);
2628       msg_index++;
2629       if((character>0x1f)&&(character<0x7f)){
2630          /*g_vsnprintf called in proto_tree_add_text blows up if you end up with %s as text so escape %*/
2631          if(character=='%'){
2632             buffer[buffer_index]='%';
2633             buffer_index++;
2634          }
2635          buffer[buffer_index]=character;
2636          buffer_index++;
2637       }
2638       else if(character==0x00)
2639          break;
2640       else{
2641          buffer[buffer_index]='.';
2642          buffer_index++;
2643       }
2644    }
2645    buffer[buffer_index]='\0';
2646
2647    proto_tree_add_text(msg_tree,tvb,offset,msg_len,"%s",buffer);
2648 }
2649