Don't capitalize "Filter" in "Display Filter" in the "Find" dialog box,
[obnox/wireshark/wip.git] / packet-skinny.c
1 /* packet-skinny.c
2  *
3  * Dissector for the Skinny Client Control Protocol
4  *   (The "D-Channel"-Protocol for Cisco Systems' IP-Phones)
5  * Copyright 2001, Joerg Mayer (email: see AUTHORS file)
6  *
7  * Paul E. Erkkila (pee@erkkila.org) - fleshed out the decode
8  * skeleton to report values for most message/message fields.
9  * Much help from Guy Harris on figuring out the ethereal api.
10  *
11  * This file is based on packet-aim.c, which is
12  * Copyright 2000, Ralf Hoelzer <ralf@well.com>
13  *
14  * $Id: packet-skinny.c,v 1.24 2004/02/20 23:09:51 jmayer Exp $
15  *
16  * Ethereal - Network traffic analyzer
17  * By Gerald Combs <gerald@ethereal.com>
18  * Copyright 1998 Gerald Combs
19  *
20  * This program is free software; you can redistribute it and/or
21  * modify it under the terms of the GNU General Public License
22  * as published by the Free Software Foundation; either version 2
23  * of the License, or (at your option) any later version.
24  *
25  * This program is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
28  * GNU General Public License for more details.
29  *
30  * You should have received a copy of the GNU General Public License
31  * along with this program; if not, write to the Free Software
32  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
33  */
34
35 /* This implementation is based on a draft version of the 3.0
36  * specification
37  */
38
39 #ifdef HAVE_CONFIG_H
40 # include "config.h"
41 #endif
42
43 #include <string.h>
44
45 #include <epan/packet.h>
46 #include "prefs.h"
47
48 #include "packet-tcp.h"
49
50 #define TCP_PORT_SKINNY 2000
51
52 #define SKINNY_SOFTKEY0  0x01
53 #define SKINNY_SOFTKEY1  0x02
54 #define SKINNY_SOFTKEY2  0x04
55 #define SKINNY_SOFTKEY3  0x08
56 #define SKINNY_SOFTKEY4  0x10
57 #define SKINNY_SOFTKEY5  0x20
58 #define SKINNY_SOFTKEY6  0x40
59 #define SKINNY_SOFTKEY7  0x80
60 #define SKINNY_SOFTKEY8  0x100
61 #define SKINNY_SOFTKEY9  0x200
62 #define SKINNY_SOFTKEY10 0x400
63 #define SKINNY_SOFTKEY11 0x800
64 #define SKINNY_SOFTKEY12 0x1000
65 #define SKINNY_SOFTKEY13 0x2000
66 #define SKINNY_SOFTKEY14 0x4000
67 #define SKINNY_SOFTKEY15 0x8000
68
69 /* KeyMap Show/No Show */
70 static const true_false_string softKeyMapValues = {
71   "Show",
72   "Do Not Show"
73 };
74
75
76 /* I will probably need this again when I change things
77  * to function pointers, but let me use the existing
78  * infrastructure for now
79  *
80  * typedef struct {
81  *   guint32    id;
82  *   char *     name;
83  * } message_id_t;
84  */
85
86 static const value_string  message_id[] = {
87
88   /* Station -> Callmanager */
89   {0x0000, "KeepAliveMessage"},
90   {0x0001, "RegisterMessage"},
91   {0x0002, "IpPortMessage"},
92   {0x0003, "KeypadButtonMessage"},
93   {0x0004, "EnblocCallMessage"},
94   {0x0005, "StimulusMessage"},
95   {0x0006, "OffHookMessage"},
96   {0x0007, "OnHookMessage"},
97   {0x0008, "HookFlashMessage"},
98   {0x0009, "ForwardStatReqMessage"},
99   {0x000A, "SpeedDialStatReqMessage"},
100   {0x000B, "LineStatReqMessage"},
101   {0x000C, "ConfigStatReqMessage"},
102   {0x000D, "TimeDateReqMessage"},
103   {0x000E, "ButtonTemplateReqMessage"},
104   {0x000F, "VersionReqMessage"},
105   {0x0010, "CapabilitiesResMessage"},
106   {0x0011, "MediaPortListMessage"},
107   {0x0012, "ServerReqMessage"},
108   {0x0020, "AlarmMessage"},
109   {0x0021, "MulticastMediaReceptionAck"},
110   {0x0022, "OpenReceiveChannelAck"},
111   {0x0023, "ConnectionStatisticsRes"},
112   {0x0024, "OffHookWithCgpnMessage"},
113   {0x0025, "SoftKeySetReqMessage"},
114   {0x0026, "SoftKeyEventMessage"},
115   {0x0027, "UnregisterMessage"},
116   {0x0028, "SoftKeyTemplateReqMessage"},
117   {0x0029, "RegisterTokenReq"},
118   {0x002A, "MediaTransmissionFailure"},
119   {0x002B, "HeadsetStatusMessage"},
120   {0x002C, "MediaResourceNotification"},
121   {0x002D, "RegisterAvailableLinesMessage"},
122   {0x002E, "DeviceToUserDataMessage"},
123   {0x002F, "DeviceToUserDataResponseMessage"},
124   {0x0030, "UpdateCapabilitiesMessage"},
125   {0x0031, "OpenMultiMediaReceiveChannelAckMessage"},
126   {0x0032, "ClearConferenceMessage"},
127   {0x0033, "ServiceURLStatReqMessage"},
128   {0x0034, "FeatureStatReqMessage"},
129   {0x0035, "CreateConferenceResMessage"},
130   {0x0036, "DeleteConferenceResMessage"},
131   {0x0037, "ModifyConferenceResMessage"},
132   {0x0038, "AddParticipantResMessage"},
133   {0x0039, "AuditConferenceResMessage"},
134   {0x0040, "AuditParticipantResMessage"},
135   {0x0041, "DeviceToUserDataVersion1Message"},
136   {0x0042, "DeviceToUserDataResponseVersion1Message"},
137
138   /* Callmanager -> Station */
139   /* 0x0000, 0x0003? */
140   {0x0081, "RegisterAckMessage"},
141   {0x0082, "StartToneMessage"},
142   {0x0083, "StopToneMessage"},
143   {0x0085, "SetRingerMessage"},
144   {0x0086, "SetLampMessage"},
145   {0x0087, "SetHkFDetectMessage"},
146   {0x0088, "SetSpeakerModeMessage"},
147   {0x0089, "SetMicroModeMessage"},
148   {0x008A, "StartMediaTransmission"},
149   {0x008B, "StopMediaTransmission"},
150   {0x008C, "StartMediaReception"},
151   {0x008D, "StopMediaReception"},
152   {0x008F, "CallInfoMessage"},
153   {0x0090, "ForwardStatMessage"},
154   {0x0091, "SpeedDialStatMessage"},
155   {0x0092, "LineStatMessage"},
156   {0x0093, "ConfigStatMessage"},
157   {0x0094, "DefineTimeDate"},
158   {0x0095, "StartSessionTransmission"},
159   {0x0096, "StopSessionTransmission"},
160   {0x0097, "ButtonTemplateMessage"},
161   {0x0098, "VersionMessage"},
162   {0x0099, "DisplayTextMessage"},
163   {0x009A, "ClearDisplay"},
164   {0x009B, "CapabilitiesReqMessage"},
165   {0x009C, "EnunciatorCommandMessage"},
166   {0x009D, "RegisterRejectMessage"},
167   {0x009E, "ServerResMessage"},
168   {0x009F, "Reset"},
169   {0x0100, "KeepAliveAckMessage"},
170   {0x0101, "StartMulticastMediaReception"},
171   {0x0102, "StartMulticastMediaTransmission"},
172   {0x0103, "StopMulticastMediaReception"},
173   {0x0104, "StopMulticastMediaTransmission"},
174   {0x0105, "OpenReceiveChannel"},
175   {0x0106, "CloseReceiveChannel"},
176   {0x0107, "ConnectionStatisticsReq"},
177   {0x0108, "SoftKeyTemplateResMessage"},
178   {0x0109, "SoftKeySetResMessage"},
179   {0x0110, "SelectSoftKeysMessage"},
180   {0x0111, "CallStateMessage"},
181   {0x0112, "DisplayPromptStatusMessage"},
182   {0x0113, "ClearPromptStatusMessage"},
183   {0x0114, "DisplayNotifyMessage"},
184   {0x0115, "ClearNotifyMessage"},
185   {0x0116, "ActivateCallPlaneMessage"},
186   {0x0117, "DeactivateCallPlaneMessage"},
187   {0x0118, "UnregisterAckMessage"},
188   {0x0119, "BackSpaceReqMessage"},
189   {0x011A, "RegisterTokenAck"},
190   {0x011B, "RegisterTokenReject"},
191
192   {0x011C, "StartMediaFailureDetection"},
193   {0x011D, "DialedNumberMessage"},
194   {0x011E, "UserToDeviceDataMessage"},
195   {0x011F, "FeatureStatMessage"},
196   {0x0120, "DisplayPriNotifyMessage"},
197   {0x0121, "ClearPriNotifyMessage"},
198   {0x0122, "StartAnnouncementMessage"},
199   {0x0123, "StopAnnouncementMessage"},
200   {0x0124, "AnnouncementFinishMessage"},
201   {0x0127, "NotifyDtmfToneMessage"},
202   {0x0128, "SendDtmfToneMessage"},
203   {0x0129, "SubscribeDtmfPayloadReqMessage"},
204   {0x012A, "SubscribeDtmfPayloadResMessage"},
205   {0x012B, "SubscribeDtmfPayloadErrMessage"},
206   {0x012C, "UnSubscribeDtmfPayloadReqMessage"},
207   {0x012D, "UnSubscribeDtmfPayloadResMessage"},
208   {0x012E, "UnSubscribeDtmfPayloadErrMessage"},
209   {0x012F, "ServiceURLStatMessage"},
210   {0x0130, "CallSelectStatMessage"},
211   {0x0131, "OpenMultiMediaChannelMessage"},
212   {0x0132, "StartMultiMediaTransmission"},
213   {0x0133, "StopMultiMediaTransmission"},
214   {0x0134, "MiscellaneousCommandMessage"},
215   {0x0135, "FlowControlCommandMessage"},
216   {0x0136, "CloseMultiMediaReceiveChannel"},
217   {0x0137, "CreateConferenceReqMessage"},
218   {0x0138, "DeleteConferenceReqMessage"},
219   {0x0139, "ModifyConferenceReqMessage"},
220   {0x013A, "AddParticipantReqMessage"},
221   {0x013B, "DropParticipantReqMessage"},
222   {0x013C, "AuditConferenceReqMessage"},
223   {0x013D, "AuditParticipantReqMessage"},
224   {0x013F, "UserToDeviceDataVersion1Message"},
225
226   {0     , NULL}        /* terminator */
227 };
228
229 /*
230  * Device type to text conversion table
231  */
232 static const value_string  deviceTypes[] = {
233   {1  , "30SPplus"},
234   {2  , "12SPplus"},
235   {3  , "12SP"},
236   {4  , "12"},
237   {5  , "30VIP"},
238   {6  , "Telecaster"},
239   {7  , "TelecasterMgr"},
240   {8  , "TelecasterBus"},
241         {9  , "Polycom"},
242         {10 , "VGC"},
243         {12 , "ATA"},
244   {20 , "Virtual30SPplus"},
245   {21 , "PhoneApplication"},
246   {30 , "AnalogAccess"},
247   {40 , "DigitalAccessPRI"},
248   {41 , "DigitalAccessT1"},
249   {42 , "DigitalAccessTitan2"},
250   {43 , "DigitalAccessLennon"},
251   {47 , "AnalogAccessElvis"},
252   {50 , "ConferenceBridge"},
253   {51 , "ConferenceBridgeYoko"},
254   {52 , "ConferenceBridgeDixieLand"},
255   {53 , "ConferenceBridgeSummit"},
256   {60 , "H225"},
257   {61 , "H323Phone"},
258   {62 , "H323Trunk"},
259   {70 , "MusicOnHold"},
260   {71 , "Pilot"},
261   {72 , "TapiPort"},
262   {73 , "TapiRoutePoint"},
263   {80 , "VoiceInBox"},
264   {81 , "VoiceInboxAdmin"},
265   {82 , "LineAnnunciator"},
266   {83 , "SoftwareMtpDixieLand"},
267   {84 , "CiscoMediaServer"},
268         {85 , "ConferenceBridgeFlint"},
269   {90 , "RouteList"},
270   {100, "LoadSimulator"},
271   {110, "MediaTerminationPoint"},
272   {111, "MediaTerminationPointYoko"},
273   {112, "MediaTerminationPointDixieLand"},
274   {113, "MediaTerminationPointSummit"},
275   {120, "MGCPStation"},
276   {121, "MGCPTrunk"},
277   {122, "RASProxy"},
278         {125, "Trunk"},
279         {126, "Annunciator"},
280   {127, "MonitorBridge"},
281   {128, "Recorder"},
282   {129, "MonitorBridgeYoko"},
283   {131, "SipTrunk"},
284         {254, "UnknownMGCPGateway"},
285   {255, "NotDefined"},
286   { 0    , NULL}
287 };
288
289 /*
290  * keypad button -> text conversion
291  */
292 static const value_string keypadButtons[] = {
293   {0x0   , "Zero"},
294   {0x1   , "One"},
295   {0x2   , "Two"},
296   {0x3   , "Three"},
297   {0x4   , "Four"},
298   {0x5   , "Five"},
299   {0x6   , "Six"},
300   {0x7   , "Seven"},
301   {0x8   , "Eight"},
302   {0x9   , "Nine"},
303   {0xa   , "A"},
304   {0xb   , "B"},
305   {0xc   , "C"},
306   {0xd   , "D"},
307   {0xe   , "Star"},
308   {0xf   , "Pound"},
309   {0     , NULL}
310 };
311
312 static const value_string deviceStimuli[] = {
313   {1    , "LastNumberRedial"},
314   {2    , "SpeedDial"},
315   {3    , "Hold"},
316   {4    , "Transfer"},
317   {5    , "ForwardAll"},
318   {6    , "ForwardBusy"},
319   {7    , "ForwardNoAnswer"},
320   {8    , "Display"},
321   {9    , "Line"},
322   {0xa  , "T120Chat"},
323   {0xb  , "T120Whiteboard"},
324   {0xc  , "T120ApplicationSharing"},
325   {0xd  , "T120FileTransfer"},
326   {0xe  , "Video"},
327   {0xf  , "VoiceMail"},
328   {0x10 , "AutoAnswerRelease"},
329   {0x11 , "AutoAnswer"},
330         {0x12 , "Select"},
331         {0x13 , "Privacy"},
332         {0x14 , "ServiceURL"},
333         {0x1B , "MaliciousCall"},
334   {0x21 , "GenericAppB1"},
335   {0x22 , "GenericAppB2"},
336   {0x23 , "GenericAppB3"},
337   {0x24 , "GenericAppB4"},
338   {0x25 , "GenericAppB5"},
339   {0x7b , "MeetMeConference"},
340   {0x7d , "Conference=0x7d"},
341   {0x7e , "CallPark=0x7e"},
342   {0x7f , "CallPickup"},
343   {0x80 , "GroupCallPickup=80"},
344   {0,NULL}
345 };
346
347
348 /* Note i'm only using 7 later on cuz i'm lazy ;) */
349 #define DeviceMaxCapabilities 18 /* max capabilities allowed in Cap response message */
350
351 static const value_string mediaPayloads[] = {
352   {1   , "Non-standard codec"},
353   {2   , "G.711 A-law 64k"},
354   {3   , "G.711 A-law 56k"},
355   {4   , "G.711 u-law 64k"},
356   {5   , "G.711 u-law 56k"},
357   {6   , "G.722 64k"},
358   {7   , "G.722 56k"},
359   {8   , "G.722 48k"},
360   {9   , "G.723.1"},
361   {10  , "G.728"},
362   {11  , "G.729"},
363   {12  , "G.729 Annex A"},
364   {13  , "IS11172 AudioCap"},   /* IS11172 is an ISO MPEG standard */
365   {14  , "IS13818 AudioCap"},   /* IS13818 is an ISO MPEG standard */
366   {15  , "G.729 Annex B"},
367   {16  , "G.729 Annex A+Annex B"},
368   {18  , "GSM Full Rate"},
369   {19  , "GSM Half Rate"},
370   {20  , "GSM Enhanced Full Rate"},
371   {25  , "Wideband 256k"},
372   {32  , "Data 64k"},
373   {33  , "Data 56k"},
374   {80  , "GSM"},
375   {81  , "ActiveVoice"},
376   {82  , "G.726 32K"},
377   {83  , "G.726 24K"},
378   {84  , "G.726 16K"},
379   {85  , "G.729B"},
380   {86  , "G.729B Low Complexity"},
381         {100 , "H261"},
382         {101 , "H263"},
383         {102 , "Vieo"},
384         {105 , "T120"},
385         {106 , "H224"},
386         {257 , "RFC2833_DynPayload"},
387   {0  , NULL}
388 };
389
390 static const value_string alarmSeverities[] = {
391   {0   , "Critical"},
392   {1   , "Warning"},
393   {2   , "Informational"},
394   {4   , "Unknown"},
395   {7   , "Major"},
396   {8   , "Minor"},
397   {10  , "Marginal"},
398   {20  , "TraceInfo"},
399   {0  , NULL}
400 };
401
402 static const value_string multicastMediaReceptionStatus[] = {
403   {0  , "Ok"},
404   {1  , "Error"},
405   {0  , NULL}
406 };
407
408 static const value_string openReceiveChanStatus[] = {
409   {0   , "orcOk"},
410   {1   , "orcError"},
411   {0   , NULL}
412 };
413
414
415 static const value_string statsProcessingTypes[] = {
416   {0   , "clearStats"},
417   {1   , "doNotClearStats"},
418   {0   , NULL}
419 };
420
421 #define SkMaxSoftKeyCount 18 /* this value should be the same as the max soft key value */
422 static const value_string softKeyEvents[] = {
423   {1   , "Redial"},
424   {2   , "NewCall"},
425   {3   , "Hold"},
426   {4   , "Trnsfer"},
427   {5   , "CFwdAll"},
428   {6   , "CFwdBusy"},
429   {7   , "CFwdNoAnswer"},
430   {8   , "BackSpace"},
431   {9   , "EndCall"},
432   {10  , "Resume"},
433   {11  , "Answer"},
434   {12  , "Info"},
435   {13  , "Confrn"},
436   {14  , "Park"},
437   {15  , "Join"},
438   {16  , "MeetMeConfrn"},
439   {17  , "CallPickUp"},
440   {18  , "GrpCallPickUp"},
441   {0   , NULL}
442 };
443
444 /* Define info index for each softkey event for Telecaster station. */
445 static const value_string softKeyIndexes[] = {
446   {301  , "RedialInfoIndex"},
447   {302  , "NewCallInfoIndex"},
448   {303  , "HoldInfoIndex"},
449   {304  , "TrnsferInfoIndex"},
450   {305  , "CFwdAllInfoIndex"},
451   {306  , "CFwdBusyInfoIndex"},     /* not used yet */
452   {307  , "CFwdNoAnswerInfoIndex"}, /* not used yet */
453   {308  , "BackSpaceInfoIndex"},
454   {309  , "EndCallInfoIndex"},
455   {310  , "ResumeInfoIndex"},
456   {311  , "AnswerInfoIndex"},
457   {312  , "InfoInfoIndex"},
458   {313  , "ConfrnInfoIndex"},
459   {314  , "ParkInfoIndex"},
460   {315  , "JoinInfoIndex"},
461   {316  , "MeetMeConfrnInfoIndex"},
462   {317  , "CallPickUpInfoIndex"},
463   {318  , "GrpCallPickUpInfoIndex"},
464   {0   , NULL}
465 };
466
467
468 static const value_string buttonDefinitions[] = {
469   {1    , "LastNumberRedial"},
470   {2    , "SpeedDial"},
471   {3    , "Hold"},
472   {4    , "Transfer"},
473   {5    , "ForwardAll"},
474   {6    , "ForwardBusy"},
475   {7    , "ForwardNoAnswer"},
476   {8    , "Display"},
477   {9    , "Line"},
478   {0xa  , "T120Chat"},
479   {0xb  , "T120Whiteboard"},
480   {0xc  , "T120ApplicationSharing"},
481   {0xd  , "T120FileTransfer"},
482   {0xe  , "Video"},
483   {0x10 , "AnswerRelease"},
484   {0xf0 , "Keypad"},
485   {0xfd , "AEC"},
486   {0xff , "Undefined"},
487   {0   , NULL}
488 };
489
490 #define StationTotalSoftKeySets 10 /* total number of the soft key sets */
491 static const value_string keySetNames[] = {
492   {0   , "OnHook"},
493   {1   , "Connected"},
494   {2   , "OnHold"},
495   {3   , "RingIn"},
496   {4   , "OffHook"},
497   {5   , "Connected with transfer"},
498   {6   , "Digits after dialing first digit"},
499   {7   , "Connected with conference"},
500   {8   , "RingOut"},
501   {9   , "OffHook with features"},
502   {0   , NULL}
503 };
504
505 /* Define soft key labels for the Telecaster station */
506 static const value_string softKeyLabel[] = {
507   {0   , "undefined"},
508   {1   , "Redial"},
509   {2   , "NewCall"},
510   {3   , "Hold"},
511   {4   , "Trnsfer"},
512   {5   , "CFwdAll"},
513   {6   , "CFwdBusy"},
514   {7   , "CFwdNoAnswer"},
515   {8   , "<<"},
516   {9   , "EndCall"},
517   {10  , "Resume"},
518   {11  , "Answer"},
519   {12  , "Info"},
520   {13  , "Confrn"},
521   {14  , "Park"},
522   {15  , "Join"},
523   {16  , "MeetMe"},
524   {17  , "PickUp"},
525   {18  , "GPickUp"},
526   {0   , NULL}
527 };
528
529
530 /*
531  * define lamp modes;
532  * lamp cadence is defined as follows
533  * Wink (on 80%) = 448msec on / 64msec off
534  * Flash (fast flash) = 32msec on / 32msec off
535  * Blink (on 50%) = 512msec on / 512msec off
536  * On (on steady)
537  */
538 static const value_string stationLampModes[] = {
539   {0   , "Undefined"},
540   {0x1 , "Off"},
541   {0x2 , "On"},
542   {0x3 , "Wink"},
543   {0x4 , "Flash"},
544   {0x5 , "Blink"},
545   {0   , NULL}
546 };
547
548 /* Defined the Call States to be sent to the Telecaste station.
549  * These are NOT the call states used in CM internally. Instead,
550  * they are the call states sent from CM and understood by the Telecaster station
551  */
552 static const value_string skinny_stationCallStates[] = {
553   {1   , "OffHook"},
554   {2   , "OnHook"},
555   {3   , "RingOut"},
556   {4   , "RingIn"},
557   {5   , "Connected"},
558   {6   , "Busy"},
559   {7   , "Congestion"},
560   {8   , "Hold"},
561   {9   , "CallWaiting"},
562   {10  , "CallTransfer"},
563   {11  , "CallPark"},
564   {12  , "Proceed"},
565   {13  , "CallRemoteMultiline"},
566   {14  , "InvalidNumber"},
567   {0   , NULL}
568 };
569
570 /* Defined Call Type */
571 static const value_string skinny_callTypes[] = {
572   {1   , "InBoundCall"},
573   {2   , "OutBoundCall"},
574   {3   , "ForwardCall"},
575   {0   , NULL}
576 };
577
578 /*
579  * define station-playable tones;
580  * for tone definitions see SR-TSV-002275, "BOC Notes on the LEC Networks -- 1994"
581  */
582 static const value_string skinny_deviceTones[] = {
583   {0    , "Silence"},
584   {1    , "Dtmf1"},
585   {2    , "Dtmf2"},
586   {3    , "Dtmf3"},
587   {4    , "Dtmf4"},
588   {5    , "Dtmf5"},
589   {6    , "Dtmf6"},
590   {7    , "Dtmf7"},
591   {8    , "Dtmf8"},
592   {9    , "Dtmf9"},
593   {0xa  , "Dtmf0"},
594   {0xe  , "DtmfStar"},
595   {0xf  , "DtmfPound"},
596   {0x10 , "DtmfA"},
597   {0x11 , "DtmfB"},
598   {0x12 , "DtmfC"},
599   {0x13 , "DtmfD"},
600   {0x21 , "InsideDialTone"},
601   {0x22 , "OutsideDialTone"},
602   {0x23 , "LineBusyTone"},
603   {0x24 , "AlertingTone"},
604   {0x25 , "ReorderTone"},
605   {0x26 , "RecorderWarningTone"},
606   {0x27 , "RecorderDetectedTone"},
607   {0x28 , "RevertingTone"},
608   {0x29 , "ReceiverOffHookTone"},
609   {0x2a , "PartialDialTone"},
610   {0x2b , "NoSuchNumberTone"},
611   {0x2c , "BusyVerificationTone"},
612   {0x2d , "CallWaitingTone"},
613   {0x2e , "ConfirmationTone"},
614   {0x2f , "CampOnIndicationTone"},
615   {0x30 , "RecallDialTone"},
616   {0x31 , "ZipZip"},
617   {0x32 , "Zip"},
618   {0x33 , "BeepBonk"},
619   {0x34 , "MusicTone"},
620   {0x35 , "HoldTone"},
621   {0x36 , "TestTone"},
622         {0x37 , "DtMoniterWarningTone"},
623   {0x40 , "AddCallWaiting"},
624   {0x41 , "PriorityCallWait"},
625   {0x42 , "RecallDial"},
626   {0x43 , "BargIn"},
627   {0x44 , "DistinctAlert"},
628   {0x45 , "PriorityAlert"},
629   {0x46 , "ReminderRing"},
630   {0x47 , "PrecedenceRingBack"},
631   {0x48 , "PreemptionTone"},
632   {0x50 , "MF1"},
633   {0x51 , "MF2"},
634   {0x52 , "MF3"},
635   {0x53 , "MF4"},
636   {0x54 , "MF5"},
637   {0x55 , "MF6"},
638   {0x56 , "MF7"},
639   {0x57 , "MF8"},
640   {0x58 , "MF9"},
641   {0x59 , "MF0"},
642   {0x5a , "MFKP1"},
643   {0x5b , "MFST"},
644   {0x5c , "MFKP2"},
645   {0x5d , "MFSTP"},
646   {0x5e , "MFST3P"},
647   {0x5f , "MILLIWATT"},
648   {0x60 , "MILLIWATTTEST"},
649   {0x61 , "HIGHTONE"},
650   {0x62 , "FLASHOVERRIDE"},
651   {0x63 , "FLASH"},
652   {0x64 , "PRIORITY"},
653   {0x65 , "IMMEDIATE"},
654   {0x66 , "PREAMPWARN"},
655   {0x67 , "2105HZ"},
656   {0x68 , "2600HZ"},
657   {0x69 , "440HZ"},
658   {0x6a , "300HZ"},
659   {0x77 , "MLPP_PALA"},
660   {0x78 , "MLPP_ICA"},
661   {0x79 , "MLPP_VCA"},
662   {0x7A , "MLPP_BPA"},
663   {0x7B , "MLPP_BNEA"},
664   {0x7C , "MLPP_UPA"},
665   {0x7f , "NoTone"},
666   {0   , NULL}
667 };
668
669 /* define ring types */
670 static const value_string skinny_ringTypes[] = {
671   {0x1  , "RingOff"},
672   {0x2  , "InsideRing"},
673   {0x3  , "OutsideRing"},
674   {0x4  , "FeatureRing"},
675   {0x5  , "FlashOnly"},
676   {0x6  , "PrecedenceRing"},
677   {0   , NULL}
678 };
679
680 static const value_string skinny_speakerModes[] = {
681   {1   , "SpeakerOn"},
682   {2   , "SpeakerOff"},
683   {0   , NULL}
684 };
685
686 static const value_string skinny_silenceSuppressionModes[] = {
687   {0   , "Media_SilenceSuppression_Off"},
688   {1   , "Media_SilenceSuppression_On"},
689   {0   , NULL}
690 };
691
692 static const value_string skinny_g723BitRates[] = {
693   {1   , "Media_G723BRate_5_3"},
694   {2   , "Media_G723BRate_6_4"},
695   {0   , NULL}
696 };
697
698 /* define device reset types  */
699 static const value_string skinny_deviceResetTypes[] = {
700   {1   , "DEVICE_RESET"},
701   {2   , "DEVICE_RESTART"},
702   {0   , NULL}
703 };
704
705 static const value_string skinny_echoCancelTypes[] = {
706   {0    , "Media_EchoCancellation_Off"},
707   {1    , "Media_EchoCancellation_On"},
708   {0    , NULL}
709 };
710
711 static const value_string skinny_deviceUnregisterStatusTypes[] = {
712   {0   , "Ok"},
713   {1   , "Error"},
714   {2   , "NAK"}, /* Unregister request is rejected for reaso n such as existence of a call */
715   {0   , NULL}
716 };
717
718 static const value_string skinny_createConfResults[] = {
719   {0   , "Ok"},
720   {1   , "ResourceNotAvailable"},
721   {2   , "ConferenceAlreadyExist"},
722   {3   , "SystemErr"},
723   {0   , NULL}
724 };
725
726 static const value_string skinny_modifyConfResults[] = {
727   {0   , "Ok"},
728   {1   , "ResourceNotAvailable"},
729   {2   , "ConferenceNotExist"},
730   {3   , "InvalidParameter"},
731   {4   , "MoreActiveCallsThanReserved"},
732   {5   , "InvalidResourceType"},
733   {6   , "SystemErr"},
734   {0   , NULL}
735 };
736
737 static const value_string skinny_deleteConfResults[] = {
738   {0   , "Ok"},
739   {1   , "ConferenceNotExist"},
740   {2   , "SystemErr"},
741   {0   , NULL}
742 };
743
744 static const value_string skinny_addParticipantResults[] = {
745   {0   , "Ok"},
746   {1   , "ResourceNotAvailable"},
747   {2   , "ConferenceNotExist"},
748   {3   , "DuplicateCallRef"},
749   {4   , "SystemErr"},
750   {0   , NULL}
751 };
752
753 static const value_string skinny_auditParticipantResults[] = {
754   {0   , "Ok"},
755   {1   , "ConferenceNotExist"},
756   {0   , NULL}
757 };
758
759 /* define hook flash detection mode */
760 static const value_string skinny_hookFlashDetectModes[] = {
761   {1   , "HookFlashOn"},
762   {2   , "HookFlashOff"},
763   {0   , NULL}
764 };
765
766 /* define headset mode */
767 static const value_string skinny_headsetModes[] = {
768   {1   , "HeadsetOn"},
769   {2   , "HeadsetOff"},
770   {0   , NULL}
771 };
772
773 /* define station microphone modes;
774  * Mic On - The speakerphone's microphone is turned on ONLY if the phone is in the "Speaker On (Off Hook)"
775  * state (see above).
776  * Mic Off - The microphone is turned off or, if it's not on, the command is ignored.
777  */
778 static const value_string skinny_microphoneModes[] = {
779   {1   , "MicOn"},
780   {2   , "MicOff"},
781   {0   , NULL}
782 };
783
784 /* define the session request types */
785 static const value_string skinny_sessionTypes[] = {
786   {1   , "Chat"},
787   {2   , "Whiteboard"},
788   {4   , "ApplicationSharing"},
789   {8   , "FileTransfer"},
790   {10  , "Video"},
791   {0   , NULL}
792 };
793
794 static const value_string skinny_mediaEnunciationTypes[] = {
795   {1  , "None"},
796   {2  , "CallPark"},
797   {0  , NULL}
798 };
799
800 static const value_string skinny_resourceTypes[] = {
801   {1  , "Conference"},
802   {2  , "IVR"},
803   {0  , NULL}
804 };
805
806 static const value_string skinny_sequenceFlags[] = {
807   {0  , "StationSequenceFirst"},
808   {1  , "StationSequenceMore"},
809   {2  , "StationSequenceLast"},
810   {0  , NULL}
811 };
812
813 static const value_string skinny_Layouts[] = {
814   {0  , "NoLayout"},
815   {1  , "OneByOne"},
816   {2  , "OneByTwo"},
817   {3  , "TwoByTwo"},
818   {4  , "TwoByTwo3Alt1"},
819   {5  , "TwoByTwo3Alt2"},
820   {6  , "ThreeByThree"},
821   {7  , "ThreeByThree6Alt1"},
822   {8  , "ThreeByThree6Alt2"},
823   {9  , "ThreeByThree4Alt1"},
824   {10 , "ThreeByThree4Alt2"},
825   {0  , NULL}
826 };
827
828 static const value_string skinny_transmitOrReceive[] = {
829   {1  , "Station_Receive_only"},
830   {2  , "Station_Transmit_only"},
831   {3  , "Station_Receive_Transmit"},
832   {0  , NULL}
833 };
834
835 static const value_string skinny_endOfAnnAck[] = {
836   {0  , "NoAnnAckRequired"},
837   {1  , "AnnAckRequired"},
838   {0  , NULL}
839 };
840
841 static const value_string skinny_annPlayMode[] = {
842   {0  , "AnnXmlConfigMode"},
843   {1  , "AnnOneShotMode"},
844   {2  , "AnnContinuousMode"},
845   {0  , NULL}
846 };
847
848 static const value_string skinny_annPlayStatus[] = {
849   {0  , "PlayToneOK"},
850   {1  , "PlayToneErr"},
851   {0  , NULL}
852 };
853
854 static const value_string skinny_miscCommandType[] = {
855   {0  , "videoFreezePicture"},
856   {1  , "videoFastUpdatePicture"},
857   {2  , "videoFastUpdateGOB"},
858   {3  , "videoFastUpdateMB"},
859   {4  , "lostPicture"},
860   {5  , "lostPartialPicture"},
861   {6  , "recoveryReferencePicture"},
862   {7  , "temporalSpatialTradeOff"},
863   {0  , NULL}
864 };
865
866 static const value_string skinny_formatTypes[] = {
867   {1  , "sqcif (128x96)"},
868   {2  , "qcif (176x144)"},
869   {3  , "cif (352x288)"},
870   {4  , "4cif (704x576)"},
871   {5  , "16cif (1408x1152)"},
872   {6  , "custom_base"},
873   {0  , NULL}
874 };
875
876 static const value_string cast_callSecurityStatusTypes[] = {
877   {0   , "CallSecurityStatusUnknown"},
878   {1   , "CallSecurityStatusNotAuthenticated"},
879   {2   , "CallSecurityStatusAuthenticated"},
880   {0   , NULL}
881 };
882
883 #define StationMaxDirnumSize 24         /* max size of calling or called party dirnum  */
884 #define StationMaxNameSize 40           /* max size of calling party's name  */
885 #define StationMaxDeviceNameSize 16     /* max size of station's IP name  */
886 #define StationMaxSpeedDials 10         /* max number of speed dial numbers allowed on a station */
887 #define StationMaxVersionSize 16        /* max chars in version string  */
888 #define StationMaxButtonTemplateSize 42 /* max button template size */
889 #define StationMaxDisplayTextSize 33    /* max text size in DisplayText message */
890 #define StationMaxPorts 10              /* max number of ports on one device */
891 #define StationDateTemplateSize 6       /* date template in the form M/D/Y, D/M/Y, ... */
892 #define StationMaxServerNameSize 48     /* max size of server name */
893 #define StationMaxServers 5             /* max servers */
894 #define StationMaxDeviceDirnums 1024    /* max dir numbers per SCM device */
895 #define StationMaxDirnums 64            /* max dir numbers per physical station (also used in db request msg); */
896 #define StationMaxSoftKeyLabelSize 16   /* max label size in the message */
897 #define StationMaxSoftKeyDefinition 32       /* max number of soft key definition in the message */
898 #define StationMaxSoftKeySetDefinition 16    /* max number of soft key set definition in the message */
899 #define StationMaxSoftKeyIndex 16            /* max number of soft key indices in a station soft key set */
900 #define StationMaxDisplayPromptStatusSize 32 /* max status text size in the display status message */
901 #define StationMaxDisplayNotifySize 32       /* max prompt text size in the display prompt message */
902 #define StationMaxAlarmMessageSize 80        /* max size for an alarm message */
903 #define StationMaxUserDeviceDataSize    2000    /* max size of user data between application and device */
904 #define StationMaxConference    32
905 #define AppConferenceIDSize             32
906 #define AppDataSize                             24
907 #define MAX_CUSTOM_PICTURES                             6
908 #define MAX_LAYOUT_WITH_SAME_SERVICE    5
909 #define MAX_SERVICE_TYPE                                4
910 #define DeviceMaxCapabilities       18  /* max capabilities allowed in Cap response message */
911 #define StationMaxCapabilities       DeviceMaxCapabilities
912 #define StationMaxVideoCapabilities     10
913 #define StationMaxDataCapabilities   5
914 #define MAX_LEVEL_PREFERENCE             4
915 #define MaxAnnouncementList     32
916 #define StationMaxMonitorParties        16          /* Max Monitor Bridge whisper matrix parties,  rm, M&R in Parche */
917 #define StationMaxServiceURLSize     256        /* max number of service URLs length */
918 #define MAX_PICTURE_FORMAT                       5
919 #define MAX_REFERENCE_PICTURE            4
920
921 static void dissect_skinny(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
922
923 /* Initialize the protocol and registered fields */
924 static int proto_skinny          = -1;
925 static int hf_skinny_data_length = -1;
926 static int hf_skinny_reserved    = -1;
927 static int hf_skinny_messageid   = -1;
928 static int hf_skinny_deviceName  = -1;
929 static int hf_skinny_stationUserId = -1;
930 static int hf_skinny_stationInstance = -1;
931 static int hf_skinny_deviceType = -1;
932 static int hf_skinny_maxStreams = -1;
933 static int hf_skinny_stationIpPort = -1;
934 static int hf_skinny_stationKeypadButton = -1;
935 static int hf_skinny_calledParty = -1;
936 static int hf_skinny_stimulus = -1;
937 static int hf_skinny_stimulusInstance = -1;
938 static int hf_skinny_lineNumber = -1;
939 static int hf_skinny_speedDialNumber = -1;
940 static int hf_skinny_capCount = -1;
941 static int hf_skinny_payloadCapability = -1;
942 static int hf_skinny_maxFramesPerPacket = -1;
943 static int hf_skinny_alarmSeverity = -1;
944 static int hf_skinny_alarmParam1 = -1;
945 static int hf_skinny_alarmParam2 = -1;
946 static int hf_skinny_receptionStatus = -1;
947 static int hf_skinny_passThruPartyID = -1;
948 static int hf_skinny_ORCStatus = -1;
949 static int hf_skinny_ipAddress = -1;
950 static int hf_skinny_portNumber = -1;
951 static int hf_skinny_statsProcessingType = -1;
952 static int hf_skinny_callIdentifier = -1;
953 static int hf_skinny_packetsSent = -1;
954 static int hf_skinny_octetsSent  = -1;
955 static int hf_skinny_packetsRecv = -1;
956 static int hf_skinny_octetsRecv  = -1;
957 static int hf_skinny_packetsLost = -1;
958 static int hf_skinny_latency     = -1;
959 static int hf_skinny_jitter      = -1;
960 static int hf_skinny_directoryNumber = -1;
961 static int hf_skinny_softKeyEvent = -1;
962 static int hf_skinny_lineInstance = -1;
963 static int hf_skinny_keepAliveInterval = -1;
964 static int hf_skinny_dateTemplate = -1;
965 static int hf_skinny_secondaryKeepAliveInterval = -1;
966 static int hf_skinny_buttonOffset = -1;
967 static int hf_skinny_buttonCount = -1;
968 static int hf_skinny_totalButtonCount = -1;
969 static int hf_skinny_buttonInstanceNumber = -1;
970 static int hf_skinny_buttonDefinition = -1;
971 static int hf_skinny_softKeyOffset = -1;
972 static int hf_skinny_softKeyCount = -1;
973 static int hf_skinny_totalSoftKeyCount = -1;
974 static int hf_skinny_softKeyLabel = -1;
975 static int hf_skinny_softKeySetOffset = -1;
976 static int hf_skinny_softKeySetCount = -1;
977 static int hf_skinny_totalSoftKeySetCount = -1;
978 static int hf_skinny_softKeyTemplateIndex = -1;
979 static int hf_skinny_softKeyInfoIndex = -1;
980 static int hf_skinny_softKeySetDescription = -1;
981 static int hf_skinny_softKeyMap = -1;
982 static int hf_skinny_softKey0 = -1;
983 static int hf_skinny_softKey1 = -1;
984 static int hf_skinny_softKey2 = -1;
985 static int hf_skinny_softKey3 = -1;
986 static int hf_skinny_softKey4 = -1;
987 static int hf_skinny_softKey5 = -1;
988 static int hf_skinny_softKey6 = -1;
989 static int hf_skinny_softKey7 = -1;
990 static int hf_skinny_softKey8 = -1;
991 static int hf_skinny_softKey9 = -1;
992 static int hf_skinny_softKey10 = -1;
993 static int hf_skinny_softKey11 = -1;
994 static int hf_skinny_softKey12 = -1;
995 static int hf_skinny_softKey13 = -1;
996 static int hf_skinny_softKey14 = -1;
997 static int hf_skinny_softKey15 = -1;
998 static int hf_skinny_lampMode = -1;
999 static int hf_skinny_messageTimeOutValue = -1;
1000 static int hf_skinny_displayMessage = -1;
1001 static int hf_skinny_lineDirNumber = -1;
1002 static int hf_skinny_lineFullyQualifiedDisplayName = -1;
1003 static int hf_skinny_speedDialDirNumber = -1;
1004 static int hf_skinny_speedDialDisplayName = -1;
1005 static int hf_skinny_dateYear = -1;
1006 static int hf_skinny_dateMonth = -1;
1007 static int hf_skinny_dayOfWeek = -1;
1008 static int hf_skinny_dateDay = -1;
1009 static int hf_skinny_dateHour = -1;
1010 static int hf_skinny_dateMinute = -1;
1011 static int hf_skinny_dateSeconds = -1;
1012 static int hf_skinny_dateMilliseconds = -1;
1013 static int hf_skinny_timeStamp = -1;
1014 static int hf_skinny_callState = -1;
1015 static int hf_skinny_deviceTone = -1;
1016 static int hf_skinny_callingPartyName = -1;
1017 static int hf_skinny_callingParty = -1;
1018 static int hf_skinny_calledPartyName = -1;
1019 static int hf_skinny_callType = -1;
1020 static int hf_skinny_originalCalledPartyName = -1;
1021 static int hf_skinny_originalCalledParty = -1;
1022 static int hf_skinny_ringType = -1;
1023 static int hf_skinny_speakerMode = -1;
1024 static int hf_skinny_remoteIpAddr = -1;
1025 static int hf_skinny_remotePortNumber = -1;
1026 static int hf_skinny_millisecondPacketSize = -1;
1027 static int hf_skinny_precedenceValue = -1;
1028 static int hf_skinny_silenceSuppression = -1;
1029 static int hf_skinny_g723BitRate = -1;
1030 static int hf_skinny_conferenceID = -1;
1031 static int hf_skinny_deviceResetType = -1;
1032 static int hf_skinny_echoCancelType = -1;
1033 static int hf_skinny_deviceUnregisterStatus = -1;
1034 static int hf_skinny_hookFlashDetectMode = -1;
1035 static int hf_skinny_detectInterval = -1;
1036 static int hf_skinny_microphoneMode = -1;
1037 static int hf_skinny_headsetMode = -1;
1038 static int hf_skinny_unknown = -1;
1039 static int hf_skinny_data = -1;
1040 static int hf_skinny_activeForward = -1;
1041 static int hf_skinny_forwardAllActive = -1;
1042 static int hf_skinny_forwardBusyActive = -1;
1043 static int hf_skinny_forwardNoAnswerActive = -1;
1044 static int hf_skinny_forwardNumber = -1;
1045 static int hf_skinny_serverName = -1;
1046 static int hf_skinny_numberLines = -1;
1047 static int hf_skinny_numberSpeedDials = -1;
1048 static int hf_skinny_userName = -1;
1049 static int hf_skinny_sessionType = -1;
1050 static int hf_skinny_version = -1;
1051 static int hf_skinny_mediaEnunciationType = -1;
1052 static int hf_skinny_serverIdentifier = -1;
1053 static int hf_skinny_serverListenPort = -1;
1054 static int hf_skinny_serverIpAddress = -1;
1055 static int hf_skinny_multicastIpAddress = -1;
1056 static int hf_skinny_multicastPort = -1;
1057 static int hf_skinny_tokenRejWaitTime = -1;
1058 static int hf_skinny_numberOfInServiceStreams = -1;
1059 static int hf_skinny_maxStreamsPerConf = -1;
1060 static int hf_skinny_numberOfOutOfServiceStreams = -1;
1061 static int hf_skinny_applicationID = -1;
1062 static int hf_skinny_serviceNum = -1;
1063 static int hf_skinny_serviceURLIndex = -1;
1064 static int hf_skinny_featureIndex = -1;
1065 static int hf_skinny_createConfResults = -1;
1066 static int hf_skinny_modifyConfResults = -1;
1067 static int hf_skinny_deleteConfResults = -1;
1068 static int hf_skinny_addParticipantResults = -1;
1069 static int hf_skinny_passThruData = -1;
1070 static int hf_skinny_last = -1;
1071 static int hf_skinny_numberOfEntries = -1;
1072 static int hf_skinny_auditParticipantResults = -1;
1073 static int hf_skinny_participantEntry = -1;
1074 static int hf_skinny_resourceTypes = -1;
1075 static int hf_skinny_numberOfReservedParticipants = -1;
1076 static int hf_skinny_numberOfActiveParticipants = -1;
1077 static int hf_skinny_appID = -1;
1078 static int hf_skinny_appData = -1;
1079 static int hf_skinny_appConfID = -1;
1080 static int hf_skinny_sequenceFlag = -1;
1081 static int hf_skinny_displayPriority = -1;
1082 static int hf_skinny_appInstanceID = -1;
1083 static int hf_skinny_routingID = -1;
1084 static int hf_skinny_audioCapCount = -1;
1085 static int hf_skinny_videoCapCount = -1;
1086 static int hf_skinny_dataCapCount = -1;
1087 static int hf_skinny_RTPPayloadFormat = -1;
1088 static int hf_skinny_customPictureFormatCount = -1;
1089 static int hf_skinny_pictureWidth = -1;
1090 static int hf_skinny_pictureHeight = -1;
1091 static int hf_skinny_pixelAspectRatio = -1;
1092 static int hf_skinny_clockConversionCode = -1;
1093 static int hf_skinny_clockDivisor = -1;
1094 static int hf_skinny_activeStreamsOnRegistration = -1;
1095 static int hf_skinny_maxBW = -1;
1096 static int hf_skinny_serviceResourceCount = -1;
1097 static int hf_skinny_layoutCount = -1;
1098 static int hf_skinny_layout = -1;
1099 static int hf_skinny_maxConferences = -1;
1100 static int hf_skinny_activeConferenceOnRegistration = -1;
1101 static int hf_skinny_transmitOrReceive = -1;
1102 static int hf_skinny_levelPreferenceCount = -1;
1103 static int hf_skinny_transmitPreference = -1;
1104 static int hf_skinny_format = -1;
1105 static int hf_skinny_maxBitRate = -1;
1106 static int hf_skinny_minBitRate = -1;
1107 static int hf_skinny_MPI = -1;
1108 static int hf_skinny_serviceNumber = -1;
1109 static int hf_skinny_temporalSpatialTradeOffCapability = -1;
1110 static int hf_skinny_stillImageTransmission = -1;
1111 static int hf_skinny_h263_capability_bitfield = -1;
1112 static int hf_skinny_annexNandWFutureUse = -1;
1113 static int hf_skinny_modelNumber = -1;
1114 static int hf_skinny_bandwidth = -1;
1115 static int hf_skinny_protocolDependentData = -1;
1116 static int hf_skinny_priority = -1;
1117 static int hf_skinny_payloadDtmf = -1;
1118 static int hf_skinny_featureID = -1;
1119 static int hf_skinny_featureTextLabel = -1;
1120 static int hf_skinny_featureStatus = -1;
1121 static int hf_skinny_notify = -1;
1122 static int hf_skinny_endOfAnnAck = -1;
1123 static int hf_skinny_annPlayMode = -1;
1124 static int hf_skinny_annPlayStatus = -1;
1125 static int hf_skinny_locale = -1;
1126 static int hf_skinny_country = -1;
1127 static int hf_skinny_matrixConfPartyID = -1;
1128 static int hf_skinny_hearingConfPartyMask = -1;
1129 static int hf_skinny_serviceURL = -1;
1130 static int hf_skinny_serviceURLDisplayName = -1;
1131 static int hf_skinny_callSelectStat = -1;
1132 static int hf_skinny_isConferenceCreator = -1;
1133 static int hf_skinny_payload_rfc_number = -1;
1134 static int hf_skinny_payloadType = -1;
1135 static int hf_skinny_bitRate = -1;
1136 static int hf_skinny_pictureFormatCount = -1;
1137 static int hf_skinny_confServiceNum = -1;
1138 static int hf_skinny_DSCPValue = -1;
1139 static int hf_skinny_miscCommandType = -1;
1140 static int hf_skinny_temporalSpatialTradeOff = -1;
1141 static int hf_skinny_firstGOB = -1;
1142 static int hf_skinny_numberOfGOBs = -1;
1143 static int hf_skinny_firstMB = -1;
1144 static int hf_skinny_numberOfMBs = -1;
1145 static int hf_skinny_pictureNumber = -1;
1146 static int hf_skinny_longTermPictureIndex = -1;
1147 static int hf_skinny_recoveryReferencePictureCount = -1;
1148 static int hf_skinny_transactionID = -1;
1149 static int hf_cast_lastRedirectingPartyName = -1;
1150 static int hf_cast_lastRedirectingParty = -1;
1151 static int hf_cast_cgpnVoiceMailbox = -1;
1152 static int hf_cast_cdpnVoiceMailbox = -1;
1153 static int hf_cast_originalCdpnVoiceMailbox = -1;
1154 static int hf_cast_lastRedirectingVoiceMailbox = -1;
1155 static int hf_cast_originalCdpnRedirectReason = -1;
1156 static int hf_cast_lastRedirectingReason = -1;
1157 static int hf_cast_callInstance = -1;
1158 static int hf_cast_callSecurityStatus = -1;
1159
1160
1161 /* Initialize the subtree pointers */
1162 static gint ett_skinny          = -1;
1163 static gint ett_skinny_tree     = -1;
1164 static gint ett_skinny_softKeyMap = -1;
1165
1166 /* desegmentation of SCCP */
1167 static gboolean skinny_desegment = TRUE;
1168
1169 static dissector_handle_t data_handle;
1170
1171 /* Get the length of a single SCCP PDU */
1172 static guint get_skinny_pdu_len(tvbuff_t *tvb, int offset)
1173 {
1174   guint32 hdr_data_length;
1175
1176   /*
1177    * Get the length of the SCCP packet.
1178    */
1179   hdr_data_length = tvb_get_letohl(tvb, offset);
1180
1181   /*
1182    * That length doesn't include the length of the header itself;
1183    * add that in.
1184    */
1185   return hdr_data_length + 8;
1186 }
1187
1188 /* Dissect a single SCCP PDU */
1189 static void dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1190 {
1191   int offset = 0;
1192
1193   /* Header fields */
1194   guint32 hdr_data_length;
1195   guint32 hdr_reserved;
1196   guint32 data_messageid;
1197   gchar   *messageid_str;
1198   /*  guint32 data_size; */
1199
1200   guint i = 0;
1201   guint t = 0;
1202   int j = 0;
1203   guint count;
1204   int val;
1205
1206   guint32 capCount;
1207   guint32 softKeyCount;
1208   guint32 softKeySetCount;
1209   guint16 validKeyMask;
1210
1211   /* Set up structures we will need to add the protocol subtree and manage it */
1212   proto_item *ti;
1213   proto_tree *skinny_tree = NULL;
1214   proto_item *ti_sub;
1215   proto_tree *skinny_sub_tree;
1216   proto_tree *skinny_sub_tree_sav;
1217   proto_tree *skinny_sub_tree_sav_sav;
1218
1219   proto_item *skm = NULL;
1220   proto_item *skm_tree = NULL;
1221
1222   hdr_data_length = tvb_get_letohl(tvb, offset);
1223   hdr_reserved    = tvb_get_letohl(tvb, offset+4);
1224   data_messageid  = tvb_get_letohl(tvb, offset+8);
1225
1226   /* In the interest of speed, if "tree" is NULL, don't do any work not
1227    * necessary to generate protocol tree items. */
1228   if (tree) {
1229     ti = proto_tree_add_item(tree, proto_skinny, tvb, offset, hdr_data_length+8, FALSE);
1230     skinny_tree = proto_item_add_subtree(ti, ett_skinny);
1231     proto_tree_add_uint(skinny_tree, hf_skinny_data_length, tvb, offset, 4, hdr_data_length);
1232     proto_tree_add_uint(skinny_tree, hf_skinny_reserved, tvb, offset+4, 4, hdr_reserved);
1233   }
1234
1235   messageid_str = val_to_str(data_messageid, message_id, "0x%08X (Unknown)");
1236
1237   if (check_col(pinfo->cinfo, COL_INFO)) {
1238     col_add_str(pinfo->cinfo, COL_INFO, messageid_str);
1239   }
1240
1241   if (tree) {
1242     proto_tree_add_uint(skinny_tree, hf_skinny_messageid, tvb,offset+8, 4, data_messageid );
1243   }
1244
1245   if (tree) {
1246     switch(data_messageid) {
1247
1248     /* cases that do not need to be decoded */
1249     case 0x0 :    /* keepAlive */
1250       break;
1251
1252     case 0x6 :    /* offHook */
1253       break;
1254
1255     case 0x7 :    /* onHook    */
1256       break;
1257
1258     case 0x8 :    /* hookFlash */
1259       break;
1260
1261     case 0xc :    /* configStateReqMessage */
1262       break;
1263
1264     case 0xd :    /* timeDateReqMessage */
1265       break;
1266
1267     case 0xe :    /* buttoneTemplateReqMessage */
1268       break;
1269
1270     case 0xf :    /* stationVersionReqMessage */
1271       break;
1272
1273     case 0x12 :   /* stationServerReqMessage */
1274       break;
1275
1276     case 0x25 :   /* softKeySetReqMessage */
1277       break;
1278
1279     case 0x27 :   /* unregisterMessage */
1280       break;
1281
1282     case 0x28 :   /* softKeyTemplateRequest */
1283       break;
1284
1285     case 0x83 :   /* stopTone */
1286       break;
1287
1288     case 0x9a :   /* clearDisplay */
1289       break;
1290
1291     case 0x9b :   /* capabilitiesReqMessage */
1292       break;
1293
1294     case 0x100 :    /* keepAliveAck */
1295       break;
1296
1297     case 0x115 :  /* clearNotifyDisplay */
1298       break;
1299
1300     case 0x117 :  /* deactivateCallPlane */
1301       break;
1302
1303     case 0x11a :  /* registerTokenAck */
1304       break;
1305
1306     case 0x13C : /* AuditConferenceReqMessage */
1307       break;
1308
1309     /*
1310      ** cases that need decode
1311      **
1312      */
1313
1314     case 0x1 :   /* register message */
1315       proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, StationMaxDeviceNameSize, TRUE);
1316       proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, offset+28, 4, TRUE);
1317       proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, offset+32, 4, TRUE);
1318       proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+36, 4, TRUE);
1319       proto_tree_add_item(skinny_tree, hf_skinny_deviceType, tvb, offset+40, 4, TRUE);
1320       proto_tree_add_item(skinny_tree, hf_skinny_maxStreams, tvb, offset+44, 4, TRUE);
1321       break;
1322
1323     case 0x2 :  /* ipPortMessage */
1324       proto_tree_add_item(skinny_tree, hf_skinny_stationIpPort, tvb, offset+12, 2, FALSE);
1325       break;
1326
1327     case 0x3 :  /* keyPadButtonMessage */
1328       proto_tree_add_item(skinny_tree, hf_skinny_stationKeypadButton, tvb, offset+12, 4, TRUE);
1329       break;
1330
1331     case 0x4 :  /* stationEnblocCallMessage -- This decode NOT verified*/
1332       proto_tree_add_item(skinny_tree, hf_skinny_calledParty, tvb, offset+12, StationMaxDirnumSize, TRUE);
1333       break;
1334
1335     case 0x5 : /* stationStimulusMessage */
1336       proto_tree_add_item(skinny_tree, hf_skinny_stimulus, tvb, offset+12, 4, TRUE);
1337       proto_tree_add_item(skinny_tree, hf_skinny_stimulusInstance, tvb, offset+16, 4, TRUE);
1338       break;
1339
1340     case 0x9  : /* stationForwardStatReqMessage */
1341       proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+12, 4, TRUE);
1342       break;
1343
1344     case 0xa :  /* speedDialStatReqMessage */
1345       proto_tree_add_item(skinny_tree, hf_skinny_speedDialNumber, tvb, offset+12, 4, TRUE);
1346       break;
1347
1348     case 0xb :  /* LineStatReqMessage */
1349       proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+12, 4, TRUE);
1350       break;
1351
1352     case 0x10 :  /* capabilitiesResMessage  - VERIFIED AS IS*/
1353       /* FIXME -- we are only going to decode the first 7 protocol fields for now cuz that's all it sent me
1354        * on the phone i was working with. I should probably skip the struct decode and use a more piece
1355        * type method using the capCount definition to control the decode loop
1356        *
1357        * basically changing StationMaxCapabilities definition
1358        *
1359        */
1360       capCount = tvb_get_letohl(tvb, offset+12);
1361       proto_tree_add_uint(skinny_tree, hf_skinny_capCount, tvb, offset+12, 4, capCount);
1362       for (i = 0; i < capCount; i++) {
1363               proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+(i*16)+16, 4, TRUE);
1364               proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+(i*16)+20, 2, TRUE);
1365               /* FIXME -- decode the union under here as required, is always 0 on my equipment */
1366       }
1367       break;
1368
1369     case 0x11 : /* mediaPortList */
1370       break;
1371
1372     case 0x20 :   /* stationAlarmMessage */
1373       proto_tree_add_item(skinny_tree, hf_skinny_alarmSeverity, tvb, offset+12, 4, TRUE);
1374       proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, StationMaxAlarmMessageSize, TRUE);
1375       proto_tree_add_item(skinny_tree, hf_skinny_alarmParam1, tvb, offset+96, 4, TRUE);
1376       proto_tree_add_item(skinny_tree, hf_skinny_alarmParam2, tvb, offset+100, 4, TRUE);
1377       break;
1378
1379     case 0x21 : /* stationMulticastMediaReceptionAck - This decode NOT verified*/
1380       proto_tree_add_item(skinny_tree, hf_skinny_receptionStatus, tvb, offset+12, 4, TRUE);
1381       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
1382       break;
1383
1384     case 0x22 : /* stationOpenReceiveChannelAck */
1385       proto_tree_add_item(skinny_tree, hf_skinny_ORCStatus, tvb, offset+12, 4, TRUE);
1386       proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+16, 4, TRUE);
1387       proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+20, 4, TRUE);
1388       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+24, 4, TRUE);
1389       break;
1390
1391     case 0x23    :  /* stationConnectionStatisticsRes */
1392       proto_tree_add_item(skinny_tree, hf_skinny_directoryNumber, tvb, offset+12, StationMaxDirnumSize, TRUE);
1393       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+36, 4, TRUE);
1394       proto_tree_add_item(skinny_tree, hf_skinny_statsProcessingType, tvb, offset+40, 4, TRUE);
1395       proto_tree_add_item(skinny_tree, hf_skinny_packetsSent, tvb, offset+44, 4, TRUE);
1396       proto_tree_add_item(skinny_tree, hf_skinny_octetsSent, tvb, offset+48, 4, TRUE);
1397       proto_tree_add_item(skinny_tree, hf_skinny_packetsRecv, tvb, offset+52, 4, TRUE);
1398       proto_tree_add_item(skinny_tree, hf_skinny_octetsRecv, tvb, offset+56, 4, TRUE);
1399       proto_tree_add_item(skinny_tree, hf_skinny_packetsLost, tvb, offset+60, 4, TRUE);
1400       proto_tree_add_item(skinny_tree, hf_skinny_jitter, tvb, offset+64, 4, TRUE);
1401       proto_tree_add_item(skinny_tree, hf_skinny_latency, tvb, offset+68, 4, TRUE);
1402       break;
1403
1404     case 0x24 : /* offHookWithCgpn */
1405       proto_tree_add_item(skinny_tree, hf_skinny_calledParty, tvb, offset+12,StationMaxDirnumSize, TRUE);
1406       break;
1407
1408     case 0x26 :  /* softKeyEventMessage */
1409       proto_tree_add_item(skinny_tree, hf_skinny_softKeyEvent, tvb, offset+12, 4, TRUE);
1410       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, TRUE);
1411       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
1412       break;
1413
1414     case 0x29 : /* registerTokenREq */
1415       proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, 4, TRUE);
1416       i = offset+12+StationMaxDeviceNameSize;
1417       proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, i, 4, TRUE);
1418       proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, i+4, 4, TRUE);
1419       proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, i+8, 4, TRUE);
1420       proto_tree_add_item(skinny_tree, hf_skinny_deviceType, tvb, i+12, 4, TRUE);
1421       break;
1422
1423     case 0x2A : /* MediaTransmissionFailure */
1424       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
1425       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
1426       proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+20, 4, TRUE);
1427       proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+24, 4, TRUE);
1428       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+28, 4, TRUE);
1429       break;
1430
1431     case 0x2B : /* HeadsetStatusMessage */
1432       proto_tree_add_item(skinny_tree, hf_skinny_headsetMode, tvb, offset+12, 4, TRUE);
1433       break;
1434
1435     case 0x2C : /* MediaResourceNotification */
1436       proto_tree_add_item(skinny_tree, hf_skinny_deviceType, tvb, offset+12, 4, TRUE);
1437       proto_tree_add_item(skinny_tree, hf_skinny_numberOfInServiceStreams, tvb, offset+16, 4, TRUE);
1438       proto_tree_add_item(skinny_tree, hf_skinny_maxStreamsPerConf, tvb, offset+20, 4, TRUE);
1439       proto_tree_add_item(skinny_tree, hf_skinny_numberOfOutOfServiceStreams, tvb, offset+24, 4, TRUE);
1440       break;
1441
1442     case 0x2D : /* RegisterAvailableLinesMessage */
1443       proto_tree_add_item(skinny_tree, hf_skinny_numberLines, tvb, offset+12, 4, TRUE);
1444       break;
1445
1446     case 0x2E : /* DeviceToUserDataMessage */
1447       proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, TRUE);
1448       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, TRUE);
1449       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
1450       proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, TRUE);
1451       proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, TRUE);
1452       count = tvb_get_letohl( tvb, offset+28);
1453       proto_tree_add_uint(skinny_tree, hf_skinny_data, tvb, offset+30, 1, count);
1454       break;
1455
1456     case 0x2F : /* DeviceToUserDataResponseMessage */
1457       proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, TRUE);
1458       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, TRUE);
1459       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
1460       proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, TRUE);
1461       proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, TRUE);
1462       count = tvb_get_letohl( tvb, offset+28);
1463       proto_tree_add_uint(skinny_tree, hf_skinny_data, tvb, offset+30, 1, count);
1464       break;
1465
1466     case 0x30 : /* UpdateCapabilitiesMessage */
1467       /* to do - this message is very large and will span multiple packets, it would be nice to someday */
1468       /* find out a way to join the next packet and get the complete message to decode */
1469       proto_tree_add_item(skinny_tree, hf_skinny_audioCapCount, tvb, offset+12, 4, TRUE);
1470       proto_tree_add_item(skinny_tree, hf_skinny_videoCapCount, tvb, offset+16, 4, TRUE);
1471       proto_tree_add_item(skinny_tree, hf_skinny_dataCapCount, tvb, offset+20, 4, TRUE);
1472       proto_tree_add_item(skinny_tree, hf_skinny_RTPPayloadFormat, tvb, offset+24, 4, TRUE);
1473       proto_tree_add_item(skinny_tree, hf_skinny_customPictureFormatCount, tvb, offset+28, 4, TRUE);
1474       count = offset+32;
1475       for ( i = 0; i < MAX_CUSTOM_PICTURES; i++ ) {
1476                     ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "customPictureFormat[%d]", i);
1477                     skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1478         proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureWidth, tvb, count, 4, TRUE);
1479         count+= 4;
1480         proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureHeight, tvb, count, 4, TRUE);
1481         count+= 4;
1482         proto_tree_add_item(skinny_sub_tree, hf_skinny_pixelAspectRatio, tvb, count, 4, TRUE);
1483         count+= 4;
1484         proto_tree_add_item(skinny_sub_tree, hf_skinny_clockConversionCode, tvb, count, 4, TRUE);
1485         count+= 4;
1486         proto_tree_add_item(skinny_sub_tree, hf_skinny_clockDivisor, tvb, count, 4, TRUE);
1487         count+= 4;
1488       }
1489                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "confResources");
1490                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1491       proto_tree_add_item(skinny_sub_tree, hf_skinny_activeStreamsOnRegistration, tvb, count, 4, TRUE);
1492       count+= 4;
1493       proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBW, tvb, count, 4, TRUE);
1494       count+= 4;
1495       proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceResourceCount, tvb, count, 4, TRUE);
1496       count+= 4;
1497       skinny_sub_tree_sav = skinny_sub_tree;
1498       for ( i = 0; i < MAX_SERVICE_TYPE; i++ ) {
1499                     ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "serviceResource[%d]", i);
1500                     skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1501         proto_tree_add_item(skinny_sub_tree, hf_skinny_layoutCount, tvb, count, 4, TRUE);
1502         count+= 4;
1503         skinny_sub_tree_sav_sav = skinny_sub_tree_sav;
1504         for ( t = 0; t < MAX_LAYOUT_WITH_SAME_SERVICE; t++ ) {
1505                       ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "layouts[%d]", t);
1506                       skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1507           proto_tree_add_item(skinny_sub_tree, hf_skinny_layout, tvb, count, 4, TRUE);
1508           count+= 4;
1509         }
1510         skinny_sub_tree = skinny_sub_tree_sav_sav;
1511         proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceNum, tvb, count, 4, TRUE);
1512         count+= 4;
1513         proto_tree_add_item(skinny_sub_tree, hf_skinny_maxStreams, tvb, count, 4, TRUE);
1514         count+= 4;
1515         proto_tree_add_item(skinny_sub_tree, hf_skinny_maxConferences, tvb, count, 4, TRUE);
1516         count+= 4;
1517         proto_tree_add_item(skinny_sub_tree, hf_skinny_activeConferenceOnRegistration, tvb, count, 4, TRUE);
1518         count+= 4;
1519       }
1520       for ( i = 0; i < StationMaxCapabilities; i++ ) {
1521                     ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "audiocaps[%d]", i);
1522                     skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1523               proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, TRUE);
1524         count+= 4;
1525               proto_tree_add_item(skinny_sub_tree, hf_skinny_maxFramesPerPacket, tvb, count, 2, TRUE);
1526         count+= 4;
1527         /* skip past union it is only for G723 */
1528         count+= 8;
1529       }
1530       for ( i = 0; i < StationMaxVideoCapabilities; i++ ) {
1531                     ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "vidCaps[%d]", i);
1532                     skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1533               proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, TRUE);
1534         count+= 4;
1535               proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, TRUE);
1536         count+= 4;
1537               proto_tree_add_item(skinny_sub_tree, hf_skinny_levelPreferenceCount, tvb, count, 4, TRUE);
1538         count+= 4;
1539         skinny_sub_tree_sav = skinny_sub_tree;
1540         for ( t = 0; t < MAX_LEVEL_PREFERENCE; t++ ) {
1541                       ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "levelPreference[%d]", t);
1542                       skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1543                 proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitPreference, tvb, count, 4, TRUE);
1544           count+= 4;
1545                 proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, TRUE);
1546           count+= 4;
1547                 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, count, 4, TRUE);
1548           count+= 4;
1549                 proto_tree_add_item(skinny_sub_tree, hf_skinny_minBitRate, tvb, count, 4, TRUE);
1550           count+= 4;
1551                 proto_tree_add_item(skinny_sub_tree, hf_skinny_MPI, tvb, count, 4, TRUE);
1552           count+= 4;
1553                 proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceNumber, tvb, count, 4, TRUE);
1554           count+= 4;
1555         }
1556         val = count;
1557
1558         /* H.261 */
1559                     ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h261VideoCapability");
1560                     skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1561               proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, TRUE);
1562         count+= 4;
1563               proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, TRUE);
1564         count+= 4;
1565
1566         /* H.263 */
1567         count = val;
1568                     ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h263VideoCapability");
1569                     skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1570               proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, TRUE);
1571         count+= 4;
1572               proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, TRUE);
1573         count+= 4;
1574
1575         /* Video */
1576         count = val;
1577                     ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "vieoVideoCapability");
1578                     skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1579               proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, TRUE);
1580         count+= 4;
1581               proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, TRUE);
1582         count+= 4;
1583       }
1584       for ( i = 0; i < StationMaxDataCapabilities; i++ ) {
1585                     ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "dataCaps[%d]", i);
1586                     skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1587               proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, TRUE);
1588         count+= 4;
1589               proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, TRUE);
1590         count+= 4;
1591               proto_tree_add_item(skinny_sub_tree, hf_skinny_protocolDependentData, tvb, count, 4, TRUE);
1592         count+= 4;
1593               proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, count, 4, TRUE);
1594         count+= 4;
1595       }
1596       break;
1597
1598     case 0x31 : /* OpenMultiMediaReceiveChannelAckMessage */
1599       proto_tree_add_item(skinny_tree, hf_skinny_ORCStatus, tvb, offset+12, 4, TRUE);
1600       proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+16, 4, TRUE);
1601       proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+20, 4, TRUE);
1602       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+24, 4, TRUE);
1603       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+28, 4, TRUE);
1604       break;
1605
1606     case 0x32 : /* ClearConferenceMessage */
1607       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
1608       proto_tree_add_item(skinny_tree, hf_skinny_serviceNum, tvb, offset+16, 4, TRUE);
1609       break;
1610
1611     case 0x33 : /* ServiceURLStatReqMessage */
1612       proto_tree_add_item(skinny_tree, hf_skinny_serviceURLIndex, tvb, offset+12, 4, TRUE);
1613       break;
1614
1615     case 0x34 : /* FeatureStatReqMessage */
1616       proto_tree_add_item(skinny_tree, hf_skinny_featureIndex, tvb, offset+12, 4, TRUE);
1617       break;
1618
1619     case 0x35 : /* CreateConferenceResMessage */
1620       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
1621       proto_tree_add_item(skinny_tree, hf_skinny_createConfResults, tvb, offset+16, 4, TRUE);
1622       proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+20, 4, TRUE);
1623       count = tvb_get_letohl( tvb, offset+20);
1624       proto_tree_add_uint(skinny_tree, hf_skinny_passThruData, tvb, offset+24, 1, count);
1625       break;
1626
1627     case 0x36 : /* DeleteConferenceResMessage */
1628       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
1629       proto_tree_add_item(skinny_tree, hf_skinny_deleteConfResults, tvb, offset+16, 4, TRUE);
1630       break;
1631
1632     case 0x37 : /* ModifyConferenceResMessage */
1633       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
1634       proto_tree_add_item(skinny_tree, hf_skinny_createConfResults, tvb, offset+16, 4, TRUE);
1635       proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+20, 4, TRUE);
1636       count = tvb_get_letohl( tvb, offset+20);
1637       proto_tree_add_uint(skinny_tree, hf_skinny_passThruData, tvb, offset+24, 1, count);
1638       break;
1639
1640     case 0x38 : /* AddParticipantResMessage */
1641       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
1642       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, TRUE);
1643       proto_tree_add_item(skinny_tree, hf_skinny_addParticipantResults, tvb, offset+20, 4, TRUE);
1644       break;
1645
1646     case 0x39 : /* AuditConferenceResMessage */
1647       proto_tree_add_item(skinny_tree, hf_skinny_last, tvb, offset+12, 4, TRUE);
1648       proto_tree_add_item(skinny_tree, hf_skinny_numberOfEntries, tvb, offset+16, 4, TRUE);
1649       count = offset+20;
1650       for ( i = 0; i < StationMaxConference; i++ ) {
1651         proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, count, 4, TRUE);
1652         count += 4;
1653         proto_tree_add_item(skinny_tree, hf_skinny_resourceTypes, tvb, count, 4, TRUE);
1654         count += 4;
1655         proto_tree_add_item(skinny_tree, hf_skinny_numberOfReservedParticipants, tvb, count, 4, TRUE);
1656         count += 4;
1657         proto_tree_add_item(skinny_tree, hf_skinny_numberOfActiveParticipants, tvb, count, 4, TRUE);
1658         count += 4;
1659         proto_tree_add_item(skinny_tree, hf_skinny_appID, tvb, count, 4, TRUE);
1660         count += 4;
1661         proto_tree_add_uint(skinny_tree, hf_skinny_appConfID, tvb, count, 1, AppConferenceIDSize);
1662         count += AppConferenceIDSize;
1663         proto_tree_add_uint(skinny_tree, hf_skinny_appData, tvb, count, 1, AppDataSize);
1664         count += AppDataSize;
1665       }
1666       break;
1667
1668     case 0x40 : /* AuditParticipantResMessage */
1669       proto_tree_add_item(skinny_tree, hf_skinny_auditParticipantResults, tvb, offset+12, 4, TRUE);
1670       proto_tree_add_item(skinny_tree, hf_skinny_last, tvb, offset+16, 4, TRUE);
1671       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+20, 4, TRUE);
1672       proto_tree_add_item(skinny_tree, hf_skinny_numberOfEntries, tvb, offset+24, 4, TRUE);
1673       count = tvb_get_letohl( tvb, offset+24);
1674       for ( i = 0; i < count; i++ ) {
1675         proto_tree_add_item(skinny_tree, hf_skinny_participantEntry, tvb, offset+28+(i*4), 4, TRUE);
1676       }
1677       break;
1678
1679     case 0x41 : /* DeviceToUserDataVersion1Message */
1680       proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, TRUE);
1681       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, TRUE);
1682       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
1683       proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, TRUE);
1684       proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, TRUE);
1685       count = tvb_get_letohl( tvb, offset+28);
1686       proto_tree_add_item(skinny_tree, hf_skinny_sequenceFlag, tvb, offset+30, 4, TRUE);
1687       proto_tree_add_item(skinny_tree, hf_skinny_displayPriority, tvb, offset+34, 4, TRUE);
1688       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+38, 4, TRUE);
1689       proto_tree_add_item(skinny_tree, hf_skinny_appInstanceID, tvb, offset+42, 4, TRUE);
1690       proto_tree_add_item(skinny_tree, hf_skinny_routingID, tvb, offset+46, 4, TRUE);
1691       proto_tree_add_uint(skinny_tree, hf_skinny_data, tvb, offset+50, 1, count);
1692       break;
1693
1694     case 0x42 : /* DeviceToUserDataResponseVersion1Message */
1695       proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, TRUE);
1696       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, TRUE);
1697       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
1698       proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, TRUE);
1699       proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, TRUE);
1700       count = tvb_get_letohl( tvb, offset+28);
1701       proto_tree_add_item(skinny_tree, hf_skinny_sequenceFlag, tvb, offset+30, 4, TRUE);
1702       proto_tree_add_item(skinny_tree, hf_skinny_displayPriority, tvb, offset+34, 4, TRUE);
1703       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+38, 4, TRUE);
1704       proto_tree_add_item(skinny_tree, hf_skinny_appInstanceID, tvb, offset+42, 4, TRUE);
1705       proto_tree_add_item(skinny_tree, hf_skinny_routingID, tvb, offset+46, 4, TRUE);
1706       proto_tree_add_uint(skinny_tree, hf_skinny_data, tvb, offset+50, 1, count);
1707       break;
1708
1709
1710       /*
1711        *
1712        *  Call manager -> client messages start here(ish)
1713        *
1714        */
1715     case 0x81 :  /* registerAck */
1716       proto_tree_add_item(skinny_tree, hf_skinny_keepAliveInterval, tvb, offset+12, 4, TRUE);
1717       proto_tree_add_item(skinny_tree, hf_skinny_dateTemplate, tvb, offset+16, StationDateTemplateSize, TRUE);
1718       proto_tree_add_item(skinny_tree, hf_skinny_secondaryKeepAliveInterval, tvb, offset+24, 4, TRUE);
1719       break;
1720
1721     case 0x82 :  /* startTone */
1722       proto_tree_add_item(skinny_tree, hf_skinny_deviceTone, tvb, offset+12, 4, TRUE);
1723       break;
1724
1725     case 0x85 : /* setRingerMessage */
1726       proto_tree_add_item(skinny_tree, hf_skinny_ringType, tvb, offset+12, 4, TRUE);
1727       break;
1728
1729     case 0x86 : /* setLampMessage */
1730       proto_tree_add_item(skinny_tree, hf_skinny_stimulus, tvb, offset+12, 4, TRUE);
1731       proto_tree_add_item(skinny_tree, hf_skinny_stimulusInstance, tvb, offset+16, 4, TRUE);
1732       proto_tree_add_item(skinny_tree, hf_skinny_lampMode, tvb, offset+20, 4, TRUE);
1733       break;
1734
1735     case 0x87 : /* stationHookFlashDetectMode */
1736       proto_tree_add_item(skinny_tree, hf_skinny_hookFlashDetectMode, tvb, offset+12, 4, TRUE);
1737       proto_tree_add_item(skinny_tree, hf_skinny_detectInterval, tvb, offset+16, 4, TRUE);
1738       break;
1739
1740     case 0x88 : /* setSpeakerMode */
1741
1742       proto_tree_add_item(skinny_tree, hf_skinny_speakerMode, tvb, offset+12, 4, TRUE);
1743       break;
1744
1745     case 0x89 : /* setMicroMode */
1746       proto_tree_add_item(skinny_tree, hf_skinny_microphoneMode, tvb, offset+12, 4, TRUE);
1747       break;
1748
1749     case 0x8a : /* startMediaTransmistion */
1750       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID,          tvb, offset+12, 4, TRUE);
1751       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID,       tvb, offset+16, 4, TRUE);
1752       proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr,          tvb, offset+20, 4, TRUE);
1753       proto_tree_add_item(skinny_tree, hf_skinny_remotePortNumber,      tvb, offset+24, 4, TRUE);
1754       proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+28, 4, TRUE);
1755       proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability,     tvb, offset+32, 4, TRUE);
1756       proto_tree_add_item(skinny_tree, hf_skinny_precedenceValue,       tvb, offset+36, 4, TRUE);
1757       proto_tree_add_item(skinny_tree, hf_skinny_silenceSuppression,    tvb, offset+40, 4, TRUE);
1758       proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket,    tvb, offset+44, 2, TRUE);
1759       proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate,           tvb, offset+48, 4, TRUE);
1760       break;
1761
1762     case 0x8b :  /* stopMediaTransmission */
1763
1764       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
1765       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
1766       break;
1767
1768     case 0x8c : /* startMediaReception */
1769       break;
1770
1771     case 0x8d : /* stopMediaReception */
1772       break;
1773
1774     case 0x8e : /* reservered */
1775       break;
1776
1777     case 0x8f : /* callInfo */
1778       i = offset+12;
1779       proto_tree_add_item(skinny_tree, hf_skinny_callingPartyName, tvb, i, StationMaxNameSize, TRUE);
1780       i += StationMaxNameSize;
1781       proto_tree_add_item(skinny_tree, hf_skinny_callingParty, tvb, i, StationMaxDirnumSize, TRUE);
1782       i += StationMaxDirnumSize;
1783       proto_tree_add_item(skinny_tree, hf_skinny_calledPartyName, tvb, i, StationMaxNameSize, TRUE);
1784       i += StationMaxNameSize;
1785       proto_tree_add_item(skinny_tree, hf_skinny_calledParty, tvb, i, StationMaxDirnumSize, TRUE);
1786       i += StationMaxDirnumSize;
1787       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, i, 4, TRUE);
1788       i += 4;
1789       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, i, 4, TRUE);
1790       i += 4;
1791       proto_tree_add_item(skinny_tree, hf_skinny_callType, tvb, i, 4, TRUE);
1792       i += 4;
1793       proto_tree_add_item(skinny_tree, hf_skinny_originalCalledPartyName, tvb, i, StationMaxNameSize, TRUE);
1794       i += StationMaxNameSize;
1795       proto_tree_add_item(skinny_tree, hf_skinny_originalCalledParty, tvb, i, StationMaxDirnumSize, TRUE);
1796       i += StationMaxDirnumSize;
1797       proto_tree_add_item(skinny_tree, hf_cast_lastRedirectingPartyName, tvb, i, StationMaxNameSize, TRUE);
1798       i += StationMaxNameSize;
1799       proto_tree_add_item(skinny_tree, hf_cast_lastRedirectingParty, tvb, i, StationMaxDirnumSize, TRUE);
1800       i += StationMaxDirnumSize;
1801       proto_tree_add_item(skinny_tree, hf_cast_originalCdpnRedirectReason, tvb, i, 4, TRUE);
1802       i += 4;
1803       proto_tree_add_item(skinny_tree, hf_cast_lastRedirectingReason, tvb, i, 4, TRUE);
1804       i += 4;
1805       proto_tree_add_item(skinny_tree, hf_cast_cgpnVoiceMailbox, tvb, i, StationMaxDirnumSize, TRUE);
1806       i += StationMaxDirnumSize;
1807       proto_tree_add_item(skinny_tree, hf_cast_cdpnVoiceMailbox, tvb, i, StationMaxDirnumSize, TRUE);
1808       i += StationMaxDirnumSize;
1809       proto_tree_add_item(skinny_tree, hf_cast_originalCdpnVoiceMailbox, tvb, i, StationMaxDirnumSize, TRUE);
1810       i += StationMaxDirnumSize;
1811       proto_tree_add_item(skinny_tree, hf_cast_lastRedirectingVoiceMailbox, tvb, i, StationMaxDirnumSize, TRUE);
1812       i += StationMaxDirnumSize;
1813       proto_tree_add_item(skinny_tree, hf_cast_callInstance, tvb, i, 4, TRUE);
1814       i += 4;
1815       proto_tree_add_item(skinny_tree, hf_cast_callSecurityStatus, tvb, i, 4, TRUE);
1816       i += 4;
1817       val = tvb_get_letohl( tvb, i);
1818                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "partyPIRestrictionBits");
1819                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1820       proto_tree_add_text(skinny_sub_tree, tvb, i, 4,
1821               decode_boolean_bitfield( val, 0x01, 4*8, "Does RestrictCallingPartyName", "Doesn't RestrictCallingPartyName"));
1822       proto_tree_add_text(skinny_sub_tree, tvb, i, 4,
1823               decode_boolean_bitfield( val, 0x02, 4*8, "Does RestrictCallingPartyNumber", "Doesn't RestrictCallingPartyNumber"));
1824       proto_tree_add_text(skinny_sub_tree, tvb, i, 4,
1825               decode_boolean_bitfield( val, 0x04, 4*8, "Does RestrictCalledPartyName", "Doesn't RestrictCalledPartyName"));
1826       proto_tree_add_text(skinny_sub_tree, tvb, i, 4,
1827               decode_boolean_bitfield( val, 0x08, 4*8, "Does RestrictCalledPartyNumber", "Doesn't RestrictCalledPartyNumber"));
1828       proto_tree_add_text(skinny_sub_tree, tvb, i, 4,
1829               decode_boolean_bitfield( val, 0x10, 4*8, "Does RestrictOriginalCalledPartyName", "Doesn't RestrictOriginalCalledPartyName"));
1830       proto_tree_add_text(skinny_sub_tree, tvb, i, 4,
1831               decode_boolean_bitfield( val, 0x20, 4*8, "Does RestrictOriginalCalledPartyNumber", "Doesn't RestrictOriginalCalledPartyNumber"));
1832       proto_tree_add_text(skinny_sub_tree, tvb, i, 4,
1833               decode_boolean_bitfield( val, 0x40, 4*8, "Does RestrictLastRedirectPartyName", "Doesn't RestrictLastRedirectPartyName"));
1834       proto_tree_add_text(skinny_sub_tree, tvb, i, 4,
1835               decode_boolean_bitfield( val, 0x80, 4*8, "Does RestrictLastRedirectPartyNumber", "Doesn't RestrictLastRedirectPartyNumber"));
1836       break;
1837
1838     case 0x90 : /* forwardStat */
1839       proto_tree_add_item(skinny_tree, hf_skinny_activeForward, tvb, offset+12, 4, TRUE);
1840       proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+16, 4, TRUE);
1841       proto_tree_add_item(skinny_tree, hf_skinny_forwardAllActive, tvb, offset+20, 4, TRUE);
1842       proto_tree_add_item(skinny_tree, hf_skinny_forwardNumber, tvb, offset+24, StationMaxDirnumSize, TRUE);
1843       i = offset+24+StationMaxDirnumSize;
1844       proto_tree_add_item(skinny_tree, hf_skinny_forwardBusyActive, tvb, i, 4, TRUE);
1845       i += 4;
1846       proto_tree_add_item(skinny_tree, hf_skinny_forwardNumber, tvb, i, StationMaxDirnumSize, TRUE);
1847       i += StationMaxDirnumSize;
1848       proto_tree_add_item(skinny_tree, hf_skinny_forwardNoAnswerActive, tvb, i, 4, TRUE);
1849       i += 4;
1850       proto_tree_add_item(skinny_tree, hf_skinny_forwardNumber, tvb, i, StationMaxDirnumSize, TRUE);
1851       break;
1852
1853     case 0x91 : /* speedDialStatMessage */
1854       proto_tree_add_item(skinny_tree, hf_skinny_speedDialNumber, tvb, offset+12, 4, TRUE);
1855       proto_tree_add_item(skinny_tree, hf_skinny_speedDialDirNumber, tvb, offset+16, StationMaxDirnumSize, TRUE);
1856       proto_tree_add_item(skinny_tree, hf_skinny_speedDialDisplayName, tvb, offset+40, StationMaxNameSize, TRUE);
1857       break;
1858
1859     case 0x92 : /* lineStatMessage */
1860       proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+12, 4, TRUE);
1861       proto_tree_add_item(skinny_tree, hf_skinny_lineDirNumber, tvb, offset+16, StationMaxDirnumSize, TRUE);
1862       proto_tree_add_item(skinny_tree, hf_skinny_lineFullyQualifiedDisplayName, tvb, offset+16+StationMaxDirnumSize, StationMaxNameSize, TRUE);
1863       break;
1864
1865     case 0x93 : /* configStat */
1866       proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, StationMaxDeviceNameSize, TRUE);
1867       i = offset+12+StationMaxDeviceNameSize;
1868       proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, i, 4, TRUE);
1869       i += 4;
1870       proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, i, 4, TRUE);
1871       i += 4;
1872       proto_tree_add_item(skinny_tree, hf_skinny_userName, tvb, i, StationMaxNameSize, TRUE);
1873       i += StationMaxNameSize;
1874       proto_tree_add_item(skinny_tree, hf_skinny_serverName, tvb, i, StationMaxNameSize, TRUE);
1875       i += StationMaxNameSize;
1876       proto_tree_add_item(skinny_tree, hf_skinny_numberLines, tvb, i, 4, TRUE);
1877       proto_tree_add_item(skinny_tree, hf_skinny_numberSpeedDials, tvb, i+4, 4, TRUE);
1878       break;
1879
1880     case 0x94 : /* stationDefineTimeDate */
1881       proto_tree_add_item(skinny_tree, hf_skinny_dateYear,   tvb, offset+12, 4, TRUE);
1882       proto_tree_add_item(skinny_tree, hf_skinny_dateMonth,  tvb, offset+16, 4, TRUE);
1883       proto_tree_add_item(skinny_tree, hf_skinny_dayOfWeek,  tvb, offset+20, 4, TRUE);
1884       proto_tree_add_item(skinny_tree, hf_skinny_dateDay,    tvb, offset+24, 4, TRUE);
1885       proto_tree_add_item(skinny_tree, hf_skinny_dateHour,   tvb, offset+28, 4, TRUE);
1886       proto_tree_add_item(skinny_tree, hf_skinny_dateMinute, tvb, offset+32, 4, TRUE);
1887       proto_tree_add_item(skinny_tree, hf_skinny_dateSeconds,tvb, offset+36, 4, TRUE);
1888       proto_tree_add_item(skinny_tree, hf_skinny_dateMilliseconds,tvb, offset+40, 4, TRUE);
1889       proto_tree_add_item(skinny_tree, hf_skinny_timeStamp, tvb, offset+44, 4, TRUE);
1890       break;
1891
1892     case 0x95 : /* startSessionTransmission */
1893       proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr,  tvb, offset+12, 4, TRUE);
1894       proto_tree_add_item(skinny_tree, hf_skinny_sessionType, tvb, offset+16, 4, TRUE);
1895       break;
1896
1897     case 0x96 : /* stopSessionTransmission */
1898       proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr,  tvb, offset+12, 4, TRUE);
1899       proto_tree_add_item(skinny_tree, hf_skinny_sessionType, tvb, offset+16, 4, TRUE);
1900       break;
1901
1902     case 0x97 :  /* buttonTemplateMessage  */
1903       /*
1904        * FIXME
1905        * This decode prints out oogly subtree maybe? or something besides the VALS...
1906        * note to self: uint8 != 4 kk thx info ^_^
1907        *
1908        */
1909       proto_tree_add_item(skinny_tree, hf_skinny_buttonOffset, tvb, offset+12, 4, TRUE);
1910       proto_tree_add_item(skinny_tree, hf_skinny_buttonCount,  tvb, offset+16, 4, TRUE);
1911       proto_tree_add_item(skinny_tree, hf_skinny_totalButtonCount, tvb, offset+20, 4, TRUE);
1912       for (i = 0; i < StationMaxButtonTemplateSize; i++) {
1913               proto_tree_add_item(skinny_tree, hf_skinny_buttonInstanceNumber, tvb, offset+(i*2)+24, 1, TRUE);
1914               proto_tree_add_item(skinny_tree, hf_skinny_buttonDefinition, tvb, offset+(i*2)+25, 1, TRUE);
1915       }
1916       break;
1917
1918     case 0x98 : /* version */
1919       proto_tree_add_item(skinny_tree, hf_skinny_version, tvb, offset+12, StationMaxVersionSize, TRUE);
1920       break;
1921
1922     case 0x99 :  /* displayTextMessage */
1923       proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+12, StationMaxDisplayTextSize, TRUE);
1924       break;
1925
1926     case 0x9c : /* enunciatorCommand */
1927       proto_tree_add_item(skinny_tree, hf_skinny_mediaEnunciationType, tvb, offset+12, 4, TRUE);
1928       for (i = 0; i < StationMaxDirnumSize; i++) {
1929               proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+16+(i*4), 4, TRUE);
1930       }
1931       i = offset+16+StationMaxDirnumSize;
1932       proto_tree_add_item(skinny_tree, hf_skinny_mediaEnunciationType, tvb, i, 4, TRUE);
1933       break;
1934
1935     case 0x9d : /* stationRegisterReject */
1936       proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+12, StationMaxDisplayTextSize, TRUE);
1937       break;
1938
1939     case 0x9e : /* serverRes */
1940       for (i = 0; i < StationMaxServers; i++) {
1941               proto_tree_add_item(skinny_tree, hf_skinny_serverIdentifier, tvb, offset+12+(i*StationMaxServers), StationMaxServerNameSize, TRUE);
1942       }
1943       j = offset+12+(i*StationMaxServers);
1944       for (i = 0; i < StationMaxServers; i++) {
1945               proto_tree_add_item(skinny_tree, hf_skinny_serverListenPort, tvb, j+(i*4), 4,  TRUE);
1946       }
1947       j = j+(i*4);
1948       for (i = 0; i < StationMaxServers; i++) {
1949               proto_tree_add_item(skinny_tree, hf_skinny_serverIpAddress, tvb, j+(i*4), 4, TRUE);
1950       }
1951       break;
1952
1953     case 0x9f :   /* reset */
1954       proto_tree_add_item(skinny_tree, hf_skinny_deviceResetType, tvb, offset+12, 4, TRUE);
1955       break;
1956
1957     case 0x101 : /* startMulticastMediaReception*/
1958       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
1959       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
1960       proto_tree_add_item(skinny_tree, hf_skinny_multicastIpAddress, tvb, offset+20, 4, TRUE);
1961       proto_tree_add_item(skinny_tree, hf_skinny_multicastPort, tvb, offset+24, 4, TRUE);
1962       proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+28, 4, TRUE);
1963       proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+32, 4, TRUE);
1964       proto_tree_add_item(skinny_tree, hf_skinny_echoCancelType, tvb, offset+36, 4, TRUE);
1965       proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+40, 4, TRUE);
1966       break;
1967
1968     case 0x102 : /* startMulticateMediaTermination*/
1969       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
1970       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
1971       proto_tree_add_item(skinny_tree, hf_skinny_multicastIpAddress, tvb, offset+20, 4, TRUE);
1972       proto_tree_add_item(skinny_tree, hf_skinny_multicastPort, tvb, offset+24, 4, TRUE);
1973       proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+28, 4, TRUE);
1974       proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+32, 4, TRUE);
1975       proto_tree_add_item(skinny_tree, hf_skinny_precedenceValue, tvb, offset+36, 4, TRUE);
1976       proto_tree_add_item(skinny_tree, hf_skinny_silenceSuppression, tvb, offset+40, 4, TRUE);
1977       proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+44, 2, TRUE);
1978       proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+48, 4, TRUE);
1979       break;
1980
1981     case 0x103 : /* stopMulticastMediaReception*/
1982       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
1983       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
1984       break;
1985
1986     case 0x104 : /* stopMulticastMediaTermination*/
1987       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
1988       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
1989       break;
1990
1991     case 0x105 : /* open receive channel */
1992       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID,            tvb, offset+12, 4, TRUE);
1993       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID,         tvb, offset+16, 4, TRUE);
1994       proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize,   tvb, offset+20, 4, TRUE);
1995       proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability,       tvb, offset+24, 4, TRUE);
1996       proto_tree_add_item(skinny_tree, hf_skinny_echoCancelType,          tvb, offset+28, 4, TRUE);
1997       proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate,             tvb, offset+32, 4, TRUE);
1998       break;
1999
2000     case 0x106 :  /* closeReceiveChannel */
2001       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2002       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
2003       break;
2004
2005     case 0x107 :  /* connectionStatisticsReq */
2006
2007       i = 12;
2008       proto_tree_add_item(skinny_tree, hf_skinny_directoryNumber, tvb, i, StationMaxDirnumSize, TRUE);
2009       i = 12 + StationMaxDirnumSize;
2010       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, i, 4, TRUE);
2011       i = i+4;
2012       proto_tree_add_item(skinny_tree, hf_skinny_statsProcessingType, tvb, i, 4, TRUE);
2013       break;
2014
2015     case 0x108 :   /* softkeyTemplateResMessage */
2016       proto_tree_add_item(skinny_tree, hf_skinny_softKeyOffset, tvb, offset+12, 4, TRUE);
2017       softKeyCount = tvb_get_letohl(tvb, offset+16);
2018       proto_tree_add_uint(skinny_tree, hf_skinny_softKeyCount, tvb, offset+16, 4, softKeyCount);
2019       proto_tree_add_item(skinny_tree, hf_skinny_totalSoftKeyCount, tvb, offset+20, 4, TRUE);
2020       for (i = 0; ((i < StationMaxSoftKeyDefinition) && (i < softKeyCount)); i++){
2021               proto_tree_add_item(skinny_tree, hf_skinny_softKeyLabel, tvb, offset+(i*20)+24, StationMaxSoftKeyLabelSize, TRUE);
2022               proto_tree_add_item(skinny_tree, hf_skinny_softKeyEvent, tvb, offset+(i*20)+40, 4, TRUE);
2023       }
2024       /* there is more data here, but it doesn't make a whole lot of sense, I imagine
2025        * it's just some not zero'd out stuff in the packet or...
2026        */
2027       break;
2028
2029     case 0x109 : /* softkeysetres */
2030       proto_tree_add_item(skinny_tree, hf_skinny_softKeySetOffset, tvb, offset+12, 4, TRUE);
2031       softKeySetCount = tvb_get_letohl(tvb, offset+16);
2032       proto_tree_add_uint(skinny_tree, hf_skinny_softKeySetCount, tvb, offset+16, 4, softKeySetCount);
2033       proto_tree_add_item(skinny_tree, hf_skinny_totalSoftKeySetCount, tvb, offset+20, 4, TRUE);
2034       for (i = 0; ((i < StationMaxSoftKeySetDefinition) && (i < softKeySetCount)); i++) {
2035               proto_tree_add_uint(skinny_tree, hf_skinny_softKeySetDescription, tvb, offset+24+(i*48) , 1, i);
2036               for (j = 0; j < StationMaxSoftKeyIndex; j++) {
2037                 proto_tree_add_item(skinny_tree, hf_skinny_softKeyTemplateIndex, tvb, offset+24+(i*48)+j, 1, TRUE);
2038               }
2039               for (j = 0; j < StationMaxSoftKeyIndex; j++) {
2040                 proto_tree_add_item(skinny_tree, hf_skinny_softKeyInfoIndex, tvb, offset+24+(i*48)+StationMaxSoftKeyIndex+(j*2), 2, TRUE);
2041               }
2042       }
2043       break;
2044
2045     case 0x110 : /* selectSoftKeys */
2046       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, TRUE);
2047       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, TRUE);
2048       proto_tree_add_item(skinny_tree, hf_skinny_softKeySetDescription, tvb, offset+20, 4, TRUE);
2049       validKeyMask = tvb_get_letohs(tvb, offset + 24);
2050       skm = proto_tree_add_uint(skinny_tree, hf_skinny_softKeyMap, tvb, offset + 24, 1, validKeyMask);
2051       skm_tree = proto_item_add_subtree(skm, ett_skinny_softKeyMap);
2052       proto_tree_add_boolean(skm_tree, hf_skinny_softKey0,  tvb, offset + 24, 1, validKeyMask);
2053       proto_tree_add_boolean(skm_tree, hf_skinny_softKey1,  tvb, offset + 24, 1, validKeyMask);
2054       proto_tree_add_boolean(skm_tree, hf_skinny_softKey2,  tvb, offset + 24, 1, validKeyMask);
2055       proto_tree_add_boolean(skm_tree, hf_skinny_softKey3,  tvb, offset + 24, 1, validKeyMask);
2056       proto_tree_add_boolean(skm_tree, hf_skinny_softKey4,  tvb, offset + 24, 1, validKeyMask);
2057       proto_tree_add_boolean(skm_tree, hf_skinny_softKey5,  tvb, offset + 24, 1, validKeyMask);
2058       proto_tree_add_boolean(skm_tree, hf_skinny_softKey6,  tvb, offset + 24, 1, validKeyMask);
2059       proto_tree_add_boolean(skm_tree, hf_skinny_softKey7,  tvb, offset + 24, 1, validKeyMask);
2060       proto_tree_add_boolean(skm_tree, hf_skinny_softKey8,  tvb, offset + 24, 1, validKeyMask);
2061       proto_tree_add_boolean(skm_tree, hf_skinny_softKey9,  tvb, offset + 24, 1, validKeyMask);
2062       proto_tree_add_boolean(skm_tree, hf_skinny_softKey10, tvb, offset + 24, 1, validKeyMask);
2063       proto_tree_add_boolean(skm_tree, hf_skinny_softKey11, tvb, offset + 24, 1, validKeyMask);
2064       proto_tree_add_boolean(skm_tree, hf_skinny_softKey12, tvb, offset + 24, 1, validKeyMask);
2065       proto_tree_add_boolean(skm_tree, hf_skinny_softKey13, tvb, offset + 24, 1, validKeyMask);
2066       proto_tree_add_boolean(skm_tree, hf_skinny_softKey14, tvb, offset + 24, 1, validKeyMask);
2067       proto_tree_add_boolean(skm_tree, hf_skinny_softKey15, tvb, offset + 24, 1, validKeyMask);
2068       break;
2069
2070     case 0x111 : /* callState */
2071       proto_tree_add_item(skinny_tree, hf_skinny_callState, tvb, offset+12, 4, TRUE);
2072       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, TRUE);
2073       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
2074       break;
2075
2076     case 0x112 : /* displayPromptStatus */
2077       proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, TRUE);
2078       proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, StationMaxDisplayPromptStatusSize, TRUE);
2079       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+48, 4, TRUE);
2080       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+52, 4, TRUE);
2081       break;
2082
2083     case 0x113: /* clearPrompt */
2084       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance  , tvb, offset+12, 4, TRUE);
2085       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, TRUE);
2086       break;
2087
2088     case 0x114 : /* displayNotify */
2089       proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, TRUE);
2090       proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, StationMaxDisplayNotifySize , TRUE);
2091       break;
2092
2093     case 0x116 : /* activateCallPlane */
2094       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, TRUE);
2095       break;
2096
2097     case 0x118 :    /* unregisterAckMessage */
2098       proto_tree_add_item(skinny_tree, hf_skinny_deviceUnregisterStatus, tvb, offset+12, 4, TRUE);
2099       break;
2100
2101     case 0x119 : /* backSpaceReq */
2102       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, TRUE);
2103       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, TRUE);
2104       break;
2105
2106     case 0x11B : /* registerTokenReject */
2107       proto_tree_add_item(skinny_tree, hf_skinny_tokenRejWaitTime, tvb, offset+12, 4, TRUE);
2108       break;
2109
2110     case 0x11C : /* StartMediaFailureDetection */
2111       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2112       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
2113       proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+20, 4, TRUE);
2114             proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+24, 4, TRUE);
2115             proto_tree_add_item(skinny_tree, hf_skinny_echoCancelType, tvb, offset+28, 4, TRUE);
2116             proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+32, 4, TRUE);
2117       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+34, 4, TRUE);
2118       break;
2119
2120     case 0x11D : /* DialedNumberMessage */
2121       proto_tree_add_item(skinny_tree, hf_skinny_calledParty, tvb, offset+12, StationMaxDirnumSize, TRUE);
2122       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16+StationMaxDirnumSize, 4, TRUE);
2123       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20+StationMaxDirnumSize, 4, TRUE);
2124       break;
2125
2126     case 0x11E : /* UserToDeviceDataMessage */
2127       proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, TRUE);
2128       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, TRUE);
2129       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
2130       proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, TRUE);
2131       proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, TRUE);
2132       count = tvb_get_letohl( tvb, offset+28);
2133       proto_tree_add_uint(skinny_tree, hf_skinny_data, tvb, offset+30, 1, count);
2134       break;
2135
2136     case 0x11F : /* FeatureStatMessage */
2137       proto_tree_add_item(skinny_tree, hf_skinny_featureIndex, tvb, offset+12, 4, TRUE);
2138       proto_tree_add_item(skinny_tree, hf_skinny_featureID, tvb, offset+16, 4, TRUE);
2139       proto_tree_add_item(skinny_tree, hf_skinny_featureTextLabel, tvb, offset+20, StationMaxNameSize, TRUE);
2140       proto_tree_add_item(skinny_tree, hf_skinny_featureStatus, tvb, offset+20+StationMaxNameSize, 4, TRUE);
2141       break;
2142
2143     case 0x120 : /* DisplayPriNotifyMessage */
2144       proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, TRUE);
2145       proto_tree_add_item(skinny_tree, hf_skinny_priority, tvb, offset+16, 4, TRUE);
2146       proto_tree_add_item(skinny_tree, hf_skinny_notify, tvb, offset+16, StationMaxDisplayNotifySize, TRUE);
2147       break;
2148
2149     case 0x121 : /* ClearPriNotifyMessage */
2150       proto_tree_add_item(skinny_tree, hf_skinny_priority, tvb, offset+12, 4, TRUE);
2151       break;
2152
2153     case 0x122 : /* StartAnnouncementMessage */
2154       count = offset+12;
2155       for ( i = 0; i < MaxAnnouncementList; i++ ) {
2156         proto_tree_add_item(skinny_tree, hf_skinny_locale, tvb, count, 4, TRUE);
2157         count += 4;
2158         proto_tree_add_item(skinny_tree, hf_skinny_country, tvb, count, 4, TRUE);
2159         count += 4;
2160         proto_tree_add_item(skinny_tree, hf_skinny_deviceTone, tvb, count, 4, TRUE);
2161         count += 4;
2162       }
2163       proto_tree_add_item(skinny_tree, hf_skinny_endOfAnnAck, tvb, count, 4, TRUE);
2164       count += 4;
2165       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, count, 4, TRUE);
2166       count += 4;
2167
2168       for ( i = 0; i < StationMaxMonitorParties; i++ ) {
2169         proto_tree_add_item(skinny_tree, hf_skinny_matrixConfPartyID, tvb, count, 4, TRUE);
2170         count += 4;
2171       }
2172       proto_tree_add_item(skinny_tree, hf_skinny_hearingConfPartyMask, tvb, count, 4, TRUE);
2173       count += 4;
2174       proto_tree_add_item(skinny_tree, hf_skinny_annPlayMode, tvb, count, 4, TRUE);
2175       break;
2176
2177     case 0x123 : /* StopAnnouncementMessage */
2178       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2179       break;
2180
2181     case 0x124 : /* AnnouncementFinishMessage */
2182       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2183       proto_tree_add_item(skinny_tree, hf_skinny_annPlayStatus, tvb, offset+16, 4, TRUE);
2184       break;
2185
2186     case 0x127 : /* NotifyDtmfToneMessage */
2187       proto_tree_add_item(skinny_tree, hf_skinny_deviceTone, tvb, offset+12, 4, TRUE);
2188       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, TRUE);
2189       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, TRUE);
2190       break;
2191
2192     case 0x128 : /* SendDtmfToneMessage */
2193       proto_tree_add_item(skinny_tree, hf_skinny_deviceTone, tvb, offset+12, 4, TRUE);
2194       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, TRUE);
2195       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, TRUE);
2196       break;
2197
2198     case 0x129 : /* SubscribeDtmfPayloadReqMessage */
2199       proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, TRUE);
2200       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, TRUE);
2201       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, TRUE);
2202       break;
2203
2204     case 0x12A : /* SubscribeDtmfPayloadResMessage */
2205       proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, TRUE);
2206       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, TRUE);
2207       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, TRUE);
2208       break;
2209
2210     case 0x12B : /* SubscribeDtmfPayloadErrMessage */
2211       proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, TRUE);
2212       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, TRUE);
2213       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, TRUE);
2214       break;
2215
2216     case 0x12C : /* UnSubscribeDtmfPayloadReqMessage */
2217       proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, TRUE);
2218       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, TRUE);
2219       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, TRUE);
2220       break;
2221
2222     case 0x12D : /* UnSubscribeDtmfPayloadResMessage */
2223       proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, TRUE);
2224       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, TRUE);
2225       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, TRUE);
2226       break;
2227
2228     case 0x12E : /* UnSubscribeDtmfPayloadErrMessage */
2229       proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, TRUE);
2230       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, TRUE);
2231       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, TRUE);
2232       break;
2233
2234     case 0x12F : /* ServiceURLStatMessage */
2235       proto_tree_add_item(skinny_tree, hf_skinny_serviceURLIndex, tvb, offset+12, 4, TRUE);
2236       proto_tree_add_item(skinny_tree, hf_skinny_serviceURL, tvb, offset+12, StationMaxServiceURLSize, TRUE);
2237       proto_tree_add_item(skinny_tree, hf_skinny_serviceURLDisplayName, tvb, offset+12, StationMaxNameSize, TRUE);
2238       break;
2239
2240     case 0x130 : /* CallSelectStatMessage */
2241       proto_tree_add_item(skinny_tree, hf_skinny_callSelectStat, tvb, offset+12, 4, TRUE);
2242       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, TRUE);
2243       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+20, 4, TRUE);
2244       break;
2245
2246     case 0x131 : /* OpenMultiMediaChannelMessage */
2247       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2248       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
2249       proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+20, 4, TRUE);
2250       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+24, 4, TRUE);
2251       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+28, 4, TRUE);
2252       proto_tree_add_item(skinny_tree, hf_skinny_payload_rfc_number, tvb, offset+32, 4, TRUE);
2253       proto_tree_add_item(skinny_tree, hf_skinny_payloadType, tvb, offset+36, 4, TRUE);
2254       proto_tree_add_item(skinny_tree, hf_skinny_isConferenceCreator, tvb, offset+40, 4, TRUE);
2255
2256       /* add audio part of union */
2257                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 12, "audioParameters");
2258                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2259       proto_tree_add_item(skinny_sub_tree, hf_skinny_millisecondPacketSize, tvb, offset+44, 4, TRUE);
2260       proto_tree_add_item(skinny_sub_tree, hf_skinny_echoCancelType, tvb, offset+48, 4, TRUE);
2261       proto_tree_add_item(skinny_sub_tree, hf_skinny_g723BitRate, tvb, offset+52, 4, TRUE);
2262
2263       /* add video part of union */
2264                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 30, "vidParameters");
2265                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2266       proto_tree_add_item(skinny_sub_tree, hf_skinny_bitRate, tvb, offset+44, 4, TRUE);
2267       proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureFormatCount, tvb, offset+48, 4, TRUE);
2268       skinny_sub_tree_sav = skinny_sub_tree;
2269       count = offset+52;
2270       for ( i = 0; i < MAX_PICTURE_FORMAT; i++ ) {
2271                     ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8 * MAX_PICTURE_FORMAT, "pictureFormat[%d]", i);
2272                     skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2273         proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, TRUE);
2274         count += 4;
2275         proto_tree_add_item(skinny_sub_tree, hf_skinny_MPI, tvb, count, 4, TRUE);
2276         count += 4;
2277       }
2278       skinny_sub_tree = skinny_sub_tree_sav;
2279       proto_tree_add_item(skinny_sub_tree, hf_skinny_confServiceNum, tvb, count, 4, TRUE);
2280       count += 4;
2281
2282       val = count;
2283       /* add H261 part of union */
2284                   ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h261VideoCapability");
2285                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2286             proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, TRUE);
2287       count += 4;
2288             proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, TRUE);
2289
2290       /* add H263 part of union */
2291       count = val;
2292                   ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h263VideoCapability");
2293                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2294             proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, TRUE);
2295       count += 4;
2296             proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, TRUE);
2297
2298       /* add Vieo part of union */
2299       count = val;
2300                   ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "vieoVideoCapability");
2301                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2302             proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, TRUE);
2303       count += 4;
2304             proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, TRUE);
2305
2306       /* add data part of union */
2307                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "dataParameters");
2308                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2309             proto_tree_add_item(skinny_sub_tree, hf_skinny_protocolDependentData, tvb, offset+44, 4, TRUE);
2310             proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, offset+48, 4, TRUE);
2311       break;
2312
2313     case 0x132 : /* StartMultiMediaTransmission */
2314       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2315       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
2316       proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+20, 4, TRUE);
2317       proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+24, 4, TRUE);
2318       proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+28, 4, TRUE);
2319       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+32, 4, TRUE);
2320       proto_tree_add_item(skinny_tree, hf_skinny_payload_rfc_number, tvb, offset+36, 4, TRUE);
2321       proto_tree_add_item(skinny_tree, hf_skinny_payloadType, tvb, offset+40, 4, TRUE);
2322       proto_tree_add_item(skinny_tree, hf_skinny_DSCPValue, tvb, offset+44, 4, TRUE);
2323
2324       /* add audio part of union */
2325                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 12, "audioParameters");
2326                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2327       proto_tree_add_item(skinny_sub_tree, hf_skinny_millisecondPacketSize, tvb, offset+48, 4, TRUE);
2328       proto_tree_add_item(skinny_sub_tree, hf_skinny_echoCancelType, tvb, offset+52, 4, TRUE);
2329       proto_tree_add_item(skinny_sub_tree, hf_skinny_g723BitRate, tvb, offset+56, 4, TRUE);
2330
2331       /* add video part of union */
2332                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 30, "vidParameters");
2333                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2334       proto_tree_add_item(skinny_sub_tree, hf_skinny_bitRate, tvb, offset+48, 4, TRUE);
2335       proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureFormatCount, tvb, offset+52, 4, TRUE);
2336       skinny_sub_tree_sav = skinny_sub_tree;
2337       count = offset+56;
2338       for ( i = 0; i < MAX_PICTURE_FORMAT; i++ ) {
2339                     ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8 * MAX_PICTURE_FORMAT, "pictureFormat[%d]", i);
2340                     skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2341         proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, TRUE);
2342         count += 4;
2343         proto_tree_add_item(skinny_sub_tree, hf_skinny_MPI, tvb, count, 4, TRUE);
2344         count += 4;
2345       }
2346       skinny_sub_tree = skinny_sub_tree_sav;
2347       proto_tree_add_item(skinny_sub_tree, hf_skinny_confServiceNum, tvb, count, 4, TRUE);
2348       count += 4;
2349
2350       val = count;
2351       /* add H261 part of union */
2352                   ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h261VideoCapability");
2353                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2354             proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, TRUE);
2355       count += 4;
2356             proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, TRUE);
2357
2358       /* add H263 part of union */
2359       count = val;
2360                   ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h263VideoCapability");
2361                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2362             proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, TRUE);
2363       count += 4;
2364             proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, TRUE);
2365
2366       /* add Vieo part of union */
2367       count = val;
2368                   ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "vieoVideoCapability");
2369                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2370             proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, TRUE);
2371       count += 4;
2372             proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, TRUE);
2373
2374       /* add data part of union */
2375                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "dataParameters");
2376                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2377             proto_tree_add_item(skinny_sub_tree, hf_skinny_protocolDependentData, tvb, offset+48, 4, TRUE);
2378             proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, offset+52, 4, TRUE);
2379       break;
2380
2381     case 0x133 : /* StopMultiMediaTransmission */
2382       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2383       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
2384       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
2385       break;
2386
2387     case 0x134 : /* MiscellaneousCommandMessage */
2388       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2389       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
2390       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
2391       proto_tree_add_item(skinny_tree, hf_skinny_miscCommandType, tvb, offset+24, 4, TRUE);
2392
2393       /* show videoFreezePicture */
2394       /* not sure of format */
2395
2396       /* show videoFastUpdatePicture */
2397       /* not sure of format */
2398
2399       /* show videoFastUpdateGOB */
2400                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "videoFastUpdateGOB");
2401                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2402       proto_tree_add_item(skinny_sub_tree, hf_skinny_firstGOB, tvb, offset+28, 4, TRUE);
2403       proto_tree_add_item(skinny_sub_tree, hf_skinny_numberOfGOBs, tvb, offset+32, 4, TRUE);
2404
2405       /* show videoFastUpdateMB */
2406                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "videoFastUpdateGOB");
2407                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2408       proto_tree_add_item(skinny_sub_tree, hf_skinny_firstGOB, tvb, offset+28, 4, TRUE);
2409       proto_tree_add_item(skinny_sub_tree, hf_skinny_firstMB, tvb, offset+32, 4, TRUE);
2410       proto_tree_add_item(skinny_sub_tree, hf_skinny_numberOfMBs, tvb, offset+36, 4, TRUE);
2411
2412       /* show lostPicture */
2413                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "lostPicture");
2414                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2415       proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureNumber, tvb, offset+28, 4, TRUE);
2416       proto_tree_add_item(skinny_sub_tree, hf_skinny_longTermPictureIndex, tvb, offset+32, 4, TRUE);
2417
2418       /* show lostPartialPicture */
2419                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "lostPartialPicture");
2420                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2421       proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureNumber, tvb, offset+28, 4, TRUE);
2422       proto_tree_add_item(skinny_sub_tree, hf_skinny_longTermPictureIndex, tvb, offset+32, 4, TRUE);
2423       proto_tree_add_item(skinny_sub_tree, hf_skinny_firstMB, tvb, offset+36, 4, TRUE);
2424       proto_tree_add_item(skinny_sub_tree, hf_skinny_numberOfMBs, tvb, offset+40, 4, TRUE);
2425
2426       /* show recoveryReferencePicture */
2427                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "recoveryReferencePicture");
2428                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2429       proto_tree_add_item(skinny_sub_tree, hf_skinny_recoveryReferencePictureCount, tvb, offset+28, 4, TRUE);
2430       skinny_sub_tree_sav = skinny_sub_tree;
2431       for ( i = 0; i < MAX_REFERENCE_PICTURE; i++ ) {
2432                     ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "recoveryReferencePicture[%d]", i);
2433                     skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2434         proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureNumber, tvb, offset+32+(i*8), 4, TRUE);
2435         proto_tree_add_item(skinny_sub_tree, hf_skinny_longTermPictureIndex, tvb, offset+36+(i*8), 4, TRUE);
2436       }
2437
2438       /* show temporalSpatialTradeOff */
2439                   ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 4, "temporalSpatialTradeOff");
2440                   skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2441       proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOff, tvb, offset+28, 4, TRUE);
2442       break;
2443
2444     case 0x135 : /* FlowControlCommandMessage */
2445       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2446       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
2447       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
2448       proto_tree_add_item(skinny_tree, hf_skinny_maxBitRate, tvb, offset+24, 4, TRUE);
2449       break;
2450
2451     case 0x136 : /* CloseMultiMediaReceiveChannel */
2452       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2453       proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
2454       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
2455       break;
2456
2457     case 0x137 : /* CreateConferenceReqMessage */
2458       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2459       proto_tree_add_item(skinny_tree, hf_skinny_numberOfReservedParticipants, tvb, offset+16, 4, TRUE);
2460       proto_tree_add_item(skinny_tree, hf_skinny_resourceTypes, tvb, offset+16, 4, TRUE);
2461       proto_tree_add_item(skinny_tree, hf_skinny_appID, tvb, offset+20, 4, TRUE);
2462       count = offset+24;
2463       proto_tree_add_uint(skinny_tree, hf_skinny_appConfID, tvb, count, 1, AppConferenceIDSize);
2464       count += AppConferenceIDSize;
2465       proto_tree_add_uint(skinny_tree, hf_skinny_appData, tvb, count, 1, AppDataSize);
2466       count += AppDataSize;
2467       proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, count, 4, TRUE);
2468       val = tvb_get_letohl( tvb, count);
2469       count += 4;
2470       proto_tree_add_uint(skinny_tree, hf_skinny_passThruData, tvb, count, 1, val);
2471       break;
2472
2473     case 0x138 : /* DeleteConferenceReqMessage */
2474       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2475       break;
2476
2477     case 0x139 : /* ModifyConferenceReqMessage */
2478       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2479       proto_tree_add_item(skinny_tree, hf_skinny_numberOfReservedParticipants, tvb, offset+16, 4, TRUE);
2480       proto_tree_add_item(skinny_tree, hf_skinny_appID, tvb, offset+20, 4, TRUE);
2481       count = offset+24;
2482       proto_tree_add_uint(skinny_tree, hf_skinny_appConfID, tvb, count, 1, AppConferenceIDSize);
2483       count += AppConferenceIDSize;
2484       proto_tree_add_uint(skinny_tree, hf_skinny_appData, tvb, count, 1, AppDataSize);
2485       count += AppDataSize;
2486       proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, count, 4, TRUE);
2487       val = tvb_get_letohl( tvb, count);
2488       count += 4;
2489       proto_tree_add_uint(skinny_tree, hf_skinny_passThruData, tvb, count, 1, val);
2490       break;
2491
2492     case 0x13A : /* AddParticipantReqMessage */
2493       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2494       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, TRUE);
2495       break;
2496
2497     case 0x13B : /* DropParticipantReqMessage */
2498       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2499       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, TRUE);
2500       break;
2501
2502     case 0x13D : /* AuditParticipantReqMessage */
2503       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
2504       break;
2505
2506     case 0x13F : /* UserToDeviceDataVersion1Message */
2507       proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, TRUE);
2508       proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, TRUE);
2509       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
2510       proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, TRUE);
2511       proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, TRUE);
2512       count = tvb_get_letohl( tvb, offset+28);
2513       proto_tree_add_item(skinny_tree, hf_skinny_sequenceFlag, tvb, offset+30, 4, TRUE);
2514       proto_tree_add_item(skinny_tree, hf_skinny_displayPriority, tvb, offset+34, 4, TRUE);
2515       proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+38, 4, TRUE);
2516       proto_tree_add_item(skinny_tree, hf_skinny_appInstanceID, tvb, offset+42, 4, TRUE);
2517       proto_tree_add_item(skinny_tree, hf_skinny_routingID, tvb, offset+46, 4, TRUE);
2518       proto_tree_add_uint(skinny_tree, hf_skinny_data, tvb, offset+50, 1, count);
2519       break;
2520
2521
2522     default:
2523       break;
2524     }
2525   }
2526 }
2527
2528 /* Code to actually dissect the packets */
2529 static void dissect_skinny(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2530 {
2531   /* The general structure of a packet: {IP-Header|TCP-Header|n*SKINNY}
2532    * SKINNY-Packet: {Header(Size, Reserved)|Data(MessageID, Message-Data)}
2533    */
2534   /* Header fields */
2535   volatile guint32 hdr_data_length;
2536   guint32 hdr_reserved;
2537
2538   /* check, if this is really an SKINNY packet, they start with a length + 0 */
2539
2540   /* get relevant header information */
2541   hdr_data_length = tvb_get_letohl(tvb, 0);
2542   hdr_reserved    = tvb_get_letohl(tvb, 4);
2543
2544   /*  data_size       = MIN(8+hdr_data_length, tvb_length(tvb)) - 0xC; */
2545
2546   if (hdr_data_length < 4 || hdr_reserved != 0) {
2547     /* Not an SKINNY packet, just happened to use the same port */
2548     call_dissector(data_handle,tvb, pinfo, tree);
2549     return;
2550   }
2551
2552   /* Make entries in Protocol column and Info column on summary display */
2553   if (check_col(pinfo->cinfo, COL_PROTOCOL)) {
2554     col_set_str(pinfo->cinfo, COL_PROTOCOL, "SKINNY");
2555   }
2556
2557   if (check_col(pinfo->cinfo, COL_INFO)) {
2558     col_set_str(pinfo->cinfo, COL_INFO, "Skinny Client Control Protocol");
2559   }
2560
2561   tcp_dissect_pdus(tvb, pinfo, tree, skinny_desegment, 4,
2562         get_skinny_pdu_len, dissect_skinny_pdu);
2563 }
2564
2565 /* Register the protocol with Ethereal */
2566 void
2567 proto_register_skinny(void)
2568 {
2569
2570   /* Setup list of header fields */
2571   static hf_register_info hf[] = {
2572     { &hf_skinny_data_length,
2573       { "Data Length", "skinny.data_length",
2574         FT_UINT32, BASE_DEC, NULL, 0x0,
2575         "Number of bytes in the data portion.",
2576         HFILL }
2577     },
2578     { &hf_skinny_reserved,
2579       { "Reserved", "skinny.reserved",
2580         FT_UINT32, BASE_HEX, NULL, 0x0,
2581         "Reserved for future(?) use.",
2582         HFILL }
2583     },
2584     /* FIXME: Enable use of message name ???  */
2585     { &hf_skinny_messageid,
2586       { "Message ID", "skinny.messageid",
2587         FT_UINT32, BASE_HEX, VALS(message_id), 0x0,
2588         "The function requested/done with this message.",
2589         HFILL }
2590     },
2591
2592     { &hf_skinny_deviceName,
2593       { "DeviceName", "skinny.deviceName",
2594         FT_STRING, BASE_NONE, NULL, 0x0,
2595         "The device name of the phone.",
2596         HFILL }
2597     },
2598
2599     { &hf_skinny_stationUserId,
2600       { "StationUserId", "skinny.stationUserId",
2601         FT_UINT32, BASE_DEC, NULL, 0x0,
2602         "The station user id.",
2603         HFILL }
2604     },
2605
2606     { &hf_skinny_stationInstance,
2607       { "StationInstance", "skinny.stationInstance",
2608         FT_UINT32, BASE_DEC, NULL, 0x0,
2609         "The stations instance.",
2610         HFILL }
2611     },
2612
2613     { &hf_skinny_deviceType,
2614       { "DeviceType", "skinny.deviceType",
2615         FT_UINT32, BASE_DEC, VALS(deviceTypes), 0x0,
2616         "DeviceType of the station.",
2617         HFILL }
2618     },
2619
2620     { &hf_skinny_maxStreams,
2621       { "MaxStreams", "skinny.maxStreams",
2622         FT_UINT32, BASE_DEC, NULL, 0x0,
2623         "32 bit unsigned integer indicating the maximum number of simultansous RTP duplex streams that the client can handle.",
2624         HFILL }
2625     },
2626
2627     { &hf_skinny_stationIpPort,
2628       { "StationIpPort", "skinny.stationIpPort",
2629         FT_UINT16, BASE_DEC, NULL, 0x0,
2630         "The station IP port",
2631         HFILL }
2632     },
2633
2634     { &hf_skinny_stationKeypadButton,
2635       { "KeypadButton", "skinny.stationKeypadButton",
2636         FT_UINT32, BASE_HEX, VALS(keypadButtons), 0x0,
2637         "The button pressed on the phone.",
2638         HFILL }
2639     },
2640
2641     { &hf_skinny_calledParty,
2642       { "CalledParty", "skinny.calledParty",
2643         FT_STRING, BASE_NONE, NULL, 0x0,
2644         "The number called.",
2645         HFILL }
2646     },
2647
2648     { &hf_skinny_stimulus,
2649       { "Stimulus", "skinny.stimulus",
2650         FT_UINT32, BASE_HEX, VALS(deviceStimuli), 0x0,
2651         "Reason for the device stimulus message.",
2652         HFILL }
2653     },
2654
2655     { &hf_skinny_stimulusInstance,
2656       { "StimulusInstance", "skinny.stimulusInstance",
2657         FT_UINT32, BASE_DEC, NULL, 0x0,
2658         "The instance of the stimulus",
2659         HFILL }
2660     },
2661
2662     { &hf_skinny_lineNumber,
2663       { "LineNumber", "skinny.lineNumber",
2664         FT_UINT32, BASE_DEC, NULL, 0x0,
2665         "Line Number",
2666         HFILL }
2667     },
2668
2669     { &hf_skinny_speedDialNumber,
2670       { "SpeedDialNumber", "skinny.speedDialNumber",
2671         FT_UINT32, BASE_DEC, NULL, 0x0,
2672         "Which speed dial number",
2673         HFILL }
2674     },
2675
2676     { &hf_skinny_capCount,
2677       { "CapCount", "skinny.capCount",
2678         FT_UINT32, BASE_DEC, NULL, 0x0,
2679         "How many capabilities",
2680         HFILL }
2681     },
2682
2683     { &hf_skinny_payloadCapability,
2684       { "PayloadCapability", "skinny.payloadCapability",
2685         FT_UINT32, BASE_DEC, VALS(mediaPayloads), 0x0,
2686         "The payload capability for this media capability structure.",
2687         HFILL }
2688     },
2689
2690     { &hf_skinny_maxFramesPerPacket,
2691       { "MaxFramesPerPacket", "skinny.maxFramesPerPacket",
2692         FT_UINT16, BASE_DEC, NULL, 0x0,
2693         "Max frames per packet",
2694         HFILL }
2695     },
2696
2697     { &hf_skinny_alarmSeverity,
2698       { "AlarmSeverity", "skinny.alarmSeverity",
2699         FT_UINT32, BASE_DEC, VALS(alarmSeverities), 0x0,
2700         "The severity of the reported alarm.",
2701         HFILL }
2702     },
2703
2704     { &hf_skinny_alarmParam1,
2705       { "AlarmParam1", "skinny.alarmParam1",
2706         FT_UINT32, BASE_HEX, NULL, 0x0,
2707         "An as yet undecoded param1 value from the alarm message",
2708         HFILL }
2709     },
2710
2711     { &hf_skinny_alarmParam2,
2712       { "AlarmParam2", "skinny.alarmParam2",
2713         FT_IPv4, BASE_NONE, NULL, 0x0,
2714         "This is the second alarm parameter i think it's an ip address",
2715         HFILL }
2716     },
2717
2718     { &hf_skinny_receptionStatus,
2719       { "ReceptionStatus", "skinny.receptionStatus",
2720         FT_UINT32, BASE_DEC, VALS(multicastMediaReceptionStatus), 0x0,
2721         "The current status of the multicast media.",
2722         HFILL }
2723     },
2724
2725     { &hf_skinny_passThruPartyID,
2726       { "PassThruPartyID", "skinny.passThruPartyID",
2727         FT_UINT32, BASE_DEC, NULL, 0x0,
2728         "The pass thru party id",
2729         HFILL }
2730     },
2731
2732     { &hf_skinny_ORCStatus,
2733       { "OpenReceiveChannelStatus", "skinny.openReceiveChannelStatus",
2734         FT_UINT32, BASE_DEC, VALS(openReceiveChanStatus), 0x0,
2735         "The status of the opened receive channel.",
2736         HFILL }
2737     },
2738
2739     { &hf_skinny_ipAddress,
2740       { "IP Address", "skinny.ipAddress",
2741         FT_IPv4, BASE_NONE, NULL, 0x0,
2742         "An IP address",
2743         HFILL }
2744     },
2745
2746     { &hf_skinny_portNumber,
2747       { "Port Number", "skinny.portNumber",
2748         FT_UINT32, BASE_DEC, NULL, 0x0,
2749         "A port number",
2750         HFILL }
2751     },
2752
2753     { &hf_skinny_statsProcessingType,
2754       { "StatsProcessingType", "skinny.statsProcessingType",
2755         FT_UINT32, BASE_DEC, VALS(statsProcessingTypes), 0x0,
2756         "What do do after you send the stats.",
2757         HFILL }
2758     },
2759
2760     { &hf_skinny_callIdentifier,
2761       { "Call Identifier", "skinny.callIdentifier",
2762         FT_UINT32, BASE_DEC, NULL, 0x0,
2763         "Call identifier for this call.",
2764         HFILL }
2765     },
2766
2767     { &hf_skinny_packetsSent,
2768       { "Packets Sent", "skinny.packetsSent",
2769         FT_UINT32, BASE_DEC, NULL, 0x0,
2770         "Packets Sent during the call.",
2771         HFILL }
2772     },
2773
2774     { &hf_skinny_octetsSent,
2775       { "Octets Sent", "skinny.octetsSent",
2776         FT_UINT32, BASE_DEC, NULL, 0x0,
2777         "Octets sent during the call.",
2778         HFILL }
2779     },
2780
2781     { &hf_skinny_packetsRecv,
2782       { "Packets Received", "skinny.packetsRecv",
2783         FT_UINT32, BASE_DEC, NULL, 0x0,
2784         "Packets received during the call.",
2785         HFILL }
2786     },
2787
2788     { &hf_skinny_octetsRecv,
2789       { "Octets Received", "skinny.octetsRecv",
2790         FT_UINT32, BASE_DEC, NULL, 0x0,
2791         "Octets received during the call.",
2792         HFILL }
2793     },
2794
2795     { &hf_skinny_packetsLost,
2796       { "Packets Lost", "skinny.packetsLost",
2797         FT_UINT32, BASE_DEC, NULL, 0x0,
2798         "Packets lost during the call.",
2799         HFILL }
2800     },
2801
2802     { &hf_skinny_latency,
2803       { "Latency(ms)", "skinny.latency",
2804         FT_UINT32, BASE_DEC, NULL, 0x0,
2805         "Average packet latency during the call.",
2806         HFILL }
2807     },
2808
2809     { &hf_skinny_jitter,
2810       { "Jitter", "skinny.jitter",
2811         FT_UINT32, BASE_DEC, NULL, 0x0,
2812         "Average jitter during the call.",
2813         HFILL }
2814     },
2815
2816     { &hf_skinny_directoryNumber,
2817       { "Directory Number", "skinny.directoryNumber",
2818         FT_STRING, BASE_NONE, NULL, 0x0,
2819         "The number we are reporting statistics for.",
2820         HFILL }
2821     },
2822
2823     { &hf_skinny_lineInstance,
2824       { "Line Instance", "skinny.lineInstance",
2825         FT_UINT32, BASE_DEC, NULL, 0x0,
2826         "The display call plane associated with this call.",
2827         HFILL }
2828     },
2829
2830     { &hf_skinny_softKeyEvent,
2831       { "SoftKeyEvent", "skinny.softKeyEvent",
2832         FT_UINT32, BASE_DEC, VALS(softKeyEvents), 0x0,
2833         "Which softkey event is being reported.",
2834         HFILL }
2835     },
2836
2837     { &hf_skinny_keepAliveInterval,
2838       { "KeepAliveInterval", "skinny.keepAliveInterval",
2839         FT_UINT32, BASE_DEC, NULL, 0x0,
2840         "How often are keep alives exchanges between the client and the call manager.",
2841         HFILL }
2842     },
2843
2844     { &hf_skinny_secondaryKeepAliveInterval,
2845       { "SecondaryKeepAliveInterval", "skinny.secondaryKeepAliveInterval",
2846         FT_UINT32, BASE_DEC, NULL, 0x0,
2847         "How often are keep alives exchanges between the client and the secondary call manager.",
2848         HFILL }
2849     },
2850
2851     { &hf_skinny_dateTemplate,
2852       { "DateTemplate", "skinny.dateTemplate",
2853         FT_STRING, BASE_NONE, NULL, 0x0,
2854         "The display format for the date/time on the phone.",
2855         HFILL }
2856     },
2857
2858     { &hf_skinny_buttonOffset,
2859       { "ButtonOffset", "skinny.buttonOffset",
2860         FT_UINT32, BASE_DEC, NULL, 0x0,
2861         "Offset is the number of the first button referenced by this message.",
2862         HFILL }
2863     },
2864
2865     { &hf_skinny_buttonCount,
2866       { "ButtonCount", "skinny.buttonCount",
2867         FT_UINT32, BASE_DEC, NULL, 0x0,
2868         "Number of (VALID) button definitions in this message.",
2869         HFILL }
2870     },
2871
2872     { &hf_skinny_totalButtonCount,
2873       { "TotalButtonCount", "skinny.totalButtonCount",
2874         FT_UINT32, BASE_DEC, NULL, 0x0,
2875         "The total number of buttons defined for this phone.",
2876         HFILL }
2877     },
2878
2879     { &hf_skinny_buttonInstanceNumber,
2880       { "InstanceNumber", "skinny.buttonInstanceNumber",
2881         FT_UINT8, BASE_HEX, VALS(keypadButtons), 0x0,
2882         "The button instance number for a button or the StationKeyPad value, repeats allowed.",
2883         HFILL }
2884     },
2885
2886     { &hf_skinny_buttonDefinition,
2887       { "ButtonDefinition", "skinny.buttonDefinition",
2888         FT_UINT8, BASE_HEX, VALS(buttonDefinitions), 0x0,
2889         "The button type for this instance (ie line, speed dial, ....",
2890         HFILL }
2891     },
2892
2893     { &hf_skinny_softKeyOffset,
2894       { "SoftKeyOffset", "skinny.softKeyOffset",
2895         FT_UINT32, BASE_DEC, NULL, 0x0,
2896         "The offset for the first soft key in this message.",
2897         HFILL }
2898     },
2899
2900     { &hf_skinny_softKeyCount,
2901       { "SoftKeyCount", "skinny.softKeyCount",
2902         FT_UINT32, BASE_DEC, NULL, 0x0,
2903         "The number of valid softkeys in this message.",
2904         HFILL }
2905     },
2906
2907     { &hf_skinny_totalSoftKeyCount,
2908       { "TotalSoftKeyCount", "skinny.totalSoftKeyCount",
2909         FT_UINT32, BASE_DEC, NULL, 0x0,
2910         "The total number of softkeys for this device.",
2911         HFILL }
2912     },
2913
2914     { &hf_skinny_softKeyLabel,
2915       { "SoftKeyLabel", "skinny.softKeyLabel",
2916         FT_STRING, BASE_NONE, NULL, 0x0,
2917         "The text label for this soft key.",
2918         HFILL }
2919     },
2920
2921     { &hf_skinny_softKeySetOffset,
2922       { "SoftKeySetOffset", "skinny.softKeySetOffset",
2923         FT_UINT32, BASE_DEC, NULL, 0x0,
2924         "The offset for the first soft key set in this message.",
2925         HFILL }
2926     },
2927
2928     { &hf_skinny_softKeySetCount,
2929       { "SoftKeySetCount", "skinny.softKeySetCount",
2930         FT_UINT32, BASE_DEC, NULL, 0x0,
2931         "The number of valid softkey sets in this message.",
2932         HFILL }
2933     },
2934
2935     { &hf_skinny_totalSoftKeySetCount,
2936       { "TotalSoftKeySetCount", "skinny.totalSoftKeySetCount",
2937         FT_UINT32, BASE_DEC, NULL, 0x0,
2938         "The total number of softkey sets for this device.",
2939         HFILL }
2940     },
2941
2942     { &hf_skinny_softKeyTemplateIndex,
2943       { "SoftKeyTemplateIndex", "skinny.softKeyTemplateIndex",
2944         FT_UINT8, BASE_DEC, VALS(softKeyEvents), 0x0,
2945         "Array of size 16 8-bit unsigned ints containing an index into the softKeyTemplate.",
2946         HFILL }
2947     },
2948
2949     { &hf_skinny_softKeyInfoIndex,
2950       { "SoftKeyInfoIndex", "skinny.softKeyInfoIndex",
2951         FT_UINT16, BASE_DEC, VALS(softKeyIndexes), 0x0,
2952         "Array of size 16 16-bit unsigned integers containing an index into the soft key description information.",
2953         HFILL }
2954     },
2955
2956     { &hf_skinny_softKeySetDescription,
2957       { "SoftKeySet", "skinny.softKeySetDescription",
2958         FT_UINT8, BASE_DEC, VALS(keySetNames), 0x0,
2959         "A text description of what this softkey when this softkey set is displayed",
2960         HFILL }
2961     },
2962
2963     { &hf_skinny_softKeyMap,
2964       { "SoftKeyMap","skinny.softKeyMap",
2965         FT_UINT16, BASE_HEX, NULL, 0x0,
2966         "",
2967         HFILL }
2968     },
2969
2970     { &hf_skinny_softKey0,
2971       { "SoftKey0", "skinny.softKeyMap.0",
2972         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY0,
2973         "",
2974         HFILL }
2975     },
2976
2977     { &hf_skinny_softKey1,
2978       { "SoftKey1", "skinny.softKeyMap.1",
2979         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY1,
2980         "",
2981         HFILL }
2982     },
2983
2984     { &hf_skinny_softKey2,
2985       { "SoftKey2", "skinny.softKeyMap.2",
2986         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY2,
2987         "",
2988         HFILL }
2989     },
2990
2991     { &hf_skinny_softKey3,
2992       { "SoftKey3", "skinny.softKeyMap.3",
2993         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY3,
2994         "",
2995         HFILL }
2996     },
2997
2998     { &hf_skinny_softKey4,
2999       { "SoftKey4", "skinny.softKeyMap.4",
3000         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY4,
3001         "",
3002         HFILL }
3003     },
3004
3005     { &hf_skinny_softKey5,
3006       { "SoftKey5", "skinny.softKeyMap.5",
3007         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY5,
3008         "",
3009         HFILL }
3010     },
3011
3012     { &hf_skinny_softKey6,
3013       { "SoftKey6", "skinny.softKeyMap.6",
3014         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY6,
3015         "",
3016         HFILL }
3017     },
3018
3019     { &hf_skinny_softKey7,
3020       { "SoftKey7", "skinny.softKeyMap.7",
3021         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY7,
3022         "",
3023         HFILL }
3024     },
3025
3026     { &hf_skinny_softKey8,
3027       { "SoftKey8", "skinny.softKeyMap.8",
3028         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY8,
3029         "",
3030         HFILL }
3031     },
3032
3033     { &hf_skinny_softKey9,
3034       { "SoftKey9", "skinny.softKeyMap.9",
3035         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY9,
3036         "",
3037         HFILL }
3038     },
3039
3040     { &hf_skinny_softKey10,
3041       { "SoftKey10", "skinny.softKeyMap.10",
3042         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY10,
3043         "",
3044         HFILL }
3045     },
3046
3047     { &hf_skinny_softKey11,
3048       { "SoftKey11", "skinny.softKeyMap.11",
3049         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY11,
3050         "",
3051         HFILL }
3052     },
3053
3054     { &hf_skinny_softKey12,
3055       { "SoftKey12", "skinny.softKeyMap.12",
3056         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY12,
3057         "",
3058         HFILL }
3059     },
3060
3061     { &hf_skinny_softKey13,
3062       { "SoftKey13", "skinny.softKeyMap.13",
3063         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY13,
3064         "",
3065         HFILL }
3066     },
3067
3068     { &hf_skinny_softKey14,
3069       { "SoftKey14", "skinny.softKeyMap.14",
3070         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY14,
3071         "",
3072         HFILL }
3073     },
3074
3075     { &hf_skinny_softKey15,
3076       { "SoftKey15", "skinny.softKeyMap.15",
3077         FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY15,
3078         "",
3079         HFILL }
3080     },
3081
3082     { &hf_skinny_lampMode,
3083       { "LampMode", "skinny.lampMode",
3084         FT_UINT32, BASE_DEC, VALS(stationLampModes), 0x0,
3085         "The lamp mode",
3086         HFILL }
3087     },
3088
3089     { &hf_skinny_messageTimeOutValue,
3090       { "Message Timeout", "skinny.messageTimeOutValue",
3091         FT_UINT32, BASE_DEC, NULL, 0x0,
3092         "The timeout in seconds for this message",
3093         HFILL }
3094     },
3095
3096     { &hf_skinny_displayMessage,
3097       { "DisplayMessage", "skinny.displayMessage",
3098         FT_STRING, BASE_NONE, NULL, 0x0,
3099         "The message displayed on the phone.",
3100         HFILL }
3101     },
3102
3103     { &hf_skinny_lineDirNumber,
3104       { "Line Dir Number", "skinny.lineDirNumber",
3105         FT_STRING, BASE_NONE, NULL, 0x0,
3106         "The directory number for this line.",
3107         HFILL }
3108     },
3109
3110     { &hf_skinny_lineFullyQualifiedDisplayName,
3111       { "DisplayName", "skinny.fqdn",
3112         FT_STRING, BASE_NONE, NULL, 0x0,
3113         "The full display name for this line.",
3114         HFILL }
3115     },
3116
3117     { &hf_skinny_speedDialDirNumber,
3118       { "SpeedDial Number", "skinny.speedDialDirNum",
3119         FT_STRING, BASE_NONE, NULL, 0x0,
3120         "the number to dial for this speed dial.",
3121         HFILL }
3122     },
3123
3124     { &hf_skinny_speedDialDisplayName,
3125       { "SpeedDial Display", "skinny.speedDialDisplay",
3126         FT_STRING, BASE_NONE, NULL, 0x0,
3127         "The text to display for this speed dial.",
3128         HFILL }
3129     },
3130
3131     { &hf_skinny_dateYear,
3132       { "Year", "skinny.year",
3133         FT_UINT32, BASE_DEC, NULL, 0x0,
3134         "The current year",
3135         HFILL }
3136     },
3137
3138     { &hf_skinny_dateMonth,
3139       { "Month", "skinny.month",
3140         FT_UINT32, BASE_DEC, NULL, 0x0,
3141         "The current month",
3142         HFILL }
3143     },
3144
3145     { &hf_skinny_dayOfWeek,
3146       { "DayOfWeek", "skinny.dayOfWeek",
3147         FT_UINT32, BASE_DEC, NULL, 0x0,
3148         "The day of the week",
3149         HFILL }
3150     },
3151
3152     { &hf_skinny_dateDay,
3153       { "Day", "skinny.day",
3154         FT_UINT32, BASE_DEC, NULL, 0x0,
3155         "The day of the current month",
3156         HFILL }
3157     },
3158
3159     { &hf_skinny_dateHour,
3160       { "Hour", "skinny.hour",
3161         FT_UINT32, BASE_DEC, NULL, 0x0,
3162         "Hour of the day",
3163         HFILL }
3164     },
3165
3166     { &hf_skinny_dateMinute,
3167       { "Minute", "skinny.minute",
3168         FT_UINT32, BASE_DEC, NULL, 0x0,
3169         "Minute",
3170         HFILL }
3171     },
3172
3173     { &hf_skinny_dateSeconds,
3174       { "Seconds", "skinny.dateSeconds",
3175         FT_UINT32, BASE_DEC, NULL, 0x0,
3176         "Seconds",
3177         HFILL }
3178     },
3179
3180     { &hf_skinny_dateMilliseconds,
3181       { "Milliseconds", "skinny.dateMilliseconds",
3182         FT_UINT32, BASE_DEC, NULL, 0x0,
3183         "Milliseconds",
3184         HFILL }
3185     },
3186
3187     { &hf_skinny_timeStamp,
3188       { "Timestamp", "skinny.timeStamp",
3189         FT_UINT32, BASE_DEC, NULL, 0x0,
3190         "Time stamp for the call reference",
3191         HFILL }
3192     },
3193     { &hf_skinny_callState,
3194       { "CallState", "skinny.callState",
3195         FT_UINT32, BASE_DEC, VALS(skinny_stationCallStates), 0x0,
3196         "The D channel call state of the call",
3197         HFILL }
3198     },
3199
3200     { &hf_skinny_deviceTone,
3201       { "Tone", "skinny.deviceTone",
3202         FT_UINT32, BASE_HEX, VALS(skinny_deviceTones), 0x0,
3203         "Which tone to play",
3204         HFILL }
3205     },
3206
3207     { &hf_skinny_callingPartyName,
3208       { "Calling Party Name", "skinny.callingPartyName",
3209         FT_STRING, BASE_NONE, NULL, 0x0,
3210         "The passed name of the calling party.",
3211         HFILL }
3212     },
3213
3214     { &hf_skinny_callingParty,
3215       { "Calling Party", "skinny.callingPartyName",
3216         FT_STRING, BASE_NONE, NULL, 0x0,
3217         "The passed number of the calling party.",
3218         HFILL }
3219     },
3220
3221     { &hf_skinny_calledPartyName,
3222       { "Called Party Name", "skinny.calledPartyName",
3223         FT_STRING, BASE_NONE, NULL, 0x0,
3224         "The name of the party we are calling.",
3225         HFILL }
3226     },
3227
3228     { &hf_skinny_callType,
3229       { "Call Type", "skinny.callType",
3230         FT_UINT32, BASE_DEC, VALS(skinny_callTypes), 0x0,
3231         "What type of call, in/out/etc",
3232         HFILL }
3233     },
3234
3235     { &hf_skinny_originalCalledPartyName,
3236       { "Original Called Party Name", "skinny.originalCalledPartyName",
3237         FT_STRING, BASE_NONE, NULL, 0x0,
3238         "name of the original person who placed the call.",
3239         HFILL }
3240     },
3241
3242     { &hf_skinny_originalCalledParty,
3243       { "Original Called Party", "skinny.originalCalledParty",
3244         FT_STRING, BASE_NONE, NULL, 0x0,
3245         "The number of the original calling party.",
3246         HFILL }
3247     },
3248
3249     { &hf_skinny_ringType,
3250       { "Ring Type", "skinny.ringType",
3251         FT_UINT32, BASE_HEX, VALS(skinny_ringTypes), 0x0,
3252         "What type of ring to play",
3253         HFILL }
3254     },
3255
3256     { &hf_skinny_speakerMode,
3257       { "Speaker", "skinny.speakerMode",
3258         FT_UINT32, BASE_HEX, VALS(skinny_speakerModes), 0x0,
3259         "This message sets the speaker mode on/off",
3260         HFILL }
3261     },
3262
3263     { &hf_skinny_remoteIpAddr,
3264       { "Remote Ip Address", "skinny.remoteIpAddr",
3265         FT_IPv4, BASE_NONE, NULL, 0x0,
3266         "The remote end ip address for this stream",
3267         HFILL }
3268     },
3269
3270     { &hf_skinny_remotePortNumber,
3271       { "Remote Port", "skinny.remotePortNumber",
3272         FT_UINT32, BASE_DEC, NULL, 0x0,
3273         "The remote port number listening for this stream",
3274         HFILL }
3275     },
3276
3277     { &hf_skinny_millisecondPacketSize,
3278       { "MS/Packet", "skinny.millisecondPacketSize",
3279         FT_UINT32, BASE_DEC, NULL, 0x0,
3280         "The number of milliseconds of conversation in each packet",
3281         HFILL }
3282     },
3283
3284     { &hf_skinny_precedenceValue,
3285       { "Precedence", "skinny.precedenceValue",
3286         FT_UINT32, BASE_DEC, NULL, 0x0,
3287         "Precedence value",
3288         HFILL }
3289     },
3290
3291     { &hf_skinny_silenceSuppression,
3292       { "Silence Suppression", "skinny.silenceSuppression",
3293         FT_UINT32, BASE_HEX, VALS(skinny_silenceSuppressionModes), 0x0,
3294         "Mode for silence suppression",
3295         HFILL }
3296     },
3297
3298     { &hf_skinny_g723BitRate,
3299       { "G723 BitRate", "skinny.g723BitRate",
3300         FT_UINT32, BASE_DEC, VALS(skinny_g723BitRates), 0x0,
3301         "The G723 bit rate for this stream/JUNK if not g723 stream",
3302         HFILL }
3303     },
3304
3305     { &hf_skinny_conferenceID,
3306       { "Conference ID", "skinny.conferenceID",
3307         FT_UINT32, BASE_DEC, NULL, 0x0,
3308         "The conference ID",
3309         HFILL }
3310     },
3311
3312     { &hf_skinny_deviceResetType,
3313       { "Reset Type", "skinny.deviceResetType",
3314         FT_UINT32, BASE_DEC, VALS(skinny_deviceResetTypes), 0x0,
3315         "How the devices it to be reset (reset/restart)",
3316         HFILL }
3317     },
3318
3319     { &hf_skinny_echoCancelType,
3320       { "Echo Cancel Type", "skinny.echoCancelType",
3321         FT_UINT32, BASE_DEC, VALS(skinny_echoCancelTypes), 0x0,
3322         "Is echo cancelling enabled or not",
3323         HFILL }
3324     },
3325
3326     { &hf_skinny_deviceUnregisterStatus,
3327       { "Unregister Status", "skinny.deviceUnregisterStatus",
3328         FT_UINT32, BASE_DEC, VALS(skinny_deviceUnregisterStatusTypes), 0x0,
3329         "The status of the device unregister request (*CAN* be refused)",
3330         HFILL }
3331     },
3332
3333     { &hf_skinny_hookFlashDetectMode,
3334       { "Hook Flash Mode", "skinny.hookFlashDetectMode",
3335         FT_UINT32, BASE_DEC, VALS(skinny_hookFlashDetectModes), 0x0,
3336         "Which method to use to detect that a hook flash has occured",
3337         HFILL }
3338     },
3339
3340     { &hf_skinny_detectInterval,
3341       { "HF Detect Interval", "skinny.detectInterval",
3342         FT_UINT32, BASE_DEC, NULL, 0x0,
3343         "The number of milliseconds that determines a hook flash has occured",
3344         HFILL }
3345     },
3346
3347     { &hf_skinny_headsetMode,
3348       { "Headset Mode", "skinny.headsetMode",
3349         FT_UINT32, BASE_DEC, VALS(skinny_headsetModes), 0x0,
3350         "Turns on and off the headset on the set",
3351         HFILL }
3352     },
3353
3354     { &hf_skinny_microphoneMode,
3355       { "Microphone Mode", "skinny.microphoneMode",
3356         FT_UINT32, BASE_DEC, VALS(skinny_microphoneModes), 0x0,
3357         "Turns on and off the microphone on the set",
3358         HFILL }
3359     },
3360
3361     { &hf_skinny_activeForward,
3362       { "Active Forward", "skinny.activeForward",
3363         FT_UINT32, BASE_DEC, NULL, 0x0,
3364         "This is non zero to indicate that a forward is active on the line",
3365         HFILL }
3366     },
3367
3368     { &hf_skinny_forwardAllActive,
3369       { "Forward All", "skinny.forwardAllActive",
3370         FT_UINT32, BASE_DEC, NULL, 0x0,
3371         "Forward all calls",
3372         HFILL }
3373     },
3374
3375     { &hf_skinny_forwardBusyActive,
3376       { "Forward Busy", "skinny.forwardBusyActive",
3377         FT_UINT32, BASE_DEC, NULL, 0x0,
3378         "Forward calls when busy",
3379         HFILL }
3380     },
3381
3382     { &hf_skinny_forwardNoAnswerActive,
3383       { "Forward NoAns", "skinny.forwardNoAnswerActive",
3384         FT_UINT32, BASE_DEC, NULL, 0x0,
3385         "Forward only when no answer",
3386         HFILL }
3387     },
3388
3389     { &hf_skinny_forwardNumber,
3390       { "Forward Number", "skinny.forwardNumber",
3391         FT_STRING, BASE_NONE, NULL, 0x0,
3392         "The number to forward calls to.",
3393         HFILL }
3394     },
3395
3396     { &hf_skinny_userName,
3397       { "Username", "skinny.userName",
3398         FT_STRING, BASE_NONE, NULL, 0x0,
3399         "Username for this device.",
3400         HFILL }
3401     },
3402
3403     { &hf_skinny_serverName,
3404       { "Server Name", "skinny.serverName",
3405         FT_STRING, BASE_NONE, NULL, 0x0,
3406         "The server name for this device.",
3407         HFILL }
3408     },
3409
3410     { &hf_skinny_numberLines,
3411       { "Number of Lines", "skinny.numberLines",
3412         FT_UINT32, BASE_DEC, NULL, 0x0,
3413         "How many lines this device has",
3414         HFILL }
3415     },
3416
3417     { &hf_skinny_numberSpeedDials,
3418       { "Number of SpeedDials", "skinny.numberSpeedDials",
3419         FT_UINT32, BASE_DEC, NULL, 0x0,
3420         "The number of speed dials this device has",
3421         HFILL }
3422     },
3423
3424     { &hf_skinny_sessionType,
3425       { "Session Type", "skinny.sessionType",
3426         FT_UINT32, BASE_DEC, VALS(skinny_sessionTypes), 0x0,
3427         "The type of this session.",
3428         HFILL }
3429     },
3430
3431     { &hf_skinny_version,
3432       { "Version", "skinny.version",
3433         FT_STRING, BASE_NONE, NULL, 0x0,
3434         "Version.",
3435         HFILL }
3436     },
3437
3438     { &hf_skinny_mediaEnunciationType,
3439       { "Enunciation Type", "skinny.mediaEnunciationType",
3440         FT_UINT32, BASE_DEC, VALS(skinny_mediaEnunciationTypes), 0x0,
3441         "No clue.",
3442         HFILL }
3443     },
3444
3445     { &hf_skinny_serverIdentifier,
3446       { "Server Identifier", "skinny.serverIdentifier",
3447         FT_STRING, BASE_NONE, NULL, 0x0,
3448         "Server Identifier.",
3449         HFILL }
3450     },
3451
3452     { &hf_skinny_serverListenPort,
3453       { "Server Port", "skinny.serverListenPort",
3454         FT_UINT32, BASE_DEC, NULL, 0x0,
3455         "The port the server listens on.",
3456         HFILL }
3457     },
3458
3459     { &hf_skinny_serverIpAddress,
3460       { "Server Ip Address", "skinny.serverIpAddress",
3461         FT_IPv4, BASE_NONE, NULL, 0x0,
3462         "The IP address for this server",
3463         HFILL }
3464     },
3465
3466     { &hf_skinny_multicastPort,
3467       { "Multicast Port", "skinny.multicastPort",
3468         FT_UINT32, BASE_DEC, NULL, 0x0,
3469         "The multicast port the to listens on.",
3470         HFILL }
3471     },
3472
3473     { &hf_skinny_multicastIpAddress,
3474       { "Multicast Ip Address", "skinny.multicastIpAddress",
3475         FT_IPv4, BASE_NONE, NULL, 0x0,
3476         "The multicast address for this conference",
3477         HFILL }
3478     },
3479
3480     { &hf_skinny_tokenRejWaitTime,
3481       { "Retry Wait Time", "skinny.tokenRejWaitTime",
3482         FT_UINT32, BASE_DEC, NULL, 0x0,
3483         "The time to wait before retrying this token request.",
3484         HFILL }
3485     },
3486
3487     { &hf_skinny_unknown,
3488       { "Data", "skinny.unknown",
3489         FT_UINT32, BASE_HEX, NULL, 0x0,
3490         "Place holder for unknown data.",
3491         HFILL }
3492     },
3493
3494     { &hf_skinny_data,
3495       { "Data", "skinny.data",
3496         FT_UINT8, BASE_HEX, NULL, 0x0,
3497         "dataPlace holder for unknown data.",
3498         HFILL }
3499     },
3500
3501     { &hf_skinny_numberOfInServiceStreams,
3502       { "NumberOfInServiceStreams", "skinny.numberOfInServiceStreams",
3503         FT_UINT32, BASE_DEC, NULL, 0x0,
3504         "Number of in service streams.",
3505         HFILL }
3506     },
3507
3508     { &hf_skinny_maxStreamsPerConf,
3509       { "MaxStreamsPerConf", "skinny.maxStreamsPerConf",
3510         FT_UINT32, BASE_DEC, NULL, 0x0,
3511         "Maximum number of streams per conference.",
3512         HFILL }
3513     },
3514
3515     { &hf_skinny_numberOfOutOfServiceStreams,
3516       { "NumberOfOutOfServiceStreams", "skinny.numberOfOutOfServiceStreams",
3517         FT_UINT32, BASE_DEC, NULL, 0x0,
3518         "Number of out of service streams.",
3519         HFILL }
3520     },
3521
3522     { &hf_skinny_applicationID,
3523       { "ApplicationID", "skinny.applicationID",
3524         FT_UINT32, BASE_DEC, NULL, 0x0,
3525         "Application ID.",
3526         HFILL }
3527     },
3528
3529     { &hf_skinny_transactionID,
3530       { "TransactionID", "skinny.transactionID",
3531         FT_UINT32, BASE_DEC, NULL, 0x0,
3532         "Transaction ID.",
3533         HFILL }
3534     },
3535
3536     { &hf_skinny_serviceNum,
3537       { "ServiceNum", "skinny.serviceNum",
3538         FT_UINT32, BASE_DEC, NULL, 0x0,
3539         "ServiceNum.",
3540         HFILL }
3541     },
3542
3543     { &hf_skinny_serviceURLIndex,
3544       { "serviceURLIndex", "skinny.serviceURLIndex",
3545         FT_UINT32, BASE_DEC, NULL, 0x0,
3546         "serviceURLIndex.",
3547         HFILL }
3548     },
3549
3550     { &hf_skinny_featureIndex,
3551       { "FeatureIndex", "skinny.featureIndex",
3552         FT_UINT32, BASE_DEC, NULL, 0x0,
3553         "FeatureIndex.",
3554         HFILL }
3555     },
3556
3557     { &hf_skinny_createConfResults,
3558       { "CreateConfResults", "skinny.createConfResults",
3559         FT_UINT32, BASE_DEC, VALS(skinny_createConfResults), 0x0,
3560         "The create conference results",
3561         HFILL }
3562     },
3563
3564     { &hf_skinny_modifyConfResults,
3565       { "ModifyConfResults", "skinny.modifyConfResults",
3566         FT_UINT32, BASE_DEC, VALS(skinny_modifyConfResults), 0x0,
3567         "The modify conference results",
3568         HFILL }
3569     },
3570
3571     { &hf_skinny_deleteConfResults,
3572       { "DeleteConfResults", "skinny.deleteConfResults",
3573         FT_UINT32, BASE_DEC, VALS(skinny_deleteConfResults), 0x0,
3574         "The delete conference results",
3575         HFILL }
3576     },
3577
3578     { &hf_skinny_addParticipantResults,
3579       { "AddParticipantResults", "skinny.addParticipantResults",
3580         FT_UINT32, BASE_DEC, VALS(skinny_addParticipantResults), 0x0,
3581         "The add conference participant results",
3582         HFILL }
3583     },
3584
3585     { &hf_skinny_passThruData,
3586       { "PassThruData", "skinny.passThruData",
3587         FT_UINT8, BASE_HEX, NULL, 0x0,
3588         "Pass Through data.",
3589         HFILL }
3590     },
3591
3592     { &hf_skinny_auditParticipantResults,
3593       { "AuditParticipantResults", "skinny.auditParticipantResults",
3594         FT_UINT32, BASE_DEC, VALS(skinny_auditParticipantResults), 0x0,
3595         "The audit participant results",
3596         HFILL }
3597     },
3598
3599     { &hf_skinny_last,
3600       { "Last", "skinny.last",
3601         FT_UINT32, BASE_DEC, NULL, 0x0,
3602         "Last.",
3603         HFILL }
3604     },
3605
3606     { &hf_skinny_numberOfEntries,
3607       { "NumberOfEntries", "skinny.numberOfEntries",
3608         FT_UINT32, BASE_DEC, NULL, 0x0,
3609         "Number of entries in list.",
3610         HFILL }
3611     },
3612
3613     { &hf_skinny_participantEntry,
3614       { "ParticipantEntry", "skinny.participantEntry",
3615         FT_UINT32, BASE_DEC, NULL, 0x0,
3616         "Participant Entry.",
3617         HFILL }
3618     },
3619
3620     { &hf_skinny_resourceTypes,
3621       { "ResourceType", "skinny.resourceTypes",
3622         FT_UINT32, BASE_DEC, VALS(skinny_resourceTypes), 0x0,
3623         "Resource Type",
3624         HFILL }
3625     },
3626
3627     { &hf_skinny_numberOfReservedParticipants,
3628       { "NumberOfReservedParticipants", "skinny.numberOfReservedParticipants",
3629         FT_UINT32, BASE_DEC, NULL, 0x0,
3630         "numberOfReservedParticipants.",
3631         HFILL }
3632     },
3633
3634     { &hf_skinny_numberOfActiveParticipants,
3635       { "NumberOfActiveParticipants", "skinny.numberOfActiveParticipants",
3636         FT_UINT32, BASE_DEC, NULL, 0x0,
3637         "numberOfActiveParticipants.",
3638         HFILL }
3639     },
3640
3641     { &hf_skinny_appID,
3642       { "AppID", "skinny.appID",
3643         FT_UINT32, BASE_DEC, NULL, 0x0,
3644         "AppID.",
3645         HFILL }
3646     },
3647
3648     { &hf_skinny_appData,
3649       { "AppData", "skinny.appData",
3650         FT_UINT8, BASE_HEX, NULL, 0x0,
3651         "App data.",
3652         HFILL }
3653     },
3654
3655     { &hf_skinny_appConfID,
3656       { "AppConfID", "skinny.appConfID",
3657         FT_UINT8, BASE_HEX, NULL, 0x0,
3658         "App Conf ID Data.",
3659         HFILL }
3660     },
3661
3662     { &hf_skinny_sequenceFlag,
3663       { "SequenceFlag", "skinny.sequenceFlag",
3664         FT_UINT32, BASE_DEC, VALS(skinny_sequenceFlags), 0x0,
3665         "Sequence Flag",
3666         HFILL }
3667     },
3668
3669     { &hf_skinny_displayPriority,
3670       { "DisplayPriority", "skinny.displayPriority",
3671         FT_UINT32, BASE_DEC, NULL, 0x0,
3672         "Display Priority.",
3673         HFILL }
3674     },
3675
3676     { &hf_skinny_appInstanceID,
3677       { "AppInstanceID", "skinny.appInstanceID",
3678         FT_UINT32, BASE_DEC, NULL, 0x0,
3679         "appInstanceID.",
3680         HFILL }
3681     },
3682
3683     { &hf_skinny_routingID,
3684       { "routingID", "skinny.routingID",
3685         FT_UINT32, BASE_DEC, NULL, 0x0,
3686         "routingID.",
3687         HFILL }
3688     },
3689
3690     { &hf_skinny_audioCapCount,
3691       { "AudioCapCount", "skinny.audioCapCount",
3692         FT_UINT32, BASE_DEC, NULL, 0x0,
3693         "AudioCapCount.",
3694         HFILL }
3695     },
3696
3697     { &hf_skinny_videoCapCount,
3698       { "VideoCapCount", "skinny.videoCapCount",
3699         FT_UINT32, BASE_DEC, NULL, 0x0,
3700         "VideoCapCount.",
3701         HFILL }
3702     },
3703
3704     { &hf_skinny_dataCapCount,
3705       { "DataCapCount", "skinny.dataCapCount",
3706         FT_UINT32, BASE_DEC, NULL, 0x0,
3707         "DataCapCount.",
3708         HFILL }
3709     },
3710
3711     { &hf_skinny_RTPPayloadFormat,
3712       { "RTPPayloadFormat", "skinny.RTPPayloadFormat",
3713         FT_UINT32, BASE_DEC, NULL, 0x0,
3714         "RTPPayloadFormat.",
3715         HFILL }
3716     },
3717
3718     { &hf_skinny_customPictureFormatCount,
3719       { "CustomPictureFormatCount", "skinny.customPictureFormatCount",
3720         FT_UINT32, BASE_DEC, NULL, 0x0,
3721         "CustomPictureFormatCount.",
3722         HFILL }
3723     },
3724
3725     { &hf_skinny_pictureWidth,
3726       { "PictureWidth", "skinny.pictureWidth",
3727         FT_UINT32, BASE_DEC, NULL, 0x0,
3728         "PictureWidth.",
3729         HFILL }
3730     },
3731
3732     { &hf_skinny_pictureHeight,
3733       { "PictureHeight", "skinny.pictureHeight",
3734         FT_UINT32, BASE_DEC, NULL, 0x0,
3735         "PictureHeight.",
3736         HFILL }
3737     },
3738
3739     { &hf_skinny_pixelAspectRatio,
3740       { "PixelAspectRatio", "skinny.pixelAspectRatio",
3741         FT_UINT32, BASE_DEC, NULL, 0x0,
3742         "PixelAspectRatio.",
3743         HFILL }
3744     },
3745
3746     { &hf_skinny_clockConversionCode,
3747       { "ClockConversionCode", "skinny.clockConversionCode",
3748         FT_UINT32, BASE_DEC, NULL, 0x0,
3749         "ClockConversionCode.",
3750         HFILL }
3751     },
3752
3753     { &hf_skinny_clockDivisor,
3754       { "ClockDivisor", "skinny.clockDivisor",
3755         FT_UINT32, BASE_DEC, NULL, 0x0,
3756         "Clock Divisor.",
3757         HFILL }
3758     },
3759
3760     { &hf_skinny_activeStreamsOnRegistration,
3761       { "ActiveStreamsOnRegistration", "skinny.activeStreamsOnRegistration",
3762         FT_UINT32, BASE_DEC, NULL, 0x0,
3763         "ActiveStreamsOnRegistration.",
3764         HFILL }
3765     },
3766
3767     { &hf_skinny_maxBW,
3768       { "MaxBW", "skinny.maxBW",
3769         FT_UINT32, BASE_DEC, NULL, 0x0,
3770         "MaxBW.",
3771         HFILL }
3772     },
3773
3774     { &hf_skinny_serviceResourceCount,
3775       { "ServiceResourceCount", "skinny.serviceResourceCount",
3776         FT_UINT32, BASE_DEC, NULL, 0x0,
3777         "ServiceResourceCount.",
3778         HFILL }
3779     },
3780
3781     { &hf_skinny_layoutCount,
3782       { "LayoutCount", "skinny.layoutCount",
3783         FT_UINT32, BASE_DEC, NULL, 0x0,
3784         "LayoutCount.",
3785         HFILL }
3786     },
3787
3788     { &hf_skinny_layout,
3789       { "Layout", "skinny.layout",
3790         FT_UINT32, BASE_DEC, VALS(skinny_Layouts), 0x0,
3791         "Layout",
3792         HFILL }
3793     },
3794
3795     { &hf_skinny_maxConferences,
3796       { "MaxConferences", "skinny.maxConferences",
3797         FT_UINT32, BASE_DEC, NULL, 0x0,
3798         "MaxConferences.",
3799         HFILL }
3800     },
3801
3802     { &hf_skinny_activeConferenceOnRegistration,
3803       { "ActiveConferenceOnRegistration", "skinny.activeConferenceOnRegistration",
3804         FT_UINT32, BASE_DEC, NULL, 0x0,
3805         "ActiveConferenceOnRegistration.",
3806         HFILL }
3807     },
3808
3809     { &hf_skinny_transmitOrReceive,
3810       { "TransmitOrReceive", "skinny.transmitOrReceive",
3811         FT_UINT32, BASE_DEC, VALS(skinny_transmitOrReceive), 0x0,
3812         "TransmitOrReceive",
3813         HFILL }
3814     },
3815
3816     { &hf_skinny_levelPreferenceCount,
3817       { "LevelPreferenceCount", "skinny.levelPreferenceCount",
3818         FT_UINT32, BASE_DEC, NULL, 0x0,
3819         "LevelPreferenceCount.",
3820         HFILL }
3821     },
3822
3823     { &hf_skinny_transmitPreference,
3824       { "TransmitPreference", "skinny.transmitPreference",
3825         FT_UINT32, BASE_DEC, NULL, 0x0,
3826         "TransmitPreference.",
3827         HFILL }
3828     },
3829
3830     { &hf_skinny_format,
3831       { "Format", "skinny.format",
3832         FT_UINT32, BASE_DEC, VALS(skinny_formatTypes), 0x0,
3833         "Format.",
3834         HFILL }
3835     },
3836
3837     { &hf_skinny_maxBitRate,
3838       { "MaxBitRate", "skinny.maxBitRate",
3839         FT_UINT32, BASE_DEC, NULL, 0x0,
3840         "MaxBitRate.",
3841         HFILL }
3842     },
3843
3844     { &hf_skinny_minBitRate,
3845       { "MinBitRate", "skinny.minBitRate",
3846         FT_UINT32, BASE_DEC, NULL, 0x0,
3847         "MinBitRate.",
3848         HFILL }
3849     },
3850
3851     { &hf_skinny_MPI,
3852       { "MPI", "skinny.MPI",
3853         FT_UINT32, BASE_DEC, NULL, 0x0,
3854         "MPI.",
3855         HFILL }
3856     },
3857
3858     { &hf_skinny_serviceNumber,
3859       { "ServiceNumber", "skinny.serviceNumber",
3860         FT_UINT32, BASE_DEC, NULL, 0x0,
3861         "ServiceNumber.",
3862         HFILL }
3863     },
3864
3865     { &hf_skinny_temporalSpatialTradeOffCapability,
3866       { "TemporalSpatialTradeOffCapability", "skinny.temporalSpatialTradeOffCapability",
3867         FT_UINT32, BASE_DEC, NULL, 0x0,
3868         "TemporalSpatialTradeOffCapability.",
3869         HFILL }
3870     },
3871
3872     { &hf_skinny_stillImageTransmission,
3873       { "StillImageTransmission", "skinny.stillImageTransmission",
3874         FT_UINT32, BASE_DEC, NULL, 0x0,
3875         "StillImageTransmission.",
3876         HFILL }
3877     },
3878
3879     { &hf_skinny_h263_capability_bitfield,
3880       { "H263_capability_bitfield", "skinny.h263_capability_bitfield",
3881         FT_UINT32, BASE_DEC, NULL, 0x0,
3882         "H263_capability_bitfield.",
3883         HFILL }
3884     },
3885
3886     { &hf_skinny_annexNandWFutureUse,
3887       { "AnnexNandWFutureUse", "skinny.annexNandWFutureUse",
3888         FT_UINT32, BASE_DEC, NULL, 0x0,
3889         "AnnexNandWFutureUse.",
3890         HFILL }
3891     },
3892
3893     { &hf_skinny_modelNumber,
3894       { "ModelNumber", "skinny.modelNumber",
3895         FT_UINT32, BASE_DEC, NULL, 0x0,
3896         "ModelNumber.",
3897         HFILL }
3898     },
3899
3900     { &hf_skinny_bandwidth,
3901       { "Bandwidth", "skinny.bandwidth",
3902         FT_UINT32, BASE_DEC, NULL, 0x0,
3903         "Bandwidth.",
3904         HFILL }
3905     },
3906
3907     { &hf_skinny_protocolDependentData,
3908       { "ProtocolDependentData", "skinny.protocolDependentData",
3909         FT_UINT32, BASE_DEC, NULL, 0x0,
3910         "ProtocolDependentData.",
3911         HFILL }
3912     },
3913
3914     { &hf_skinny_priority,
3915       { "Priority", "skinny.priority",
3916         FT_UINT32, BASE_DEC, NULL, 0x0,
3917         "Priority.",
3918         HFILL }
3919     },
3920
3921     { &hf_skinny_payloadDtmf,
3922       { "PayloadDtmf", "skinny.payloadDtmf",
3923         FT_UINT32, BASE_DEC, NULL, 0x0,
3924         "RTP payload type.",
3925         HFILL }
3926     },
3927
3928     { &hf_skinny_featureID,
3929       { "FeatureID", "skinny.featureID",
3930         FT_UINT32, BASE_DEC, NULL, 0x0,
3931         "FeatureID.",
3932         HFILL }
3933     },
3934
3935     { &hf_skinny_featureTextLabel,
3936       { "FeatureTextLabel", "skinny.featureTextLabel",
3937         FT_STRING, BASE_NONE, NULL, 0x0,
3938         "The feature lable text that is displayed on the phone.",
3939         HFILL }
3940     },
3941
3942     { &hf_skinny_featureStatus,
3943       { "FeatureStatus", "skinny.featureStatus",
3944         FT_UINT32, BASE_DEC, NULL, 0x0,
3945         "FeatureStatus.",
3946         HFILL }
3947     },
3948
3949     { &hf_skinny_notify,
3950       { "Notify", "skinny.notify",
3951         FT_STRING, BASE_NONE, NULL, 0x0,
3952         "The message notify text that is displayed on the phone.",
3953         HFILL }
3954     },
3955
3956     { &hf_skinny_endOfAnnAck,
3957       { "EndOfAnnAck", "skinny.endOfAnnAck",
3958         FT_UINT32, BASE_DEC, VALS(skinny_endOfAnnAck), 0x0,
3959         "EndOfAnnAck",
3960         HFILL }
3961     },
3962
3963     { &hf_skinny_annPlayMode,
3964       { "annPlayMode", "skinny.annPlayMode",
3965         FT_UINT32, BASE_DEC, VALS(skinny_annPlayMode), 0x0,
3966         "AnnPlayMode",
3967         HFILL }
3968     },
3969
3970     { &hf_skinny_annPlayStatus,
3971       { "AnnPlayStatus", "skinny.annPlayStatus",
3972         FT_UINT32, BASE_DEC, VALS(skinny_annPlayStatus), 0x0,
3973         "AnnPlayStatus",
3974         HFILL }
3975     },
3976
3977     { &hf_skinny_locale,
3978       { "Locale", "skinny.locale",
3979         FT_UINT32, BASE_DEC, NULL, 0x0,
3980         "User locale ID.",
3981         HFILL }
3982     },
3983
3984     { &hf_skinny_country,
3985       { "Country", "skinny.country",
3986         FT_UINT32, BASE_DEC, NULL, 0x0,
3987         "Country ID (Network locale).",
3988         HFILL }
3989     },
3990
3991     { &hf_skinny_matrixConfPartyID,
3992       { "MatrixConfPartyID", "skinny.matrixConfPartyID",
3993         FT_UINT32, BASE_DEC, NULL, 0x0,
3994         "existing conference parties.",
3995         HFILL }
3996     },
3997
3998     { &hf_skinny_hearingConfPartyMask,
3999       { "HearingConfPartyMask", "skinny.hearingConfPartyMask",
4000         FT_UINT32, BASE_DEC, NULL, 0x0,
4001         "Bit mask of conference parties to hear media received on this stream.  Bit0 = matrixConfPartyID[0], Bit1 = matrixConfPartiID[1].",
4002         HFILL }
4003     },
4004
4005     { &hf_skinny_serviceURL,
4006       { "ServiceURL", "skinny.serviceURL",
4007         FT_STRING, BASE_NONE, NULL, 0x0,
4008         "ServiceURL.",
4009         HFILL }
4010     },
4011
4012     { &hf_skinny_serviceURLDisplayName,
4013       { "ServiceURLDisplayName", "skinny.serviceURLDisplayName",
4014         FT_STRING, BASE_NONE, NULL, 0x0,
4015         "ServiceURLDisplayName.",
4016         HFILL }
4017     },
4018
4019     { &hf_skinny_callSelectStat,
4020       { "CallSelectStat", "skinny.callSelectStat",
4021         FT_UINT32, BASE_DEC, NULL, 0x0,
4022         "CallSelectStat.",
4023         HFILL }
4024     },
4025
4026     { &hf_skinny_isConferenceCreator,
4027       { "IsConferenceCreator", "skinny.isConferenceCreator",
4028         FT_UINT32, BASE_DEC, NULL, 0x0,
4029         "IsConferenceCreator.",
4030         HFILL }
4031     },
4032
4033     { &hf_skinny_payload_rfc_number,
4034       { "Payload_rfc_number", "skinny.payload_rfc_number",
4035         FT_UINT32, BASE_DEC, NULL, 0x0,
4036         "Payload_rfc_number.",
4037         HFILL }
4038     },
4039
4040     { &hf_skinny_payloadType,
4041       { "PayloadType", "skinny.payloadType",
4042         FT_UINT32, BASE_DEC, NULL, 0x0,
4043         "PayloadType.",
4044         HFILL }
4045     },
4046
4047     { &hf_skinny_bitRate,
4048       { "BitRate", "skinny.bitRate",
4049         FT_UINT32, BASE_DEC, NULL, 0x0,
4050         "BitRate.",
4051         HFILL }
4052     },
4053
4054     { &hf_skinny_pictureFormatCount,
4055       { "PictureFormatCount", "skinny.pictureFormatCount",
4056         FT_UINT32, BASE_DEC, NULL, 0x0,
4057         "PictureFormatCount.",
4058         HFILL }
4059     },
4060
4061     { &hf_skinny_confServiceNum,
4062       { "ConfServiceNum", "skinny.confServiceNum",
4063         FT_UINT32, BASE_DEC, NULL, 0x0,
4064         "ConfServiceNum.",
4065         HFILL }
4066     },
4067
4068     { &hf_skinny_DSCPValue,
4069       { "DSCPValue", "skinny.DSCPValue",
4070         FT_UINT32, BASE_DEC, NULL, 0x0,
4071         "DSCPValue.",
4072         HFILL }
4073     },
4074
4075     { &hf_skinny_miscCommandType,
4076       { "MiscCommandType", "skinny.miscCommandType",
4077         FT_UINT32, BASE_DEC, VALS(skinny_miscCommandType), 0x0,
4078         "MiscCommandType",
4079         HFILL }
4080     },
4081
4082     { &hf_skinny_temporalSpatialTradeOff,
4083       { "TemporalSpatialTradeOff", "skinny.temporalSpatialTradeOff",
4084         FT_UINT32, BASE_DEC, NULL, 0x0,
4085         "TemporalSpatialTradeOff.",
4086         HFILL }
4087     },
4088
4089     { &hf_skinny_firstGOB,
4090       { "FirstGOB", "skinny.firstGOB",
4091         FT_UINT32, BASE_DEC, NULL, 0x0,
4092         "FirstGOB.",
4093         HFILL }
4094     },
4095
4096     { &hf_skinny_numberOfGOBs,
4097       { "NumberOfGOBs", "skinny.numberOfGOBs",
4098         FT_UINT32, BASE_DEC, NULL, 0x0,
4099         "NumberOfGOBs.",
4100         HFILL }
4101     },
4102
4103     { &hf_skinny_firstMB,
4104       { "FirstMB", "skinny.firstMB",
4105         FT_UINT32, BASE_DEC, NULL, 0x0,
4106         "FirstMB.",
4107         HFILL }
4108     },
4109
4110     { &hf_skinny_numberOfMBs,
4111       { "NumberOfMBs", "skinny.numberOfMBs",
4112         FT_UINT32, BASE_DEC, NULL, 0x0,
4113         "NumberOfMBs.",
4114         HFILL }
4115     },
4116
4117     { &hf_skinny_pictureNumber,
4118       { "PictureNumber", "skinny.pictureNumber",
4119         FT_UINT32, BASE_DEC, NULL, 0x0,
4120         "PictureNumber.",
4121         HFILL }
4122     },
4123
4124     { &hf_skinny_longTermPictureIndex,
4125       { "LongTermPictureIndex", "skinny.longTermPictureIndex",
4126         FT_UINT32, BASE_DEC, NULL, 0x0,
4127         "LongTermPictureIndex.",
4128         HFILL }
4129     },
4130
4131     { &hf_skinny_recoveryReferencePictureCount,
4132       { "RecoveryReferencePictureCount", "skinny.recoveryReferencePictureCount",
4133         FT_UINT32, BASE_DEC, NULL, 0x0,
4134         "RecoveryReferencePictureCount.",
4135         HFILL }
4136     },
4137
4138     { &hf_cast_lastRedirectingPartyName,
4139       { "LastRedirectingPartyName", "cast.lastRedirectingPartyName",
4140         FT_STRING, BASE_NONE, NULL, 0x0,
4141         "LastRedirectingPartyName.",
4142         HFILL }
4143     },
4144
4145     { &hf_cast_lastRedirectingParty,
4146       { "LastRedirectingParty", "cast.lastRedirectingParty",
4147         FT_STRING, BASE_NONE, NULL, 0x0,
4148         "LastRedirectingParty.",
4149         HFILL }
4150     },
4151
4152     { &hf_cast_cgpnVoiceMailbox,
4153       { "CgpnVoiceMailbox", "cast.cgpnVoiceMailbox",
4154         FT_STRING, BASE_NONE, NULL, 0x0,
4155         "CgpnVoiceMailbox.",
4156         HFILL }
4157     },
4158
4159     { &hf_cast_cdpnVoiceMailbox,
4160       { "CdpnVoiceMailbox", "cast.cdpnVoiceMailbox",
4161         FT_STRING, BASE_NONE, NULL, 0x0,
4162         "CdpnVoiceMailbox.",
4163         HFILL }
4164     },
4165
4166     { &hf_cast_originalCdpnVoiceMailbox,
4167       { "OriginalCdpnVoiceMailbox", "cast.originalCdpnVoiceMailbox",
4168         FT_STRING, BASE_NONE, NULL, 0x0,
4169         "OriginalCdpnVoiceMailbox.",
4170         HFILL }
4171     },
4172
4173     { &hf_cast_lastRedirectingVoiceMailbox,
4174       { "LastRedirectingVoiceMailbox", "cast.lastRedirectingVoiceMailbox",
4175         FT_STRING, BASE_NONE, NULL, 0x0,
4176         "LastRedirectingVoiceMailbox.",
4177         HFILL }
4178     },
4179
4180     { &hf_cast_originalCdpnRedirectReason,
4181       { "OriginalCdpnRedirectReason", "cast.originalCdpnRedirectReason",
4182         FT_UINT32, BASE_DEC, NULL, 0x0,
4183         "OriginalCdpnRedirectReason.",
4184         HFILL }
4185     },
4186
4187     { &hf_cast_lastRedirectingReason,
4188       { "LastRedirectingReason", "cast.lastRedirectingReason",
4189         FT_UINT32, BASE_DEC, NULL, 0x0,
4190         "LastRedirectingReason.",
4191         HFILL }
4192     },
4193
4194     { &hf_cast_callInstance,
4195       { "CallInstance", "cast.callInstance",
4196         FT_UINT32, BASE_DEC, NULL, 0x0,
4197         "CallInstance.",
4198         HFILL }
4199     },
4200
4201     { &hf_cast_callSecurityStatus,
4202       { "CallSecurityStatus", "cast.callSecurityStatus",
4203         FT_UINT32, BASE_DEC, VALS(cast_callSecurityStatusTypes), 0x0,
4204         "CallSecurityStatus.",
4205         HFILL }
4206     },
4207
4208   };
4209
4210   /* Setup protocol subtree array */
4211   static gint *ett[] = {
4212     &ett_skinny,
4213     &ett_skinny_tree,
4214     &ett_skinny_softKeyMap,
4215   };
4216
4217   module_t *skinny_module;
4218
4219   /* Register the protocol name and description */
4220   proto_skinny = proto_register_protocol("Skinny Client Control Protocol",
4221                                          "SKINNY", "skinny");
4222
4223   /* Required function calls to register the header fields and subtrees used */
4224   proto_register_field_array(proto_skinny, hf, array_length(hf));
4225   proto_register_subtree_array(ett, array_length(ett));
4226
4227   skinny_module = prefs_register_protocol(proto_skinny, NULL);
4228   prefs_register_bool_preference(skinny_module, "desegment",
4229     "Desegment all SCCP messages spanning multiple TCP segments",
4230     "Whether the SCCP dissector should desegment all messages spanning multiple TCP segments",
4231     &skinny_desegment);
4232 }
4233
4234 void
4235 proto_reg_handoff_skinny(void)
4236 {
4237   dissector_handle_t skinny_handle;
4238
4239   data_handle = find_dissector("data");
4240   skinny_handle = create_dissector_handle(dissect_skinny, proto_skinny);
4241   dissector_add("tcp.port", TCP_PORT_SKINNY, skinny_handle);
4242 }
4243
4244 /*
4245  * FIXME:
4246  *
4247  * This is the status of this decode.
4248  * Items marked as N/A in the decode field have no params to test
4249  * implemented for N/A means they exist in the switch statement
4250  * S = stubbed
4251  *
4252  *  id     message                     implemented  decode tested (via capture)
4253  *  ---------------------------------------------------------------------------
4254  *  0x0    keepAlive                       Y        N/A
4255  *  0x1    register                        Y        Y
4256  *  0x2    ipPort                          Y        Y
4257  *  0x3    keypadButton                    Y        Y
4258  *  0x4    enblocCall                      Y        N
4259  *  0x5    stimulus                        Y        N
4260  *  0x6    offHook                         Y        N/A
4261  *  0x7    onHook                          Y        N/A
4262  *  0x8    hookFlash                       Y        N/A
4263  *  0x9    forwardStatReq                  Y        N
4264  *  0xa    speedDialStatReq                Y        Y
4265  *  0xb    lineStatReq                     Y        Y
4266  *  0xc    configStatReq                   Y        N/A
4267  *  0xd    timeDateReq                     Y        N/A
4268  *  0xe    buttonTemplateReq               Y        N/A
4269  *  0xf    versionReq                      Y        N/A
4270  *  0x10   capabilitiesRes                 Y        Y -- would like more decodes
4271  *  0x11   mediaPortList                   S        N -- no info
4272  *  0x12   serverReq                       Y        N/A
4273  *  0x20   alarmMessage                    Y        Y
4274  *  0x21   multicastMediaReceptionAck      Y        N
4275  *  0x22   openReceiveChannelAck           Y        Y
4276  *  0x23   connectionStatisticsRes         Y        Y
4277  *  0x24   offHookWithCgpn                 Y        N
4278  *  0x25   softKeySetReq                   Y        N/A
4279  *  0x26   softKeyEvent                    Y        Y
4280  *  0x27   unregister                      Y        N/A
4281  *  0x28   softKeytemplateReq              Y        N/A
4282  *  0x29   registerTokenReq                Y        N
4283  *  0x2A   mediaTransmissionFailure
4284  *  0x2B   headsetStatus
4285  *  0x2C   mediaResourceNotification
4286  *  0x2D   registerAvailableLines
4287  *  0x2E   deviceToUserData
4288  *  0x2F   deviceToUserDataResponse
4289  *  0x30   updateCapabilities
4290  *  0x31   openMultiMediaReceiveChannelAck
4291  *  0x32   clearConference
4292  *  0x33   serviceURLStatReq
4293  *  0x34   featureStatReq
4294  *  0x35   createConferenceRes
4295  *  0x36   deleteConferenceRes
4296  *  0x37   modifyConferenceRes
4297  *  0x38   addParticipantRes
4298  *  0x39   auditConferenceRes
4299  *  0x40   auditParticipantRes
4300  *  0x41   deviceToUserDataVersion1
4301  *  0x42   deviceToUserDataResponseVersion1
4302  *  0x81   registerAck                     Y        Y
4303  *  0x82   startTone                       Y        Y
4304  *  0x83   stopTone                        Y        N/A
4305  *  0x85   setRinger                       Y        Y
4306  *  0x86   setLamp                         Y        Y
4307  *  0x87   setHkFDetect                    Y        N
4308  *  0x88   setSpeakerMode                  Y        Y
4309  *  0x89   setMicroMode                    Y        N
4310  *  0x8A   startMediaTransmission          Y        Y
4311  *  0x8B   stopMediaTransmission           Y        Y
4312  *  0x8C   startMediaReception             S        N
4313  *  0x8D   stopMediaReception              S        N
4314  *  0x8E   *reserved*                      S        *
4315  *  0x8F   callInfo                        Y        Y
4316  *  0x90   forwardStat                     Y        N
4317  *  0x91   speedDialStat                   Y        Y
4318  *  0x92   lineStat                        Y        Y
4319  *  0x93   configStat                      Y        N
4320  *  0x94   defineTimeDate                  Y        Y
4321  *  0x95   startSessionTransmission        Y        N
4322  *  0x96   stopSessionTransmission         Y        N
4323  *  0x97   buttonTemplate                  Y        Y -- ugly =)
4324  *  0x98   version                         Y        N
4325  *  0x99   displayText                     Y        Y
4326  *  0x9A   clearDisplay                    Y        N/A
4327  *  0x9B   capabilitiesReq                 Y        N/A
4328  *  0x9C   enunciatorCommand               Y        N (inner loop unknown)
4329  *  0x9D   registerReject                  Y        N
4330  *  0x9E   serverRes                       Y        N
4331  *  0x9F   reset                           Y        Y
4332  *  0x100  keepAliveAck                    Y        N/A
4333  *  0x101  startMulticastMediaReception    Y        N
4334  *  0x102  startMulticastMediaTransmission Y        N
4335  *  0x103  stopMulticastMediaReception     Y        N
4336  *  0x104  stopMulticastMediaTransmission  Y        N
4337  *  0x105  openreceiveChannel              Y        Y
4338  *  0x106  closeReceiveChannel             Y        Y
4339  *  0x107  connectionStatisticsReq         Y        Y
4340  *  0x108  softKeyTemplateRes              Y        Y
4341  *  0x109  softKeySetRes                   Y        Y
4342  *  0x110  selectSoftKeys                  Y        Y
4343  *  0x111  callState                       Y        Y
4344  *  0x112  displayPromptStatus             Y        Y
4345  *  0x113  clearPromptStatus               Y        Y
4346  *  0x114  displayNotify                   Y        Y
4347  *  0x115  clearNotify                     Y        Y
4348  *  0x116  activateCallPlane               Y        Y
4349  *  0x117  deactivateCallPlane             Y        N/A
4350  *  0x118  unregisterAck                   Y        Y
4351  *  0x119  backSpaceReq                    Y        Y
4352  *  0x11A  registerTokenAck                Y        N
4353  *  0x11B  registerTokenReject             Y        N
4354  *  0x11C  startMediaFailureDetection
4355  *  0x11D  dialedNumber
4356  *  0x11E  userToDeviceData
4357  *  0x11F  featureStat
4358  *  0x120  displayPriNotify
4359  *  0x121  clearPriNotify
4360  *  0x122  startAnnouncement
4361  *  0x123  stopAnnouncement
4362  *  0x124  announcementFinish
4363  *  0x127  notifyDtmfTone
4364  *  0x128  sendDtmfTone
4365  *  0x129  subscribeDtmfPayloadReq
4366  *  0x12A  subscribeDtmfPayloadRes
4367  *  0x12B  subscribeDtmfPayloadErr
4368  *  0x12C  unSubscribeDtmfPayloadReq
4369  *  0x12D  unSubscribeDtmfPayloadRes
4370  *  0x12E  unSubscribeDtmfPayloadErr
4371  *  0x12F  serviceURLStat
4372  *  0x130  callSelectStat
4373  *  0x131  openMultiMediaChannel
4374  *  0x132  startMultiMediaTransmission
4375  *  0x133  stopMultiMediaTransmission
4376  *  0x134  miscellaneousCommand
4377  *  0x135  flowControlCommand
4378  *  0x136  closeMultiMediaReceiveChannel
4379  *  0x137  createConferenceReq
4380  *  0x138  deleteConferenceReq
4381  *  0x139  modifyConferenceReq
4382  *  0x13A  addParticipantReq
4383  *  0x13B  dropParticipantReq
4384  *  0x13C  auditConferenceReq
4385  *  0x13D  auditParticipantReq
4386  *  0x13F  userToDeviceDataVersion1
4387  *
4388  *
4389  */