HACK: 2nd try to match RowsetProperties
[wireshark-wip.git] / epan / dissectors / packet-skinny.c
blobacbb60ae4a15355e26a1acf66a9cc357a3d48a81
1 /* packet-skinny.c
3 * Dissector for the Skinny Client Control Protocol
4 * (The "D-Channel"-Protocol for Cisco Systems' IP-Phones)
5 * Copyright 2001, Joerg Mayer (see AUTHORS file)
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 wireshark api.
11 * This file is based on packet-aim.c, which is
12 * Copyright 2000, Ralf Hoelzer <ralf@well.com>
14 * $Id$
16 * Wireshark - Network traffic analyzer
17 * By Gerald Combs <gerald@wireshark.org>
18 * Copyright 1998 Gerald Combs
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.
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.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
35 /* This implementation is based on a draft version of the 3.0
36 * specification
39 #include "config.h"
41 #include <epan/packet.h>
42 #include <epan/prefs.h>
43 #include <epan/tap.h>
45 #include "packet-rtp.h"
46 #include "packet-tcp.h"
47 #include "packet-ssl.h"
48 #include "packet-skinny.h"
50 #define TCP_PORT_SKINNY 2000
51 #define SSL_PORT_SKINNY 2443 /* IANA assigned to PowerClient Central Storage Facility */
53 #define SKINNY_SOFTKEY0 0x01
54 #define SKINNY_SOFTKEY1 0x02
55 #define SKINNY_SOFTKEY2 0x04
56 #define SKINNY_SOFTKEY3 0x08
57 #define SKINNY_SOFTKEY4 0x10
58 #define SKINNY_SOFTKEY5 0x20
59 #define SKINNY_SOFTKEY6 0x40
60 #define SKINNY_SOFTKEY7 0x80
61 #define SKINNY_SOFTKEY8 0x100
62 #define SKINNY_SOFTKEY9 0x200
63 #define SKINNY_SOFTKEY10 0x400
64 #define SKINNY_SOFTKEY11 0x800
65 #define SKINNY_SOFTKEY12 0x1000
66 #define SKINNY_SOFTKEY13 0x2000
67 #define SKINNY_SOFTKEY14 0x4000
68 #define SKINNY_SOFTKEY15 0x8000
70 /* KeyMap Show/No Show */
71 static const true_false_string softKeyMapValues = {
72 "Show",
73 "Do Not Show"
76 #define BASIC_MSG_TYPE 0x00
77 #define CM7_MSG_TYPE_A 0x12
78 #define CM7_MSG_TYPE_B 0x11
79 #define CM7_MSG_TYPE_C 0x14
80 #define CM7_MSG_TYPE_D 0x16
82 static const value_string header_version[] = {
83 { BASIC_MSG_TYPE, "Basic" },
84 { CM7_MSG_TYPE_A, "CM7 type A" },
85 { CM7_MSG_TYPE_B, "CM7 type B" },
86 { CM7_MSG_TYPE_C, "CM7 type C" },
87 { CM7_MSG_TYPE_D, "CM7 type SPCP" },
88 { 0 , NULL }
91 /* I will probably need this again when I change things
92 * to function pointers, but let me use the existing
93 * infrastructure for now
95 * typedef struct {
96 * guint32 id;
97 * char *name;
98 * } message_id_t;
101 static const value_string message_id[] = {
103 /* Station -> Callmanager */
104 {0x0000, "KeepAliveMessage"},
105 {0x0001, "RegisterMessage"},
106 {0x0002, "IpPortMessage"},
107 {0x0003, "KeypadButtonMessage"},
108 {0x0004, "EnblocCallMessage"},
109 {0x0005, "StimulusMessage"},
110 {0x0006, "OffHookMessage"},
111 {0x0007, "OnHookMessage"},
112 {0x0008, "HookFlashMessage"},
113 {0x0009, "ForwardStatReqMessage"},
114 {0x000A, "SpeedDialStatReqMessage"},
115 {0x000B, "LineStatReqMessage"},
116 {0x000C, "ConfigStatReqMessage"},
117 {0x000D, "TimeDateReqMessage"},
118 {0x000E, "ButtonTemplateReqMessage"},
119 {0x000F, "VersionReqMessage"},
120 {0x0010, "CapabilitiesResMessage"},
121 {0x0011, "MediaPortListMessage"},
122 {0x0012, "ServerReqMessage"},
123 {0x0020, "AlarmMessage"},
124 {0x0021, "MulticastMediaReceptionAck"},
125 {0x0022, "OpenReceiveChannelAck"},
126 {0x0023, "ConnectionStatisticsRes"},
127 {0x0024, "OffHookWithCgpnMessage"},
128 {0x0025, "SoftKeySetReqMessage"},
129 {0x0026, "SoftKeyEventMessage"},
130 {0x0027, "UnregisterMessage"},
131 {0x0028, "SoftKeyTemplateReqMessage"},
132 {0x0029, "RegisterTokenReq"},
133 {0x002A, "MediaTransmissionFailure"},
134 {0x002B, "HeadsetStatusMessage"},
135 {0x002C, "MediaResourceNotification"},
136 {0x002D, "RegisterAvailableLinesMessage"},
137 {0x002E, "DeviceToUserDataMessage"},
138 {0x002F, "DeviceToUserDataResponseMessage"},
139 {0x0030, "UpdateCapabilitiesMessage"},
140 {0x0031, "OpenMultiMediaReceiveChannelAckMessage"},
141 {0x0032, "ClearConferenceMessage"},
142 {0x0033, "ServiceURLStatReqMessage"},
143 {0x0034, "FeatureStatReqMessage"},
144 {0x0035, "CreateConferenceResMessage"},
145 {0x0036, "DeleteConferenceResMessage"},
146 {0x0037, "ModifyConferenceResMessage"},
147 {0x0038, "AddParticipantResMessage"},
148 {0x0039, "AuditConferenceResMessage"},
149 {0x0040, "AuditParticipantResMessage"},
150 {0x0041, "DeviceToUserDataVersion1Message"},
151 {0x0042, "DeviceToUserDataResponseVersion1Message"},
152 {0x0044, "DynUpdateCapabilitiesMessage"},
153 {0x0048, "DialedPhoneBookMessage"},
154 {0x0049, "AccessoryStatusMessage"},
155 {0x004A, "Unknown_Message_0x004A"},
156 {0x004C, "MwiNotificationMessage"},
158 /* Callmanager -> Station */
159 /* 0x0000, 0x0003? */
160 {0x0081, "RegisterAckMessage"},
161 {0x0082, "StartToneMessage"},
162 {0x0083, "StopToneMessage"},
163 {0x0085, "SetRingerMessage"},
164 {0x0086, "SetLampMessage"},
165 {0x0087, "SetHkFDetectMessage"},
166 {0x0088, "SetSpeakerModeMessage"},
167 {0x0089, "SetMicroModeMessage"},
168 {0x008A, "StartMediaTransmission"},
169 {0x008B, "StopMediaTransmission"},
170 {0x008C, "StartMediaReception"},
171 {0x008D, "StopMediaReception"},
172 {0x008F, "CallInfoMessage"},
173 {0x0090, "ForwardStatMessage"},
174 {0x0091, "SpeedDialStatMessage"},
175 {0x0092, "LineStatMessage"},
176 {0x0093, "ConfigStatMessage"},
177 {0x0094, "DefineTimeDate"},
178 {0x0095, "StartSessionTransmission"},
179 {0x0096, "StopSessionTransmission"},
180 {0x0097, "ButtonTemplateMessage"},
181 {0x0098, "VersionMessage"},
182 {0x0099, "DisplayTextMessage"},
183 {0x009A, "ClearDisplay"},
184 {0x009B, "CapabilitiesReqMessage"},
185 {0x009C, "EnunciatorCommandMessage"},
186 {0x009D, "RegisterRejectMessage"},
187 {0x009E, "ServerResMessage"},
188 {0x009F, "Reset"},
189 {0x0100, "KeepAliveAckMessage"},
190 {0x0101, "StartMulticastMediaReception"},
191 {0x0102, "StartMulticastMediaTransmission"},
192 {0x0103, "StopMulticastMediaReception"},
193 {0x0104, "StopMulticastMediaTransmission"},
194 {0x0105, "OpenReceiveChannel"},
195 {0x0106, "CloseReceiveChannel"},
196 {0x0107, "ConnectionStatisticsReq"},
197 {0x0108, "SoftKeyTemplateResMessage"},
198 {0x0109, "SoftKeySetResMessage"},
199 {0x0110, "SelectSoftKeysMessage"},
200 {0x0111, "CallStateMessage"},
201 {0x0112, "DisplayPromptStatusMessage"},
202 {0x0113, "ClearPromptStatusMessage"},
203 {0x0114, "DisplayNotifyMessage"},
204 {0x0115, "ClearNotifyMessage"},
205 {0x0116, "ActivateCallPlaneMessage"},
206 {0x0117, "DeactivateCallPlaneMessage"},
207 {0x0118, "UnregisterAckMessage"},
208 {0x0119, "BackSpaceReqMessage"},
209 {0x011A, "RegisterTokenAck"},
210 {0x011B, "RegisterTokenReject"},
212 {0x011C, "StartMediaFailureDetection"},
213 {0x011D, "DialedNumberMessage"},
214 {0x011E, "UserToDeviceDataMessage"},
215 {0x011F, "FeatureStatMessage"},
216 {0x0120, "DisplayPriNotifyMessage"},
217 {0x0121, "ClearPriNotifyMessage"},
218 {0x0122, "StartAnnouncementMessage"},
219 {0x0123, "StopAnnouncementMessage"},
220 {0x0124, "AnnouncementFinishMessage"},
221 {0x0127, "NotifyDtmfToneMessage"},
222 {0x0128, "SendDtmfToneMessage"},
223 {0x0129, "SubscribeDtmfPayloadReqMessage"},
224 {0x012A, "SubscribeDtmfPayloadResMessage"},
225 {0x012B, "SubscribeDtmfPayloadErrMessage"},
226 {0x012C, "UnSubscribeDtmfPayloadReqMessage"},
227 {0x012D, "UnSubscribeDtmfPayloadResMessage"},
228 {0x012E, "UnSubscribeDtmfPayloadErrMessage"},
229 {0x012F, "ServiceURLStatMessage"},
230 {0x0130, "CallSelectStatMessage"},
231 {0x0131, "OpenMultiMediaChannelMessage"},
232 {0x0132, "StartMultiMediaTransmission"},
233 {0x0133, "StopMultiMediaTransmission"},
234 {0x0134, "MiscellaneousCommandMessage"},
235 {0x0135, "FlowControlCommandMessage"},
236 {0x0136, "CloseMultiMediaReceiveChannel"},
237 {0x0137, "CreateConferenceReqMessage"},
238 {0x0138, "DeleteConferenceReqMessage"},
239 {0x0139, "ModifyConferenceReqMessage"},
240 {0x013A, "AddParticipantReqMessage"},
241 {0x013B, "DropParticipantReqMessage"},
242 {0x013C, "AuditConferenceReqMessage"},
243 {0x013D, "AuditParticipantReqMessage"},
244 {0x013F, "UserToDeviceDataVersion1Message"},
245 {0x0140, "VideoDisplayCommandMessage"},
246 {0x0141, "Unknown_Message_0x0141"},
248 /* Dynamic Length Messages */
249 {0x0143, "DynDisplayNotifyMessage"},
250 {0x0144, "DynDisplayPriNotifyMessage"},
251 {0x0145, "DynDisplayPromptStatusMessage"},
252 {0x0146, "DynFeatureStatMessage"},
253 {0x0147, "DynLineStatMessage"},
254 {0x0148, "DynServiceURLStatMessage"},
255 {0x0149, "DynSpeedDialStatMessage"},
256 {0x014A, "DynCallInfoMessage"},
257 /* End Dynamic Length Messages */
259 {0x0152, "DialedPhoneBookAckMessage"},
260 {0x0153, "CallListStateUpdate"},
261 {0x0154, "StartMediaTransmissionAck"},
262 {0x0155, "StartMultiMediaTransmissionAck"},
263 {0x0156, "CallHistoryInfoMessage"},
264 {0x0159, "ExtensionDeviceCaps"},
265 {0x015A, "XMLAlarmMessage"},
266 {0x015E, "Unknown_Message_0x015E"},
268 /* SPCP Messages (SubClass of SCCP Messages ) */
269 /* Station -> Callmanager */
270 {0x8000, "SPCPRegisterTokenRequest"},
272 /* Callmanager -> Station */
273 {0x8100, "SPCPRegisterTokenAck"},
274 {0x8101, "SPCPRegisterTokenReject"},
276 {0 , NULL} /* terminator */
278 static value_string_ext message_id_ext = VALUE_STRING_EXT_INIT(message_id);
281 * Device type to text conversion table
283 static const value_string deviceTypes[] = {
284 {1, "30SPplus"},
285 {2, "12SPplus"},
286 {3, "12SP"},
287 {4, "12"},
288 {5, "30VIP"},
289 {6, "Cisco 7910"}, /* {6 , "Telecaster"}, */
290 {7, "Cisco 7960"}, /* {7 , "TelecasterMgr"}, */
291 {8, "Cisco 7940"}, /* {8 , "TelecasterBus"}, */
292 {9, "Cisco 7935"}, /* {9 , "Polycom"}, */
293 {10, "VGC"},
294 {12, "ATA"},
295 {20, "Virtual30SPplus"},
296 {21, "PhoneApplication"},
297 {30, "AnalogAccess"},
298 {40, "DigitalAccessPRI"},
299 {41, "DigitalAccessT1"},
300 {42, "DigitalAccessTitan2"},
301 {43, "DigitalAccessLennon"},
302 {47, "AnalogAccessElvis"},
303 {50, "ConferenceBridge"},
304 {51, "ConferenceBridgeYoko"},
305 {52, "ConferenceBridgeDixieLand"},
306 {53, "ConferenceBridgeSummit"},
307 {60, "H225"},
308 {61, "H323Phone"},
309 {62, "H323Trunk"},
310 {70, "MusicOnHold"},
311 {71, "Pilot"},
312 {72, "TapiPort"},
313 {73, "TapiRoutePoint"},
314 {80, "VoiceInBox"},
315 {81, "VoiceInboxAdmin"},
316 {82, "LineAnnunciator"},
317 {83, "SoftwareMtpDixieLand"},
318 {84, "CiscoMediaServer"},
319 {85, "ConferenceBridgeFlint"},
320 {90, "RouteList"},
321 {100, "LoadSimulator"},
322 {110, "MediaTerminationPoint"},
323 {111, "MediaTerminationPointYoko"},
324 {112, "MediaTerminationPointDixieLand"},
325 {113, "MediaTerminationPointSummit"},
326 {115, "Cisco 7941"},
327 {119, "Cisco 7971"},
328 {120, "MGCPStation"},
329 {121, "MGCPTrunk"},
330 {122, "RASProxy"},
331 {124, "Cisco 7914"},
332 {125, "Trunk"},
333 {126, "Annunciator"},
334 {127, "MonitorBridge"},
335 {128, "Recorder"},
336 {129, "MonitorBridgeYoko"},
337 {131, "SipTrunk"},
338 {227, "Cisco 7915 (12BUTTONS)"},
339 {228, "Cisco 7915"},
340 {229, "Cisco 7916 (12BUTTONS)"},
341 {230, "Cisco 7916"},
342 {254, "UnknownMGCPGateway"},
343 {255, "NotDefined"},
344 {275, "Nokia E-Series"},
345 {302, "Cisco 7985"},
346 {307, "Cisco 7911"},
347 {308, "Cisco 7961GE"},
348 {309, "Cisco 7941GE"},
349 {348, "Cisco 7931"},
350 {365, "Cisco 7921"},
351 {369, "Cisco 7906"},
352 {376, "Nokia Mobile"},
353 {404, "Cisco 7962"},
354 {431, "Cisco 7937"},
355 {434, "Cisco 7942"},
356 {435, "Cisco 7945"},
357 {436, "Cisco 7965"},
358 {437, "Cisco 7975"},
359 {484, "Cisco 7925"},
360 {495, "Cisco 6921"},
361 {496, "Cisco 6941"},
362 {497, "Cisco 6961"},
363 {540, "Cisco 8961"},
364 {547, "Cisco 6901"},
365 {548, "Cisco 6911"},
366 {564, "Cisco 6945"},
367 {585, "Cisco 8945"},
368 {586, "Cisco 8941"},
369 {20000, "Cisco 7905"},
370 {30002, "Cisco 7920"},
371 {30006, "Cisco 7970"},
372 {30007, "Cisco 7912"},
373 {30008, "Cisco 7902"},
374 {30016, "Cisco IP Communicator"},
375 {30018, "Cisco 7961"},
376 {30019, "Cisco 7936"},
377 {30027, "Cisco Gateway AN"},
378 {30028, "Cisco Gateway BRI"},
379 {80000, "Linksys SPA521S"},
380 {80005, "Linksys SPA525G"},
381 {80009, "Linksys SPA525G2"},
383 { 0 , NULL}
385 static value_string_ext deviceTypes_ext = VALUE_STRING_EXT_INIT(deviceTypes);
388 * keypad button -> text conversion
390 static const value_string keypadButtons[] = {
391 {0x0 , "Zero"},
392 {0x1 , "One"},
393 {0x2 , "Two"},
394 {0x3 , "Three"},
395 {0x4 , "Four"},
396 {0x5 , "Five"},
397 {0x6 , "Six"},
398 {0x7 , "Seven"},
399 {0x8 , "Eight"},
400 {0x9 , "Nine"},
401 {0xa , "A"},
402 {0xb , "B"},
403 {0xc , "C"},
404 {0xd , "D"},
405 {0xe , "Star"},
406 {0xf , "Pound"},
407 {0 , NULL}
409 static value_string_ext keypadButtons_ext = VALUE_STRING_EXT_INIT(keypadButtons);
411 static const value_string deviceStimuli[] = {
412 {0x1 , "LastNumberRedial"},
413 {0x2 , "SpeedDial"},
414 {0x3 , "Hold"},
415 {0x4 , "Transfer"},
416 {0x5 , "ForwardAll"},
417 {0x6 , "ForwardBusy"},
418 {0x7 , "ForwardNoAnswer"},
419 {0x8 , "Display"},
420 {0x9 , "Line"},
421 {0xa , "T120Chat"},
422 {0xb , "T120Whiteboard"},
423 {0xc , "T120ApplicationSharing"},
424 {0xd , "T120FileTransfer"},
425 {0xe , "Video"},
426 {0xf , "VoiceMail"},
427 {0x10 , "AutoAnswerRelease"},
428 {0x11 , "AutoAnswer"},
429 {0x12 , "Select"},
430 {0x13 , "Privacy"},
431 {0x14 , "ServiceURL"},
432 {0x1B , "MaliciousCall"},
433 {0x21 , "GenericAppB1"},
434 {0x22 , "GenericAppB2"},
435 {0x23 , "GenericAppB3"},
436 {0x24 , "GenericAppB4"},
437 {0x25 , "GenericAppB5"},
438 {0x7b , "MeetMeConference"},
439 {0x7d , "Conference"},
440 {0x7e , "CallPark"},
441 {0x7f , "CallPickup"},
442 {0x80 , "GroupCallPickup"},
443 {0,NULL}
445 static value_string_ext deviceStimuli_ext = VALUE_STRING_EXT_INIT(deviceStimuli);
448 /* Note i'm only using 7 later on cuz i'm lazy ;) */
449 #define DeviceMaxCapabilities 18 /* max capabilities allowed in Cap response message */
451 static const value_string mediaPayloads[] = {
452 {1 , "Non-standard codec"},
453 {2 , "G.711 A-law 64k"},
454 {3 , "G.711 A-law 56k"},
455 {4 , "G.711 u-law 64k"},
456 {5 , "G.711 u-law 56k"},
457 {6 , "G.722 64k"},
458 {7 , "G.722 56k"},
459 {8 , "G.722 48k"},
460 {9 , "G.723.1"},
461 {10 , "G.728"},
462 {11 , "G.729"},
463 {12 , "G.729 Annex A"},
464 {13 , "IS11172 AudioCap"}, /* IS11172 is an ISO MPEG standard */
465 {14 , "IS13818 AudioCap"}, /* IS13818 is an ISO MPEG standard */
466 {15 , "G.729 Annex B"},
467 {16 , "G.729 Annex A+Annex B"},
468 {18 , "GSM Full Rate"},
469 {19 , "GSM Half Rate"},
470 {20 , "GSM Enhanced Full Rate"},
471 {25 , "Wideband 256k"},
472 {32 , "Data 64k"},
473 {33 , "Data 56k"},
474 {80 , "GSM"},
475 {81 , "ActiveVoice"},
476 {82 , "G.726 32K"},
477 {83 , "G.726 24K"},
478 {84 , "G.726 16K"},
479 {85 , "G.729B"},
480 {86 , "G.729B Low Complexity"},
481 {100 , "H261"},
482 {101 , "H263"},
483 {102 , "Video"},
484 {105 , "T120"},
485 {106 , "H224"},
486 {257 , "RFC2833_DynPayload"},
487 {0 , NULL}
489 static value_string_ext mediaPayloads_ext = VALUE_STRING_EXT_INIT(mediaPayloads);
491 static const value_string alarmSeverities[] = {
492 {0 , "Critical"},
493 {1 , "Warning"},
494 {2 , "Informational"},
495 {4 , "Unknown"},
496 {7 , "Major"},
497 {8 , "Minor"},
498 {10 , "Marginal"},
499 {20 , "TraceInfo"},
500 {0 , NULL}
502 static value_string_ext alarmSeverities_ext = VALUE_STRING_EXT_INIT(alarmSeverities);
504 static const value_string multicastMediaReceptionStatus[] = {
505 {0 , "Ok"},
506 {1 , "Error"},
507 {0 , NULL}
510 static const value_string openReceiveChanStatus[] = {
511 {0 , "orcOk"},
512 {1 , "orcError"},
513 {0 , NULL}
516 static const value_string ipVersion[] = {
517 {0 , "IPv4"},
518 {1 , "IPv6"}, /*Assume IPv6 will be set to be "1"*/
519 {0 , NULL}
522 static const value_string statsProcessingTypes[] = {
523 {0 , "clearStats"},
524 {1 , "doNotClearStats"},
525 {0 , NULL}
528 #define SkMaxSoftKeyCount 18 /* this value should be the same as the max soft key value */
529 static const value_string softKeyEvents[] = {
530 {1 , "Redial"},
531 {2 , "NewCall"},
532 {3 , "Hold"},
533 {4 , "Transfer"},
534 {5 , "CFwdAll"},
535 {6 , "CFwdBusy"},
536 {7 , "CFwdNoAnswer"},
537 {8 , "BackSpace"},
538 {9 , "EndCall"},
539 {10 , "Resume"},
540 {11 , "Answer"},
541 {12 , "Info"},
542 {13 , "Confrn"},
543 {14 , "Park"},
544 {15 , "Join"},
545 {16 , "MeetMeConfrn"},
546 {17 , "CallPickUp"},
547 {18 , "GrpCallPickUp"},
548 {0 , NULL}
550 static value_string_ext softKeyEvents_ext = VALUE_STRING_EXT_INIT(softKeyEvents);
552 /* Define info index for each softkey event for Telecaster station. */
553 static const value_string softKeyIndexes[] = {
554 {301 , "RedialInfoIndex"},
555 {302 , "NewCallInfoIndex"},
556 {303 , "HoldInfoIndex"},
557 {304 , "TrnsferInfoIndex"},
558 {305 , "CFwdAllInfoIndex"},
559 {306 , "CFwdBusyInfoIndex"}, /* not used yet */
560 {307 , "CFwdNoAnswerInfoIndex"}, /* not used yet */
561 {308 , "BackSpaceInfoIndex"},
562 {309 , "EndCallInfoIndex"},
563 {310 , "ResumeInfoIndex"},
564 {311 , "AnswerInfoIndex"},
565 {312 , "InfoInfoIndex"},
566 {313 , "ConfrnInfoIndex"},
567 {314 , "ParkInfoIndex"},
568 {315 , "JoinInfoIndex"},
569 {316 , "MeetMeConfrnInfoIndex"},
570 {317 , "CallPickUpInfoIndex"},
571 {318 , "GrpCallPickUpInfoIndex"},
572 {0 , NULL}
574 static value_string_ext softKeyIndexes_ext = VALUE_STRING_EXT_INIT(softKeyIndexes);
577 static const value_string buttonDefinitions[] = {
578 {0x01 , "LastNumberRedial"},
579 {0x02 , "SpeedDial"},
580 {0x03 , "Hold"},
581 {0x04 , "Transfer"},
582 {0x05 , "ForwardAll"},
583 {0x06 , "ForwardBusy"},
584 {0x07 , "ForwardNoAnswer"},
585 {0x08 , "Display"},
586 {0x09 , "Line"},
587 {0x0A , "T120Chat"},
588 {0x0B , "T120Whiteboard"},
589 {0x0C , "T120ApplicationSharing"},
590 {0x0D , "T120FileTransfer"},
591 {0x0E , "Video"},
592 {0x0F , "Voicemail"},
593 {0x10 , "AnswerRelease"},
594 {0x11 , "Auto Answer"},
595 {0x13 , "Feature"},
596 {0x14 , "ServiceUrl"},
597 {0x15 , "BLF Speeddial"},
598 {0x21 , "Generic App B1"},
599 {0x22 , "Generic App B2"},
600 {0x23 , "Generic App B3"},
601 {0x24 , "Generic App B4"},
602 {0x25 , "Generic App B5"},
603 {0x26 , "Monitor/Multiblink"},
604 {0x7B , "Meet Me Conference"},
605 {0x7D , "Conference"},
606 {0x7E , "Call Park"},
607 {0x7F , "Call Pickup"},
608 {0x80 , "Group Call Pickup"},
609 {0x81 , "Mobility"},
610 {0x82 , "Test 6"},
611 {0x85 , "Test 8"},
612 {0x86 , "Test 9"},
613 {0x87 , "Test A"},
614 {0x88 , "Test B"},
615 {0x89 , "Test C"},
616 {0x8A , "Test D"},
617 {0x8B , "Test 7"},
618 {0xC0 , "Test E"},
619 {0xC1 , "Test F"},
620 {0xC2 , "Messages"},
621 {0xC3 , "Directory"},
622 {0xC4 , "Test I"},
623 {0xC5 , "Application"},
624 {0xC6 , "Headset"},
625 {0xF0 , "Keypad"},
626 {0xFD , "AEC"},
627 {0xFF , "Undefined"},
628 {0 , NULL}
630 static value_string_ext buttonDefinitions_ext = VALUE_STRING_EXT_INIT(buttonDefinitions);
632 #define StationTotalSoftKeySets 10 /* total number of the soft key sets */
633 static const value_string keySetNames[] = {
634 {0 , "OnHook"},
635 {1 , "Connected"},
636 {2 , "OnHold"},
637 {3 , "RingIn"},
638 {4 , "OffHook"},
639 {5 , "Connected with transfer"},
640 {6 , "Digits after dialing first digit"},
641 {7 , "Connected with conference"},
642 {8 , "RingOut"},
643 {9 , "OffHook with features"},
644 {0 , NULL}
646 static value_string_ext keySetNames_ext = VALUE_STRING_EXT_INIT(keySetNames);
648 #if 0
649 /* Define soft key labels for the Telecaster station */
650 static const value_string softKeyLabel[] _U_ = {
651 {0 , "undefined"},
652 {1 , "Redial"},
653 {2 , "NewCall"},
654 {3 , "Hold"},
655 {4 , "Trnsfer"},
656 {5 , "CFwdAll"},
657 {6 , "CFwdBusy"},
658 {7 , "CFwdNoAnswer"},
659 {8 , "<<"},
660 {9 , "EndCall"},
661 {10 , "Resume"},
662 {11 , "Answer"},
663 {12 , "Info"},
664 {13 , "Confrn"},
665 {14 , "Park"},
666 {15 , "Join"},
667 {16 , "MeetMe"},
668 {17 , "PickUp"},
669 {18 , "GPickUp"},
670 {0 , NULL}
672 #endif
675 * define lamp modes;
676 * lamp cadence is defined as follows
677 * Wink (on 80%) = 448msec on / 64msec off
678 * Flash (fast flash) = 32msec on / 32msec off
679 * Blink (on 50%) = 512msec on / 512msec off
680 * On (on steady)
682 static const value_string stationLampModes[] = {
683 {0 , "Undefined"},
684 {0x1 , "Off"},
685 {0x2 , "On"},
686 {0x3 , "Wink"},
687 {0x4 , "Flash"},
688 {0x5 , "Blink"},
689 {0 , NULL}
691 static value_string_ext stationLampModes_ext = VALUE_STRING_EXT_INIT(stationLampModes);
693 /* Defined the Call States to be sent to the Telecaste station.
694 * These are NOT the call states used in CM internally. Instead,
695 * they are the call states sent from CM and understood by the Telecaster station
697 static const value_string skinny_stationCallStates[] = {
698 {1 , "OffHook"},
699 {2 , "OnHook"},
700 {3 , "RingOut"},
701 {4 , "RingIn"},
702 {5 , "Connected"},
703 {6 , "Busy"},
704 {7 , "Congestion"},
705 {8 , "Hold"},
706 {9 , "CallWaiting"},
707 {10 , "CallTransfer"},
708 {11 , "CallPark"},
709 {12 , "Proceed"},
710 {13 , "CallRemoteMultiline"},
711 {14 , "InvalidNumber"},
712 {0 , NULL}
714 static value_string_ext skinny_stationCallStates_ext = VALUE_STRING_EXT_INIT(skinny_stationCallStates);
716 /* Defined Call Type */
717 static const value_string skinny_callTypes[] = {
718 {1 , "InBoundCall"},
719 {2 , "OutBoundCall"},
720 {3 , "ForwardCall"},
721 {0 , NULL}
725 * define station-playable tones;
726 * for tone definitions see SR-TSV-002275, "BOC Notes on the LEC Networks -- 1994"
728 static const value_string skinny_deviceTones[] = {
729 {0x0 , "Silence"},
730 {0x1 , "Dtmf1"},
731 {0x2 , "Dtmf2"},
732 {0x3 , "Dtmf3"},
733 {0x4 , "Dtmf4"},
734 {0x5 , "Dtmf5"},
735 {0x6 , "Dtmf6"},
736 {0x7 , "Dtmf7"},
737 {0x8 , "Dtmf8"},
738 {0x9 , "Dtmf9"},
739 {0xa , "Dtmf0"},
740 {0xe , "DtmfStar"},
741 {0xf , "DtmfPound"},
742 {0x10 , "DtmfA"},
743 {0x11 , "DtmfB"},
744 {0x12 , "DtmfC"},
745 {0x13 , "DtmfD"},
746 {0x21 , "InsideDialTone"},
747 {0x22 , "OutsideDialTone"},
748 {0x23 , "LineBusyTone"},
749 {0x24 , "AlertingTone"},
750 {0x25 , "ReorderTone"},
751 {0x26 , "RecorderWarningTone"},
752 {0x27 , "RecorderDetectedTone"},
753 {0x28 , "RevertingTone"},
754 {0x29 , "ReceiverOffHookTone"},
755 {0x2a , "PartialDialTone"},
756 {0x2b , "NoSuchNumberTone"},
757 {0x2c , "BusyVerificationTone"},
758 {0x2d , "CallWaitingTone"},
759 {0x2e , "ConfirmationTone"},
760 {0x2f , "CampOnIndicationTone"},
761 {0x30 , "RecallDialTone"},
762 {0x31 , "ZipZip"},
763 {0x32 , "Zip"},
764 {0x33 , "BeepBonk"},
765 {0x34 , "MusicTone"},
766 {0x35 , "HoldTone"},
767 {0x36 , "TestTone"},
768 {0x37 , "DtMoniterWarningTone"},
769 {0x40 , "AddCallWaiting"},
770 {0x41 , "PriorityCallWait"},
771 {0x42 , "RecallDial"},
772 {0x43 , "BargIn"},
773 {0x44 , "DistinctAlert"},
774 {0x45 , "PriorityAlert"},
775 {0x46 , "ReminderRing"},
776 {0x47 , "PrecedenceRingBack"},
777 {0x48 , "PreemptionTone"},
778 {0x50 , "MF1"},
779 {0x51 , "MF2"},
780 {0x52 , "MF3"},
781 {0x53 , "MF4"},
782 {0x54 , "MF5"},
783 {0x55 , "MF6"},
784 {0x56 , "MF7"},
785 {0x57 , "MF8"},
786 {0x58 , "MF9"},
787 {0x59 , "MF0"},
788 {0x5a , "MFKP1"},
789 {0x5b , "MFST"},
790 {0x5c , "MFKP2"},
791 {0x5d , "MFSTP"},
792 {0x5e , "MFST3P"},
793 {0x5f , "MILLIWATT"},
794 {0x60 , "MILLIWATTTEST"},
795 {0x61 , "HIGHTONE"},
796 {0x62 , "FLASHOVERRIDE"},
797 {0x63 , "FLASH"},
798 {0x64 , "PRIORITY"},
799 {0x65 , "IMMEDIATE"},
800 {0x66 , "PREAMPWARN"},
801 {0x67 , "2105HZ"},
802 {0x68 , "2600HZ"},
803 {0x69 , "440HZ"},
804 {0x6a , "300HZ"},
805 {0x77 , "MLPP_PALA"},
806 {0x78 , "MLPP_ICA"},
807 {0x79 , "MLPP_VCA"},
808 {0x7A , "MLPP_BPA"},
809 {0x7B , "MLPP_BNEA"},
810 {0x7C , "MLPP_UPA"},
811 {0x7f , "NoTone"},
812 {0 , NULL}
814 static value_string_ext skinny_deviceTones_ext = VALUE_STRING_EXT_INIT(skinny_deviceTones);
816 /* define ring types */
817 static const value_string skinny_ringTypes[] = {
818 {0x1 , "RingOff"},
819 {0x2 , "InsideRing"},
820 {0x3 , "OutsideRing"},
821 {0x4 , "FeatureRing"},
822 {0x5 , "FlashOnly"},
823 {0x6 , "PrecedenceRing"},
824 {0 , NULL}
826 static value_string_ext skinny_ringTypes_ext = VALUE_STRING_EXT_INIT(skinny_ringTypes);
828 static const value_string skinny_ringModes[] = {
829 {0x1 , "RingForever"},
830 {0x2 , "RingOnce"},
831 {0 , NULL}
834 static const value_string skinny_speakerModes[] = {
835 {1 , "SpeakerOn"},
836 {2 , "SpeakerOff"},
837 {0 , NULL}
840 static const value_string skinny_silenceSuppressionModes[] = {
841 {0 , "Media_SilenceSuppression_Off"},
842 {1 , "Media_SilenceSuppression_On"},
843 {0 , NULL}
846 static const value_string skinny_g723BitRates[] = {
847 {0 , "None"},
848 {1 , "Media_G723BRate_5_3"},
849 {2 , "Media_G723BRate_6_4"},
850 {0 , NULL}
853 /* define device reset types */
854 static const value_string skinny_deviceResetTypes[] = {
855 {1 , "DEVICE_RESET"},
856 {2 , "DEVICE_RESTART"},
857 {0 , NULL}
860 static const value_string skinny_echoCancelTypes[] = {
861 {0 , "Media_EchoCancellation_Off"},
862 {1 , "Media_EchoCancellation_On"},
863 {0 , NULL}
866 static const value_string skinny_deviceUnregisterStatusTypes[] = {
867 {0 , "Ok"},
868 {1 , "Error"},
869 {2 , "NAK"}, /* Unregister request is rejected for reaso n such as existence of a call */
870 {0 , NULL}
873 static const value_string skinny_createConfResults[] = {
874 {0 , "Ok"},
875 {1 , "ResourceNotAvailable"},
876 {2 , "ConferenceAlreadyExist"},
877 {3 , "SystemErr"},
878 {0 , NULL}
881 static const value_string skinny_modifyConfResults[] = {
882 {0 , "Ok"},
883 {1 , "ResourceNotAvailable"},
884 {2 , "ConferenceNotExist"},
885 {3 , "InvalidParameter"},
886 {4 , "MoreActiveCallsThanReserved"},
887 {5 , "InvalidResourceType"},
888 {6 , "SystemErr"},
889 {0 , NULL}
891 static value_string_ext skinny_modifyConfResults_ext = VALUE_STRING_EXT_INIT(skinny_modifyConfResults);
893 static const value_string skinny_deleteConfResults[] = {
894 {0 , "Ok"},
895 {1 , "ConferenceNotExist"},
896 {2 , "SystemErr"},
897 {0 , NULL}
900 static const value_string skinny_addParticipantResults[] = {
901 {0 , "Ok"},
902 {1 , "ResourceNotAvailable"},
903 {2 , "ConferenceNotExist"},
904 {3 , "DuplicateCallRef"},
905 {4 , "SystemErr"},
906 {0 , NULL}
908 static value_string_ext skinny_addParticipantResults_ext = VALUE_STRING_EXT_INIT(skinny_addParticipantResults);
910 static const value_string skinny_auditParticipantResults[] = {
911 {0 , "Ok"},
912 {1 , "ConferenceNotExist"},
913 {0 , NULL}
916 /* define hook flash detection mode */
917 static const value_string skinny_hookFlashDetectModes[] = {
918 {1 , "HookFlashOn"},
919 {2 , "HookFlashOff"},
920 {0 , NULL}
923 /* define headset mode */
924 static const value_string skinny_headsetModes[] = {
925 {1 , "HeadsetOn"},
926 {2 , "HeadsetOff"},
927 {0 , NULL}
930 /* define station microphone modes;
931 * Mic On - The speakerphone's microphone is turned on ONLY if the phone is in the "Speaker On (Off Hook)"
932 * state (see above).
933 * Mic Off - The microphone is turned off or, if it's not on, the command is ignored.
935 static const value_string skinny_microphoneModes[] = {
936 {1 , "MicOn"},
937 {2 , "MicOff"},
938 {0 , NULL}
941 /* define the session request types */
942 static const value_string skinny_sessionTypes[] = {
943 {1 , "Chat"},
944 {2 , "Whiteboard"},
945 {4 , "ApplicationSharing"},
946 {8 , "FileTransfer"},
947 {10 , "Video"},
948 {0 , NULL}
950 static value_string_ext skinny_sessionTypes_ext = VALUE_STRING_EXT_INIT(skinny_sessionTypes);
952 static const value_string skinny_mediaEnunciationTypes[] = {
953 {1 , "None"},
954 {2 , "CallPark"},
955 {0 , NULL}
958 static const value_string skinny_resourceTypes[] = {
959 {1 , "Conference"},
960 {2 , "IVR"},
961 {0 , NULL}
964 static const value_string skinny_sequenceFlags[] = {
965 {0 , "StationSequenceFirst"},
966 {1 , "StationSequenceMore"},
967 {2 , "StationSequenceLast"},
968 {0 , NULL}
971 static const value_string skinny_Layouts[] = {
972 {0 , "NoLayout"},
973 {1 , "OneByOne"},
974 {2 , "OneByTwo"},
975 {3 , "TwoByTwo"},
976 {4 , "TwoByTwo3Alt1"},
977 {5 , "TwoByTwo3Alt2"},
978 {6 , "ThreeByThree"},
979 {7 , "ThreeByThree6Alt1"},
980 {8 , "ThreeByThree6Alt2"},
981 {9 , "ThreeByThree4Alt1"},
982 {10 , "ThreeByThree4Alt2"},
983 {0 , NULL}
985 static value_string_ext skinny_Layouts_ext = VALUE_STRING_EXT_INIT(skinny_Layouts);
987 static const value_string skinny_transmitOrReceive[] = {
988 {1 , "Station_Receive_only"},
989 {2 , "Station_Transmit_only"},
990 {3 , "Station_Receive_Transmit"},
991 {0 , NULL}
994 static const value_string skinny_endOfAnnAck[] = {
995 {0 , "NoAnnAckRequired"},
996 {1 , "AnnAckRequired"},
997 {0 , NULL}
1000 static const value_string skinny_annPlayMode[] = {
1001 {0 , "AnnXmlConfigMode"},
1002 {1 , "AnnOneShotMode"},
1003 {2 , "AnnContinuousMode"},
1004 {0 , NULL}
1007 static const value_string skinny_annPlayStatus[] = {
1008 {0 , "PlayToneOK"},
1009 {1 , "PlayToneErr"},
1010 {0 , NULL}
1013 static const value_string skinny_miscCommandType[] = {
1014 {0 , "videoFreezePicture"},
1015 {1 , "videoFastUpdatePicture"},
1016 {2 , "videoFastUpdateGOB"},
1017 {3 , "videoFastUpdateMB"},
1018 {4 , "lostPicture"},
1019 {5 , "lostPartialPicture"},
1020 {6 , "recoveryReferencePicture"},
1021 {7 , "temporalSpatialTradeOff"},
1022 {0 , NULL}
1024 static value_string_ext skinny_miscCommandType_ext = VALUE_STRING_EXT_INIT(skinny_miscCommandType);
1026 static const value_string skinny_formatTypes[] = {
1027 {1 , "sqcif (128x96)"},
1028 {2 , "qcif (176x144)"},
1029 {3 , "cif (352x288)"},
1030 {4 , "4cif (704x576)"},
1031 {5 , "16cif (1408x1152)"},
1032 {6 , "custom_base"},
1033 {0 , NULL}
1035 static value_string_ext skinny_formatTypes_ext = VALUE_STRING_EXT_INIT(skinny_formatTypes);
1037 static const value_string skinny_callSecurityStatusTypes[] = {
1038 {0 , "CallSecurityStatusUnknown"},
1039 {1 , "CallSecurityStatusNotAuthenticated"},
1040 {2 , "CallSecurityStatusAuthenticated"},
1041 {0 , NULL}
1044 static const value_string skinny_accessories[] = {
1045 {1 , "Headset"},
1046 {2 , "Handset"},
1047 {3 , "Speaker"},
1048 {0 , NULL}
1050 static value_string_ext skinny_accessories_ext = VALUE_STRING_EXT_INIT(skinny_accessories);
1052 static const value_string skinny_accessoryStates[] = {
1053 {0 , "None"},
1054 {1 , "Offhook"},
1055 {2 , "Onhook"},
1056 {0 , NULL}
1058 static value_string_ext skinny_accessoryStates_ext = VALUE_STRING_EXT_INIT(skinny_accessoryStates);
1060 #define StationMaxDirnumSize 24 /* max size of calling or called party dirnum */
1061 #define StationMaxNameSize 40 /* max size of calling party's name */
1062 #define StationMaxDisplayNameSize 44 /* max size of display name */
1063 #define StationMaxDeviceNameSize 16 /* max size of station's IP name */
1064 #define StationMaxSpeedDials 10 /* max number of speed dial numbers allowed on a station */
1065 #define StationMaxVersionSize 16 /* max chars in version string */
1066 #define StationMaxButtonTemplateSize 42 /* max button template size */
1067 #define StationMaxDisplayTextSize 33 /* max text size in DisplayText message */
1068 #define StationMaxPorts 10 /* max number of ports on one device */
1069 #define StationDateTemplateSize 6 /* date template in the form M/D/Y, D/M/Y, ... */
1070 #define StationMaxServerNameSize 48 /* max size of server name */
1071 #define StationMaxServers 5 /* max servers */
1072 #define StationMaxDeviceDirnums 1024 /* max dir numbers per SCM device */
1073 #define StationMaxDirnums 64 /* max dir numbers per physical station (also used in db request msg); */
1074 #define StationMaxSoftKeyLabelSize 16 /* max label size in the message */
1075 #define StationMaxSoftKeyDefinition 32 /* max number of soft key definition in the message */
1076 #define StationMaxSoftKeySetDefinition 16 /* max number of soft key set definition in the message */
1077 #define StationMaxSoftKeyIndex 16 /* max number of soft key indices in a station soft key set */
1078 #define StationMaxDisplayPromptStatusSize 32 /* max status text size in the display status message */
1079 #define StationMaxDisplayNotifySize 32 /* max prompt text size in the display prompt message */
1080 #define StationMaxAlarmMessageSize 80 /* max size for an alarm message */
1081 #define StationMaxUserDeviceDataSize 2000 /* max size of user data between application and device */
1082 #define StationMaxConference 32
1083 #define AppConferenceIDSize 32
1084 #define AppDataSize 24
1085 #define MAX_CUSTOM_PICTURES 6
1086 #define MAX_LAYOUT_WITH_SAME_SERVICE 5
1087 #define MAX_SERVICE_TYPE 4
1088 #define DeviceMaxCapabilities 18 /* max capabilities allowed in Cap response message */
1089 #define StationMaxCapabilities DeviceMaxCapabilities
1090 #define StationMaxVideoCapabilities 10
1091 #define StationMaxDataCapabilities 5
1092 #define MAX_LEVEL_PREFERENCE 4
1093 #define MaxAnnouncementList 32
1094 #define StationMaxMonitorParties 16 /* Max Monitor Bridge whisper matrix parties, rm, M&R in Parche */
1095 #define StationMaxServiceURLSize 256 /* max number of service URLs length */
1096 #define MAX_PICTURE_FORMAT 5
1097 #define MAX_REFERENCE_PICTURE 4
1099 /* Initialize the protocol and registered fields */
1100 static int proto_skinny = -1;
1101 static int hf_skinny_data_length = -1;
1102 static int hf_skinny_hdr_version = -1;
1103 static int hf_skinny_messageid = -1;
1104 static int hf_skinny_deviceName = -1;
1105 static int hf_skinny_stationUserId = -1;
1106 static int hf_skinny_stationInstance = -1;
1107 static int hf_skinny_deviceType = -1;
1108 static int hf_skinny_maxStreams = -1;
1109 static int hf_skinny_stationIpPort = -1;
1110 static int hf_skinny_stationKeypadButton = -1;
1111 static int hf_skinny_calledPartyNumber = -1;
1112 static int hf_skinny_stimulus = -1;
1113 static int hf_skinny_stimulusInstance = -1;
1114 static int hf_skinny_lineNumber = -1;
1115 static int hf_skinny_speedDialNumber = -1;
1116 static int hf_skinny_speedDialType = -1;
1117 static int hf_skinny_speedDialStatus = -1;
1118 static int hf_skinny_capCount = -1;
1119 static int hf_skinny_payloadCapability = -1;
1120 static int hf_skinny_maxFramesPerPacket = -1;
1121 static int hf_skinny_alarmSeverity = -1;
1122 static int hf_skinny_alarmParam1 = -1;
1123 static int hf_skinny_alarmParam2 = -1;
1124 static int hf_skinny_receptionStatus = -1;
1125 static int hf_skinny_passThruPartyID = -1;
1126 static int hf_skinny_ORCStatus = -1;
1127 static int hf_skinny_IPVersion = -1;
1128 static int hf_skinny_ipAddress = -1;
1129 static int hf_skinny_ipV6Address = -1;
1130 static int hf_skinny_portNumber = -1;
1131 static int hf_skinny_statsProcessingType = -1;
1132 static int hf_skinny_callIdentifier = -1;
1133 static int hf_skinny_packetsSent = -1;
1134 static int hf_skinny_octetsSent = -1;
1135 static int hf_skinny_packetsRecv = -1;
1136 static int hf_skinny_octetsRecv = -1;
1137 static int hf_skinny_packetsLost = -1;
1138 static int hf_skinny_latency = -1;
1139 static int hf_skinny_jitter = -1;
1140 static int hf_skinny_directoryNumber = -1;
1141 static int hf_skinny_softKeyEvent = -1;
1142 static int hf_skinny_lineInstance = -1;
1143 static int hf_skinny_keepAliveInterval = -1;
1144 static int hf_skinny_dateTemplate = -1;
1145 static int hf_skinny_secondaryKeepAliveInterval = -1;
1146 static int hf_skinny_buttonOffset = -1;
1147 static int hf_skinny_buttonCount = -1;
1148 static int hf_skinny_totalButtonCount = -1;
1149 static int hf_skinny_buttonInstanceNumber = -1;
1150 static int hf_skinny_buttonDefinition = -1;
1151 static int hf_skinny_softKeyOffset = -1;
1152 static int hf_skinny_softKeyCount = -1;
1153 static int hf_skinny_totalSoftKeyCount = -1;
1154 static int hf_skinny_softKeyLabel = -1;
1155 static int hf_skinny_softKeySetOffset = -1;
1156 static int hf_skinny_softKeySetCount = -1;
1157 static int hf_skinny_totalSoftKeySetCount = -1;
1158 static int hf_skinny_softKeyTemplateIndex = -1;
1159 static int hf_skinny_softKeyInfoIndex = -1;
1160 static int hf_skinny_softKeySetDescription = -1;
1161 static int hf_skinny_softKeyMap = -1;
1162 static int hf_skinny_softKey0 = -1;
1163 static int hf_skinny_softKey1 = -1;
1164 static int hf_skinny_softKey2 = -1;
1165 static int hf_skinny_softKey3 = -1;
1166 static int hf_skinny_softKey4 = -1;
1167 static int hf_skinny_softKey5 = -1;
1168 static int hf_skinny_softKey6 = -1;
1169 static int hf_skinny_softKey7 = -1;
1170 static int hf_skinny_softKey8 = -1;
1171 static int hf_skinny_softKey9 = -1;
1172 static int hf_skinny_softKey10 = -1;
1173 static int hf_skinny_softKey11 = -1;
1174 static int hf_skinny_softKey12 = -1;
1175 static int hf_skinny_softKey13 = -1;
1176 static int hf_skinny_softKey14 = -1;
1177 static int hf_skinny_softKey15 = -1;
1178 static int hf_skinny_lampMode = -1;
1179 static int hf_skinny_messageTimeOutValue = -1;
1180 static int hf_skinny_displayMessage = -1;
1181 static int hf_skinny_lineDirNumber = -1;
1182 static int hf_skinny_lineFullyQualifiedDisplayName = -1;
1183 static int hf_skinny_lineDisplayName = -1;
1184 static int hf_skinny_speedDialDirNumber = -1;
1185 static int hf_skinny_speedDialDisplayName = -1;
1186 static int hf_skinny_dateYear = -1;
1187 static int hf_skinny_dateMonth = -1;
1188 static int hf_skinny_dayOfWeek = -1;
1189 static int hf_skinny_dateDay = -1;
1190 static int hf_skinny_dateHour = -1;
1191 static int hf_skinny_dateMinute = -1;
1192 static int hf_skinny_dateSeconds = -1;
1193 static int hf_skinny_dateMilliseconds = -1;
1194 static int hf_skinny_timeStamp = -1;
1195 static int hf_skinny_callState = -1;
1196 static int hf_skinny_deviceTone = -1;
1197 static int hf_skinny_callingPartyName = -1;
1198 static int hf_skinny_callingPartyNumber = -1;
1199 static int hf_skinny_calledPartyName = -1;
1200 static int hf_skinny_callType = -1;
1201 static int hf_skinny_originalCalledPartyName = -1;
1202 static int hf_skinny_originalCalledParty = -1;
1203 static int hf_skinny_ringType = -1;
1204 static int hf_skinny_ringMode = -1;
1205 static int hf_skinny_speakerMode = -1;
1206 static int hf_skinny_remoteIpAddr = -1;
1207 static int hf_skinny_remotePortNumber = -1;
1208 static int hf_skinny_millisecondPacketSize = -1;
1209 static int hf_skinny_precedenceValue = -1;
1210 static int hf_skinny_silenceSuppression = -1;
1211 static int hf_skinny_g723BitRate = -1;
1212 static int hf_skinny_conferenceID = -1;
1213 static int hf_skinny_deviceResetType = -1;
1214 static int hf_skinny_echoCancelType = -1;
1215 static int hf_skinny_deviceUnregisterStatus = -1;
1216 static int hf_skinny_hookFlashDetectMode = -1;
1217 static int hf_skinny_detectInterval = -1;
1218 static int hf_skinny_microphoneMode = -1;
1219 static int hf_skinny_headsetMode = -1;
1220 static int hf_skinny_unknown = -1;
1221 static int hf_skinny_rawData = -1;
1222 static int hf_skinny_xmlData = -1;
1223 static int hf_skinny_activeForward = -1;
1224 static int hf_skinny_forwardAllActive = -1;
1225 static int hf_skinny_forwardBusyActive = -1;
1226 static int hf_skinny_forwardNoAnswerActive = -1;
1227 static int hf_skinny_forwardNumber = -1;
1228 static int hf_skinny_serverName = -1;
1229 static int hf_skinny_numberLines = -1;
1230 static int hf_skinny_numberSpeedDials = -1;
1231 static int hf_skinny_userName = -1;
1232 static int hf_skinny_sessionType = -1;
1233 static int hf_skinny_version = -1;
1234 static int hf_skinny_mediaEnunciationType = -1;
1235 static int hf_skinny_serverIdentifier = -1;
1236 static int hf_skinny_serverListenPort = -1;
1237 static int hf_skinny_serverIpAddress = -1;
1238 static int hf_skinny_multicastIpAddress = -1;
1239 static int hf_skinny_multicastPort = -1;
1240 static int hf_skinny_tokenRejWaitTime = -1;
1241 static int hf_skinny_numberOfInServiceStreams = -1;
1242 static int hf_skinny_maxStreamsPerConf = -1;
1243 static int hf_skinny_numberOfOutOfServiceStreams = -1;
1244 static int hf_skinny_applicationID = -1;
1245 static int hf_skinny_serviceNum = -1;
1246 static int hf_skinny_serviceURLIndex = -1;
1247 static int hf_skinny_featureIndex = -1;
1248 static int hf_skinny_createConfResults = -1;
1249 static int hf_skinny_modifyConfResults = -1;
1250 static int hf_skinny_deleteConfResults = -1;
1251 static int hf_skinny_addParticipantResults = -1;
1252 static int hf_skinny_passThruData = -1;
1253 static int hf_skinny_last = -1;
1254 static int hf_skinny_numberOfEntries = -1;
1255 static int hf_skinny_auditParticipantResults = -1;
1256 static int hf_skinny_participantEntry = -1;
1257 static int hf_skinny_resourceTypes = -1;
1258 static int hf_skinny_numberOfReservedParticipants = -1;
1259 static int hf_skinny_numberOfActiveParticipants = -1;
1260 static int hf_skinny_appID = -1;
1261 static int hf_skinny_appData = -1;
1262 static int hf_skinny_appConfID = -1;
1263 static int hf_skinny_sequenceFlag = -1;
1264 static int hf_skinny_displayPriority = -1;
1265 static int hf_skinny_appInstanceID = -1;
1266 static int hf_skinny_routingID = -1;
1267 static int hf_skinny_audioCapCount = -1;
1268 static int hf_skinny_videoCapCount = -1;
1269 static int hf_skinny_dataCapCount = -1;
1270 static int hf_skinny_RTPPayloadFormat = -1;
1271 static int hf_skinny_customPictureFormatCount = -1;
1272 static int hf_skinny_pictureWidth = -1;
1273 static int hf_skinny_pictureHeight = -1;
1274 static int hf_skinny_pixelAspectRatio = -1;
1275 static int hf_skinny_clockConversionCode = -1;
1276 static int hf_skinny_clockDivisor = -1;
1277 static int hf_skinny_activeStreamsOnRegistration = -1;
1278 static int hf_skinny_maxBW = -1;
1279 static int hf_skinny_serviceResourceCount = -1;
1280 static int hf_skinny_layoutCount = -1;
1281 static int hf_skinny_layout = -1;
1282 static int hf_skinny_maxConferences = -1;
1283 static int hf_skinny_activeConferenceOnRegistration = -1;
1284 static int hf_skinny_transmitOrReceive = -1;
1285 static int hf_skinny_levelPreferenceCount = -1;
1286 static int hf_skinny_transmitPreference = -1;
1287 static int hf_skinny_format = -1;
1288 static int hf_skinny_maxBitRate = -1;
1289 static int hf_skinny_minBitRate = -1;
1290 static int hf_skinny_MPI = -1;
1291 static int hf_skinny_serviceNumber = -1;
1292 static int hf_skinny_temporalSpatialTradeOffCapability = -1;
1293 static int hf_skinny_stillImageTransmission = -1;
1294 static int hf_skinny_h263_capability_bitfield = -1;
1295 static int hf_skinny_annexNandWFutureUse = -1;
1296 static int hf_skinny_modelNumber = -1;
1297 static int hf_skinny_bandwidth = -1;
1298 static int hf_skinny_protocolDependentData = -1;
1299 static int hf_skinny_priority = -1;
1300 static int hf_skinny_payloadDtmf = -1;
1301 static int hf_skinny_featureID = -1;
1302 static int hf_skinny_featureTextLabel = -1;
1303 static int hf_skinny_featureStatus = -1;
1304 static int hf_skinny_notify = -1;
1305 static int hf_skinny_endOfAnnAck = -1;
1306 static int hf_skinny_annPlayMode = -1;
1307 static int hf_skinny_annPlayStatus = -1;
1308 static int hf_skinny_locale = -1;
1309 static int hf_skinny_country = -1;
1310 static int hf_skinny_matrixConfPartyID = -1;
1311 static int hf_skinny_hearingConfPartyMask = -1;
1312 static int hf_skinny_serviceURL = -1;
1313 static int hf_skinny_serviceURLDisplayName = -1;
1314 static int hf_skinny_callSelectStat = -1;
1315 static int hf_skinny_isConferenceCreator = -1;
1316 static int hf_skinny_payload_rfc_number = -1;
1317 static int hf_skinny_payloadType = -1;
1318 static int hf_skinny_bitRate = -1;
1319 static int hf_skinny_pictureFormatCount = -1;
1320 static int hf_skinny_confServiceNum = -1;
1321 static int hf_skinny_DSCPValue = -1;
1322 static int hf_skinny_miscCommandType = -1;
1323 static int hf_skinny_temporalSpatialTradeOff = -1;
1324 static int hf_skinny_firstGOB = -1;
1325 static int hf_skinny_numberOfGOBs = -1;
1326 static int hf_skinny_firstMB = -1;
1327 static int hf_skinny_numberOfMBs = -1;
1328 static int hf_skinny_pictureNumber = -1;
1329 static int hf_skinny_longTermPictureIndex = -1;
1330 static int hf_skinny_recoveryReferencePictureCount = -1;
1331 static int hf_skinny_transactionID = -1;
1332 static int hf_skinny_lastRedirectingPartyName = -1;
1333 static int hf_skinny_lastRedirectingParty = -1;
1334 static int hf_skinny_cgpnVoiceMailbox = -1;
1335 static int hf_skinny_cdpnVoiceMailbox = -1;
1336 static int hf_skinny_originalCdpnVoiceMailbox = -1;
1337 static int hf_skinny_lastRedirectingVoiceMailbox = -1;
1338 static int hf_skinny_originalCdpnRedirectReason = -1;
1339 static int hf_skinny_lastRedirectingReason = -1;
1340 static int hf_skinny_callInstance = -1;
1341 static int hf_skinny_callSecurityStatus = -1;
1342 static int hf_skinny_partyPIRestrictionBits_CallingPartyName = -1;
1343 static int hf_skinny_partyPIRestrictionBits_CallingPartyNumber = -1;
1344 static int hf_skinny_partyPIRestrictionBits_CalledPartyName = -1;
1345 static int hf_skinny_partyPIRestrictionBits_CalledPartyNumber = -1;
1346 static int hf_skinny_partyPIRestrictionBits_OriginalCalledPartyName = -1;
1347 static int hf_skinny_partyPIRestrictionBits_OriginalCalledPartyNumber = -1;
1348 static int hf_skinny_partyPIRestrictionBits_LastRedirectPartyName = -1;
1349 static int hf_skinny_partyPIRestrictionBits_LastRedirectPartyNumber = -1;
1350 static int hf_skinny_directoryIndex = -1;
1351 static int hf_skinny_directoryPhoneNumber = -1;
1352 static int hf_skinny_startMediaTransmissionStatus = -1;
1353 static int hf_skinny_startMultiMediaTransmissionStatus = -1;
1354 static int hf_skinny_qualityStats = -1;
1355 static int hf_skinny_accessory = -1;
1356 static int hf_skinny_accessoryState = -1;
1357 static int hf_skinny_macAddress = -1;
1358 static int hf_skinny_activeStreams = -1;
1359 static int hf_skinny_phoneFeatures = -1;
1360 static int hf_skinny_maxButtons = -1;
1361 static int hf_skinny_loadInfo = -1;
1362 static int hf_skinny_visibility = -1;
1364 /* Skinny content type and internet media type used by other dissectors
1365 * * are the same. List of media types from IANA at:
1366 * * http://www.iana.org/assignments/media-types/index.html */
1367 static dissector_table_t media_type_dissector_table;
1369 /* Initialize the subtree pointers */
1370 static gint ett_skinny = -1;
1371 static gint ett_skinny_tree = -1;
1372 static gint ett_skinny_softKeyMap = -1;
1374 /* desegmentation of SCCP */
1375 static gboolean skinny_desegment = TRUE;
1377 /* tap register id */
1378 static int skinny_tap = -1;
1380 /* skinny protocol tap info */
1381 #define MAX_SKINNY_MESSAGES_IN_PACKET 10
1382 static skinny_info_t pi_arr[MAX_SKINNY_MESSAGES_IN_PACKET];
1383 static int pi_current = 0;
1384 static skinny_info_t *si;
1386 /* Get the length of a single SCCP PDU */
1387 static guint
1388 get_skinny_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
1390 guint32 hdr_data_length;
1393 * Get the length of the SCCP packet.
1395 hdr_data_length = tvb_get_letohl(tvb, offset);
1398 * That length doesn't include the length of the header itself;
1399 * add that in.
1401 return hdr_data_length + 8;
1404 static void
1405 dissect_skinny_xml(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, const gint start, gint length)
1407 proto_item *item = NULL;
1408 proto_tree *subtree = NULL;
1409 tvbuff_t *next_tvb;
1410 dissector_handle_t handle;
1412 item = proto_tree_add_item(tree, hf_skinny_xmlData, tvb, start, length, ENC_ASCII|ENC_NA);
1413 subtree = proto_item_add_subtree(item, 0);
1414 next_tvb = tvb_new_subset(tvb, start, length, -1);
1415 handle = dissector_get_string_handle(media_type_dissector_table, "text/xml");
1416 if (handle != NULL) {
1417 call_dissector(handle, next_tvb, pinfo, subtree);
1421 /* Dissect a single SCCP PDU */
1422 static int
1423 dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
1425 int offset = 0;
1426 gboolean is_video = FALSE; /* FIX ME: need to indicate video or not */
1428 /* Header fields */
1429 guint32 hdr_data_length;
1430 guint32 hdr_version;
1431 guint32 data_messageid;
1432 /* guint32 data_size; */
1434 guint i = 0;
1435 guint t = 0;
1436 int j = 0;
1437 guint count;
1438 int val;
1439 guint32 ipversion;
1441 guint32 capCount;
1442 guint32 softKeyCount;
1443 guint32 softKeySetCount;
1444 guint16 validKeyMask;
1446 /* Set up structures we will need to add the protocol subtree and manage it */
1447 proto_item *ti;
1448 proto_tree *skinny_tree = NULL;
1449 proto_item *ti_sub;
1450 proto_tree *skinny_sub_tree;
1451 proto_tree *skinny_sub_tree_sav;
1452 proto_tree *skinny_sub_tree_sav_sav;
1454 proto_item *skm = NULL;
1455 proto_item *skm_tree = NULL;
1457 hdr_data_length = tvb_get_letohl(tvb, offset);
1458 hdr_version = tvb_get_letohl(tvb, offset+4);
1459 data_messageid = tvb_get_letohl(tvb, offset+8);
1461 /* Initialise stat info for passing to tap */
1462 pi_current++;
1463 if (pi_current == MAX_SKINNY_MESSAGES_IN_PACKET)
1465 /* Overwrite info in first struct if run out of space... */
1466 pi_current = 0;
1468 si = &pi_arr[pi_current];
1469 si->messId = data_messageid;
1470 si->messageName = val_to_str_ext(data_messageid, &message_id_ext, "0x%08X (Unknown)");
1471 si->callId = 0;
1472 si->lineId = 0;
1473 si->passThruId = 0;
1474 si->callState = 0;
1475 g_free(si->callingParty);
1476 si->callingParty = NULL;
1477 g_free(si->calledParty);
1478 si->calledParty = NULL;
1480 /* In the interest of speed, if "tree" is NULL, don't do any work not
1481 * necessary to generate protocol tree items. */
1482 if (tree) {
1483 ti = proto_tree_add_item(tree, proto_skinny, tvb, offset, hdr_data_length+8, ENC_NA);
1484 skinny_tree = proto_item_add_subtree(ti, ett_skinny);
1485 proto_tree_add_uint(skinny_tree, hf_skinny_data_length, tvb, offset, 4, hdr_data_length);
1486 proto_tree_add_uint(skinny_tree, hf_skinny_hdr_version, tvb, offset+4, 4, hdr_version);
1489 col_add_fstr(pinfo->cinfo, COL_INFO,"%s ", si->messageName);
1490 col_set_fence(pinfo->cinfo, COL_INFO);
1492 proto_tree_add_uint(skinny_tree, hf_skinny_messageid, tvb,offset+8, 4, data_messageid );
1495 switch(data_messageid) {
1497 case 0x0000: /* KeepAliveMessage */
1498 break;
1500 case 0x0001: /* RegisterMessage */
1501 proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, StationMaxDeviceNameSize, ENC_ASCII|ENC_NA);
1502 proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
1503 proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
1504 proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+36, 4, ENC_BIG_ENDIAN);
1505 proto_tree_add_item(skinny_tree, hf_skinny_deviceType, tvb, offset+40, 4, ENC_LITTLE_ENDIAN);
1506 proto_tree_add_item(skinny_tree, hf_skinny_maxStreams, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
1507 if (hdr_data_length > 52) {
1508 proto_tree_add_item(skinny_tree, hf_skinny_activeStreams, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
1509 proto_tree_add_item(skinny_tree, hf_skinny_phoneFeatures, tvb, offset+52, 4, ENC_LITTLE_ENDIAN);
1510 proto_tree_add_item(skinny_tree, hf_skinny_IPVersion, tvb, offset+56, 4, ENC_LITTLE_ENDIAN);
1512 if (hdr_data_length > 100) {
1513 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+60, 4, ENC_LITTLE_ENDIAN);
1514 proto_tree_add_item(skinny_tree, hf_skinny_macAddress, tvb, offset+64, 12, ENC_ASCII|ENC_NA);
1515 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+76, 4, ENC_LITTLE_ENDIAN);
1516 proto_tree_add_item(skinny_tree, hf_skinny_maxButtons, tvb, offset+80, 4, ENC_LITTLE_ENDIAN);
1517 proto_tree_add_item(skinny_tree, hf_skinny_ipV6Address, tvb, offset+84, 16, ENC_NA);
1518 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+100, 4, ENC_LITTLE_ENDIAN);
1519 proto_tree_add_item(skinny_tree, hf_skinny_loadInfo, tvb, offset+104, hdr_data_length-96, ENC_ASCII|ENC_NA);
1521 break;
1523 case 0x0002: /* IpPortMessage */
1524 proto_tree_add_item(skinny_tree, hf_skinny_stationIpPort, tvb, offset+12, 2, ENC_BIG_ENDIAN);
1525 break;
1527 case 0x0003: /* KeypadButtonMessage */
1528 proto_tree_add_item(skinny_tree, hf_skinny_stationKeypadButton, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1529 if (hdr_data_length > 8) {
1530 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1531 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
1532 si->lineId = tvb_get_letohl(tvb, offset+16);
1533 si->callId = tvb_get_letohl(tvb, offset+20);
1535 break;
1537 case 0x0004: /* EnblocCallMessage -- This decode NOT verified*/
1538 proto_tree_add_item(skinny_tree, hf_skinny_calledPartyNumber, tvb, offset+12, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
1539 break;
1541 case 0x0005: /* StimulusMessage */
1542 proto_tree_add_item(skinny_tree, hf_skinny_stimulus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1543 proto_tree_add_item(skinny_tree, hf_skinny_stimulusInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1544 if (hdr_data_length > 12) {
1545 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
1546 si->callId = tvb_get_letohl(tvb, offset+20);
1548 break;
1550 case 0x0006: /* OffHookMessage */
1551 if (hdr_data_length > 4) {
1552 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1553 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1554 si->lineId = tvb_get_letohl(tvb, offset+12);
1555 si->callId = tvb_get_letohl(tvb, offset+16);
1557 break;
1559 case 0x0007: /* OnHookMessage */
1560 if (hdr_data_length > 4) {
1561 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1562 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1563 si->lineId = tvb_get_letohl(tvb, offset+12);
1564 si->callId = tvb_get_letohl(tvb, offset+16);
1566 break;
1568 case 0x0008: /* HookFlashMessage */
1569 break;
1571 case 0x0009: /* ForwardStatReqMessage */
1572 proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1573 break;
1575 case 0x000a: /* SpeedDialStatReqMessage */
1576 proto_tree_add_item(skinny_tree, hf_skinny_speedDialNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1577 break;
1579 case 0x000b: /* LineStatReqMessage */
1580 proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1581 break;
1583 case 0x000c: /* ConfigStatReqMessage */
1584 break;
1586 case 0x000d: /* TimeDateReqMessage */
1587 break;
1589 case 0x000e: /* ButtonTemplateReqMessage */
1590 break;
1592 case 0x000f: /* VersionReqMessage */
1593 break;
1595 case 0x0010: /* CapabilitiesResMessage - VERIFIED AS IS */
1596 capCount = tvb_get_letohl(tvb, offset+12);
1597 proto_tree_add_uint(skinny_tree, hf_skinny_capCount, tvb, offset+12, 4, capCount);
1598 for (i = 0; i < capCount; i++) {
1599 proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+(i*16)+16, 4, ENC_LITTLE_ENDIAN);
1600 proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+(i*16)+20, 2, ENC_LITTLE_ENDIAN);
1602 /* FIXME -- decode the union (should be interpreted per payloadCapability) */
1603 /*proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+(i*16)+22, 2, ENC_LITTLE_ENDIAN);*/
1604 proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+(i*16)+24, 2, ENC_LITTLE_ENDIAN);
1605 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+(i*16)+26, 2, ENC_LITTLE_ENDIAN);
1607 break;
1609 case 0x0011: /* MediaPortListMessage */
1610 break;
1612 case 0x0012: /* ServerReqMessage */
1613 break;
1615 case 0x0020: /* AlarmMessage */
1616 proto_tree_add_item(skinny_tree, hf_skinny_alarmSeverity, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1617 proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, StationMaxAlarmMessageSize, ENC_ASCII|ENC_NA);
1618 proto_tree_add_item(skinny_tree, hf_skinny_alarmParam1, tvb, offset+96, 4, ENC_LITTLE_ENDIAN);
1619 proto_tree_add_item(skinny_tree, hf_skinny_alarmParam2, tvb, offset+100, 4, ENC_BIG_ENDIAN);
1620 break;
1622 case 0x0021: /* MulticastMediaReceptionAck - This decode NOT verified */
1623 proto_tree_add_item(skinny_tree, hf_skinny_receptionStatus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1624 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1625 si->passThruId = tvb_get_letohl(tvb, offset+16);
1626 break;
1628 case 0x0022: /* OpenReceiveChannelAck */
1629 if (hdr_version == BASIC_MSG_TYPE) {
1630 address src_addr;
1631 guint32 ipv4_address;
1632 proto_tree_add_item(skinny_tree, hf_skinny_ORCStatus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1633 proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+16, 4, ENC_BIG_ENDIAN);
1634 proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
1635 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
1637 src_addr.type = AT_IPv4;
1638 src_addr.len = 4;
1639 src_addr.data = (guint8 *)&ipv4_address;
1640 ipv4_address = tvb_get_ipv4(tvb, offset+16);
1641 rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+20), 0, "Skinny", pinfo->fd->num, is_video, NULL);
1643 si->passThruId = tvb_get_letohl(tvb, offset+24);
1644 } else if (hdr_version == CM7_MSG_TYPE_A || hdr_version == CM7_MSG_TYPE_B || hdr_version == CM7_MSG_TYPE_C || hdr_version == CM7_MSG_TYPE_D) {
1645 address src_addr;
1646 guint32 ipv4_address;
1648 proto_tree_add_item(skinny_tree, hf_skinny_ORCStatus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1649 /*Assume the field of next 4 bytes is IP Version*/
1650 ipversion = tvb_get_ntohl(tvb, offset+16);
1651 proto_tree_add_item(skinny_tree, hf_skinny_IPVersion, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1652 /*Here we take "0" as IPv4, "others" as IPv6, maybe we need to fix it later*/
1653 if (ipversion == 0) {
1654 proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+20, 4, ENC_BIG_ENDIAN);
1655 } else {
1656 proto_tree_add_item(skinny_tree, hf_skinny_ipV6Address, tvb, offset+20, 16, ENC_NA);
1658 proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
1659 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+40, 4, ENC_LITTLE_ENDIAN);
1661 src_addr.type = AT_IPv4;
1662 src_addr.len = 4;
1663 src_addr.data = (guint8 *)&ipv4_address;
1664 ipv4_address = tvb_get_ipv4(tvb, offset+20);
1665 rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+36), 0, "Skinny", pinfo->fd->num, is_video, NULL);
1667 si->passThruId = tvb_get_letohl(tvb, offset+40);
1669 break;
1671 case 0x0023: /* ConnectionStatisticsRes */
1672 proto_tree_add_item(skinny_tree, hf_skinny_directoryNumber, tvb, offset+12, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
1673 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
1674 if (hdr_version == BASIC_MSG_TYPE || hdr_version == CM7_MSG_TYPE_A || hdr_version == CM7_MSG_TYPE_B) {
1675 proto_tree_add_item(skinny_tree, hf_skinny_statsProcessingType, tvb, offset+40, 4, ENC_LITTLE_ENDIAN);
1676 proto_tree_add_item(skinny_tree, hf_skinny_packetsSent, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
1677 proto_tree_add_item(skinny_tree, hf_skinny_octetsSent, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
1678 proto_tree_add_item(skinny_tree, hf_skinny_packetsRecv, tvb, offset+52, 4, ENC_LITTLE_ENDIAN);
1679 proto_tree_add_item(skinny_tree, hf_skinny_octetsRecv, tvb, offset+56, 4, ENC_LITTLE_ENDIAN);
1680 proto_tree_add_item(skinny_tree, hf_skinny_packetsLost, tvb, offset+60, 4, ENC_LITTLE_ENDIAN);
1681 proto_tree_add_item(skinny_tree, hf_skinny_jitter, tvb, offset+64, 4, ENC_LITTLE_ENDIAN);
1682 proto_tree_add_item(skinny_tree, hf_skinny_latency, tvb, offset+68, 4, ENC_LITTLE_ENDIAN);
1683 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+72, 4, ENC_LITTLE_ENDIAN);
1684 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+76, 4, ENC_LITTLE_ENDIAN);
1685 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+80, 4, ENC_LITTLE_ENDIAN);
1686 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+84, 4, ENC_LITTLE_ENDIAN);
1687 proto_tree_add_item(skinny_tree, hf_skinny_qualityStats, tvb, offset+88, hdr_data_length-80, ENC_ASCII|ENC_NA);
1688 } else if (hdr_version == CM7_MSG_TYPE_C || hdr_version == CM7_MSG_TYPE_D) {
1689 proto_tree_add_item(skinny_tree, hf_skinny_packetsSent, tvb, offset+40, 4, ENC_LITTLE_ENDIAN);
1690 proto_tree_add_item(skinny_tree, hf_skinny_octetsSent, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
1691 proto_tree_add_item(skinny_tree, hf_skinny_packetsRecv, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
1692 proto_tree_add_item(skinny_tree, hf_skinny_octetsRecv, tvb, offset+52, 4, ENC_LITTLE_ENDIAN);
1693 proto_tree_add_item(skinny_tree, hf_skinny_packetsLost, tvb, offset+56, 4, ENC_LITTLE_ENDIAN);
1694 proto_tree_add_item(skinny_tree, hf_skinny_jitter, tvb, offset+60, 4, ENC_LITTLE_ENDIAN);
1695 proto_tree_add_item(skinny_tree, hf_skinny_latency, tvb, offset+64, 4, ENC_LITTLE_ENDIAN);
1696 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+68, 4, ENC_LITTLE_ENDIAN);
1697 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+72, 4, ENC_LITTLE_ENDIAN);
1698 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+76, 1, ENC_LITTLE_ENDIAN);
1699 proto_tree_add_item(skinny_tree, hf_skinny_qualityStats, tvb, offset+77, hdr_data_length-69, ENC_ASCII|ENC_NA);
1701 si->callId = tvb_get_letohl(tvb, offset+36);
1702 break;
1704 case 0x0024: /* OffHookWithCgpnMessage */
1705 proto_tree_add_item(skinny_tree, hf_skinny_calledPartyNumber, tvb, offset+12,StationMaxDirnumSize, ENC_ASCII|ENC_NA);
1706 break;
1708 case 0x0025: /* SoftKeySetReqMessage */
1709 break;
1711 case 0x0026: /* SoftKeyEventMessage */
1712 proto_tree_add_item(skinny_tree, hf_skinny_softKeyEvent, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1713 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1714 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
1715 si->lineId = tvb_get_letohl(tvb, offset+16);
1716 si->callId = tvb_get_letohl(tvb, offset+20);
1717 break;
1719 case 0x0027: /* UnregisterMessage */
1720 break;
1722 case 0x0028: /* softKeyTemplateRequest */
1723 break;
1725 case 0x0029: /* RegisterTokenReq */
1726 proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, StationMaxDeviceNameSize, ENC_ASCII|ENC_NA);
1727 i = offset+12+StationMaxDeviceNameSize;
1728 proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, i, 4, ENC_LITTLE_ENDIAN);
1729 proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, i+4, 4, ENC_LITTLE_ENDIAN);
1730 proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, i+8, 4, ENC_BIG_ENDIAN);
1731 proto_tree_add_item(skinny_tree, hf_skinny_deviceType, tvb, i+12, 4, ENC_LITTLE_ENDIAN);
1732 break;
1734 case 0x002A: /* MediaTransmissionFailure */
1735 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1736 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1737 proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+20, 4, ENC_BIG_ENDIAN);
1738 proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
1739 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
1740 si->passThruId = tvb_get_letohl(tvb, offset+16);
1741 si->callId = tvb_get_letohl(tvb, offset+28);
1742 break;
1744 case 0x002B: /* HeadsetStatusMessage */
1745 proto_tree_add_item(skinny_tree, hf_skinny_headsetMode, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1746 break;
1748 case 0x002C: /* MediaResourceNotification */
1749 proto_tree_add_item(skinny_tree, hf_skinny_deviceType, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1750 proto_tree_add_item(skinny_tree, hf_skinny_numberOfInServiceStreams, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1751 proto_tree_add_item(skinny_tree, hf_skinny_maxStreamsPerConf, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
1752 proto_tree_add_item(skinny_tree, hf_skinny_numberOfOutOfServiceStreams, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
1753 break;
1755 case 0x002D: /* RegisterAvailableLinesMessage */
1756 proto_tree_add_item(skinny_tree, hf_skinny_numberLines, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1757 break;
1759 case 0x002E: /* DeviceToUserDataMessage */
1760 proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1761 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1762 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
1763 proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
1764 proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
1765 count = tvb_get_letohl( tvb, offset+28);
1766 dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+30, count);
1767 si->lineId = tvb_get_letohl(tvb, offset+16);
1768 si->callId = tvb_get_letohl(tvb, offset+20);
1769 break;
1771 case 0x002F: /* DeviceToUserDataResponseMessage */
1772 proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1773 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1774 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
1775 proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
1776 proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
1777 count = tvb_get_letohl( tvb, offset+28);
1778 dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+30, count);
1779 si->lineId = tvb_get_letohl(tvb, offset+12);
1780 si->callId = tvb_get_letohl(tvb, offset+16);
1781 break;
1783 case 0x0030: /* UpdateCapabilitiesMessage */
1784 /* to do - this message is very large and will span multiple packets, it would be nice to someday */
1785 /* find out a way to join the next packet and get the complete message to decode */
1786 proto_tree_add_item(skinny_tree, hf_skinny_audioCapCount, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1787 proto_tree_add_item(skinny_tree, hf_skinny_videoCapCount, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1788 proto_tree_add_item(skinny_tree, hf_skinny_dataCapCount, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
1789 proto_tree_add_item(skinny_tree, hf_skinny_RTPPayloadFormat, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
1790 proto_tree_add_item(skinny_tree, hf_skinny_customPictureFormatCount, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
1791 count = offset+32;
1792 capCount=tvb_get_letohl(tvb, offset+28);
1793 for ( i = 0; i < MAX_CUSTOM_PICTURES; i++ ) {
1794 if (i < capCount) {
1795 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "customPictureFormat[%d]", i);
1796 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1797 proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureWidth, tvb, count, 4, ENC_LITTLE_ENDIAN);
1798 count+= 4;
1799 proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureHeight, tvb, count, 4, ENC_LITTLE_ENDIAN);
1800 count+= 4;
1801 proto_tree_add_item(skinny_sub_tree, hf_skinny_pixelAspectRatio, tvb, count, 4, ENC_LITTLE_ENDIAN);
1802 count+= 4;
1803 proto_tree_add_item(skinny_sub_tree, hf_skinny_clockConversionCode, tvb, count, 4, ENC_LITTLE_ENDIAN);
1804 count+= 4;
1805 proto_tree_add_item(skinny_sub_tree, hf_skinny_clockDivisor, tvb, count, 4, ENC_LITTLE_ENDIAN);
1806 count+= 4;
1807 } else {
1808 count+=20;
1811 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "confResources");
1812 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1813 proto_tree_add_item(skinny_sub_tree, hf_skinny_activeStreamsOnRegistration, tvb, count, 4, ENC_LITTLE_ENDIAN);
1814 count+= 4;
1815 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBW, tvb, count, 4, ENC_LITTLE_ENDIAN);
1816 count+= 4;
1817 proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceResourceCount, tvb, count, 4, ENC_LITTLE_ENDIAN);
1818 count+= 4;
1819 skinny_sub_tree_sav = skinny_sub_tree;
1820 for ( i = 0; i < MAX_SERVICE_TYPE; i++ ) {
1821 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "serviceResource[%d]", i);
1822 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1823 proto_tree_add_item(skinny_sub_tree, hf_skinny_layoutCount, tvb, count, 4, ENC_LITTLE_ENDIAN);
1824 count+= 4;
1825 skinny_sub_tree_sav_sav = skinny_sub_tree_sav;
1826 for ( t = 0; t < MAX_LAYOUT_WITH_SAME_SERVICE; t++ ) {
1827 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "layouts[%d]", t);
1828 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1829 proto_tree_add_item(skinny_sub_tree, hf_skinny_layout, tvb, count, 4, ENC_LITTLE_ENDIAN);
1830 count+= 4;
1832 skinny_sub_tree = skinny_sub_tree_sav_sav;
1833 proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceNum, tvb, count, 4, ENC_LITTLE_ENDIAN);
1834 count+= 4;
1835 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxStreams, tvb, count, 4, ENC_LITTLE_ENDIAN);
1836 count+= 4;
1837 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxConferences, tvb, count, 4, ENC_LITTLE_ENDIAN);
1838 count+= 4;
1839 proto_tree_add_item(skinny_sub_tree, hf_skinny_activeConferenceOnRegistration, tvb, count, 4, ENC_LITTLE_ENDIAN);
1840 count+= 4;
1842 capCount=tvb_get_letohl(tvb, offset+12);
1843 for ( i = 0; i < StationMaxCapabilities; i++ ) {
1844 if (i < capCount) {
1845 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "audiocaps[%d]", i);
1846 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1847 proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
1848 count+= 4;
1849 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxFramesPerPacket, tvb, count, 2, ENC_LITTLE_ENDIAN);
1850 count+= 2;
1851 proto_tree_add_item(skinny_sub_tree, hf_skinny_g723BitRate, tvb, count, 2, ENC_LITTLE_ENDIAN);
1852 count+= 2;
1853 proto_tree_add_item(skinny_sub_tree, hf_skinny_unknown, tvb, count, 2, ENC_LITTLE_ENDIAN);
1854 count+= 8;
1855 } else {
1856 count+= 16;
1859 capCount=tvb_get_letohl(tvb, offset+16);
1860 for ( i = 0; i < StationMaxVideoCapabilities; i++ ) {
1861 if (i < capCount) {
1862 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "vidCaps[%d]", i);
1863 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1864 proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
1865 count+= 4;
1866 proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, ENC_LITTLE_ENDIAN);
1867 count+= 4;
1868 proto_tree_add_item(skinny_sub_tree, hf_skinny_levelPreferenceCount, tvb, count, 4, ENC_LITTLE_ENDIAN);
1869 count+= 4;
1870 skinny_sub_tree_sav = skinny_sub_tree;
1871 for ( t = 0; t < MAX_LEVEL_PREFERENCE; t++ ) {
1872 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "levelPreference[%d]", t);
1873 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1874 proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitPreference, tvb, count, 4, ENC_LITTLE_ENDIAN);
1875 count+= 4;
1876 proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, ENC_LITTLE_ENDIAN);
1877 count+= 4;
1878 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, count, 4, ENC_LITTLE_ENDIAN);
1879 count+= 4;
1880 proto_tree_add_item(skinny_sub_tree, hf_skinny_minBitRate, tvb, count, 4, ENC_LITTLE_ENDIAN);
1881 count+= 4;
1882 proto_tree_add_item(skinny_sub_tree, hf_skinny_MPI, tvb, count, 4, ENC_LITTLE_ENDIAN);
1883 count+= 4;
1884 proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceNumber, tvb, count, 4, ENC_LITTLE_ENDIAN);
1885 count+= 4;
1887 val = count;
1889 /* H.261 */
1890 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h261VideoCapability");
1891 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1892 proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
1893 count+= 4;
1894 proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, ENC_LITTLE_ENDIAN);
1895 /*count+= 4;*/
1897 /* H.263 */
1898 count = val;
1899 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h263VideoCapability");
1900 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1901 proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, ENC_LITTLE_ENDIAN);
1902 count+= 4;
1903 proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, ENC_LITTLE_ENDIAN);
1904 /*count+= 4;*/
1906 /* Video */
1907 count = val;
1908 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "vieoVideoCapability");
1909 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1910 proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, ENC_LITTLE_ENDIAN);
1911 count+= 4;
1912 proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, ENC_LITTLE_ENDIAN);
1913 count+= 4;
1914 } else {
1915 count+=28 + (MAX_LEVEL_PREFERENCE-1)*4;
1918 capCount=tvb_get_letohl(tvb, offset+20);
1919 for ( i = 0; i < StationMaxDataCapabilities; i++ ) {
1920 if ( i < capCount) {
1921 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "dataCaps[%d]", i);
1922 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
1923 proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
1924 count+= 4;
1925 proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, ENC_LITTLE_ENDIAN);
1926 count+= 4;
1927 proto_tree_add_item(skinny_sub_tree, hf_skinny_protocolDependentData, tvb, count, 4, ENC_LITTLE_ENDIAN);
1928 count+= 4;
1929 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, count, 4, ENC_LITTLE_ENDIAN);
1930 count+= 4;
1931 } else {
1932 count+= 16;
1935 break;
1937 case 0x0031: /* OpenMultiMediaReceiveChannelAckMessage */
1938 proto_tree_add_item(skinny_tree, hf_skinny_ORCStatus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1939 proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+16, 4, ENC_BIG_ENDIAN);
1940 proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
1941 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
1942 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
1943 si->passThruId = tvb_get_letohl(tvb, offset+24);
1944 si->callId = tvb_get_letohl(tvb, offset+28);
1945 break;
1947 case 0x0032: /* ClearConferenceMessage */
1948 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1949 proto_tree_add_item(skinny_tree, hf_skinny_serviceNum, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1950 break;
1952 case 0x0033: /* ServiceURLStatReqMessage */
1953 proto_tree_add_item(skinny_tree, hf_skinny_serviceURLIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1954 break;
1956 case 0x0034: /* FeatureStatReqMessage */
1957 proto_tree_add_item(skinny_tree, hf_skinny_featureIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1958 break;
1960 case 0x0035: /* CreateConferenceResMessage */
1961 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1962 proto_tree_add_item(skinny_tree, hf_skinny_createConfResults, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1963 proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
1964 count = tvb_get_letohl( tvb, offset+20);
1965 proto_tree_add_uint(skinny_tree, hf_skinny_passThruData, tvb, offset+24, 1, count);
1966 break;
1968 case 0x0036: /* DeleteConferenceResMessage */
1969 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1970 proto_tree_add_item(skinny_tree, hf_skinny_deleteConfResults, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1971 break;
1973 case 0x0037: /* ModifyConferenceResMessage */
1974 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1975 proto_tree_add_item(skinny_tree, hf_skinny_modifyConfResults, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1976 proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
1977 count = tvb_get_letohl( tvb, offset+20);
1978 proto_tree_add_uint(skinny_tree, hf_skinny_passThruData, tvb, offset+24, 1, count);
1979 break;
1981 case 0x0038: /* AddParticipantResMessage */
1982 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1983 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1984 proto_tree_add_item(skinny_tree, hf_skinny_addParticipantResults, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
1985 si->callId = tvb_get_letohl(tvb, offset+16);
1986 break;
1988 case 0x0039: /* AuditConferenceResMessage */
1989 proto_tree_add_item(skinny_tree, hf_skinny_last, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
1990 proto_tree_add_item(skinny_tree, hf_skinny_numberOfEntries, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
1991 count = offset+20;
1992 for ( i = 0; i < StationMaxConference; i++ ) {
1993 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, count, 4, ENC_LITTLE_ENDIAN);
1994 count += 4;
1995 proto_tree_add_item(skinny_tree, hf_skinny_resourceTypes, tvb, count, 4, ENC_LITTLE_ENDIAN);
1996 count += 4;
1997 proto_tree_add_item(skinny_tree, hf_skinny_numberOfReservedParticipants, tvb, count, 4, ENC_LITTLE_ENDIAN);
1998 count += 4;
1999 proto_tree_add_item(skinny_tree, hf_skinny_numberOfActiveParticipants, tvb, count, 4, ENC_LITTLE_ENDIAN);
2000 count += 4;
2001 proto_tree_add_item(skinny_tree, hf_skinny_appID, tvb, count, 4, ENC_LITTLE_ENDIAN);
2002 count += 4;
2003 proto_tree_add_uint(skinny_tree, hf_skinny_appConfID, tvb, count, 1, AppConferenceIDSize);
2004 count += AppConferenceIDSize;
2005 proto_tree_add_uint(skinny_tree, hf_skinny_appData, tvb, count, 1, AppDataSize);
2006 count += AppDataSize;
2008 break;
2010 case 0x0040: /* AuditParticipantResMessage */
2011 proto_tree_add_item(skinny_tree, hf_skinny_auditParticipantResults, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2012 proto_tree_add_item(skinny_tree, hf_skinny_last, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2013 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2014 proto_tree_add_item(skinny_tree, hf_skinny_numberOfEntries, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2015 count = tvb_get_letohl( tvb, offset+24);
2016 for ( i = 0; i < count; i++ ) {
2017 proto_tree_add_item(skinny_tree, hf_skinny_participantEntry, tvb, offset+28+(i*4), 4, ENC_LITTLE_ENDIAN);
2019 break;
2021 case 0x0041: /* DeviceToUserDataVersion1Message */
2022 proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2023 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2024 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2025 proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2026 proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
2027 count = tvb_get_letohl( tvb, offset+28);
2028 proto_tree_add_item(skinny_tree, hf_skinny_sequenceFlag, tvb, offset+30, 4, ENC_LITTLE_ENDIAN);
2029 proto_tree_add_item(skinny_tree, hf_skinny_displayPriority, tvb, offset+34, 4, ENC_LITTLE_ENDIAN);
2030 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+38, 4, ENC_LITTLE_ENDIAN);
2031 proto_tree_add_item(skinny_tree, hf_skinny_appInstanceID, tvb, offset+42, 4, ENC_LITTLE_ENDIAN);
2032 proto_tree_add_item(skinny_tree, hf_skinny_routingID, tvb, offset+46, 4, ENC_LITTLE_ENDIAN);
2033 dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+50, count);
2034 si->lineId = tvb_get_letohl(tvb, offset+16);
2035 si->callId = tvb_get_letohl(tvb, offset+20);
2036 break;
2038 case 0x0042: /* DeviceToUserDataResponseVersion1Message */
2039 proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2040 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2041 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2042 proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2043 proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
2044 count = tvb_get_letohl( tvb, offset+28);
2045 proto_tree_add_item(skinny_tree, hf_skinny_sequenceFlag, tvb, offset+30, 4, ENC_LITTLE_ENDIAN);
2046 proto_tree_add_item(skinny_tree, hf_skinny_displayPriority, tvb, offset+34, 4, ENC_LITTLE_ENDIAN);
2047 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+38, 4, ENC_LITTLE_ENDIAN);
2048 proto_tree_add_item(skinny_tree, hf_skinny_appInstanceID, tvb, offset+42, 4, ENC_LITTLE_ENDIAN);
2049 proto_tree_add_item(skinny_tree, hf_skinny_routingID, tvb, offset+46, 4, ENC_LITTLE_ENDIAN);
2050 dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+50, count);
2051 si->lineId = tvb_get_letohl(tvb, offset+16);
2052 si->callId = tvb_get_letohl(tvb, offset+20);
2053 break;
2055 case 0x0044: /* DynUpdateCapabilitiesMessage */
2056 proto_tree_add_item(skinny_tree, hf_skinny_audioCapCount, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2057 proto_tree_add_item(skinny_tree, hf_skinny_videoCapCount, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2058 proto_tree_add_item(skinny_tree, hf_skinny_dataCapCount, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2059 proto_tree_add_item(skinny_tree, hf_skinny_RTPPayloadFormat, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2060 proto_tree_add_item(skinny_tree, hf_skinny_customPictureFormatCount, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
2061 count = offset+32;
2062 capCount=tvb_get_letohl(tvb, offset+28);
2063 for ( i = 0; i < MAX_CUSTOM_PICTURES; i++ ) {
2064 if (i < capCount) {
2065 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "customPictureFormat[%d]", i);
2066 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2067 proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureWidth, tvb, count, 4, ENC_LITTLE_ENDIAN);
2068 count+= 4;
2069 proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureHeight, tvb, count, 4, ENC_LITTLE_ENDIAN);
2070 count+= 4;
2071 proto_tree_add_item(skinny_sub_tree, hf_skinny_pixelAspectRatio, tvb, count, 4, ENC_LITTLE_ENDIAN);
2072 count+= 4;
2073 proto_tree_add_item(skinny_sub_tree, hf_skinny_clockConversionCode, tvb, count, 4, ENC_LITTLE_ENDIAN);
2074 count+= 4;
2075 proto_tree_add_item(skinny_sub_tree, hf_skinny_clockDivisor, tvb, count, 4, ENC_LITTLE_ENDIAN);
2076 count+= 4;
2077 } else {
2078 count+=20;
2081 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "confResources");
2082 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2083 proto_tree_add_item(skinny_sub_tree, hf_skinny_activeStreamsOnRegistration, tvb, count, 4, ENC_LITTLE_ENDIAN);
2084 count+= 4;
2085 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBW, tvb, count, 4, ENC_LITTLE_ENDIAN);
2086 count+= 4;
2087 proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceResourceCount, tvb, count, 4, ENC_LITTLE_ENDIAN);
2088 count+= 4;
2089 skinny_sub_tree_sav = skinny_sub_tree;
2090 for ( i = 0; i < MAX_SERVICE_TYPE; i++ ) {
2091 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "serviceResource[%d]", i);
2092 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2093 proto_tree_add_item(skinny_sub_tree, hf_skinny_layoutCount, tvb, count, 4, ENC_LITTLE_ENDIAN);
2094 count+= 4;
2095 skinny_sub_tree_sav_sav = skinny_sub_tree_sav;
2096 for ( t = 0; t < MAX_LAYOUT_WITH_SAME_SERVICE; t++ ) {
2097 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "layouts[%d]", t);
2098 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2099 proto_tree_add_item(skinny_sub_tree, hf_skinny_layout, tvb, count, 4, ENC_LITTLE_ENDIAN);
2100 count+= 4;
2102 skinny_sub_tree = skinny_sub_tree_sav_sav;
2103 proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceNum, tvb, count, 4, ENC_LITTLE_ENDIAN);
2104 count+= 4;
2105 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxStreams, tvb, count, 4, ENC_LITTLE_ENDIAN);
2106 count+= 4;
2107 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxConferences, tvb, count, 4, ENC_LITTLE_ENDIAN);
2108 count+= 4;
2109 proto_tree_add_item(skinny_sub_tree, hf_skinny_activeConferenceOnRegistration, tvb, count, 4, ENC_LITTLE_ENDIAN);
2110 count+= 4;
2112 capCount=tvb_get_letohl(tvb, offset+12);
2113 for ( i = 0; i < StationMaxCapabilities; i++ ) {
2114 if (i < capCount) {
2115 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "audiocaps[%d]", i);
2116 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2117 proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
2118 count+= 4;
2119 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxFramesPerPacket, tvb, count, 2, ENC_LITTLE_ENDIAN);
2120 count+= 2;
2121 proto_tree_add_item(skinny_sub_tree, hf_skinny_g723BitRate, tvb, count, 2, ENC_LITTLE_ENDIAN);
2122 count+= 2;
2123 proto_tree_add_item(skinny_sub_tree, hf_skinny_unknown, tvb, count, 2, ENC_LITTLE_ENDIAN);
2124 count+= 8;
2125 } else {
2126 count+= 16;
2129 capCount=tvb_get_letohl(tvb, offset+16);
2130 for ( i = 0; i < StationMaxVideoCapabilities; i++ ) {
2131 if (i < capCount) {
2132 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "vidCaps[%d]", i);
2133 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2134 proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
2135 count+= 4;
2136 proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, ENC_LITTLE_ENDIAN);
2137 count+= 4;
2138 proto_tree_add_item(skinny_sub_tree, hf_skinny_levelPreferenceCount, tvb, count, 4, ENC_LITTLE_ENDIAN);
2139 count+= 4;
2140 skinny_sub_tree_sav = skinny_sub_tree;
2141 for ( t = 0; t < MAX_LEVEL_PREFERENCE; t++ ) {
2142 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "levelPreference[%d]", t);
2143 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2144 proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitPreference, tvb, count, 4, ENC_LITTLE_ENDIAN);
2145 count+= 4;
2146 proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, ENC_LITTLE_ENDIAN);
2147 count+= 4;
2148 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, count, 4, ENC_LITTLE_ENDIAN);
2149 count+= 4;
2150 proto_tree_add_item(skinny_sub_tree, hf_skinny_minBitRate, tvb, count, 4, ENC_LITTLE_ENDIAN);
2151 count+= 4;
2152 proto_tree_add_item(skinny_sub_tree, hf_skinny_MPI, tvb, count, 4, ENC_LITTLE_ENDIAN);
2153 count+= 4;
2154 proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceNumber, tvb, count, 4, ENC_LITTLE_ENDIAN);
2155 count+= 4;
2157 val = count;
2159 /* H.261 */
2160 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h261VideoCapability");
2161 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2162 proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
2163 count+= 4;
2164 proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, ENC_LITTLE_ENDIAN);
2165 /*count+= 4;*/
2167 /* H.263 */
2168 count = val;
2169 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h263VideoCapability");
2170 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2171 proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, ENC_LITTLE_ENDIAN);
2172 count+= 4;
2173 proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, ENC_LITTLE_ENDIAN);
2174 /*count+= 4;*/
2176 /* Video */
2177 count = val;
2178 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "vieoVideoCapability");
2179 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2180 proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, ENC_LITTLE_ENDIAN);
2181 count+= 4;
2182 proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, ENC_LITTLE_ENDIAN);
2183 count+= 4;
2184 } else {
2185 count+=28 + (MAX_LEVEL_PREFERENCE-1)*4;
2188 capCount=tvb_get_letohl(tvb, offset+20);
2189 for ( i = 0; i < StationMaxDataCapabilities; i++ ) {
2190 if ( i < capCount) {
2191 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "dataCaps[%d]", i);
2192 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2193 proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
2194 count+= 4;
2195 proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, ENC_LITTLE_ENDIAN);
2196 count+= 4;
2197 proto_tree_add_item(skinny_sub_tree, hf_skinny_protocolDependentData, tvb, count, 4, ENC_LITTLE_ENDIAN);
2198 count+= 4;
2199 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, count, 4, ENC_LITTLE_ENDIAN);
2200 count+= 4;
2201 } else {
2202 count+= 16;
2205 break;
2207 case 0x0048: /* DialedPhoneBookMessage */
2208 proto_tree_add_item(skinny_tree, hf_skinny_directoryIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2209 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2210 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2211 proto_tree_add_item(skinny_tree, hf_skinny_directoryPhoneNumber, tvb, offset+24, hdr_data_length-16, ENC_ASCII|ENC_NA);
2212 break;
2214 case 0x0049: /* AccessoryStatusMessage */
2215 proto_tree_add_item(skinny_tree, hf_skinny_accessory, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2216 proto_tree_add_item(skinny_tree, hf_skinny_accessoryState, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2217 if (hdr_data_length > 16) {
2218 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2220 break;
2222 case 0x004A: /* Unknown_Message_0x004A */
2223 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2224 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2225 if (hdr_data_length > 16) {
2226 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2228 break;
2230 case 0x004C: /* MwiNotificationMessage */
2231 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2232 break;
2236 * Call manager -> client messages start here(ish)
2239 case 0x0081: /* RegisterAckMessage */
2240 proto_tree_add_item(skinny_tree, hf_skinny_keepAliveInterval, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2241 proto_tree_add_item(skinny_tree, hf_skinny_dateTemplate, tvb, offset+16, StationDateTemplateSize, ENC_ASCII|ENC_NA);
2242 proto_tree_add_item(skinny_tree, hf_skinny_secondaryKeepAliveInterval, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2243 break;
2245 case 0x0082: /* StartToneMessage */
2246 proto_tree_add_item(skinny_tree, hf_skinny_deviceTone, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2247 /* offset 16 to 19: reserved */
2248 if (hdr_data_length > 12) {
2249 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2250 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2251 si->lineId = tvb_get_letohl(tvb, offset+20);
2252 si->callId = tvb_get_letohl(tvb, offset+24);
2254 break;
2256 case 0x0083: /* StopToneMessage */
2257 if (hdr_data_length > 4) {
2258 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2259 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2260 si->lineId = tvb_get_letohl(tvb, offset+12);
2261 si->callId = tvb_get_letohl(tvb, offset+16);
2263 break;
2265 case 0x0085: /* SetRingerMessage */
2266 proto_tree_add_item(skinny_tree, hf_skinny_ringType, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2267 proto_tree_add_item(skinny_tree, hf_skinny_ringMode, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2268 if (hdr_data_length > 12) {
2269 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2270 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2271 si->lineId = tvb_get_letohl(tvb, offset+20);
2272 si->callId = tvb_get_letohl(tvb, offset+24);
2274 break;
2276 case 0x0086: /* SetLampMessage */
2277 proto_tree_add_item(skinny_tree, hf_skinny_stimulus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2278 proto_tree_add_item(skinny_tree, hf_skinny_stimulusInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2279 proto_tree_add_item(skinny_tree, hf_skinny_lampMode, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2280 break;
2282 case 0x0087: /* SetHookFlashDetectModeMessage */
2283 proto_tree_add_item(skinny_tree, hf_skinny_hookFlashDetectMode, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2284 proto_tree_add_item(skinny_tree, hf_skinny_detectInterval, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2285 break;
2287 case 0x0088: /* SetSpeakerModeMessage */
2289 proto_tree_add_item(skinny_tree, hf_skinny_speakerMode, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2290 break;
2292 case 0x0089: /* SetMicroModeMessage */
2293 proto_tree_add_item(skinny_tree, hf_skinny_microphoneMode, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2294 break;
2296 case 0x008a: /* StartMediaTransmission */
2297 if (hdr_version == BASIC_MSG_TYPE) {
2298 address src_addr;
2299 guint32 ipv4_address;
2301 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2302 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2303 proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr, tvb, offset+20, 4, ENC_BIG_ENDIAN);
2304 proto_tree_add_item(skinny_tree, hf_skinny_remotePortNumber, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2305 proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
2306 proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
2307 proto_tree_add_item(skinny_tree, hf_skinny_precedenceValue, tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
2308 proto_tree_add_item(skinny_tree, hf_skinny_silenceSuppression, tvb, offset+40, 4, ENC_LITTLE_ENDIAN);
2309 proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+44, 2, ENC_LITTLE_ENDIAN);
2310 proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
2312 src_addr.type = AT_IPv4;
2313 src_addr.len = 4;
2314 src_addr.data = (char *)&ipv4_address;
2315 ipv4_address = tvb_get_ipv4(tvb, offset+20);
2316 rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+24), 0, "Skinny", pinfo->fd->num, is_video, NULL);
2318 si->passThruId = tvb_get_letohl(tvb, offset+16);
2320 else if (hdr_version == CM7_MSG_TYPE_A || hdr_version == CM7_MSG_TYPE_B || hdr_version == CM7_MSG_TYPE_C || hdr_version == CM7_MSG_TYPE_D)
2322 address src_addr;
2323 guint32 ipv4_address;
2325 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2326 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2327 /*Assume the field of next 4 bytes is IP Version*/
2328 ipversion = tvb_get_ntohl(tvb, offset+20);
2329 proto_tree_add_item(skinny_tree, hf_skinny_IPVersion, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2330 /*Here we take "0" as IPv4, "others" as IPv6, maybe we need to fix it later*/
2331 if (ipversion ==0) {
2332 proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr, tvb, offset+24, 4, ENC_BIG_ENDIAN);
2333 } else {
2334 proto_tree_add_item(skinny_tree, hf_skinny_ipV6Address, tvb, offset+24, 16, ENC_NA);
2336 proto_tree_add_item(skinny_tree, hf_skinny_remotePortNumber, tvb, offset+40, 4, ENC_LITTLE_ENDIAN);
2337 proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
2338 proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
2339 /* There is some more... */
2340 proto_tree_add_item(skinny_tree, hf_skinny_precedenceValue, tvb, offset+52, 4, ENC_LITTLE_ENDIAN);
2341 proto_tree_add_item(skinny_tree, hf_skinny_silenceSuppression, tvb, offset+56, 4, ENC_LITTLE_ENDIAN);
2342 proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+60, 2, ENC_LITTLE_ENDIAN);
2343 proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+62, 4, ENC_LITTLE_ENDIAN);
2344 /* proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+66, 4, ENC_LITTLE_ENDIAN); */
2345 /* proto_tree_add_item(skinny_tree, hf_skinny_rtpDTMFPayload, tvb, offset+126, 4, ENC_LITTLE_ENDIAN); */
2346 /* proto_tree_add_item(skinny_tree, hf_skinny_rtptimeout, tvb, offset+130, 4, ENC_LITTLE_ENDIAN); */
2348 src_addr.type = AT_IPv4;
2349 src_addr.len = 4;
2350 src_addr.data = (char *)&ipv4_address;
2351 ipv4_address = tvb_get_ipv4(tvb, offset+24);
2352 rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+40), 0, "Skinny", pinfo->fd->num, is_video, NULL);
2354 si->passThruId = tvb_get_letohl(tvb, offset+16);
2356 break;
2358 case 0x008b: /* StopMediaTransmission */
2359 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2360 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2361 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2362 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2363 si->passThruId = tvb_get_letohl(tvb, offset+16);
2364 break;
2366 case 0x008c: /* StartMediaReception */
2367 break;
2369 case 0x008d: /* StopMediaReception */
2370 break;
2372 case 0x008f: /* CallInfoMessage */
2373 i = offset+12;
2374 proto_tree_add_item(skinny_tree, hf_skinny_callingPartyName, tvb, i, StationMaxNameSize, ENC_ASCII|ENC_NA);
2375 proto_tree_add_item(skinny_tree, hf_skinny_callingPartyNumber, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2376 i += StationMaxNameSize;
2377 si->callingParty = g_strdup(tvb_format_stringzpad(tvb, i, StationMaxDirnumSize));
2378 i += StationMaxDirnumSize;
2379 proto_tree_add_item(skinny_tree, hf_skinny_calledPartyName, tvb, i, StationMaxNameSize, ENC_ASCII|ENC_NA);
2380 i += StationMaxNameSize;
2381 proto_tree_add_item(skinny_tree, hf_skinny_calledPartyNumber, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2382 si->calledParty = g_strdup(tvb_format_stringzpad(tvb, i, StationMaxDirnumSize));
2383 i += StationMaxDirnumSize;
2384 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, i, 4, ENC_LITTLE_ENDIAN);
2385 si->lineId = tvb_get_letohl(tvb, i);
2386 i += 4;
2387 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, i, 4, ENC_LITTLE_ENDIAN);
2388 si->callId = tvb_get_letohl(tvb, i);
2389 i += 4;
2390 proto_tree_add_item(skinny_tree, hf_skinny_callType, tvb, i, 4, ENC_LITTLE_ENDIAN);
2391 i += 4;
2392 proto_tree_add_item(skinny_tree, hf_skinny_originalCalledPartyName, tvb, i, StationMaxNameSize, ENC_ASCII|ENC_NA);
2393 i += StationMaxNameSize;
2394 proto_tree_add_item(skinny_tree, hf_skinny_originalCalledParty, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2395 i += StationMaxDirnumSize;
2396 proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingPartyName, tvb, i, StationMaxNameSize, ENC_ASCII|ENC_NA);
2397 i += StationMaxNameSize;
2398 proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingParty, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2399 i += StationMaxDirnumSize;
2400 proto_tree_add_item(skinny_tree, hf_skinny_originalCdpnRedirectReason, tvb, i, 4, ENC_LITTLE_ENDIAN);
2401 i += 4;
2402 proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingReason, tvb, i, 4, ENC_LITTLE_ENDIAN);
2403 i += 4;
2404 proto_tree_add_item(skinny_tree, hf_skinny_cgpnVoiceMailbox, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2405 i += StationMaxDirnumSize;
2406 proto_tree_add_item(skinny_tree, hf_skinny_cdpnVoiceMailbox, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2407 i += StationMaxDirnumSize;
2408 proto_tree_add_item(skinny_tree, hf_skinny_originalCdpnVoiceMailbox, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2409 i += StationMaxDirnumSize;
2410 proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingVoiceMailbox, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2411 i += StationMaxDirnumSize;
2412 proto_tree_add_item(skinny_tree, hf_skinny_callInstance, tvb, i, 4, ENC_LITTLE_ENDIAN);
2413 i += 4;
2414 proto_tree_add_item(skinny_tree, hf_skinny_callSecurityStatus, tvb, i, 4, ENC_LITTLE_ENDIAN);
2415 i += 4;
2416 ti_sub = proto_tree_add_text(skinny_tree, tvb, i, 8, "partyPIRestrictionBits");
2417 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2418 proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_CallingPartyName, tvb, i, 4, ENC_LITTLE_ENDIAN);
2419 proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_CallingPartyNumber, tvb, i, 4, ENC_LITTLE_ENDIAN);
2420 proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_CalledPartyName, tvb, i, 4, ENC_LITTLE_ENDIAN);
2421 proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_CalledPartyNumber, tvb, i, 4, ENC_LITTLE_ENDIAN);
2422 proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_OriginalCalledPartyName, tvb, i, 4, ENC_LITTLE_ENDIAN);
2423 proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_OriginalCalledPartyNumber, tvb, i, 4, ENC_LITTLE_ENDIAN);
2424 proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_LastRedirectPartyName, tvb, i, 4, ENC_LITTLE_ENDIAN);
2425 proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_LastRedirectPartyNumber, tvb, i, 4, ENC_LITTLE_ENDIAN);
2426 break;
2428 case 0x0090: /* ForwardStatMessage */
2429 proto_tree_add_item(skinny_tree, hf_skinny_activeForward, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2430 proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2431 proto_tree_add_item(skinny_tree, hf_skinny_forwardAllActive, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2432 proto_tree_add_item(skinny_tree, hf_skinny_forwardNumber, tvb, offset+24, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2433 i = offset+24+StationMaxDirnumSize;
2434 proto_tree_add_item(skinny_tree, hf_skinny_forwardBusyActive, tvb, i, 4, ENC_LITTLE_ENDIAN);
2435 i += 4;
2436 proto_tree_add_item(skinny_tree, hf_skinny_forwardNumber, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2437 i += StationMaxDirnumSize;
2438 proto_tree_add_item(skinny_tree, hf_skinny_forwardNoAnswerActive, tvb, i, 4, ENC_LITTLE_ENDIAN);
2439 i += 4;
2440 proto_tree_add_item(skinny_tree, hf_skinny_forwardNumber, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2441 break;
2443 case 0x0091: /* SpeedDialStatMessage */
2444 proto_tree_add_item(skinny_tree, hf_skinny_speedDialNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2445 proto_tree_add_item(skinny_tree, hf_skinny_speedDialDirNumber, tvb, offset+16, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2446 proto_tree_add_item(skinny_tree, hf_skinny_speedDialDisplayName, tvb, offset+40, StationMaxNameSize, ENC_ASCII|ENC_NA);
2447 break;
2449 case 0x0092: /* LineStatMessage */
2450 proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2451 proto_tree_add_item(skinny_tree, hf_skinny_lineDirNumber, tvb, offset+16, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2452 proto_tree_add_item(skinny_tree, hf_skinny_lineFullyQualifiedDisplayName, tvb, offset+16+StationMaxDirnumSize, StationMaxNameSize, ENC_ASCII|ENC_NA);
2453 proto_tree_add_item(skinny_tree, hf_skinny_lineDisplayName, tvb, offset+16+StationMaxDirnumSize+StationMaxNameSize, StationMaxDisplayNameSize, ENC_ASCII|ENC_NA);
2454 break;
2456 case 0x0093: /* ConfigStatMessage */
2457 proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, StationMaxDeviceNameSize, ENC_ASCII|ENC_NA);
2458 i = offset+12+StationMaxDeviceNameSize;
2459 proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, i, 4, ENC_LITTLE_ENDIAN);
2460 i += 4;
2461 proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, i, 4, ENC_LITTLE_ENDIAN);
2462 i += 4;
2463 proto_tree_add_item(skinny_tree, hf_skinny_userName, tvb, i, StationMaxNameSize, ENC_ASCII|ENC_NA);
2464 i += StationMaxNameSize;
2465 proto_tree_add_item(skinny_tree, hf_skinny_serverName, tvb, i, StationMaxNameSize, ENC_ASCII|ENC_NA);
2466 i += StationMaxNameSize;
2467 proto_tree_add_item(skinny_tree, hf_skinny_numberLines, tvb, i, 4, ENC_LITTLE_ENDIAN);
2468 proto_tree_add_item(skinny_tree, hf_skinny_numberSpeedDials, tvb, i+4, 4, ENC_LITTLE_ENDIAN);
2469 break;
2471 case 0x0094: /* DefineTimeDate */
2472 proto_tree_add_item(skinny_tree, hf_skinny_dateYear, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2473 proto_tree_add_item(skinny_tree, hf_skinny_dateMonth, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2474 proto_tree_add_item(skinny_tree, hf_skinny_dayOfWeek, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2475 proto_tree_add_item(skinny_tree, hf_skinny_dateDay, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2476 proto_tree_add_item(skinny_tree, hf_skinny_dateHour, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
2477 proto_tree_add_item(skinny_tree, hf_skinny_dateMinute, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
2478 proto_tree_add_item(skinny_tree, hf_skinny_dateSeconds,tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
2479 proto_tree_add_item(skinny_tree, hf_skinny_dateMilliseconds,tvb, offset+40, 4, ENC_LITTLE_ENDIAN);
2480 proto_tree_add_item(skinny_tree, hf_skinny_timeStamp, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
2481 break;
2483 case 0x0095: /* StartSessionTransmission */
2484 proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr, tvb, offset+12, 4, ENC_BIG_ENDIAN);
2485 proto_tree_add_item(skinny_tree, hf_skinny_sessionType, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2486 break;
2488 case 0x0096: /* StopSessionTransmission */
2489 proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr, tvb, offset+12, 4, ENC_BIG_ENDIAN);
2490 proto_tree_add_item(skinny_tree, hf_skinny_sessionType, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2491 break;
2493 case 0x0097: /* ButtonTemplateMessage */
2495 * FIXME
2496 * This decode prints out oogly subtree maybe? or something besides the VALS...
2497 * note to self: uint8 != 4 kk thx info ^_^
2500 proto_tree_add_item(skinny_tree, hf_skinny_buttonOffset, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2501 proto_tree_add_item(skinny_tree, hf_skinny_buttonCount, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2502 proto_tree_add_item(skinny_tree, hf_skinny_totalButtonCount, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2503 for (i = 0; i < StationMaxButtonTemplateSize; i++) {
2504 proto_tree_add_item(skinny_tree, hf_skinny_buttonInstanceNumber, tvb, offset+(i*2)+24, 1, ENC_LITTLE_ENDIAN);
2505 proto_tree_add_item(skinny_tree, hf_skinny_buttonDefinition, tvb, offset+(i*2)+25, 1, ENC_LITTLE_ENDIAN);
2507 break;
2509 case 0x0098: /* VersionMessage */
2510 proto_tree_add_item(skinny_tree, hf_skinny_version, tvb, offset+12, StationMaxVersionSize, ENC_ASCII|ENC_NA);
2511 break;
2513 case 0x0099: /* DisplayTextMessage */
2514 proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+12, StationMaxDisplayTextSize, ENC_ASCII|ENC_NA);
2515 break;
2517 case 0x009a: /* ClearDisplay */
2518 break;
2520 case 0x009b: /* CapabilitiesReqMessage */
2521 break;
2523 case 0x009c: /* EnunciatorCommandMessage */
2524 proto_tree_add_item(skinny_tree, hf_skinny_mediaEnunciationType, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2525 for (i = 0; i < StationMaxDirnumSize; i++) {
2526 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+16+(i*4), 4, ENC_LITTLE_ENDIAN);
2528 i = offset+16+StationMaxDirnumSize;
2529 proto_tree_add_item(skinny_tree, hf_skinny_mediaEnunciationType, tvb, i, 4, ENC_LITTLE_ENDIAN);
2530 break;
2532 case 0x009d: /* RegisterRejectMessage */
2533 proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+12, StationMaxDisplayTextSize, ENC_ASCII|ENC_NA);
2534 break;
2536 case 0x009e: /* ServerResMessage */
2537 for (i = 0; i < StationMaxServers; i++) {
2538 proto_tree_add_item(skinny_tree, hf_skinny_serverIdentifier,
2539 tvb, offset+12+(i*StationMaxServers), StationMaxServerNameSize, ENC_ASCII|ENC_NA);
2541 j = offset+12+(i*StationMaxServers);
2542 for (i = 0; i < StationMaxServers; i++) {
2543 proto_tree_add_item(skinny_tree, hf_skinny_serverListenPort, tvb, j+(i*4), 4, ENC_LITTLE_ENDIAN);
2545 j = j+(i*4);
2546 for (i = 0; i < StationMaxServers; i++) {
2547 proto_tree_add_item(skinny_tree, hf_skinny_serverIpAddress, tvb, j+(i*4), 4, ENC_BIG_ENDIAN);
2549 break;
2551 case 0x009f: /* Reset */
2552 proto_tree_add_item(skinny_tree, hf_skinny_deviceResetType, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2553 break;
2555 case 0x0100: /* KeepAliveAckMessage */
2556 break;
2558 case 0x0101: /* StartMulticastMediaReception */
2559 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2560 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2561 proto_tree_add_item(skinny_tree, hf_skinny_multicastIpAddress, tvb, offset+20, 4, ENC_BIG_ENDIAN);
2562 proto_tree_add_item(skinny_tree, hf_skinny_multicastPort, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2563 proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
2564 proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
2565 proto_tree_add_item(skinny_tree, hf_skinny_echoCancelType, tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
2566 proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+40, 4, ENC_LITTLE_ENDIAN);
2567 si->passThruId = tvb_get_letohl(tvb, offset+16);
2568 break;
2570 case 0x0102: /* StartMulticastMediaTransmission */
2571 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2572 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2573 proto_tree_add_item(skinny_tree, hf_skinny_multicastIpAddress, tvb, offset+20, 4, ENC_BIG_ENDIAN);
2574 proto_tree_add_item(skinny_tree, hf_skinny_multicastPort, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2575 proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
2576 proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
2577 proto_tree_add_item(skinny_tree, hf_skinny_precedenceValue, tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
2578 proto_tree_add_item(skinny_tree, hf_skinny_silenceSuppression, tvb, offset+40, 4, ENC_LITTLE_ENDIAN);
2579 proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+44, 2, ENC_LITTLE_ENDIAN);
2580 proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
2581 si->passThruId = tvb_get_letohl(tvb, offset+16);
2582 break;
2584 case 0x0103: /* StopMulticastMediaReception */
2585 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2586 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2587 si->passThruId = tvb_get_letohl(tvb, offset+16);
2588 break;
2590 case 0x0104: /* StopMulticastMediaTransmission */
2591 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2592 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2593 si->passThruId = tvb_get_letohl(tvb, offset+16);
2594 break;
2596 case 0x105: /* OpenReceiveChannel */
2597 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2598 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2599 proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2600 proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2601 proto_tree_add_item(skinny_tree, hf_skinny_echoCancelType, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
2602 proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
2603 si->passThruId = tvb_get_letohl(tvb, offset+16);
2604 break;
2606 case 0x0106: /* CloseReceiveChannel */
2607 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2608 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2609 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2610 si->passThruId = tvb_get_letohl(tvb, offset+16);
2611 break;
2613 case 0x0107: /* ConnectionStatisticsReq */
2614 i = 12;
2615 proto_tree_add_item(skinny_tree, hf_skinny_directoryNumber, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2616 i = 12 + StationMaxDirnumSize;
2617 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, i, 4, ENC_LITTLE_ENDIAN);
2618 si->callId = tvb_get_letohl(tvb, i);
2619 i = i+4;
2620 proto_tree_add_item(skinny_tree, hf_skinny_statsProcessingType, tvb, i, 4, ENC_LITTLE_ENDIAN);
2621 break;
2623 case 0x0108: /* SoftKeyTemplateResMessage */
2624 proto_tree_add_item(skinny_tree, hf_skinny_softKeyOffset, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2625 softKeyCount = tvb_get_letohl(tvb, offset+16);
2626 proto_tree_add_uint(skinny_tree, hf_skinny_softKeyCount, tvb, offset+16, 4, softKeyCount);
2627 proto_tree_add_item(skinny_tree, hf_skinny_totalSoftKeyCount, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2628 for (i = 0; ((i < StationMaxSoftKeyDefinition) && (i < softKeyCount)); i++){
2629 proto_tree_add_item(skinny_tree, hf_skinny_softKeyLabel,
2630 tvb, offset+(i*20)+24, StationMaxSoftKeyLabelSize, ENC_ASCII|ENC_NA);
2631 proto_tree_add_item(skinny_tree, hf_skinny_softKeyEvent, tvb, offset+(i*20)+40, 4, ENC_LITTLE_ENDIAN);
2633 /* there is more data here, but it doesn't make a whole lot of sense, I imagine
2634 * it's just some not zero'd out stuff in the packet or...
2636 break;
2638 case 0x0109: /* SoftKeySetResMessage */
2639 proto_tree_add_item(skinny_tree, hf_skinny_softKeySetOffset, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2640 softKeySetCount = tvb_get_letohl(tvb, offset+16);
2641 proto_tree_add_uint(skinny_tree, hf_skinny_softKeySetCount, tvb, offset+16, 4, softKeySetCount);
2642 proto_tree_add_item(skinny_tree, hf_skinny_totalSoftKeySetCount, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2643 for (i = 0; ((i < StationMaxSoftKeySetDefinition) && (i < softKeySetCount)); i++) {
2644 proto_tree_add_uint(skinny_tree, hf_skinny_softKeySetDescription, tvb, offset+24+(i*48) , 1, i);
2645 for (j = 0; j < StationMaxSoftKeyIndex; j++) {
2646 proto_tree_add_item(skinny_tree, hf_skinny_softKeyTemplateIndex, tvb, offset+24+(i*48)+j, 1, ENC_LITTLE_ENDIAN);
2648 for (j = 0; j < StationMaxSoftKeyIndex; j++) {
2649 proto_tree_add_item(skinny_tree, hf_skinny_softKeyInfoIndex,
2650 tvb, offset+24+(i*48)+StationMaxSoftKeyIndex+(j*2), 2, ENC_LITTLE_ENDIAN);
2653 break;
2655 case 0x0110: /* SelectSoftKeysMessage */
2656 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2657 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2658 proto_tree_add_item(skinny_tree, hf_skinny_softKeySetDescription, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2659 validKeyMask = tvb_get_letohs(tvb, offset + 24);
2660 skm = proto_tree_add_uint(skinny_tree, hf_skinny_softKeyMap, tvb, offset + 24, 4, validKeyMask);
2661 skm_tree = proto_item_add_subtree(skm, ett_skinny_softKeyMap);
2662 proto_tree_add_boolean(skm_tree, hf_skinny_softKey0, tvb, offset + 24, 4, validKeyMask);
2663 proto_tree_add_boolean(skm_tree, hf_skinny_softKey1, tvb, offset + 24, 4, validKeyMask);
2664 proto_tree_add_boolean(skm_tree, hf_skinny_softKey2, tvb, offset + 24, 4, validKeyMask);
2665 proto_tree_add_boolean(skm_tree, hf_skinny_softKey3, tvb, offset + 24, 4, validKeyMask);
2666 proto_tree_add_boolean(skm_tree, hf_skinny_softKey4, tvb, offset + 24, 4, validKeyMask);
2667 proto_tree_add_boolean(skm_tree, hf_skinny_softKey5, tvb, offset + 24, 4, validKeyMask);
2668 proto_tree_add_boolean(skm_tree, hf_skinny_softKey6, tvb, offset + 24, 4, validKeyMask);
2669 proto_tree_add_boolean(skm_tree, hf_skinny_softKey7, tvb, offset + 24, 4, validKeyMask);
2670 proto_tree_add_boolean(skm_tree, hf_skinny_softKey8, tvb, offset + 24, 4, validKeyMask);
2671 proto_tree_add_boolean(skm_tree, hf_skinny_softKey9, tvb, offset + 24, 4, validKeyMask);
2672 proto_tree_add_boolean(skm_tree, hf_skinny_softKey10, tvb, offset + 24, 4, validKeyMask);
2673 proto_tree_add_boolean(skm_tree, hf_skinny_softKey11, tvb, offset + 24, 4, validKeyMask);
2674 proto_tree_add_boolean(skm_tree, hf_skinny_softKey12, tvb, offset + 24, 4, validKeyMask);
2675 proto_tree_add_boolean(skm_tree, hf_skinny_softKey13, tvb, offset + 24, 4, validKeyMask);
2676 proto_tree_add_boolean(skm_tree, hf_skinny_softKey14, tvb, offset + 24, 4, validKeyMask);
2677 proto_tree_add_boolean(skm_tree, hf_skinny_softKey15, tvb, offset + 24, 4, validKeyMask);
2678 si->lineId = tvb_get_letohl(tvb, offset+12);
2679 si->callId = tvb_get_letohl(tvb, offset+16);
2680 break;
2682 case 0x0111: /* CallStateMessage */
2683 proto_tree_add_item(skinny_tree, hf_skinny_callState, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2684 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2685 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2686 si->callState = tvb_get_letohl(tvb, offset+12);
2687 si->lineId = tvb_get_letohl(tvb, offset+16);
2688 si->callId = tvb_get_letohl(tvb, offset+20);
2689 proto_tree_add_item(skinny_tree, hf_skinny_visibility, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2690 proto_tree_add_item(skinny_tree, hf_skinny_priority, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
2691 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
2692 break;
2694 case 0x0112: /* DisplayPromptStatusMessage */
2695 proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2696 proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, StationMaxDisplayPromptStatusSize, ENC_ASCII|ENC_NA);
2697 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
2698 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+52, 4, ENC_LITTLE_ENDIAN);
2699 si->lineId = tvb_get_letohl(tvb, offset+48);
2700 si->callId = tvb_get_letohl(tvb, offset+52);
2701 break;
2703 case 0x0113: /* ClearPromptStatusMessage */
2704 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance , tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2705 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2706 si->lineId = tvb_get_letohl(tvb, offset+12);
2707 si->callId = tvb_get_letohl(tvb, offset+16);
2708 break;
2710 case 0x0114: /* DisplayNotifyMessage */
2711 proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2712 proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, StationMaxDisplayNotifySize , ENC_ASCII|ENC_NA);
2713 break;
2715 case 0x0115: /* ClearNotifyMessage */
2716 break;
2718 case 0x0116: /* ActivateCallPlaneMessage */
2719 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2720 si->lineId = tvb_get_letohl(tvb, offset+12);
2721 break;
2723 case 0x0117: /* DeactivateCallPlaneMessage */
2724 break;
2726 case 0x0118: /* UnregisterAckMessage */
2727 proto_tree_add_item(skinny_tree, hf_skinny_deviceUnregisterStatus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2728 break;
2730 case 0x0119: /* BackSpaceReqMessage */
2731 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2732 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2733 si->lineId = tvb_get_letohl(tvb, offset+12);
2734 si->callId = tvb_get_letohl(tvb, offset+16);
2735 break;
2737 case 0x011a: /* RegisterTokenAck */
2738 break;
2740 case 0x011B: /* RegisterTokenReject */
2741 proto_tree_add_item(skinny_tree, hf_skinny_tokenRejWaitTime, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2742 break;
2744 case 0x011C: /* StartMediaFailureDetection */
2745 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2746 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2747 proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2748 proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2749 proto_tree_add_item(skinny_tree, hf_skinny_echoCancelType, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
2750 proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
2751 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+34, 4, ENC_LITTLE_ENDIAN);
2752 si->passThruId = tvb_get_letohl(tvb, offset+16);
2753 si->callId = tvb_get_letohl(tvb, offset+34);
2754 break;
2756 case 0x011D: /* DialedNumberMessage */
2757 proto_tree_add_item(skinny_tree, hf_skinny_calledPartyNumber, tvb, offset+12, StationMaxDirnumSize, ENC_ASCII|ENC_NA);
2758 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12+StationMaxDirnumSize, 4, ENC_LITTLE_ENDIAN);
2759 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+12+StationMaxDirnumSize+4, 4, ENC_LITTLE_ENDIAN);
2760 si->lineId = tvb_get_letohl(tvb, offset+12+StationMaxDirnumSize);
2761 si->callId = tvb_get_letohl(tvb, offset+16+StationMaxDirnumSize);
2762 break;
2764 case 0x011E: /* UserToDeviceDataMessage */
2765 proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2766 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2767 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2768 proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2769 proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
2770 count = tvb_get_letohl( tvb, offset+28);
2771 dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+30, count);
2772 si->lineId = tvb_get_letohl(tvb, offset+16);
2773 si->callId = tvb_get_letohl(tvb, offset+20);
2774 break;
2776 case 0x011F: /* FeatureStatMessage */
2777 proto_tree_add_item(skinny_tree, hf_skinny_featureIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2778 proto_tree_add_item(skinny_tree, hf_skinny_featureID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2779 proto_tree_add_item(skinny_tree, hf_skinny_featureTextLabel, tvb, offset+20, StationMaxNameSize, ENC_ASCII|ENC_NA);
2780 proto_tree_add_item(skinny_tree, hf_skinny_featureStatus, tvb, offset+20+StationMaxNameSize, 4, ENC_LITTLE_ENDIAN);
2781 break;
2783 case 0x0120: /* DisplayPriNotifyMessage */
2784 proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2785 proto_tree_add_item(skinny_tree, hf_skinny_priority, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2786 proto_tree_add_item(skinny_tree, hf_skinny_notify, tvb, offset+16, StationMaxDisplayNotifySize, ENC_ASCII|ENC_NA);
2787 break;
2789 case 0x0121: /* ClearPriNotifyMessage */
2790 proto_tree_add_item(skinny_tree, hf_skinny_priority, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2791 break;
2793 case 0x0122: /* StartAnnouncementMessage */
2794 count = offset+12;
2795 for ( i = 0; i < MaxAnnouncementList; i++ ) {
2796 proto_tree_add_item(skinny_tree, hf_skinny_locale, tvb, count, 4, ENC_LITTLE_ENDIAN);
2797 count += 4;
2798 proto_tree_add_item(skinny_tree, hf_skinny_country, tvb, count, 4, ENC_LITTLE_ENDIAN);
2799 count += 4;
2800 proto_tree_add_item(skinny_tree, hf_skinny_deviceTone, tvb, count, 4, ENC_LITTLE_ENDIAN);
2801 count += 4;
2803 proto_tree_add_item(skinny_tree, hf_skinny_endOfAnnAck, tvb, count, 4, ENC_LITTLE_ENDIAN);
2804 count += 4;
2805 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, count, 4, ENC_LITTLE_ENDIAN);
2806 count += 4;
2808 for ( i = 0; i < StationMaxMonitorParties; i++ ) {
2809 proto_tree_add_item(skinny_tree, hf_skinny_matrixConfPartyID, tvb, count, 4, ENC_LITTLE_ENDIAN);
2810 count += 4;
2812 proto_tree_add_item(skinny_tree, hf_skinny_hearingConfPartyMask, tvb, count, 4, ENC_LITTLE_ENDIAN);
2813 count += 4;
2814 proto_tree_add_item(skinny_tree, hf_skinny_annPlayMode, tvb, count, 4, ENC_LITTLE_ENDIAN);
2815 break;
2817 case 0x0123: /* StopAnnouncementMessage */
2818 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2819 break;
2821 case 0x0124: /* AnnouncementFinishMessage */
2822 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2823 proto_tree_add_item(skinny_tree, hf_skinny_annPlayStatus, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2824 break;
2826 case 0x0127: /* NotifyDtmfToneMessage */
2827 proto_tree_add_item(skinny_tree, hf_skinny_deviceTone, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2828 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2829 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2830 si->passThruId = tvb_get_letohl(tvb, offset+20);
2831 break;
2833 case 0x0128: /* SendDtmfToneMessage */
2834 proto_tree_add_item(skinny_tree, hf_skinny_deviceTone, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2835 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2836 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2837 si->passThruId = tvb_get_letohl(tvb, offset+20);
2838 break;
2840 case 0x0129: /* SubscribeDtmfPayloadReqMessage */
2841 proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2842 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2843 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2844 si->passThruId = tvb_get_letohl(tvb, offset+20);
2845 break;
2847 case 0x012A: /* SubscribeDtmfPayloadResMessage */
2848 proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2849 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2850 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2851 si->passThruId = tvb_get_letohl(tvb, offset+20);
2852 break;
2854 case 0x012B: /* SubscribeDtmfPayloadErrMessage */
2855 proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2856 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2857 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2858 si->passThruId = tvb_get_letohl(tvb, offset+20);
2859 break;
2861 case 0x012C: /* UnSubscribeDtmfPayloadReqMessage */
2862 proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2863 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2864 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2865 si->passThruId = tvb_get_letohl(tvb, offset+20);
2866 break;
2868 case 0x012D: /* UnSubscribeDtmfPayloadResMessage */
2869 proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2870 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2871 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2872 si->passThruId = tvb_get_letohl(tvb, offset+20);
2873 break;
2875 case 0x012E: /* UnSubscribeDtmfPayloadErrMessage */
2876 proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2877 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2878 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2879 si->passThruId = tvb_get_letohl(tvb, offset+20);
2880 break;
2882 case 0x012F: /* ServiceURLStatMessage */
2883 proto_tree_add_item(skinny_tree, hf_skinny_serviceURLIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2884 proto_tree_add_item(skinny_tree, hf_skinny_serviceURL, tvb, offset+16, StationMaxServiceURLSize, ENC_ASCII|ENC_NA);
2885 proto_tree_add_item(skinny_tree, hf_skinny_serviceURLDisplayName, tvb, offset+16+StationMaxServiceURLSize, StationMaxNameSize, ENC_ASCII|ENC_NA);
2886 break;
2888 case 0x0130: /* CallSelectStatMessage */
2889 proto_tree_add_item(skinny_tree, hf_skinny_callSelectStat, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2890 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2891 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2892 si->lineId = tvb_get_letohl(tvb, offset+16);
2893 si->callId = tvb_get_letohl(tvb, offset+20);
2894 break;
2896 case 0x0131: /* OpenMultiMediaChannelMessage */
2897 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2898 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2899 proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2900 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
2901 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
2902 proto_tree_add_item(skinny_tree, hf_skinny_payload_rfc_number, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
2903 proto_tree_add_item(skinny_tree, hf_skinny_payloadType, tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
2904 proto_tree_add_item(skinny_tree, hf_skinny_isConferenceCreator, tvb, offset+40, 4, ENC_LITTLE_ENDIAN);
2905 si->passThruId = tvb_get_letohl(tvb, offset+16);
2906 si->lineId = tvb_get_letohl(tvb, offset+24);
2907 si->callId = tvb_get_letohl(tvb, offset+28);
2909 /* add audio part of union */
2910 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 12, "audioParameters");
2911 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2912 proto_tree_add_item(skinny_sub_tree, hf_skinny_millisecondPacketSize, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
2913 proto_tree_add_item(skinny_sub_tree, hf_skinny_echoCancelType, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
2914 proto_tree_add_item(skinny_sub_tree, hf_skinny_g723BitRate, tvb, offset+52, 4, ENC_LITTLE_ENDIAN);
2916 /* add video part of union */
2917 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 30, "vidParameters");
2918 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2919 proto_tree_add_item(skinny_sub_tree, hf_skinny_bitRate, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
2920 proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureFormatCount, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
2921 skinny_sub_tree_sav = skinny_sub_tree;
2922 count = offset+52;
2923 for ( i = 0; i < MAX_PICTURE_FORMAT; i++ ) {
2924 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8 * MAX_PICTURE_FORMAT, "pictureFormat[%d]", i);
2925 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2926 proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, ENC_LITTLE_ENDIAN);
2927 count += 4;
2928 proto_tree_add_item(skinny_sub_tree, hf_skinny_MPI, tvb, count, 4, ENC_LITTLE_ENDIAN);
2929 count += 4;
2931 skinny_sub_tree = skinny_sub_tree_sav;
2932 proto_tree_add_item(skinny_sub_tree, hf_skinny_confServiceNum, tvb, count, 4, ENC_LITTLE_ENDIAN);
2933 count += 4;
2935 val = count;
2936 /* add H261 part of union */
2937 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h261VideoCapability");
2938 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2939 proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
2940 count += 4;
2941 proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, ENC_LITTLE_ENDIAN);
2943 /* add H263 part of union */
2944 count = val;
2945 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h263VideoCapability");
2946 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2947 proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, ENC_LITTLE_ENDIAN);
2948 count += 4;
2949 proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, ENC_LITTLE_ENDIAN);
2951 /* add Vieo part of union */
2952 count = val;
2953 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "vieoVideoCapability");
2954 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2955 proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, ENC_LITTLE_ENDIAN);
2956 count += 4;
2957 proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, ENC_LITTLE_ENDIAN);
2959 /* add data part of union */
2960 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "dataParameters");
2961 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2962 proto_tree_add_item(skinny_sub_tree, hf_skinny_protocolDependentData, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
2963 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
2964 break;
2966 case 0x0132: /* StartMultiMediaTransmission */
2967 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
2968 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
2969 proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
2970 proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+24, 4, ENC_BIG_ENDIAN);
2971 proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
2972 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
2973 proto_tree_add_item(skinny_tree, hf_skinny_payload_rfc_number, tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
2974 proto_tree_add_item(skinny_tree, hf_skinny_payloadType, tvb, offset+40, 4, ENC_LITTLE_ENDIAN);
2975 proto_tree_add_item(skinny_tree, hf_skinny_DSCPValue, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
2976 si->passThruId = tvb_get_letohl(tvb, offset+16);
2977 si->callId = tvb_get_letohl(tvb, offset+32);
2979 /* add audio part of union */
2980 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 12, "audioParameters");
2981 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2982 proto_tree_add_item(skinny_sub_tree, hf_skinny_millisecondPacketSize, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
2983 proto_tree_add_item(skinny_sub_tree, hf_skinny_echoCancelType, tvb, offset+52, 4, ENC_LITTLE_ENDIAN);
2984 proto_tree_add_item(skinny_sub_tree, hf_skinny_g723BitRate, tvb, offset+56, 4, ENC_LITTLE_ENDIAN);
2986 /* add video part of union */
2987 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 30, "vidParameters");
2988 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2989 proto_tree_add_item(skinny_sub_tree, hf_skinny_bitRate, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
2990 proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureFormatCount, tvb, offset+52, 4, ENC_LITTLE_ENDIAN);
2991 skinny_sub_tree_sav = skinny_sub_tree;
2992 count = offset+56;
2993 for ( i = 0; i < MAX_PICTURE_FORMAT; i++ ) {
2994 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8 * MAX_PICTURE_FORMAT, "pictureFormat[%d]", i);
2995 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
2996 proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, ENC_LITTLE_ENDIAN);
2997 count += 4;
2998 proto_tree_add_item(skinny_sub_tree, hf_skinny_MPI, tvb, count, 4, ENC_LITTLE_ENDIAN);
2999 count += 4;
3001 skinny_sub_tree = skinny_sub_tree_sav;
3002 proto_tree_add_item(skinny_sub_tree, hf_skinny_confServiceNum, tvb, count, 4, ENC_LITTLE_ENDIAN);
3003 count += 4;
3005 val = count;
3006 /* add H261 part of union */
3007 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h261VideoCapability");
3008 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
3009 proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
3010 count += 4;
3011 proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, ENC_LITTLE_ENDIAN);
3013 /* add H263 part of union */
3014 count = val;
3015 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h263VideoCapability");
3016 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
3017 proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, ENC_LITTLE_ENDIAN);
3018 count += 4;
3019 proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, ENC_LITTLE_ENDIAN);
3021 /* add Vieo part of union */
3022 count = val;
3023 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "vieoVideoCapability");
3024 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
3025 proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, ENC_LITTLE_ENDIAN);
3026 count += 4;
3027 proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, ENC_LITTLE_ENDIAN);
3029 /* add data part of union */
3030 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "dataParameters");
3031 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
3032 proto_tree_add_item(skinny_sub_tree, hf_skinny_protocolDependentData, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
3033 proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, offset+52, 4, ENC_LITTLE_ENDIAN);
3034 break;
3036 case 0x0133: /* StopMultiMediaTransmission */
3037 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3038 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3039 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3040 si->passThruId = tvb_get_letohl(tvb, offset+16);
3041 si->callId = tvb_get_letohl(tvb, offset+20);
3042 break;
3044 case 0x0134: /* MiscellaneousCommandMessage */
3045 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3046 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3047 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3048 proto_tree_add_item(skinny_tree, hf_skinny_miscCommandType, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
3049 si->passThruId = tvb_get_letohl(tvb, offset+16);
3050 si->callId = tvb_get_letohl(tvb, offset+20);
3052 /* show videoFreezePicture */
3053 /* not sure of format */
3055 /* show videoFastUpdatePicture */
3056 /* not sure of format */
3058 /* show videoFastUpdateGOB */
3059 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "videoFastUpdateGOB");
3060 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
3061 proto_tree_add_item(skinny_sub_tree, hf_skinny_firstGOB, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
3062 proto_tree_add_item(skinny_sub_tree, hf_skinny_numberOfGOBs, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
3064 /* show videoFastUpdateMB */
3065 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "videoFastUpdateGOB");
3066 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
3067 proto_tree_add_item(skinny_sub_tree, hf_skinny_firstGOB, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
3068 proto_tree_add_item(skinny_sub_tree, hf_skinny_firstMB, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
3069 proto_tree_add_item(skinny_sub_tree, hf_skinny_numberOfMBs, tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
3071 /* show lostPicture */
3072 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "lostPicture");
3073 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
3074 proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureNumber, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
3075 proto_tree_add_item(skinny_sub_tree, hf_skinny_longTermPictureIndex, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
3077 /* show lostPartialPicture */
3078 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "lostPartialPicture");
3079 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
3080 proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureNumber, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
3081 proto_tree_add_item(skinny_sub_tree, hf_skinny_longTermPictureIndex, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
3082 proto_tree_add_item(skinny_sub_tree, hf_skinny_firstMB, tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
3083 proto_tree_add_item(skinny_sub_tree, hf_skinny_numberOfMBs, tvb, offset+40, 4, ENC_LITTLE_ENDIAN);
3085 /* show recoveryReferencePicture */
3086 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "recoveryReferencePicture");
3087 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
3088 proto_tree_add_item(skinny_sub_tree, hf_skinny_recoveryReferencePictureCount, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
3089 skinny_sub_tree_sav = skinny_sub_tree;
3090 for ( i = 0; i < MAX_REFERENCE_PICTURE; i++ ) {
3091 ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "recoveryReferencePicture[%d]", i);
3092 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
3093 proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureNumber, tvb, offset+32+(i*8), 4, ENC_LITTLE_ENDIAN);
3094 proto_tree_add_item(skinny_sub_tree, hf_skinny_longTermPictureIndex, tvb, offset+36+(i*8), 4, ENC_LITTLE_ENDIAN);
3097 /* show temporalSpatialTradeOff */
3098 ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 4, "temporalSpatialTradeOff");
3099 skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
3100 proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOff, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
3101 break;
3103 case 0x0135: /* FlowControlCommandMessage */
3104 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3105 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3106 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3107 proto_tree_add_item(skinny_tree, hf_skinny_maxBitRate, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
3108 si->passThruId = tvb_get_letohl(tvb, offset+16);
3109 si->callId = tvb_get_letohl(tvb, offset+20);
3110 break;
3112 case 0x0136: /* CloseMultiMediaReceiveChannel */
3113 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3114 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3115 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3116 si->passThruId = tvb_get_letohl(tvb, offset+16);
3117 si->callId = tvb_get_letohl(tvb, offset+20);
3118 break;
3120 case 0x0137: /* CreateConferenceReqMessage */
3121 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3122 proto_tree_add_item(skinny_tree, hf_skinny_numberOfReservedParticipants, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3123 proto_tree_add_item(skinny_tree, hf_skinny_resourceTypes, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3124 proto_tree_add_item(skinny_tree, hf_skinny_appID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3125 count = offset+24;
3126 proto_tree_add_uint(skinny_tree, hf_skinny_appConfID, tvb, count, 1, AppConferenceIDSize);
3127 count += AppConferenceIDSize;
3128 proto_tree_add_uint(skinny_tree, hf_skinny_appData, tvb, count, 1, AppDataSize);
3129 count += AppDataSize;
3130 proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, count, 4, ENC_LITTLE_ENDIAN);
3131 val = tvb_get_letohl( tvb, count);
3132 count += 4;
3133 proto_tree_add_uint(skinny_tree, hf_skinny_passThruData, tvb, count, 1, val);
3134 break;
3136 case 0x0138: /* DeleteConferenceReqMessage */
3137 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3138 break;
3140 case 0x0139: /* ModifyConferenceReqMessage */
3141 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3142 proto_tree_add_item(skinny_tree, hf_skinny_numberOfReservedParticipants, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3143 proto_tree_add_item(skinny_tree, hf_skinny_appID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3144 count = offset+24;
3145 proto_tree_add_uint(skinny_tree, hf_skinny_appConfID, tvb, count, 1, AppConferenceIDSize);
3146 count += AppConferenceIDSize;
3147 proto_tree_add_uint(skinny_tree, hf_skinny_appData, tvb, count, 1, AppDataSize);
3148 count += AppDataSize;
3149 proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, count, 4, ENC_LITTLE_ENDIAN);
3150 val = tvb_get_letohl( tvb, count);
3151 count += 4;
3152 proto_tree_add_uint(skinny_tree, hf_skinny_passThruData, tvb, count, 1, val);
3153 break;
3155 case 0x013A: /* AddParticipantReqMessage */
3156 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3157 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3158 si->callId = tvb_get_letohl(tvb, offset+16);
3159 break;
3161 case 0x013B: /* DropParticipantReqMessage */
3162 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3163 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3164 si->callId = tvb_get_letohl(tvb, offset+16);
3165 break;
3167 case 0x013C: /* AuditConferenceReqMessage */
3168 break;
3170 case 0x013D: /* AuditParticipantReqMessage */
3171 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3172 break;
3174 case 0x013F: /* UserToDeviceDataVersion1Message */
3175 proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3176 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3177 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3178 proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
3179 proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
3180 count = tvb_get_letohl( tvb, offset+28);
3181 proto_tree_add_item(skinny_tree, hf_skinny_sequenceFlag, tvb, offset+30, 4, ENC_LITTLE_ENDIAN);
3182 proto_tree_add_item(skinny_tree, hf_skinny_displayPriority, tvb, offset+34, 4, ENC_LITTLE_ENDIAN);
3183 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+38, 4, ENC_LITTLE_ENDIAN);
3184 proto_tree_add_item(skinny_tree, hf_skinny_appInstanceID, tvb, offset+42, 4, ENC_LITTLE_ENDIAN);
3185 proto_tree_add_item(skinny_tree, hf_skinny_routingID, tvb, offset+46, 4, ENC_LITTLE_ENDIAN);
3186 dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+50, count);
3187 si->lineId = tvb_get_letohl(tvb, offset+16);
3188 si->callId = tvb_get_letohl(tvb, offset+20);
3189 break;
3191 case 0x0140: /* VideoDisplayCommandMessage */
3192 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3193 break;
3195 case 0x0141: /* Unknown_Message_0x0141 */
3196 proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3197 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3198 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3199 proto_tree_add_item(skinny_tree, hf_skinny_maxBitRate, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
3200 break;
3202 case 0x0143: /* DynDisplayNotifyMessage */
3203 proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3204 proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, hdr_data_length-8, ENC_ASCII|ENC_NA);
3205 break;
3207 case 0x0144: /* DynDisplayPriNotifyMessage */
3208 proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3209 proto_tree_add_item(skinny_tree, hf_skinny_priority, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3210 proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+20, hdr_data_length-12, ENC_ASCII|ENC_NA);
3211 break;
3213 case 0x0145: /* DynDisplayPromptStatusMessage */
3214 proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3215 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3216 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3217 proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+24, hdr_data_length-16, ENC_ASCII|ENC_NA);
3218 si->lineId = tvb_get_letohl(tvb, offset+16);
3219 si->callId = tvb_get_letohl(tvb, offset+20);
3220 break;
3222 case 0x0146: /* DynFeatureStatMessage */
3223 proto_tree_add_item(skinny_tree, hf_skinny_featureIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3224 proto_tree_add_item(skinny_tree, hf_skinny_featureID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3225 proto_tree_add_item(skinny_tree, hf_skinny_featureStatus, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3226 proto_tree_add_item(skinny_tree, hf_skinny_featureTextLabel, tvb, offset+24, StationMaxNameSize, ENC_ASCII|ENC_NA);
3227 break;
3229 case 0x0147: /* DynLineStatMessage */
3230 proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3231 proto_tree_add_item(skinny_tree, hf_skinny_lineDirNumber, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3232 proto_tree_add_item(skinny_tree, hf_skinny_lineFullyQualifiedDisplayName, tvb, offset+16+StationMaxDirnumSize, StationMaxNameSize, ENC_ASCII|ENC_NA);
3233 proto_tree_add_item(skinny_tree, hf_skinny_lineDisplayName, tvb, offset+16+StationMaxDirnumSize+StationMaxNameSize, StationMaxDisplayNameSize, ENC_ASCII|ENC_NA);
3234 break;
3236 case 0x0148: /* DynServiceURLStatMessage */
3237 proto_tree_add_item(skinny_tree, hf_skinny_serviceURLIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3238 proto_tree_add_item(skinny_tree, hf_skinny_serviceURL, tvb, offset+16, StationMaxServiceURLSize, ENC_ASCII|ENC_NA);
3239 proto_tree_add_item(skinny_tree, hf_skinny_serviceURLDisplayName, tvb, offset+16+StationMaxServiceURLSize, StationMaxNameSize, ENC_ASCII|ENC_NA);
3240 break;
3242 case 0x0149: /* DynSpeedDialStatMessage */
3243 proto_tree_add_item(skinny_tree, hf_skinny_speedDialNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3244 proto_tree_add_item(skinny_tree, hf_skinny_speedDialType, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3245 proto_tree_add_item(skinny_tree, hf_skinny_speedDialStatus, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3246 proto_tree_add_item(skinny_tree, hf_skinny_speedDialDisplayName, tvb, offset+24, StationMaxNameSize, ENC_ASCII|ENC_NA);
3247 break;
3249 case 0x014A: /* DynCallInfoMessage */
3250 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3251 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3252 proto_tree_add_item(skinny_tree, hf_skinny_callType, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3253 si->lineId = tvb_get_letohl(tvb, offset+12);
3254 /* 5x unknown uint32_t stuff */
3255 /* strings */
3257 i = offset+44;
3258 if(hdr_version == BASIC_MSG_TYPE)
3260 /* 8x party numbers */
3261 count = tvb_strnlen(tvb, i, -1)+1;
3262 proto_tree_add_item(skinny_tree, hf_skinny_callingPartyNumber, tvb, i, count, ENC_ASCII|ENC_NA);
3263 i += count;
3264 count = tvb_strnlen(tvb, i, -1)+1;
3265 proto_tree_add_item(skinny_tree, hf_skinny_calledPartyNumber, tvb, i, count, ENC_ASCII|ENC_NA);
3266 i += count;
3267 count = tvb_strnlen(tvb, i, -1)+1;
3268 proto_tree_add_item(skinny_tree, hf_skinny_originalCalledParty, tvb, i, count, ENC_ASCII|ENC_NA);
3269 i += count;
3270 count = tvb_strnlen(tvb, i, -1)+1;
3271 proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingParty, tvb, i, count, ENC_ASCII|ENC_NA);
3272 i += count;
3273 count = tvb_strnlen(tvb, i, -1)+1;
3274 proto_tree_add_item(skinny_tree, hf_skinny_cgpnVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA);
3275 i += count;
3276 count = tvb_strnlen(tvb, i, -1)+1;
3277 proto_tree_add_item(skinny_tree, hf_skinny_cdpnVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA);
3278 i += count;
3279 count = tvb_strnlen(tvb, i, -1)+1;
3280 proto_tree_add_item(skinny_tree, hf_skinny_originalCdpnVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA);
3281 i += count;
3282 count = tvb_strnlen(tvb, i, -1)+1;
3283 proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA);
3284 i += count;
3285 /* 4x party names */
3286 count = tvb_strnlen(tvb, i, -1)+1;
3287 proto_tree_add_item(skinny_tree, hf_skinny_callingPartyName, tvb, i, count, ENC_ASCII|ENC_NA);
3288 i += count;
3289 count = tvb_strnlen(tvb, i, -1)+1;
3290 proto_tree_add_item(skinny_tree, hf_skinny_calledPartyName, tvb, i, count, ENC_ASCII|ENC_NA);
3291 i += count;
3292 count = tvb_strnlen(tvb, i, -1)+1;
3293 proto_tree_add_item(skinny_tree, hf_skinny_originalCalledPartyName, tvb, i, count, ENC_ASCII|ENC_NA);
3294 i += count;
3295 count = tvb_strnlen(tvb, i, -1)+1;
3296 proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingPartyName, tvb, i, count, ENC_ASCII|ENC_NA);
3298 else if(hdr_version == CM7_MSG_TYPE_B || hdr_version == CM7_MSG_TYPE_A)
3299 {/* I'm not sure. Not enough examples. */
3300 /* 8x party numbers */
3301 count = tvb_strnlen(tvb, i, -1)+1;
3302 proto_tree_add_item(skinny_tree, hf_skinny_callingPartyNumber, tvb, i, count, ENC_ASCII|ENC_NA);
3303 i += count;
3304 count = tvb_strnlen(tvb, i, -1)+1;
3305 proto_tree_add_item(skinny_tree, hf_skinny_cgpnVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA);
3306 i += count;
3307 count = tvb_strnlen(tvb, i, -1)+1;
3308 proto_tree_add_item(skinny_tree, hf_skinny_calledPartyNumber, tvb, i, count, ENC_ASCII|ENC_NA);
3309 i += count;
3310 count = tvb_strnlen(tvb, i, -1)+1;
3311 proto_tree_add_item(skinny_tree, hf_skinny_originalCalledParty, tvb, i, count, ENC_ASCII|ENC_NA);
3312 i += count;
3313 count = tvb_strnlen(tvb, i, -1)+1;
3314 proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingParty, tvb, i, count, ENC_ASCII|ENC_NA);
3315 i += count;
3316 count = tvb_strnlen(tvb, i, -1)+1;
3317 proto_tree_add_item(skinny_tree, hf_skinny_cdpnVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA);
3318 i += count;
3319 count = tvb_strnlen(tvb, i, -1)+1;
3320 proto_tree_add_item(skinny_tree, hf_skinny_originalCdpnVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA);
3321 i += count;
3322 count = tvb_strnlen(tvb, i, -1)+1;
3323 proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA);
3324 i += count;
3325 /* 4x party names */
3326 count = tvb_strnlen(tvb, i, -1)+1;
3327 proto_tree_add_item(skinny_tree, hf_skinny_callingPartyName, tvb, i, count, ENC_ASCII|ENC_NA);
3328 i += count;
3329 count = tvb_strnlen(tvb, i, -1)+1;
3330 proto_tree_add_item(skinny_tree, hf_skinny_calledPartyName, tvb, i, count, ENC_ASCII|ENC_NA);
3331 i += count;
3332 count = tvb_strnlen(tvb, i, -1)+1;
3333 proto_tree_add_item(skinny_tree, hf_skinny_originalCalledPartyName, tvb, i, count, ENC_ASCII|ENC_NA);
3334 i += count;
3335 count = tvb_strnlen(tvb, i, -1)+1;
3336 proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingPartyName, tvb, i, count, ENC_ASCII|ENC_NA);
3339 break;
3341 case 0x0152: /* DialedPhoneBookAckMessage */
3342 proto_tree_add_item(skinny_tree, hf_skinny_directoryIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3343 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3344 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3345 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
3346 break;
3348 case 0x0153: /* CallListStateUpdate */
3349 proto_tree_add_item(skinny_tree, hf_skinny_directoryIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3350 proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3351 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3352 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
3353 break;
3355 case 0x0154: /* StartMediaTransmissionAck */
3356 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3357 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3358 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3359 si->lineId = tvb_get_letohl(tvb, offset+12);
3360 si->passThruId = tvb_get_letohl(tvb, offset+16);
3361 if(hdr_version == BASIC_MSG_TYPE)
3363 proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+24, 4, ENC_BIG_ENDIAN);
3364 proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
3365 proto_tree_add_item(skinny_tree, hf_skinny_startMediaTransmissionStatus, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
3366 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
3367 } else if (hdr_version == CM7_MSG_TYPE_A || hdr_version == CM7_MSG_TYPE_B || hdr_version == CM7_MSG_TYPE_C || hdr_version == CM7_MSG_TYPE_D) {
3368 proto_tree_add_item(skinny_tree, hf_skinny_IPVersion, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
3369 ipversion = tvb_get_ntohl(tvb, offset+24);
3370 if (ipversion == 0) {
3371 proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+28, 4, ENC_BIG_ENDIAN);
3372 } else {
3373 proto_tree_add_item(skinny_tree, hf_skinny_ipV6Address, tvb, offset+28, 16, ENC_NA);
3375 proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
3376 proto_tree_add_item(skinny_tree, hf_skinny_startMediaTransmissionStatus, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
3378 break;
3380 case 0x0155: /* StartMultiMediaTransmissionAck */
3381 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3382 proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN);
3383 proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN);
3384 si->lineId = tvb_get_letohl(tvb, offset+12);
3385 si->passThruId = tvb_get_letohl(tvb, offset+16);
3386 if(hdr_version == BASIC_MSG_TYPE)
3388 proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+24, 4, ENC_BIG_ENDIAN);
3389 proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
3390 proto_tree_add_item(skinny_tree, hf_skinny_startMultiMediaTransmissionStatus, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
3391 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
3392 } else if (hdr_version == CM7_MSG_TYPE_A || hdr_version == CM7_MSG_TYPE_B || hdr_version == CM7_MSG_TYPE_C || hdr_version == CM7_MSG_TYPE_D) {
3393 ipversion = tvb_get_ntohl(tvb, offset+24);
3394 proto_tree_add_item(skinny_tree, hf_skinny_IPVersion, tvb, offset+24, 4, ENC_LITTLE_ENDIAN);
3395 if (ipversion == 0) {
3396 proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+28, 4, ENC_BIG_ENDIAN);
3397 } else {
3398 proto_tree_add_item(skinny_tree, hf_skinny_ipV6Address, tvb, offset+28, 16, ENC_NA);
3400 proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
3401 proto_tree_add_item(skinny_tree, hf_skinny_startMultiMediaTransmissionStatus, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
3403 break;
3405 case 0x0156: /* CallHistoryInfoMessage */
3406 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3407 break;
3409 case 0x0159: /* ExtensionDeviceCaps */
3410 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+12, 672, ENC_ASCII|ENC_NA);
3411 break;
3414 case 0x015A: /* XMLAlarmMessage */
3415 dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+12, hdr_data_length-4);
3416 break;
3418 case 0x015E: /* Unknown_Message_0x015E */
3419 if (hdr_data_length > 8) {
3420 proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3422 break;
3426 * SPCP Messages Call manager -> client messages start here
3429 case 0x8000: /* SPCPRegisterTokenRequest */
3430 proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, StationMaxDeviceNameSize, ENC_ASCII|ENC_NA);
3431 i = offset+12+StationMaxDeviceNameSize;
3432 proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, i, 4, ENC_LITTLE_ENDIAN);
3433 proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, i+4, 4, ENC_LITTLE_ENDIAN);
3434 proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, i+8, 4, ENC_BIG_ENDIAN);
3435 proto_tree_add_item(skinny_tree, hf_skinny_deviceType, tvb, i+12, 4, ENC_LITTLE_ENDIAN);
3436 proto_tree_add_item(skinny_tree, hf_skinny_maxStreams, tvb, i+16, 4, ENC_LITTLE_ENDIAN);
3437 break;
3441 * SPCP Messages Client -> Call manager start here
3444 case 0x8100: /* SPCPRegisterTokenAck */
3445 proto_tree_add_item(skinny_tree, hf_skinny_featureID, tvb, offset+12, 4, ENC_ASCII|ENC_NA);
3446 break;
3448 case 0x8101: /* SPCPRegisterTokenReject */
3449 proto_tree_add_item(skinny_tree, hf_skinny_tokenRejWaitTime, tvb, offset+12, 4, ENC_LITTLE_ENDIAN);
3450 break;
3452 default:
3453 proto_tree_add_item(skinny_tree, hf_skinny_rawData, tvb, offset+12, hdr_data_length-4, ENC_NA);
3454 break;
3457 tap_queue_packet(skinny_tap, pinfo, si);
3458 return tvb_length(tvb);
3462 /* Code to actually dissect the packets */
3463 static gboolean
3464 dissect_skinny(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
3466 /* The general structure of a packet: {IP-Header|TCP-Header|n*SKINNY}
3467 * SKINNY-Packet: {Header(Size, Reserved)|Data(MessageID, Message-Data)}
3469 /* Header fields */
3470 guint32 hdr_data_length;
3471 guint32 hdr_version;
3473 /* check, if this is really an SKINNY packet, they start with a length + 0 */
3475 if (tvb_length_remaining(tvb, 0) < 8)
3477 return FALSE;
3479 /* get relevant header information */
3480 hdr_data_length = tvb_get_letohl(tvb, 0);
3481 hdr_version = tvb_get_letohl(tvb, 4);
3483 /* data_size = MIN(8+hdr_data_length, tvb_length(tvb)) - 0xC; */
3485 if (
3486 (hdr_data_length < 4) ||
3487 ((hdr_version != BASIC_MSG_TYPE) &&
3488 (hdr_version != CM7_MSG_TYPE_A) &&
3489 (hdr_version != CM7_MSG_TYPE_B) &&
3490 (hdr_version != CM7_MSG_TYPE_C) &&
3491 (hdr_version != CM7_MSG_TYPE_D))
3494 /* Not an SKINNY packet, just happened to use the same port */
3495 return FALSE;
3498 /* Make entries in Protocol column and Info column on summary display */
3499 col_set_str(pinfo->cinfo, COL_PROTOCOL, "SKINNY");
3501 col_set_str(pinfo->cinfo, COL_INFO, "Skinny Client Control Protocol");
3503 tcp_dissect_pdus(tvb, pinfo, tree, skinny_desegment, 4,
3504 get_skinny_pdu_len, dissect_skinny_pdu, data);
3506 return TRUE;
3509 /* Register the protocol with Wireshark */
3510 void
3511 proto_register_skinny(void)
3514 /* Setup list of header fields */
3515 static hf_register_info hf[] = {
3516 { &hf_skinny_data_length,
3517 { "Data length", "skinny.data_length",
3518 FT_UINT32, BASE_DEC, NULL, 0x0,
3519 "Number of bytes in the data portion.",
3520 HFILL }
3522 { &hf_skinny_hdr_version,
3523 { "Header version", "skinny.hdr_version",
3524 FT_UINT32, BASE_HEX, VALS(header_version), 0x0,
3525 NULL,
3526 HFILL }
3528 /* FIXME: Enable use of message name ??? */
3529 { &hf_skinny_messageid,
3530 { "Message ID", "skinny.messageid",
3531 FT_UINT32, BASE_HEX|BASE_EXT_STRING, &message_id_ext, 0x0,
3532 "The function requested/done with this message.",
3533 HFILL }
3536 { &hf_skinny_deviceName,
3537 { "Device name", "skinny.deviceName",
3538 FT_STRING, BASE_NONE, NULL, 0x0,
3539 "The device name of the phone.",
3540 HFILL }
3543 { &hf_skinny_stationUserId,
3544 { "Station user ID", "skinny.stationUserId",
3545 FT_UINT32, BASE_DEC, NULL, 0x0,
3546 NULL,
3547 HFILL }
3550 { &hf_skinny_stationInstance,
3551 { "Station instance", "skinny.stationInstance",
3552 FT_UINT32, BASE_DEC, NULL, 0x0,
3553 NULL,
3554 HFILL }
3557 { &hf_skinny_deviceType,
3558 { "Device type", "skinny.deviceType",
3559 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &deviceTypes_ext, 0x0,
3560 "DeviceType of the station.",
3561 HFILL }
3564 { &hf_skinny_maxStreams,
3565 { "Max streams", "skinny.maxStreams",
3566 FT_UINT32, BASE_DEC, NULL, 0x0,
3567 "32 bit unsigned integer indicating the maximum number of simultansous RTP duplex streams that the client can handle.",
3568 HFILL }
3571 { &hf_skinny_activeStreams,
3572 { "Active Streams", "skinny.activeStreams",
3573 FT_UINT32, BASE_DEC, NULL, 0x0,
3574 NULL,
3575 HFILL }
3578 { &hf_skinny_phoneFeatures,
3579 { "Phone Features", "skinny.phoneFeatures",
3580 FT_UINT32, BASE_DEC, NULL, 0x0,
3581 NULL,
3582 HFILL }
3585 { &hf_skinny_maxButtons,
3586 { "Maximum number of Buttons", "skinny.maxButtons",
3587 FT_UINT32, BASE_DEC, NULL, 0x0,
3588 NULL,
3589 HFILL }
3592 { &hf_skinny_macAddress,
3593 { "Mac Address", "skinny.macAddress",
3594 FT_STRING, BASE_NONE, NULL, 0x0,
3595 NULL,
3596 HFILL }
3599 { &hf_skinny_loadInfo,
3600 { "Load Information / Firmware", "skinny.loadInfo",
3601 FT_STRING, BASE_NONE, NULL, 0x0,
3602 NULL,
3603 HFILL }
3606 { &hf_skinny_stationIpPort,
3607 { "Station ip port", "skinny.stationIpPort",
3608 FT_UINT16, BASE_DEC, NULL, 0x0,
3609 NULL,
3610 HFILL }
3613 { &hf_skinny_stationKeypadButton,
3614 { "Keypad button", "skinny.stationKeypadButton",
3615 FT_UINT32, BASE_HEX|BASE_EXT_STRING, &keypadButtons_ext, 0x0,
3616 "The button pressed on the phone.",
3617 HFILL }
3620 { &hf_skinny_calledPartyNumber,
3621 { "Called party number", "skinny.calledParty",
3622 FT_STRING, BASE_NONE, NULL, 0x0,
3623 "The number called.",
3624 HFILL }
3627 { &hf_skinny_stimulus,
3628 { "Stimulus", "skinny.stimulus",
3629 FT_UINT32, BASE_HEX|BASE_EXT_STRING, &deviceStimuli_ext, 0x0,
3630 "Reason for the device stimulus message.",
3631 HFILL }
3634 { &hf_skinny_stimulusInstance,
3635 { "Stimulus instance", "skinny.stimulusInstance",
3636 FT_UINT32, BASE_DEC, NULL, 0x0,
3637 NULL,
3638 HFILL }
3641 { &hf_skinny_lineNumber,
3642 { "Line number", "skinny.lineNumber",
3643 FT_UINT32, BASE_DEC, NULL, 0x0,
3644 NULL,
3645 HFILL }
3648 { &hf_skinny_speedDialNumber,
3649 { "Speed-dial number", "skinny.speedDialNumber",
3650 FT_UINT32, BASE_DEC, NULL, 0x0,
3651 "Which speed dial number",
3652 HFILL }
3655 { &hf_skinny_capCount,
3656 { "Capabilities count", "skinny.capCount",
3657 FT_UINT32, BASE_DEC, NULL, 0x0,
3658 "How many capabilities",
3659 HFILL }
3662 { &hf_skinny_payloadCapability,
3663 { "Payload capability", "skinny.payloadCapability",
3664 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &mediaPayloads_ext, 0x0,
3665 "The payload capability for this media capability structure.",
3666 HFILL }
3669 { &hf_skinny_maxFramesPerPacket,
3670 { "Max frames per packet", "skinny.maxFramesPerPacket",
3671 FT_UINT16, BASE_DEC, NULL, 0x0,
3672 NULL,
3673 HFILL }
3676 { &hf_skinny_alarmSeverity,
3677 { "Alarm severity", "skinny.alarmSeverity",
3678 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &alarmSeverities_ext, 0x0,
3679 "The severity of the reported alarm.",
3680 HFILL }
3683 { &hf_skinny_alarmParam1,
3684 { "Alarm param 1", "skinny.alarmParam1",
3685 FT_UINT32, BASE_HEX, NULL, 0x0,
3686 "An as yet undecoded param1 value from the alarm message",
3687 HFILL }
3690 { &hf_skinny_alarmParam2,
3691 { "Alarm param 2", "skinny.alarmParam2",
3692 FT_IPv4, BASE_NONE, NULL, 0x0,
3693 "This is the second alarm parameter i think it's an ip address",
3694 HFILL }
3697 { &hf_skinny_receptionStatus,
3698 { "Reception status", "skinny.receptionStatus",
3699 FT_UINT32, BASE_DEC, VALS(multicastMediaReceptionStatus), 0x0,
3700 "The current status of the multicast media.",
3701 HFILL }
3704 { &hf_skinny_passThruPartyID,
3705 { "Pass-thru party ID", "skinny.passThruPartyID",
3706 FT_UINT32, BASE_DEC, NULL, 0x0,
3707 NULL,
3708 HFILL }
3711 { &hf_skinny_ORCStatus,
3712 { "Opened receive-channel status", "skinny.openReceiveChannelStatus",
3713 FT_UINT32, BASE_DEC, VALS(openReceiveChanStatus), 0x0,
3714 NULL,
3715 HFILL }
3718 { &hf_skinny_IPVersion,
3719 { "IP Version", "skinny.ipversion",
3720 FT_UINT32, BASE_DEC, VALS(ipVersion), 0x0,
3721 NULL,
3722 HFILL }
3725 { &hf_skinny_ipAddress,
3726 { "IP address", "skinny.ipAddress",
3727 FT_IPv4, BASE_NONE, NULL, 0x0,
3728 NULL,
3729 HFILL }
3732 { &hf_skinny_ipV6Address,
3733 { "IPv6 address", "skinny.ipv6Address",
3734 FT_IPv6, BASE_NONE, NULL, 0x0,
3735 NULL,
3736 HFILL }
3739 { &hf_skinny_portNumber,
3740 { "Port number", "skinny.portNumber",
3741 FT_UINT32, BASE_DEC, NULL, 0x0,
3742 NULL,
3743 HFILL }
3746 { &hf_skinny_statsProcessingType,
3747 { "Stats processing type", "skinny.statsProcessingType",
3748 FT_UINT32, BASE_DEC, VALS(statsProcessingTypes), 0x0,
3749 "What do do after you send the stats.",
3750 HFILL }
3753 { &hf_skinny_callIdentifier,
3754 { "Call identifier", "skinny.callIdentifier",
3755 FT_UINT32, BASE_DEC, NULL, 0x0,
3756 NULL,
3757 HFILL }
3760 { &hf_skinny_visibility,
3761 { "Visibility", "skinny.visibility",
3762 FT_UINT32, BASE_DEC, NULL, 0x0,
3763 NULL,
3764 HFILL }
3767 { &hf_skinny_packetsSent,
3768 { "Packets sent", "skinny.packetsSent",
3769 FT_UINT32, BASE_DEC, NULL, 0x0,
3770 NULL,
3771 HFILL }
3774 { &hf_skinny_octetsSent,
3775 { "Octets sent", "skinny.octetsSent",
3776 FT_UINT32, BASE_DEC, NULL, 0x0,
3777 NULL,
3778 HFILL }
3781 { &hf_skinny_packetsRecv,
3782 { "Packets Received", "skinny.packetsRecv",
3783 FT_UINT32, BASE_DEC, NULL, 0x0,
3784 NULL,
3785 HFILL }
3788 { &hf_skinny_octetsRecv,
3789 { "Octets received", "skinny.octetsRecv",
3790 FT_UINT32, BASE_DEC, NULL, 0x0,
3791 NULL,
3792 HFILL }
3795 { &hf_skinny_packetsLost,
3796 { "Packets lost", "skinny.packetsLost",
3797 FT_UINT32, BASE_DEC, NULL, 0x0,
3798 NULL,
3799 HFILL }
3802 { &hf_skinny_latency,
3803 { "Latency(ms)", "skinny.latency",
3804 FT_UINT32, BASE_DEC, NULL, 0x0,
3805 "Average packet latency during the call.",
3806 HFILL }
3809 { &hf_skinny_jitter,
3810 { "Jitter", "skinny.jitter",
3811 FT_UINT32, BASE_DEC, NULL, 0x0,
3812 "Average jitter during the call.",
3813 HFILL }
3816 { &hf_skinny_directoryNumber,
3817 { "Directory number", "skinny.directoryNumber",
3818 FT_STRING, BASE_NONE, NULL, 0x0,
3819 "The number we are reporting statistics for.",
3820 HFILL }
3823 { &hf_skinny_lineInstance,
3824 { "Line instance", "skinny.lineInstance",
3825 FT_UINT32, BASE_DEC, NULL, 0x0,
3826 "The display call plane associated with this call.",
3827 HFILL }
3830 { &hf_skinny_softKeyEvent,
3831 { "Soft-key event", "skinny.softKeyEvent",
3832 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &softKeyEvents_ext, 0x0,
3833 "Which softkey event is being reported.",
3834 HFILL }
3837 { &hf_skinny_keepAliveInterval,
3838 { "Keep-alive interval", "skinny.keepAliveInterval",
3839 FT_UINT32, BASE_DEC, NULL, 0x0,
3840 "How often are keep alives exchanges between the client and the call manager.",
3841 HFILL }
3844 { &hf_skinny_secondaryKeepAliveInterval,
3845 { "Secondary keep-alive interval", "skinny.secondaryKeepAliveInterval",
3846 FT_UINT32, BASE_DEC, NULL, 0x0,
3847 "How often are keep alives exchanges between the client and the secondary call manager.",
3848 HFILL }
3851 { &hf_skinny_dateTemplate,
3852 { "Date template", "skinny.dateTemplate",
3853 FT_STRING, BASE_NONE, NULL, 0x0,
3854 "The display format for the date/time on the phone.",
3855 HFILL }
3858 { &hf_skinny_buttonOffset,
3859 { "Button offset", "skinny.buttonOffset",
3860 FT_UINT32, BASE_DEC, NULL, 0x0,
3861 "Offset is the number of the first button referenced by this message.",
3862 HFILL }
3865 { &hf_skinny_buttonCount,
3866 { "Buttons count", "skinny.buttonCount",
3867 FT_UINT32, BASE_DEC, NULL, 0x0,
3868 "Number of (VALID) button definitions in this message.",
3869 HFILL }
3872 { &hf_skinny_totalButtonCount,
3873 { "Total buttons count", "skinny.totalButtonCount",
3874 FT_UINT32, BASE_DEC, NULL, 0x0,
3875 "The total number of buttons defined for this phone.",
3876 HFILL }
3879 { &hf_skinny_buttonInstanceNumber,
3880 { "Instance number", "skinny.buttonInstanceNumber",
3881 FT_UINT8, BASE_HEX|BASE_EXT_STRING, &keypadButtons_ext, 0x0,
3882 "The button instance number for a button or the StationKeyPad value, repeats allowed.",
3883 HFILL }
3886 { &hf_skinny_buttonDefinition,
3887 { "Button definition", "skinny.buttonDefinition",
3888 FT_UINT8, BASE_HEX|BASE_EXT_STRING, &buttonDefinitions_ext, 0x0,
3889 "The button type for this instance (ie line, speed dial, ....",
3890 HFILL }
3893 { &hf_skinny_softKeyOffset,
3894 { "Soft-Key offset", "skinny.softKeyOffset",
3895 FT_UINT32, BASE_DEC, NULL, 0x0,
3896 "The offset for the first soft key in this message.",
3897 HFILL }
3900 { &hf_skinny_softKeyCount,
3901 { "Soft-keys count", "skinny.softKeyCount",
3902 FT_UINT32, BASE_DEC, NULL, 0x0,
3903 "The number of valid softkeys in this message.",
3904 HFILL }
3907 { &hf_skinny_totalSoftKeyCount,
3908 { "Total soft-keys count", "skinny.totalSoftKeyCount",
3909 FT_UINT32, BASE_DEC, NULL, 0x0,
3910 "The total number of softkeys for this device.",
3911 HFILL }
3914 { &hf_skinny_softKeyLabel,
3915 { "Soft-key label", "skinny.softKeyLabel",
3916 FT_STRING, BASE_NONE, NULL, 0x0,
3917 "The text label for this soft key.",
3918 HFILL }
3921 { &hf_skinny_softKeySetOffset,
3922 { "Soft-key-set offset", "skinny.softKeySetOffset",
3923 FT_UINT32, BASE_DEC, NULL, 0x0,
3924 "The offset for the first soft key set in this message.",
3925 HFILL }
3928 { &hf_skinny_softKeySetCount,
3929 { "Soft-key-sets count", "skinny.softKeySetCount",
3930 FT_UINT32, BASE_DEC, NULL, 0x0,
3931 "The number of valid softkey sets in this message.",
3932 HFILL }
3935 { &hf_skinny_totalSoftKeySetCount,
3936 { "Total soft-key-sets count", "skinny.totalSoftKeySetCount",
3937 FT_UINT32, BASE_DEC, NULL, 0x0,
3938 "The total number of softkey sets for this device.",
3939 HFILL }
3942 { &hf_skinny_softKeyTemplateIndex,
3943 { "Soft-key template index", "skinny.softKeyTemplateIndex",
3944 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &softKeyEvents_ext, 0x0,
3945 "Array of size 16 8-bit unsigned ints containing an index into the softKeyTemplate.",
3946 HFILL }
3949 { &hf_skinny_softKeyInfoIndex,
3950 { "Soft-key info index", "skinny.softKeyInfoIndex",
3951 FT_UINT16, BASE_DEC|BASE_EXT_STRING, &softKeyIndexes_ext, 0x0,
3952 "Array of size 16 16-bit unsigned integers containing an index into the soft key description information.",
3953 HFILL }
3956 { &hf_skinny_softKeySetDescription,
3957 { "Soft-key set description", "skinny.softKeySetDescription",
3958 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &keySetNames_ext, 0x0,
3959 "A text description of what this softkey when this softkey set is displayed",
3960 HFILL }
3963 { &hf_skinny_softKeyMap,
3964 { "Soft-key map","skinny.softKeyMap",
3965 FT_UINT16, BASE_HEX, NULL, 0x0,
3966 NULL,
3967 HFILL }
3970 { &hf_skinny_softKey0,
3971 { "SoftKey0", "skinny.softKeyMap.0",
3972 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY0,
3973 NULL,
3974 HFILL }
3977 { &hf_skinny_softKey1,
3978 { "SoftKey1", "skinny.softKeyMap.1",
3979 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY1,
3980 NULL,
3981 HFILL }
3984 { &hf_skinny_softKey2,
3985 { "SoftKey2", "skinny.softKeyMap.2",
3986 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY2,
3987 NULL,
3988 HFILL }
3991 { &hf_skinny_softKey3,
3992 { "SoftKey3", "skinny.softKeyMap.3",
3993 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY3,
3994 NULL,
3995 HFILL }
3998 { &hf_skinny_softKey4,
3999 { "SoftKey4", "skinny.softKeyMap.4",
4000 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY4,
4001 NULL,
4002 HFILL }
4005 { &hf_skinny_softKey5,
4006 { "SoftKey5", "skinny.softKeyMap.5",
4007 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY5,
4008 NULL,
4009 HFILL }
4012 { &hf_skinny_softKey6,
4013 { "SoftKey6", "skinny.softKeyMap.6",
4014 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY6,
4015 NULL,
4016 HFILL }
4019 { &hf_skinny_softKey7,
4020 { "SoftKey7", "skinny.softKeyMap.7",
4021 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY7,
4022 NULL,
4023 HFILL }
4026 { &hf_skinny_softKey8,
4027 { "SoftKey8", "skinny.softKeyMap.8",
4028 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY8,
4029 NULL,
4030 HFILL }
4033 { &hf_skinny_softKey9,
4034 { "SoftKey9", "skinny.softKeyMap.9",
4035 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY9,
4036 NULL,
4037 HFILL }
4040 { &hf_skinny_softKey10,
4041 { "SoftKey10", "skinny.softKeyMap.10",
4042 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY10,
4043 NULL,
4044 HFILL }
4047 { &hf_skinny_softKey11,
4048 { "SoftKey11", "skinny.softKeyMap.11",
4049 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY11,
4050 NULL,
4051 HFILL }
4054 { &hf_skinny_softKey12,
4055 { "SoftKey12", "skinny.softKeyMap.12",
4056 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY12,
4057 NULL,
4058 HFILL }
4061 { &hf_skinny_softKey13,
4062 { "SoftKey13", "skinny.softKeyMap.13",
4063 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY13,
4064 NULL,
4065 HFILL }
4068 { &hf_skinny_softKey14,
4069 { "SoftKey14", "skinny.softKeyMap.14",
4070 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY14,
4071 NULL,
4072 HFILL }
4075 { &hf_skinny_softKey15,
4076 { "SoftKey15", "skinny.softKeyMap.15",
4077 FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY15,
4078 NULL,
4079 HFILL }
4082 { &hf_skinny_lampMode,
4083 { "Lamp mode", "skinny.lampMode",
4084 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &stationLampModes_ext, 0x0,
4085 NULL,
4086 HFILL }
4089 { &hf_skinny_messageTimeOutValue,
4090 { "Message time-out", "skinny.messageTimeOutValue",
4091 FT_UINT32, BASE_DEC, NULL, 0x0,
4092 "The timeout in seconds for this message",
4093 HFILL }
4096 { &hf_skinny_displayMessage,
4097 { "Display message", "skinny.displayMessage",
4098 FT_STRING, BASE_NONE, NULL, 0x0,
4099 "The message displayed on the phone.",
4100 HFILL }
4103 { &hf_skinny_lineDirNumber,
4104 { "Line directory number", "skinny.lineDirNumber",
4105 FT_STRING, BASE_NONE, NULL, 0x0,
4106 "The directory number for this line.",
4107 HFILL }
4110 { &hf_skinny_lineFullyQualifiedDisplayName,
4111 { "Fully qualified display name", "skinny.fqdn",
4112 FT_STRING, BASE_NONE, NULL, 0x0,
4113 "The full display name for this line.",
4114 HFILL }
4117 { &hf_skinny_lineDisplayName,
4118 { "Display name", "skinny.displayName",
4119 FT_STRING, BASE_NONE, NULL, 0x0,
4120 "The display name for this line.",
4121 HFILL }
4124 { &hf_skinny_speedDialDirNumber,
4125 { "Speed-dial number", "skinny.speedDialDirNum",
4126 FT_STRING, BASE_NONE, NULL, 0x0,
4127 "the number to dial for this speed dial.",
4128 HFILL }
4131 { &hf_skinny_speedDialDisplayName,
4132 { "Speed-dial display", "skinny.speedDialDisplay",
4133 FT_STRING, BASE_NONE, NULL, 0x0,
4134 "The text to display for this speed dial.",
4135 HFILL }
4138 { &hf_skinny_dateYear,
4139 { "Year", "skinny.year",
4140 FT_UINT32, BASE_DEC, NULL, 0x0,
4141 "The current year",
4142 HFILL }
4145 { &hf_skinny_dateMonth,
4146 { "Month", "skinny.month",
4147 FT_UINT32, BASE_DEC, NULL, 0x0,
4148 "The current month",
4149 HFILL }
4152 { &hf_skinny_dayOfWeek,
4153 { "Day of week", "skinny.dayOfWeek",
4154 FT_UINT32, BASE_DEC, NULL, 0x0,
4155 "The day of the week",
4156 HFILL }
4159 { &hf_skinny_dateDay,
4160 { "Day", "skinny.day",
4161 FT_UINT32, BASE_DEC, NULL, 0x0,
4162 "The day of the current month",
4163 HFILL }
4166 { &hf_skinny_dateHour,
4167 { "Hour", "skinny.hour",
4168 FT_UINT32, BASE_DEC, NULL, 0x0,
4169 "Hour of the day",
4170 HFILL }
4173 { &hf_skinny_dateMinute,
4174 { "Minute", "skinny.minute",
4175 FT_UINT32, BASE_DEC, NULL, 0x0,
4176 NULL,
4177 HFILL }
4180 { &hf_skinny_dateSeconds,
4181 { "Seconds", "skinny.dateSeconds",
4182 FT_UINT32, BASE_DEC, NULL, 0x0,
4183 NULL,
4184 HFILL }
4187 { &hf_skinny_dateMilliseconds,
4188 { "Milliseconds", "skinny.dateMilliseconds",
4189 FT_UINT32, BASE_DEC, NULL, 0x0,
4190 NULL,
4191 HFILL }
4194 { &hf_skinny_timeStamp,
4195 { "Timestamp", "skinny.timeStamp",
4196 FT_UINT32, BASE_DEC, NULL, 0x0,
4197 "Time stamp for the call reference",
4198 HFILL }
4200 { &hf_skinny_callState,
4201 { "Call state", "skinny.callState",
4202 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_stationCallStates_ext, 0x0,
4203 "The D channel call state of the call",
4204 HFILL }
4207 { &hf_skinny_deviceTone,
4208 { "Tone", "skinny.deviceTone",
4209 FT_UINT32, BASE_HEX|BASE_EXT_STRING, &skinny_deviceTones_ext, 0x0,
4210 "Which tone to play",
4211 HFILL }
4214 { &hf_skinny_callingPartyName,
4215 { "Calling party name", "skinny.callingPartyName",
4216 FT_STRING, BASE_NONE, NULL, 0x0,
4217 "The passed name of the calling party.",
4218 HFILL }
4221 { &hf_skinny_callingPartyNumber,
4222 { "Calling party number", "skinny.callingParty",
4223 FT_STRING, BASE_NONE, NULL, 0x0,
4224 "The passed number of the calling party.",
4225 HFILL }
4228 { &hf_skinny_calledPartyName,
4229 { "Called party name", "skinny.calledPartyName",
4230 FT_STRING, BASE_NONE, NULL, 0x0,
4231 "The name of the party we are calling.",
4232 HFILL }
4235 { &hf_skinny_callType,
4236 { "Call type", "skinny.callType",
4237 FT_UINT32, BASE_DEC, VALS(skinny_callTypes), 0x0,
4238 "What type of call, in/out/etc",
4239 HFILL }
4242 { &hf_skinny_originalCalledPartyName,
4243 { "Original called party name", "skinny.originalCalledPartyName",
4244 FT_STRING, BASE_NONE, NULL, 0x0,
4245 NULL,
4246 HFILL }
4249 { &hf_skinny_originalCalledParty,
4250 { "Original called party number", "skinny.originalCalledParty",
4251 FT_STRING, BASE_NONE, NULL, 0x0,
4252 NULL,
4253 HFILL }
4256 { &hf_skinny_ringType,
4257 { "Ring type", "skinny.ringType",
4258 FT_UINT32, BASE_HEX|BASE_EXT_STRING, &skinny_ringTypes_ext, 0x0,
4259 "What type of ring to play",
4260 HFILL }
4263 { &hf_skinny_ringMode,
4264 { "Ring mode", "skinny.ringMode",
4265 FT_UINT32, BASE_HEX, VALS(skinny_ringModes), 0x0,
4266 "What mode of ring to play",
4267 HFILL }
4270 { &hf_skinny_speakerMode,
4271 { "Speaker", "skinny.speakerMode",
4272 FT_UINT32, BASE_HEX, VALS(skinny_speakerModes), 0x0,
4273 "This message sets the speaker mode on/off",
4274 HFILL }
4277 { &hf_skinny_remoteIpAddr,
4278 { "Remote IP address", "skinny.remoteIpAddr",
4279 FT_IPv4, BASE_NONE, NULL, 0x0,
4280 "The remote end ip address for this stream",
4281 HFILL }
4284 { &hf_skinny_remotePortNumber,
4285 { "Remote port", "skinny.remotePortNumber",
4286 FT_UINT32, BASE_DEC, NULL, 0x0,
4287 "The remote port number listening for this stream",
4288 HFILL }
4291 { &hf_skinny_millisecondPacketSize,
4292 { "MS/packet", "skinny.millisecondPacketSize",
4293 FT_UINT32, BASE_DEC, NULL, 0x0,
4294 "The number of milliseconds of conversation in each packet",
4295 HFILL }
4298 { &hf_skinny_precedenceValue,
4299 { "Precedence", "skinny.precedenceValue",
4300 FT_UINT32, BASE_DEC, NULL, 0x0,
4301 NULL,
4302 HFILL }
4305 { &hf_skinny_silenceSuppression,
4306 { "Silence suppression", "skinny.silenceSuppression",
4307 FT_UINT32, BASE_HEX, VALS(skinny_silenceSuppressionModes), 0x0,
4308 "Mode for silence suppression",
4309 HFILL }
4312 { &hf_skinny_g723BitRate,
4313 { "G723 bitrate", "skinny.g723BitRate",
4314 FT_UINT32, BASE_DEC, VALS(skinny_g723BitRates), 0x0,
4315 "The G723 bit rate for this stream/JUNK if not g723 stream",
4316 HFILL }
4319 { &hf_skinny_conferenceID,
4320 { "Conference ID", "skinny.conferenceID",
4321 FT_UINT32, BASE_DEC, NULL, 0x0,
4322 NULL,
4323 HFILL }
4326 { &hf_skinny_deviceResetType,
4327 { "Reset type", "skinny.deviceResetType",
4328 FT_UINT32, BASE_DEC, VALS(skinny_deviceResetTypes), 0x0,
4329 "How the devices it to be reset (reset/restart)",
4330 HFILL }
4333 { &hf_skinny_echoCancelType,
4334 { "Echo-cancel type", "skinny.echoCancelType",
4335 FT_UINT32, BASE_DEC, VALS(skinny_echoCancelTypes), 0x0,
4336 "Is echo cancelling enabled or not",
4337 HFILL }
4340 { &hf_skinny_deviceUnregisterStatus,
4341 { "Unregister status", "skinny.deviceUnregisterStatus",
4342 FT_UINT32, BASE_DEC, VALS(skinny_deviceUnregisterStatusTypes), 0x0,
4343 "The status of the device unregister request (*CAN* be refused)",
4344 HFILL }
4347 { &hf_skinny_hookFlashDetectMode,
4348 { "Hook flash mode", "skinny.hookFlashDetectMode",
4349 FT_UINT32, BASE_DEC, VALS(skinny_hookFlashDetectModes), 0x0,
4350 "Which method to use to detect that a hook flash has occurred",
4351 HFILL }
4354 { &hf_skinny_detectInterval,
4355 { "HF Detect Interval", "skinny.detectInterval",
4356 FT_UINT32, BASE_DEC, NULL, 0x0,
4357 "The number of milliseconds that determines a hook flash has occurred",
4358 HFILL }
4361 { &hf_skinny_headsetMode,
4362 { "Headset mode", "skinny.headsetMode",
4363 FT_UINT32, BASE_DEC, VALS(skinny_headsetModes), 0x0,
4364 "Turns on and off the headset on the set",
4365 HFILL }
4368 { &hf_skinny_microphoneMode,
4369 { "Microphone mode", "skinny.microphoneMode",
4370 FT_UINT32, BASE_DEC, VALS(skinny_microphoneModes), 0x0,
4371 "Turns on and off the microphone on the set",
4372 HFILL }
4375 { &hf_skinny_activeForward,
4376 { "Active forward", "skinny.activeForward",
4377 FT_UINT32, BASE_DEC, NULL, 0x0,
4378 "This is non zero to indicate that a forward is active on the line",
4379 HFILL }
4382 { &hf_skinny_forwardAllActive,
4383 { "Forward all", "skinny.forwardAllActive",
4384 FT_UINT32, BASE_DEC, NULL, 0x0,
4385 "Forward all calls",
4386 HFILL }
4389 { &hf_skinny_forwardBusyActive,
4390 { "Forward busy", "skinny.forwardBusyActive",
4391 FT_UINT32, BASE_DEC, NULL, 0x0,
4392 "Forward calls when busy",
4393 HFILL }
4396 { &hf_skinny_forwardNoAnswerActive,
4397 { "Forward no answer", "skinny.forwardNoAnswerActive",
4398 FT_UINT32, BASE_DEC, NULL, 0x0,
4399 "Forward only when no answer",
4400 HFILL }
4403 { &hf_skinny_forwardNumber,
4404 { "Forward number", "skinny.forwardNumber",
4405 FT_STRING, BASE_NONE, NULL, 0x0,
4406 "The number to forward calls to.",
4407 HFILL }
4410 { &hf_skinny_userName,
4411 { "Username", "skinny.userName",
4412 FT_STRING, BASE_NONE, NULL, 0x0,
4413 "Username for this device.",
4414 HFILL }
4417 { &hf_skinny_serverName,
4418 { "Server name", "skinny.serverName",
4419 FT_STRING, BASE_NONE, NULL, 0x0,
4420 "The server name for this device.",
4421 HFILL }
4424 { &hf_skinny_numberLines,
4425 { "Number of lines", "skinny.numberLines",
4426 FT_UINT32, BASE_DEC, NULL, 0x0,
4427 "How many lines this device has",
4428 HFILL }
4431 { &hf_skinny_numberSpeedDials,
4432 { "Number of speed-dials", "skinny.numberSpeedDials",
4433 FT_UINT32, BASE_DEC, NULL, 0x0,
4434 "The number of speed dials this device has",
4435 HFILL }
4438 { &hf_skinny_sessionType,
4439 { "Session type", "skinny.sessionType",
4440 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_sessionTypes_ext, 0x0,
4441 "The type of this session.",
4442 HFILL }
4445 { &hf_skinny_version,
4446 { "Version", "skinny.version",
4447 FT_STRING, BASE_NONE, NULL, 0x0,
4448 NULL,
4449 HFILL }
4452 { &hf_skinny_mediaEnunciationType,
4453 { "Enunciation type", "skinny.mediaEnunciationType",
4454 FT_UINT32, BASE_DEC, VALS(skinny_mediaEnunciationTypes), 0x0,
4455 NULL,
4456 HFILL }
4459 { &hf_skinny_serverIdentifier,
4460 { "Server identifier", "skinny.serverIdentifier",
4461 FT_STRING, BASE_NONE, NULL, 0x0,
4462 NULL,
4463 HFILL }
4466 { &hf_skinny_serverListenPort,
4467 { "Server port", "skinny.serverListenPort",
4468 FT_UINT32, BASE_DEC, NULL, 0x0,
4469 NULL,
4470 HFILL }
4473 { &hf_skinny_serverIpAddress,
4474 { "Server IP address", "skinny.serverIpAddress",
4475 FT_IPv4, BASE_NONE, NULL, 0x0,
4476 NULL,
4477 HFILL }
4480 { &hf_skinny_multicastPort,
4481 { "Multicast port", "skinny.multicastPort",
4482 FT_UINT32, BASE_DEC, NULL, 0x0,
4483 NULL,
4484 HFILL }
4487 { &hf_skinny_multicastIpAddress,
4488 { "Multicast IP address", "skinny.multicastIpAddress",
4489 FT_IPv4, BASE_NONE, NULL, 0x0,
4490 NULL,
4491 HFILL }
4494 { &hf_skinny_tokenRejWaitTime,
4495 { "Retry wait time", "skinny.tokenRejWaitTime",
4496 FT_UINT32, BASE_DEC, NULL, 0x0,
4497 NULL,
4498 HFILL }
4501 { &hf_skinny_unknown,
4502 { "Unknown data", "skinny.unknown",
4503 FT_UINT32, BASE_HEX, NULL, 0x0,
4504 "Place holder for unknown data.",
4505 HFILL }
4508 { &hf_skinny_rawData,
4509 { "Unknown raw data", "skinny.rawData",
4510 FT_BYTES, BASE_NONE, NULL, 0x0,
4511 "Place holder for unknown raw data.",
4512 HFILL }
4515 { &hf_skinny_xmlData,
4516 { "XML data", "skinny.xmlData",
4517 FT_STRING, BASE_NONE, NULL, 0x0,
4518 NULL,
4519 HFILL }
4522 { &hf_skinny_numberOfInServiceStreams,
4523 { "Number of in-service streams", "skinny.numberOfInServiceStreams",
4524 FT_UINT32, BASE_DEC, NULL, 0x0,
4525 NULL,
4526 HFILL }
4529 { &hf_skinny_maxStreamsPerConf,
4530 { "Max streams per conf", "skinny.maxStreamsPerConf",
4531 FT_UINT32, BASE_DEC, NULL, 0x0,
4532 NULL,
4533 HFILL }
4536 { &hf_skinny_numberOfOutOfServiceStreams,
4537 { "Number of out-of-service streams", "skinny.numberOfOutOfServiceStreams",
4538 FT_UINT32, BASE_DEC, NULL, 0x0,
4539 NULL,
4540 HFILL }
4543 { &hf_skinny_applicationID,
4544 { "Application ID", "skinny.applicationID",
4545 FT_UINT32, BASE_DEC, NULL, 0x0,
4546 "Application ID.",
4547 HFILL }
4550 { &hf_skinny_transactionID,
4551 { "Transaction ID", "skinny.transactionID",
4552 FT_UINT32, BASE_DEC, NULL, 0x0,
4553 NULL,
4554 HFILL }
4557 { &hf_skinny_serviceNum,
4558 { "Service number", "skinny.serviceNum",
4559 FT_UINT32, BASE_DEC, NULL, 0x0,
4560 NULL,
4561 HFILL }
4564 { &hf_skinny_serviceURLIndex,
4565 { "Service URL index", "skinny.serviceURLIndex",
4566 FT_UINT32, BASE_DEC, NULL, 0x0,
4567 NULL,
4568 HFILL }
4571 { &hf_skinny_featureIndex,
4572 { "Feature index", "skinny.featureIndex",
4573 FT_UINT32, BASE_DEC, NULL, 0x0,
4574 NULL,
4575 HFILL }
4578 { &hf_skinny_createConfResults,
4579 { "Create conf results", "skinny.createConfResults",
4580 FT_UINT32, BASE_DEC, VALS(skinny_createConfResults), 0x0,
4581 NULL,
4582 HFILL }
4585 { &hf_skinny_modifyConfResults,
4586 { "Modify conf results", "skinny.modifyConfResults",
4587 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_modifyConfResults_ext, 0x0,
4588 NULL,
4589 HFILL }
4592 { &hf_skinny_deleteConfResults,
4593 { "Delete conf results", "skinny.deleteConfResults",
4594 FT_UINT32, BASE_DEC, VALS(skinny_deleteConfResults), 0x0,
4595 NULL,
4596 HFILL }
4599 { &hf_skinny_addParticipantResults,
4600 { "Add participant results", "skinny.addParticipantResults",
4601 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_addParticipantResults_ext, 0x0,
4602 NULL,
4603 HFILL }
4606 { &hf_skinny_passThruData,
4607 { "Pass-thru data", "skinny.passThruData",
4608 FT_UINT8, BASE_HEX, NULL, 0x0,
4609 NULL,
4610 HFILL }
4613 { &hf_skinny_auditParticipantResults,
4614 { "Audit participant results", "skinny.auditParticipantResults",
4615 FT_UINT32, BASE_DEC, VALS(skinny_auditParticipantResults), 0x0,
4616 NULL,
4617 HFILL }
4620 { &hf_skinny_last,
4621 { "Last", "skinny.last",
4622 FT_UINT32, BASE_DEC, NULL, 0x0,
4623 NULL,
4624 HFILL }
4627 { &hf_skinny_numberOfEntries,
4628 { "Number of entries", "skinny.numberOfEntries",
4629 FT_UINT32, BASE_DEC, NULL, 0x0,
4630 NULL,
4631 HFILL }
4634 { &hf_skinny_participantEntry,
4635 { "Participant entry", "skinny.participantEntry",
4636 FT_UINT32, BASE_DEC, NULL, 0x0,
4637 NULL,
4638 HFILL }
4641 { &hf_skinny_resourceTypes,
4642 { "ResourceType", "skinny.resourceTypes",
4643 FT_UINT32, BASE_DEC, VALS(skinny_resourceTypes), 0x0,
4644 NULL,
4645 HFILL }
4648 { &hf_skinny_numberOfReservedParticipants,
4649 { "Number of reserved participants", "skinny.numberOfReservedParticipants",
4650 FT_UINT32, BASE_DEC, NULL, 0x0,
4651 NULL,
4652 HFILL }
4655 { &hf_skinny_numberOfActiveParticipants,
4656 { "Number of active participants", "skinny.numberOfActiveParticipants",
4657 FT_UINT32, BASE_DEC, NULL, 0x0,
4658 NULL,
4659 HFILL }
4662 { &hf_skinny_appID,
4663 { "Application ID", "skinny.appID",
4664 FT_UINT32, BASE_DEC, NULL, 0x0,
4665 NULL,
4666 HFILL }
4669 { &hf_skinny_appData,
4670 { "Application data", "skinny.appData",
4671 FT_UINT8, BASE_HEX, NULL, 0x0,
4672 NULL,
4673 HFILL }
4676 { &hf_skinny_appConfID,
4677 { "Application conf ID", "skinny.appConfID",
4678 FT_UINT8, BASE_HEX, NULL, 0x0,
4679 NULL,
4680 HFILL }
4683 { &hf_skinny_sequenceFlag,
4684 { "Sequence flag", "skinny.sequenceFlag",
4685 FT_UINT32, BASE_DEC, VALS(skinny_sequenceFlags), 0x0,
4686 NULL,
4687 HFILL }
4690 { &hf_skinny_displayPriority,
4691 { "Display priority", "skinny.displayPriority",
4692 FT_UINT32, BASE_DEC, NULL, 0x0,
4693 NULL,
4694 HFILL }
4697 { &hf_skinny_appInstanceID,
4698 { "Application instance ID", "skinny.appInstanceID",
4699 FT_UINT32, BASE_DEC, NULL, 0x0,
4700 NULL,
4701 HFILL }
4704 { &hf_skinny_routingID,
4705 { "Routing ID", "skinny.routingID",
4706 FT_UINT32, BASE_DEC, NULL, 0x0,
4707 NULL,
4708 HFILL }
4711 { &hf_skinny_audioCapCount,
4712 { "Audio cap count", "skinny.audioCapCount",
4713 FT_UINT32, BASE_DEC, NULL, 0x0,
4714 NULL,
4715 HFILL }
4718 { &hf_skinny_videoCapCount,
4719 { "Video cap count", "skinny.videoCapCount",
4720 FT_UINT32, BASE_DEC, NULL, 0x0,
4721 NULL,
4722 HFILL }
4725 { &hf_skinny_dataCapCount,
4726 { "Data cap count", "skinny.dataCapCount",
4727 FT_UINT32, BASE_DEC, NULL, 0x0,
4728 NULL,
4729 HFILL }
4732 { &hf_skinny_RTPPayloadFormat,
4733 { "RTP payload format", "skinny.RTPPayloadFormat",
4734 FT_UINT32, BASE_DEC, NULL, 0x0,
4735 NULL,
4736 HFILL }
4739 { &hf_skinny_customPictureFormatCount,
4740 { "Custom picture format count", "skinny.customPictureFormatCount",
4741 FT_UINT32, BASE_DEC, NULL, 0x0,
4742 NULL,
4743 HFILL }
4746 { &hf_skinny_pictureWidth,
4747 { "Picture width", "skinny.pictureWidth",
4748 FT_UINT32, BASE_DEC, NULL, 0x0,
4749 NULL,
4750 HFILL }
4753 { &hf_skinny_pictureHeight,
4754 { "Picture height", "skinny.pictureHeight",
4755 FT_UINT32, BASE_DEC, NULL, 0x0,
4756 NULL,
4757 HFILL }
4760 { &hf_skinny_pixelAspectRatio,
4761 { "Pixel aspect ratio", "skinny.pixelAspectRatio",
4762 FT_UINT32, BASE_DEC, NULL, 0x0,
4763 NULL,
4764 HFILL }
4767 { &hf_skinny_clockConversionCode,
4768 { "Clock conversion code", "skinny.clockConversionCode",
4769 FT_UINT32, BASE_DEC, NULL, 0x0,
4770 NULL,
4771 HFILL }
4774 { &hf_skinny_clockDivisor,
4775 { "Clock divisor", "skinny.clockDivisor",
4776 FT_UINT32, BASE_DEC, NULL, 0x0,
4777 NULL,
4778 HFILL }
4781 { &hf_skinny_activeStreamsOnRegistration,
4782 { "Active streams on registration", "skinny.activeStreamsOnRegistration",
4783 FT_UINT32, BASE_DEC, NULL, 0x0,
4784 NULL,
4785 HFILL }
4788 { &hf_skinny_maxBW,
4789 { "Max BW", "skinny.maxBW",
4790 FT_UINT32, BASE_DEC, NULL, 0x0,
4791 NULL,
4792 HFILL }
4795 { &hf_skinny_serviceResourceCount,
4796 { "Service resource count", "skinny.serviceResourceCount",
4797 FT_UINT32, BASE_DEC, NULL, 0x0,
4798 NULL,
4799 HFILL }
4802 { &hf_skinny_layoutCount,
4803 { "Layout count", "skinny.layoutCount",
4804 FT_UINT32, BASE_DEC, NULL, 0x0,
4805 NULL,
4806 HFILL }
4809 { &hf_skinny_layout,
4810 { "Layout", "skinny.layout",
4811 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_Layouts_ext, 0x0,
4812 NULL,
4813 HFILL }
4816 { &hf_skinny_maxConferences,
4817 { "Max conferences", "skinny.maxConferences",
4818 FT_UINT32, BASE_DEC, NULL, 0x0,
4819 NULL,
4820 HFILL }
4823 { &hf_skinny_activeConferenceOnRegistration,
4824 { "Active conference on registration", "skinny.activeConferenceOnRegistration",
4825 FT_UINT32, BASE_DEC, NULL, 0x0,
4826 NULL,
4827 HFILL }
4830 { &hf_skinny_transmitOrReceive,
4831 { "Transmit or receive", "skinny.transmitOrReceive",
4832 FT_UINT32, BASE_DEC, VALS(skinny_transmitOrReceive), 0x0,
4833 NULL,
4834 HFILL }
4837 { &hf_skinny_levelPreferenceCount,
4838 { "Level preference count", "skinny.levelPreferenceCount",
4839 FT_UINT32, BASE_DEC, NULL, 0x0,
4840 NULL,
4841 HFILL }
4844 { &hf_skinny_transmitPreference,
4845 { "Transmit preference", "skinny.transmitPreference",
4846 FT_UINT32, BASE_DEC, NULL, 0x0,
4847 NULL,
4848 HFILL }
4851 { &hf_skinny_format,
4852 { "Format", "skinny.format",
4853 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_formatTypes_ext, 0x0,
4854 NULL,
4855 HFILL }
4858 { &hf_skinny_maxBitRate,
4859 { "Max bitrate", "skinny.maxBitRate",
4860 FT_UINT32, BASE_DEC, NULL, 0x0,
4861 NULL,
4862 HFILL }
4865 { &hf_skinny_minBitRate,
4866 { "Min bitrate", "skinny.minBitRate",
4867 FT_UINT32, BASE_DEC, NULL, 0x0,
4868 NULL,
4869 HFILL }
4872 { &hf_skinny_MPI,
4873 { "MPI", "skinny.MPI",
4874 FT_UINT32, BASE_DEC, NULL, 0x0,
4875 NULL,
4876 HFILL }
4879 { &hf_skinny_serviceNumber,
4880 { "Service number", "skinny.serviceNumber",
4881 FT_UINT32, BASE_DEC, NULL, 0x0,
4882 NULL,
4883 HFILL }
4886 { &hf_skinny_temporalSpatialTradeOffCapability,
4887 { "Temporal spatial trade off capability", "skinny.temporalSpatialTradeOffCapability",
4888 FT_UINT32, BASE_DEC, NULL, 0x0,
4889 NULL,
4890 HFILL }
4893 { &hf_skinny_stillImageTransmission,
4894 { "Still image transmission", "skinny.stillImageTransmission",
4895 FT_UINT32, BASE_DEC, NULL, 0x0,
4896 NULL,
4897 HFILL }
4900 { &hf_skinny_h263_capability_bitfield,
4901 { "H263 capability bitfield", "skinny.h263_capability_bitfield",
4902 FT_UINT32, BASE_DEC, NULL, 0x0,
4903 NULL,
4904 HFILL }
4907 { &hf_skinny_annexNandWFutureUse,
4908 { "Annex N and W future use", "skinny.annexNandWFutureUse",
4909 FT_UINT32, BASE_DEC, NULL, 0x0,
4910 NULL,
4911 HFILL }
4914 { &hf_skinny_modelNumber,
4915 { "Model number", "skinny.modelNumber",
4916 FT_UINT32, BASE_DEC, NULL, 0x0,
4917 NULL,
4918 HFILL }
4921 { &hf_skinny_bandwidth,
4922 { "Bandwidth", "skinny.bandwidth",
4923 FT_UINT32, BASE_DEC, NULL, 0x0,
4924 NULL,
4925 HFILL }
4928 { &hf_skinny_protocolDependentData,
4929 { "Protocol dependent data", "skinny.protocolDependentData",
4930 FT_UINT32, BASE_DEC, NULL, 0x0,
4931 NULL,
4932 HFILL }
4935 { &hf_skinny_priority,
4936 { "Priority", "skinny.priority",
4937 FT_UINT32, BASE_DEC, NULL, 0x0,
4938 NULL,
4939 HFILL }
4942 { &hf_skinny_payloadDtmf,
4943 { "Payload DTMF", "skinny.payloadDtmf",
4944 FT_UINT32, BASE_DEC, NULL, 0x0,
4945 "RTP payload type.",
4946 HFILL }
4949 { &hf_skinny_featureID,
4950 { "Feature ID", "skinny.featureID",
4951 FT_UINT32, BASE_DEC, NULL, 0x0,
4952 NULL,
4953 HFILL }
4956 { &hf_skinny_featureTextLabel,
4957 { "Feature text label", "skinny.featureTextLabel",
4958 FT_STRING, BASE_NONE, NULL, 0x0,
4959 "The feature label text that is displayed on the phone.",
4960 HFILL }
4963 { &hf_skinny_featureStatus,
4964 { "Feature status", "skinny.featureStatus",
4965 FT_UINT32, BASE_DEC, NULL, 0x0,
4966 NULL,
4967 HFILL }
4970 { &hf_skinny_notify,
4971 { "Notify", "skinny.notify",
4972 FT_STRING, BASE_NONE, NULL, 0x0,
4973 "The message notify text that is displayed on the phone.",
4974 HFILL }
4977 { &hf_skinny_endOfAnnAck,
4978 { "End of ann. ack", "skinny.endOfAnnAck",
4979 FT_UINT32, BASE_DEC, VALS(skinny_endOfAnnAck), 0x0,
4980 "End of announcement ack.",
4981 HFILL }
4984 { &hf_skinny_annPlayMode,
4985 { "Ann. play mode", "skinny.annPlayMode",
4986 FT_UINT32, BASE_DEC, VALS(skinny_annPlayMode), 0x0,
4987 "Announcement play mode.",
4988 HFILL }
4991 { &hf_skinny_annPlayStatus,
4992 { "Ann. play status", "skinny.annPlayStatus",
4993 FT_UINT32, BASE_DEC, VALS(skinny_annPlayStatus), 0x0,
4994 "Announcement play status.",
4995 HFILL }
4998 { &hf_skinny_locale,
4999 { "Locale", "skinny.locale",
5000 FT_UINT32, BASE_DEC, NULL, 0x0,
5001 "User locale ID.",
5002 HFILL }
5005 { &hf_skinny_country,
5006 { "Country", "skinny.country",
5007 FT_UINT32, BASE_DEC, NULL, 0x0,
5008 "Country ID (Network locale).",
5009 HFILL }
5012 { &hf_skinny_matrixConfPartyID,
5013 { "Matrix conf party ID", "skinny.matrixConfPartyID",
5014 FT_UINT32, BASE_DEC, NULL, 0x0,
5015 "Existing conference parties.",
5016 HFILL }
5019 { &hf_skinny_hearingConfPartyMask,
5020 { "Hearing conf party mask", "skinny.hearingConfPartyMask",
5021 FT_UINT32, BASE_DEC, NULL, 0x0,
5022 "Bit mask of conference parties to hear media received on this stream. Bit0 = matrixConfPartyID[0], Bit1 = matrixConfPartiID[1].",
5023 HFILL }
5026 { &hf_skinny_serviceURL,
5027 { "Service URL value", "skinny.serviceURL",
5028 FT_STRING, BASE_NONE, NULL, 0x0,
5029 NULL,
5030 HFILL }
5033 { &hf_skinny_serviceURLDisplayName,
5034 { "Service URL display name", "skinny.serviceURLDisplayName",
5035 FT_STRING, BASE_NONE, NULL, 0x0,
5036 NULL,
5037 HFILL }
5040 { &hf_skinny_callSelectStat,
5041 { "Call select stat", "skinny.callSelectStat",
5042 FT_UINT32, BASE_DEC, NULL, 0x0,
5043 NULL,
5044 HFILL }
5047 { &hf_skinny_isConferenceCreator,
5048 { "Is conference creator", "skinny.isConferenceCreator",
5049 FT_UINT32, BASE_DEC, NULL, 0x0,
5050 NULL,
5051 HFILL }
5054 { &hf_skinny_payload_rfc_number,
5055 { "Payload RFC number", "skinny.payload_rfc_number",
5056 FT_UINT32, BASE_DEC, NULL, 0x0,
5057 NULL,
5058 HFILL }
5061 { &hf_skinny_payloadType,
5062 { "Payload type", "skinny.payloadType",
5063 FT_UINT32, BASE_DEC, NULL, 0x0,
5064 NULL,
5065 HFILL }
5068 { &hf_skinny_bitRate,
5069 { "Bitrate", "skinny.bitRate",
5070 FT_UINT32, BASE_DEC, NULL, 0x0,
5071 NULL,
5072 HFILL }
5075 { &hf_skinny_pictureFormatCount,
5076 { "Picture format count", "skinny.pictureFormatCount",
5077 FT_UINT32, BASE_DEC, NULL, 0x0,
5078 NULL,
5079 HFILL }
5082 { &hf_skinny_confServiceNum,
5083 { "Conf service number", "skinny.confServiceNum",
5084 FT_UINT32, BASE_DEC, NULL, 0x0,
5085 "Conference service number.",
5086 HFILL }
5089 { &hf_skinny_DSCPValue,
5090 { "DSCP value", "skinny.DSCPValue",
5091 FT_UINT32, BASE_DEC, NULL, 0x0,
5092 NULL,
5093 HFILL }
5096 { &hf_skinny_miscCommandType,
5097 { "Misc command type", "skinny.miscCommandType",
5098 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_miscCommandType_ext, 0x0,
5099 NULL,
5100 HFILL }
5103 { &hf_skinny_temporalSpatialTradeOff,
5104 { "Temporal spatial trade-off", "skinny.temporalSpatialTradeOff",
5105 FT_UINT32, BASE_DEC, NULL, 0x0,
5106 NULL,
5107 HFILL }
5110 { &hf_skinny_firstGOB,
5111 { "First GOB", "skinny.firstGOB",
5112 FT_UINT32, BASE_DEC, NULL, 0x0,
5113 NULL,
5114 HFILL }
5117 { &hf_skinny_numberOfGOBs,
5118 { "Number of GOBs", "skinny.numberOfGOBs",
5119 FT_UINT32, BASE_DEC, NULL, 0x0,
5120 NULL,
5121 HFILL }
5124 { &hf_skinny_firstMB,
5125 { "First MB", "skinny.firstMB",
5126 FT_UINT32, BASE_DEC, NULL, 0x0,
5127 NULL,
5128 HFILL }
5131 { &hf_skinny_numberOfMBs,
5132 { "Number of MBs", "skinny.numberOfMBs",
5133 FT_UINT32, BASE_DEC, NULL, 0x0,
5134 NULL,
5135 HFILL }
5138 { &hf_skinny_pictureNumber,
5139 { "Picture number", "skinny.pictureNumber",
5140 FT_UINT32, BASE_DEC, NULL, 0x0,
5141 NULL,
5142 HFILL }
5145 { &hf_skinny_longTermPictureIndex,
5146 { "Long-term picture index", "skinny.longTermPictureIndex",
5147 FT_UINT32, BASE_DEC, NULL, 0x0,
5148 NULL,
5149 HFILL }
5152 { &hf_skinny_recoveryReferencePictureCount,
5153 { "Recovery-reference picture count", "skinny.recoveryReferencePictureCount",
5154 FT_UINT32, BASE_DEC, NULL, 0x0,
5155 NULL,
5156 HFILL }
5159 { &hf_skinny_lastRedirectingPartyName,
5160 { "Last redirecting party name", "skinny.lastRedirectingPartyName",
5161 FT_STRING, BASE_NONE, NULL, 0x0,
5162 NULL,
5163 HFILL }
5166 { &hf_skinny_lastRedirectingParty,
5167 { "Last redirecting party", "skinny.lastRedirectingParty",
5168 FT_STRING, BASE_NONE, NULL, 0x0,
5169 NULL,
5170 HFILL }
5173 { &hf_skinny_cgpnVoiceMailbox,
5174 { "Calling party voice mailbox", "skinny.cgpnVoiceMailbox",
5175 FT_STRING, BASE_NONE, NULL, 0x0,
5176 NULL,
5177 HFILL }
5180 { &hf_skinny_cdpnVoiceMailbox,
5181 { "Called party voice mailbox", "skinny.cdpnVoiceMailbox",
5182 FT_STRING, BASE_NONE, NULL, 0x0,
5183 NULL,
5184 HFILL }
5187 { &hf_skinny_originalCdpnVoiceMailbox,
5188 { "Original called party voice mailbox", "skinny.originalCdpnVoiceMailbox",
5189 FT_STRING, BASE_NONE, NULL, 0x0,
5190 NULL,
5191 HFILL }
5194 { &hf_skinny_lastRedirectingVoiceMailbox,
5195 { "Last redirecting voice mailbox", "skinny.lastRedirectingVoiceMailbox",
5196 FT_STRING, BASE_NONE, NULL, 0x0,
5197 NULL,
5198 HFILL }
5201 { &hf_skinny_originalCdpnRedirectReason,
5202 { "Original called party redirect reason", "skinny.originalCdpnRedirectReason",
5203 FT_UINT32, BASE_DEC, NULL, 0x0,
5204 NULL,
5205 HFILL }
5208 { &hf_skinny_lastRedirectingReason,
5209 { "Last redirecting reason", "skinny.lastRedirectingReason",
5210 FT_UINT32, BASE_DEC, NULL, 0x0,
5211 NULL,
5212 HFILL }
5215 { &hf_skinny_callInstance,
5216 { "Call instance", "skinny.callInstance",
5217 FT_UINT32, BASE_DEC, NULL, 0x0,
5218 NULL,
5219 HFILL }
5222 { &hf_skinny_callSecurityStatus,
5223 { "Call security status", "skinny.callSecurityStatus",
5224 FT_UINT32, BASE_DEC, VALS(skinny_callSecurityStatusTypes), 0x0,
5225 NULL,
5226 HFILL }
5229 { &hf_skinny_accessory,
5230 { "Phone accessories", "skinny.accessories",
5231 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_accessories_ext, 0x0,
5232 NULL,
5233 HFILL }
5236 { &hf_skinny_accessoryState,
5237 { "Phone accessory state", "skinny.accessoryState",
5238 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_accessoryStates_ext, 0x0,
5239 NULL,
5240 HFILL }
5243 { &hf_skinny_partyPIRestrictionBits_CallingPartyName,
5244 { "RestrictCallingPartyName", "skinny.partyPIRestrictionBits.CallingPartyName",
5245 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x01,
5246 NULL, HFILL }
5249 { &hf_skinny_partyPIRestrictionBits_CallingPartyNumber,
5250 { "RestrictCallingPartyNumber", "skinny.partyPIRestrictionBits.CallingPartyNumber",
5251 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x02,
5252 NULL, HFILL }
5255 { &hf_skinny_partyPIRestrictionBits_CalledPartyName,
5256 { "RestrictCalledPartyName", "skinny.partyPIRestrictionBits.CalledPartyName",
5257 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x04,
5258 NULL, HFILL }
5261 { &hf_skinny_partyPIRestrictionBits_CalledPartyNumber,
5262 { "RestrictCalledPartyNumber", "skinny.partyPIRestrictionBits.CalledPartyNumber",
5263 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x08,
5264 NULL, HFILL }
5267 { &hf_skinny_partyPIRestrictionBits_OriginalCalledPartyName,
5268 { "RestrictOriginalCalledPartyName", "skinny.partyPIRestrictionBits.OriginalCalledPartyName",
5269 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x10,
5270 NULL, HFILL }
5273 { &hf_skinny_partyPIRestrictionBits_OriginalCalledPartyNumber,
5274 { "RestrictOriginalCalledPartyNumber", "skinny.partyPIRestrictionBits.OriginalCalledPartyNumber",
5275 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x20,
5276 NULL, HFILL }
5279 { &hf_skinny_partyPIRestrictionBits_LastRedirectPartyName,
5280 { "RestrictLastRedirectPartyName", "skinny.partyPIRestrictionBits.LastRedirectPartyName",
5281 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x40,
5282 NULL, HFILL }
5285 { &hf_skinny_partyPIRestrictionBits_LastRedirectPartyNumber,
5286 { "RestrictLastRedirectPartyNumber", "skinny.partyPIRestrictionBits.LastRedirectPartyNumber",
5287 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x80,
5288 NULL, HFILL }
5291 { &hf_skinny_directoryIndex,
5292 { "Directory index", "skinny.directoryIndex",
5293 FT_UINT32, BASE_DEC, NULL, 0x0,
5294 NULL,
5295 HFILL }
5298 { &hf_skinny_directoryPhoneNumber,
5299 { "Directory phone number", "skinny.directoryPhoneNumber",
5300 FT_STRING, BASE_NONE, NULL, 0x0,
5301 NULL,
5302 HFILL }
5305 { &hf_skinny_qualityStats,
5306 { "Quality Statistics", "skinny.qualityStats",
5307 FT_STRING, BASE_NONE, NULL, 0x0,
5308 NULL,
5309 HFILL }
5312 { &hf_skinny_speedDialStatus,
5313 { "Speeddial Status", "skinny.speedDialStatus",
5314 FT_UINT32, BASE_DEC, NULL, 0x0,
5315 NULL,
5316 HFILL }
5320 { &hf_skinny_speedDialType,
5321 { "Speeddial Type", "skinny.speedDialType",
5322 FT_UINT32, BASE_DEC, VALS(buttonDefinitions), 0x0,
5323 NULL,
5324 HFILL }
5327 { &hf_skinny_startMediaTransmissionStatus,
5328 { "Start MediaTransmission Status Type", "skinny.startMediaTransmissionStatus",
5329 FT_UINT32, BASE_DEC, NULL, 0x0,
5330 NULL,
5331 HFILL }
5334 { &hf_skinny_startMultiMediaTransmissionStatus,
5335 { "Start MultiMediaTransmission Status Type", "skinny.startMultiMediaTransmissionStatus",
5336 FT_UINT32, BASE_DEC, NULL, 0x0,
5337 NULL,
5338 HFILL }
5344 /* Setup protocol subtree array */
5345 static gint *ett[] = {
5346 &ett_skinny,
5347 &ett_skinny_tree,
5348 &ett_skinny_softKeyMap,
5351 module_t *skinny_module;
5353 /* Register the protocol name and description */
5354 proto_skinny = proto_register_protocol("Skinny Client Control Protocol",
5355 "SKINNY", "skinny");
5357 /* Required function calls to register the header fields and subtrees used */
5358 proto_register_field_array(proto_skinny, hf, array_length(hf));
5359 proto_register_subtree_array(ett, array_length(ett));
5361 skinny_module = prefs_register_protocol(proto_skinny, NULL);
5362 prefs_register_bool_preference(skinny_module, "desegment",
5363 "Reassemble SCCP messages spanning multiple TCP segments",
5364 "Whether the SCCP dissector should reassemble messages spanning multiple TCP segments."
5365 " To use this option, you must also enable"
5366 " \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.",
5367 &skinny_desegment);
5369 skinny_tap = register_tap("skinny");
5372 void
5373 proto_reg_handoff_skinny(void)
5375 static gboolean skinny_prefs_initialized = FALSE;
5376 dissector_handle_t skinny_handle;
5378 if (!skinny_prefs_initialized) {
5379 /* Skinny content type and internet media type used by other dissectors are the same */
5380 media_type_dissector_table = find_dissector_table("media_type");
5381 skinny_handle = new_create_dissector_handle(dissect_skinny, proto_skinny);
5382 dissector_add_uint("tcp.port", TCP_PORT_SKINNY, skinny_handle);
5383 ssl_dissector_add(SSL_PORT_SKINNY, "skinny", TRUE);
5384 skinny_prefs_initialized = TRUE;