From 276a697a6b57205f15975e6e740bd427b7b510d1 Mon Sep 17 00:00:00 2001 From: Diederik de Groot Date: Wed, 13 Aug 2014 12:44:57 +0200 Subject: [PATCH] [RFC] Skinny: Rewrite using automatic code generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Support: Protocolversion 0 - 22 Includes: Callmanager to/from Cisco Phones, Inter CallManager Messages and CallManager to/from Cisco ASA Code Generator not included, because protocol does not evolve anymore / No newer versions to be expected Fixed: Added more readable information for SoftKeyTemplateRes and SoftKeySetRes, Added Bitfield processing, Added Longer Field Descriptions Fixed: message_handle array overrun, message_ids, hf_skinny fields format Fixed: dialedNumber Message, Setting data on si->fields (tap.h) Fixed: Comments made by Peter Wu Added: Code Generator Sources Fixed: hf_skinny blurp, XML Truncation, Updated ButtonTemplate, SoftKeyTemplate and SoftKeyRes presentation Fixed: EnblocMessage, DialedNumberMessage Added: DisplayLabels Added: dissect_skinny_DisplayLabel function to Lookup and Translate in the phone embedded strings to human readable form Fixed: CallInfoV2, OpenReceiveChannelAck, KeypadButton when generated by a 7912 running old firmware. Fixed: Made changes requested by Peter Wu, in last 2 reviews Fixed: ConfigStatV2, ServerRes Fixed: Comment made by Michael Mann Fixed: CheckAPI.pl / Petri Dish Fixed: Included packet-skinny.h and epan/dissectors/packet-skinny.h.in -> Petri Dish Change-Id: Ic2d2ead8ff0ce80668c9b2e249ce69f53e25a383 Bug: 10262 Reviewed-on: https://code.wireshark.org/review/2921 Petri-Dish: Alexis La Goutte Tested-by: Petri Dish Buildbot Reviewed-by: Jörg Mayer Reviewed-by: Michael Mann --- epan/dissectors/packet-skinny.c | 14267 +++++++++++++++++--------- epan/dissectors/packet-skinny.c.in | 559 + epan/dissectors/packet-skinny.h | 3 + epan/dissectors/packet-skinny.h.in | 40 + tools/SkinnyProtocolOptimized.xml | 4062 ++++++++ tools/parse_xml2skinny_dissector.py | 888 ++ 6 files changed, 14819 insertions(+), 5000 deletions(-) create mode 100644 epan/dissectors/packet-skinny.c.in create mode 100644 epan/dissectors/packet-skinny.h.in create mode 100644 tools/SkinnyProtocolOptimized.xml create mode 100755 tools/parse_xml2skinny_dissector.py diff --git a/epan/dissectors/packet-skinny.c b/epan/dissectors/packet-skinny.c index aa6ab687df..f8e0eb5c0b 100644 --- a/epan/dissectors/packet-skinny.c +++ b/epan/dissectors/packet-skinny.c @@ -1,19 +1,21 @@ +/* Do not modify this file. Changes will be overwritten */ +/* Generated Automatically */ +/* packet-skinny.c */ + /* packet-skinny.c - * * Dissector for the Skinny Client Control Protocol * (The "D-Channel"-Protocol for Cisco Systems' IP-Phones) - * Copyright 2001, Joerg Mayer (see AUTHORS file) * - * Paul E. Erkkila (pee@erkkila.org) - fleshed out the decode - * skeleton to report values for most message/message fields. - * Much help from Guy Harris on figuring out the wireshark api. - * - * This file is based on packet-aim.c, which is - * Copyright 2000, Ralf Hoelzer - * - * Wireshark - Network traffic analyzer - * By Gerald Combs - * Copyright 1998 Gerald Combs + * Author: Diederik de Groot , Copyright 2014 + * Rewritten to support newer skinny protocolversions (V0-V22) + * Based on previous versions/contributions: + * - Joerg Mayer , Copyright 2001 + * - Paul E. Erkkila (pee@erkkila.org) - fleshed out the decode + * skeleton to report values for most message/message fields. + * Much help from Guy Harris on figuring out the wireshark api. + * - packet-aim.c by Ralf Hoelzer , Copyright 2000 + * - Wireshark - Network traffic analyzer, + * By Gerald Combs , Copyright 1998 * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -30,8 +32,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -/* This implementation is based on a draft version of the 3.0 - * specification +/* + * Generated Automatically Using: + * cog.py -D xmlfile=SkinnyProtocolOptimized.xml -d -c -o packet-skinny.c packet-skinny.c.in + */ + +/* c-basic-offset: 2; tab-width: 2; indent-tabs-mode: nil + * vi: set shiftwidth=2 tabstop=2 expandtab: + * :indentSize=2:tabSize=2:noTabs=true: */ #include "config.h" @@ -39,6 +47,7 @@ #include #include #include +#include #include "packet-rtp.h" #include "packet-tcp.h" @@ -48,1331 +57,2111 @@ void proto_register_skinny(void); void proto_reg_handoff_skinny(void); + #define TCP_PORT_SKINNY 2000 #define SSL_PORT_SKINNY 2443 /* IANA assigned to PowerClient Central Storage Facility */ -#define SKINNY_SOFTKEY0 0x01 -#define SKINNY_SOFTKEY1 0x02 -#define SKINNY_SOFTKEY2 0x04 -#define SKINNY_SOFTKEY3 0x08 -#define SKINNY_SOFTKEY4 0x10 -#define SKINNY_SOFTKEY5 0x20 -#define SKINNY_SOFTKEY6 0x40 -#define SKINNY_SOFTKEY7 0x80 -#define SKINNY_SOFTKEY8 0x100 -#define SKINNY_SOFTKEY9 0x200 -#define SKINNY_SOFTKEY10 0x400 -#define SKINNY_SOFTKEY11 0x800 -#define SKINNY_SOFTKEY12 0x1000 -#define SKINNY_SOFTKEY13 0x2000 -#define SKINNY_SOFTKEY14 0x4000 -#define SKINNY_SOFTKEY15 0x8000 - -/* KeyMap Show/No Show */ -static const true_false_string softKeyMapValues = { - "Show", - "Do Not Show" -}; - #define BASIC_MSG_TYPE 0x00 -#define CM7_MSG_TYPE_A 0x12 -#define CM7_MSG_TYPE_B 0x11 -#define CM7_MSG_TYPE_UNKNOWN 0x13 -#define CM7_MSG_TYPE_C 0x14 -#define CM7_MSG_TYPE_D 0x16 +#define V10_MSG_TYPE 0x0A +#define V11_MSG_TYPE 0x0B +#define V15_MSG_TYPE 0x0F +#define V16_MSG_TYPE 0x10 +#define V17_MSG_TYPE 0x11 +#define V18_MSG_TYPE 0x12 +#define V19_MSG_TYPE 0x13 +#define V20_MSG_TYPE 0x14 +#define V21_MSG_TYPE 0x15 +#define V22_MSG_TYPE 0x16 static const value_string header_version[] = { { BASIC_MSG_TYPE, "Basic" }, - { CM7_MSG_TYPE_A, "CM7 type A" }, - { CM7_MSG_TYPE_B, "CM7 type B" }, - { CM7_MSG_TYPE_UNKNOWN, "CM7 type unknown (0x13)" }, - { CM7_MSG_TYPE_C, "CM7 type C" }, - { CM7_MSG_TYPE_D, "CM7 type SPCP" }, + { V10_MSG_TYPE, "V10" }, + { V11_MSG_TYPE, "V11" }, + { V15_MSG_TYPE, "V15" }, + { V16_MSG_TYPE, "V16" }, + { V17_MSG_TYPE, "V17" }, + { V18_MSG_TYPE, "V18" }, + { V19_MSG_TYPE, "V19" }, + { V20_MSG_TYPE, "V20" }, + { V21_MSG_TYPE, "V21" }, + { V22_MSG_TYPE, "V22" }, { 0 , NULL } }; -/* I will probably need this again when I change things - * to function pointers, but let me use the existing - * infrastructure for now - * - * typedef struct { - * guint32 id; - * char *name; - * } message_id_t; - */ - +/* Declare MessageId */ static const value_string message_id[] = { - - /* Station -> Callmanager */ - {0x0000, "KeepAliveMessage"}, - {0x0001, "RegisterMessage"}, - {0x0002, "IpPortMessage"}, - {0x0003, "KeypadButtonMessage"}, - {0x0004, "EnblocCallMessage"}, - {0x0005, "StimulusMessage"}, - {0x0006, "OffHookMessage"}, - {0x0007, "OnHookMessage"}, - {0x0008, "HookFlashMessage"}, - {0x0009, "ForwardStatReqMessage"}, - {0x000A, "SpeedDialStatReqMessage"}, - {0x000B, "LineStatReqMessage"}, - {0x000C, "ConfigStatReqMessage"}, - {0x000D, "TimeDateReqMessage"}, - {0x000E, "ButtonTemplateReqMessage"}, - {0x000F, "VersionReqMessage"}, - {0x0010, "CapabilitiesResMessage"}, - {0x0011, "MediaPortListMessage"}, - {0x0012, "ServerReqMessage"}, - {0x0020, "AlarmMessage"}, - {0x0021, "MulticastMediaReceptionAck"}, - {0x0022, "OpenReceiveChannelAck"}, - {0x0023, "ConnectionStatisticsRes"}, - {0x0024, "OffHookWithCgpnMessage"}, - {0x0025, "SoftKeySetReqMessage"}, - {0x0026, "SoftKeyEventMessage"}, - {0x0027, "UnregisterMessage"}, - {0x0028, "SoftKeyTemplateReqMessage"}, - {0x0029, "RegisterTokenReq"}, - {0x002A, "MediaTransmissionFailure"}, - {0x002B, "HeadsetStatusMessage"}, - {0x002C, "MediaResourceNotification"}, - {0x002D, "RegisterAvailableLinesMessage"}, - {0x002E, "DeviceToUserDataMessage"}, - {0x002F, "DeviceToUserDataResponseMessage"}, - {0x0030, "UpdateCapabilitiesMessage"}, - {0x0031, "OpenMultiMediaReceiveChannelAckMessage"}, - {0x0032, "ClearConferenceMessage"}, - {0x0033, "ServiceURLStatReqMessage"}, - {0x0034, "FeatureStatReqMessage"}, - {0x0035, "CreateConferenceResMessage"}, - {0x0036, "DeleteConferenceResMessage"}, - {0x0037, "ModifyConferenceResMessage"}, - {0x0038, "AddParticipantResMessage"}, - {0x0039, "AuditConferenceResMessage"}, - {0x0040, "AuditParticipantResMessage"}, - {0x0041, "DeviceToUserDataVersion1Message"}, - {0x0042, "DeviceToUserDataResponseVersion1Message"}, - {0x0044, "DynUpdateCapabilitiesMessage"}, - {0x0048, "DialedPhoneBookMessage"}, - {0x0049, "AccessoryStatusMessage"}, - {0x004A, "Unknown_Message_0x004A"}, - {0x004C, "MwiNotificationMessage"}, - - /* Callmanager -> Station */ - /* 0x0000, 0x0003? */ - {0x0081, "RegisterAckMessage"}, - {0x0082, "StartToneMessage"}, - {0x0083, "StopToneMessage"}, - {0x0085, "SetRingerMessage"}, - {0x0086, "SetLampMessage"}, - {0x0087, "SetHkFDetectMessage"}, - {0x0088, "SetSpeakerModeMessage"}, - {0x0089, "SetMicroModeMessage"}, - {0x008A, "StartMediaTransmission"}, - {0x008B, "StopMediaTransmission"}, - {0x008C, "StartMediaReception"}, - {0x008D, "StopMediaReception"}, - {0x008F, "CallInfoMessage"}, - {0x0090, "ForwardStatMessage"}, - {0x0091, "SpeedDialStatMessage"}, - {0x0092, "LineStatMessage"}, - {0x0093, "ConfigStatMessage"}, - {0x0094, "DefineTimeDate"}, - {0x0095, "StartSessionTransmission"}, - {0x0096, "StopSessionTransmission"}, - {0x0097, "ButtonTemplateMessage"}, - {0x0098, "VersionMessage"}, - {0x0099, "DisplayTextMessage"}, - {0x009A, "ClearDisplay"}, - {0x009B, "CapabilitiesReqMessage"}, - {0x009C, "EnunciatorCommandMessage"}, - {0x009D, "RegisterRejectMessage"}, - {0x009E, "ServerResMessage"}, - {0x009F, "Reset"}, - {0x0100, "KeepAliveAckMessage"}, - {0x0101, "StartMulticastMediaReception"}, - {0x0102, "StartMulticastMediaTransmission"}, - {0x0103, "StopMulticastMediaReception"}, - {0x0104, "StopMulticastMediaTransmission"}, - {0x0105, "OpenReceiveChannel"}, - {0x0106, "CloseReceiveChannel"}, - {0x0107, "ConnectionStatisticsReq"}, - {0x0108, "SoftKeyTemplateResMessage"}, - {0x0109, "SoftKeySetResMessage"}, - {0x0110, "SelectSoftKeysMessage"}, - {0x0111, "CallStateMessage"}, - {0x0112, "DisplayPromptStatusMessage"}, - {0x0113, "ClearPromptStatusMessage"}, - {0x0114, "DisplayNotifyMessage"}, - {0x0115, "ClearNotifyMessage"}, - {0x0116, "ActivateCallPlaneMessage"}, - {0x0117, "DeactivateCallPlaneMessage"}, - {0x0118, "UnregisterAckMessage"}, - {0x0119, "BackSpaceReqMessage"}, - {0x011A, "RegisterTokenAck"}, - {0x011B, "RegisterTokenReject"}, - - {0x011C, "StartMediaFailureDetection"}, - {0x011D, "DialedNumberMessage"}, - {0x011E, "UserToDeviceDataMessage"}, - {0x011F, "FeatureStatMessage"}, - {0x0120, "DisplayPriNotifyMessage"}, - {0x0121, "ClearPriNotifyMessage"}, - {0x0122, "StartAnnouncementMessage"}, - {0x0123, "StopAnnouncementMessage"}, - {0x0124, "AnnouncementFinishMessage"}, - {0x0127, "NotifyDtmfToneMessage"}, - {0x0128, "SendDtmfToneMessage"}, - {0x0129, "SubscribeDtmfPayloadReqMessage"}, - {0x012A, "SubscribeDtmfPayloadResMessage"}, - {0x012B, "SubscribeDtmfPayloadErrMessage"}, - {0x012C, "UnSubscribeDtmfPayloadReqMessage"}, - {0x012D, "UnSubscribeDtmfPayloadResMessage"}, - {0x012E, "UnSubscribeDtmfPayloadErrMessage"}, - {0x012F, "ServiceURLStatMessage"}, - {0x0130, "CallSelectStatMessage"}, - {0x0131, "OpenMultiMediaChannelMessage"}, - {0x0132, "StartMultiMediaTransmission"}, - {0x0133, "StopMultiMediaTransmission"}, - {0x0134, "MiscellaneousCommandMessage"}, - {0x0135, "FlowControlCommandMessage"}, - {0x0136, "CloseMultiMediaReceiveChannel"}, - {0x0137, "CreateConferenceReqMessage"}, - {0x0138, "DeleteConferenceReqMessage"}, - {0x0139, "ModifyConferenceReqMessage"}, - {0x013A, "AddParticipantReqMessage"}, - {0x013B, "DropParticipantReqMessage"}, - {0x013C, "AuditConferenceReqMessage"}, - {0x013D, "AuditParticipantReqMessage"}, - {0x013F, "UserToDeviceDataVersion1Message"}, - {0x0140, "VideoDisplayCommandMessage"}, - {0x0141, "Unknown_Message_0x0141"}, - - /* Dynamic Length Messages */ - {0x0143, "DynDisplayNotifyMessage"}, - {0x0144, "DynDisplayPriNotifyMessage"}, - {0x0145, "DynDisplayPromptStatusMessage"}, - {0x0146, "DynFeatureStatMessage"}, - {0x0147, "DynLineStatMessage"}, - {0x0148, "DynServiceURLStatMessage"}, - {0x0149, "DynSpeedDialStatMessage"}, - {0x014A, "DynCallInfoMessage"}, - /* End Dynamic Length Messages */ - - {0x0152, "DialedPhoneBookAckMessage"}, - {0x0153, "CallListStateUpdate"}, - {0x0154, "StartMediaTransmissionAck"}, - {0x0155, "StartMultiMediaTransmissionAck"}, - {0x0156, "CallHistoryInfoMessage"}, - {0x0159, "ExtensionDeviceCaps"}, - {0x015A, "XMLAlarmMessage"}, - {0x015E, "Unknown_Message_0x015E"}, - - /* SPCP Messages (SubClass of SCCP Messages ) */ - /* Station -> Callmanager */ - {0x8000, "SPCPRegisterTokenRequest"}, - - /* Callmanager -> Station */ - {0x8100, "SPCPRegisterTokenAck"}, - {0x8101, "SPCPRegisterTokenReject"}, - - {0 , NULL} /* terminator */ + { 0x0000, "KeepAlive" }, + { 0x0001, "Register" }, + { 0x0002, "IpPort" }, + { 0x0003, "KeypadButton" }, + { 0x0004, "EnblocCall" }, + { 0x0005, "Stimulus" }, + { 0x0006, "OffHook" }, + { 0x0007, "OnHook" }, + { 0x0008, "HookFlash" }, + { 0x0009, "ForwardStatReq" }, + { 0x000a, "SpeedDialStatReq" }, + { 0x000b, "LineStatReq" }, + { 0x000c, "ConfigStatReq" }, + { 0x000d, "TimeDateReq" }, + { 0x000e, "ButtonTemplateReq" }, + { 0x000f, "VersionReq" }, + { 0x0010, "CapabilitiesRes" }, + { 0x0012, "ServerReq" }, + { 0x0020, "Alarm" }, + { 0x0021, "MulticastMediaReceptionAck" }, + { 0x0022, "OpenReceiveChannelAck" }, + { 0x0023, "ConnectionStatisticsRes" }, + { 0x0024, "OffHookWithCgpn" }, + { 0x0025, "SoftKeySetReq" }, + { 0x0026, "SoftKeyEvent" }, + { 0x0027, "Unregister" }, + { 0x0028, "SoftKeyTemplateReq" }, + { 0x0029, "RegisterTokenReq" }, + { 0x002a, "MediaTransmissionFailure" }, + { 0x002b, "HeadsetStatus" }, + { 0x002c, "MediaResourceNotification" }, + { 0x002d, "RegisterAvailableLines" }, + { 0x002e, "DeviceToUserData" }, + { 0x002f, "DeviceToUserDataResponse" }, + { 0x0030, "UpdateCapabilities" }, + { 0x0031, "OpenMultiMediaReceiveChannelAck" }, + { 0x0032, "ClearConference" }, + { 0x0033, "ServiceURLStatReq" }, + { 0x0034, "FeatureStatReq" }, + { 0x0035, "CreateConferenceRes" }, + { 0x0036, "DeleteConferenceRes" }, + { 0x0037, "ModifyConferenceRes" }, + { 0x0038, "AddParticipantRes" }, + { 0x0039, "AuditConferenceRes" }, + { 0x0040, "AuditParticipantRes" }, + { 0x0041, "DeviceToUserDataVersion1" }, + { 0x0042, "DeviceToUserDataResponseVersion1" }, + { 0x0043, "UpdateCapabilitiesV2" }, + { 0x0044, "UpdateCapabilitiesV3" }, + { 0x0045, "PortRes" }, + { 0x0046, "QoSResvNotify" }, + { 0x0047, "QoSErrorNotify" }, + { 0x0048, "SubscriptionStatReq" }, + { 0x0049, "MediaPathEvent" }, + { 0x004a, "MediaPathCapability" }, + { 0x004c, "MwiNotification" }, + { 0x0081, "RegisterAck" }, + { 0x0082, "StartTone" }, + { 0x0083, "StopTone" }, + { 0x0085, "SetRinger" }, + { 0x0086, "SetLamp" }, + { 0x0088, "SetSpeakerMode" }, + { 0x0089, "SetMicroMode" }, + { 0x008a, "StartMediaTransmission" }, + { 0x008b, "StopMediaTransmission" }, + { 0x008f, "CallInfo" }, + { 0x0090, "ForwardStat" }, + { 0x0091, "SpeedDialStat" }, + { 0x0092, "LineStat" }, + { 0x0093, "ConfigStat" }, + { 0x0094, "DefineTimeDate" }, + { 0x0095, "StartSessionTransmission" }, + { 0x0096, "StopSessionTransmission" }, + { 0x0097, "ButtonTemplate" }, + { 0x0098, "Version" }, + { 0x0099, "DisplayText" }, + { 0x009a, "ClearDisplay" }, + { 0x009b, "CapabilitiesReq" }, + { 0x009d, "RegisterReject" }, + { 0x009e, "ServerRes" }, + { 0x009f, "Reset" }, + { 0x0100, "KeepAliveAck" }, + { 0x0101, "StartMulticastMediaReception" }, + { 0x0102, "StartMulticastMediaTransmission" }, + { 0x0103, "StopMulticastMediaReception" }, + { 0x0104, "StopMulticastMediaTransmission" }, + { 0x0105, "OpenReceiveChannel" }, + { 0x0106, "CloseReceiveChannel" }, + { 0x0107, "ConnectionStatisticsReq" }, + { 0x0108, "SoftKeyTemplateRes" }, + { 0x0109, "SoftKeySetRes" }, + { 0x0110, "SelectSoftKeys" }, + { 0x0111, "CallState" }, + { 0x0112, "DisplayPromptStatus" }, + { 0x0113, "ClearPromptStatus" }, + { 0x0114, "DisplayNotify" }, + { 0x0115, "ClearNotify" }, + { 0x0116, "ActivateCallPlane" }, + { 0x0117, "DeactivateCallPlane" }, + { 0x0118, "UnregisterAck" }, + { 0x0119, "BackSpaceReq" }, + { 0x011a, "RegisterTokenAck" }, + { 0x011b, "RegisterTokenReject" }, + { 0x011c, "StartMediaFailureDetection" }, + { 0x011d, "DialedNumber" }, + { 0x011e, "UserToDeviceData" }, + { 0x011f, "FeatureStat" }, + { 0x0120, "DisplayPriNotify" }, + { 0x0121, "ClearPriNotify" }, + { 0x0122, "StartAnnouncement" }, + { 0x0123, "StopAnnouncement" }, + { 0x0124, "AnnouncementFinish" }, + { 0x0127, "NotifyDtmfTone" }, + { 0x0128, "SendDtmfTone" }, + { 0x0129, "SubscribeDtmfPayloadReq" }, + { 0x012a, "SubscribeDtmfPayloadRes" }, + { 0x012b, "SubscribeDtmfPayloadErr" }, + { 0x012c, "UnSubscribeDtmfPayloadReq" }, + { 0x012d, "UnSubscribeDtmfPayloadRes" }, + { 0x012e, "UnSubscribeDtmfPayloadErr" }, + { 0x012f, "ServiceURLStat" }, + { 0x0130, "CallSelectStat" }, + { 0x0131, "OpenMultiMediaReceiveChannel" }, + { 0x0132, "StartMultiMediaTransmission" }, + { 0x0133, "StopMultiMediaTransmission" }, + { 0x0134, "MiscellaneousCommand" }, + { 0x0135, "FlowControlCommand" }, + { 0x0136, "CloseMultiMediaReceiveChannel" }, + { 0x0137, "CreateConferenceReq" }, + { 0x0138, "DeleteConferenceReq" }, + { 0x0139, "ModifyConferenceReq" }, + { 0x013a, "AddParticipantReq" }, + { 0x013b, "DropParticipantReq" }, + { 0x013c, "AuditConferenceReq" }, + { 0x013d, "AuditParticipantReq" }, + { 0x013e, "ChangeParticipantReq" }, + { 0x013f, "UserToDeviceDataVersion1" }, + { 0x0140, "VideoDisplayCommand" }, + { 0x0141, "FlowControlNotify" }, + { 0x0142, "ConfigStatV2" }, + { 0x0143, "DisplayNotifyV2" }, + { 0x0144, "DisplayPriNotifyV2" }, + { 0x0145, "DisplayPromptStatusV2" }, + { 0x0146, "FeatureStatV2" }, + { 0x0147, "LineStatV2" }, + { 0x0148, "ServiceURLStatV2" }, + { 0x0149, "SpeedDialStatV2" }, + { 0x014a, "CallInfoV2" }, + { 0x014b, "PortReq" }, + { 0x014c, "PortClose" }, + { 0x014d, "QoSListen" }, + { 0x014e, "QoSPath" }, + { 0x014f, "QoSTeardown" }, + { 0x0150, "UpdateDSCP" }, + { 0x0151, "QoSModify" }, + { 0x0152, "SubscriptionStat" }, + { 0x0153, "Notification" }, + { 0x0154, "StartMediaTransmissionAck" }, + { 0x0155, "StartMultiMediaTransmissionAck" }, + { 0x0156, "CallHistoryInfo" }, + { 0x0158, "MwiResponse" }, + { 0x015a, "EnhancedAlarm" }, + { 0x015e, "CallCountReq" }, + { 0x015f, "CallCountResp" }, + { 0x0160, "RecordingStatus" }, + { 0x8000, "SPCPRegisterTokenReq" }, + { 0x8100, "SPCPRegisterTokenAck" }, + { 0x8101, "SPCPRegisterTokenReject" }, + {0 , NULL} }; static value_string_ext message_id_ext = VALUE_STRING_EXT_INIT(message_id); -/* - * Device type to text conversion table - */ -static const value_string deviceTypes[] = { - {1, "30SPplus"}, - {2, "12SPplus"}, - {3, "12SP"}, - {4, "12"}, - {5, "30VIP"}, - {6, "Cisco 7910"}, /* {6 , "Telecaster"}, */ - {7, "Cisco 7960"}, /* {7 , "TelecasterMgr"}, */ - {8, "Cisco 7940"}, /* {8 , "TelecasterBus"}, */ - {9, "Cisco 7935"}, /* {9 , "Polycom"}, */ - {10, "VGC"}, - {12, "ATA"}, - {20, "Virtual30SPplus"}, - {21, "PhoneApplication"}, - {30, "AnalogAccess"}, - {40, "DigitalAccessPRI"}, - {41, "DigitalAccessT1"}, - {42, "DigitalAccessTitan2"}, - {43, "DigitalAccessLennon"}, - {47, "AnalogAccessElvis"}, - {50, "ConferenceBridge"}, - {51, "ConferenceBridgeYoko"}, - {52, "ConferenceBridgeDixieLand"}, - {53, "ConferenceBridgeSummit"}, - {60, "H225"}, - {61, "H323Phone"}, - {62, "H323Trunk"}, - {70, "MusicOnHold"}, - {71, "Pilot"}, - {72, "TapiPort"}, - {73, "TapiRoutePoint"}, - {80, "VoiceInBox"}, - {81, "VoiceInboxAdmin"}, - {82, "LineAnnunciator"}, - {83, "SoftwareMtpDixieLand"}, - {84, "CiscoMediaServer"}, - {85, "ConferenceBridgeFlint"}, - {90, "RouteList"}, - {100, "LoadSimulator"}, - {110, "MediaTerminationPoint"}, - {111, "MediaTerminationPointYoko"}, - {112, "MediaTerminationPointDixieLand"}, - {113, "MediaTerminationPointSummit"}, - {115, "Cisco 7941"}, - {119, "Cisco 7971"}, - {120, "MGCPStation"}, - {121, "MGCPTrunk"}, - {122, "RASProxy"}, - {124, "Cisco 7914"}, - {125, "Trunk"}, - {126, "Annunciator"}, - {127, "MonitorBridge"}, - {128, "Recorder"}, - {129, "MonitorBridgeYoko"}, - {131, "SipTrunk"}, - {227, "Cisco 7915 (12BUTTONS)"}, - {228, "Cisco 7915"}, - {229, "Cisco 7916 (12BUTTONS)"}, - {230, "Cisco 7916"}, - {254, "UnknownMGCPGateway"}, - {255, "NotDefined"}, - {275, "Nokia E-Series"}, - {302, "Cisco 7985"}, - {307, "Cisco 7911"}, - {308, "Cisco 7961GE"}, - {309, "Cisco 7941GE"}, - {348, "Cisco 7931"}, - {365, "Cisco 7921"}, - {369, "Cisco 7906"}, - {376, "Nokia Mobile"}, - {404, "Cisco 7962"}, - {431, "Cisco 7937"}, - {434, "Cisco 7942"}, - {435, "Cisco 7945"}, - {436, "Cisco 7965"}, - {437, "Cisco 7975"}, - {484, "Cisco 7925"}, - {495, "Cisco 6921"}, - {496, "Cisco 6941"}, - {497, "Cisco 6961"}, - {540, "Cisco 8961"}, - {547, "Cisco 6901"}, - {548, "Cisco 6911"}, - {564, "Cisco 6945"}, - {585, "Cisco 8945"}, - {586, "Cisco 8941"}, - {20000, "Cisco 7905"}, - {30002, "Cisco 7920"}, - {30006, "Cisco 7970"}, - {30007, "Cisco 7912"}, - {30008, "Cisco 7902"}, - {30016, "Cisco IP Communicator"}, - {30018, "Cisco 7961"}, - {30019, "Cisco 7936"}, - {30027, "Cisco Gateway AN"}, - {30028, "Cisco Gateway BRI"}, - {80000, "Linksys SPA521S"}, - {80005, "Linksys SPA525G"}, - {80009, "Linksys SPA525G2"}, - { 0 , NULL} +/* Declare Enums and Defines */ +static const value_string DisplayLabels_36[] = { + { 0x00000, "Empty" }, + { 0x00002, "Acct" }, + { 0x00003, "Flash" }, + { 0x00004, "Login" }, + { 0x00005, "Device In Home Location" }, + { 0x00006, "Device In Roaming Location" }, + { 0x00007, "Enter Authorization Code" }, + { 0x00008, "Enter Client Matter Code" }, + { 0x00009, "Calls Available For Pickup" }, + { 0x0000a, "Cm Fallback Service Operating" }, + { 0x0000b, "Max Phones Exceeded" }, + { 0x0000c, "Waiting To Rehome" }, + { 0x0000d, "Please End Call" }, + { 0x0000e, "Paging" }, + { 0x0000f, "Select Line" }, + { 0x00010, "Transfer Destination Is Busy" }, + { 0x00011, "Select A Service" }, + { 0x00012, "Local Services" }, + { 0x00013, "Enter Search Criteria" }, + { 0x00014, "Night Service" }, + { 0x00015, "Night Service Active" }, + { 0x00016, "Night Service Disabled" }, + { 0x00017, "Login Successful" }, + { 0x00018, "Wrong Pin" }, + { 0x00019, "Please Enter Pin" }, + { 0x0001a, "Of" }, + { 0x0001b, "Records 1 To" }, + { 0x0001c, "No Record Found" }, + { 0x0001d, "Search Results" }, + { 0x0001e, "Calls In Queue" }, + { 0x0001f, "Join To Hunt Group" }, + { 0x00020, "Ready" }, + { 0x00021, "Notready" }, + { 0x00022, "Call On Hold" }, + { 0x00023, "Hold Reversion" }, + { 0x00024, "Setup Failed" }, + { 0x00025, "No Resources" }, + { 0x00026, "Device Not Authorized" }, + { 0x00027, "Monitoring" }, + { 0x00028, "Recording Awaiting Call To Be Active" }, + { 0x00029, "Recording Already In Progress" }, + { 0x0002a, "Inactive Recording Session" }, + { 0x0002b, "Mobility" }, + { 0x0002c, "Whisper" }, + { 0x0002d, "Forward All" }, + { 0x0002e, "Malicious Call Id" }, + { 0x0002f, "Group Pickup" }, + { 0x00030, "Remove Last Participant" }, + { 0x00031, "Other Pickup" }, + { 0x00032, "Video" }, + { 0x00033, "End Call" }, + { 0x00034, "Conference List" }, + { 0x00035, "Quality Reporting Tool" }, + { 0x00036, "Hunt Group" }, + { 0x00037, "Use Line Or Join To Complete" }, + { 0x00038, "Do Not Disturb" }, + { 0x00039, "Do Not Disturb Is Active" }, + { 0x0003a, "Cfwdall Loop Detected" }, + { 0x0003b, "Cfwdall Hops Exceeded" }, + { 0x0003c, "Abbrdial" }, + { 0x0003d, "Pickup Is Unavailable" }, + { 0x0003e, "Conference Is Unavailable" }, + { 0x0003f, "Meetme Is Unavailable" }, + { 0x00040, "Cannot Retrieve Parked Call" }, + { 0x00041, "Cannot Send Call To Mobile" }, + { 0x00043, "Record" }, + { 0x00044, "Cannot Move Conversation" }, + { 0x00045, "Cw Off" }, + { 0x00046, "Coaching" }, + { 0x0004f, "Recording" }, + { 0x00050, "Recording Failed" }, + { 0x00051, "Connecting" }, + { 0x00000, NULL } }; -static value_string_ext deviceTypes_ext = VALUE_STRING_EXT_INIT(deviceTypes); +static value_string_ext DisplayLabels_36_ext = VALUE_STRING_EXT_INIT(DisplayLabels_36); -/* - * keypad button -> text conversion - */ -static const value_string keypadButtons[] = { - {0x0 , "Zero"}, - {0x1 , "One"}, - {0x2 , "Two"}, - {0x3 , "Three"}, - {0x4 , "Four"}, - {0x5 , "Five"}, - {0x6 , "Six"}, - {0x7 , "Seven"}, - {0x8 , "Eight"}, - {0x9 , "Nine"}, - {0xa , "A"}, - {0xb , "B"}, - {0xc , "C"}, - {0xd , "D"}, - {0xe , "Star"}, - {0xf , "Pound"}, - {0 , NULL} +static const value_string DisplayLabels_200[] = { + { 0x00001, "Redial" }, + { 0x00002, "Newcall" }, + { 0x00003, "Hold" }, + { 0x00004, "Transfer" }, + { 0x00005, "Cfwdall" }, + { 0x00006, "Cfwdbusy" }, + { 0x00007, "Cfwdnoanswer" }, + { 0x00008, "Backspace" }, + { 0x00009, "Endcall" }, + { 0x0000a, "Resume" }, + { 0x0000b, "Answer" }, + { 0x0000c, "Info" }, + { 0x0000d, "Confrn" }, + { 0x0000e, "Park" }, + { 0x0000f, "Join" }, + { 0x00010, "Meetme" }, + { 0x00011, "Pickup" }, + { 0x00012, "Gpickup" }, + { 0x00013, "Your Current Options" }, + { 0x00014, "Off Hook" }, + { 0x00015, "On Hook" }, + { 0x00016, "Ring Out" }, + { 0x00017, "From" }, + { 0x00018, "Connected" }, + { 0x00019, "Busy" }, + { 0x0001a, "Line In Use" }, + { 0x0001b, "Call Waiting" }, + { 0x0001c, "Call Transfer" }, + { 0x0001d, "Call Park" }, + { 0x0001e, "Call Proceed" }, + { 0x0001f, "In Use Remote" }, + { 0x00020, "Enter Number" }, + { 0x00021, "Call Park At" }, + { 0x00022, "Primary Only" }, + { 0x00023, "Temp Fail" }, + { 0x00024, "You Have Voicemail" }, + { 0x00025, "Forwarded To" }, + { 0x00026, "Can Not Complete Conference" }, + { 0x00027, "No Conference Bridge" }, + { 0x00028, "Can Not Hold Primary Control" }, + { 0x00029, "Invalid Conference Participant" }, + { 0x0002a, "In Conference Already" }, + { 0x0002b, "No Participant Info" }, + { 0x0002c, "Exceed Maximum Parties" }, + { 0x0002d, "Key Is Not Active" }, + { 0x0002e, "Error No License" }, + { 0x0002f, "Error Dbconfig" }, + { 0x00030, "Error Database" }, + { 0x00031, "Error Pass Limit" }, + { 0x00032, "Error Unknown" }, + { 0x00033, "Error Mismatch" }, + { 0x00034, "Conference" }, + { 0x00035, "Park Number" }, + { 0x00036, "Private" }, + { 0x00037, "Not Enough Bandwidth" }, + { 0x00038, "Unknown Number" }, + { 0x00039, "Rmlstc" }, + { 0x0003a, "Voicemail" }, + { 0x0003b, "Immdiv" }, + { 0x0003c, "Intrcpt" }, + { 0x0003d, "Setwtch" }, + { 0x0003e, "Trnsfvm" }, + { 0x0003f, "Dnd" }, + { 0x00040, "Divall" }, + { 0x00041, "Callback" }, + { 0x00042, "Network Congestion Rerouting" }, + { 0x00043, "Barge" }, + { 0x00044, "Failed To Setup Barge" }, + { 0x00045, "Another Barge Exists" }, + { 0x00046, "Incompatible Device Type" }, + { 0x00047, "No Park Number Available" }, + { 0x00048, "Callpark Reversion" }, + { 0x00049, "Service Is Not Active" }, + { 0x0004a, "High Traffic Try Again Later" }, + { 0x0004b, "Qrt" }, + { 0x0004c, "Mcid" }, + { 0x0004d, "Dirtrfr" }, + { 0x0004e, "Select" }, + { 0x0004f, "Conflist" }, + { 0x00050, "Idivert" }, + { 0x00051, "Cbarge" }, + { 0x00052, "Can Not Complete Transfer" }, + { 0x00053, "Can Not Join Calls" }, + { 0x00054, "Mcid Successful" }, + { 0x00055, "Number Not Configured" }, + { 0x00056, "Security Error" }, + { 0x00057, "Video Bandwidth Unavailable" }, + { 0x00058, "Vidmode" }, + { 0x00059, "Max Call Duration Timeout" }, + { 0x0005a, "Max Hold Duration Timeout" }, + { 0x0005b, "Opickup" }, + { 0x0005c, "Hlog" }, + { 0x0005d, "Logged Out Of Hunt Group" }, + { 0x0005e, "Park Slot Unavailable" }, + { 0x0005f, "No Call Available For Pickup" }, + { 0x00061, "External Transfer Restricted" }, + { 0x00062, "No Line Available For Pickup" }, + { 0x00063, "Path Replacement In Progress" }, + { 0x00064, "Unknown 2" }, + { 0x00065, "Mac Address" }, + { 0x00066, "Host Name" }, + { 0x00067, "Domain Name" }, + { 0x00068, "Ip Address" }, + { 0x00069, "Subnet Mask" }, + { 0x0006a, "Tftp Server 1" }, + { 0x0006b, "Default Router 1" }, + { 0x0006c, "Default Router 2" }, + { 0x0006d, "Default Router 3" }, + { 0x0006e, "Default Router 4" }, + { 0x0006f, "Default Router 5" }, + { 0x00070, "Dns Server 1" }, + { 0x00071, "Dns Server 2" }, + { 0x00072, "Dns Server 3" }, + { 0x00073, "Dns Server 4" }, + { 0x00074, "Dns Server 5" }, + { 0x00075, "Operational Vlan Id" }, + { 0x00076, "Admin Vlan Id" }, + { 0x00077, "Call Manager 1" }, + { 0x00078, "Call Manager 2" }, + { 0x00079, "Call Manager 3" }, + { 0x0007a, "Call Manager 4" }, + { 0x0007b, "Call Manager 5" }, + { 0x0007c, "Information Url" }, + { 0x0007d, "Directories Url" }, + { 0x0007e, "Messages Url" }, + { 0x0007f, "Services Url" }, + { 0x00000, NULL } }; -static value_string_ext keypadButtons_ext = VALUE_STRING_EXT_INIT(keypadButtons); +static value_string_ext DisplayLabels_200_ext = VALUE_STRING_EXT_INIT(DisplayLabels_200); -static const value_string deviceStimuli[] = { - {0x1 , "LastNumberRedial"}, - {0x2 , "SpeedDial"}, - {0x3 , "Hold"}, - {0x4 , "Transfer"}, - {0x5 , "ForwardAll"}, - {0x6 , "ForwardBusy"}, - {0x7 , "ForwardNoAnswer"}, - {0x8 , "Display"}, - {0x9 , "Line"}, - {0xa , "T120Chat"}, - {0xb , "T120Whiteboard"}, - {0xc , "T120ApplicationSharing"}, - {0xd , "T120FileTransfer"}, - {0xe , "Video"}, - {0xf , "VoiceMail"}, - {0x10 , "AutoAnswerRelease"}, - {0x11 , "AutoAnswer"}, - {0x12 , "Select"}, - {0x13 , "Privacy"}, - {0x14 , "ServiceURL"}, - {0x1B , "MaliciousCall"}, - {0x21 , "GenericAppB1"}, - {0x22 , "GenericAppB2"}, - {0x23 , "GenericAppB3"}, - {0x24 , "GenericAppB4"}, - {0x25 , "GenericAppB5"}, - {0x7b , "MeetMeConference"}, - {0x7d , "Conference"}, - {0x7e , "CallPark"}, - {0x7f , "CallPickup"}, - {0x80 , "GroupCallPickup"}, - {0,NULL} +static const value_string DeviceType[] = { + { 0x00001, "Station30SPplus" }, + { 0x00002, "Station12SPplus" }, + { 0x00003, "Station12SP" }, + { 0x00004, "Station12" }, + { 0x00005, "Station30VIP" }, + { 0x00006, "StationTelecaster" }, + { 0x00006, "Cisco 7910" }, + { 0x00007, "StationTelecasterMgr" }, + { 0x00008, "StationTelecasterBus" }, + { 0x00008, "Cisco 7940" }, + { 0x00009, "StationPolycom" }, + { 0x00009, "Cisco 7935" }, + { 0x0000a, "StationVGC" }, + { 0x0000b, "VGCVirtualPhone" }, + { 0x0000c, "StationATA186" }, + { 0x0000d, "StationATA188" }, + { 0x0000f, "EmccBase" }, + { 0x00014, "Virtual30SPplus" }, + { 0x00015, "StationPhoneApplication" }, + { 0x0001e, "AnalogAccess" }, + { 0x00028, "DigitalAccessTitan1" }, + { 0x00029, "Digital Access T1" }, + { 0x0002a, "DigitalAccessTitan2" }, + { 0x0002b, "DigitalAccessLennon" }, + { 0x0002f, "AnalogAccessElvis" }, + { 0x00030, "VGCGateway" }, + { 0x00032, "ConferenceBridge" }, + { 0x00033, "ConferenceBridgeYoko" }, + { 0x00034, "ConferenceBridgeDixieLand" }, + { 0x00035, "ConferenceBridgeSummit" }, + { 0x0003c, "H225" }, + { 0x0003d, "H323Phone" }, + { 0x0003e, "H323Gateway" }, + { 0x00046, "MusicOnHold" }, + { 0x00047, "Pilot" }, + { 0x00048, "TapiPort" }, + { 0x00049, "TapiRoutePoint" }, + { 0x00050, "VoiceInBox" }, + { 0x00051, "VoiceInboxAdmin" }, + { 0x00052, "LineAnnunciator" }, + { 0x00053, "SoftwareMtpDixieLand" }, + { 0x00054, "CiscoMediaServer" }, + { 0x00055, "ConferenceBridgeFlint" }, + { 0x00056, "ConferenceBridgeHetroGen" }, + { 0x00057, "ConferenceBridgeAudVid" }, + { 0x00058, "ConferenceHVideoBridge" }, + { 0x0005a, "RouteList" }, + { 0x00064, "LoadSimulator" }, + { 0x0006e, "MediaTerminationPoint" }, + { 0x0006f, "MediaTerminationPointYoko" }, + { 0x00070, "MediaTerminationPointDixieLand" }, + { 0x00071, "MediaTerminationPointSummit" }, + { 0x00073, "7941G" }, + { 0x00077, "7971" }, + { 0x00078, "MGCPStation" }, + { 0x00079, "MGCPTrunk" }, + { 0x0007a, "RASProxy" }, + { 0x0007c, "Cisco 7914 AddOn" }, + { 0x0007d, "Trunk" }, + { 0x0007e, "Annunciator" }, + { 0x0007f, "MonitorBridge" }, + { 0x00080, "Recorder" }, + { 0x00081, "MonitorBridgeYoko" }, + { 0x00083, "SipTrunk" }, + { 0x00084, "SipGateway" }, + { 0x00085, "WsmTrunk" }, + { 0x00086, "RemoteDestination" }, + { 0x000e3, "Cisco 7915 AddOn" }, + { 0x000e4, "Cisco 7915 AddOn" }, + { 0x000e5, "Cisco 7916 AddOn" }, + { 0x000e6, "Cisco 7916 AddOn" }, + { 0x000fd, "GenericDevice" }, + { 0x000fe, "UnknownMGCPGateway" }, + { 0x000ff, "NotDefined" }, + { 0x00113, "Nokia E Series" }, + { 0x0012e, "7989" }, + { 0x0012e, "Cisco 7985" }, + { 0x00133, "7911" }, + { 0x00134, "7941G_GE" }, + { 0x00134, "Cisco 7961 GE" }, + { 0x00135, "7961G_GE" }, + { 0x0014f, "MotorolaCN622" }, + { 0x00150, "3rdPartySipBasic" }, + { 0x0015c, "StationGoPed" }, + { 0x0015c, "Cisco 7931" }, + { 0x00166, "UnifiedCommunicator" }, + { 0x0016d, "7921" }, + { 0x00171, "7906" }, + { 0x00176, "3rdPartySipAdv" }, + { 0x00177, "Telepresence" }, + { 0x00178, "Nokia ICC client" }, + { 0x00194, "7962" }, + { 0x0019c, "3951" }, + { 0x001af, "7937" }, + { 0x001b2, "7942" }, + { 0x001b3, "7945" }, + { 0x001b4, "7965" }, + { 0x001b5, "7975" }, + { 0x001d4, "UnifiedMobileCommunicator" }, + { 0x001e4, "Cisco 7925" }, + { 0x001ed, "9971_CE" }, + { 0x001ef, "Cisco 6921" }, + { 0x001f0, "Cisco 6941" }, + { 0x001f1, "Cisco 6961" }, + { 0x001f7, "CSF" }, + { 0x00223, "Cisco 6901" }, + { 0x00224, "Cisco 6911" }, + { 0x00234, "Cisco 6945" }, + { 0x00249, "Cisco 8945" }, + { 0x0024a, "Cisco 8941" }, + { 0x00255, "CiscoTelepresenceMcu" }, + { 0x00257, "CiscoTelePresenceExchange" }, + { 0x00258, "CiscoTelePresenceSoftwareConferenceBridge" }, + { 0x00277, "ASSip" }, + { 0x0027b, "CtiRemoteDevice" }, + { 0x04e20, "7905" }, + { 0x07532, "7920" }, + { 0x07536, "7970" }, + { 0x07537, "7912" }, + { 0x07538, "7902" }, + { 0x07540, "SoftPhone" }, + { 0x07540, "Cisco IP Communicator" }, + { 0x07542, "7961G" }, + { 0x07543, "7936" }, + { 0x0754b, "AnalogPhone" }, + { 0x0754c, "ISDNBRIPhone" }, + { 0x07550, "SCCPGwVirtualPhone" }, + { 0x07553, "IP_STE" }, + { 0x08cc9, "CiscoTelePresenceConductor" }, + { 0x13880, "Cisco SPA 521S" }, + { 0x13883, "Cisco SPA 502G" }, + { 0x13884, "Cisco SPA 504G" }, + { 0x13885, "Cisco SPA 525G" }, + { 0x13887, "Cisco SPA 509G" }, + { 0x13889, "Cisco SPA 525G2" }, + { 0x1388b, "Cisco SPA 303G" }, + { 0x00000, NULL } }; -static value_string_ext deviceStimuli_ext = VALUE_STRING_EXT_INIT(deviceStimuli); +static value_string_ext DeviceType_ext = VALUE_STRING_EXT_INIT(DeviceType); - -/* Note i'm only using 7 later on cuz i'm lazy ;) */ -#define DeviceMaxCapabilities 18 /* max capabilities allowed in Cap response message */ - -static const value_string mediaPayloads[] = { - {1 , "Non-standard codec"}, - {2 , "G.711 A-law 64k"}, - {3 , "G.711 A-law 56k"}, - {4 , "G.711 u-law 64k"}, - {5 , "G.711 u-law 56k"}, - {6 , "G.722 64k"}, - {7 , "G.722 56k"}, - {8 , "G.722 48k"}, - {9 , "G.723.1"}, - {10 , "G.728"}, - {11 , "G.729"}, - {12 , "G.729 Annex A"}, - {13 , "IS11172 AudioCap"}, /* IS11172 is an ISO MPEG standard */ - {14 , "IS13818 AudioCap"}, /* IS13818 is an ISO MPEG standard */ - {15 , "G.729 Annex B"}, - {16 , "G.729 Annex A+Annex B"}, - {18 , "GSM Full Rate"}, - {19 , "GSM Half Rate"}, - {20 , "GSM Enhanced Full Rate"}, - {25 , "Wideband 256k"}, - {32 , "Data 64k"}, - {33 , "Data 56k"}, - {80 , "GSM"}, - {81 , "ActiveVoice"}, - {82 , "G.726 32K"}, - {83 , "G.726 24K"}, - {84 , "G.726 16K"}, - {85 , "G.729B"}, - {86 , "G.729B Low Complexity"}, - {100 , "H261"}, - {101 , "H263"}, - {102 , "Video"}, - {105 , "T120"}, - {106 , "H224"}, - {257 , "RFC2833_DynPayload"}, - {0 , NULL} +static const value_string KeyPadButton[] = { + { 0x00000, "Zero" }, + { 0x00001, "One" }, + { 0x00002, "Two" }, + { 0x00003, "Three" }, + { 0x00004, "Four" }, + { 0x00005, "Five" }, + { 0x00006, "Six" }, + { 0x00007, "Seven" }, + { 0x00008, "Eight" }, + { 0x00009, "Nine" }, + { 0x0000a, "A" }, + { 0x0000b, "B" }, + { 0x0000c, "C" }, + { 0x0000d, "D" }, + { 0x0000e, "Star" }, + { 0x0000f, "Pound" }, + { 0x00010, "Plus" }, + { 0x00000, NULL } }; -static value_string_ext mediaPayloads_ext = VALUE_STRING_EXT_INIT(mediaPayloads); +static value_string_ext KeyPadButton_ext = VALUE_STRING_EXT_INIT(KeyPadButton); -static const value_string alarmSeverities[] = { - {0 , "Critical"}, - {1 , "Warning"}, - {2 , "Informational"}, - {4 , "Unknown"}, - {7 , "Major"}, - {8 , "Minor"}, - {10 , "Marginal"}, - {20 , "TraceInfo"}, - {0 , NULL} +static const value_string DeviceStimulus[] = { + { 0x00001, "LastNumberRedial" }, + { 0x00002, "SpeedDial" }, + { 0x00003, "Hold" }, + { 0x00004, "Transfer" }, + { 0x00005, "ForwardAll" }, + { 0x00006, "ForwardBusy" }, + { 0x00007, "ForwardNoAnswer" }, + { 0x00008, "Display" }, + { 0x00009, "Line" }, + { 0x0000a, "T120Chat" }, + { 0x0000b, "T120Whiteboard" }, + { 0x0000c, "T120ApplicationSharing" }, + { 0x0000d, "T120FileTransfer" }, + { 0x0000e, "Video" }, + { 0x0000f, "VoiceMail" }, + { 0x00010, "AnswerRelease" }, + { 0x00011, "AutoAnswer" }, + { 0x00012, "Select" }, + { 0x00013, "Privacy" }, + { 0x00014, "ServiceURL" }, + { 0x00015, "BLFSpeedDial" }, + { 0x00016, "DPark" }, + { 0x00017, "Intercom" }, + { 0x0001b, "MaliciousCall" }, + { 0x00021, "GenericAppB1" }, + { 0x00022, "GenericAppB2" }, + { 0x00023, "GenericAppB3" }, + { 0x00024, "GenericAppB4" }, + { 0x00025, "GenericAppB5" }, + { 0x0007b, "MeetMeConference" }, + { 0x0007d, "Conference" }, + { 0x0007e, "CallPark" }, + { 0x0007f, "CallPickUp" }, + { 0x00080, "GroupCallPickUp" }, + { 0x00081, "Mobility" }, + { 0x00082, "DoNotDisturb" }, + { 0x00083, "ConfList" }, + { 0x00084, "RemoveLastParticipant" }, + { 0x00085, "QRT" }, + { 0x00086, "CallBack" }, + { 0x00087, "OtherPickup" }, + { 0x00088, "VideoMode" }, + { 0x00089, "NewCall" }, + { 0x0008a, "EndCall" }, + { 0x0008b, "HLog" }, + { 0x0008f, "Queuing" }, + { 0x0008f, "MaxStimulusValue" }, + { 0x00000, NULL } }; -static value_string_ext alarmSeverities_ext = VALUE_STRING_EXT_INIT(alarmSeverities); +static value_string_ext DeviceStimulus_ext = VALUE_STRING_EXT_INIT(DeviceStimulus); -static const value_string multicastMediaReceptionStatus[] = { - {0 , "Ok"}, - {1 , "Error"}, - {0 , NULL} +#define MEDIA_PAYLOAD_G711ALAW64K 0x00002 /* audio */ +#define MEDIA_PAYLOAD_G711ALAW56K 0x00003 /* audio */ +#define MEDIA_PAYLOAD_G711ULAW64K 0x00004 /* audio */ +#define MEDIA_PAYLOAD_G711ULAW56K 0x00005 /* audio */ +#define MEDIA_PAYLOAD_G722_64K 0x00006 /* audio */ +#define MEDIA_PAYLOAD_G722_56K 0x00007 /* audio */ +#define MEDIA_PAYLOAD_G722_48K 0x00008 /* audio */ +#define MEDIA_PAYLOAD_G7231 0x00009 /* audio */ +#define MEDIA_PAYLOAD_G728 0x0000a /* audio */ +#define MEDIA_PAYLOAD_G729 0x0000b /* audio */ +#define MEDIA_PAYLOAD_G729ANNEXA 0x0000c /* audio */ +#define MEDIA_PAYLOAD_G729ANNEXB 0x0000f /* audio */ +#define MEDIA_PAYLOAD_G729ANNEXAWANNEXB 0x00010 /* audio */ +#define MEDIA_PAYLOAD_GSM_FULL_RATE 0x00012 /* audio */ +#define MEDIA_PAYLOAD_GSM_HALF_RATE 0x00013 /* audio */ +#define MEDIA_PAYLOAD_GSM_ENHANCED_FULL_RATE 0x00014 /* audio */ +#define MEDIA_PAYLOAD_WIDE_BAND_256K 0x00019 /* audio */ +#define MEDIA_PAYLOAD_DATA64 0x00020 /* audio */ +#define MEDIA_PAYLOAD_DATA56 0x00021 /* audio */ +#define MEDIA_PAYLOAD_G7221_32K 0x00028 /* audio */ +#define MEDIA_PAYLOAD_G7221_24K 0x00029 /* audio */ +#define MEDIA_PAYLOAD_AAC 0x0002a /* audio */ +#define MEDIA_PAYLOAD_MP4ALATM_128 0x0002b /* audio */ +#define MEDIA_PAYLOAD_MP4ALATM_64 0x0002c /* audio */ +#define MEDIA_PAYLOAD_MP4ALATM_56 0x0002d /* audio */ +#define MEDIA_PAYLOAD_MP4ALATM_48 0x0002e /* audio */ +#define MEDIA_PAYLOAD_MP4ALATM_32 0x0002f /* audio */ +#define MEDIA_PAYLOAD_MP4ALATM_24 0x00030 /* audio */ +#define MEDIA_PAYLOAD_MP4ALATM_NA 0x00031 /* audio */ +#define MEDIA_PAYLOAD_GSM 0x00050 /* audio */ +#define MEDIA_PAYLOAD_G726_32K 0x00052 /* audio */ +#define MEDIA_PAYLOAD_G726_24K 0x00053 /* audio */ +#define MEDIA_PAYLOAD_G726_16K 0x00054 /* audio */ +#define MEDIA_PAYLOAD_ILBC 0x00056 /* audio */ +#define MEDIA_PAYLOAD_ISAC 0x00059 /* audio */ +#define MEDIA_PAYLOAD_AMR 0x00061 /* audio */ +#define MEDIA_PAYLOAD_AMR_WB 0x00062 /* audio */ +#define MEDIA_PAYLOAD_H261 0x00064 /* video */ +#define MEDIA_PAYLOAD_H263 0x00065 /* video */ +#define MEDIA_PAYLOAD_VIEO 0x00066 /* video */ +#define MEDIA_PAYLOAD_H264 0x00067 /* video */ +#define MEDIA_PAYLOAD_H264_SVC 0x00068 /* video */ +#define MEDIA_PAYLOAD_T120 0x00069 /* video */ +#define MEDIA_PAYLOAD_H224 0x0006a /* video */ +#define MEDIA_PAYLOAD_T38FAX 0x0006b /* video */ +#define MEDIA_PAYLOAD_TOTE 0x0006c /* video */ +#define MEDIA_PAYLOAD_H265 0x0006d /* video */ +#define MEDIA_PAYLOAD_H264_UC 0x0006e /* video */ +#define MEDIA_PAYLOAD_XV150_MR_711U 0x0006f /* video */ +#define MEDIA_PAYLOAD_NSE_VBD_711U 0x00070 /* video */ +#define MEDIA_PAYLOAD_XV150_MR_729A 0x00071 /* video */ +#define MEDIA_PAYLOAD_NSE_VBD_729A 0x00072 /* video */ +#define MEDIA_PAYLOAD_H264_FEC 0x00073 /* video */ +#define MEDIA_PAYLOAD_CLEAR_CHAN 0x00078 /* data */ +#define MEDIA_PAYLOAD_UNIVERSAL_XCODER 0x000de /* data */ +#define MEDIA_PAYLOAD_RFC2833_DYNPAYLOAD 0x00101 /* data */ +#define MEDIA_PAYLOAD_PASSTHROUGH 0x00102 /* data */ +#define MEDIA_PAYLOAD_DYNAMIC_PAYLOAD_PASSTHRU 0x00103 /* data */ +#define MEDIA_PAYLOAD_DTMF_OOB 0x00104 /* data */ +#define MEDIA_PAYLOAD_INBAND_DTMF_RFC2833 0x00105 /* data */ +#define MEDIA_PAYLOAD_NOAUDIO 0x0012b /* data */ +#define MEDIA_PAYLOAD_V150_LC_MODEMRELAY 0x0012c /* data */ +#define MEDIA_PAYLOAD_V150_LC_SPRT 0x0012d /* data */ +#define MEDIA_PAYLOAD_V150_LC_SSE 0x0012e /* data */ +#define MEDIA_PAYLOAD_MAX 0x0012f /* data */ + +static const value_string Media_PayloadType[] = { + { MEDIA_PAYLOAD_G711ALAW64K, "Media_Payload_G711Alaw64k" }, + { MEDIA_PAYLOAD_G711ALAW56K, "Media_Payload_G711Alaw56k" }, + { MEDIA_PAYLOAD_G711ULAW64K, "Media_Payload_G711Ulaw64k" }, + { MEDIA_PAYLOAD_G711ULAW56K, "Media_Payload_G711Ulaw56k" }, + { MEDIA_PAYLOAD_G722_64K, "Media_Payload_G722_64k" }, + { MEDIA_PAYLOAD_G722_56K, "Media_Payload_G722_56k" }, + { MEDIA_PAYLOAD_G722_48K, "Media_Payload_G722_48k" }, + { MEDIA_PAYLOAD_G7231, "Media_Payload_G7231" }, + { MEDIA_PAYLOAD_G728, "Media_Payload_G728" }, + { MEDIA_PAYLOAD_G729, "Media_Payload_G729" }, + { MEDIA_PAYLOAD_G729ANNEXA, "Media_Payload_G729AnnexA" }, + { MEDIA_PAYLOAD_G729ANNEXB, "Media_Payload_G729AnnexB" }, + { MEDIA_PAYLOAD_G729ANNEXAWANNEXB, "Media_Payload_G729AnnexAwAnnexB" }, + { MEDIA_PAYLOAD_GSM_FULL_RATE, "Media_Payload_GSM_Full_Rate" }, + { MEDIA_PAYLOAD_GSM_HALF_RATE, "Media_Payload_GSM_Half_Rate" }, + { MEDIA_PAYLOAD_GSM_ENHANCED_FULL_RATE, "Media_Payload_GSM_Enhanced_Full_Rate" }, + { MEDIA_PAYLOAD_WIDE_BAND_256K, "Media_Payload_Wide_Band_256k" }, + { MEDIA_PAYLOAD_DATA64, "Media_Payload_Data64" }, + { MEDIA_PAYLOAD_DATA56, "Media_Payload_Data56" }, + { MEDIA_PAYLOAD_G7221_32K, "Media_Payload_G7221_32K" }, + { MEDIA_PAYLOAD_G7221_24K, "Media_Payload_G7221_24K" }, + { MEDIA_PAYLOAD_AAC, "Media_Payload_AAC" }, + { MEDIA_PAYLOAD_MP4ALATM_128, "Media_Payload_MP4ALATM_128" }, + { MEDIA_PAYLOAD_MP4ALATM_64, "Media_Payload_MP4ALATM_64" }, + { MEDIA_PAYLOAD_MP4ALATM_56, "Media_Payload_MP4ALATM_56" }, + { MEDIA_PAYLOAD_MP4ALATM_48, "Media_Payload_MP4ALATM_48" }, + { MEDIA_PAYLOAD_MP4ALATM_32, "Media_Payload_MP4ALATM_32" }, + { MEDIA_PAYLOAD_MP4ALATM_24, "Media_Payload_MP4ALATM_24" }, + { MEDIA_PAYLOAD_MP4ALATM_NA, "Media_Payload_MP4ALATM_NA" }, + { MEDIA_PAYLOAD_GSM, "Media_Payload_GSM" }, + { MEDIA_PAYLOAD_G726_32K, "Media_Payload_G726_32K" }, + { MEDIA_PAYLOAD_G726_24K, "Media_Payload_G726_24K" }, + { MEDIA_PAYLOAD_G726_16K, "Media_Payload_G726_16K" }, + { MEDIA_PAYLOAD_ILBC, "Media_Payload_ILBC" }, + { MEDIA_PAYLOAD_ISAC, "Media_Payload_ISAC" }, + { MEDIA_PAYLOAD_AMR, "Media_Payload_AMR" }, + { MEDIA_PAYLOAD_AMR_WB, "Media_Payload_AMR_WB" }, + { MEDIA_PAYLOAD_H261, "Media_Payload_H261" }, + { MEDIA_PAYLOAD_H263, "Media_Payload_H263" }, + { MEDIA_PAYLOAD_VIEO, "Media_Payload_Vieo" }, + { MEDIA_PAYLOAD_H264, "Media_Payload_H264" }, + { MEDIA_PAYLOAD_H264_SVC, "Media_Payload_H264_SVC" }, + { MEDIA_PAYLOAD_T120, "Media_Payload_T120" }, + { MEDIA_PAYLOAD_H224, "Media_Payload_H224" }, + { MEDIA_PAYLOAD_T38FAX, "Media_Payload_T38Fax" }, + { MEDIA_PAYLOAD_TOTE, "Media_Payload_TOTE" }, + { MEDIA_PAYLOAD_H265, "Media_Payload_H265" }, + { MEDIA_PAYLOAD_H264_UC, "Media_Payload_H264_UC" }, + { MEDIA_PAYLOAD_XV150_MR_711U, "Media_Payload_XV150_MR_711U" }, + { MEDIA_PAYLOAD_NSE_VBD_711U, "Media_Payload_NSE_VBD_711U" }, + { MEDIA_PAYLOAD_XV150_MR_729A, "Media_Payload_XV150_MR_729A" }, + { MEDIA_PAYLOAD_NSE_VBD_729A, "Media_Payload_NSE_VBD_729A" }, + { MEDIA_PAYLOAD_H264_FEC, "Media_Payload_H264_FEC" }, + { MEDIA_PAYLOAD_CLEAR_CHAN, "Media_Payload_Clear_Chan" }, + { MEDIA_PAYLOAD_UNIVERSAL_XCODER, "Media_Payload_Universal_Xcoder" }, + { MEDIA_PAYLOAD_RFC2833_DYNPAYLOAD, "Media_Payload_RFC2833_DynPayload" }, + { MEDIA_PAYLOAD_PASSTHROUGH, "Media_Payload_PassThrough" }, + { MEDIA_PAYLOAD_DYNAMIC_PAYLOAD_PASSTHRU, "Media_Payload_Dynamic_Payload_PassThru" }, + { MEDIA_PAYLOAD_DTMF_OOB, "Media_Payload_DTMF_OOB" }, + { MEDIA_PAYLOAD_INBAND_DTMF_RFC2833, "Media_Payload_Inband_DTMF_RFC2833" }, + { MEDIA_PAYLOAD_NOAUDIO, "Media_Payload_NoAudio" }, + { MEDIA_PAYLOAD_V150_LC_MODEMRELAY, "Media_Payload_v150_LC_ModemRelay" }, + { MEDIA_PAYLOAD_V150_LC_SPRT, "Media_Payload_v150_LC_SPRT" }, + { MEDIA_PAYLOAD_V150_LC_SSE, "Media_Payload_v150_LC_SSE" }, + { MEDIA_PAYLOAD_MAX, "Media_Payload_Max" }, + { 0x00000, NULL } }; +static value_string_ext Media_PayloadType_ext = VALUE_STRING_EXT_INIT(Media_PayloadType); -static const value_string openReceiveChanStatus[] = { - {0 , "orcOk"}, - {1 , "orcError"}, - {0 , NULL} +static const value_string Media_G723BitRate[] = { + { 0x00001, "Media_G723BRate_5_3" }, + { 0x00002, "Media_G723BRate_6_3" }, + { 0x00000, NULL } }; +static value_string_ext Media_G723BitRate_ext = VALUE_STRING_EXT_INIT(Media_G723BitRate); -static const value_string ipVersion[] = { - {0 , "IPv4"}, - {1 , "IPv6"}, /*Assume IPv6 will be set to be "1"*/ - {0 , NULL} +static const value_string DeviceAlarmSeverity[] = { + { 0x00000, "Critical" }, + { 0x00001, "Warning" }, + { 0x00002, "Informational" }, + { 0x00004, "Unknown" }, + { 0x00007, "Major" }, + { 0x00008, "Minor" }, + { 0x0000a, "Marginal" }, + { 0x00014, "TraceInfo" }, + { 0x00000, NULL } }; +static value_string_ext DeviceAlarmSeverity_ext = VALUE_STRING_EXT_INIT(DeviceAlarmSeverity); -static const value_string statsProcessingTypes[] = { - {0 , "clearStats"}, - {1 , "doNotClearStats"}, - {0 , NULL} +static const value_string MulticastMediaReceptionStatus[] = { + { 0x00000, "Ok" }, + { 0x00001, "Error" }, + { 0x00000, NULL } }; +static value_string_ext MulticastMediaReceptionStatus_ext = VALUE_STRING_EXT_INIT(MulticastMediaReceptionStatus); -#define SkMaxSoftKeyCount 18 /* this value should be the same as the max soft key value */ -static const value_string softKeyEvents[] = { - {1 , "Redial"}, - {2 , "NewCall"}, - {3 , "Hold"}, - {4 , "Transfer"}, - {5 , "CFwdAll"}, - {6 , "CFwdBusy"}, - {7 , "CFwdNoAnswer"}, - {8 , "BackSpace"}, - {9 , "EndCall"}, - {10 , "Resume"}, - {11 , "Answer"}, - {12 , "Info"}, - {13 , "Confrn"}, - {14 , "Park"}, - {15 , "Join"}, - {16 , "MeetMeConfrn"}, - {17 , "CallPickUp"}, - {18 , "GrpCallPickUp"}, - {0 , NULL} +static const value_string MediaStatus[] = { + { 0x00000, "Ok" }, + { 0x00001, "Unknown" }, + { 0x00002, "NotEnoughChannels" }, + { 0x00003, "CodecTooComplex" }, + { 0x00004, "InvalidPartyID" }, + { 0x00005, "InvalidCallRef" }, + { 0x00006, "InvalidCodec" }, + { 0x00007, "InvalidPacketSize" }, + { 0x00008, "OutOfSockets" }, + { 0x00009, "EncoderOrDecoderFailed" }, + { 0x0000a, "InvalidDynamicPayloadType" }, + { 0x0000b, "RequestedIpAddrTypeUnAvailable" }, + { 0x000ff, "DeviceOnHook" }, + { 0x00000, NULL } }; -static value_string_ext softKeyEvents_ext = VALUE_STRING_EXT_INIT(softKeyEvents); +static value_string_ext MediaStatus_ext = VALUE_STRING_EXT_INIT(MediaStatus); -/* Define info index for each softkey event for Telecaster station. */ -static const value_string softKeyIndexes[] = { - {301 , "RedialInfoIndex"}, - {302 , "NewCallInfoIndex"}, - {303 , "HoldInfoIndex"}, - {304 , "TrnsferInfoIndex"}, - {305 , "CFwdAllInfoIndex"}, - {306 , "CFwdBusyInfoIndex"}, /* not used yet */ - {307 , "CFwdNoAnswerInfoIndex"}, /* not used yet */ - {308 , "BackSpaceInfoIndex"}, - {309 , "EndCallInfoIndex"}, - {310 , "ResumeInfoIndex"}, - {311 , "AnswerInfoIndex"}, - {312 , "InfoInfoIndex"}, - {313 , "ConfrnInfoIndex"}, - {314 , "ParkInfoIndex"}, - {315 , "JoinInfoIndex"}, - {316 , "MeetMeConfrnInfoIndex"}, - {317 , "CallPickUpInfoIndex"}, - {318 , "GrpCallPickUpInfoIndex"}, - {0 , NULL} +#define IPADDRTYPE_IPV4 0x00000 +#define IPADDRTYPE_IPV6 0x00001 +#define IPADDRTYPE_IPV4_V6 0x00002 +#define IPADDRTYPE_IP_INVALID 0x00003 + +static const value_string IpAddrType[] = { + { IPADDRTYPE_IPV4, "v4" }, + { IPADDRTYPE_IPV6, "v6" }, + { IPADDRTYPE_IPV4_V6, "v4_v6" }, + { IPADDRTYPE_IP_INVALID, "_Invalid" }, + { 0x00000, NULL } }; -static value_string_ext softKeyIndexes_ext = VALUE_STRING_EXT_INIT(softKeyIndexes); +static value_string_ext IpAddrType_ext = VALUE_STRING_EXT_INIT(IpAddrType); - -static const value_string buttonDefinitions[] = { - {0x01 , "LastNumberRedial"}, - {0x02 , "SpeedDial"}, - {0x03 , "Hold"}, - {0x04 , "Transfer"}, - {0x05 , "ForwardAll"}, - {0x06 , "ForwardBusy"}, - {0x07 , "ForwardNoAnswer"}, - {0x08 , "Display"}, - {0x09 , "Line"}, - {0x0A , "T120Chat"}, - {0x0B , "T120Whiteboard"}, - {0x0C , "T120ApplicationSharing"}, - {0x0D , "T120FileTransfer"}, - {0x0E , "Video"}, - {0x0F , "Voicemail"}, - {0x10 , "AnswerRelease"}, - {0x11 , "Auto Answer"}, - {0x13 , "Feature"}, - {0x14 , "ServiceUrl"}, - {0x15 , "BLF Speeddial"}, - {0x21 , "Generic App B1"}, - {0x22 , "Generic App B2"}, - {0x23 , "Generic App B3"}, - {0x24 , "Generic App B4"}, - {0x25 , "Generic App B5"}, - {0x26 , "Monitor/Multiblink"}, - {0x7B , "Meet Me Conference"}, - {0x7D , "Conference"}, - {0x7E , "Call Park"}, - {0x7F , "Call Pickup"}, - {0x80 , "Group Call Pickup"}, - {0x81 , "Mobility"}, - {0x82 , "Test 6"}, - {0x85 , "Test 8"}, - {0x86 , "Test 9"}, - {0x87 , "Test A"}, - {0x88 , "Test B"}, - {0x89 , "Test C"}, - {0x8A , "Test D"}, - {0x8B , "Test 7"}, - {0xC0 , "Test E"}, - {0xC1 , "Test F"}, - {0xC2 , "Messages"}, - {0xC3 , "Directory"}, - {0xC4 , "Test I"}, - {0xC5 , "Application"}, - {0xC6 , "Headset"}, - {0xF0 , "Keypad"}, - {0xFD , "AEC"}, - {0xFF , "Undefined"}, - {0 , NULL} +static const value_string StatsProcessingType[] = { + { 0x00000, "clearStats" }, + { 0x00001, "doNotClearStats" }, + { 0x00000, NULL } }; -static value_string_ext buttonDefinitions_ext = VALUE_STRING_EXT_INIT(buttonDefinitions); +static value_string_ext StatsProcessingType_ext = VALUE_STRING_EXT_INIT(StatsProcessingType); -#define StationTotalSoftKeySets 10 /* total number of the soft key sets */ -static const value_string keySetNames[] = { - {0 , "OnHook"}, - {1 , "Connected"}, - {2 , "OnHold"}, - {3 , "RingIn"}, - {4 , "OffHook"}, - {5 , "Connected with transfer"}, - {6 , "Digits after dialing first digit"}, - {7 , "Connected with conference"}, - {8 , "RingOut"}, - {9 , "OffHook with features"}, - {0 , NULL} +static const value_string SoftKeySet[] = { + { 0x00000, "On Hook" }, + { 0x00001, "Connected" }, + { 0x00002, "On Hold" }, + { 0x00003, "Ring In" }, + { 0x00004, "Off Hook" }, + { 0x00005, "Connected Transfeable" }, + { 0x00006, "Digits Following" }, + { 0x00007, "Connected Conference" }, + { 0x00008, "Ring Out" }, + { 0x00009, "OffHook with Features" }, + { 0x0000a, "In Use Hint" }, + { 0x0000b, "On Hook with Stealable Call" }, + { 0x00000, NULL } }; -static value_string_ext keySetNames_ext = VALUE_STRING_EXT_INIT(keySetNames); +static value_string_ext SoftKeySet_ext = VALUE_STRING_EXT_INIT(SoftKeySet); -#if 0 -/* Define soft key labels for the Telecaster station */ -static const value_string softKeyLabel[] _U_ = { - {0 , "undefined"}, - {1 , "Redial"}, - {2 , "NewCall"}, - {3 , "Hold"}, - {4 , "Trnsfer"}, - {5 , "CFwdAll"}, - {6 , "CFwdBusy"}, - {7 , "CFwdNoAnswer"}, - {8 , "<<"}, - {9 , "EndCall"}, - {10 , "Resume"}, - {11 , "Answer"}, - {12 , "Info"}, - {13 , "Confrn"}, - {14 , "Park"}, - {15 , "Join"}, - {16 , "MeetMe"}, - {17 , "PickUp"}, - {18 , "GPickUp"}, - {0 , NULL} +static const value_string SoftKeyEvent[] = { + { 0x00001, "Redial" }, + { 0x00002, "NewCall" }, + { 0x00003, "Hold" }, + { 0x00004, "Transfer" }, + { 0x00005, "CfwdAll" }, + { 0x00006, "CfwdBusy" }, + { 0x00007, "CfwdNoAnswer" }, + { 0x00008, "BackSpace" }, + { 0x00009, "EndCall" }, + { 0x0000a, "Resume" }, + { 0x0000b, "Answer" }, + { 0x0000c, "Info" }, + { 0x0000d, "Confrn" }, + { 0x0000e, "Park" }, + { 0x0000f, "Join" }, + { 0x00010, "MeetMe" }, + { 0x00011, "PickUp" }, + { 0x00012, "GrpPickup" }, + { 0x00013, "Your current options" }, + { 0x00014, "Off Hook" }, + { 0x00015, "On Hook" }, + { 0x00016, "Ring out" }, + { 0x00017, "From " }, + { 0x00018, "Connected" }, + { 0x00019, "Busy" }, + { 0x0001a, "Line In Use" }, + { 0x0001b, "Call Waiting" }, + { 0x0001c, "Call Transfer" }, + { 0x0001d, "Call Park" }, + { 0x0001e, "Call Proceed" }, + { 0x0001f, "In Use Remote" }, + { 0x00020, "Enter number" }, + { 0x00021, "Call park At" }, + { 0x00022, "Primary Only" }, + { 0x00023, "Temp Fail" }, + { 0x00024, "You Have a VoiceMail" }, + { 0x00025, "Forwarded to" }, + { 0x00026, "Can Not Complete Conference" }, + { 0x00027, "No Conference Bridge" }, + { 0x00028, "Can Not Hold Primary Control" }, + { 0x00029, "Invalid Conference Participant" }, + { 0x0002a, "In Conference Already" }, + { 0x0002b, "No Participant Info" }, + { 0x0002c, "Exceed Maximum Parties" }, + { 0x0002d, "Key Is Not Active" }, + { 0x0002e, "Error No License" }, + { 0x0002f, "Error DBConfig" }, + { 0x00030, "Error Database" }, + { 0x00031, "Error Pass Limit" }, + { 0x00032, "Error Unknown" }, + { 0x00033, "Error Mismatch" }, + { 0x00034, "Conference" }, + { 0x00035, "Park Number" }, + { 0x00036, "Private" }, + { 0x00037, "Not Enough Bandwidth" }, + { 0x00038, "Unknown Number" }, + { 0x00039, "RmLstC" }, + { 0x0003a, "Voicemail" }, + { 0x0003b, "ImmDiv" }, + { 0x0003c, "Intrcpt" }, + { 0x0003d, "SetWtch" }, + { 0x0003e, "TrnsfVM" }, + { 0x0003f, "DND" }, + { 0x00040, "DivAll" }, + { 0x00041, "CallBack" }, + { 0x00042, "Network congestion,rerouting" }, + { 0x00043, "Barge" }, + { 0x00044, "Failed to setup Barge" }, + { 0x00045, "Another Barge exists" }, + { 0x00046, "Incompatible device type" }, + { 0x00047, "No Park Number Available" }, + { 0x00048, "CallPark Reversion" }, + { 0x00049, "Service is not Active" }, + { 0x0004a, "High Traffic Try Again Later" }, + { 0x0004b, "QRT" }, + { 0x0004c, "MCID" }, + { 0x0004d, "DirTrfr" }, + { 0x0004e, "Select" }, + { 0x0004f, "ConfList" }, + { 0x00050, "iDivert" }, + { 0x00051, "cBarge" }, + { 0x00052, "Can Not Complete Transfer" }, + { 0x00053, "Can Not Join Calls" }, + { 0x00054, "Mcid Successful" }, + { 0x00055, "Number Not Configured" }, + { 0x00056, "Security Error" }, + { 0x00057, "Video Bandwidth Unavailable" }, + { 0x00058, "Video Mode" }, + { 0x000c9, "Dial" }, + { 0x000ca, "Record" }, + { 0x00000, NULL } }; -#endif +static value_string_ext SoftKeyEvent_ext = VALUE_STRING_EXT_INIT(SoftKeyEvent); -/* - * define lamp modes; - * lamp cadence is defined as follows - * Wink (on 80%) = 448msec on / 64msec off - * Flash (fast flash) = 32msec on / 32msec off - * Blink (on 50%) = 512msec on / 512msec off - * On (on steady) - */ -static const value_string stationLampModes[] = { - {0 , "Undefined"}, - {0x1 , "Off"}, - {0x2 , "On"}, - {0x3 , "Wink"}, - {0x4 , "Flash"}, - {0x5 , "Blink"}, - {0 , NULL} +static const value_string UnRegReasonCode[] = { + { 0x00000, "Unknown" }, + { 0x00001, "PowerSaveMode" }, + { 0x00000, NULL } }; -static value_string_ext stationLampModes_ext = VALUE_STRING_EXT_INIT(stationLampModes); +static value_string_ext UnRegReasonCode_ext = VALUE_STRING_EXT_INIT(UnRegReasonCode); -/* Defined the Call States to be sent to the Telecaste station. - * These are NOT the call states used in CM internally. Instead, - * they are the call states sent from CM and understood by the Telecaster station - */ -static const value_string skinny_stationCallStates[] = { - {1 , "OffHook"}, - {2 , "OnHook"}, - {3 , "RingOut"}, - {4 , "RingIn"}, - {5 , "Connected"}, - {6 , "Busy"}, - {7 , "Congestion"}, - {8 , "Hold"}, - {9 , "CallWaiting"}, - {10 , "CallTransfer"}, - {11 , "CallPark"}, - {12 , "Proceed"}, - {13 , "CallRemoteMultiline"}, - {14 , "InvalidNumber"}, - {0 , NULL} +static const value_string HeadsetMode[] = { + { 0x00001, "On" }, + { 0x00002, "Off" }, + { 0x00000, NULL } }; -static value_string_ext skinny_stationCallStates_ext = VALUE_STRING_EXT_INIT(skinny_stationCallStates); +static value_string_ext HeadsetMode_ext = VALUE_STRING_EXT_INIT(HeadsetMode); -/* Defined Call Type */ -static const value_string skinny_callTypes[] = { - {1 , "InBoundCall"}, - {2 , "OutBoundCall"}, - {3 , "ForwardCall"}, - {0 , NULL} +static const value_string SequenceFlag[] = { + { 0x00000, "First" }, + { 0x00001, "More" }, + { 0x00002, "Last" }, + { 0x00000, NULL } }; +static value_string_ext SequenceFlag_ext = VALUE_STRING_EXT_INIT(SequenceFlag); -/* - * define station-playable tones; - * for tone definitions see SR-TSV-002275, "BOC Notes on the LEC Networks -- 1994" - */ -static const value_string skinny_deviceTones[] = { - {0x0 , "Silence"}, - {0x1 , "Dtmf1"}, - {0x2 , "Dtmf2"}, - {0x3 , "Dtmf3"}, - {0x4 , "Dtmf4"}, - {0x5 , "Dtmf5"}, - {0x6 , "Dtmf6"}, - {0x7 , "Dtmf7"}, - {0x8 , "Dtmf8"}, - {0x9 , "Dtmf9"}, - {0xa , "Dtmf0"}, - {0xe , "DtmfStar"}, - {0xf , "DtmfPound"}, - {0x10 , "DtmfA"}, - {0x11 , "DtmfB"}, - {0x12 , "DtmfC"}, - {0x13 , "DtmfD"}, - {0x21 , "InsideDialTone"}, - {0x22 , "OutsideDialTone"}, - {0x23 , "LineBusyTone"}, - {0x24 , "AlertingTone"}, - {0x25 , "ReorderTone"}, - {0x26 , "RecorderWarningTone"}, - {0x27 , "RecorderDetectedTone"}, - {0x28 , "RevertingTone"}, - {0x29 , "ReceiverOffHookTone"}, - {0x2a , "PartialDialTone"}, - {0x2b , "NoSuchNumberTone"}, - {0x2c , "BusyVerificationTone"}, - {0x2d , "CallWaitingTone"}, - {0x2e , "ConfirmationTone"}, - {0x2f , "CampOnIndicationTone"}, - {0x30 , "RecallDialTone"}, - {0x31 , "ZipZip"}, - {0x32 , "Zip"}, - {0x33 , "BeepBonk"}, - {0x34 , "MusicTone"}, - {0x35 , "HoldTone"}, - {0x36 , "TestTone"}, - {0x37 , "DtMoniterWarningTone"}, - {0x40 , "AddCallWaiting"}, - {0x41 , "PriorityCallWait"}, - {0x42 , "RecallDial"}, - {0x43 , "BargIn"}, - {0x44 , "DistinctAlert"}, - {0x45 , "PriorityAlert"}, - {0x46 , "ReminderRing"}, - {0x47 , "PrecedenceRingBack"}, - {0x48 , "PreemptionTone"}, - {0x50 , "MF1"}, - {0x51 , "MF2"}, - {0x52 , "MF3"}, - {0x53 , "MF4"}, - {0x54 , "MF5"}, - {0x55 , "MF6"}, - {0x56 , "MF7"}, - {0x57 , "MF8"}, - {0x58 , "MF9"}, - {0x59 , "MF0"}, - {0x5a , "MFKP1"}, - {0x5b , "MFST"}, - {0x5c , "MFKP2"}, - {0x5d , "MFSTP"}, - {0x5e , "MFST3P"}, - {0x5f , "MILLIWATT"}, - {0x60 , "MILLIWATTTEST"}, - {0x61 , "HIGHTONE"}, - {0x62 , "FLASHOVERRIDE"}, - {0x63 , "FLASH"}, - {0x64 , "PRIORITY"}, - {0x65 , "IMMEDIATE"}, - {0x66 , "PREAMPWARN"}, - {0x67 , "2105HZ"}, - {0x68 , "2600HZ"}, - {0x69 , "440HZ"}, - {0x6a , "300HZ"}, - {0x77 , "MLPP_PALA"}, - {0x78 , "MLPP_ICA"}, - {0x79 , "MLPP_VCA"}, - {0x7A , "MLPP_BPA"}, - {0x7B , "MLPP_BNEA"}, - {0x7C , "MLPP_UPA"}, - {0x7f , "NoTone"}, - {0 , NULL} +static const value_string Layout[] = { + { 0x00000, "NoLayout" }, + { 0x00001, "OneByOne" }, + { 0x00002, "OneByTwo" }, + { 0x00003, "TwoByTwo" }, + { 0x00004, "TwoByTwo3Alt1" }, + { 0x00005, "TwoByTwo3Alt2" }, + { 0x00006, "ThreeByThree" }, + { 0x00007, "ThreeByThree6Alt1" }, + { 0x00008, "ThreeByThree6Alt2" }, + { 0x00009, "ThreeByThree4Alt1" }, + { 0x0000a, "ThreeByThree4Alt2" }, + { 0x00000, NULL } }; -static value_string_ext skinny_deviceTones_ext = VALUE_STRING_EXT_INIT(skinny_deviceTones); +static value_string_ext Layout_ext = VALUE_STRING_EXT_INIT(Layout); -/* define ring types */ -static const value_string skinny_ringTypes[] = { - {0x1 , "RingOff"}, - {0x2 , "InsideRing"}, - {0x3 , "OutsideRing"}, - {0x4 , "FeatureRing"}, - {0x5 , "FlashOnly"}, - {0x6 , "PrecedenceRing"}, - {0 , NULL} +static const value_string TransmitOrReceive[] = { + { 0x00000, "None" }, + { 0x00001, "ReceiveOnly" }, + { 0x00002, "TransmitOnly" }, + { 0x00003, "Both" }, + { 0x00000, NULL } }; -static value_string_ext skinny_ringTypes_ext = VALUE_STRING_EXT_INIT(skinny_ringTypes); +static value_string_ext TransmitOrReceive_ext = VALUE_STRING_EXT_INIT(TransmitOrReceive); -static const value_string skinny_ringModes[] = { - {0x1 , "RingForever"}, - {0x2 , "RingOnce"}, - {0 , NULL} +static const value_string OpenReceiveChanStatus[] = { + { 0x00000, "Ok" }, + { 0x00001, "Error" }, + { 0x00000, NULL } }; +static value_string_ext OpenReceiveChanStatus_ext = VALUE_STRING_EXT_INIT(OpenReceiveChanStatus); -static const value_string skinny_speakerModes[] = { - {1 , "SpeakerOn"}, - {2 , "SpeakerOff"}, - {0 , NULL} +static const value_string CreateConfResult[] = { + { 0x00000, "OK" }, + { 0x00001, "ResourceNotAvailable" }, + { 0x00002, "ConferenceAlreadyExist" }, + { 0x00003, "SystemErr" }, + { 0x00000, NULL } }; +static value_string_ext CreateConfResult_ext = VALUE_STRING_EXT_INIT(CreateConfResult); -static const value_string skinny_silenceSuppressionModes[] = { - {0 , "Media_SilenceSuppression_Off"}, - {1 , "Media_SilenceSuppression_On"}, - {0 , NULL} +static const value_string DeleteConfResult[] = { + { 0x00000, "OK" }, + { 0x00001, "ConferenceNotExist" }, + { 0x00002, "SystemErr" }, + { 0x00000, NULL } }; +static value_string_ext DeleteConfResult_ext = VALUE_STRING_EXT_INIT(DeleteConfResult); -static const value_string skinny_g723BitRates[] = { - {0 , "None"}, - {1 , "Media_G723BRate_5_3"}, - {2 , "Media_G723BRate_6_4"}, - {0 , NULL} +static const value_string ModifyConfResult[] = { + { 0x00000, "OK" }, + { 0x00001, "ResourceNotAvailable" }, + { 0x00002, "ConferenceNotExist" }, + { 0x00003, "InvalidParameter" }, + { 0x00004, "MoreActiveCallsThanReserved" }, + { 0x00005, "InvalidResourceType" }, + { 0x00006, "SystemErr" }, + { 0x00000, NULL } }; +static value_string_ext ModifyConfResult_ext = VALUE_STRING_EXT_INIT(ModifyConfResult); -/* define device reset types */ -static const value_string skinny_deviceResetTypes[] = { - {1 , "DEVICE_RESET"}, - {2 , "DEVICE_RESTART"}, - {0 , NULL} +static const value_string AddParticipantResult[] = { + { 0x00000, "OK" }, + { 0x00001, "ResourceNotAvailable" }, + { 0x00002, "ConferenceNotExist" }, + { 0x00003, "DuplicateCallRef" }, + { 0x00004, "SystemErr" }, + { 0x00000, NULL } }; +static value_string_ext AddParticipantResult_ext = VALUE_STRING_EXT_INIT(AddParticipantResult); -static const value_string skinny_echoCancelTypes[] = { - {0 , "Media_EchoCancellation_Off"}, - {1 , "Media_EchoCancellation_On"}, - {0 , NULL} +static const value_string ResourceType[] = { + { 0x00000, "Conference" }, + { 0x00001, "IVR" }, + { 0x00000, NULL } }; +static value_string_ext ResourceType_ext = VALUE_STRING_EXT_INIT(ResourceType); -static const value_string skinny_deviceUnregisterStatusTypes[] = { - {0 , "Ok"}, - {1 , "Error"}, - {2 , "NAK"}, /* Unregister request is rejected for reaso n such as existence of a call */ - {0 , NULL} +static const value_string AuditParticipantResult[] = { + { 0x00000, "OK" }, + { 0x00001, "ConferenceNotExist" }, + { 0x00000, NULL } }; +static value_string_ext AuditParticipantResult_ext = VALUE_STRING_EXT_INIT(AuditParticipantResult); -static const value_string skinny_createConfResults[] = { - {0 , "Ok"}, - {1 , "ResourceNotAvailable"}, - {2 , "ConferenceAlreadyExist"}, - {3 , "SystemErr"}, - {0 , NULL} +static const value_string Media_Encryption_Capability[] = { + { 0x00000, "NotEncryptionCapable" }, + { 0x00001, "EncryptionCapable" }, + { 0x00000, NULL } }; +static value_string_ext Media_Encryption_Capability_ext = VALUE_STRING_EXT_INIT(Media_Encryption_Capability); -static const value_string skinny_modifyConfResults[] = { - {0 , "Ok"}, - {1 , "ResourceNotAvailable"}, - {2 , "ConferenceNotExist"}, - {3 , "InvalidParameter"}, - {4 , "MoreActiveCallsThanReserved"}, - {5 , "InvalidResourceType"}, - {6 , "SystemErr"}, - {0 , NULL} +static const value_string IpAddrMode[] = { + { 0x00000, "ModeIpv4" }, + { 0x00001, "ModeIpv6" }, + { 0x00002, "ModeIpv4AndIpv6" }, + { 0x00000, NULL } }; -static value_string_ext skinny_modifyConfResults_ext = VALUE_STRING_EXT_INIT(skinny_modifyConfResults); +static value_string_ext IpAddrMode_ext = VALUE_STRING_EXT_INIT(IpAddrMode); -static const value_string skinny_deleteConfResults[] = { - {0 , "Ok"}, - {1 , "ConferenceNotExist"}, - {2 , "SystemErr"}, - {0 , NULL} +static const value_string MediaType[] = { + { 0x00000, "MediaType_Invalid" }, + { 0x00001, "MediaType_Audio" }, + { 0x00002, "MediaType_Main_Video" }, + { 0x00003, "MediaType_FECC" }, + { 0x00004, "MediaType_Presentation_Video" }, + { 0x00005, "MediaType_DataApp_BFCP" }, + { 0x00006, "MediaType_DataApp_IXChannel" }, + { 0x00007, "MediaType_T38" }, + { 0x00008, "MediaType_Max" }, + { 0x00000, NULL } }; +static value_string_ext MediaType_ext = VALUE_STRING_EXT_INIT(MediaType); -static const value_string skinny_addParticipantResults[] = { - {0 , "Ok"}, - {1 , "ResourceNotAvailable"}, - {2 , "ConferenceNotExist"}, - {3 , "DuplicateCallRef"}, - {4 , "SystemErr"}, - {0 , NULL} +static const value_string RSVPDirection[] = { + { 0x00001, "SEND" }, + { 0x00002, "RECV" }, + { 0x00003, "SENDRECV" }, + { 0x00000, NULL } }; -static value_string_ext skinny_addParticipantResults_ext = VALUE_STRING_EXT_INIT(skinny_addParticipantResults); +static value_string_ext RSVPDirection_ext = VALUE_STRING_EXT_INIT(RSVPDirection); -static const value_string skinny_auditParticipantResults[] = { - {0 , "Ok"}, - {1 , "ConferenceNotExist"}, - {0 , NULL} +static const value_string QoSErrorCode[] = { + { 0x00000, "QOS_CAUSE_RESERVATION_TIMEOUT" }, + { 0x00001, "QOS_CAUSE_PATH_FAIL" }, + { 0x00002, "QOS_CAUSE_RESV_FAIL" }, + { 0x00003, "QOS_CAUSE_LISTEN_FAIL" }, + { 0x00004, "QOS_CAUSE_RESOURCE_UNAVAILABLE" }, + { 0x00005, "QOS_CAUSE_LISTEN_TIMEOUT" }, + { 0x00006, "QOS_CAUSE_RESV_RETRIES_FAIL" }, + { 0x00007, "QOS_CAUSE_PATH_RETRIES_FAIL" }, + { 0x00008, "QOS_CAUSE_RESV_PREEMPTION" }, + { 0x00009, "QOS_CAUSE_PATH_PREEMPTION" }, + { 0x0000a, "QOS_CAUSE_RESV_MODIFY_FAIL" }, + { 0x0000b, "QOS_CAUSE_PATH_MODIFY_FAIL" }, + { 0x0000c, "QOS_CAUSE_RESV_TEAR" }, + { 0x00000, NULL } }; +static value_string_ext QoSErrorCode_ext = VALUE_STRING_EXT_INIT(QoSErrorCode); -/* define hook flash detection mode */ -static const value_string skinny_hookFlashDetectModes[] = { - {1 , "HookFlashOn"}, - {2 , "HookFlashOff"}, - {0 , NULL} +static const value_string RSVPErrorCode[] = { + { 0x00000, "CONFIRM" }, + { 0x00001, "ADMISSION" }, + { 0x00002, "ADMINISTRATIVE" }, + { 0x00003, "NO_PATH_INFORMATION" }, + { 0x00004, "NO_SENDER_INFORMATION" }, + { 0x00005, "CONFLICTING_STYLE" }, + { 0x00006, "UNKNOWN_STYLE" }, + { 0x00007, "CONFLICTING_DST_PORTS" }, + { 0x00008, "CONFLICTING_SRC_PORTS" }, + { 0x0000c, "SERVICE_PREEMPTED" }, + { 0x0000d, "UNKNOWN_OBJECT_CLASS" }, + { 0x0000e, "UNKNOWN_CLASS_TYPE" }, + { 0x00014, "API" }, + { 0x00015, "TRAFFIC" }, + { 0x00016, "TRAFFIC_SYSTEM" }, + { 0x00017, "SYSTEM" }, + { 0x00018, "ROUTING_PROBLEM" }, + { 0x00000, NULL } }; +static value_string_ext RSVPErrorCode_ext = VALUE_STRING_EXT_INIT(RSVPErrorCode); -/* define headset mode */ -static const value_string skinny_headsetModes[] = { - {1 , "HeadsetOn"}, - {2 , "HeadsetOff"}, - {0 , NULL} +static const value_string SubscriptionFeatureID[] = { + { 0x00001, "BLF" }, + { 0x00000, NULL } }; +static value_string_ext SubscriptionFeatureID_ext = VALUE_STRING_EXT_INIT(SubscriptionFeatureID); -/* define station microphone modes; - * Mic On - The speakerphone's microphone is turned on ONLY if the phone is in the "Speaker On (Off Hook)" - * state (see above). - * Mic Off - The microphone is turned off or, if it's not on, the command is ignored. - */ -static const value_string skinny_microphoneModes[] = { - {1 , "MicOn"}, - {2 , "MicOff"}, - {0 , NULL} +static const value_string MediaPathID[] = { + { 0x00001, "Headset" }, + { 0x00002, "Handset" }, + { 0x00003, "Speaker" }, + { 0x00000, NULL } }; +static value_string_ext MediaPathID_ext = VALUE_STRING_EXT_INIT(MediaPathID); -/* define the session request types */ -static const value_string skinny_sessionTypes[] = { - {1 , "Chat"}, - {2 , "Whiteboard"}, - {4 , "ApplicationSharing"}, - {8 , "FileTransfer"}, - {10 , "Video"}, - {0 , NULL} +static const value_string MediaPathEvent[] = { + { 0x00001, "On" }, + { 0x00002, "Off" }, + { 0x00000, NULL } }; -static value_string_ext skinny_sessionTypes_ext = VALUE_STRING_EXT_INIT(skinny_sessionTypes); +static value_string_ext MediaPathEvent_ext = VALUE_STRING_EXT_INIT(MediaPathEvent); -static const value_string skinny_mediaEnunciationTypes[] = { - {1 , "None"}, - {2 , "CallPark"}, - {0 , NULL} +static const value_string MediaPathCapabilities[] = { + { 0x00001, "Enable" }, + { 0x00002, "Disable" }, + { 0x00003, "Monitor" }, + { 0x00000, NULL } }; +static value_string_ext MediaPathCapabilities_ext = VALUE_STRING_EXT_INIT(MediaPathCapabilities); -static const value_string skinny_resourceTypes[] = { - {1 , "Conference"}, - {2 , "IVR"}, - {0 , NULL} +static const value_string DeviceTone[] = { + { 0x00000, "Silence" }, + { 0x00001, "Dtmf1" }, + { 0x00002, "Dtmf2" }, + { 0x00003, "Dtmf3" }, + { 0x00004, "Dtmf4" }, + { 0x00005, "Dtmf5" }, + { 0x00006, "Dtmf6" }, + { 0x00007, "Dtmf7" }, + { 0x00008, "Dtmf8" }, + { 0x00009, "Dtmf9" }, + { 0x0000a, "Dtmf0" }, + { 0x0000e, "DtmfStar" }, + { 0x0000f, "DtmfPound" }, + { 0x00010, "DtmfA" }, + { 0x00011, "DtmfB" }, + { 0x00012, "DtmfC" }, + { 0x00013, "DtmfD" }, + { 0x00021, "InsideDialTone" }, + { 0x00022, "OutsideDialTone" }, + { 0x00023, "LineBusyTone" }, + { 0x00024, "AlertingTone" }, + { 0x00025, "ReorderTone" }, + { 0x00026, "RecorderWarningTone" }, + { 0x00027, "RecorderDetectedTone" }, + { 0x00028, "RevertingTone" }, + { 0x00029, "ReceiverOffHookTone" }, + { 0x0002a, "MessageWaitingIndicatorTone" }, + { 0x0002b, "NoSuchNumberTone" }, + { 0x0002c, "BusyVerificationTone" }, + { 0x0002d, "CallWaitingTone" }, + { 0x0002e, "ConfirmationTone" }, + { 0x0002f, "CampOnIndicationTone" }, + { 0x00030, "RecallDialTone" }, + { 0x00031, "ZipZip" }, + { 0x00032, "Zip" }, + { 0x00033, "BeepBonk" }, + { 0x00034, "MusicTone" }, + { 0x00035, "HoldTone" }, + { 0x00036, "TestTone" }, + { 0x00038, "MonitorWarningTone" }, + { 0x00039, "SecureWarningTone" }, + { 0x00040, "AddCallWaiting" }, + { 0x00041, "PriorityCallWait" }, + { 0x00042, "RecallDial" }, + { 0x00043, "BargIn" }, + { 0x00044, "DistinctAlert" }, + { 0x00045, "PriorityAlert" }, + { 0x00046, "ReminderRing" }, + { 0x00047, "PrecedenceRingBack" }, + { 0x00048, "PreemptionTone" }, + { 0x00049, "NonSecureWarningTone" }, + { 0x00050, "MF1" }, + { 0x00051, "MF2" }, + { 0x00052, "MF3" }, + { 0x00053, "MF4" }, + { 0x00054, "MF5" }, + { 0x00055, "MF6" }, + { 0x00056, "MF7" }, + { 0x00057, "MF8" }, + { 0x00058, "MF9" }, + { 0x00059, "MF0" }, + { 0x0005a, "MFKP1" }, + { 0x0005b, "MFST" }, + { 0x0005c, "MFKP2" }, + { 0x0005d, "MFSTP" }, + { 0x0005e, "MFST3P" }, + { 0x0005f, "MILLIWATT" }, + { 0x00060, "MILLIWATTTEST" }, + { 0x00061, "HIGHTONE" }, + { 0x00062, "FLASHOVERRIDE" }, + { 0x00063, "FLASH" }, + { 0x00064, "PRIORITY" }, + { 0x00065, "IMMEDIATE" }, + { 0x00066, "PREAMPWARN" }, + { 0x00067, "2105HZ" }, + { 0x00068, "2600HZ" }, + { 0x00069, "440HZ" }, + { 0x0006a, "300HZ" }, + { 0x0006b, "Mobility_WP" }, + { 0x0006c, "Mobility_UAC" }, + { 0x0006d, "Mobility_WTDN" }, + { 0x0006e, "Mobility_MON" }, + { 0x0006f, "Mobility_MOFF" }, + { 0x00070, "Mobility_UKC" }, + { 0x00071, "Mobility_VMA" }, + { 0x00072, "Mobility_FAC" }, + { 0x00073, "Mobility_CMC" }, + { 0x00077, "MLPP_PALA" }, + { 0x00078, "MLPP_ICA" }, + { 0x00079, "MLPP_VCA" }, + { 0x0007a, "MLPP_BPA" }, + { 0x0007b, "MLPP_BNEA" }, + { 0x0007c, "MLPP_UPA" }, + { 0x0007d, "TUA" }, + { 0x0007e, "GONE" }, + { 0x0007f, "NoTone" }, + { 0x00080, "MAX" }, + { 0x00000, NULL } }; +static value_string_ext DeviceTone_ext = VALUE_STRING_EXT_INIT(DeviceTone); -static const value_string skinny_sequenceFlags[] = { - {0 , "StationSequenceFirst"}, - {1 , "StationSequenceMore"}, - {2 , "StationSequenceLast"}, - {0 , NULL} +static const value_string ToneOutputDirection[] = { + { 0x00000, "User" }, + { 0x00001, "Network" }, + { 0x00002, "All" }, + { 0x00000, NULL } }; +static value_string_ext ToneOutputDirection_ext = VALUE_STRING_EXT_INIT(ToneOutputDirection); -static const value_string skinny_Layouts[] = { - {0 , "NoLayout"}, - {1 , "OneByOne"}, - {2 , "OneByTwo"}, - {3 , "TwoByTwo"}, - {4 , "TwoByTwo3Alt1"}, - {5 , "TwoByTwo3Alt2"}, - {6 , "ThreeByThree"}, - {7 , "ThreeByThree6Alt1"}, - {8 , "ThreeByThree6Alt2"}, - {9 , "ThreeByThree4Alt1"}, - {10 , "ThreeByThree4Alt2"}, - {0 , NULL} +static const value_string RingMode[] = { + { 0x00001, "RingOff" }, + { 0x00002, "InsideRing" }, + { 0x00003, "OutsideRing" }, + { 0x00004, "FeatureRing" }, + { 0x00005, "FlashOnly" }, + { 0x00006, "PrecedenceRing" }, + { 0x00000, NULL } }; -static value_string_ext skinny_Layouts_ext = VALUE_STRING_EXT_INIT(skinny_Layouts); +static value_string_ext RingMode_ext = VALUE_STRING_EXT_INIT(RingMode); -static const value_string skinny_transmitOrReceive[] = { - {1 , "Station_Receive_only"}, - {2 , "Station_Transmit_only"}, - {3 , "Station_Receive_Transmit"}, - {0 , NULL} +static const value_string RingDuration[] = { + { 0x00001, "NormalRing" }, + { 0x00002, "SingleRing" }, + { 0x00000, NULL } }; +static value_string_ext RingDuration_ext = VALUE_STRING_EXT_INIT(RingDuration); -static const value_string skinny_endOfAnnAck[] = { - {0 , "NoAnnAckRequired"}, - {1 , "AnnAckRequired"}, - {0 , NULL} +static const value_string LampMode[] = { + { 0x00001, "Off" }, + { 0x00002, "On" }, + { 0x00003, "Wink" }, + { 0x00004, "Flash" }, + { 0x00005, "Blink" }, + { 0x00000, NULL } }; +static value_string_ext LampMode_ext = VALUE_STRING_EXT_INIT(LampMode); -static const value_string skinny_annPlayMode[] = { - {0 , "AnnXmlConfigMode"}, - {1 , "AnnOneShotMode"}, - {2 , "AnnContinuousMode"}, - {0 , NULL} +static const value_string SpeakerMode[] = { + { 0x00001, "On" }, + { 0x00002, "Off" }, + { 0x00000, NULL } }; +static value_string_ext SpeakerMode_ext = VALUE_STRING_EXT_INIT(SpeakerMode); -static const value_string skinny_annPlayStatus[] = { - {0 , "PlayToneOK"}, - {1 , "PlayToneErr"}, - {0 , NULL} +static const value_string MicrophoneMode[] = { + { 0x00001, "On" }, + { 0x00002, "Off" }, + { 0x00000, NULL } }; +static value_string_ext MicrophoneMode_ext = VALUE_STRING_EXT_INIT(MicrophoneMode); -static const value_string skinny_miscCommandType[] = { - {0 , "videoFreezePicture"}, - {1 , "videoFastUpdatePicture"}, - {2 , "videoFastUpdateGOB"}, - {3 , "videoFastUpdateMB"}, - {4 , "lostPicture"}, - {5 , "lostPartialPicture"}, - {6 , "recoveryReferencePicture"}, - {7 , "temporalSpatialTradeOff"}, - {0 , NULL} +static const value_string Media_SilenceSuppression[] = { + { 0x00000, "Media_SilenceSuppression_Off" }, + { 0x00001, "Media_SilenceSuppression_On" }, + { 0x00000, NULL } }; -static value_string_ext skinny_miscCommandType_ext = VALUE_STRING_EXT_INIT(skinny_miscCommandType); +static value_string_ext Media_SilenceSuppression_ext = VALUE_STRING_EXT_INIT(Media_SilenceSuppression); -static const value_string skinny_formatTypes[] = { - {1 , "sqcif (128x96)"}, - {2 , "qcif (176x144)"}, - {3 , "cif (352x288)"}, - {4 , "4cif (704x576)"}, - {5 , "16cif (1408x1152)"}, - {6 , "custom_base"}, - {0 , NULL} +static const value_string MediaEncryptionAlgorithmType[] = { + { 0x00000, "NO_ENCRYPTION" }, + { 0x00001, "CCM_AES_CM_128_HMAC_SHA1_32" }, + { 0x00002, "CCM_AES_CM_128_HMAC_SHA1_80" }, + { 0x00003, "CCM_F8_128_HMAC_SHA1_32" }, + { 0x00004, "CCM_F8_128_HMAC_SHA1_80" }, + { 0x00000, NULL } }; -static value_string_ext skinny_formatTypes_ext = VALUE_STRING_EXT_INIT(skinny_formatTypes); +static value_string_ext MediaEncryptionAlgorithmType_ext = VALUE_STRING_EXT_INIT(MediaEncryptionAlgorithmType); -static const value_string skinny_callSecurityStatusTypes[] = { - {0 , "CallSecurityStatusUnknown"}, - {1 , "CallSecurityStatusNotAuthenticated"}, - {2 , "CallSecurityStatusAuthenticated"}, - {0 , NULL} +static const value_string PortHandling[] = { + { 0x00000, "CLOSE_PORT" }, + { 0x00001, "KEEP_PORT" }, + { 0x00000, NULL } }; +static value_string_ext PortHandling_ext = VALUE_STRING_EXT_INIT(PortHandling); -static const value_string skinny_accessories[] = { - {1 , "Headset"}, - {2 , "Handset"}, - {3 , "Speaker"}, - {0 , NULL} +static const value_string CallType[] = { + { 0x00001, "InBoundCall" }, + { 0x00002, "OutBoundCall" }, + { 0x00003, "ForwardCall" }, + { 0x00000, NULL } }; -static value_string_ext skinny_accessories_ext = VALUE_STRING_EXT_INIT(skinny_accessories); +static value_string_ext CallType_ext = VALUE_STRING_EXT_INIT(CallType); -static const value_string skinny_accessoryStates[] = { - {0 , "None"}, - {1 , "Offhook"}, - {2 , "Onhook"}, - {0 , NULL} +static const value_string CallSecurityStatusType[] = { + { 0x00000, "Unknown" }, + { 0x00001, "NotAuthenticated" }, + { 0x00002, "Authenticated" }, + { 0x00003, "Encrypted" }, + { 0x00004, "Max" }, + { 0x00000, NULL } }; -static value_string_ext skinny_accessoryStates_ext = VALUE_STRING_EXT_INIT(skinny_accessoryStates); +static value_string_ext CallSecurityStatusType_ext = VALUE_STRING_EXT_INIT(CallSecurityStatusType); -#define StationMaxDirnumSize 24 /* max size of calling or called party dirnum */ -#define StationMaxNameSize 40 /* max size of calling party's name */ -#define StationMaxDisplayNameSize 44 /* max size of display name */ -#define StationMaxDeviceNameSize 16 /* max size of station's IP name */ -#define StationMaxSpeedDials 10 /* max number of speed dial numbers allowed on a station */ -#define StationMaxVersionSize 16 /* max chars in version string */ -#define StationMaxButtonTemplateSize 42 /* max button template size */ -#define StationMaxDisplayTextSize 33 /* max text size in DisplayText message */ -#define StationMaxPorts 10 /* max number of ports on one device */ -#define StationDateTemplateSize 6 /* date template in the form M/D/Y, D/M/Y, ... */ -#define StationMaxServerNameSize 48 /* max size of server name */ -#define StationMaxServers 5 /* max servers */ -#define StationMaxDeviceDirnums 1024 /* max dir numbers per SCM device */ -#define StationMaxDirnums 64 /* max dir numbers per physical station (also used in db request msg); */ -#define StationMaxSoftKeyLabelSize 16 /* max label size in the message */ -#define StationMaxSoftKeyDefinition 32 /* max number of soft key definition in the message */ -#define StationMaxSoftKeySetDefinition 16 /* max number of soft key set definition in the message */ -#define StationMaxSoftKeyIndex 16 /* max number of soft key indices in a station soft key set */ -#define StationMaxDisplayPromptStatusSize 32 /* max status text size in the display status message */ -#define StationMaxDisplayNotifySize 32 /* max prompt text size in the display prompt message */ -#define StationMaxAlarmMessageSize 80 /* max size for an alarm message */ -#define StationMaxUserDeviceDataSize 2000 /* max size of user data between application and device */ -#define StationMaxConference 32 -#define AppConferenceIDSize 32 -#define AppDataSize 24 -#define MAX_CUSTOM_PICTURES 6 -#define MAX_LAYOUT_WITH_SAME_SERVICE 5 -#define MAX_SERVICE_TYPE 4 -#define DeviceMaxCapabilities 18 /* max capabilities allowed in Cap response message */ -#define StationMaxCapabilities DeviceMaxCapabilities -#define StationMaxVideoCapabilities 10 -#define StationMaxDataCapabilities 5 -#define MAX_LEVEL_PREFERENCE 4 -#define MaxAnnouncementList 32 -#define StationMaxMonitorParties 16 /* Max Monitor Bridge whisper matrix parties, rm, M&R in Parche */ -#define StationMaxServiceURLSize 256 /* max number of service URLs length */ -#define MAX_PICTURE_FORMAT 5 -#define MAX_REFERENCE_PICTURE 4 +static const value_string SessionType[] = { + { 0x00001, "Chat" }, + { 0x00002, "Whiteboard" }, + { 0x00004, "ApplicationSharing" }, + { 0x00008, "FileTransfer" }, + { 0x00010, "Video" }, + { 0x00000, NULL } +}; +static value_string_ext SessionType_ext = VALUE_STRING_EXT_INIT(SessionType); -/* Initialize the protocol and registered fields */ -static int proto_skinny = -1; -static int hf_skinny_data_length = -1; -static int hf_skinny_hdr_version = -1; -static int hf_skinny_messageid = -1; -static int hf_skinny_deviceName = -1; -static int hf_skinny_stationUserId = -1; -static int hf_skinny_stationInstance = -1; -static int hf_skinny_deviceType = -1; -static int hf_skinny_maxStreams = -1; -static int hf_skinny_stationIpPort = -1; -static int hf_skinny_stationKeypadButton = -1; -static int hf_skinny_calledPartyNumber = -1; -static int hf_skinny_stimulus = -1; -static int hf_skinny_stimulusInstance = -1; -static int hf_skinny_lineNumber = -1; -static int hf_skinny_speedDialNumber = -1; -static int hf_skinny_speedDialType = -1; -static int hf_skinny_speedDialStatus = -1; -static int hf_skinny_capCount = -1; -static int hf_skinny_payloadCapability = -1; -static int hf_skinny_maxFramesPerPacket = -1; +static const value_string ButtonType[] = { + { 0x00000, "Unused" }, + { 0x00001, "Last Number Redial" }, + { 0x00002, "SpeedDial" }, + { 0x00003, "Hold" }, + { 0x00004, "Transfer" }, + { 0x00005, "Forward All" }, + { 0x00006, "Forward Busy" }, + { 0x00007, "Forward No Answer" }, + { 0x00008, "Display" }, + { 0x00009, "Line" }, + { 0x0000a, "T120 Chat" }, + { 0x0000b, "T120 Whiteboard" }, + { 0x0000c, "T120 Application Sharing" }, + { 0x0000d, "T120 File Transfer" }, + { 0x0000e, "Video" }, + { 0x0000f, "Voicemail" }, + { 0x00010, "Answer Release" }, + { 0x00011, "Auto Answer" }, + { 0x00012, "Select" }, + { 0x00013, "Feature" }, + { 0x00014, "ServiceURL" }, + { 0x00015, "BusyLampField Speeddial" }, + { 0x0001b, "Malicious Call" }, + { 0x00021, "Generic App B1" }, + { 0x00022, "Generic App B2" }, + { 0x00023, "Generic App B3" }, + { 0x00024, "Generic App B4" }, + { 0x00025, "Generic App B5" }, + { 0x00026, "Monitor/Multiblink" }, + { 0x0007b, "Meet Me Conference" }, + { 0x0007d, "Conference" }, + { 0x0007e, "Call Park" }, + { 0x0007f, "Call Pickup" }, + { 0x00080, "Group Call Pickup" }, + { 0x00081, "Mobility" }, + { 0x00082, "DoNotDisturb" }, + { 0x00083, "ConfList" }, + { 0x00084, "RemoveLastParticipant" }, + { 0x00085, "QRT" }, + { 0x00086, "CallBack" }, + { 0x00087, "OtherPickup" }, + { 0x00088, "VideoMode" }, + { 0x00089, "NewCall" }, + { 0x0008a, "EndCall" }, + { 0x0008b, "HLog" }, + { 0x0008f, "Queuing" }, + { 0x000c0, "Test E" }, + { 0x000c1, "Test F" }, + { 0x000c2, "Messages" }, + { 0x000c3, "Directory" }, + { 0x000c4, "Test I" }, + { 0x000c5, "Application" }, + { 0x000c6, "Headset" }, + { 0x000f0, "Keypad" }, + { 0x000fd, "Aec" }, + { 0x000ff, "Undefined" }, + { 0x00000, NULL } +}; +static value_string_ext ButtonType_ext = VALUE_STRING_EXT_INIT(ButtonType); + +static const value_string DeviceResetType[] = { + { 0x00001, "RESET" }, + { 0x00002, "RESTART" }, + { 0x00003, "APPLY_CONFIG" }, + { 0x00000, NULL } +}; +static value_string_ext DeviceResetType_ext = VALUE_STRING_EXT_INIT(DeviceResetType); + +static const value_string Media_EchoCancellation[] = { + { 0x00000, "Media_EchoCancellation_Off" }, + { 0x00001, "Media_EchoCancellation_On" }, + { 0x00000, NULL } +}; +static value_string_ext Media_EchoCancellation_ext = VALUE_STRING_EXT_INIT(Media_EchoCancellation); + +static const value_string SoftKeyTemplateIndex[] = { + { 0x00001, "Redial" }, + { 0x00002, "NewCall" }, + { 0x00003, "Hold" }, + { 0x00004, "Transfer" }, + { 0x00005, "CfwdAll" }, + { 0x00006, "CfwdBusy" }, + { 0x00007, "CfwdNoAnswer" }, + { 0x00008, "BackSpace" }, + { 0x00009, "EndCall" }, + { 0x0000a, "Resume" }, + { 0x0000b, "Answer" }, + { 0x0000c, "Info" }, + { 0x0000d, "Confrn" }, + { 0x0000e, "Park" }, + { 0x0000f, "Join" }, + { 0x00010, "MeetMe" }, + { 0x00011, "PickUp" }, + { 0x00012, "GrpPickup" }, + { 0x00013, "Monitor" }, + { 0x00014, "CallBack" }, + { 0x00015, "Barge" }, + { 0x00016, "DND" }, + { 0x00017, "ConfList" }, + { 0x00018, "Select" }, + { 0x00019, "Private" }, + { 0x0001a, "Transfer Voicemail" }, + { 0x0001b, "Direct Transfer" }, + { 0x0001c, "Immediate Divert" }, + { 0x0001d, "Video Mode" }, + { 0x0001e, "Intercept" }, + { 0x0001f, "Empty" }, + { 0x00020, "Dial" }, + { 0x00021, "Conference Barge" }, + { 0x00000, NULL } +}; +static value_string_ext SoftKeyTemplateIndex_ext = VALUE_STRING_EXT_INIT(SoftKeyTemplateIndex); + +static const value_string SoftKeyInfoIndex[] = { + { 0x0012d, "Redial" }, + { 0x0012e, "NewCall" }, + { 0x0012f, "Hold" }, + { 0x00130, "Transfer" }, + { 0x00131, "CfwdAll" }, + { 0x00132, "CfwdBusy" }, + { 0x00133, "CfwdNoAnswer" }, + { 0x00134, "BackSpace" }, + { 0x00135, "EndCall" }, + { 0x00136, "Resume" }, + { 0x00137, "Answer" }, + { 0x00138, "Info" }, + { 0x00139, "Confrn" }, + { 0x0013a, "Park" }, + { 0x0013b, "Join" }, + { 0x0013c, "MeetMe" }, + { 0x0013d, "PickUp" }, + { 0x0013e, "GrpPickup" }, + { 0x0013f, "Monitor" }, + { 0x00140, "CallBack" }, + { 0x00141, "Barge" }, + { 0x00142, "DND" }, + { 0x00143, "ConfList" }, + { 0x00144, "Select" }, + { 0x00145, "Private" }, + { 0x00146, "Transfer Voicemail" }, + { 0x00147, "Direct Transfer" }, + { 0x00148, "Immediate Divert" }, + { 0x00149, "Video Mode" }, + { 0x0014a, "Intercept" }, + { 0x0014b, "Empty" }, + { 0x0014c, "Dial" }, + { 0x0014d, "Conference Barge" }, + { 0x00000, NULL } +}; +static value_string_ext SoftKeyInfoIndex_ext = VALUE_STRING_EXT_INIT(SoftKeyInfoIndex); + +static const value_string DCallState[] = { + { 0x00000, "Idle" }, + { 0x00001, "OffHook" }, + { 0x00002, "OnHook" }, + { 0x00003, "RingOut" }, + { 0x00004, "RingIn" }, + { 0x00005, "Connected" }, + { 0x00006, "Busy" }, + { 0x00007, "Congestion" }, + { 0x00008, "Hold" }, + { 0x00009, "CallWaiting" }, + { 0x0000a, "CallTransfer" }, + { 0x0000b, "CallPark" }, + { 0x0000c, "Proceed" }, + { 0x0000d, "CallRemoteMultiline" }, + { 0x0000e, "InvalidNumber" }, + { 0x0000f, "HoldRevert" }, + { 0x00010, "Whisper" }, + { 0x00011, "RemoteHold" }, + { 0x00012, "MaxState" }, + { 0x00000, NULL } +}; +static value_string_ext DCallState_ext = VALUE_STRING_EXT_INIT(DCallState); + +static const value_string CallPrivacy[] = { + { 0x00000, "None" }, + { 0x00001, "Limited" }, + { 0x00002, "Full" }, + { 0x00000, NULL } +}; +static value_string_ext CallPrivacy_ext = VALUE_STRING_EXT_INIT(CallPrivacy); + +static const value_string DeviceUnregisterStatus[] = { + { 0x00000, "Ok" }, + { 0x00001, "Error" }, + { 0x00002, "NAK" }, + { 0x00000, NULL } +}; +static value_string_ext DeviceUnregisterStatus_ext = VALUE_STRING_EXT_INIT(DeviceUnregisterStatus); + +static const value_string EndOfAnnAck[] = { + { 0x00000, "NoAnnAckRequired" }, + { 0x00001, "AnnAckRequired" }, + { 0x00000, NULL } +}; +static value_string_ext EndOfAnnAck_ext = VALUE_STRING_EXT_INIT(EndOfAnnAck); + +static const value_string AnnPlayMode[] = { + { 0x00000, "XmlConfigMode" }, + { 0x00001, "OneShotMode" }, + { 0x00002, "ContinuousMode" }, + { 0x00000, NULL } +}; +static value_string_ext AnnPlayMode_ext = VALUE_STRING_EXT_INIT(AnnPlayMode); + +static const value_string PlayAnnStatus[] = { + { 0x00000, "OK" }, + { 0x00001, "Err" }, + { 0x00000, NULL } +}; +static value_string_ext PlayAnnStatus_ext = VALUE_STRING_EXT_INIT(PlayAnnStatus); + +#define MISCCOMMANDTYPE_VIDEOFREEZEPICTURE 0x00000 +#define MISCCOMMANDTYPE_VIDEOFASTUPDATEPICTURE 0x00001 +#define MISCCOMMANDTYPE_VIDEOFASTUPDATEGOB 0x00002 +#define MISCCOMMANDTYPE_VIDEOFASTUPDATEMB 0x00003 +#define MISCCOMMANDTYPE_LOSTPICTURE 0x00004 +#define MISCCOMMANDTYPE_LOSTPARTIALPICTURE 0x00005 +#define MISCCOMMANDTYPE_RECOVERYREFERENCEPICTURE 0x00006 +#define MISCCOMMANDTYPE_TEMPORALSPATIALTRADEOFF 0x00007 + +static const value_string MiscCommandType[] = { + { MISCCOMMANDTYPE_VIDEOFREEZEPICTURE, "videoFreezePicture" }, + { MISCCOMMANDTYPE_VIDEOFASTUPDATEPICTURE, "videoFastUpdatePicture" }, + { MISCCOMMANDTYPE_VIDEOFASTUPDATEGOB, "videoFastUpdateGOB" }, + { MISCCOMMANDTYPE_VIDEOFASTUPDATEMB, "videoFastUpdateMB" }, + { MISCCOMMANDTYPE_LOSTPICTURE, "lostPicture" }, + { MISCCOMMANDTYPE_LOSTPARTIALPICTURE, "lostPartialPicture" }, + { MISCCOMMANDTYPE_RECOVERYREFERENCEPICTURE, "recoveryReferencePicture" }, + { MISCCOMMANDTYPE_TEMPORALSPATIALTRADEOFF, "temporalSpatialTradeOff" }, + { 0x00000, NULL } +}; +static value_string_ext MiscCommandType_ext = VALUE_STRING_EXT_INIT(MiscCommandType); + +static const value_string MediaTransportType[] = { + { 0x00001, "RTP" }, + { 0x00002, "UDP" }, + { 0x00003, "TCP" }, + { 0x00000, NULL } +}; +static value_string_ext MediaTransportType_ext = VALUE_STRING_EXT_INIT(MediaTransportType); + +static const value_string ResvStyle[] = { + { 0x00001, "FF" }, + { 0x00002, "SE" }, + { 0x00003, "WF" }, + { 0x00000, NULL } +}; +static value_string_ext ResvStyle_ext = VALUE_STRING_EXT_INIT(ResvStyle); + +static const value_string SubscribeCause[] = { + { 0x00000, "OK" }, + { 0x00001, "RouteFail" }, + { 0x00002, "AuthFail" }, + { 0x00003, "Timeout" }, + { 0x00004, "TrunkTerm" }, + { 0x00005, "TrunkForbidden" }, + { 0x00006, "Throttle" }, + { 0x00000, NULL } +}; +static value_string_ext SubscribeCause_ext = VALUE_STRING_EXT_INIT(SubscribeCause); + +static const value_string CallHistoryDisposition[] = { + { 0x00000, "Ignore" }, + { 0x00001, "PlacedCalls" }, + { 0x00002, "ReceivedCalls" }, + { 0x00003, "MissedCalls" }, + { 0xffffffff, "UnknownDisp" }, + { 0x00000, NULL } +}; +static value_string_ext CallHistoryDisposition_ext = VALUE_STRING_EXT_INIT(CallHistoryDisposition); + +static const value_string MwiNotificationResult[] = { + { 0x00000, "Ok" }, + { 0x00001, "GeneralError" }, + { 0x00002, "RequestRejected" }, + { 0x00003, "VmCountOutOfBounds" }, + { 0x00004, "FaxCountOutOfBounds" }, + { 0x00005, "InvalidPriorityVmCount" }, + { 0x00006, "InvalidPriorityFaxCount" }, + { 0x00000, NULL } +}; +static value_string_ext MwiNotificationResult_ext = VALUE_STRING_EXT_INIT(MwiNotificationResult); + +static const value_string RecordingStatus[] = { + { 0x00000, "_OFF" }, + { 0x00001, "_ON" }, + { 0x00000, NULL } +}; +static value_string_ext RecordingStatus_ext = VALUE_STRING_EXT_INIT(RecordingStatus); + + +/* Staticly Declared Variables */ +static int proto_skinny = -1; +static int hf_skinny_messageId = -1; +static int hf_skinny_data_length = -1; +static int hf_skinny_hdr_version = -1; +static int hf_skinny_xmlData = -1; +static int hf_skinny_ipv4or6 = -1; + +static int hf_skinny_AlternateCallingParty = -1; +static int hf_skinny_DSCPValue = -1; +static int hf_skinny_DeviceName = -1; +static int hf_skinny_FutureUse1 = -1; +static int hf_skinny_FutureUse2 = -1; +static int hf_skinny_FutureUse3 = -1; +static int hf_skinny_Generic_Bitfield_Bit1 = -1; +static int hf_skinny_Generic_Bitfield_Bit10 = -1; +static int hf_skinny_Generic_Bitfield_Bit11 = -1; +static int hf_skinny_Generic_Bitfield_Bit12 = -1; +static int hf_skinny_Generic_Bitfield_Bit13 = -1; +static int hf_skinny_Generic_Bitfield_Bit14 = -1; +static int hf_skinny_Generic_Bitfield_Bit15 = -1; +static int hf_skinny_Generic_Bitfield_Bit16 = -1; +static int hf_skinny_Generic_Bitfield_Bit17 = -1; +static int hf_skinny_Generic_Bitfield_Bit18 = -1; +static int hf_skinny_Generic_Bitfield_Bit19 = -1; +static int hf_skinny_Generic_Bitfield_Bit2 = -1; +static int hf_skinny_Generic_Bitfield_Bit20 = -1; +static int hf_skinny_Generic_Bitfield_Bit21 = -1; +static int hf_skinny_Generic_Bitfield_Bit22 = -1; +static int hf_skinny_Generic_Bitfield_Bit23 = -1; +static int hf_skinny_Generic_Bitfield_Bit24 = -1; +static int hf_skinny_Generic_Bitfield_Bit25 = -1; +static int hf_skinny_Generic_Bitfield_Bit26 = -1; +static int hf_skinny_Generic_Bitfield_Bit27 = -1; +static int hf_skinny_Generic_Bitfield_Bit28 = -1; +static int hf_skinny_Generic_Bitfield_Bit29 = -1; +static int hf_skinny_Generic_Bitfield_Bit3 = -1; +static int hf_skinny_Generic_Bitfield_Bit30 = -1; +static int hf_skinny_Generic_Bitfield_Bit31 = -1; +static int hf_skinny_Generic_Bitfield_Bit32 = -1; +static int hf_skinny_Generic_Bitfield_Bit4 = -1; +static int hf_skinny_Generic_Bitfield_Bit5 = -1; +static int hf_skinny_Generic_Bitfield_Bit6 = -1; +static int hf_skinny_Generic_Bitfield_Bit7 = -1; +static int hf_skinny_Generic_Bitfield_Bit8 = -1; +static int hf_skinny_Generic_Bitfield_Bit9 = -1; +static int hf_skinny_HuntPilotName = -1; +static int hf_skinny_HuntPilotNumber = -1; +static int hf_skinny_MPI = -1; +static int hf_skinny_PhoneFeatures_Abbreviated_Dial = -1; +static int hf_skinny_PhoneFeatures_Bit1 = -1; +static int hf_skinny_PhoneFeatures_Bit11 = -1; +static int hf_skinny_PhoneFeatures_Bit12 = -1; +static int hf_skinny_PhoneFeatures_Bit13 = -1; +static int hf_skinny_PhoneFeatures_Bit14 = -1; +static int hf_skinny_PhoneFeatures_Bit15 = -1; +static int hf_skinny_PhoneFeatures_Bit2 = -1; +static int hf_skinny_PhoneFeatures_Bit3 = -1; +static int hf_skinny_PhoneFeatures_Bit4 = -1; +static int hf_skinny_PhoneFeatures_Bit6 = -1; +static int hf_skinny_PhoneFeatures_Bit7 = -1; +static int hf_skinny_PhoneFeatures_Bit9 = -1; +static int hf_skinny_PhoneFeatures_DynamicMessages = -1; +static int hf_skinny_PhoneFeatures_RFC2833 = -1; +static int hf_skinny_PhoneFeatures_UTF8 = -1; +static int hf_skinny_RFC2833PayloadType = -1; +static int hf_skinny_RTCPPortNumber = -1; +static int hf_skinny_RTPPayloadFormat = -1; +static int hf_skinny_RestrictInformationType_BitsReserved = -1; +static int hf_skinny_RestrictInformationType_CalledParty = -1; +static int hf_skinny_RestrictInformationType_CalledPartyName = -1; +static int hf_skinny_RestrictInformationType_CalledPartyNumber = -1; +static int hf_skinny_RestrictInformationType_CallingParty = -1; +static int hf_skinny_RestrictInformationType_CallingPartyName = -1; +static int hf_skinny_RestrictInformationType_CallingPartyNumber = -1; +static int hf_skinny_RestrictInformationType_LastRedirectParty = -1; +static int hf_skinny_RestrictInformationType_LastRedirectPartyName = -1; +static int hf_skinny_RestrictInformationType_LastRedirectPartyNumber = -1; +static int hf_skinny_RestrictInformationType_OriginalCalledParty = -1; +static int hf_skinny_RestrictInformationType_OriginalCalledPartyName = -1; +static int hf_skinny_RestrictInformationType_OriginalCalledPartyNumber = -1; +static int hf_skinny_ServerName = -1; +static int hf_skinny_SoftKeyMask_SoftKey1 = -1; +static int hf_skinny_SoftKeyMask_SoftKey10 = -1; +static int hf_skinny_SoftKeyMask_SoftKey11 = -1; +static int hf_skinny_SoftKeyMask_SoftKey12 = -1; +static int hf_skinny_SoftKeyMask_SoftKey13 = -1; +static int hf_skinny_SoftKeyMask_SoftKey14 = -1; +static int hf_skinny_SoftKeyMask_SoftKey15 = -1; +static int hf_skinny_SoftKeyMask_SoftKey16 = -1; +static int hf_skinny_SoftKeyMask_SoftKey2 = -1; +static int hf_skinny_SoftKeyMask_SoftKey3 = -1; +static int hf_skinny_SoftKeyMask_SoftKey4 = -1; +static int hf_skinny_SoftKeyMask_SoftKey5 = -1; +static int hf_skinny_SoftKeyMask_SoftKey6 = -1; +static int hf_skinny_SoftKeyMask_SoftKey7 = -1; +static int hf_skinny_SoftKeyMask_SoftKey8 = -1; +static int hf_skinny_SoftKeyMask_SoftKey9 = -1; +static int hf_skinny_Unknown = -1; +static int hf_skinny_active = -1; +static int hf_skinny_activeConferenceOnRegistration = -1; +static int hf_skinny_activeConferences = -1; +static int hf_skinny_activeForward = -1; +static int hf_skinny_activeStreams = -1; +static int hf_skinny_activeStreamsOnRegistration = -1; +static int hf_skinny_add_participant_result = -1; +static int hf_skinny_alarmInfo = -1; static int hf_skinny_alarmSeverity = -1; -static int hf_skinny_alarmParam1 = -1; -static int hf_skinny_alarmParam2 = -1; -static int hf_skinny_receptionStatus = -1; -static int hf_skinny_passThruPartyID = -1; -static int hf_skinny_ORCStatus = -1; -static int hf_skinny_IPVersion = -1; -static int hf_skinny_ipAddress = -1; -static int hf_skinny_ipV6Address = -1; -static int hf_skinny_portNumber = -1; -static int hf_skinny_statsProcessingType = -1; -static int hf_skinny_callIdentifier = -1; -static int hf_skinny_packetsSent = -1; -static int hf_skinny_octetsSent = -1; -static int hf_skinny_packetsRecv = -1; -static int hf_skinny_octetsRecv = -1; -static int hf_skinny_packetsLost = -1; -static int hf_skinny_latency = -1; -static int hf_skinny_jitter = -1; -static int hf_skinny_directoryNumber = -1; -static int hf_skinny_softKeyEvent = -1; -static int hf_skinny_lineInstance = -1; -static int hf_skinny_keepAliveInterval = -1; -static int hf_skinny_dateTemplate = -1; -static int hf_skinny_secondaryKeepAliveInterval = -1; -static int hf_skinny_buttonOffset = -1; +static int hf_skinny_algorithmID = -1; +static int hf_skinny_alignmentPadding = -1; +static int hf_skinny_annAckReq = -1; +static int hf_skinny_annPlayMode = -1; +static int hf_skinny_annStatus = -1; +static int hf_skinny_annexNandWFutureUse = -1; +static int hf_skinny_appConfID = -1; +static int hf_skinny_appData = -1; +static int hf_skinny_appID = -1; +static int hf_skinny_appInstanceID = -1; +static int hf_skinny_appName = -1; +static int hf_skinny_applicationID = -1; +static int hf_skinny_areMessagesWaiting = -1; +static int hf_skinny_associatedStreamID = -1; +static int hf_skinny_audioCapCount = -1; +static int hf_skinny_audioLevelAdjustment = -1; +static int hf_skinny_audit_participant_result = -1; +static int hf_skinny_averageBitRate = -1; +static int hf_skinny_bandwidth = -1; +static int hf_skinny_bitRate = -1; +static int hf_skinny_bridgeParticipantId = -1; +static int hf_skinny_burstSize = -1; +static int hf_skinny_busyTrigger = -1; static int hf_skinny_buttonCount = -1; -static int hf_skinny_totalButtonCount = -1; -static int hf_skinny_buttonInstanceNumber = -1; static int hf_skinny_buttonDefinition = -1; -static int hf_skinny_softKeyOffset = -1; -static int hf_skinny_softKeyCount = -1; -static int hf_skinny_totalSoftKeyCount = -1; -static int hf_skinny_softKeyLabel = -1; -static int hf_skinny_softKeySetOffset = -1; -static int hf_skinny_softKeySetCount = -1; -static int hf_skinny_totalSoftKeySetCount = -1; -static int hf_skinny_softKeyTemplateIndex = -1; -static int hf_skinny_softKeyInfoIndex = -1; -static int hf_skinny_softKeySetDescription = -1; -static int hf_skinny_softKeyMap = -1; -static int hf_skinny_softKey0 = -1; -static int hf_skinny_softKey1 = -1; -static int hf_skinny_softKey2 = -1; -static int hf_skinny_softKey3 = -1; -static int hf_skinny_softKey4 = -1; -static int hf_skinny_softKey5 = -1; -static int hf_skinny_softKey6 = -1; -static int hf_skinny_softKey7 = -1; -static int hf_skinny_softKey8 = -1; -static int hf_skinny_softKey9 = -1; -static int hf_skinny_softKey10 = -1; -static int hf_skinny_softKey11 = -1; -static int hf_skinny_softKey12 = -1; -static int hf_skinny_softKey13 = -1; -static int hf_skinny_softKey14 = -1; -static int hf_skinny_softKey15 = -1; -static int hf_skinny_lampMode = -1; -static int hf_skinny_messageTimeOutValue = -1; -static int hf_skinny_displayMessage = -1; -static int hf_skinny_lineDirNumber = -1; -static int hf_skinny_lineFullyQualifiedDisplayName = -1; -static int hf_skinny_lineDisplayName = -1; -static int hf_skinny_speedDialDirNumber = -1; -static int hf_skinny_speedDialDisplayName = -1; -static int hf_skinny_dateYear = -1; -static int hf_skinny_dateMonth = -1; -static int hf_skinny_dayOfWeek = -1; -static int hf_skinny_dateDay = -1; -static int hf_skinny_dateHour = -1; -static int hf_skinny_dateMinute = -1; -static int hf_skinny_dateSeconds = -1; -static int hf_skinny_dateMilliseconds = -1; -static int hf_skinny_timeStamp = -1; +static int hf_skinny_buttonOffset = -1; +static int hf_skinny_callHistoryDisposition = -1; +static int hf_skinny_callInstance = -1; +static int hf_skinny_callReference = -1; +static int hf_skinny_callSecurityStatus = -1; +static int hf_skinny_callSelectStat = -1; static int hf_skinny_callState = -1; -static int hf_skinny_deviceTone = -1; +static int hf_skinny_callType = -1; +static int hf_skinny_calledParty = -1; +static int hf_skinny_calledPartyName = -1; +static int hf_skinny_callingParty = -1; static int hf_skinny_callingPartyName = -1; static int hf_skinny_callingPartyNumber = -1; -static int hf_skinny_calledPartyName = -1; -static int hf_skinny_callType = -1; -static int hf_skinny_originalCalledPartyName = -1; -static int hf_skinny_originalCalledParty = -1; -static int hf_skinny_ringType = -1; -static int hf_skinny_ringMode = -1; -static int hf_skinny_speakerMode = -1; -static int hf_skinny_remoteIpAddr = -1; -static int hf_skinny_remotePortNumber = -1; -static int hf_skinny_millisecondPacketSize = -1; -static int hf_skinny_precedenceValue = -1; -static int hf_skinny_silenceSuppression = -1; -static int hf_skinny_g723BitRate = -1; -static int hf_skinny_conferenceID = -1; -static int hf_skinny_deviceResetType = -1; -static int hf_skinny_echoCancelType = -1; -static int hf_skinny_deviceUnregisterStatus = -1; -static int hf_skinny_hookFlashDetectMode = -1; -static int hf_skinny_detectInterval = -1; -static int hf_skinny_microphoneMode = -1; -static int hf_skinny_headsetMode = -1; -static int hf_skinny_unknown = -1; -static int hf_skinny_rawData = -1; -static int hf_skinny_xmlData = -1; -static int hf_skinny_activeForward = -1; -static int hf_skinny_forwardAllActive = -1; -static int hf_skinny_forwardBusyActive = -1; -static int hf_skinny_forwardNoAnswerActive = -1; -static int hf_skinny_forwardNumber = -1; -static int hf_skinny_serverName = -1; -static int hf_skinny_numberLines = -1; -static int hf_skinny_numberSpeedDials = -1; -static int hf_skinny_userName = -1; -static int hf_skinny_sessionType = -1; -static int hf_skinny_version = -1; -static int hf_skinny_mediaEnunciationType = -1; -static int hf_skinny_serverIdentifier = -1; -static int hf_skinny_serverListenPort = -1; -static int hf_skinny_serverIpAddress = -1; -static int hf_skinny_multicastIpAddress = -1; -static int hf_skinny_multicastPort = -1; -static int hf_skinny_tokenRejWaitTime = -1; -static int hf_skinny_numberOfInServiceStreams = -1; -static int hf_skinny_maxStreamsPerConf = -1; -static int hf_skinny_numberOfOutOfServiceStreams = -1; -static int hf_skinny_applicationID = -1; -static int hf_skinny_serviceNum = -1; -static int hf_skinny_serviceURLIndex = -1; -static int hf_skinny_featureIndex = -1; -static int hf_skinny_createConfResults = -1; -static int hf_skinny_modifyConfResults = -1; -static int hf_skinny_deleteConfResults = -1; -static int hf_skinny_addParticipantResults = -1; -static int hf_skinny_passThruData = -1; -static int hf_skinny_last = -1; -static int hf_skinny_numberOfEntries = -1; -static int hf_skinny_auditParticipantResults = -1; -static int hf_skinny_participantEntry = -1; -static int hf_skinny_resourceTypes = -1; -static int hf_skinny_numberOfReservedParticipants = -1; -static int hf_skinny_numberOfActiveParticipants = -1; -static int hf_skinny_appID = -1; -static int hf_skinny_appData = -1; -static int hf_skinny_appConfID = -1; -static int hf_skinny_sequenceFlag = -1; -static int hf_skinny_displayPriority = -1; -static int hf_skinny_appInstanceID = -1; -static int hf_skinny_routingID = -1; -static int hf_skinny_audioCapCount = -1; -static int hf_skinny_videoCapCount = -1; -static int hf_skinny_dataCapCount = -1; -static int hf_skinny_RTPPayloadFormat = -1; -static int hf_skinny_customPictureFormatCount = -1; -static int hf_skinny_pictureWidth = -1; -static int hf_skinny_pictureHeight = -1; -static int hf_skinny_pixelAspectRatio = -1; +static int hf_skinny_capAndVer = -1; +static int hf_skinny_capCount = -1; +static int hf_skinny_cause = -1; +static int hf_skinny_cdpnVoiceMailbox = -1; +static int hf_skinny_cgpnVoiceMailbox = -1; +static int hf_skinny_chan0MaxPayload = -1; +static int hf_skinny_chan2MaxPayload = -1; +static int hf_skinny_chan2MaxWindow = -1; +static int hf_skinny_chan3MaxPayload = -1; static int hf_skinny_clockConversionCode = -1; static int hf_skinny_clockDivisor = -1; -static int hf_skinny_activeStreamsOnRegistration = -1; -static int hf_skinny_maxBW = -1; -static int hf_skinny_serviceResourceCount = -1; -static int hf_skinny_layoutCount = -1; -static int hf_skinny_layout = -1; -static int hf_skinny_maxConferences = -1; -static int hf_skinny_activeConferenceOnRegistration = -1; -static int hf_skinny_transmitOrReceive = -1; -static int hf_skinny_levelPreferenceCount = -1; -static int hf_skinny_transmitPreference = -1; -static int hf_skinny_format = -1; -static int hf_skinny_maxBitRate = -1; -static int hf_skinny_minBitRate = -1; -static int hf_skinny_MPI = -1; -static int hf_skinny_serviceNumber = -1; -static int hf_skinny_temporalSpatialTradeOffCapability = -1; -static int hf_skinny_stillImageTransmission = -1; -static int hf_skinny_h263_capability_bitfield = -1; -static int hf_skinny_annexNandWFutureUse = -1; -static int hf_skinny_modelNumber = -1; -static int hf_skinny_bandwidth = -1; -static int hf_skinny_protocolDependentData = -1; -static int hf_skinny_priority = -1; -static int hf_skinny_payloadDtmf = -1; -static int hf_skinny_featureID = -1; -static int hf_skinny_featureTextLabel = -1; -static int hf_skinny_featureStatus = -1; -static int hf_skinny_notify = -1; -static int hf_skinny_endOfAnnAck = -1; -static int hf_skinny_annPlayMode = -1; -static int hf_skinny_annPlayStatus = -1; -static int hf_skinny_locale = -1; +static int hf_skinny_codecMode = -1; +static int hf_skinny_codecParam1 = -1; +static int hf_skinny_codecParam2 = -1; +static int hf_skinny_command = -1; +static int hf_skinny_compressionType = -1; +static int hf_skinny_confServiceNum = -1; +static int hf_skinny_conferenceID = -1; +static int hf_skinny_conferenceName = -1; +static int hf_skinny_confirmRequired = -1; static int hf_skinny_country = -1; -static int hf_skinny_matrixConfPartyID = -1; +static int hf_skinny_customMaxBRandCPB = -1; +static int hf_skinny_customMaxDPB = -1; +static int hf_skinny_customMaxFS = -1; +static int hf_skinny_customMaxMBPS = -1; +static int hf_skinny_customPictureFormatCount = -1; +static int hf_skinny_data = -1; +static int hf_skinny_dataCapCount = -1; +static int hf_skinny_dataCapabilityDirection = -1; +static int hf_skinny_dataLength = -1; +static int hf_skinny_dataSize = -1; +static int hf_skinny_dateTemplate = -1; +static int hf_skinny_defendingPriority = -1; +static int hf_skinny_delete_conf_result = -1; +static int hf_skinny_deviceType = -1; +static int hf_skinny_dialedNumber = -1; +static int hf_skinny_direction = -1; +static int hf_skinny_directoryNum = -1; +static int hf_skinny_displayPriority = -1; +static int hf_skinny_dtmfType = -1; +static int hf_skinny_dynamicPayload = -1; +static int hf_skinny_ecValue = -1; +static int hf_skinny_encryptionCapability = -1; +static int hf_skinny_errorCode = -1; +static int hf_skinny_failureNodeIpAddr = -1; +static int hf_skinny_featureCapabilities = -1; +static int hf_skinny_featureID = -1; +static int hf_skinny_featureIndex = -1; +static int hf_skinny_featureStatus = -1; +static int hf_skinny_featureTextLabel = -1; +static int hf_skinny_features = -1; +static int hf_skinny_firmwareLoadName = -1; +static int hf_skinny_firstGOB = -1; +static int hf_skinny_firstMB = -1; +static int hf_skinny_format = -1; +static int hf_skinny_forwardAllActive = -1; +static int hf_skinny_forwardAllDirnum = -1; +static int hf_skinny_forwardBusyActive = -1; +static int hf_skinny_forwardBusyDirnum = -1; +static int hf_skinny_forwardNoAnswerActive = -1; +static int hf_skinny_forwardNoAnswerlDirnum = -1; +static int hf_skinny_g723BitRate = -1; +static int hf_skinny_headsetStatus = -1; static int hf_skinny_hearingConfPartyMask = -1; +static int hf_skinny_instance = -1; +static int hf_skinny_instanceNumber = -1; +static int hf_skinny_ipAddr_ipv4 = -1; +static int hf_skinny_ipAddr_ipv6 = -1; +static int hf_skinny_ipAddressType = -1; +static int hf_skinny_ipAddressingMode = -1; +static int hf_skinny_ipV4AddressScope = -1; +static int hf_skinny_ipV6AddressScope = -1; +static int hf_skinny_isConferenceCreator = -1; +static int hf_skinny_isMKIPresent = -1; +static int hf_skinny_jitter = -1; +static int hf_skinny_keepAliveInterval = -1; +static int hf_skinny_key = -1; +static int hf_skinny_keyDerivationRate = -1; +static int hf_skinny_keylen = -1; +static int hf_skinny_kpButton = -1; +static int hf_skinny_lampMode = -1; +static int hf_skinny_last = -1; +static int hf_skinny_lastRedirectingParty = -1; +static int hf_skinny_lastRedirectingPartyName = -1; +static int hf_skinny_lastRedirectingReason = -1; +static int hf_skinny_lastRedirectingVoiceMailbox = -1; +static int hf_skinny_latency = -1; +static int hf_skinny_layoutCount = -1; +static int hf_skinny_layoutID = -1; +static int hf_skinny_layouts = -1; +static int hf_skinny_level = -1; +static int hf_skinny_levelPreferenceCount = -1; +static int hf_skinny_lineDataEntries = -1; +static int hf_skinny_lineDirNumber = -1; +static int hf_skinny_lineDisplayOptions = -1; +static int hf_skinny_lineFullyQualifiedDisplayName = -1; +static int hf_skinny_lineInstance = -1; +static int hf_skinny_lineNumber = -1; +static int hf_skinny_lineTextLabel = -1; +static int hf_skinny_locale = -1; +static int hf_skinny_longTermPictureIndex = -1; +static int hf_skinny_macAddress = -1; +static int hf_skinny_matrixConfPartyID = -1; +static int hf_skinny_maxBW = -1; +static int hf_skinny_maxBitRate = -1; +static int hf_skinny_maxConferences = -1; +static int hf_skinny_maxFramesPerPacket = -1; +static int hf_skinny_maxNumCalls = -1; +static int hf_skinny_maxNumOfAvailLines = -1; +static int hf_skinny_maxNumberOfLines = -1; +static int hf_skinny_maxProtocolVer = -1; +static int hf_skinny_maxRetryNumber = -1; +static int hf_skinny_maxStreams = -1; +static int hf_skinny_maxStreamsPerConf = -1; +static int hf_skinny_maximumBitRate = -1; +static int hf_skinny_mediaPathCapabilities = -1; +static int hf_skinny_mediaPathEvent = -1; +static int hf_skinny_mediaPathID = -1; +static int hf_skinny_mediaTransportType = -1; +static int hf_skinny_mediaType = -1; +static int hf_skinny_micMode = -1; +static int hf_skinny_millisecondPacketSize = -1; +static int hf_skinny_minBitRate = -1; +static int hf_skinny_mixingMode = -1; +static int hf_skinny_modAnd2833 = -1; +static int hf_skinny_modelNumber = -1; +static int hf_skinny_modify_conf_result = -1; +static int hf_skinny_multicastIpAddr_ipv4 = -1; +static int hf_skinny_multicastIpAddr_ipv6 = -1; +static int hf_skinny_multicastPortNumber = -1; +static int hf_skinny_multimediaOpenReceiveChannelStatus = -1; +static int hf_skinny_mwiControlNumber = -1; +static int hf_skinny_mwiTargetNumber = -1; +static int hf_skinny_mwi_notification_result = -1; +static int hf_skinny_noaudio = -1; +static int hf_skinny_none = -1; +static int hf_skinny_notify = -1; +static int hf_skinny_nse = -1; +static int hf_skinny_numNewMsgs = -1; +static int hf_skinny_numOldMsgs = -1; +static int hf_skinny_numberOctetsReceived = -1; +static int hf_skinny_numberOctetsSent = -1; +static int hf_skinny_numberOfActiveParticipants = -1; +static int hf_skinny_numberOfEntries = -1; +static int hf_skinny_numberOfGOBs = -1; +static int hf_skinny_numberOfInServiceStreams = -1; +static int hf_skinny_numberOfLines = -1; +static int hf_skinny_numberOfMBs = -1; +static int hf_skinny_numberOfOutOfServiceStreams = -1; +static int hf_skinny_numberOfReservedParticipants = -1; +static int hf_skinny_numberOfSpeedDials = -1; +static int hf_skinny_numberPacketsLost = -1; +static int hf_skinny_numberPacketsReceived = -1; +static int hf_skinny_numberPacketsSent = -1; +static int hf_skinny_openReceiveChannelStatus = -1; +static int hf_skinny_originalCalledParty = -1; +static int hf_skinny_originalCalledPartyName = -1; +static int hf_skinny_originalCdpnRedirectReason = -1; +static int hf_skinny_originalCdpnVoiceMailbox = -1; +static int hf_skinny_parm1 = -1; +static int hf_skinny_parm2 = -1; +static int hf_skinny_participantEntry = -1; +static int hf_skinny_participantName = -1; +static int hf_skinny_participantNumber = -1; +static int hf_skinny_partyDirection = -1; +static int hf_skinny_passThruData = -1; +static int hf_skinny_passThruPartyID = -1; +static int hf_skinny_passthruPartyID = -1; +static int hf_skinny_payloadCapability = -1; +static int hf_skinny_payloadDtmf = -1; +static int hf_skinny_payloadType = -1; +static int hf_skinny_payload_rfc_number = -1; +static int hf_skinny_peakRate = -1; +static int hf_skinny_pictureFormatCount = -1; +static int hf_skinny_pictureHeight = -1; +static int hf_skinny_pictureNumber = -1; +static int hf_skinny_pictureWidth = -1; +static int hf_skinny_pixelAspectRatio = -1; +static int hf_skinny_portHandlingFlag = -1; +static int hf_skinny_portNumber = -1; +static int hf_skinny_precedenceDm = -1; +static int hf_skinny_precedenceLv = -1; +static int hf_skinny_precedenceValue = -1; +static int hf_skinny_preemptionPriority = -1; +static int hf_skinny_priority = -1; +static int hf_skinny_privacy = -1; +static int hf_skinny_profile = -1; +static int hf_skinny_promptStatus = -1; +static int hf_skinny_protocolDependentData = -1; +static int hf_skinny_protocolVer = -1; +static int hf_skinny_receptionStatus = -1; +static int hf_skinny_recording_status = -1; +static int hf_skinny_recoveryReferencePictureCount = -1; +static int hf_skinny_remoteIpAddr_ipv4 = -1; +static int hf_skinny_remoteIpAddr_ipv6 = -1; +static int hf_skinny_remotePortNumber = -1; +static int hf_skinny_requestedIpAddrType = -1; +static int hf_skinny_reserved_for_future_use = -1; +static int hf_skinny_resetType = -1; +static int hf_skinny_resourceType = -1; +static int hf_skinny_result = -1; +static int hf_skinny_resultCode = -1; +static int hf_skinny_resvStyle = -1; +static int hf_skinny_retryTimer = -1; +static int hf_skinny_rfc2833 = -1; +static int hf_skinny_ringDuration = -1; +static int hf_skinny_ringMode = -1; +static int hf_skinny_routingID = -1; +static int hf_skinny_rsvpErrorCode = -1; +static int hf_skinny_rsvpErrorFlag = -1; +static int hf_skinny_rsvpErrorSubCodeVal = -1; +static int hf_skinny_rtpMediaPort = -1; +static int hf_skinny_salt = -1; +static int hf_skinny_saltlen = -1; +static int hf_skinny_secondaryKeepAliveInterval = -1; +static int hf_skinny_sequenceFlag = -1; +static int hf_skinny_serverInstance = -1; +static int hf_skinny_serverName = -1; +static int hf_skinny_serverTcpListenPort = -1; +static int hf_skinny_serviceNum = -1; +static int hf_skinny_serviceNumber = -1; +static int hf_skinny_serviceResourceCount = -1; static int hf_skinny_serviceURL = -1; static int hf_skinny_serviceURLDisplayName = -1; -static int hf_skinny_callSelectStat = -1; -static int hf_skinny_isConferenceCreator = -1; -static int hf_skinny_payload_rfc_number = -1; -static int hf_skinny_payloadType = -1; -static int hf_skinny_bitRate = -1; -static int hf_skinny_pictureFormatCount = -1; -static int hf_skinny_confServiceNum = -1; -static int hf_skinny_DSCPValue = -1; -static int hf_skinny_miscCommandType = -1; -static int hf_skinny_temporalSpatialTradeOff = -1; -static int hf_skinny_firstGOB = -1; -static int hf_skinny_numberOfGOBs = -1; -static int hf_skinny_firstMB = -1; -static int hf_skinny_numberOfMBs = -1; -static int hf_skinny_pictureNumber = -1; -static int hf_skinny_longTermPictureIndex = -1; -static int hf_skinny_recoveryReferencePictureCount = -1; -static int hf_skinny_transactionID = -1; -static int hf_skinny_lastRedirectingPartyName = -1; -static int hf_skinny_lastRedirectingParty = -1; -static int hf_skinny_cgpnVoiceMailbox = -1; -static int hf_skinny_cdpnVoiceMailbox = -1; -static int hf_skinny_originalCdpnVoiceMailbox = -1; -static int hf_skinny_lastRedirectingVoiceMailbox = -1; -static int hf_skinny_originalCdpnRedirectReason = -1; -static int hf_skinny_lastRedirectingReason = -1; -static int hf_skinny_callInstance = -1; -static int hf_skinny_callSecurityStatus = -1; -static int hf_skinny_partyPIRestrictionBits_CallingPartyName = -1; -static int hf_skinny_partyPIRestrictionBits_CallingPartyNumber = -1; -static int hf_skinny_partyPIRestrictionBits_CalledPartyName = -1; -static int hf_skinny_partyPIRestrictionBits_CalledPartyNumber = -1; -static int hf_skinny_partyPIRestrictionBits_OriginalCalledPartyName = -1; -static int hf_skinny_partyPIRestrictionBits_OriginalCalledPartyNumber = -1; -static int hf_skinny_partyPIRestrictionBits_LastRedirectPartyName = -1; -static int hf_skinny_partyPIRestrictionBits_LastRedirectPartyNumber = -1; -static int hf_skinny_directoryIndex = -1; -static int hf_skinny_directoryPhoneNumber = -1; +static int hf_skinny_serviceURLIndex = -1; +static int hf_skinny_sessionType = -1; +static int hf_skinny_softKeyCount = -1; +static int hf_skinny_softKeyEvent = -1; +static int hf_skinny_softKeyInfoIndex = -1; +static int hf_skinny_softKeyLabel = -1; +static int hf_skinny_softKeyOffset = -1; +static int hf_skinny_softKeySetCount = -1; +static int hf_skinny_softKeySetIndex = -1; +static int hf_skinny_softKeySetOffset = -1; +static int hf_skinny_softKeyTemplateIndex = -1; +static int hf_skinny_sourceIpAddr_ipv4 = -1; +static int hf_skinny_sourceIpAddr_ipv6 = -1; +static int hf_skinny_sourcePortNumber = -1; +static int hf_skinny_speakerMode = -1; +static int hf_skinny_speedDialDirNumber = -1; +static int hf_skinny_speedDialDisplayName = -1; +static int hf_skinny_speedDialNumber = -1; +static int hf_skinny_ssValue = -1; +static int hf_skinny_sse = -1; +static int hf_skinny_standard = -1; static int hf_skinny_startMediaTransmissionStatus = -1; -static int hf_skinny_startMultiMediaTransmissionStatus = -1; -static int hf_skinny_qualityStats = -1; -static int hf_skinny_accessory = -1; -static int hf_skinny_accessoryState = -1; -static int hf_skinny_macAddress = -1; -static int hf_skinny_activeStreams = -1; -static int hf_skinny_phoneFeatures = -1; -static int hf_skinny_maxButtons = -1; -static int hf_skinny_loadInfo = -1; -static int hf_skinny_visibility = -1; +static int hf_skinny_startingLineInstance = -1; +static int hf_skinny_stationIpAddr = -1; +static int hf_skinny_stationIpAddr_ipv4 = -1; +static int hf_skinny_stationIpAddr_ipv6 = -1; +static int hf_skinny_stationIpV6Addr = -1; +static int hf_skinny_stationIpV6Addr_ipv4 = -1; +static int hf_skinny_stationIpV6Addr_ipv6 = -1; +static int hf_skinny_statsProcessingMode = -1; +static int hf_skinny_status = -1; +static int hf_skinny_stillImageTransmission = -1; +static int hf_skinny_stimulus = -1; +static int hf_skinny_stimulusInstance = -1; +static int hf_skinny_stimulusStatus = -1; +static int hf_skinny_streamPassThroughID = -1; +static int hf_skinny_subAppID = -1; +static int hf_skinny_subscriptionID = -1; +static int hf_skinny_systemTime = -1; +static int hf_skinny_temporalSpatialTradeOff = -1; +static int hf_skinny_temporalSpatialTradeOffCapability = -1; +static int hf_skinny_text = -1; +static int hf_skinny_timeOutValue = -1; +static int hf_skinny_timer = -1; +static int hf_skinny_tone = -1; +static int hf_skinny_toneAnnouncement = -1; +static int hf_skinny_tone_output_direction = -1; +static int hf_skinny_totalButtonCount = -1; +static int hf_skinny_totalNumOfConfiguredLines = -1; +static int hf_skinny_totalSoftKeyCount = -1; +static int hf_skinny_totalSoftKeySetCount = -1; +static int hf_skinny_transactionID = -1; +static int hf_skinny_transmitIpAddr_ipv4 = -1; +static int hf_skinny_transmitIpAddr_ipv6 = -1; +static int hf_skinny_transmitPort = -1; +static int hf_skinny_transmitPreference = -1; +static int hf_skinny_unRegReasonCode = -1; +static int hf_skinny_unknown2 = -1; +static int hf_skinny_userName = -1; +static int hf_skinny_v150sprt = -1; +static int hf_skinny_vendor = -1; +static int hf_skinny_vendorID = -1; +static int hf_skinny_version = -1; +static int hf_skinny_videoCapCount = -1; +static int hf_skinny_videoCapabilityDirection = -1; +static int hf_skinny_wDay = -1; +static int hf_skinny_wDayOfWeek = -1; +static int hf_skinny_wHour = -1; +static int hf_skinny_wMilliseconds = -1; +static int hf_skinny_wMinute = -1; +static int hf_skinny_wMonth = -1; +static int hf_skinny_wSecond = -1; +static int hf_skinny_wYear = -1; +static int hf_skinny_waitTimeBeforeNextReq = -1; -/* Skinny content type and internet media type used by other dissectors - * * are the same. List of media types from IANA at: - * * http://www.iana.org/assignments/media-types/index.html */ static dissector_table_t media_type_dissector_table; /* Initialize the subtree pointers */ static gint ett_skinny = -1; static gint ett_skinny_tree = -1; -static gint ett_skinny_softKeyMap = -1; /* desegmentation of SCCP */ static gboolean skinny_desegment = TRUE; @@ -1386,79 +2175,5511 @@ static skinny_info_t pi_arr[MAX_SKINNY_MESSAGES_IN_PACKET]; static int pi_current = 0; static skinny_info_t *si; +dissector_handle_t skinny_handle; + /* Get the length of a single SCCP PDU */ static guint get_skinny_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset) { guint32 hdr_data_length; - /* - * Get the length of the SCCP packet. - */ + /* Get the length of the SCCP packet. */ hdr_data_length = tvb_get_letohl(tvb, offset); - /* - * That length doesn't include the length of the header itself; - * add that in. - */ + /* That length doesn't include the length of the header itself. */ return hdr_data_length + 8; } static void -dissect_skinny_xml(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, const gint start, gint length) +dissect_skinny_xml(ptvcursor_t *cursor, int hfindex, packet_info *pinfo, guint32 length, guint32 maxlength) { - proto_item *item = NULL; - proto_tree *subtree = NULL; + proto_item *item = NULL; + proto_tree *subtree = NULL; + dissector_handle_t handle = NULL; + proto_tree *tree = ptvcursor_tree(cursor); + guint32 offset = ptvcursor_current_offset(cursor); + tvbuff_t *tvb = ptvcursor_tvbuff(cursor); tvbuff_t *next_tvb; - dissector_handle_t handle; - item = proto_tree_add_item(tree, hf_skinny_xmlData, tvb, start, length, ENC_ASCII|ENC_NA); + if (length == 0) { + length = tvb_strnlen(tvb, offset, -1); + } + if (length >= maxlength) { + length = maxlength; + } + + ptvcursor_add_no_advance(cursor, hfindex, length, ENC_ASCII|ENC_NA); + + item = proto_tree_add_item(tree, hf_skinny_xmlData, tvb, offset, length, ENC_ASCII|ENC_NA); subtree = proto_item_add_subtree(item, 0); - next_tvb = tvb_new_subset(tvb, start, length, -1); + next_tvb = tvb_new_subset(tvb, offset, length, -1); handle = dissector_get_string_handle(media_type_dissector_table, "text/xml"); if (handle != NULL) { call_dissector(handle, next_tvb, pinfo, subtree); - } + } + ptvcursor_advance(cursor, maxlength); } -/* Dissect a single SCCP PDU */ -static int -dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +static void +dissect_skinny_ipv4or6(ptvcursor_t *cursor, int hfindex_ipv4, int hfindex_ipv6, packet_info *pinfo) { - int offset = 0; - gboolean is_video = FALSE; /* FIX ME: need to indicate video or not */ + address src_addr; + guint32 ipversion = 0; + guint32 offset = ptvcursor_current_offset(cursor); + tvbuff_t *tvb = ptvcursor_tvbuff(cursor); + guint32 hdr_version = tvb_get_letohl(tvb, 4); + gboolean is_video = 0; + + /* ProtocolVersion > 18 include and extra field to declare IPv4 (0) / IPv6 (1) */ + if (hdr_version >= V18_MSG_TYPE) { + ipversion = tvb_get_letohl(tvb, offset); + ptvcursor_add(cursor, hf_skinny_ipv4or6, 4, ENC_LITTLE_ENDIAN); + } + if (ipversion == IPADDRTYPE_IPV4) { + guint32 ip_address; + src_addr.type = AT_IPv4; + src_addr.len = 4; + src_addr.data = (guint8 *)&ip_address; + ip_address = tvb_get_ipv4(tvb, offset); + rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset), 0, "Skinny", pinfo->fd->num, is_video, NULL); + ptvcursor_add(cursor, hfindex_ipv4, 4, ENC_BIG_ENDIAN); + if (hdr_version >= V18_MSG_TYPE) { + /* skip over the extra room for ipv6 addresses */ + ptvcursor_advance(cursor, 12); + } + } else if (ipversion == IPADDRTYPE_IPV6 || ipversion == IPADDRTYPE_IPV4_V6) { + struct e_in6_addr IPv6; + src_addr.type = AT_IPv6; + src_addr.len = 16; + src_addr.data = (guint16 *)&IPv6; + tvb_get_ipv6(tvb, offset, &IPv6); + rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset), 0, "Skinny", pinfo->fd->num, is_video, NULL); + ptvcursor_add(cursor, hfindex_ipv6, 16, ENC_BIG_ENDIAN); + } else { + /* Invalid : skip over ipv6 space completely */ + ptvcursor_advance(cursor, 16); + } +} + +static void +dissect_skinny_displayLabel(ptvcursor_t *cursor, int hfindex, guint32 length, guint32 maxlength) +{ + proto_item *item = NULL; + proto_tree *tree = ptvcursor_tree(cursor); + guint32 offset = ptvcursor_current_offset(cursor); + tvbuff_t *tvb = ptvcursor_tvbuff(cursor); + + const gchar *disp_string = NULL; + wmem_strbuf_t *wmem_new = NULL; + const gchar *replacestr = NULL; + guint x = 0; + guint append_replaced_str = 0; + + if (length == 0) { + length = tvb_strnlen(tvb, offset, -1) + 1; + } + if (length >= maxlength) { + length = maxlength; + } + + disp_string = (const gchar *) tvb_memdup(wmem_packet_scope(), tvb, offset, length); + item = proto_tree_add_item(tree, hfindex, tvb, offset, length, ENC_ASCII | ENC_NA); + + wmem_new = wmem_strbuf_sized_new(wmem_packet_scope(), strlen(disp_string), maxlength); + + while (*disp_string) { + replacestr = '\0'; + if (strlen(disp_string) > x+1) { + if (*disp_string == '\36') { + replacestr = try_val_to_str_ext(disp_string[x + 1], &DisplayLabels_36_ext); + } else if (*disp_string == '\200') { + replacestr = try_val_to_str_ext(disp_string[x + 1], &DisplayLabels_200_ext); + } + } + if (replacestr) { + disp_string++; x++; /* swallow replaced characters */ + wmem_strbuf_append(wmem_new, replacestr); + append_replaced_str = 1; + } else { + wmem_strbuf_append_c(wmem_new, *disp_string); + } + x++; + disp_string++; + } + + if (append_replaced_str) { + proto_item_append_text(item, " => \"%s\"" , wmem_strbuf_get_str(wmem_new)); + } + ptvcursor_advance(cursor, length); +} + +/*** Messages Handlers ***/ + +/* + * Message: RegisterMessage + * Opcode: 0x0001 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_RegisterMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_data_length = tvb_get_letohl(ptvcursor_tvbuff(cursor), 0); + + { + /* start struct : sid / size: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sid"); + ptvcursor_add(cursor, hf_skinny_DeviceName, 16, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_reserved_for_future_use, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_instance, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sid */ + } + ptvcursor_add(cursor, hf_skinny_stationIpAddr, 4, ENC_BIG_ENDIAN); + ptvcursor_add(cursor, hf_skinny_deviceType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxStreams, 4, ENC_LITTLE_ENDIAN); + if (hdr_data_length > 52) { + ptvcursor_add(cursor, hf_skinny_activeStreams, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_protocolVer, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "PhoneFeatures"); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_Bit1, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_Bit2, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_Bit3, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_Bit4, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_UTF8, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_Bit6, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_Bit7, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_DynamicMessages, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_Bit9, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_RFC2833, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_Bit11, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_Bit12, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_Bit13, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_Bit14, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_Bit15, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_PhoneFeatures_Abbreviated_Dial, 2, ENC_LITTLE_ENDIAN); + ptvcursor_advance(cursor, 2); + ptvcursor_pop_subtree(cursor); /* end bitfield: PhoneFeatures */ + ptvcursor_add(cursor, hf_skinny_maxConferences, 4, ENC_LITTLE_ENDIAN); + } + if (hdr_data_length > 100) { + ptvcursor_add(cursor, hf_skinny_activeConferences, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_macAddress, 6, ENC_NA); + ptvcursor_advance(cursor, 12 - 6); + ptvcursor_add(cursor, hf_skinny_ipV4AddressScope, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxNumberOfLines, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_stationIpV6Addr, 16, ENC_BIG_ENDIAN); + ptvcursor_add(cursor, hf_skinny_ipV6AddressScope, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_firmwareLoadName, 32, ENC_ASCII|ENC_NA); + } +} + +/* + * Message: IpPortMessage + * Opcode: 0x0002 + * Type: CallControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_IpPortMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_rtpMediaPort, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: KeypadButtonMessage + * Opcode: 0x0003 + * Type: CallControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_KeypadButtonMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_data_length = tvb_get_letohl(ptvcursor_tvbuff(cursor), 0); + + ptvcursor_add(cursor, hf_skinny_kpButton, 4, ENC_LITTLE_ENDIAN); + if (hdr_data_length > 8) { + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + } +} + +/* + * Message: EnblocCallMessage + * Opcode: 0x0004 + * Type: CallControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_EnblocCallMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + guint32 VariableDirnumSize = (hdr_version >= V18_MSG_TYPE) ? 25 : 24; + si->calledParty = g_strdup(tvb_format_stringzpad(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), VariableDirnumSize)); + ptvcursor_add(cursor, hf_skinny_calledParty, VariableDirnumSize, ENC_ASCII|ENC_NA); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StimulusMessage + * Opcode: 0x0005 + * Type: CallControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_StimulusMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_stimulus, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_stimulusStatus, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: OffHookMessage + * Opcode: 0x0006 + * Type: CallControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_OffHookMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_data_length = tvb_get_letohl(ptvcursor_tvbuff(cursor), 0); + + if (hdr_data_length > 4) { + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + } +} + +/* + * Message: OnHookMessage + * Opcode: 0x0007 + * Type: CallControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_OnHookMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_data_length = tvb_get_letohl(ptvcursor_tvbuff(cursor), 0); + + if (hdr_data_length > 4) { + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + } +} + +/* + * Message: HookFlashMessage + * Opcode: 0x0008 + * Type: CallControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_HookFlashMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: ForwardStatReqMessage + * Opcode: 0x0009 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_ForwardStatReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_lineNumber, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SpeedDialStatReqMessage + * Opcode: 0x000a + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_SpeedDialStatReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_speedDialNumber, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: LineStatReqMessage + * Opcode: 0x000b + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_LineStatReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_lineNumber, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: CapabilitiesRes + * Opcode: 0x0010 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_CapabilitiesRes(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 capCount = 0; + guint32 payloadCapability = 0; + capCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_capCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : caps / size: 16 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "caps [ref: capCount = %d, max:18]", capCount); + for (counter_1 = 0; counter_1 < 18; counter_1++) { + if (counter_1 < capCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "caps [%d / %d]", counter_1 + 1, capCount); + payloadCapability = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_payloadCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxFramesPerPacket, 4, ENC_LITTLE_ENDIAN); + if (payloadCapability == MEDIA_PAYLOAD_G7231) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_G7231"); + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 4); + } else if (payloadCapability == MEDIA_PAYLOAD_V150_LC_MODEMRELAY) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_v150_LC_ModemRelay"); + { + /* start struct : modemRelay / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "modemRelay"); + ptvcursor_add(cursor, hf_skinny_capAndVer, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_modAnd2833, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: modemRelay */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadCapability == MEDIA_PAYLOAD_V150_LC_SPRT) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_v150_LC_SPRT"); + { + /* start struct : sprtPayload / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sprtPayload"); + ptvcursor_add(cursor, hf_skinny_chan0MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan2MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan3MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan2MaxWindow, 2, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sprtPayload */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadCapability == MEDIA_PAYLOAD_V150_LC_SSE) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_v150_LC_SSE"); + { + /* start struct : sse / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sse"); + ptvcursor_add(cursor, hf_skinny_standard, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_vendor, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sse */ + } + ptvcursor_pop_subtree(cursor); + } else { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "any payloadCapability"); + { + /* start struct : codecParams / size: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "codecParams"); + ptvcursor_add(cursor, hf_skinny_codecMode, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dynamicPayload, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam1, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam2, 1, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: codecParams */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 4); + } + } else { + ptvcursor_advance(cursor, 16); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: caps */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: caps */ + } +} + +/* + * Message: AlarmMessage + * Opcode: 0x0020 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_AlarmMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_alarmSeverity, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_text, 80, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_parm1, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_parm2, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: MulticastMediaReceptionAckMessage + * Opcode: 0x0021 + * Type: MediaControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_MulticastMediaReceptionAckMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_receptionStatus, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: OpenReceiveChannelAckMessage + * Opcode: 0x0022 + * Type: MediaControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_OpenReceiveChannelAckMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_data_length = tvb_get_letohl(ptvcursor_tvbuff(cursor), 0); + + si->openreceiveStatus = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_openReceiveChannelStatus, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_ipAddr_ipv4, hf_skinny_ipAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_portNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + if (hdr_data_length > 20) { + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + } +} + +/* + * Message: ConnectionStatisticsResMessage + * Opcode: 0x0023 + * Type: CallControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_ConnectionStatisticsResMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_data_length = tvb_get_letohl(ptvcursor_tvbuff(cursor), 0); + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + guint32 VariableDirnumSize = (hdr_version >= V18_MSG_TYPE) ? 25 : 24; + guint32 dataSize = 0; + + ptvcursor_add(cursor, hf_skinny_directoryNum, VariableDirnumSize, ENC_ASCII|ENC_NA); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_statsProcessingMode, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberPacketsSent, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberOctetsSent, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberPacketsReceived, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberOctetsReceived, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberPacketsLost, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_jitter, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_latency, 4, ENC_LITTLE_ENDIAN); + if (hdr_data_length > 64) { + dataSize = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataSize, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_data, dataSize, ENC_ASCII|ENC_NA); + } +} + +/* + * Message: OffHookWithCgpnMessage + * Opcode: 0x0024 + * Type: CallControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_OffHookWithCgpnMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + guint32 VariableDirnumSize = (hdr_version >= V18_MSG_TYPE) ? 25 : 24; + ptvcursor_add(cursor, hf_skinny_callingPartyNumber, VariableDirnumSize, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_cgpnVoiceMailbox, VariableDirnumSize, ENC_ASCII|ENC_NA); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SoftKeyEventMessage + * Opcode: 0x0026 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_SoftKeyEventMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_softKeyEvent, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: UnregisterMessage + * Opcode: 0x0027 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_UnregisterMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_unRegReasonCode, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: RegisterTokenReq + * Opcode: 0x0029 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_RegisterTokenReq(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + { + /* start struct : sid / size: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sid"); + ptvcursor_add(cursor, hf_skinny_DeviceName, 16, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_reserved_for_future_use, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_instance, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sid */ + } + ptvcursor_add(cursor, hf_skinny_stationIpAddr, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_deviceType, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_stationIpV6Addr_ipv4, hf_skinny_stationIpV6Addr_ipv6, pinfo); +} + +/* + * Message: MediaTransmissionFailureMessage + * Opcode: 0x002a + * Type: MediaControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_MediaTransmissionFailureMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_remoteIpAddr_ipv4, hf_skinny_remoteIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_remotePortNumber, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: HeadsetStatusMessage + * Opcode: 0x002b + * Type: CallControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_HeadsetStatusMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_headsetStatus, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: MediaResourceNotificationMessage + * Opcode: 0x002c + * Type: MediaControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_MediaResourceNotificationMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_deviceType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberOfInServiceStreams, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxStreamsPerConf, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberOfOutOfServiceStreams, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: RegisterAvailableLinesMessage + * Opcode: 0x002d + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_RegisterAvailableLinesMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_maxNumOfAvailLines, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: DeviceToUserDataMessage + * Opcode: 0x002e + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_DeviceToUserDataMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 dataLength = 0; + { + /* start struct : deviceToUserData / size: 2020 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "deviceToUserData"); + ptvcursor_add(cursor, hf_skinny_applicationID, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_transactionID, 4, ENC_LITTLE_ENDIAN); + dataLength = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataLength, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_xml(cursor, hf_skinny_data, pinfo, dataLength, 2000); + ptvcursor_pop_subtree(cursor); + /* end struct: deviceToUserData */ + } +} + +/* + * Message: DeviceToUserDataResponseMessage + * Opcode: 0x002f + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_DeviceToUserDataResponseMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 dataLength = 0; + { + /* start struct : deviceToUserData / size: 2020 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "deviceToUserData"); + ptvcursor_add(cursor, hf_skinny_applicationID, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_transactionID, 4, ENC_LITTLE_ENDIAN); + dataLength = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataLength, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_xml(cursor, hf_skinny_data, pinfo, dataLength, 2000); + ptvcursor_pop_subtree(cursor); + /* end struct: deviceToUserData */ + } +} + +/* + * Message: UpdateCapabilitiesMessage + * Opcode: 0x0030 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_UpdateCapabilitiesMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 audioCapCount = 0; + guint32 videoCapCount = 0; + guint32 dataCapCount = 0; + guint32 customPictureFormatCount = 0; + guint32 serviceResourceCount = 0; + guint32 layoutCount = 0; + guint32 payloadCapability = 0; + guint32 levelPreferenceCount = 0; + audioCapCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_audioCapCount, 4, ENC_LITTLE_ENDIAN); + videoCapCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_videoCapCount, 4, ENC_LITTLE_ENDIAN); + dataCapCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataCapCount, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_RTPPayloadFormat, 4, ENC_LITTLE_ENDIAN); + customPictureFormatCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_customPictureFormatCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : customPictureFormat / size: 20 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "customPictureFormat [ref: customPictureFormatCount = %d, max:6]", customPictureFormatCount); + for (counter_1 = 0; counter_1 < 6; counter_1++) { + if (counter_1 < customPictureFormatCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "customPictureFormat [%d / %d]", counter_1 + 1, customPictureFormatCount); + ptvcursor_add(cursor, hf_skinny_pictureWidth, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_pictureHeight, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_pixelAspectRatio, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_clockConversionCode, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_clockDivisor, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 20); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: customPictureFormat */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: customPictureFormat */ + } + { + /* start struct : confResources / size: 36 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "confResources"); + ptvcursor_add(cursor, hf_skinny_activeStreamsOnRegistration, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxBW, 4, ENC_LITTLE_ENDIAN); + serviceResourceCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_serviceResourceCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : serviceResource / size: 24 */ + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "serviceResource [ref: serviceResourceCount = %d, max:4]", serviceResourceCount); + for (counter_2 = 0; counter_2 < 4; counter_2++) { + if (counter_2 < serviceResourceCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "serviceResource [%d / %d]", counter_2 + 1, serviceResourceCount); + layoutCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_layoutCount, 4, ENC_LITTLE_ENDIAN); + { + guint32 counter_5 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "layouts [ref: layoutCount = %d, max:5]", layoutCount); + for (counter_5 = 0; counter_5 < 5; counter_5++) { + if (counter_5 < layoutCount) { + ptvcursor_add(cursor, hf_skinny_layouts, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 4); + } + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: layouts */ + } + ptvcursor_add(cursor, hf_skinny_serviceNum, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxStreams, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxConferences, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_activeConferenceOnRegistration, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 24); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: serviceResource */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: serviceResource */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: confResources */ + } + { + /* start struct : audiocaps / size: 16 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "audiocaps [ref: audioCapCount = %d, max:18]", audioCapCount); + for (counter_1 = 0; counter_1 < 18; counter_1++) { + if (counter_1 < audioCapCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "audiocaps [%d / %d]", counter_1 + 1, audioCapCount); + payloadCapability = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_payloadCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxFramesPerPacket, 4, ENC_LITTLE_ENDIAN); + if (payloadCapability == MEDIA_PAYLOAD_G7231) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_G7231"); + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 4); + } else if (payloadCapability == MEDIA_PAYLOAD_V150_LC_MODEMRELAY) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_v150_LC_ModemRelay"); + { + /* start struct : modemRelay / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "modemRelay"); + ptvcursor_add(cursor, hf_skinny_capAndVer, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_modAnd2833, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: modemRelay */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadCapability == MEDIA_PAYLOAD_V150_LC_SPRT) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_v150_LC_SPRT"); + { + /* start struct : sprtPayload / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sprtPayload"); + ptvcursor_add(cursor, hf_skinny_chan0MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan2MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan3MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan2MaxWindow, 2, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sprtPayload */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadCapability == MEDIA_PAYLOAD_V150_LC_SSE) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_v150_LC_SSE"); + { + /* start struct : sse / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sse"); + ptvcursor_add(cursor, hf_skinny_standard, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_vendor, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sse */ + } + ptvcursor_pop_subtree(cursor); + } else { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "any payloadCapability"); + { + /* start struct : codecParams / size: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "codecParams"); + ptvcursor_add(cursor, hf_skinny_codecMode, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dynamicPayload, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam1, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam2, 1, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: codecParams */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 4); + } + } else { + ptvcursor_advance(cursor, 16); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: audiocaps */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: audiocaps */ + } + { + /* start struct : vidCaps / size: 44 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "vidCaps [ref: videoCapCount = %d, max:10]", videoCapCount); + for (counter_1 = 0; counter_1 < 10; counter_1++) { + if (counter_1 < videoCapCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "vidCaps [%d / %d]", counter_1 + 1, videoCapCount); + payloadCapability = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_payloadCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_videoCapabilityDirection, 4, ENC_LITTLE_ENDIAN); + levelPreferenceCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_levelPreferenceCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : levelPreference / size: 24 */ + guint32 counter_4 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "levelPreference [ref: levelPreferenceCount = %d, max:4]", levelPreferenceCount); + for (counter_4 = 0; counter_4 < 4; counter_4++) { + if (counter_4 < levelPreferenceCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "levelPreference [%d / %d]", counter_4 + 1, levelPreferenceCount); + ptvcursor_add(cursor, hf_skinny_transmitPreference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_format, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxBitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_minBitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_MPI, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_serviceNumber, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 24); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: levelPreference */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: levelPreference */ + } + if (payloadCapability == MEDIA_PAYLOAD_H261) { + /* start union : capability / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_H261"); + { + /* start struct : h261VideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h261VideoCapability"); + ptvcursor_add(cursor, hf_skinny_temporalSpatialTradeOffCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_stillImageTransmission, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h261VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadCapability == MEDIA_PAYLOAD_H263) { + /* start union : capability / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_H263"); + { + /* start struct : h263VideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h263VideoCapability"); + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h263_capability_bitfield"); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit1, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit2, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit3, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit4, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit5, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit6, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit7, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit8, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit9, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit10, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit11, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit12, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit13, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit14, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit15, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit16, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit17, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit18, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit19, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit20, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit21, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit22, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit23, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit24, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit25, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit26, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit27, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit28, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit29, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit30, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit31, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit32, 4, ENC_LITTLE_ENDIAN); + ptvcursor_advance(cursor, 4); + ptvcursor_pop_subtree(cursor); /* end bitfield: h263_capability_bitfield */ + ptvcursor_add(cursor, hf_skinny_annexNandWFutureUse, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h263VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadCapability == MEDIA_PAYLOAD_VIEO) { + /* start union : capability / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_Vieo"); + { + /* start struct : vieoVideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "vieoVideoCapability"); + ptvcursor_add(cursor, hf_skinny_modelNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_bandwidth, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: vieoVideoCapability */ + } + ptvcursor_pop_subtree(cursor); + } + } else { + ptvcursor_advance(cursor, 44); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: vidCaps */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: vidCaps */ + } + { + /* start struct : dataCaps / size: 16 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "dataCaps [ref: dataCapCount = %d, max:5]", dataCapCount); + for (counter_1 = 0; counter_1 < 5; counter_1++) { + if (counter_1 < dataCapCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "dataCaps [%d / %d]", counter_1 + 1, dataCapCount); + ptvcursor_add(cursor, hf_skinny_payloadCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dataCapabilityDirection, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_protocolDependentData, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxBitRate, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 16); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: dataCaps */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: dataCaps */ + } +} + +/* + * Message: OpenMultiMediaReceiveChannelAckMessage + * Opcode: 0x0031 + * Type: MediaControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_OpenMultiMediaReceiveChannelAckMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_multimediaOpenReceiveChannelStatus, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_ipAddr_ipv4, hf_skinny_ipAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_portNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: ClearConferenceMessage + * Opcode: 0x0032 + * Type: Conference + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_ClearConferenceMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_serviceNum, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: ServiceURLStatReqMessage + * Opcode: 0x0033 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_ServiceURLStatReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_serviceURLIndex, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: FeatureStatReqMessage + * Opcode: 0x0034 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_FeatureStatReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_featureIndex, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_featureCapabilities, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: CreateConferenceResMessage + * Opcode: 0x0035 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_CreateConferenceResMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 dataLength = 0; + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_result, 4, ENC_LITTLE_ENDIAN); + dataLength = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataLength, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruData, dataLength, ENC_ASCII|ENC_NA); +} + +/* + * Message: DeleteConferenceResMessage + * Opcode: 0x0036 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_DeleteConferenceResMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_delete_conf_result, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: ModifyConferenceResMessage + * Opcode: 0x0037 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_ModifyConferenceResMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 dataLength = 0; + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_modify_conf_result, 4, ENC_LITTLE_ENDIAN); + dataLength = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataLength, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruData, dataLength, ENC_ASCII|ENC_NA); +} + +/* + * Message: AddParticipantResMessage + * Opcode: 0x0038 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_AddParticipantResMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_add_participant_result, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_bridgeParticipantId, 257, ENC_ASCII|ENC_NA); +} + +/* + * Message: AuditConferenceResMessage + * Opcode: 0x0039 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_AuditConferenceResMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 numberOfEntries = 0; + ptvcursor_add(cursor, hf_skinny_last, 4, ENC_LITTLE_ENDIAN); + numberOfEntries = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_numberOfEntries, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : conferenceEntry / size: 76 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "conferenceEntry [ref: numberOfEntries = %d, max:32]", numberOfEntries); + for (counter_1 = 0; counter_1 < 32; counter_1++) { + if (counter_1 < numberOfEntries) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "conferenceEntry [%d / %d]", counter_1 + 1, numberOfEntries); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_resourceType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberOfReservedParticipants, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberOfActiveParticipants, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_appID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_appConfID, 32, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_appData, 24, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 76); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: conferenceEntry */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: conferenceEntry */ + } +} + +/* + * Message: AuditParticipantResMessage + * Opcode: 0x0040 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_AuditParticipantResMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 numberOfEntries = 0; + ptvcursor_add(cursor, hf_skinny_audit_participant_result, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_last, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + numberOfEntries = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_numberOfEntries, 4, ENC_LITTLE_ENDIAN); + { + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "participantEntry [ref: numberOfEntries = %d, max:256]", numberOfEntries); + for (counter_1 = 0; counter_1 < 256; counter_1++) { + if (counter_1 < numberOfEntries) { + ptvcursor_add(cursor, hf_skinny_participantEntry, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 4); + } + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: participantEntry */ + } +} + +/* + * Message: DeviceToUserDataMessageVersion1 + * Opcode: 0x0041 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_DeviceToUserDataMessageVersion1(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 dataLength = 0; + { + /* start struct : deviceToUserDataVersion1 / size: 2040 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "deviceToUserDataVersion1"); + ptvcursor_add(cursor, hf_skinny_applicationID, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_transactionID, 4, ENC_LITTLE_ENDIAN); + dataLength = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataLength, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_sequenceFlag, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_displayPriority, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_appInstanceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_routingID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_xml(cursor, hf_skinny_data, pinfo, dataLength, 2000); + ptvcursor_pop_subtree(cursor); + /* end struct: deviceToUserDataVersion1 */ + } +} + +/* + * Message: DeviceToUserDataResponseMessageVersion1 + * Opcode: 0x0042 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_DeviceToUserDataResponseMessageVersion1(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 dataLength = 0; + { + /* start struct : deviceToUserDataVersion1 / size: 2040 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "deviceToUserDataVersion1"); + ptvcursor_add(cursor, hf_skinny_applicationID, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_transactionID, 4, ENC_LITTLE_ENDIAN); + dataLength = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataLength, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_sequenceFlag, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_displayPriority, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_appInstanceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_routingID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_xml(cursor, hf_skinny_data, pinfo, dataLength, 2000); + ptvcursor_pop_subtree(cursor); + /* end struct: deviceToUserDataVersion1 */ + } +} + +/* + * Message: UpdateCapabilitiesV2Message + * Opcode: 0x0043 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_UpdateCapabilitiesV2Message(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 audioCapCount = 0; + guint32 videoCapCount = 0; + guint32 dataCapCount = 0; + guint32 customPictureFormatCount = 0; + guint32 serviceResourceCount = 0; + guint32 layoutCount = 0; + guint32 payloadCapability = 0; + guint32 levelPreferenceCount = 0; + audioCapCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_audioCapCount, 4, ENC_LITTLE_ENDIAN); + videoCapCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_videoCapCount, 4, ENC_LITTLE_ENDIAN); + dataCapCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataCapCount, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_RTPPayloadFormat, 4, ENC_LITTLE_ENDIAN); + customPictureFormatCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_customPictureFormatCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : customPictureFormat / size: 20 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "customPictureFormat [ref: customPictureFormatCount = %d, max:6]", customPictureFormatCount); + for (counter_1 = 0; counter_1 < 6; counter_1++) { + if (counter_1 < customPictureFormatCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "customPictureFormat [%d / %d]", counter_1 + 1, customPictureFormatCount); + ptvcursor_add(cursor, hf_skinny_pictureWidth, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_pictureHeight, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_pixelAspectRatio, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_clockConversionCode, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_clockDivisor, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 20); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: customPictureFormat */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: customPictureFormat */ + } + { + /* start struct : confResources / size: 36 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "confResources"); + ptvcursor_add(cursor, hf_skinny_activeStreamsOnRegistration, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxBW, 4, ENC_LITTLE_ENDIAN); + serviceResourceCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_serviceResourceCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : serviceResource / size: 24 */ + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "serviceResource [ref: serviceResourceCount = %d, max:4]", serviceResourceCount); + for (counter_2 = 0; counter_2 < 4; counter_2++) { + if (counter_2 < serviceResourceCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "serviceResource [%d / %d]", counter_2 + 1, serviceResourceCount); + layoutCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_layoutCount, 4, ENC_LITTLE_ENDIAN); + { + guint32 counter_5 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "layouts [ref: layoutCount = %d, max:5]", layoutCount); + for (counter_5 = 0; counter_5 < 5; counter_5++) { + if (counter_5 < layoutCount) { + ptvcursor_add(cursor, hf_skinny_layouts, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 4); + } + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: layouts */ + } + ptvcursor_add(cursor, hf_skinny_serviceNum, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxStreams, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxConferences, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_activeConferenceOnRegistration, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 24); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: serviceResource */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: serviceResource */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: confResources */ + } + { + /* start struct : audiocaps / size: 16 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "audiocaps [ref: audioCapCount = %d, max:18]", audioCapCount); + for (counter_1 = 0; counter_1 < 18; counter_1++) { + if (counter_1 < audioCapCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "audiocaps [%d / %d]", counter_1 + 1, audioCapCount); + payloadCapability = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_payloadCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxFramesPerPacket, 4, ENC_LITTLE_ENDIAN); + if (payloadCapability == MEDIA_PAYLOAD_G7231) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_G7231"); + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 4); + } else if (payloadCapability == MEDIA_PAYLOAD_V150_LC_MODEMRELAY) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_v150_LC_ModemRelay"); + { + /* start struct : modemRelay / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "modemRelay"); + ptvcursor_add(cursor, hf_skinny_capAndVer, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_modAnd2833, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: modemRelay */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadCapability == MEDIA_PAYLOAD_V150_LC_SPRT) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_v150_LC_SPRT"); + { + /* start struct : sprtPayload / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sprtPayload"); + ptvcursor_add(cursor, hf_skinny_chan0MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan2MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan3MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan2MaxWindow, 2, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sprtPayload */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadCapability == MEDIA_PAYLOAD_V150_LC_SSE) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_v150_LC_SSE"); + { + /* start struct : sse / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sse"); + ptvcursor_add(cursor, hf_skinny_standard, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_vendor, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sse */ + } + ptvcursor_pop_subtree(cursor); + } else { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "any payloadCapability"); + { + /* start struct : codecParams / size: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "codecParams"); + ptvcursor_add(cursor, hf_skinny_codecMode, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dynamicPayload, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam1, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam2, 1, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: codecParams */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 4); + } + } else { + ptvcursor_advance(cursor, 16); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: audiocaps */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: audiocaps */ + } + { + /* start struct : vidCaps / size: 60 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "vidCaps [ref: videoCapCount = %d, max:10]", videoCapCount); + for (counter_1 = 0; counter_1 < 10; counter_1++) { + if (counter_1 < videoCapCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "vidCaps [%d / %d]", counter_1 + 1, videoCapCount); + payloadCapability = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_payloadCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_videoCapabilityDirection, 4, ENC_LITTLE_ENDIAN); + levelPreferenceCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_levelPreferenceCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : levelPreference / size: 24 */ + guint32 counter_4 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "levelPreference [ref: levelPreferenceCount = %d, max:4]", levelPreferenceCount); + for (counter_4 = 0; counter_4 < 4; counter_4++) { + if (counter_4 < levelPreferenceCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "levelPreference [%d / %d]", counter_4 + 1, levelPreferenceCount); + ptvcursor_add(cursor, hf_skinny_transmitPreference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_format, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxBitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_minBitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_MPI, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_serviceNumber, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 24); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: levelPreference */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: levelPreference */ + } + if (payloadCapability == MEDIA_PAYLOAD_H261) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_H261"); + { + /* start struct : h261VideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h261VideoCapability"); + ptvcursor_add(cursor, hf_skinny_temporalSpatialTradeOffCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_stillImageTransmission, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h261VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 16); + } else if (payloadCapability == MEDIA_PAYLOAD_H263) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_H263"); + { + /* start struct : h263VideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h263VideoCapability"); + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h263_capability_bitfield"); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit1, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit2, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit3, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit4, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit5, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit6, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit7, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit8, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit9, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit10, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit11, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit12, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit13, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit14, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit15, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit16, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit17, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit18, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit19, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit20, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit21, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit22, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit23, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit24, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit25, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit26, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit27, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit28, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit29, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit30, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit31, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit32, 4, ENC_LITTLE_ENDIAN); + ptvcursor_advance(cursor, 4); + ptvcursor_pop_subtree(cursor); /* end bitfield: h263_capability_bitfield */ + ptvcursor_add(cursor, hf_skinny_annexNandWFutureUse, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h263VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 16); + } else if (payloadCapability == MEDIA_PAYLOAD_H264) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_H264"); + { + /* start struct : h264VideoCapability / size: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h264VideoCapability"); + ptvcursor_add(cursor, hf_skinny_profile, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_level, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxMBPS, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxFS, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxDPB, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxBRandCPB, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h264VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadCapability == MEDIA_PAYLOAD_VIEO) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_Vieo"); + { + /* start struct : vieoVideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "vieoVideoCapability"); + ptvcursor_add(cursor, hf_skinny_modelNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_bandwidth, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: vieoVideoCapability */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 16); + } + } else { + ptvcursor_advance(cursor, 60); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: vidCaps */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: vidCaps */ + } + { + /* start struct : dataCaps / size: 16 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "dataCaps [ref: dataCapCount = %d, max:5]", dataCapCount); + for (counter_1 = 0; counter_1 < 5; counter_1++) { + if (counter_1 < dataCapCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "dataCaps [%d / %d]", counter_1 + 1, dataCapCount); + ptvcursor_add(cursor, hf_skinny_payloadCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dataCapabilityDirection, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_protocolDependentData, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxBitRate, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 16); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: dataCaps */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: dataCaps */ + } +} + +/* + * Message: UpdateCapabilitiesV3Message + * Opcode: 0x0044 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: yes + */ +static void +handle_UpdateCapabilitiesV3Message(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 audioCapCount = 0; + guint32 videoCapCount = 0; + guint32 dataCapCount = 0; + guint32 customPictureFormatCount = 0; + guint32 serviceResourceCount = 0; + guint32 layoutCount = 0; + guint32 payloadCapability = 0; + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + guint32 levelPreferenceCount = 0; + audioCapCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_audioCapCount, 4, ENC_LITTLE_ENDIAN); + videoCapCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_videoCapCount, 4, ENC_LITTLE_ENDIAN); + dataCapCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataCapCount, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_RTPPayloadFormat, 4, ENC_LITTLE_ENDIAN); + customPictureFormatCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_customPictureFormatCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : customPictureFormat / size: 20 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "customPictureFormat [ref: customPictureFormatCount = %d, max:customPictureFormatCount]", customPictureFormatCount); + for (counter_1 = 0; counter_1 < customPictureFormatCount; counter_1++) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "customPictureFormat [%d / %d]", counter_1 + 1, customPictureFormatCount); + ptvcursor_add(cursor, hf_skinny_pictureWidth, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_pictureHeight, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_pixelAspectRatio, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_clockConversionCode, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_clockDivisor, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end for loop tree: customPictureFormat */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: customPictureFormat */ + } + { + /* start struct : confResources / size: 36 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "confResources"); + ptvcursor_add(cursor, hf_skinny_activeStreamsOnRegistration, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxBW, 4, ENC_LITTLE_ENDIAN); + serviceResourceCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_serviceResourceCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : serviceResource / size: 24 */ + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "serviceResource [ref: serviceResourceCount = %d, max:serviceResourceCount]", serviceResourceCount); + for (counter_2 = 0; counter_2 < serviceResourceCount; counter_2++) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "serviceResource [%d / %d]", counter_2 + 1, serviceResourceCount); + layoutCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_layoutCount, 4, ENC_LITTLE_ENDIAN); + { + guint32 counter_4 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "layouts [ref: layoutCount = %d, max:layoutCount]", layoutCount); + for (counter_4 = 0; counter_4 < layoutCount; counter_4++) { + ptvcursor_add(cursor, hf_skinny_layouts, 4, ENC_LITTLE_ENDIAN); + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: layouts */ + } + ptvcursor_add(cursor, hf_skinny_serviceNum, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxStreams, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxConferences, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_activeConferenceOnRegistration, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end for loop tree: serviceResource */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: serviceResource */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: confResources */ + } + { + /* start struct : audiocaps / size: 16 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "audiocaps [ref: audioCapCount = %d, max:audioCapCount]", audioCapCount); + for (counter_1 = 0; counter_1 < audioCapCount; counter_1++) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "audiocaps [%d / %d]", counter_1 + 1, audioCapCount); + payloadCapability = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_payloadCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxFramesPerPacket, 4, ENC_LITTLE_ENDIAN); + if (payloadCapability == MEDIA_PAYLOAD_G7231) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_G7231"); + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 4); + } else if (payloadCapability == MEDIA_PAYLOAD_V150_LC_MODEMRELAY) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_v150_LC_ModemRelay"); + { + /* start struct : modemRelay / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "modemRelay"); + ptvcursor_add(cursor, hf_skinny_capAndVer, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_modAnd2833, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: modemRelay */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadCapability == MEDIA_PAYLOAD_V150_LC_SPRT) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_v150_LC_SPRT"); + { + /* start struct : sprtPayload / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sprtPayload"); + ptvcursor_add(cursor, hf_skinny_chan0MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan2MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan3MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan2MaxWindow, 2, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sprtPayload */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadCapability == MEDIA_PAYLOAD_V150_LC_SSE) { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_v150_LC_SSE"); + { + /* start struct : sse / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sse"); + ptvcursor_add(cursor, hf_skinny_standard, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_vendor, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sse */ + } + ptvcursor_pop_subtree(cursor); + } else { + /* start union : PAYLOADS / maxsize: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "any payloadCapability"); + { + /* start struct : codecParams / size: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "codecParams"); + ptvcursor_add(cursor, hf_skinny_codecMode, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dynamicPayload, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam1, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam2, 1, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: codecParams */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 4); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: audiocaps */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: audiocaps */ + } + { + /* start struct : vidCaps / size: 72 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "vidCaps [ref: videoCapCount = %d, max:videoCapCount]", videoCapCount); + for (counter_1 = 0; counter_1 < videoCapCount; counter_1++) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "vidCaps [%d / %d]", counter_1 + 1, videoCapCount); + payloadCapability = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_payloadCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_videoCapabilityDirection, 4, ENC_LITTLE_ENDIAN); + levelPreferenceCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_levelPreferenceCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : levelPreference / size: 24 */ + guint32 counter_3 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "levelPreference [ref: levelPreferenceCount = %d, max:levelPreferenceCount]", levelPreferenceCount); + for (counter_3 = 0; counter_3 < levelPreferenceCount; counter_3++) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "levelPreference [%d / %d]", counter_3 + 1, levelPreferenceCount); + ptvcursor_add(cursor, hf_skinny_transmitPreference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_format, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxBitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_minBitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_MPI, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_serviceNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end for loop tree: levelPreference */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: levelPreference */ + } + ptvcursor_add(cursor, hf_skinny_encryptionCapability, 4, ENC_LITTLE_ENDIAN); + if (payloadCapability == MEDIA_PAYLOAD_H261) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_H261"); + { + /* start struct : h261VideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h261VideoCapability"); + ptvcursor_add(cursor, hf_skinny_temporalSpatialTradeOffCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_stillImageTransmission, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h261VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 16); + } else if (payloadCapability == MEDIA_PAYLOAD_H263) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_H263"); + { + /* start struct : h263VideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h263VideoCapability"); + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h263_capability_bitfield"); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit1, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit2, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit3, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit4, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit5, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit6, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit7, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit8, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit9, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit10, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit11, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit12, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit13, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit14, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit15, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit16, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit17, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit18, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit19, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit20, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit21, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit22, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit23, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit24, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit25, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit26, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit27, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit28, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit29, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit30, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit31, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit32, 4, ENC_LITTLE_ENDIAN); + ptvcursor_advance(cursor, 4); + ptvcursor_pop_subtree(cursor); /* end bitfield: h263_capability_bitfield */ + ptvcursor_add(cursor, hf_skinny_annexNandWFutureUse, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h263VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 16); + } else if (payloadCapability == MEDIA_PAYLOAD_H264) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_H264"); + { + /* start struct : h264VideoCapability / size: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h264VideoCapability"); + ptvcursor_add(cursor, hf_skinny_profile, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_level, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxMBPS, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxFS, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxDPB, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxBRandCPB, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h264VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadCapability == MEDIA_PAYLOAD_VIEO) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadCapability is Media_Payload_Vieo"); + { + /* start struct : vieoVideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "vieoVideoCapability"); + ptvcursor_add(cursor, hf_skinny_modelNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_bandwidth, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: vieoVideoCapability */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 16); + } + ptvcursor_add(cursor, hf_skinny_ipAddressingMode, 4, ENC_LITTLE_ENDIAN); + if (hdr_version >= V16_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_ipAddressingMode, 4, ENC_LITTLE_ENDIAN); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: vidCaps */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: vidCaps */ + } + { + /* start struct : dataCaps / size: 20 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "dataCaps [ref: dataCapCount = %d, max:dataCapCount]", dataCapCount); + for (counter_1 = 0; counter_1 < dataCapCount; counter_1++) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "dataCaps [%d / %d]", counter_1 + 1, dataCapCount); + ptvcursor_add(cursor, hf_skinny_payloadCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dataCapabilityDirection, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_protocolDependentData, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxBitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_encryptionCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end for loop tree: dataCaps */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: dataCaps */ + } +} + +/* + * Message: PortResMessage + * Opcode: 0x0045 + * Type: MediaControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_PortResMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_ipAddr_ipv4, hf_skinny_ipAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_portNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_RTCPPortNumber, 4, ENC_LITTLE_ENDIAN); + if (hdr_version >= V19_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_mediaType, 4, ENC_LITTLE_ENDIAN); + } +} + +/* + * Message: QoSResvNotifyMessage + * Opcode: 0x0046 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_QoSResvNotifyMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_remoteIpAddr_ipv4, hf_skinny_remoteIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_remotePortNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_direction, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: QoSErrorNotifyMessage + * Opcode: 0x0047 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_QoSErrorNotifyMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_remoteIpAddr_ipv4, hf_skinny_remoteIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_remotePortNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_direction, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_errorCode, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_failureNodeIpAddr, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_rsvpErrorCode, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_rsvpErrorSubCodeVal, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_rsvpErrorFlag, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SubscriptionStatReqMessage + * Opcode: 0x0048 + * Type: CallControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_SubscriptionStatReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_transactionID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_featureID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_timer, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_subscriptionID, 256, ENC_ASCII|ENC_NA); +} + +/* + * Message: MediaPathEventMessage + * Opcode: 0x0049 + * Type: CallControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_MediaPathEventMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_mediaPathID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_mediaPathEvent, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: MediaPathCapabilityMessage + * Opcode: 0x004a + * Type: CallControl + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_MediaPathCapabilityMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_mediaPathID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_mediaPathCapabilities, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: MwiNotificationMessage + * Opcode: 0x004c + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_MwiNotificationMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_mwiTargetNumber, 25, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_mwiControlNumber, 25, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_areMessagesWaiting, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : totalVmCounts / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "totalVmCounts"); + ptvcursor_add(cursor, hf_skinny_numNewMsgs, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numOldMsgs, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: totalVmCounts */ + } + { + /* start struct : priorityVmCounts / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "priorityVmCounts"); + ptvcursor_add(cursor, hf_skinny_numNewMsgs, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numOldMsgs, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: priorityVmCounts */ + } + { + /* start struct : totalFaxCounts / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "totalFaxCounts"); + ptvcursor_add(cursor, hf_skinny_numNewMsgs, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numOldMsgs, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: totalFaxCounts */ + } + { + /* start struct : priorityFaxCounts / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "priorityFaxCounts"); + ptvcursor_add(cursor, hf_skinny_numNewMsgs, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numOldMsgs, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: priorityFaxCounts */ + } +} + +/* + * Message: RegisterAckMessage + * Opcode: 0x0081 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_RegisterAckMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_keepAliveInterval, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dateTemplate, 6, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_alignmentPadding, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_secondaryKeepAliveInterval, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxProtocolVer, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StartToneMessage + * Opcode: 0x0082 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_StartToneMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_tone, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_tone_output_direction, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StopToneMessage + * Opcode: 0x0083 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_StopToneMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + if (hdr_version >= V11_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_tone, 4, ENC_LITTLE_ENDIAN); + } +} + +/* + * Message: SetRingerMessage + * Opcode: 0x0085 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SetRingerMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_ringMode, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_ringDuration, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SetLampMessage + * Opcode: 0x0086 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SetLampMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_stimulus, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_stimulusInstance, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_lampMode, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SetSpeakerModeMessage + * Opcode: 0x0088 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SetSpeakerModeMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_speakerMode, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SetMicroModeMessage + * Opcode: 0x0089 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SetMicroModeMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_micMode, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StartMediaTransmissionMessage + * Opcode: 0x008a + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_StartMediaTransmissionMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + guint32 compressionType = 0; + guint16 keylen = 0; + guint16 saltlen = 0; + + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_remoteIpAddr_ipv4, hf_skinny_remoteIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_remotePortNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_millisecondPacketSize, 4, ENC_LITTLE_ENDIAN); + compressionType = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_compressionType, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : qualifierOut / size: 18 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "qualifierOut"); + ptvcursor_add(cursor, hf_skinny_precedenceValue, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_ssValue, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxFramesPerPacket, 2, ENC_LITTLE_ENDIAN); + if (hdr_version <= V10_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + } + if (hdr_version >= V11_MSG_TYPE && hdr_version <= V15_MSG_TYPE) { + if (compressionType == MEDIA_PAYLOAD_G7231) { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "compressionType is Media_Payload_G7231"); + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + } else { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "any compressionType"); + { + /* start struct : codecParams / size: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "codecParams"); + ptvcursor_add(cursor, hf_skinny_codecMode, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dynamicPayload, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam1, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam2, 1, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: codecParams */ + } + ptvcursor_pop_subtree(cursor); + } + } + ptvcursor_pop_subtree(cursor); + /* end struct: qualifierOut */ + } + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : mTxMediaEncryptionKeyInfo / size: 18 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "mTxMediaEncryptionKeyInfo"); + ptvcursor_add(cursor, hf_skinny_algorithmID, 4, ENC_LITTLE_ENDIAN); + keylen = tvb_get_letohs(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_keylen, 2, ENC_LITTLE_ENDIAN); + saltlen = tvb_get_letohs(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_saltlen, 2, ENC_LITTLE_ENDIAN); + { + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "key [ref: keylen = %d, max:16]", keylen); + for (counter_2 = 0; counter_2 < 16; counter_2++) { + if (counter_2 < keylen) { + ptvcursor_add(cursor, hf_skinny_key, 1, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 1); + } + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: key */ + } + { + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "salt [ref: saltlen = %d, max:16]", saltlen); + for (counter_2 = 0; counter_2 < 16; counter_2++) { + if (counter_2 < saltlen) { + ptvcursor_add(cursor, hf_skinny_salt, 1, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 1); + } + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: salt */ + } + ptvcursor_add(cursor, hf_skinny_isMKIPresent, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_keyDerivationRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: mTxMediaEncryptionKeyInfo */ + } + ptvcursor_add(cursor, hf_skinny_streamPassThroughID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_associatedStreamID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_RFC2833PayloadType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dtmfType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_mixingMode, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_partyDirection, 4, ENC_LITTLE_ENDIAN); + if (hdr_version >= V20_MSG_TYPE) { + { + /* start struct : latentCapsInfo / size: 36 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "latentCapsInfo"); + ptvcursor_add(cursor, hf_skinny_active, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : modemRelay / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "modemRelay"); + ptvcursor_add(cursor, hf_skinny_capAndVer, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_modAnd2833, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: modemRelay */ + } + { + /* start struct : sprtPayload / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sprtPayload"); + ptvcursor_add(cursor, hf_skinny_chan0MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan2MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan3MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan2MaxWindow, 2, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sprtPayload */ + } + { + /* start struct : sse / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sse"); + ptvcursor_add(cursor, hf_skinny_standard, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_vendor, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sse */ + } + { + /* start struct : payloadParam / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadParam"); + ptvcursor_add(cursor, hf_skinny_nse, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_rfc2833, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_sse, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_v150sprt, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_noaudio, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_FutureUse1, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_FutureUse2, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_FutureUse3, 1, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: payloadParam */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: latentCapsInfo */ + } + } +} + +/* + * Message: StopMediaTransmissionMessage + * Opcode: 0x008b + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_StopMediaTransmissionMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_portHandlingFlag, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: CallInfoMessage + * Opcode: 0x008f + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_CallInfoMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_callingPartyName, 40, ENC_ASCII|ENC_NA); + si->callingParty = g_strdup(tvb_format_stringzpad(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), 24)); + ptvcursor_add(cursor, hf_skinny_callingParty, 24, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_calledPartyName, 40, ENC_ASCII|ENC_NA); + si->calledParty = g_strdup(tvb_format_stringzpad(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), 24)); + ptvcursor_add(cursor, hf_skinny_calledParty, 24, ENC_ASCII|ENC_NA); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_callType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_originalCalledPartyName, 40, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_originalCalledParty, 24, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_lastRedirectingPartyName, 40, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_lastRedirectingParty, 24, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_originalCdpnRedirectReason, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_lastRedirectingReason, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_cgpnVoiceMailbox, 24, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_cdpnVoiceMailbox, 24, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_originalCdpnVoiceMailbox, 24, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_lastRedirectingVoiceMailbox, 24, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_callInstance, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_callSecurityStatus, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "partyPIRestrictionBits"); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CallingPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CallingPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CallingParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CalledPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CalledPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CalledParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_OriginalCalledPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_OriginalCalledPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_OriginalCalledParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_LastRedirectPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_LastRedirectPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_LastRedirectParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_BitsReserved, 4, ENC_LITTLE_ENDIAN); + ptvcursor_advance(cursor, 4); + ptvcursor_pop_subtree(cursor); /* end bitfield: partyPIRestrictionBits */ +} + +/* + * Message: ForwardStatMessage + * Opcode: 0x0090 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_ForwardStatMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + guint32 VariableDirnumSize = (hdr_version >= V18_MSG_TYPE) ? 25 : 24; + ptvcursor_add(cursor, hf_skinny_activeForward, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_lineNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_forwardAllActive, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_forwardAllDirnum, VariableDirnumSize, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_forwardBusyActive, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_forwardBusyDirnum, VariableDirnumSize, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_forwardNoAnswerActive, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_forwardNoAnswerlDirnum, VariableDirnumSize, ENC_ASCII|ENC_NA); +} + +/* + * Message: SpeedDialStatMessage + * Opcode: 0x0091 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SpeedDialStatMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_speedDialNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_speedDialDirNumber, 24, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_speedDialDisplayName, 40, ENC_ASCII|ENC_NA); +} + +/* + * Message: LineStatMessage + * Opcode: 0x0092 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_LineStatMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_lineNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_lineDirNumber, 24, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_lineFullyQualifiedDisplayName, 40, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_lineTextLabel, 40, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_lineDisplayOptions, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: ConfigStatMessage + * Opcode: 0x0093 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_ConfigStatMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + { + /* start struct : sid / size: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sid"); + ptvcursor_add(cursor, hf_skinny_DeviceName, 16, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_reserved_for_future_use, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_instance, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sid */ + } + ptvcursor_add(cursor, hf_skinny_userName, 40, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_serverName, 40, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_numberOfLines, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberOfSpeedDials, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: DefineTimeDate + * Opcode: 0x0094 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_DefineTimeDate(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + { + /* start struct : timeDataInfo / size: 32 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "timeDataInfo"); + ptvcursor_add(cursor, hf_skinny_wYear, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_wMonth, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_wDayOfWeek, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_wDay, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_wHour, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_wMinute, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_wSecond, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_wMilliseconds, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: timeDataInfo */ + } + ptvcursor_add(cursor, hf_skinny_systemTime, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StartSessionTransmissionMessage + * Opcode: 0x0095 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_StartSessionTransmissionMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + dissect_skinny_ipv4or6(cursor, hf_skinny_remoteIpAddr_ipv4, hf_skinny_remoteIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_sessionType, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StopSessionTransmissionMessage + * Opcode: 0x0096 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_StopSessionTransmissionMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + dissect_skinny_ipv4or6(cursor, hf_skinny_remoteIpAddr_ipv4, hf_skinny_remoteIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_sessionType, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: ButtonTemplateMessage + * Opcode: 0x0097 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_ButtonTemplateMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 totalButtonCount = 0; + { + /* start struct : buttonTemplate / size: 14 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "buttonTemplate"); + ptvcursor_add(cursor, hf_skinny_buttonOffset, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_buttonCount, 4, ENC_LITTLE_ENDIAN); + totalButtonCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_totalButtonCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : definition / size: 2 */ + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "definition [ref: totalButtonCount = %d, max:42]", totalButtonCount); + for (counter_2 = 0; counter_2 < 42; counter_2++) { + if (counter_2 < totalButtonCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "definition [%d / %d]", counter_2 + 1, totalButtonCount); + ptvcursor_add(cursor, hf_skinny_instanceNumber, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_buttonDefinition, 1, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 2); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: definition */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: definition */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: buttonTemplate */ + } +} + +/* + * Message: VersionMessage + * Opcode: 0x0098 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_VersionMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_version, 16, ENC_ASCII|ENC_NA); +} + +/* + * Message: DisplayTextMessage + * Opcode: 0x0099 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_DisplayTextMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_text, 32, ENC_ASCII|ENC_NA); +} + +/* + * Message: RegisterRejectMessage + * Opcode: 0x009d + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_RegisterRejectMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_text, 32, ENC_ASCII|ENC_NA); +} + +/* + * Message: ServerResMessage + * Opcode: 0x009e + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_ServerResMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + { + /* start struct : server / size: 48 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "server [max:5]"); + for (counter_1 = 0; counter_1 < 5; counter_1++) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "server [%d / %d]", counter_1 + 1, 5); + ptvcursor_add(cursor, hf_skinny_ServerName, 48, ENC_ASCII|ENC_NA); + ptvcursor_pop_subtree(cursor); + /* end for loop tree: server */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: server */ + } + { + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "serverTcpListenPort [max:5]"); + for (counter_1 = 0; counter_1 < 5; counter_1++) { + ptvcursor_add(cursor, hf_skinny_serverTcpListenPort, 4, ENC_LITTLE_ENDIAN); + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: serverTcpListenPort */ + } + { + /* start struct : serverIpAddr / size: 20 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "serverIpAddr [max:5]"); + for (counter_1 = 0; counter_1 < 5; counter_1++) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "serverIpAddr [%d / %d]", counter_1 + 1, 5); + dissect_skinny_ipv4or6(cursor, hf_skinny_stationIpAddr_ipv4, hf_skinny_stationIpAddr_ipv6, pinfo); + ptvcursor_pop_subtree(cursor); + /* end for loop tree: serverIpAddr */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: serverIpAddr */ + } +} + +/* + * Message: Reset + * Opcode: 0x009f + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_Reset(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_resetType, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StartMulticastMediaReceptionMessage + * Opcode: 0x0101 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_StartMulticastMediaReceptionMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 compressionType = 0; + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_multicastIpAddr_ipv4, hf_skinny_multicastIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_multicastPortNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_millisecondPacketSize, 4, ENC_LITTLE_ENDIAN); + compressionType = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_compressionType, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : qualifierIn / size: 12 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "qualifierIn"); + ptvcursor_add(cursor, hf_skinny_ecValue, 4, ENC_LITTLE_ENDIAN); + if (hdr_version <= V10_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + } + if (hdr_version >= V11_MSG_TYPE) { + if (compressionType == MEDIA_PAYLOAD_G7231) { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "compressionType is Media_Payload_G7231"); + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + } else { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "any compressionType"); + { + /* start struct : codecParams / size: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "codecParams"); + ptvcursor_add(cursor, hf_skinny_codecMode, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dynamicPayload, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam1, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam2, 1, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: codecParams */ + } + ptvcursor_pop_subtree(cursor); + } + } + ptvcursor_pop_subtree(cursor); + /* end struct: qualifierIn */ + } + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StartMulticastMediaTransmissionMessage + * Opcode: 0x0102 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_StartMulticastMediaTransmissionMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 compressionType = 0; + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_multicastIpAddr_ipv4, hf_skinny_multicastIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_multicastPortNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_millisecondPacketSize, 4, ENC_LITTLE_ENDIAN); + compressionType = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_compressionType, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : qualifierOut / size: 18 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "qualifierOut"); + ptvcursor_add(cursor, hf_skinny_precedenceValue, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_ssValue, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxFramesPerPacket, 2, ENC_LITTLE_ENDIAN); + if (hdr_version <= V10_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + } + if (hdr_version >= V11_MSG_TYPE && hdr_version <= V15_MSG_TYPE) { + if (compressionType == MEDIA_PAYLOAD_G7231) { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "compressionType is Media_Payload_G7231"); + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + } else { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "any compressionType"); + { + /* start struct : codecParams / size: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "codecParams"); + ptvcursor_add(cursor, hf_skinny_codecMode, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dynamicPayload, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam1, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam2, 1, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: codecParams */ + } + ptvcursor_pop_subtree(cursor); + } + } + ptvcursor_pop_subtree(cursor); + /* end struct: qualifierOut */ + } + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StopMulticastMediaReceptionMessage + * Opcode: 0x0103 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_StopMulticastMediaReceptionMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StopMulticastMediaTransmissionMessage + * Opcode: 0x0104 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_StopMulticastMediaTransmissionMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: OpenReceiveChannelMessage + * Opcode: 0x0105 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_OpenReceiveChannelMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + guint32 compressionType = 0; + guint16 keylen = 0; + guint16 saltlen = 0; + + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_millisecondPacketSize, 4, ENC_LITTLE_ENDIAN); + compressionType = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_compressionType, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : qualifierIn / size: 12 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "qualifierIn"); + ptvcursor_add(cursor, hf_skinny_ecValue, 4, ENC_LITTLE_ENDIAN); + if (hdr_version <= V10_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + } + if (hdr_version >= V11_MSG_TYPE) { + if (compressionType == MEDIA_PAYLOAD_G7231) { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "compressionType is Media_Payload_G7231"); + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + } else { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "any compressionType"); + { + /* start struct : codecParams / size: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "codecParams"); + ptvcursor_add(cursor, hf_skinny_codecMode, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dynamicPayload, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam1, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam2, 1, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: codecParams */ + } + ptvcursor_pop_subtree(cursor); + } + } + ptvcursor_pop_subtree(cursor); + /* end struct: qualifierIn */ + } + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : mRxMediaEncryptionKeyInfo / size: 18 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "mRxMediaEncryptionKeyInfo"); + ptvcursor_add(cursor, hf_skinny_algorithmID, 4, ENC_LITTLE_ENDIAN); + keylen = tvb_get_letohs(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_keylen, 2, ENC_LITTLE_ENDIAN); + saltlen = tvb_get_letohs(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_saltlen, 2, ENC_LITTLE_ENDIAN); + { + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "key [ref: keylen = %d, max:16]", keylen); + for (counter_2 = 0; counter_2 < 16; counter_2++) { + if (counter_2 < keylen) { + ptvcursor_add(cursor, hf_skinny_key, 1, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 1); + } + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: key */ + } + { + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "salt [ref: saltlen = %d, max:16]", saltlen); + for (counter_2 = 0; counter_2 < 16; counter_2++) { + if (counter_2 < saltlen) { + ptvcursor_add(cursor, hf_skinny_salt, 1, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 1); + } + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: salt */ + } + ptvcursor_add(cursor, hf_skinny_isMKIPresent, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_keyDerivationRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: mRxMediaEncryptionKeyInfo */ + } + ptvcursor_add(cursor, hf_skinny_streamPassThroughID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_associatedStreamID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_RFC2833PayloadType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dtmfType, 4, ENC_LITTLE_ENDIAN); + if (hdr_version >= V11_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_mixingMode, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_partyDirection, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_sourceIpAddr_ipv4, hf_skinny_sourceIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_sourcePortNumber, 4, ENC_LITTLE_ENDIAN); + } + if (hdr_version >= V16_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_requestedIpAddrType, 4, ENC_LITTLE_ENDIAN); + } + if (hdr_version >= V17_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_audioLevelAdjustment, 4, ENC_LITTLE_ENDIAN); + } + if (hdr_version >= V20_MSG_TYPE) { + { + /* start struct : latentCapsInfo / size: 36 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "latentCapsInfo"); + ptvcursor_add(cursor, hf_skinny_active, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : modemRelay / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "modemRelay"); + ptvcursor_add(cursor, hf_skinny_capAndVer, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_modAnd2833, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: modemRelay */ + } + { + /* start struct : sprtPayload / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sprtPayload"); + ptvcursor_add(cursor, hf_skinny_chan0MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan2MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan3MaxPayload, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_chan2MaxWindow, 2, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sprtPayload */ + } + { + /* start struct : sse / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sse"); + ptvcursor_add(cursor, hf_skinny_standard, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_vendor, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sse */ + } + { + /* start struct : payloadParam / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadParam"); + ptvcursor_add(cursor, hf_skinny_nse, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_rfc2833, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_sse, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_v150sprt, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_noaudio, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_FutureUse1, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_FutureUse2, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_FutureUse3, 1, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: payloadParam */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: latentCapsInfo */ + } + } +} + +/* + * Message: CloseReceiveChannelMessage + * Opcode: 0x0106 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_CloseReceiveChannelMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_portHandlingFlag, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: ConnectionStatisticsReqMessage + * Opcode: 0x0107 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_ConnectionStatisticsReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + guint32 VariableDirnumSize = (hdr_version >= V18_MSG_TYPE) ? 25 : 24; + ptvcursor_add(cursor, hf_skinny_directoryNum, VariableDirnumSize, ENC_ASCII|ENC_NA); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_statsProcessingMode, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SoftKeyTemplateResMessage + * Opcode: 0x0108 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SoftKeyTemplateResMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 totalSoftKeyCount = 0; + { + /* start struct : softKeyTemplate / size: 32 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "softKeyTemplate"); + ptvcursor_add(cursor, hf_skinny_softKeyOffset, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_softKeyCount, 4, ENC_LITTLE_ENDIAN); + totalSoftKeyCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_totalSoftKeyCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : definition / size: 20 */ + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "definition [ref: totalSoftKeyCount = %d, max:32]", totalSoftKeyCount); + for (counter_2 = 0; counter_2 < 32; counter_2++) { + if (counter_2 < totalSoftKeyCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "definition [%d / %d]", counter_2 + 1, totalSoftKeyCount); + dissect_skinny_displayLabel(cursor, hf_skinny_softKeyLabel, 16, 16); + ptvcursor_add(cursor, hf_skinny_softKeyEvent, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 20); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: definition */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: definition */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: softKeyTemplate */ + } +} + +/* + * Message: SoftKeySetResMessage + * Opcode: 0x0109 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SoftKeySetResMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 totalSoftKeySetCount = 0; + { + /* start struct : softKeySets / size: 15 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "softKeySets"); + ptvcursor_add(cursor, hf_skinny_softKeySetOffset, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_softKeySetCount, 4, ENC_LITTLE_ENDIAN); + totalSoftKeySetCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_totalSoftKeySetCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : definition / size: 3 */ + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "definition [ref: totalSoftKeySetCount = %d, max:16]", totalSoftKeySetCount); + for (counter_2 = 0; counter_2 < 16; counter_2++) { + if (counter_2 < totalSoftKeySetCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "definition [%d / %d]", counter_2 + 1, totalSoftKeySetCount); + { + guint32 counter_5 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "softKeyTemplateIndex [max:16]"); + for (counter_5 = 0; counter_5 < 16; counter_5++) { + ptvcursor_add(cursor, hf_skinny_softKeyTemplateIndex, 1, ENC_LITTLE_ENDIAN); + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: softKeyTemplateIndex */ + } + { + guint32 counter_5 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "softKeyInfoIndex [max:16]"); + for (counter_5 = 0; counter_5 < 16; counter_5++) { + ptvcursor_add(cursor, hf_skinny_softKeyInfoIndex, 2, ENC_LITTLE_ENDIAN); + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: softKeyInfoIndex */ + } + } else { + ptvcursor_advance(cursor, 3); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: definition */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: definition */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: softKeySets */ + } +} + +/* + * Message: SelectSoftKeysMessage + * Opcode: 0x0110 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SelectSoftKeysMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_softKeySetIndex, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "validKeyMask"); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey1, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey2, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey3, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey4, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey5, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey6, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey7, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey8, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey9, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey10, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey11, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey12, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey13, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey14, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey15, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_SoftKeyMask_SoftKey16, 4, ENC_LITTLE_ENDIAN); + ptvcursor_advance(cursor, 4); + ptvcursor_pop_subtree(cursor); /* end bitfield: validKeyMask */ +} + +/* + * Message: CallStateMessage + * Opcode: 0x0111 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_CallStateMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + si->callState = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callState, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_privacy, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : precedence / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "precedence"); + ptvcursor_add(cursor, hf_skinny_precedenceLv, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_precedenceDm, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: precedence */ + } +} + +/* + * Message: DisplayPromptStatusMessage + * Opcode: 0x0112 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_DisplayPromptStatusMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_timeOutValue, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_displayLabel(cursor, hf_skinny_promptStatus, 32, 32); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: ClearPromptStatusMessage + * Opcode: 0x0113 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_ClearPromptStatusMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: DisplayNotifyMessage + * Opcode: 0x0114 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_DisplayNotifyMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_timeOutValue, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_displayLabel(cursor, hf_skinny_notify, 32, 32); +} + +/* + * Message: ActivateCallPlaneMessage + * Opcode: 0x0116 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_ActivateCallPlaneMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: UnregisterAckMessage + * Opcode: 0x0118 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_UnregisterAckMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_status, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: BackSpaceReqMessage + * Opcode: 0x0119 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_BackSpaceReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: RegisterTokenReject + * Opcode: 0x011b + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_RegisterTokenReject(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_waitTimeBeforeNextReq, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StartMediaFailureDetectionMessage + * Opcode: 0x011c + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_StartMediaFailureDetectionMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 compressionType = 0; + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_millisecondPacketSize, 4, ENC_LITTLE_ENDIAN); + compressionType = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_compressionType, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : qualifierIn / size: 12 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "qualifierIn"); + ptvcursor_add(cursor, hf_skinny_ecValue, 4, ENC_LITTLE_ENDIAN); + if (hdr_version <= V10_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + } + if (hdr_version >= V11_MSG_TYPE) { + if (compressionType == MEDIA_PAYLOAD_G7231) { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "compressionType is Media_Payload_G7231"); + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + } else { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "any compressionType"); + { + /* start struct : codecParams / size: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "codecParams"); + ptvcursor_add(cursor, hf_skinny_codecMode, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dynamicPayload, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam1, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam2, 1, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: codecParams */ + } + ptvcursor_pop_subtree(cursor); + } + } + ptvcursor_pop_subtree(cursor); + /* end struct: qualifierIn */ + } + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: DialedNumberMessage + * Opcode: 0x011d + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_DialedNumberMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + guint32 VariableDirnumSize = (hdr_version >= V18_MSG_TYPE) ? 25 : 24; + ptvcursor_add(cursor, hf_skinny_dialedNumber, VariableDirnumSize, ENC_ASCII|ENC_NA); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: UserToDeviceDataMessage + * Opcode: 0x011e + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_UserToDeviceDataMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 dataLength = 0; + { + /* start struct : userToDeviceData / size: 2020 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "userToDeviceData"); + ptvcursor_add(cursor, hf_skinny_applicationID, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_transactionID, 4, ENC_LITTLE_ENDIAN); + dataLength = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataLength, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_xml(cursor, hf_skinny_data, pinfo, dataLength, 2000); + ptvcursor_pop_subtree(cursor); + /* end struct: userToDeviceData */ + } +} + +/* + * Message: FeatureStatMessage + * Opcode: 0x011f + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_FeatureStatMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_featureIndex, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_featureID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_featureTextLabel, 40, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_featureStatus, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: DisplayPriNotifyMessage + * Opcode: 0x0120 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_DisplayPriNotifyMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_timeOutValue, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_priority, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_displayLabel(cursor, hf_skinny_notify, 32, 32); +} + +/* + * Message: ClearPriNotifyMessage + * Opcode: 0x0121 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_ClearPriNotifyMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_priority, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StartAnnouncementMessage + * Opcode: 0x0122 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_StartAnnouncementMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + { + /* start struct : AnnList / size: 12 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "AnnList [max:32]"); + for (counter_1 = 0; counter_1 < 32; counter_1++) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "AnnList [%d / %d]", counter_1 + 1, 32); + ptvcursor_add(cursor, hf_skinny_locale, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_country, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_toneAnnouncement, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end for loop tree: AnnList */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: AnnList */ + } + ptvcursor_add(cursor, hf_skinny_annAckReq, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + { + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "matrixConfPartyID [max:16]"); + for (counter_1 = 0; counter_1 < 16; counter_1++) { + ptvcursor_add(cursor, hf_skinny_matrixConfPartyID, 4, ENC_LITTLE_ENDIAN); + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: matrixConfPartyID */ + } + ptvcursor_add(cursor, hf_skinny_hearingConfPartyMask, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_annPlayMode, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StopAnnouncementMessage + * Opcode: 0x0123 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_StopAnnouncementMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: AnnouncementFinishMessage + * Opcode: 0x0124 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_AnnouncementFinishMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_annStatus, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: NotifyDtmfToneMessage + * Opcode: 0x0127 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_NotifyDtmfToneMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_tone, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passthruPartyID, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SendDtmfToneMessage + * Opcode: 0x0128 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SendDtmfToneMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_tone, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passthruPartyID, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SubscribeDtmfPayloadReqMessage + * Opcode: 0x0129 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SubscribeDtmfPayloadReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_payloadDtmf, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passthruPartyID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dtmfType, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SubscribeDtmfPayloadResMessage + * Opcode: 0x012a + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SubscribeDtmfPayloadResMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_payloadDtmf, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passthruPartyID, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SubscribeDtmfPayloadErrMessage + * Opcode: 0x012b + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SubscribeDtmfPayloadErrMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_payloadDtmf, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passthruPartyID, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: UnSubscribeDtmfPayloadReqMessage + * Opcode: 0x012c + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_UnSubscribeDtmfPayloadReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_payloadDtmf, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passthruPartyID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dtmfType, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: UnSubscribeDtmfPayloadResMessage + * Opcode: 0x012d + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_UnSubscribeDtmfPayloadResMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_payloadDtmf, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passthruPartyID, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: UnSubscribeDtmfPayloadErrMessage + * Opcode: 0x012e + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_UnSubscribeDtmfPayloadErrMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_payloadDtmf, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passthruPartyID, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: ServiceURLStatMessage + * Opcode: 0x012f + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_ServiceURLStatMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_serviceURLIndex, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_serviceURL, 256, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_serviceURLDisplayName, 40, ENC_ASCII|ENC_NA); +} + +/* + * Message: CallSelectStatMessage + * Opcode: 0x0130 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_CallSelectStatMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_callSelectStat, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: OpenMultiMediaReceiveChannelMessage + * Opcode: 0x0131 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_OpenMultiMediaReceiveChannelMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + guint32 compressionType = 0; + guint32 payloadType = 0; + guint32 pictureFormatCount = 0; + guint16 keylen = 0; + guint16 saltlen = 0; + + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + compressionType = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_compressionType, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : payloadType / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType"); + ptvcursor_add(cursor, hf_skinny_payload_rfc_number, 4, ENC_LITTLE_ENDIAN); + payloadType = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_payloadType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: payloadType */ + } + ptvcursor_add(cursor, hf_skinny_isConferenceCreator, 4, ENC_LITTLE_ENDIAN); + if (payloadType <= MEDIA_PAYLOAD_AMR_WB) { + /* start union : capability / maxsize: 44 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType <= Media_Payload_AMR_WB"); + { + /* start struct : audioParameters / size: 16 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "audioParameters"); + ptvcursor_add(cursor, hf_skinny_millisecondPacketSize, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : qualifierIn / size: 12 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "qualifierIn"); + ptvcursor_add(cursor, hf_skinny_ecValue, 4, ENC_LITTLE_ENDIAN); + if (hdr_version <= V10_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + } + if (hdr_version >= V11_MSG_TYPE) { + if (compressionType == MEDIA_PAYLOAD_G7231) { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "compressionType is Media_Payload_G7231"); + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + } else { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "any compressionType"); + { + /* start struct : codecParams / size: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "codecParams"); + ptvcursor_add(cursor, hf_skinny_codecMode, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dynamicPayload, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam1, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam2, 1, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: codecParams */ + } + ptvcursor_pop_subtree(cursor); + } + } + ptvcursor_pop_subtree(cursor); + /* end struct: qualifierIn */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: audioParameters */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 28); + } else if (payloadType >= MEDIA_PAYLOAD_H261 && payloadType <= MEDIA_PAYLOAD_H264_FEC) { + /* start union : capability / maxsize: 44 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "Media_Payload_H261 <= payloadType <= Media_Payload_H264_FEC"); + { + /* start struct : vidParameters / size: 44 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "vidParameters"); + ptvcursor_add(cursor, hf_skinny_bitRate, 4, ENC_LITTLE_ENDIAN); + pictureFormatCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_pictureFormatCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : pictureFormat / size: 8 */ + guint32 counter_3 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "pictureFormat [ref: pictureFormatCount = %d, max:5]", pictureFormatCount); + for (counter_3 = 0; counter_3 < 5; counter_3++) { + if (counter_3 < pictureFormatCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "pictureFormat [%d / %d]", counter_3 + 1, pictureFormatCount); + ptvcursor_add(cursor, hf_skinny_format, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_MPI, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 8); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: pictureFormat */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: pictureFormat */ + } + ptvcursor_add(cursor, hf_skinny_confServiceNum, 4, ENC_LITTLE_ENDIAN); + if (payloadType == MEDIA_PAYLOAD_H261) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType is Media_Payload_H261"); + { + /* start struct : h261VideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h261VideoCapability"); + ptvcursor_add(cursor, hf_skinny_temporalSpatialTradeOffCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_stillImageTransmission, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h261VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 16); + } else if (payloadType == MEDIA_PAYLOAD_H263) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType is Media_Payload_H263"); + { + /* start struct : h263VideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h263VideoCapability"); + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h263_capability_bitfield"); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit1, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit2, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit3, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit4, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit5, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit6, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit7, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit8, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit9, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit10, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit11, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit12, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit13, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit14, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit15, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit16, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit17, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit18, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit19, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit20, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit21, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit22, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit23, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit24, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit25, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit26, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit27, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit28, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit29, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit30, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit31, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit32, 4, ENC_LITTLE_ENDIAN); + ptvcursor_advance(cursor, 4); + ptvcursor_pop_subtree(cursor); /* end bitfield: h263_capability_bitfield */ + ptvcursor_add(cursor, hf_skinny_annexNandWFutureUse, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h263VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 16); + } else if (payloadType == MEDIA_PAYLOAD_H264) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType is Media_Payload_H264"); + { + /* start struct : h264VideoCapability / size: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h264VideoCapability"); + ptvcursor_add(cursor, hf_skinny_profile, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_level, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxMBPS, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxFS, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxDPB, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxBRandCPB, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h264VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadType == MEDIA_PAYLOAD_VIEO) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType is Media_Payload_Vieo"); + { + /* start struct : vieoVideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "vieoVideoCapability"); + ptvcursor_add(cursor, hf_skinny_modelNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_bandwidth, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: vieoVideoCapability */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 16); + } + ptvcursor_pop_subtree(cursor); + /* end struct: vidParameters */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadType >= MEDIA_PAYLOAD_CLEAR_CHAN) { + /* start union : capability / maxsize: 44 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType >= Media_Payload_Clear_Chan"); + { + /* start struct : dataParameters / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "dataParameters"); + ptvcursor_add(cursor, hf_skinny_protocolDependentData, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxBitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: dataParameters */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 36); + } + { + /* start struct : mRxMediaEncryptionKeyInfo / size: 18 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "mRxMediaEncryptionKeyInfo"); + ptvcursor_add(cursor, hf_skinny_algorithmID, 4, ENC_LITTLE_ENDIAN); + keylen = tvb_get_letohs(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_keylen, 2, ENC_LITTLE_ENDIAN); + saltlen = tvb_get_letohs(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_saltlen, 2, ENC_LITTLE_ENDIAN); + { + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "key [ref: keylen = %d, max:16]", keylen); + for (counter_2 = 0; counter_2 < 16; counter_2++) { + if (counter_2 < keylen) { + ptvcursor_add(cursor, hf_skinny_key, 1, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 1); + } + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: key */ + } + { + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "salt [ref: saltlen = %d, max:16]", saltlen); + for (counter_2 = 0; counter_2 < 16; counter_2++) { + if (counter_2 < saltlen) { + ptvcursor_add(cursor, hf_skinny_salt, 1, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 1); + } + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: salt */ + } + ptvcursor_add(cursor, hf_skinny_isMKIPresent, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_keyDerivationRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: mRxMediaEncryptionKeyInfo */ + } + ptvcursor_add(cursor, hf_skinny_streamPassThroughID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_associatedStreamID, 4, ENC_LITTLE_ENDIAN); + if (hdr_version >= V11_MSG_TYPE) { + dissect_skinny_ipv4or6(cursor, hf_skinny_sourceIpAddr_ipv4, hf_skinny_sourceIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_sourcePortNumber, 4, ENC_LITTLE_ENDIAN); + } + if (hdr_version >= V16_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_requestedIpAddrType, 4, ENC_LITTLE_ENDIAN); + } +} + +/* + * Message: StartMultiMediaTransmissionMessage + * Opcode: 0x0132 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_StartMultiMediaTransmissionMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 compressionType = 0; + guint32 payloadType = 0; + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + guint32 pictureFormatCount = 0; + guint16 keylen = 0; + guint16 saltlen = 0; + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passthruPartyID, 4, ENC_LITTLE_ENDIAN); + compressionType = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_compressionType, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_remoteIpAddr_ipv4, hf_skinny_remoteIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_remotePortNumber, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : payloadType / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType"); + ptvcursor_add(cursor, hf_skinny_payload_rfc_number, 4, ENC_LITTLE_ENDIAN); + payloadType = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_payloadType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: payloadType */ + } + ptvcursor_add(cursor, hf_skinny_DSCPValue, 4, ENC_LITTLE_ENDIAN); + if (payloadType <= MEDIA_PAYLOAD_AMR_WB) { + /* start union : capability / maxsize: 44 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType <= Media_Payload_AMR_WB"); + { + /* start struct : audioParameters / size: 16 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "audioParameters"); + ptvcursor_add(cursor, hf_skinny_millisecondPacketSize, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : qualifierIn / size: 12 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "qualifierIn"); + ptvcursor_add(cursor, hf_skinny_ecValue, 4, ENC_LITTLE_ENDIAN); + if (hdr_version <= V10_MSG_TYPE) { + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + } + if (hdr_version >= V11_MSG_TYPE) { + if (compressionType == MEDIA_PAYLOAD_G7231) { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "compressionType is Media_Payload_G7231"); + ptvcursor_add(cursor, hf_skinny_g723BitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + } else { + /* start union : codecParamsUnion / maxsize: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "any compressionType"); + { + /* start struct : codecParams / size: 4 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "codecParams"); + ptvcursor_add(cursor, hf_skinny_codecMode, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_dynamicPayload, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam1, 1, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_codecParam2, 1, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: codecParams */ + } + ptvcursor_pop_subtree(cursor); + } + } + ptvcursor_pop_subtree(cursor); + /* end struct: qualifierIn */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: audioParameters */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 28); + } else if (payloadType >= MEDIA_PAYLOAD_H261 && payloadType <= MEDIA_PAYLOAD_H264_FEC) { + /* start union : capability / maxsize: 44 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "Media_Payload_H261 <= payloadType <= Media_Payload_H264_FEC"); + { + /* start struct : vidParameters / size: 44 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "vidParameters"); + ptvcursor_add(cursor, hf_skinny_bitRate, 4, ENC_LITTLE_ENDIAN); + pictureFormatCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_pictureFormatCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : pictureFormat / size: 8 */ + guint32 counter_3 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "pictureFormat [ref: pictureFormatCount = %d, max:5]", pictureFormatCount); + for (counter_3 = 0; counter_3 < 5; counter_3++) { + if (counter_3 < pictureFormatCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "pictureFormat [%d / %d]", counter_3 + 1, pictureFormatCount); + ptvcursor_add(cursor, hf_skinny_format, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_MPI, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 8); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: pictureFormat */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: pictureFormat */ + } + ptvcursor_add(cursor, hf_skinny_confServiceNum, 4, ENC_LITTLE_ENDIAN); + if (payloadType == MEDIA_PAYLOAD_H261) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType is Media_Payload_H261"); + { + /* start struct : h261VideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h261VideoCapability"); + ptvcursor_add(cursor, hf_skinny_temporalSpatialTradeOffCapability, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_stillImageTransmission, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h261VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 16); + } else if (payloadType == MEDIA_PAYLOAD_H263) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType is Media_Payload_H263"); + { + /* start struct : h263VideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h263VideoCapability"); + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h263_capability_bitfield"); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit1, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit2, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit3, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit4, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit5, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit6, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit7, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit8, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit9, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit10, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit11, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit12, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit13, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit14, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit15, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit16, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit17, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit18, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit19, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit20, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit21, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit22, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit23, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit24, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit25, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit26, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit27, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit28, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit29, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit30, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit31, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_Generic_Bitfield_Bit32, 4, ENC_LITTLE_ENDIAN); + ptvcursor_advance(cursor, 4); + ptvcursor_pop_subtree(cursor); /* end bitfield: h263_capability_bitfield */ + ptvcursor_add(cursor, hf_skinny_annexNandWFutureUse, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h263VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 16); + } else if (payloadType == MEDIA_PAYLOAD_H264) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType is Media_Payload_H264"); + { + /* start struct : h264VideoCapability / size: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "h264VideoCapability"); + ptvcursor_add(cursor, hf_skinny_profile, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_level, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxMBPS, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxFS, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxDPB, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_customMaxBRandCPB, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: h264VideoCapability */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadType == MEDIA_PAYLOAD_VIEO) { + /* start union : capability / maxsize: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType is Media_Payload_Vieo"); + { + /* start struct : vieoVideoCapability / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "vieoVideoCapability"); + ptvcursor_add(cursor, hf_skinny_modelNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_bandwidth, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: vieoVideoCapability */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 16); + } + ptvcursor_pop_subtree(cursor); + /* end struct: vidParameters */ + } + ptvcursor_pop_subtree(cursor); + } else if (payloadType >= MEDIA_PAYLOAD_CLEAR_CHAN) { + /* start union : capability / maxsize: 44 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "payloadType >= Media_Payload_Clear_Chan"); + { + /* start struct : dataParameters / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "dataParameters"); + ptvcursor_add(cursor, hf_skinny_protocolDependentData, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxBitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: dataParameters */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 36); + } + { + /* start struct : mTxMediaEncryptionKeyInfo / size: 18 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "mTxMediaEncryptionKeyInfo"); + ptvcursor_add(cursor, hf_skinny_algorithmID, 4, ENC_LITTLE_ENDIAN); + keylen = tvb_get_letohs(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_keylen, 2, ENC_LITTLE_ENDIAN); + saltlen = tvb_get_letohs(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_saltlen, 2, ENC_LITTLE_ENDIAN); + { + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "key [ref: keylen = %d, max:16]", keylen); + for (counter_2 = 0; counter_2 < 16; counter_2++) { + if (counter_2 < keylen) { + ptvcursor_add(cursor, hf_skinny_key, 1, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 1); + } + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: key */ + } + { + guint32 counter_2 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "salt [ref: saltlen = %d, max:16]", saltlen); + for (counter_2 = 0; counter_2 < 16; counter_2++) { + if (counter_2 < saltlen) { + ptvcursor_add(cursor, hf_skinny_salt, 1, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 1); + } + } + ptvcursor_pop_subtree(cursor); /* end for loop tree: salt */ + } + ptvcursor_add(cursor, hf_skinny_isMKIPresent, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_keyDerivationRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: mTxMediaEncryptionKeyInfo */ + } + ptvcursor_add(cursor, hf_skinny_streamPassThroughID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_associatedStreamID, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StopMultiMediaTransmissionMessage + * Opcode: 0x0133 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_StopMultiMediaTransmissionMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_portHandlingFlag, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: MiscellaneousCommandMessage + * Opcode: 0x0134 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_MiscellaneousCommandMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 command = 0; + guint32 recoveryReferencePictureCount = 0; + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passthruPartyID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + command = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_command, 4, ENC_LITTLE_ENDIAN); + if (command == MISCCOMMANDTYPE_VIDEOFASTUPDATEGOB) { + /* start union : u / maxsize: 16 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "command is MiscCommandType_videoFastUpdateGOB"); + { + /* start struct : videoFastUpdateGOB / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "videoFastUpdateGOB"); + ptvcursor_add(cursor, hf_skinny_firstGOB, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberOfGOBs, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: videoFastUpdateGOB */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 8); + } else if (command == MISCCOMMANDTYPE_VIDEOFASTUPDATEMB) { + /* start union : u / maxsize: 16 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "command is MiscCommandType_videoFastUpdateMB"); + { + /* start struct : videoFastUpdateMB / size: 12 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "videoFastUpdateMB"); + ptvcursor_add(cursor, hf_skinny_firstGOB, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_firstMB, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberOfMBs, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: videoFastUpdateMB */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 4); + } else if (command == MISCCOMMANDTYPE_LOSTPICTURE) { + /* start union : u / maxsize: 16 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "command is MiscCommandType_lostPicture"); + { + /* start struct : lostPicture / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "lostPicture"); + ptvcursor_add(cursor, hf_skinny_pictureNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_longTermPictureIndex, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: lostPicture */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 8); + } else if (command == MISCCOMMANDTYPE_LOSTPARTIALPICTURE) { + /* start union : u / maxsize: 16 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "command is MiscCommandType_lostPartialPicture"); + { + /* start struct : lostPartialPicture / size: 16 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "lostPartialPicture"); + { + /* start struct : pictureReference / size: 8 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "pictureReference"); + ptvcursor_add(cursor, hf_skinny_pictureNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_longTermPictureIndex, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: pictureReference */ + } + ptvcursor_add(cursor, hf_skinny_firstMB, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberOfMBs, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: lostPartialPicture */ + } + ptvcursor_pop_subtree(cursor); + } else if (command == MISCCOMMANDTYPE_RECOVERYREFERENCEPICTURE) { + /* start union : u / maxsize: 16 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "command is MiscCommandType_recoveryReferencePicture"); + { + /* start struct : recoveryReferencePictureValue / size: 12 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "recoveryReferencePictureValue"); + recoveryReferencePictureCount = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_recoveryReferencePictureCount, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : recoveryReferencePicture / size: 8 */ + guint32 counter_3 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "recoveryReferencePicture [ref: recoveryReferencePictureCount = %d, max:4]", recoveryReferencePictureCount); + for (counter_3 = 0; counter_3 < 4; counter_3++) { + if (counter_3 < recoveryReferencePictureCount) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "recoveryReferencePicture [%d / %d]", counter_3 + 1, recoveryReferencePictureCount); + ptvcursor_add(cursor, hf_skinny_pictureNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_longTermPictureIndex, 4, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 8); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: recoveryReferencePicture */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: recoveryReferencePicture */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: recoveryReferencePictureValue */ + } + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 4); + } else if (command == MISCCOMMANDTYPE_TEMPORALSPATIALTRADEOFF) { + /* start union : u / maxsize: 16 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "command is MiscCommandType_temporalSpatialTradeOff"); + ptvcursor_add(cursor, hf_skinny_temporalSpatialTradeOff, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 12); + } else { + /* start union : u / maxsize: 16 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "any command"); + ptvcursor_add(cursor, hf_skinny_none, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + ptvcursor_advance(cursor, 12); + } +} + +/* + * Message: FlowControlCommandMessage + * Opcode: 0x0135 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_FlowControlCommandMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passthruPartyID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maximumBitRate, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: CloseMultiMediaReceiveChannelMessage + * Opcode: 0x0136 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_CloseMultiMediaReceiveChannelMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_portHandlingFlag, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: CreateConferenceReqMessage + * Opcode: 0x0137 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_CreateConferenceReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 dataLength = 0; + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberOfReservedParticipants, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_resourceType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_appID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_appConfID, 32, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_appData, 24, ENC_ASCII|ENC_NA); + dataLength = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataLength, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruData, dataLength, ENC_ASCII|ENC_NA); +} + +/* + * Message: DeleteConferenceReqMessage + * Opcode: 0x0138 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_DeleteConferenceReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: ModifyConferenceReqMessage + * Opcode: 0x0139 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_ModifyConferenceReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 dataLength = 0; + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_numberOfReservedParticipants, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_appID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_appConfID, 32, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_appData, 24, ENC_ASCII|ENC_NA); + dataLength = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataLength, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruData, dataLength, ENC_ASCII|ENC_NA); +} + +/* + * Message: AddParticipantReqMessage + * Opcode: 0x013a + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_AddParticipantReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "partyPIRestrictionBits"); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CallingPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CallingPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CallingParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CalledPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CalledPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CalledParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_OriginalCalledPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_OriginalCalledPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_OriginalCalledParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_LastRedirectPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_LastRedirectPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_LastRedirectParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_BitsReserved, 4, ENC_LITTLE_ENDIAN); + ptvcursor_advance(cursor, 4); + ptvcursor_pop_subtree(cursor); /* end bitfield: partyPIRestrictionBits */ + ptvcursor_add(cursor, hf_skinny_participantName, 40, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_participantNumber, 24, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_conferenceName, 32, ENC_ASCII|ENC_NA); +} + +/* + * Message: DropParticipantReqMessage + * Opcode: 0x013b + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_DropParticipantReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: AuditParticipantReqMessage + * Opcode: 0x013d + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_AuditParticipantReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: ChangeParticipantReqMessage + * Opcode: 0x013e + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_ChangeParticipantReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "partyPIRestrictionBits"); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CallingPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CallingPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CallingParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CalledPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CalledPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CalledParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_OriginalCalledPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_OriginalCalledPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_OriginalCalledParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_LastRedirectPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_LastRedirectPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_LastRedirectParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_BitsReserved, 4, ENC_LITTLE_ENDIAN); + ptvcursor_advance(cursor, 4); + ptvcursor_pop_subtree(cursor); /* end bitfield: partyPIRestrictionBits */ + ptvcursor_add(cursor, hf_skinny_participantName, 40, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_participantNumber, 24, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_conferenceName, 32, ENC_ASCII|ENC_NA); +} + +/* + * Message: UserToDeviceDataMessageVersion1 + * Opcode: 0x013f + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_UserToDeviceDataMessageVersion1(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 dataLength = 0; + { + /* start struct : userToDeviceDataVersion1 / size: 2040 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "userToDeviceDataVersion1"); + ptvcursor_add(cursor, hf_skinny_applicationID, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_transactionID, 4, ENC_LITTLE_ENDIAN); + dataLength = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_dataLength, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_sequenceFlag, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_displayPriority, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_appInstanceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_routingID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_xml(cursor, hf_skinny_data, pinfo, dataLength, 2000); + ptvcursor_pop_subtree(cursor); + /* end struct: userToDeviceDataVersion1 */ + } +} + +/* + * Message: VideoDisplayCommandMessage + * Opcode: 0x0140 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_VideoDisplayCommandMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_layoutID, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: FlowControlNotifyMessage + * Opcode: 0x0141 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_FlowControlNotifyMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passthruPartyID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maximumBitRate, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: ConfigStatV2Message + * Opcode: 0x0142 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: yes + */ +static void +handle_ConfigStatV2Message(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 DeviceName_len = 0; + guint32 serverName_len = 0; + { + /* start struct : sid / size: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sid"); + DeviceName_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (DeviceName_len > 1) { + ptvcursor_add(cursor, hf_skinny_DeviceName, DeviceName_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + ptvcursor_add(cursor, hf_skinny_reserved_for_future_use, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_instance, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sid */ + } + ptvcursor_add(cursor, hf_skinny_serverInstance, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_unknown2, 4, ENC_LITTLE_ENDIAN); + serverName_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (serverName_len > 1) { + ptvcursor_add(cursor, hf_skinny_serverName, serverName_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } +} + +/* + * Message: DisplayNotifyV2Message + * Opcode: 0x0143 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: yes + */ +static void +handle_DisplayNotifyV2Message(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_timeOutValue, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_displayLabel(cursor, hf_skinny_notify, 0, 32); +} + +/* + * Message: DisplayPriNotifyV2Message + * Opcode: 0x0144 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: yes + */ +static void +handle_DisplayPriNotifyV2Message(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_timeOutValue, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_priority, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_displayLabel(cursor, hf_skinny_notify, 0, 97); +} + +/* + * Message: DisplayPromptStatusV2Message + * Opcode: 0x0145 + * Type: CallControl + * Direction: pbx2dev + * VarLength: yes + */ +static void +handle_DisplayPromptStatusV2Message(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_timeOutValue, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_displayLabel(cursor, hf_skinny_promptStatus, 0, 97); +} + +/* + * Message: FeatureStatV2Message + * Opcode: 0x0146 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: yes + */ +static void +handle_FeatureStatV2Message(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 featureTextLabel_len = 0; + ptvcursor_add(cursor, hf_skinny_featureIndex, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_featureID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_featureStatus, 4, ENC_LITTLE_ENDIAN); + featureTextLabel_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (featureTextLabel_len > 1) { + ptvcursor_add(cursor, hf_skinny_featureTextLabel, featureTextLabel_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } +} + +/* + * Message: LineStatV2Message + * Opcode: 0x0147 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: yes + */ +static void +handle_LineStatV2Message(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 lineDirNumber_len = 0; + guint32 lineFullyQualifiedDisplayName_len = 0; + guint32 lineTextLabel_len = 0; + ptvcursor_add(cursor, hf_skinny_lineNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_Unknown, 4, ENC_LITTLE_ENDIAN); + lineDirNumber_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (lineDirNumber_len > 1) { + ptvcursor_add(cursor, hf_skinny_lineDirNumber, lineDirNumber_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + lineFullyQualifiedDisplayName_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (lineFullyQualifiedDisplayName_len > 1) { + ptvcursor_add(cursor, hf_skinny_lineFullyQualifiedDisplayName, lineFullyQualifiedDisplayName_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + lineTextLabel_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (lineTextLabel_len > 1) { + ptvcursor_add(cursor, hf_skinny_lineTextLabel, lineTextLabel_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } +} + +/* + * Message: ServiceURLStatV2Message + * Opcode: 0x0148 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: yes + */ +static void +handle_ServiceURLStatV2Message(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_serviceURLIndex, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SpeedDialStatV2Message + * Opcode: 0x0149 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: yes + */ +static void +handle_SpeedDialStatV2Message(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 speedDialDirNumber_len = 0; + guint32 speedDialDisplayName_len = 0; + ptvcursor_add(cursor, hf_skinny_speedDialNumber, 4, ENC_LITTLE_ENDIAN); + speedDialDirNumber_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (speedDialDirNumber_len > 1) { + ptvcursor_add(cursor, hf_skinny_speedDialDirNumber, speedDialDirNumber_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + speedDialDisplayName_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (speedDialDisplayName_len > 1) { + ptvcursor_add(cursor, hf_skinny_speedDialDisplayName, speedDialDisplayName_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } +} + +/* + * Message: CallInfoV2Message + * Opcode: 0x014a + * Type: CallControl + * Direction: pbx2dev + * VarLength: yes + */ +static void +handle_CallInfoV2Message(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4); + guint32 callingParty_len = 0; + guint32 AlternateCallingParty_len = 0; + guint32 calledParty_len = 0; + guint32 originalCalledParty_len = 0; + guint32 lastRedirectingParty_len = 0; + guint32 cgpnVoiceMailbox_len = 0; + guint32 cdpnVoiceMailbox_len = 0; + guint32 originalCdpnVoiceMailbox_len = 0; + guint32 lastRedirectingVoiceMailbox_len = 0; + guint32 callingPartyName_len = 0; + guint32 calledPartyName_len = 0; + guint32 originalCalledPartyName_len = 0; + guint32 lastRedirectingPartyName_len = 0; + guint32 HuntPilotNumber_len = 0; + guint32 HuntPilotName_len = 0; + + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_callType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_originalCdpnRedirectReason, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_lastRedirectingReason, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_callInstance, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_callSecurityStatus, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "partyPIRestrictionBits"); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CallingPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CallingPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CallingParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CalledPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CalledPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_CalledParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_OriginalCalledPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_OriginalCalledPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_OriginalCalledParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_LastRedirectPartyName, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_LastRedirectPartyNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_LastRedirectParty, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_BitsReserved, 4, ENC_LITTLE_ENDIAN); + ptvcursor_advance(cursor, 4); + ptvcursor_pop_subtree(cursor); /* end bitfield: partyPIRestrictionBits */ + callingParty_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (callingParty_len > 1) { + si->callingParty = g_strdup(tvb_format_stringzpad(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), callingParty_len)); + ptvcursor_add(cursor, hf_skinny_callingParty, callingParty_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + AlternateCallingParty_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (AlternateCallingParty_len > 1) { + ptvcursor_add(cursor, hf_skinny_AlternateCallingParty, AlternateCallingParty_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + calledParty_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (calledParty_len > 1) { + si->calledParty = g_strdup(tvb_format_stringzpad(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), calledParty_len)); + ptvcursor_add(cursor, hf_skinny_calledParty, calledParty_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + originalCalledParty_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (originalCalledParty_len > 1) { + ptvcursor_add(cursor, hf_skinny_originalCalledParty, originalCalledParty_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + lastRedirectingParty_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (lastRedirectingParty_len > 1) { + ptvcursor_add(cursor, hf_skinny_lastRedirectingParty, lastRedirectingParty_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + cgpnVoiceMailbox_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (cgpnVoiceMailbox_len > 1) { + ptvcursor_add(cursor, hf_skinny_cgpnVoiceMailbox, cgpnVoiceMailbox_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + cdpnVoiceMailbox_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (cdpnVoiceMailbox_len > 1) { + ptvcursor_add(cursor, hf_skinny_cdpnVoiceMailbox, cdpnVoiceMailbox_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + originalCdpnVoiceMailbox_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (originalCdpnVoiceMailbox_len > 1) { + ptvcursor_add(cursor, hf_skinny_originalCdpnVoiceMailbox, originalCdpnVoiceMailbox_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + lastRedirectingVoiceMailbox_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (lastRedirectingVoiceMailbox_len > 1) { + ptvcursor_add(cursor, hf_skinny_lastRedirectingVoiceMailbox, lastRedirectingVoiceMailbox_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + callingPartyName_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (callingPartyName_len > 1) { + ptvcursor_add(cursor, hf_skinny_callingPartyName, callingPartyName_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + calledPartyName_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (calledPartyName_len > 1) { + ptvcursor_add(cursor, hf_skinny_calledPartyName, calledPartyName_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + originalCalledPartyName_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (originalCalledPartyName_len > 1) { + ptvcursor_add(cursor, hf_skinny_originalCalledPartyName, originalCalledPartyName_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + lastRedirectingPartyName_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (lastRedirectingPartyName_len > 1) { + ptvcursor_add(cursor, hf_skinny_lastRedirectingPartyName, lastRedirectingPartyName_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + if (hdr_version >= V17_MSG_TYPE) { + HuntPilotNumber_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (HuntPilotNumber_len > 1) { + ptvcursor_add(cursor, hf_skinny_HuntPilotNumber, HuntPilotNumber_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + HuntPilotName_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1; + if (HuntPilotName_len > 1) { + ptvcursor_add(cursor, hf_skinny_HuntPilotName, HuntPilotName_len, ENC_ASCII|ENC_NA); + } else { + ptvcursor_advance(cursor, 1); + } + } +} + +/* + * Message: PortReqMessage + * Opcode: 0x014b + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_PortReqMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_mediaTransportType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_ipAddressType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_mediaType, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: PortCloseMessage + * Opcode: 0x014c + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_PortCloseMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_mediaType, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: QoSListenMessage + * Opcode: 0x014d + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_QoSListenMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_remoteIpAddr_ipv4, hf_skinny_remoteIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_remotePortNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_resvStyle, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxRetryNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_retryTimer, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_confirmRequired, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_preemptionPriority, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_defendingPriority, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_compressionType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_averageBitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_burstSize, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_peakRate, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : appID / size: 112 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "appID"); + ptvcursor_add(cursor, hf_skinny_vendorID, 32, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_version, 16, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_appName, 32, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_subAppID, 32, ENC_ASCII|ENC_NA); + ptvcursor_pop_subtree(cursor); + /* end struct: appID */ + } +} + +/* + * Message: QoSPathMessage + * Opcode: 0x014e + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_QoSPathMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_remoteIpAddr_ipv4, hf_skinny_remoteIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_remotePortNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_resvStyle, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxRetryNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_retryTimer, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_preemptionPriority, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_defendingPriority, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_compressionType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_averageBitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_burstSize, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_peakRate, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : appID / size: 112 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "appID"); + ptvcursor_add(cursor, hf_skinny_vendorID, 32, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_version, 16, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_appName, 32, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_subAppID, 32, ENC_ASCII|ENC_NA); + ptvcursor_pop_subtree(cursor); + /* end struct: appID */ + } +} + +/* + * Message: QoSTeardownMessage + * Opcode: 0x014f + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_QoSTeardownMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_remoteIpAddr_ipv4, hf_skinny_remoteIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_remotePortNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_direction, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: UpdateDSCPMessage + * Opcode: 0x0150 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_UpdateDSCPMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_remoteIpAddr_ipv4, hf_skinny_remoteIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_remotePortNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_DSCPValue, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: QoSModifyMessage + * Opcode: 0x0151 + * Type: IntraCCM + * Direction: pbx2pbx + * VarLength: no + */ +static void +handle_QoSModifyMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_remoteIpAddr_ipv4, hf_skinny_remoteIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_remotePortNumber, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_direction, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_compressionType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_averageBitRate, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_burstSize, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_peakRate, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : appID / size: 112 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "appID"); + ptvcursor_add(cursor, hf_skinny_vendorID, 32, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_version, 16, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_appName, 32, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_subAppID, 32, ENC_ASCII|ENC_NA); + ptvcursor_pop_subtree(cursor); + /* end struct: appID */ + } +} + +/* + * Message: SubscriptionStatMessage + * Opcode: 0x0152 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SubscriptionStatMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_transactionID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_featureID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_timer, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_cause, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: NotificationMessage + * Opcode: 0x0153 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_NotificationMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_transactionID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_featureID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_status, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_text, 97, ENC_ASCII|ENC_NA); +} + +/* + * Message: StartMediaTransmissionAckMessage + * Opcode: 0x0154 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_StartMediaTransmissionAckMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_transmitIpAddr_ipv4, hf_skinny_transmitIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_transmitPort, 4, ENC_LITTLE_ENDIAN); + si->startmediatransmisionStatus = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_startMediaTransmissionStatus, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: StartMultiMediaTransmissionAckMessage + * Opcode: 0x0155 + * Type: MediaControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_StartMultiMediaTransmissionAckMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_conferenceID, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_passThruPartyID, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + dissect_skinny_ipv4or6(cursor, hf_skinny_transmitIpAddr_ipv4, hf_skinny_transmitIpAddr_ipv6, pinfo); + ptvcursor_add(cursor, hf_skinny_transmitPort, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_resultCode, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: CallHistoryInfoMessage + * Opcode: 0x0156 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_CallHistoryInfoMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_callHistoryDisposition, 4, ENC_LITTLE_ENDIAN); + si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN); + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: MwiResponseMessage + * Opcode: 0x0158 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_MwiResponseMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_mwiTargetNumber, 25, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_mwi_notification_result, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: EnhancedAlarmMessage + * Opcode: 0x015a + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_EnhancedAlarmMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + dissect_skinny_xml(cursor, hf_skinny_alarmInfo, pinfo, 0, 2000); +} + +/* + * Message: CallCountRespMessage + * Opcode: 0x015f + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_CallCountRespMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + guint32 lineDataEntries = 0; + ptvcursor_add(cursor, hf_skinny_totalNumOfConfiguredLines, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_startingLineInstance, 4, ENC_LITTLE_ENDIAN); + lineDataEntries = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_lineDataEntries, 4, ENC_LITTLE_ENDIAN); + { + /* start struct : lineData / size: 4 */ + guint32 counter_1 = 0; + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "lineData [ref: lineDataEntries = %d, max:42]", lineDataEntries); + for (counter_1 = 0; counter_1 < 42; counter_1++) { + if (counter_1 < lineDataEntries) { + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "lineData [%d / %d]", counter_1 + 1, lineDataEntries); + ptvcursor_add(cursor, hf_skinny_maxNumCalls, 2, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_busyTrigger, 2, ENC_LITTLE_ENDIAN); + } else { + ptvcursor_advance(cursor, 4); + } + ptvcursor_pop_subtree(cursor); + /* end for loop tree: lineData */ + } + ptvcursor_pop_subtree(cursor); + /* end struct: lineData */ + } +} + +/* + * Message: RecordingStatusMessage + * Opcode: 0x0160 + * Type: CallControl + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_RecordingStatusMessage(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + si->callId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)); + ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_recording_status, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SPCPRegisterTokenReq + * Opcode: 0x8000 + * Type: RegistrationAndManagement + * Direction: dev2pbx + * VarLength: no + */ +static void +handle_SPCPRegisterTokenReq(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + { + /* start struct : sid / size: 24 */ + ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "sid"); + ptvcursor_add(cursor, hf_skinny_DeviceName, 16, ENC_ASCII|ENC_NA); + ptvcursor_add(cursor, hf_skinny_reserved_for_future_use, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_instance, 4, ENC_LITTLE_ENDIAN); + ptvcursor_pop_subtree(cursor); + /* end struct: sid */ + } + ptvcursor_add(cursor, hf_skinny_stationIpAddr, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_deviceType, 4, ENC_LITTLE_ENDIAN); + ptvcursor_add(cursor, hf_skinny_maxStreams, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SPCPRegisterTokenAck + * Opcode: 0x8100 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SPCPRegisterTokenAck(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_features, 4, ENC_LITTLE_ENDIAN); +} + +/* + * Message: SPCPRegisterTokenReject + * Opcode: 0x8101 + * Type: RegistrationAndManagement + * Direction: pbx2dev + * VarLength: no + */ +static void +handle_SPCPRegisterTokenReject(ptvcursor_t *cursor, packet_info * pinfo _U_) +{ + ptvcursor_add(cursor, hf_skinny_waitTimeBeforeNextReq, 4, ENC_LITTLE_ENDIAN); +} + + +/* Messages Handler Array */ +typedef void (*message_handler) (ptvcursor_t * cursor, packet_info *pinfo); +static const struct opcode2handler { + guint16 opcode; + message_handler handler; + const char *name; +} skinny_opcode2handler[] = { + {0x0000, NULL , "KeepAliveMessage"}, + {0x0001, handle_RegisterMessage , "RegisterMessage"}, + {0x0002, handle_IpPortMessage , "IpPortMessage"}, + {0x0003, handle_KeypadButtonMessage , "KeypadButtonMessage"}, + {0x0004, handle_EnblocCallMessage , "EnblocCallMessage"}, + {0x0005, handle_StimulusMessage , "StimulusMessage"}, + {0x0006, handle_OffHookMessage , "OffHookMessage"}, + {0x0007, handle_OnHookMessage , "OnHookMessage"}, + {0x0008, handle_HookFlashMessage , "HookFlashMessage"}, + {0x0009, handle_ForwardStatReqMessage , "ForwardStatReqMessage"}, + {0x000a, handle_SpeedDialStatReqMessage , "SpeedDialStatReqMessage"}, + {0x000b, handle_LineStatReqMessage , "LineStatReqMessage"}, + {0x000c, NULL , "ConfigStatReqMessage"}, + {0x000d, NULL , "TimeDateReqMessage"}, + {0x000e, NULL , "ButtonTemplateReqMessage"}, + {0x000f, NULL , "VersionReqMessage"}, + {0x0010, handle_CapabilitiesRes , "CapabilitiesRes"}, + {0x0012, NULL , "ServerReqMessage"}, + {0x0020, handle_AlarmMessage , "AlarmMessage"}, + {0x0021, handle_MulticastMediaReceptionAckMessage , "MulticastMediaReceptionAckMessage"}, + {0x0022, handle_OpenReceiveChannelAckMessage , "OpenReceiveChannelAckMessage"}, + {0x0023, handle_ConnectionStatisticsResMessage , "ConnectionStatisticsResMessage"}, + {0x0024, handle_OffHookWithCgpnMessage , "OffHookWithCgpnMessage"}, + {0x0025, NULL , "SoftKeySetReqMessage"}, + {0x0026, handle_SoftKeyEventMessage , "SoftKeyEventMessage"}, + {0x0027, handle_UnregisterMessage , "UnregisterMessage"}, + {0x0028, NULL , "SoftKeyTemplateReqMessage"}, + {0x0029, handle_RegisterTokenReq , "RegisterTokenReq"}, + {0x002a, handle_MediaTransmissionFailureMessage , "MediaTransmissionFailureMessage"}, + {0x002b, handle_HeadsetStatusMessage , "HeadsetStatusMessage"}, + {0x002c, handle_MediaResourceNotificationMessage , "MediaResourceNotificationMessage"}, + {0x002d, handle_RegisterAvailableLinesMessage , "RegisterAvailableLinesMessage"}, + {0x002e, handle_DeviceToUserDataMessage , "DeviceToUserDataMessage"}, + {0x002f, handle_DeviceToUserDataResponseMessage , "DeviceToUserDataResponseMessage"}, + {0x0030, handle_UpdateCapabilitiesMessage , "UpdateCapabilitiesMessage"}, + {0x0031, handle_OpenMultiMediaReceiveChannelAckMessage , "OpenMultiMediaReceiveChannelAckMessage"}, + {0x0032, handle_ClearConferenceMessage , "ClearConferenceMessage"}, + {0x0033, handle_ServiceURLStatReqMessage , "ServiceURLStatReqMessage"}, + {0x0034, handle_FeatureStatReqMessage , "FeatureStatReqMessage"}, + {0x0035, handle_CreateConferenceResMessage , "CreateConferenceResMessage"}, + {0x0036, handle_DeleteConferenceResMessage , "DeleteConferenceResMessage"}, + {0x0037, handle_ModifyConferenceResMessage , "ModifyConferenceResMessage"}, + {0x0038, handle_AddParticipantResMessage , "AddParticipantResMessage"}, + {0x0039, handle_AuditConferenceResMessage , "AuditConferenceResMessage"}, + {0x0040, handle_AuditParticipantResMessage , "AuditParticipantResMessage"}, + {0x0041, handle_DeviceToUserDataMessageVersion1 , "DeviceToUserDataMessageVersion1"}, + {0x0042, handle_DeviceToUserDataResponseMessageVersion1 , "DeviceToUserDataResponseMessageVersion1"}, + {0x0043, handle_UpdateCapabilitiesV2Message , "UpdateCapabilitiesV2Message"}, + {0x0044, handle_UpdateCapabilitiesV3Message , "UpdateCapabilitiesV3Message"}, + {0x0045, handle_PortResMessage , "PortResMessage"}, + {0x0046, handle_QoSResvNotifyMessage , "QoSResvNotifyMessage"}, + {0x0047, handle_QoSErrorNotifyMessage , "QoSErrorNotifyMessage"}, + {0x0048, handle_SubscriptionStatReqMessage , "SubscriptionStatReqMessage"}, + {0x0049, handle_MediaPathEventMessage , "MediaPathEventMessage"}, + {0x004a, handle_MediaPathCapabilityMessage , "MediaPathCapabilityMessage"}, + {0x004c, handle_MwiNotificationMessage , "MwiNotificationMessage"}, + {0x0081, handle_RegisterAckMessage , "RegisterAckMessage"}, + {0x0082, handle_StartToneMessage , "StartToneMessage"}, + {0x0083, handle_StopToneMessage , "StopToneMessage"}, + {0x0085, handle_SetRingerMessage , "SetRingerMessage"}, + {0x0086, handle_SetLampMessage , "SetLampMessage"}, + {0x0088, handle_SetSpeakerModeMessage , "SetSpeakerModeMessage"}, + {0x0089, handle_SetMicroModeMessage , "SetMicroModeMessage"}, + {0x008a, handle_StartMediaTransmissionMessage , "StartMediaTransmissionMessage"}, + {0x008b, handle_StopMediaTransmissionMessage , "StopMediaTransmissionMessage"}, + {0x008f, handle_CallInfoMessage , "CallInfoMessage"}, + {0x0090, handle_ForwardStatMessage , "ForwardStatMessage"}, + {0x0091, handle_SpeedDialStatMessage , "SpeedDialStatMessage"}, + {0x0092, handle_LineStatMessage , "LineStatMessage"}, + {0x0093, handle_ConfigStatMessage , "ConfigStatMessage"}, + {0x0094, handle_DefineTimeDate , "DefineTimeDate"}, + {0x0095, handle_StartSessionTransmissionMessage , "StartSessionTransmissionMessage"}, + {0x0096, handle_StopSessionTransmissionMessage , "StopSessionTransmissionMessage"}, + {0x0097, handle_ButtonTemplateMessage , "ButtonTemplateMessage"}, + {0x0098, handle_VersionMessage , "VersionMessage"}, + {0x0099, handle_DisplayTextMessage , "DisplayTextMessage"}, + {0x009a, NULL , "ClearDisplay"}, + {0x009b, NULL , "CapabilitiesReq"}, + {0x009d, handle_RegisterRejectMessage , "RegisterRejectMessage"}, + {0x009e, handle_ServerResMessage , "ServerResMessage"}, + {0x009f, handle_Reset , "Reset"}, + {0x0100, NULL , "KeepAliveAckMessage"}, + {0x0101, handle_StartMulticastMediaReceptionMessage , "StartMulticastMediaReceptionMessage"}, + {0x0102, handle_StartMulticastMediaTransmissionMessage , "StartMulticastMediaTransmissionMessage"}, + {0x0103, handle_StopMulticastMediaReceptionMessage , "StopMulticastMediaReceptionMessage"}, + {0x0104, handle_StopMulticastMediaTransmissionMessage , "StopMulticastMediaTransmissionMessage"}, + {0x0105, handle_OpenReceiveChannelMessage , "OpenReceiveChannelMessage"}, + {0x0106, handle_CloseReceiveChannelMessage , "CloseReceiveChannelMessage"}, + {0x0107, handle_ConnectionStatisticsReqMessage , "ConnectionStatisticsReqMessage"}, + {0x0108, handle_SoftKeyTemplateResMessage , "SoftKeyTemplateResMessage"}, + {0x0109, handle_SoftKeySetResMessage , "SoftKeySetResMessage"}, + {0x0110, handle_SelectSoftKeysMessage , "SelectSoftKeysMessage"}, + {0x0111, handle_CallStateMessage , "CallStateMessage"}, + {0x0112, handle_DisplayPromptStatusMessage , "DisplayPromptStatusMessage"}, + {0x0113, handle_ClearPromptStatusMessage , "ClearPromptStatusMessage"}, + {0x0114, handle_DisplayNotifyMessage , "DisplayNotifyMessage"}, + {0x0115, NULL , "ClearNotifyMessage"}, + {0x0116, handle_ActivateCallPlaneMessage , "ActivateCallPlaneMessage"}, + {0x0117, NULL , "DeactivateCallPlaneMessage"}, + {0x0118, handle_UnregisterAckMessage , "UnregisterAckMessage"}, + {0x0119, handle_BackSpaceReqMessage , "BackSpaceReqMessage"}, + {0x011a, NULL , "RegisterTokenAck"}, + {0x011b, handle_RegisterTokenReject , "RegisterTokenReject"}, + {0x011c, handle_StartMediaFailureDetectionMessage , "StartMediaFailureDetectionMessage"}, + {0x011d, handle_DialedNumberMessage , "DialedNumberMessage"}, + {0x011e, handle_UserToDeviceDataMessage , "UserToDeviceDataMessage"}, + {0x011f, handle_FeatureStatMessage , "FeatureStatMessage"}, + {0x0120, handle_DisplayPriNotifyMessage , "DisplayPriNotifyMessage"}, + {0x0121, handle_ClearPriNotifyMessage , "ClearPriNotifyMessage"}, + {0x0122, handle_StartAnnouncementMessage , "StartAnnouncementMessage"}, + {0x0123, handle_StopAnnouncementMessage , "StopAnnouncementMessage"}, + {0x0124, handle_AnnouncementFinishMessage , "AnnouncementFinishMessage"}, + {0x0127, handle_NotifyDtmfToneMessage , "NotifyDtmfToneMessage"}, + {0x0128, handle_SendDtmfToneMessage , "SendDtmfToneMessage"}, + {0x0129, handle_SubscribeDtmfPayloadReqMessage , "SubscribeDtmfPayloadReqMessage"}, + {0x012a, handle_SubscribeDtmfPayloadResMessage , "SubscribeDtmfPayloadResMessage"}, + {0x012b, handle_SubscribeDtmfPayloadErrMessage , "SubscribeDtmfPayloadErrMessage"}, + {0x012c, handle_UnSubscribeDtmfPayloadReqMessage , "UnSubscribeDtmfPayloadReqMessage"}, + {0x012d, handle_UnSubscribeDtmfPayloadResMessage , "UnSubscribeDtmfPayloadResMessage"}, + {0x012e, handle_UnSubscribeDtmfPayloadErrMessage , "UnSubscribeDtmfPayloadErrMessage"}, + {0x012f, handle_ServiceURLStatMessage , "ServiceURLStatMessage"}, + {0x0130, handle_CallSelectStatMessage , "CallSelectStatMessage"}, + {0x0131, handle_OpenMultiMediaReceiveChannelMessage , "OpenMultiMediaReceiveChannelMessage"}, + {0x0132, handle_StartMultiMediaTransmissionMessage , "StartMultiMediaTransmissionMessage"}, + {0x0133, handle_StopMultiMediaTransmissionMessage , "StopMultiMediaTransmissionMessage"}, + {0x0134, handle_MiscellaneousCommandMessage , "MiscellaneousCommandMessage"}, + {0x0135, handle_FlowControlCommandMessage , "FlowControlCommandMessage"}, + {0x0136, handle_CloseMultiMediaReceiveChannelMessage , "CloseMultiMediaReceiveChannelMessage"}, + {0x0137, handle_CreateConferenceReqMessage , "CreateConferenceReqMessage"}, + {0x0138, handle_DeleteConferenceReqMessage , "DeleteConferenceReqMessage"}, + {0x0139, handle_ModifyConferenceReqMessage , "ModifyConferenceReqMessage"}, + {0x013a, handle_AddParticipantReqMessage , "AddParticipantReqMessage"}, + {0x013b, handle_DropParticipantReqMessage , "DropParticipantReqMessage"}, + {0x013c, NULL , "AuditConferenceReqMessage"}, + {0x013d, handle_AuditParticipantReqMessage , "AuditParticipantReqMessage"}, + {0x013e, handle_ChangeParticipantReqMessage , "ChangeParticipantReqMessage"}, + {0x013f, handle_UserToDeviceDataMessageVersion1 , "UserToDeviceDataMessageVersion1"}, + {0x0140, handle_VideoDisplayCommandMessage , "VideoDisplayCommandMessage"}, + {0x0141, handle_FlowControlNotifyMessage , "FlowControlNotifyMessage"}, + {0x0142, handle_ConfigStatV2Message , "ConfigStatV2Message"}, + {0x0143, handle_DisplayNotifyV2Message , "DisplayNotifyV2Message"}, + {0x0144, handle_DisplayPriNotifyV2Message , "DisplayPriNotifyV2Message"}, + {0x0145, handle_DisplayPromptStatusV2Message , "DisplayPromptStatusV2Message"}, + {0x0146, handle_FeatureStatV2Message , "FeatureStatV2Message"}, + {0x0147, handle_LineStatV2Message , "LineStatV2Message"}, + {0x0148, handle_ServiceURLStatV2Message , "ServiceURLStatV2Message"}, + {0x0149, handle_SpeedDialStatV2Message , "SpeedDialStatV2Message"}, + {0x014a, handle_CallInfoV2Message , "CallInfoV2Message"}, + {0x014b, handle_PortReqMessage , "PortReqMessage"}, + {0x014c, handle_PortCloseMessage , "PortCloseMessage"}, + {0x014d, handle_QoSListenMessage , "QoSListenMessage"}, + {0x014e, handle_QoSPathMessage , "QoSPathMessage"}, + {0x014f, handle_QoSTeardownMessage , "QoSTeardownMessage"}, + {0x0150, handle_UpdateDSCPMessage , "UpdateDSCPMessage"}, + {0x0151, handle_QoSModifyMessage , "QoSModifyMessage"}, + {0x0152, handle_SubscriptionStatMessage , "SubscriptionStatMessage"}, + {0x0153, handle_NotificationMessage , "NotificationMessage"}, + {0x0154, handle_StartMediaTransmissionAckMessage , "StartMediaTransmissionAckMessage"}, + {0x0155, handle_StartMultiMediaTransmissionAckMessage , "StartMultiMediaTransmissionAckMessage"}, + {0x0156, handle_CallHistoryInfoMessage , "CallHistoryInfoMessage"}, + {0x0158, handle_MwiResponseMessage , "MwiResponseMessage"}, + {0x015a, handle_EnhancedAlarmMessage , "EnhancedAlarmMessage"}, + {0x015e, NULL , "CallCountReqMessage"}, + {0x015f, handle_CallCountRespMessage , "CallCountRespMessage"}, + {0x0160, handle_RecordingStatusMessage , "RecordingStatusMessage"}, + {0x8000, handle_SPCPRegisterTokenReq , "SPCPRegisterTokenReq"}, + {0x8100, handle_SPCPRegisterTokenAck , "SPCPRegisterTokenAck"}, + {0x8101, handle_SPCPRegisterTokenReject , "SPCPRegisterTokenReject"}, +}; + +/* Dissect a single SCCP PDU */ +static int dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +{ + guint offset = 0; + /*gboolean is_video = FALSE;*/ /* FIX ME: need to indicate video or not */ + ptvcursor_t* cursor; /* Header fields */ guint32 hdr_data_length; guint32 hdr_version; guint32 data_messageid; - /* guint32 data_size; */ - - guint i = 0; - guint t = 0; - int j = 0; - guint count; - int val; - guint32 ipversion; - - guint32 capCount; - guint32 softKeyCount; - guint32 softKeySetCount; - guint16 validKeyMask; + guint16 i; /* Set up structures we will need to add the protocol subtree and manage it */ - proto_item *ti; proto_tree *skinny_tree = NULL; - proto_tree *skinny_sub_tree; - proto_tree *skinny_sub_tree_sav; - proto_tree *skinny_sub_tree_sav_sav; - - proto_item *skm = NULL; - proto_item *skm_tree = NULL; + proto_item *ti = NULL; + /* Initialization */ + /* hdr_data_length = tvb_get_letohl(tvb, offset); hdr_version = tvb_get_letohl(tvb, offset+4); data_messageid = tvb_get_letohl(tvb, offset+8); + */ + hdr_data_length = tvb_get_letohl(tvb, 0); + hdr_version = tvb_get_letohl(tvb, 4); + data_messageid = tvb_get_letohl(tvb, 8); /* Initialise stat info for passing to tap */ pi_current++; @@ -1478,9 +7699,12 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da si->callingParty = NULL; g_free(si->calledParty); si->calledParty = NULL; + si->openreceiveStatus = 0; + si->startmediatransmisionStatus = 0; /* In the interest of speed, if "tree" is NULL, don't do any work not - * necessary to generate protocol tree items. */ + * necessary to generate protocol tree items. + */ if (tree) { ti = proto_tree_add_item(tree, proto_skinny, tvb, offset, hdr_data_length+8, ENC_NA); skinny_tree = proto_item_add_subtree(ti, ett_skinny); @@ -1491,1936 +7715,26 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da col_add_fstr(pinfo->cinfo, COL_INFO,"%s ", si->messageName); col_set_fence(pinfo->cinfo, COL_INFO); - proto_tree_add_uint(skinny_tree, hf_skinny_messageid, tvb,offset+8, 4, data_messageid ); + /*offset += 8;*/ + /*cursor = ptvcursor_new(skinny_tree, tvb, offset);*/ - { - switch(data_messageid) { + proto_tree_add_uint(skinny_tree, hf_skinny_messageId, tvb,offset+8, 4, data_messageid ); + /*ptvcursor_add(cursor, hf_skinny_messageId, 4, data_messageid);*/ - case 0x0000: /* KeepAliveMessage */ - break; + offset += 12; + cursor = ptvcursor_new(skinny_tree, tvb, offset); - case 0x0001: /* RegisterMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, StationMaxDeviceNameSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+36, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_deviceType, tvb, offset+40, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_maxStreams, tvb, offset+44, 4, ENC_LITTLE_ENDIAN); - if (hdr_data_length > 52) { - proto_tree_add_item(skinny_tree, hf_skinny_activeStreams, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_phoneFeatures, tvb, offset+52, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_IPVersion, tvb, offset+56, 4, ENC_LITTLE_ENDIAN); - } - if (hdr_data_length > 100) { - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+60, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_macAddress, tvb, offset+64, 12, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+76, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_maxButtons, tvb, offset+80, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_ipV6Address, tvb, offset+84, 16, ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+100, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_loadInfo, tvb, offset+104, hdr_data_length-96, ENC_ASCII|ENC_NA); - } - break; - - case 0x0002: /* IpPortMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_stationIpPort, tvb, offset+12, 2, ENC_BIG_ENDIAN); - break; - - case 0x0003: /* KeypadButtonMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_stationKeypadButton, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - if (hdr_data_length > 8) { - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - } - break; - - case 0x0004: /* EnblocCallMessage -- This decode NOT verified*/ - proto_tree_add_item(skinny_tree, hf_skinny_calledPartyNumber, tvb, offset+12, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - break; - - case 0x0005: /* StimulusMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_stimulus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_stimulusInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - if (hdr_data_length > 12) { - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->callId = tvb_get_letohl(tvb, offset+20); - } - break; - - case 0x0006: /* OffHookMessage */ - if (hdr_data_length > 4) { - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+12); - si->callId = tvb_get_letohl(tvb, offset+16); - } - break; - - case 0x0007: /* OnHookMessage */ - if (hdr_data_length > 4) { - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+12); - si->callId = tvb_get_letohl(tvb, offset+16); - } - break; - - case 0x0008: /* HookFlashMessage */ - break; - - case 0x0009: /* ForwardStatReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x000a: /* SpeedDialStatReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_speedDialNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x000b: /* LineStatReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x000c: /* ConfigStatReqMessage */ - break; - - case 0x000d: /* TimeDateReqMessage */ - break; - - case 0x000e: /* ButtonTemplateReqMessage */ - break; - - case 0x000f: /* VersionReqMessage */ - break; - - case 0x0010: /* CapabilitiesResMessage - VERIFIED AS IS */ - capCount = tvb_get_letohl(tvb, offset+12); - proto_tree_add_uint(skinny_tree, hf_skinny_capCount, tvb, offset+12, 4, capCount); - for (i = 0; i < capCount; i++) { - proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+(i*16)+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+(i*16)+20, 2, ENC_LITTLE_ENDIAN); - - /* FIXME -- decode the union (should be interpreted per payloadCapability) */ - /*proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+(i*16)+22, 2, ENC_LITTLE_ENDIAN);*/ - proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+(i*16)+24, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+(i*16)+26, 2, ENC_LITTLE_ENDIAN); - } - break; - - case 0x0011: /* MediaPortListMessage */ - break; - - case 0x0012: /* ServerReqMessage */ - break; - - case 0x0020: /* AlarmMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_alarmSeverity, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, StationMaxAlarmMessageSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_alarmParam1, tvb, offset+96, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_alarmParam2, tvb, offset+100, 4, ENC_BIG_ENDIAN); - break; - - case 0x0021: /* MulticastMediaReceptionAck - This decode NOT verified */ - proto_tree_add_item(skinny_tree, hf_skinny_receptionStatus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x0022: /* OpenReceiveChannelAck */ - if (hdr_version == BASIC_MSG_TYPE) { - address src_addr; - guint32 ipv4_address; - proto_tree_add_item(skinny_tree, hf_skinny_ORCStatus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+16, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - - src_addr.type = AT_IPv4; - src_addr.len = 4; - src_addr.data = (guint8 *)&ipv4_address; - ipv4_address = tvb_get_ipv4(tvb, offset+16); - rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+20), 0, "Skinny", pinfo->fd->num, is_video, NULL); - - si->passThruId = tvb_get_letohl(tvb, offset+24); - } 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) { - address src_addr; - guint32 ipv4_address; - - proto_tree_add_item(skinny_tree, hf_skinny_ORCStatus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - /*Assume the field of next 4 bytes is IP Version*/ - ipversion = tvb_get_ntohl(tvb, offset+16); - proto_tree_add_item(skinny_tree, hf_skinny_IPVersion, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - /*Here we take "0" as IPv4, "others" as IPv6, maybe we need to fix it later*/ - if (ipversion == 0) { - proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+20, 4, ENC_BIG_ENDIAN); - } else { - proto_tree_add_item(skinny_tree, hf_skinny_ipV6Address, tvb, offset+20, 16, ENC_NA); - } - proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+36, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+40, 4, ENC_LITTLE_ENDIAN); - - src_addr.type = AT_IPv4; - src_addr.len = 4; - src_addr.data = (guint8 *)&ipv4_address; - ipv4_address = tvb_get_ipv4(tvb, offset+20); - rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+36), 0, "Skinny", pinfo->fd->num, is_video, NULL); - - si->passThruId = tvb_get_letohl(tvb, offset+40); - } - break; - - case 0x0023: /* ConnectionStatisticsRes */ - proto_tree_add_item(skinny_tree, hf_skinny_directoryNumber, tvb, offset+12, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+36, 4, ENC_LITTLE_ENDIAN); - if (hdr_version == BASIC_MSG_TYPE || hdr_version == CM7_MSG_TYPE_A || hdr_version == CM7_MSG_TYPE_B) { - proto_tree_add_item(skinny_tree, hf_skinny_statsProcessingType, tvb, offset+40, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_packetsSent, tvb, offset+44, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_octetsSent, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_packetsRecv, tvb, offset+52, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_octetsRecv, tvb, offset+56, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_packetsLost, tvb, offset+60, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_jitter, tvb, offset+64, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_latency, tvb, offset+68, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+72, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+76, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+80, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+84, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_qualityStats, tvb, offset+88, hdr_data_length-80, ENC_ASCII|ENC_NA); - } else if (hdr_version == CM7_MSG_TYPE_C || hdr_version == CM7_MSG_TYPE_D) { - proto_tree_add_item(skinny_tree, hf_skinny_packetsSent, tvb, offset+40, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_octetsSent, tvb, offset+44, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_packetsRecv, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_octetsRecv, tvb, offset+52, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_packetsLost, tvb, offset+56, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_jitter, tvb, offset+60, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_latency, tvb, offset+64, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+68, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+72, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+76, 1, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_qualityStats, tvb, offset+77, hdr_data_length-69, ENC_ASCII|ENC_NA); - } - si->callId = tvb_get_letohl(tvb, offset+36); - break; - - case 0x0024: /* OffHookWithCgpnMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_calledPartyNumber, tvb, offset+12,StationMaxDirnumSize, ENC_ASCII|ENC_NA); - break; - - case 0x0025: /* SoftKeySetReqMessage */ - break; - - case 0x0026: /* SoftKeyEventMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_softKeyEvent, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x0027: /* UnregisterMessage */ - break; - - case 0x0028: /* softKeyTemplateRequest */ - break; - - case 0x0029: /* RegisterTokenReq */ - proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, StationMaxDeviceNameSize, ENC_ASCII|ENC_NA); - i = offset+12+StationMaxDeviceNameSize; - proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, i, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, i+4, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, i+8, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_deviceType, tvb, i+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x002A: /* MediaTransmissionFailure */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+20, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+28); - break; - - case 0x002B: /* HeadsetStatusMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_headsetMode, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x002C: /* MediaResourceNotification */ - proto_tree_add_item(skinny_tree, hf_skinny_deviceType, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_numberOfInServiceStreams, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_maxStreamsPerConf, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_numberOfOutOfServiceStreams, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x002D: /* RegisterAvailableLinesMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_numberLines, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x002E: /* DeviceToUserDataMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - count = tvb_get_letohl( tvb, offset+28); - dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+30, count); - si->lineId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x002F: /* DeviceToUserDataResponseMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - count = tvb_get_letohl( tvb, offset+28); - dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+30, count); - si->lineId = tvb_get_letohl(tvb, offset+12); - si->callId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x0030: /* UpdateCapabilitiesMessage */ - /* to do - this message is very large and will span multiple packets, it would be nice to someday */ - /* find out a way to join the next packet and get the complete message to decode */ - proto_tree_add_item(skinny_tree, hf_skinny_audioCapCount, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_videoCapCount, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_dataCapCount, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_RTPPayloadFormat, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_customPictureFormatCount, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - count = offset+32; - capCount=tvb_get_letohl(tvb, offset+28); - for ( i = 0; i < MAX_CUSTOM_PICTURES; i++ ) { - if (i < capCount) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, - "customPictureFormat[%d]", i); - proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureWidth, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureHeight, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_pixelAspectRatio, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_clockConversionCode, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_clockDivisor, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - } else { - count+=20; - } - } - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "confResources"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_activeStreamsOnRegistration, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBW, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceResourceCount, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - skinny_sub_tree_sav = skinny_sub_tree; - for ( i = 0; i < MAX_SERVICE_TYPE; i++ ) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 20, ett_skinny_tree, NULL, - "serviceResource[%d]", i); - proto_tree_add_item(skinny_sub_tree, hf_skinny_layoutCount, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - skinny_sub_tree_sav_sav = skinny_sub_tree_sav; - for ( t = 0; t < MAX_LAYOUT_WITH_SAME_SERVICE; t++ ) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 20, ett_skinny_tree, NULL, "layouts[%d]", t); - proto_tree_add_item(skinny_sub_tree, hf_skinny_layout, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - } - skinny_sub_tree = skinny_sub_tree_sav_sav; - proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceNum, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxStreams, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxConferences, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_activeConferenceOnRegistration, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - } - capCount=tvb_get_letohl(tvb, offset+12); - for ( i = 0; i < StationMaxCapabilities; i++ ) { - if (i < capCount) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "audiocaps[%d]", i); - proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxFramesPerPacket, tvb, count, 2, ENC_LITTLE_ENDIAN); - count+= 2; - proto_tree_add_item(skinny_sub_tree, hf_skinny_g723BitRate, tvb, count, 2, ENC_LITTLE_ENDIAN); - count+= 2; - proto_tree_add_item(skinny_sub_tree, hf_skinny_unknown, tvb, count, 2, ENC_LITTLE_ENDIAN); - count+= 8; - } else { - count+= 16; - } - } - capCount=tvb_get_letohl(tvb, offset+16); - for ( i = 0; i < StationMaxVideoCapabilities; i++ ) { - if (i < capCount) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "vidCaps[%d]", i); - proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_levelPreferenceCount, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - skinny_sub_tree_sav = skinny_sub_tree; - for ( t = 0; t < MAX_LEVEL_PREFERENCE; t++ ) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 20, ett_skinny_tree, NULL, "levelPreference[%d]", t); - proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitPreference, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_minBitRate, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_MPI, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceNumber, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - } - val = count; - - /* H.261 */ - skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h261VideoCapability"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, ENC_LITTLE_ENDIAN); - /*count+= 4;*/ - - /* H.263 */ - count = val; - skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h263VideoCapability"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, ENC_LITTLE_ENDIAN); - /*count+= 4;*/ - - /* Video */ - count = val; - skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "vieoVideoCapability"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - } else { - count+=28 + (MAX_LEVEL_PREFERENCE-1)*4; - } - } - capCount=tvb_get_letohl(tvb, offset+20); - for ( i = 0; i < StationMaxDataCapabilities; i++ ) { - if ( i < capCount) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "dataCaps[%d]", i); - proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_protocolDependentData, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - } else { - count+= 16; - } - } - break; - - case 0x0031: /* OpenMultiMediaReceiveChannelAckMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_ORCStatus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+16, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+24); - si->callId = tvb_get_letohl(tvb, offset+28); - break; - - case 0x0032: /* ClearConferenceMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_serviceNum, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0033: /* ServiceURLStatReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_serviceURLIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0034: /* FeatureStatReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_featureIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0035: /* CreateConferenceResMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_createConfResults, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - count = tvb_get_letohl( tvb, offset+20); - proto_tree_add_uint(skinny_tree, hf_skinny_passThruData, tvb, offset+24, 1, count); - break; - - case 0x0036: /* DeleteConferenceResMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_deleteConfResults, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0037: /* ModifyConferenceResMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_modifyConfResults, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - count = tvb_get_letohl( tvb, offset+20); - proto_tree_add_uint(skinny_tree, hf_skinny_passThruData, tvb, offset+24, 1, count); - break; - - case 0x0038: /* AddParticipantResMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_addParticipantResults, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->callId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x0039: /* AuditConferenceResMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_last, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_numberOfEntries, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - count = offset+20; - for ( i = 0; i < StationMaxConference; i++ ) { - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_tree, hf_skinny_resourceTypes, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_tree, hf_skinny_numberOfReservedParticipants, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_tree, hf_skinny_numberOfActiveParticipants, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_tree, hf_skinny_appID, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_uint(skinny_tree, hf_skinny_appConfID, tvb, count, 1, AppConferenceIDSize); - count += AppConferenceIDSize; - proto_tree_add_uint(skinny_tree, hf_skinny_appData, tvb, count, 1, AppDataSize); - count += AppDataSize; - } - break; - - case 0x0040: /* AuditParticipantResMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_auditParticipantResults, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_last, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_numberOfEntries, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - count = tvb_get_letohl( tvb, offset+24); - for ( i = 0; i < count; i++ ) { - proto_tree_add_item(skinny_tree, hf_skinny_participantEntry, tvb, offset+28+(i*4), 4, ENC_LITTLE_ENDIAN); - } - break; - - case 0x0041: /* DeviceToUserDataVersion1Message */ - proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - count = tvb_get_letohl( tvb, offset+28); - proto_tree_add_item(skinny_tree, hf_skinny_sequenceFlag, tvb, offset+30, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_displayPriority, tvb, offset+34, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+38, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_appInstanceID, tvb, offset+42, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_routingID, tvb, offset+46, 4, ENC_LITTLE_ENDIAN); - dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+50, count); - si->lineId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x0042: /* DeviceToUserDataResponseVersion1Message */ - proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - count = tvb_get_letohl( tvb, offset+28); - proto_tree_add_item(skinny_tree, hf_skinny_sequenceFlag, tvb, offset+30, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_displayPriority, tvb, offset+34, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+38, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_appInstanceID, tvb, offset+42, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_routingID, tvb, offset+46, 4, ENC_LITTLE_ENDIAN); - dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+50, count); - si->lineId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x0044: /* DynUpdateCapabilitiesMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_audioCapCount, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_videoCapCount, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_dataCapCount, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_RTPPayloadFormat, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_customPictureFormatCount, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - count = offset+32; - capCount=tvb_get_letohl(tvb, offset+28); - for ( i = 0; i < MAX_CUSTOM_PICTURES; i++ ) { - if (i < capCount) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "customPictureFormat[%d]", i); - proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureWidth, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureHeight, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_pixelAspectRatio, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_clockConversionCode, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_clockDivisor, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - } else { - count+=20; - } - } - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "confResources"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_activeStreamsOnRegistration, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBW, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceResourceCount, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - skinny_sub_tree_sav = skinny_sub_tree; - for ( i = 0; i < MAX_SERVICE_TYPE; i++ ) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 20, ett_skinny_tree, NULL, "serviceResource[%d]", i); - proto_tree_add_item(skinny_sub_tree, hf_skinny_layoutCount, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - skinny_sub_tree_sav_sav = skinny_sub_tree_sav; - for ( t = 0; t < MAX_LAYOUT_WITH_SAME_SERVICE; t++ ) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 20, ett_skinny_tree, NULL, "layouts[%d]", t); - proto_tree_add_item(skinny_sub_tree, hf_skinny_layout, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - } - skinny_sub_tree = skinny_sub_tree_sav_sav; - proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceNum, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxStreams, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxConferences, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_activeConferenceOnRegistration, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - } - capCount=tvb_get_letohl(tvb, offset+12); - for ( i = 0; i < StationMaxCapabilities; i++ ) { - if (i < capCount) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "audiocaps[%d]", i); - proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxFramesPerPacket, tvb, count, 2, ENC_LITTLE_ENDIAN); - count+= 2; - proto_tree_add_item(skinny_sub_tree, hf_skinny_g723BitRate, tvb, count, 2, ENC_LITTLE_ENDIAN); - count+= 2; - proto_tree_add_item(skinny_sub_tree, hf_skinny_unknown, tvb, count, 2, ENC_LITTLE_ENDIAN); - count+= 8; - } else { - count+= 16; - } - } - capCount=tvb_get_letohl(tvb, offset+16); - for ( i = 0; i < StationMaxVideoCapabilities; i++ ) { - if (i < capCount) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "vidCaps[%d]", i); - proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_levelPreferenceCount, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - skinny_sub_tree_sav = skinny_sub_tree; - for ( t = 0; t < MAX_LEVEL_PREFERENCE; t++ ) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 20, ett_skinny_tree, NULL, "levelPreference[%d]", t); - proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitPreference, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_minBitRate, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_MPI, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_serviceNumber, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - } - val = count; - - /* H.261 */ - skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h261VideoCapability"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, ENC_LITTLE_ENDIAN); - /*count+= 4;*/ - - /* H.263 */ - count = val; - skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h263VideoCapability"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, ENC_LITTLE_ENDIAN); - /*count+= 4;*/ - - /* Video */ - count = val; - skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "vieoVideoCapability"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - } else { - count+=28 + (MAX_LEVEL_PREFERENCE-1)*4; - } - } - capCount=tvb_get_letohl(tvb, offset+20); - for ( i = 0; i < StationMaxDataCapabilities; i++ ) { - if ( i < capCount) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "dataCaps[%d]", i); - proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_protocolDependentData, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, count, 4, ENC_LITTLE_ENDIAN); - count+= 4; - } else { - count+= 16; - } - } - break; - - case 0x0048: /* DialedPhoneBookMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_directoryIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_directoryPhoneNumber, tvb, offset+24, hdr_data_length-16, ENC_ASCII|ENC_NA); - break; - - case 0x0049: /* AccessoryStatusMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_accessory, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_accessoryState, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - if (hdr_data_length > 16) { - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - } - break; - - case 0x004A: /* Unknown_Message_0x004A */ - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - if (hdr_data_length > 16) { - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - } - break; - - case 0x004C: /* MwiNotificationMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - /* - * - * Call manager -> client messages start here(ish) - * - */ - case 0x0081: /* RegisterAckMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_keepAliveInterval, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_dateTemplate, tvb, offset+16, StationDateTemplateSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_secondaryKeepAliveInterval, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0082: /* StartToneMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_deviceTone, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - /* offset 16 to 19: reserved */ - if (hdr_data_length > 12) { - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+20); - si->callId = tvb_get_letohl(tvb, offset+24); - } - break; - - case 0x0083: /* StopToneMessage */ - if (hdr_data_length > 4) { - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+12); - si->callId = tvb_get_letohl(tvb, offset+16); - } - break; - - case 0x0085: /* SetRingerMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_ringType, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_ringMode, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - if (hdr_data_length > 12) { - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+20); - si->callId = tvb_get_letohl(tvb, offset+24); - } - break; - - case 0x0086: /* SetLampMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_stimulus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_stimulusInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lampMode, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0087: /* SetHookFlashDetectModeMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_hookFlashDetectMode, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_detectInterval, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0088: /* SetSpeakerModeMessage */ - - proto_tree_add_item(skinny_tree, hf_skinny_speakerMode, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0089: /* SetMicroModeMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_microphoneMode, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x008a: /* StartMediaTransmission */ - if (hdr_version == BASIC_MSG_TYPE) { - address src_addr; - guint32 ipv4_address; - - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr, tvb, offset+20, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_remotePortNumber, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_precedenceValue, tvb, offset+36, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_silenceSuppression, tvb, offset+40, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+44, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - - src_addr.type = AT_IPv4; - src_addr.len = 4; - src_addr.data = (char *)&ipv4_address; - ipv4_address = tvb_get_ipv4(tvb, offset+20); - rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+24), 0, "Skinny", pinfo->fd->num, is_video, NULL); - - si->passThruId = tvb_get_letohl(tvb, offset+16); - } - 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) - { - address src_addr; - guint32 ipv4_address; - - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - /*Assume the field of next 4 bytes is IP Version*/ - ipversion = tvb_get_ntohl(tvb, offset+20); - proto_tree_add_item(skinny_tree, hf_skinny_IPVersion, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - /*Here we take "0" as IPv4, "others" as IPv6, maybe we need to fix it later*/ - if (ipversion ==0) { - proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr, tvb, offset+24, 4, ENC_BIG_ENDIAN); - } else { - proto_tree_add_item(skinny_tree, hf_skinny_ipV6Address, tvb, offset+24, 16, ENC_NA); - } - proto_tree_add_item(skinny_tree, hf_skinny_remotePortNumber, tvb, offset+40, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+44, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - /* There is some more... */ - proto_tree_add_item(skinny_tree, hf_skinny_precedenceValue, tvb, offset+52, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_silenceSuppression, tvb, offset+56, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+60, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+62, 4, ENC_LITTLE_ENDIAN); - /* proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+66, 4, ENC_LITTLE_ENDIAN); */ - /* proto_tree_add_item(skinny_tree, hf_skinny_rtpDTMFPayload, tvb, offset+126, 4, ENC_LITTLE_ENDIAN); */ - /* proto_tree_add_item(skinny_tree, hf_skinny_rtptimeout, tvb, offset+130, 4, ENC_LITTLE_ENDIAN); */ - - src_addr.type = AT_IPv4; - src_addr.len = 4; - src_addr.data = (char *)&ipv4_address; - ipv4_address = tvb_get_ipv4(tvb, offset+24); - rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+40), 0, "Skinny", pinfo->fd->num, is_video, NULL); - - si->passThruId = tvb_get_letohl(tvb, offset+16); - } - break; - - case 0x008b: /* StopMediaTransmission */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x008c: /* StartMediaReception */ - break; - - case 0x008d: /* StopMediaReception */ - break; - - case 0x008f: /* CallInfoMessage */ - i = offset+12; - proto_tree_add_item(skinny_tree, hf_skinny_callingPartyName, tvb, i, StationMaxNameSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_callingPartyNumber, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - i += StationMaxNameSize; - si->callingParty = g_strdup(tvb_format_stringzpad(tvb, i, StationMaxDirnumSize)); - i += StationMaxDirnumSize; - proto_tree_add_item(skinny_tree, hf_skinny_calledPartyName, tvb, i, StationMaxNameSize, ENC_ASCII|ENC_NA); - i += StationMaxNameSize; - proto_tree_add_item(skinny_tree, hf_skinny_calledPartyNumber, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - si->calledParty = g_strdup(tvb_format_stringzpad(tvb, i, StationMaxDirnumSize)); - i += StationMaxDirnumSize; - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, i, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, i); - i += 4; - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, i, 4, ENC_LITTLE_ENDIAN); - si->callId = tvb_get_letohl(tvb, i); - i += 4; - proto_tree_add_item(skinny_tree, hf_skinny_callType, tvb, i, 4, ENC_LITTLE_ENDIAN); - i += 4; - proto_tree_add_item(skinny_tree, hf_skinny_originalCalledPartyName, tvb, i, StationMaxNameSize, ENC_ASCII|ENC_NA); - i += StationMaxNameSize; - proto_tree_add_item(skinny_tree, hf_skinny_originalCalledParty, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - i += StationMaxDirnumSize; - proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingPartyName, tvb, i, StationMaxNameSize, ENC_ASCII|ENC_NA); - i += StationMaxNameSize; - proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingParty, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - i += StationMaxDirnumSize; - proto_tree_add_item(skinny_tree, hf_skinny_originalCdpnRedirectReason, tvb, i, 4, ENC_LITTLE_ENDIAN); - i += 4; - proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingReason, tvb, i, 4, ENC_LITTLE_ENDIAN); - i += 4; - proto_tree_add_item(skinny_tree, hf_skinny_cgpnVoiceMailbox, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - i += StationMaxDirnumSize; - proto_tree_add_item(skinny_tree, hf_skinny_cdpnVoiceMailbox, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - i += StationMaxDirnumSize; - proto_tree_add_item(skinny_tree, hf_skinny_originalCdpnVoiceMailbox, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - i += StationMaxDirnumSize; - proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingVoiceMailbox, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - i += StationMaxDirnumSize; - proto_tree_add_item(skinny_tree, hf_skinny_callInstance, tvb, i, 4, ENC_LITTLE_ENDIAN); - i += 4; - proto_tree_add_item(skinny_tree, hf_skinny_callSecurityStatus, tvb, i, 4, ENC_LITTLE_ENDIAN); - i += 4; - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, i, 8, ett_skinny_tree, NULL, "partyPIRestrictionBits"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_CallingPartyName, tvb, i, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_CallingPartyNumber, tvb, i, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_CalledPartyName, tvb, i, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_CalledPartyNumber, tvb, i, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_OriginalCalledPartyName, tvb, i, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_OriginalCalledPartyNumber, tvb, i, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_LastRedirectPartyName, tvb, i, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_LastRedirectPartyNumber, tvb, i, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0090: /* ForwardStatMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_activeForward, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_forwardAllActive, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_forwardNumber, tvb, offset+24, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - i = offset+24+StationMaxDirnumSize; - proto_tree_add_item(skinny_tree, hf_skinny_forwardBusyActive, tvb, i, 4, ENC_LITTLE_ENDIAN); - i += 4; - proto_tree_add_item(skinny_tree, hf_skinny_forwardNumber, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - i += StationMaxDirnumSize; - proto_tree_add_item(skinny_tree, hf_skinny_forwardNoAnswerActive, tvb, i, 4, ENC_LITTLE_ENDIAN); - i += 4; - proto_tree_add_item(skinny_tree, hf_skinny_forwardNumber, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - break; - - case 0x0091: /* SpeedDialStatMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_speedDialNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_speedDialDirNumber, tvb, offset+16, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_speedDialDisplayName, tvb, offset+40, StationMaxNameSize, ENC_ASCII|ENC_NA); - break; - - case 0x0092: /* LineStatMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineDirNumber, tvb, offset+16, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_lineFullyQualifiedDisplayName, tvb, offset+16+StationMaxDirnumSize, StationMaxNameSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_lineDisplayName, tvb, offset+16+StationMaxDirnumSize+StationMaxNameSize, StationMaxDisplayNameSize, ENC_ASCII|ENC_NA); - break; - - case 0x0093: /* ConfigStatMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, StationMaxDeviceNameSize, ENC_ASCII|ENC_NA); - i = offset+12+StationMaxDeviceNameSize; - proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, i, 4, ENC_LITTLE_ENDIAN); - i += 4; - proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, i, 4, ENC_LITTLE_ENDIAN); - i += 4; - proto_tree_add_item(skinny_tree, hf_skinny_userName, tvb, i, StationMaxNameSize, ENC_ASCII|ENC_NA); - i += StationMaxNameSize; - proto_tree_add_item(skinny_tree, hf_skinny_serverName, tvb, i, StationMaxNameSize, ENC_ASCII|ENC_NA); - i += StationMaxNameSize; - proto_tree_add_item(skinny_tree, hf_skinny_numberLines, tvb, i, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_numberSpeedDials, tvb, i+4, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0094: /* DefineTimeDate */ - proto_tree_add_item(skinny_tree, hf_skinny_dateYear, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_dateMonth, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_dayOfWeek, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_dateDay, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_dateHour, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_dateMinute, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_dateSeconds,tvb, offset+36, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_dateMilliseconds,tvb, offset+40, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_timeStamp, tvb, offset+44, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0095: /* StartSessionTransmission */ - proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr, tvb, offset+12, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_sessionType, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0096: /* StopSessionTransmission */ - proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr, tvb, offset+12, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_sessionType, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0097: /* ButtonTemplateMessage */ - /* - * FIXME - * This decode prints out oogly subtree maybe? or something besides the VALS... - * note to self: uint8 != 4 kk thx info ^_^ - * - */ - proto_tree_add_item(skinny_tree, hf_skinny_buttonOffset, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_buttonCount, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_totalButtonCount, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - for (i = 0; i < StationMaxButtonTemplateSize; i++) { - proto_tree_add_item(skinny_tree, hf_skinny_buttonInstanceNumber, tvb, offset+(i*2)+24, 1, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_buttonDefinition, tvb, offset+(i*2)+25, 1, ENC_LITTLE_ENDIAN); - } - break; - - case 0x0098: /* VersionMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_version, tvb, offset+12, StationMaxVersionSize, ENC_ASCII|ENC_NA); - break; - - case 0x0099: /* DisplayTextMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+12, StationMaxDisplayTextSize, ENC_ASCII|ENC_NA); - break; - - case 0x009a: /* ClearDisplay */ - break; - - case 0x009b: /* CapabilitiesReqMessage */ - break; - - case 0x009c: /* EnunciatorCommandMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_mediaEnunciationType, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - for (i = 0; i < StationMaxDirnumSize; i++) { - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+16+(i*4), 4, ENC_LITTLE_ENDIAN); - } - i = offset+16+StationMaxDirnumSize; - proto_tree_add_item(skinny_tree, hf_skinny_mediaEnunciationType, tvb, i, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x009d: /* RegisterRejectMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+12, StationMaxDisplayTextSize, ENC_ASCII|ENC_NA); - break; - - case 0x009e: /* ServerResMessage */ - for (i = 0; i < StationMaxServers; i++) { - proto_tree_add_item(skinny_tree, hf_skinny_serverIdentifier, - tvb, offset+12+(i*StationMaxServers), StationMaxServerNameSize, ENC_ASCII|ENC_NA); - } - j = offset+12+(i*StationMaxServers); - for (i = 0; i < StationMaxServers; i++) { - proto_tree_add_item(skinny_tree, hf_skinny_serverListenPort, tvb, j+(i*4), 4, ENC_LITTLE_ENDIAN); - } - j = j+(i*4); - for (i = 0; i < StationMaxServers; i++) { - proto_tree_add_item(skinny_tree, hf_skinny_serverIpAddress, tvb, j+(i*4), 4, ENC_BIG_ENDIAN); - } - break; - - case 0x009f: /* Reset */ - proto_tree_add_item(skinny_tree, hf_skinny_deviceResetType, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0100: /* KeepAliveAckMessage */ - break; - - case 0x0101: /* StartMulticastMediaReception */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_multicastIpAddress, tvb, offset+20, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_multicastPort, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_echoCancelType, tvb, offset+36, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+40, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x0102: /* StartMulticastMediaTransmission */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_multicastIpAddress, tvb, offset+20, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_multicastPort, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_precedenceValue, tvb, offset+36, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_silenceSuppression, tvb, offset+40, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+44, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x0103: /* StopMulticastMediaReception */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x0104: /* StopMulticastMediaTransmission */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x105: /* OpenReceiveChannel */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_echoCancelType, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x0106: /* CloseReceiveChannel */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x0107: /* ConnectionStatisticsReq */ - i = 12; - proto_tree_add_item(skinny_tree, hf_skinny_directoryNumber, tvb, i, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - i = 12 + StationMaxDirnumSize; - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, i, 4, ENC_LITTLE_ENDIAN); - si->callId = tvb_get_letohl(tvb, i); - i = i+4; - proto_tree_add_item(skinny_tree, hf_skinny_statsProcessingType, tvb, i, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0108: /* SoftKeyTemplateResMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_softKeyOffset, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - softKeyCount = tvb_get_letohl(tvb, offset+16); - proto_tree_add_uint(skinny_tree, hf_skinny_softKeyCount, tvb, offset+16, 4, softKeyCount); - proto_tree_add_item(skinny_tree, hf_skinny_totalSoftKeyCount, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - for (i = 0; ((i < StationMaxSoftKeyDefinition) && (i < softKeyCount)); i++){ - proto_tree_add_item(skinny_tree, hf_skinny_softKeyLabel, - tvb, offset+(i*20)+24, StationMaxSoftKeyLabelSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_softKeyEvent, tvb, offset+(i*20)+40, 4, ENC_LITTLE_ENDIAN); - } - /* there is more data here, but it doesn't make a whole lot of sense, I imagine - * it's just some not zero'd out stuff in the packet or... - */ - break; - - case 0x0109: /* SoftKeySetResMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_softKeySetOffset, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - softKeySetCount = tvb_get_letohl(tvb, offset+16); - proto_tree_add_uint(skinny_tree, hf_skinny_softKeySetCount, tvb, offset+16, 4, softKeySetCount); - proto_tree_add_item(skinny_tree, hf_skinny_totalSoftKeySetCount, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - for (i = 0; ((i < StationMaxSoftKeySetDefinition) && (i < softKeySetCount)); i++) { - proto_tree_add_uint(skinny_tree, hf_skinny_softKeySetDescription, tvb, offset+24+(i*48) , 1, i); - for (j = 0; j < StationMaxSoftKeyIndex; j++) { - proto_tree_add_item(skinny_tree, hf_skinny_softKeyTemplateIndex, tvb, offset+24+(i*48)+j, 1, ENC_LITTLE_ENDIAN); - } - for (j = 0; j < StationMaxSoftKeyIndex; j++) { - proto_tree_add_item(skinny_tree, hf_skinny_softKeyInfoIndex, - tvb, offset+24+(i*48)+StationMaxSoftKeyIndex+(j*2), 2, ENC_LITTLE_ENDIAN); - } - } - break; - - case 0x0110: /* SelectSoftKeysMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_softKeySetDescription, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - validKeyMask = tvb_get_letohs(tvb, offset + 24); - skm = proto_tree_add_uint(skinny_tree, hf_skinny_softKeyMap, tvb, offset + 24, 4, validKeyMask); - skm_tree = proto_item_add_subtree(skm, ett_skinny_softKeyMap); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey0, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey1, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey2, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey3, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey4, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey5, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey6, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey7, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey8, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey9, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey10, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey11, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey12, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey13, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey14, tvb, offset + 24, 4, validKeyMask); - proto_tree_add_boolean(skm_tree, hf_skinny_softKey15, tvb, offset + 24, 4, validKeyMask); - si->lineId = tvb_get_letohl(tvb, offset+12); - si->callId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x0111: /* CallStateMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_callState, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->callState = tvb_get_letohl(tvb, offset+12); - si->lineId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - proto_tree_add_item(skinny_tree, hf_skinny_visibility, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_priority, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0112: /* DisplayPromptStatusMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, StationMaxDisplayPromptStatusSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+52, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+48); - si->callId = tvb_get_letohl(tvb, offset+52); - break; - - case 0x0113: /* ClearPromptStatusMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance , tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+12); - si->callId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x0114: /* DisplayNotifyMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, StationMaxDisplayNotifySize , ENC_ASCII|ENC_NA); - break; - - case 0x0115: /* ClearNotifyMessage */ - break; - - case 0x0116: /* ActivateCallPlaneMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+12); - break; - - case 0x0117: /* DeactivateCallPlaneMessage */ - break; - - case 0x0118: /* UnregisterAckMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_deviceUnregisterStatus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0119: /* BackSpaceReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+12); - si->callId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x011a: /* RegisterTokenAck */ - break; - - case 0x011B: /* RegisterTokenReject */ - proto_tree_add_item(skinny_tree, hf_skinny_tokenRejWaitTime, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x011C: /* StartMediaFailureDetection */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_echoCancelType, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+34, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+34); - break; - - case 0x011D: /* DialedNumberMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_calledPartyNumber, tvb, offset+12, StationMaxDirnumSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12+StationMaxDirnumSize, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+12+StationMaxDirnumSize+4, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+12+StationMaxDirnumSize); - si->callId = tvb_get_letohl(tvb, offset+16+StationMaxDirnumSize); - break; - - case 0x011E: /* UserToDeviceDataMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - count = tvb_get_letohl( tvb, offset+28); - dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+30, count); - si->lineId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x011F: /* FeatureStatMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_featureIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_featureID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_featureTextLabel, tvb, offset+20, StationMaxNameSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_featureStatus, tvb, offset+20+StationMaxNameSize, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0120: /* DisplayPriNotifyMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_priority, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_notify, tvb, offset+16, StationMaxDisplayNotifySize, ENC_ASCII|ENC_NA); - break; - - case 0x0121: /* ClearPriNotifyMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_priority, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0122: /* StartAnnouncementMessage */ - count = offset+12; - for ( i = 0; i < MaxAnnouncementList; i++ ) { - proto_tree_add_item(skinny_tree, hf_skinny_locale, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_tree, hf_skinny_country, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_tree, hf_skinny_deviceTone, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - } - proto_tree_add_item(skinny_tree, hf_skinny_endOfAnnAck, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - - for ( i = 0; i < StationMaxMonitorParties; i++ ) { - proto_tree_add_item(skinny_tree, hf_skinny_matrixConfPartyID, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - } - proto_tree_add_item(skinny_tree, hf_skinny_hearingConfPartyMask, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_tree, hf_skinny_annPlayMode, tvb, count, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0123: /* StopAnnouncementMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0124: /* AnnouncementFinishMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_annPlayStatus, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0127: /* NotifyDtmfToneMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_deviceTone, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x0128: /* SendDtmfToneMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_deviceTone, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x0129: /* SubscribeDtmfPayloadReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x012A: /* SubscribeDtmfPayloadResMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x012B: /* SubscribeDtmfPayloadErrMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x012C: /* UnSubscribeDtmfPayloadReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x012D: /* UnSubscribeDtmfPayloadResMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x012E: /* UnSubscribeDtmfPayloadErrMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_payloadDtmf, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x012F: /* ServiceURLStatMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_serviceURLIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_serviceURL, tvb, offset+16, StationMaxServiceURLSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_serviceURLDisplayName, tvb, offset+16+StationMaxServiceURLSize, StationMaxNameSize, ENC_ASCII|ENC_NA); - break; - - case 0x0130: /* CallSelectStatMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_callSelectStat, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x0131: /* OpenMultiMediaChannelMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_payload_rfc_number, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_payloadType, tvb, offset+36, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_isConferenceCreator, tvb, offset+40, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - si->lineId = tvb_get_letohl(tvb, offset+24); - si->callId = tvb_get_letohl(tvb, offset+28); - - /* add audio part of union */ - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 12, ett_skinny_tree, NULL, "audioParameters"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_millisecondPacketSize, tvb, offset+44, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_echoCancelType, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_g723BitRate, tvb, offset+52, 4, ENC_LITTLE_ENDIAN); - - /* add video part of union */ - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 30, ett_skinny_tree, NULL, "vidParameters"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_bitRate, tvb, offset+44, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureFormatCount, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - skinny_sub_tree_sav = skinny_sub_tree; - count = offset+52; - for ( i = 0; i < MAX_PICTURE_FORMAT; i++ ) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 8 * MAX_PICTURE_FORMAT, - ett_skinny_tree, NULL, "pictureFormat[%d]", i); - proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_MPI, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - } - skinny_sub_tree = skinny_sub_tree_sav; - proto_tree_add_item(skinny_sub_tree, hf_skinny_confServiceNum, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - - val = count; - /* add H261 part of union */ - skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h261VideoCapability"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, ENC_LITTLE_ENDIAN); - - /* add H263 part of union */ - count = val; - skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h263VideoCapability"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, ENC_LITTLE_ENDIAN); - - /* add Vieo part of union */ - count = val; - skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "vieoVideoCapability"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, ENC_LITTLE_ENDIAN); - - /* add data part of union */ - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "dataParameters"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_protocolDependentData, tvb, offset+44, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0132: /* StartMultiMediaTransmission */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+24, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_payload_rfc_number, tvb, offset+36, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_payloadType, tvb, offset+40, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_DSCPValue, tvb, offset+44, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+32); - - /* add audio part of union */ - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 12, ett_skinny_tree, NULL, "audioParameters"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_millisecondPacketSize, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_echoCancelType, tvb, offset+52, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_g723BitRate, tvb, offset+56, 4, ENC_LITTLE_ENDIAN); - - /* add video part of union */ - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 30, ett_skinny_tree, NULL, "vidParameters"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_bitRate, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureFormatCount, tvb, offset+52, 4, ENC_LITTLE_ENDIAN); - skinny_sub_tree_sav = skinny_sub_tree; - count = offset+56; - for ( i = 0; i < MAX_PICTURE_FORMAT; i++ ) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 8 * MAX_PICTURE_FORMAT, - ett_skinny_tree, NULL, "pictureFormat[%d]", i); - proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_MPI, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - } - skinny_sub_tree = skinny_sub_tree_sav; - proto_tree_add_item(skinny_sub_tree, hf_skinny_confServiceNum, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - - val = count; - /* add H261 part of union */ - skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h261VideoCapability"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, ENC_LITTLE_ENDIAN); - - /* add H263 part of union */ - count = val; - skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h263VideoCapability"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, ENC_LITTLE_ENDIAN); - - /* add Vieo part of union */ - count = val; - skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "vieoVideoCapability"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, ENC_LITTLE_ENDIAN); - count += 4; - proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, ENC_LITTLE_ENDIAN); - - /* add data part of union */ - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "dataParameters"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_protocolDependentData, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, offset+52, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0133: /* StopMultiMediaTransmission */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x0134: /* MiscellaneousCommandMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_miscCommandType, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - - /* show videoFreezePicture */ - /* not sure of format */ - - /* show videoFastUpdatePicture */ - /* not sure of format */ - - /* show videoFastUpdateGOB */ - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "videoFastUpdateGOB"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_firstGOB, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_numberOfGOBs, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - - /* show videoFastUpdateMB */ - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "videoFastUpdateGOB"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_firstGOB, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_firstMB, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_numberOfMBs, tvb, offset+36, 4, ENC_LITTLE_ENDIAN); - - /* show lostPicture */ - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "lostPicture"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureNumber, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_longTermPictureIndex, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - - /* show lostPartialPicture */ - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "lostPartialPicture"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureNumber, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_longTermPictureIndex, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_firstMB, tvb, offset+36, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_numberOfMBs, tvb, offset+40, 4, ENC_LITTLE_ENDIAN); - - /* show recoveryReferencePicture */ - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "recoveryReferencePicture"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_recoveryReferencePictureCount, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - skinny_sub_tree_sav = skinny_sub_tree; - for ( i = 0; i < MAX_REFERENCE_PICTURE; i++ ) { - skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "recoveryReferencePicture[%d]", i); - proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureNumber, tvb, offset+32+(i*8), 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_sub_tree, hf_skinny_longTermPictureIndex, tvb, offset+36+(i*8), 4, ENC_LITTLE_ENDIAN); - } - - /* show temporalSpatialTradeOff */ - skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 4, ett_skinny_tree, NULL, "temporalSpatialTradeOff"); - proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOff, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0135: /* FlowControlCommandMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_maxBitRate, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x0136: /* CloseMultiMediaReceiveChannel */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->passThruId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x0137: /* CreateConferenceReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_numberOfReservedParticipants, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_resourceTypes, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_appID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - count = offset+24; - proto_tree_add_uint(skinny_tree, hf_skinny_appConfID, tvb, count, 1, AppConferenceIDSize); - count += AppConferenceIDSize; - proto_tree_add_uint(skinny_tree, hf_skinny_appData, tvb, count, 1, AppDataSize); - count += AppDataSize; - proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, count, 4, ENC_LITTLE_ENDIAN); - val = tvb_get_letohl( tvb, count); - count += 4; - proto_tree_add_uint(skinny_tree, hf_skinny_passThruData, tvb, count, 1, val); - break; - - case 0x0138: /* DeleteConferenceReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0139: /* ModifyConferenceReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_numberOfReservedParticipants, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_appID, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - count = offset+24; - proto_tree_add_uint(skinny_tree, hf_skinny_appConfID, tvb, count, 1, AppConferenceIDSize); - count += AppConferenceIDSize; - proto_tree_add_uint(skinny_tree, hf_skinny_appData, tvb, count, 1, AppDataSize); - count += AppDataSize; - proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, count, 4, ENC_LITTLE_ENDIAN); - val = tvb_get_letohl( tvb, count); - count += 4; - proto_tree_add_uint(skinny_tree, hf_skinny_passThruData, tvb, count, 1, val); - break; - - case 0x013A: /* AddParticipantReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - si->callId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x013B: /* DropParticipantReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - si->callId = tvb_get_letohl(tvb, offset+16); - break; - - case 0x013C: /* AuditConferenceReqMessage */ - break; - - case 0x013D: /* AuditParticipantReqMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x013F: /* UserToDeviceDataVersion1Message */ - proto_tree_add_item(skinny_tree, hf_skinny_applicationID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_transactionID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_data_length, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - count = tvb_get_letohl( tvb, offset+28); - proto_tree_add_item(skinny_tree, hf_skinny_sequenceFlag, tvb, offset+30, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_displayPriority, tvb, offset+34, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+38, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_appInstanceID, tvb, offset+42, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_routingID, tvb, offset+46, 4, ENC_LITTLE_ENDIAN); - dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+50, count); - si->lineId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x0140: /* VideoDisplayCommandMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0141: /* Unknown_Message_0x0141 */ - proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_maxBitRate, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0143: /* DynDisplayNotifyMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, hdr_data_length-8, ENC_ASCII|ENC_NA); - break; - - case 0x0144: /* DynDisplayPriNotifyMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_priority, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+20, hdr_data_length-12, ENC_ASCII|ENC_NA); - break; - - case 0x0145: /* DynDisplayPromptStatusMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+24, hdr_data_length-16, ENC_ASCII|ENC_NA); - si->lineId = tvb_get_letohl(tvb, offset+16); - si->callId = tvb_get_letohl(tvb, offset+20); - break; - - case 0x0146: /* DynFeatureStatMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_featureIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_featureID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_featureStatus, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_featureTextLabel, tvb, offset+24, StationMaxNameSize, ENC_ASCII|ENC_NA); - break; - - case 0x0147: /* DynLineStatMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineDirNumber, tvb, offset+16, 4, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_lineFullyQualifiedDisplayName, tvb, offset+16+StationMaxDirnumSize, StationMaxNameSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_lineDisplayName, tvb, offset+16+StationMaxDirnumSize+StationMaxNameSize, StationMaxDisplayNameSize, ENC_ASCII|ENC_NA); - break; - - case 0x0148: /* DynServiceURLStatMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_serviceURLIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_serviceURL, tvb, offset+16, StationMaxServiceURLSize, ENC_ASCII|ENC_NA); - proto_tree_add_item(skinny_tree, hf_skinny_serviceURLDisplayName, tvb, offset+16+StationMaxServiceURLSize, StationMaxNameSize, ENC_ASCII|ENC_NA); - break; - - case 0x0149: /* DynSpeedDialStatMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_speedDialNumber, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_speedDialType, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_speedDialStatus, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_speedDialDisplayName, tvb, offset+24, StationMaxNameSize, ENC_ASCII|ENC_NA); - break; - - case 0x014A: /* DynCallInfoMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callType, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+12); - /* 5x unknown uint32_t stuff */ - /* strings */ - { - i = offset+44; - if(hdr_version == BASIC_MSG_TYPE) - { - /* 8x party numbers */ - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_callingPartyNumber, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_calledPartyNumber, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_originalCalledParty, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingParty, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_cgpnVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_cdpnVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_originalCdpnVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - /* 4x party names */ - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_callingPartyName, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_calledPartyName, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_originalCalledPartyName, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingPartyName, tvb, i, count, ENC_ASCII|ENC_NA); - } - else if(hdr_version == CM7_MSG_TYPE_B || hdr_version == CM7_MSG_TYPE_A) - {/* I'm not sure. Not enough examples. */ - /* 8x party numbers */ - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_callingPartyNumber, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_cgpnVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_calledPartyNumber, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_originalCalledParty, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingParty, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_cdpnVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_originalCdpnVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingVoiceMailbox, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - /* 4x party names */ - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_callingPartyName, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_calledPartyName, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_originalCalledPartyName, tvb, i, count, ENC_ASCII|ENC_NA); - i += count; - count = tvb_strnlen(tvb, i, -1)+1; - proto_tree_add_item(skinny_tree, hf_skinny_lastRedirectingPartyName, tvb, i, count, ENC_ASCII|ENC_NA); - } - } - break; - - case 0x0152: /* DialedPhoneBookAckMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_directoryIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0153: /* CallListStateUpdate */ - proto_tree_add_item(skinny_tree, hf_skinny_directoryIndex, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0154: /* StartMediaTransmissionAck */ - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+12); - si->passThruId = tvb_get_letohl(tvb, offset+16); - if(hdr_version == BASIC_MSG_TYPE) - { - proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+24, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_startMediaTransmissionStatus, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+36, 4, ENC_LITTLE_ENDIAN); - } 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) { - proto_tree_add_item(skinny_tree, hf_skinny_IPVersion, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - ipversion = tvb_get_ntohl(tvb, offset+24); - if (ipversion == 0) { - proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+28, 4, ENC_BIG_ENDIAN); - } else { - proto_tree_add_item(skinny_tree, hf_skinny_ipV6Address, tvb, offset+28, 16, ENC_NA); - } - proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+44, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_startMediaTransmissionStatus, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - } - break; - - case 0x0155: /* StartMultiMediaTransmissionAck */ - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); - si->lineId = tvb_get_letohl(tvb, offset+12); - si->passThruId = tvb_get_letohl(tvb, offset+16); - if(hdr_version == BASIC_MSG_TYPE) - { - proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+24, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+28, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_startMultiMediaTransmissionStatus, tvb, offset+32, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+36, 4, ENC_LITTLE_ENDIAN); - } 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) { - ipversion = tvb_get_ntohl(tvb, offset+24); - proto_tree_add_item(skinny_tree, hf_skinny_IPVersion, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - if (ipversion == 0) { - proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+28, 4, ENC_BIG_ENDIAN); - } else { - proto_tree_add_item(skinny_tree, hf_skinny_ipV6Address, tvb, offset+28, 16, ENC_NA); - } - proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+44, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_startMultiMediaTransmissionStatus, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - } - break; - - case 0x0156: /* CallHistoryInfoMessage */ - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - case 0x0159: /* ExtensionDeviceCaps */ - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+12, 672, ENC_ASCII|ENC_NA); - break; - - - case 0x015A: /* XMLAlarmMessage */ - dissect_skinny_xml(skinny_tree, tvb, pinfo, offset+12, hdr_data_length-4); - break; - - case 0x015E: /* Unknown_Message_0x015E */ - if (hdr_data_length > 8) { - proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - } - break; - - /* - * - * SPCP Messages Call manager -> client messages start here - * - */ - case 0x8000: /* SPCPRegisterTokenRequest */ - proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, StationMaxDeviceNameSize, ENC_ASCII|ENC_NA); - i = offset+12+StationMaxDeviceNameSize; - proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, i, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, i+4, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, i+8, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_deviceType, tvb, i+12, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(skinny_tree, hf_skinny_maxStreams, tvb, i+16, 4, ENC_LITTLE_ENDIAN); - break; - - /* - * - * SPCP Messages Client -> Call manager start here - * - */ - case 0x8100: /* SPCPRegisterTokenAck */ - proto_tree_add_item(skinny_tree, hf_skinny_featureID, tvb, offset+12, 4, ENC_ASCII|ENC_NA); - break; - - case 0x8101: /* SPCPRegisterTokenReject */ - proto_tree_add_item(skinny_tree, hf_skinny_tokenRejWaitTime, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); - break; - - default: - proto_tree_add_item(skinny_tree, hf_skinny_rawData, tvb, offset+12, hdr_data_length-4, ENC_NA); - break; + for (i = 0; i < sizeof(skinny_opcode2handler)/sizeof(struct opcode2handler) ; i++) { + if (skinny_opcode2handler[i].opcode == data_messageid && skinny_opcode2handler[i].handler) { + skinny_opcode2handler[i].handler(cursor, pinfo); } } + ptvcursor_free(cursor); + tap_queue_packet(skinny_tap, pinfo, si); return tvb_captured_length(tvb); } - /* Code to actually dissect the packets */ static int dissect_skinny(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) @@ -3447,11 +7761,16 @@ dissect_skinny(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) if ( (hdr_data_length < 4) || ((hdr_version != BASIC_MSG_TYPE) && - (hdr_version != CM7_MSG_TYPE_A) && - (hdr_version != CM7_MSG_TYPE_B) && - (hdr_version != CM7_MSG_TYPE_UNKNOWN) && - (hdr_version != CM7_MSG_TYPE_C) && - (hdr_version != CM7_MSG_TYPE_D)) + (hdr_version != V10_MSG_TYPE) && + (hdr_version != V11_MSG_TYPE) && + (hdr_version != V15_MSG_TYPE) && + (hdr_version != V16_MSG_TYPE) && + (hdr_version != V17_MSG_TYPE) && + (hdr_version != V18_MSG_TYPE) && + (hdr_version != V19_MSG_TYPE) && + (hdr_version != V20_MSG_TYPE) && + (hdr_version != V21_MSG_TYPE) && + (hdr_version != V22_MSG_TYPE)) ) { /* Not an SKINNY packet, just happened to use the same port */ @@ -3463,8 +7782,7 @@ dissect_skinny(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) col_set_str(pinfo->cinfo, COL_INFO, "Skinny Client Control Protocol"); - tcp_dissect_pdus(tvb, pinfo, tree, skinny_desegment, 4, - get_skinny_pdu_len, dissect_skinny_pdu, data); + tcp_dissect_pdus(tvb, pinfo, tree, skinny_desegment, 4, get_skinny_pdu_len, dissect_skinny_pdu, data); return tvb_captured_length(tvb); } @@ -3473,1842 +7791,1778 @@ dissect_skinny(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) void proto_register_skinny(void) { - /* Setup list of header fields */ static hf_register_info hf[] = { { &hf_skinny_data_length, - { "Data length", "skinny.data_length", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Number of bytes in the data portion.", - HFILL } - }, + { + "Data length", "skinny.data_length", FT_UINT32, BASE_DEC, NULL, 0x0, + "Number of bytes in the data portion.", HFILL }}, { &hf_skinny_hdr_version, - { "Header version", "skinny.hdr_version", - FT_UINT32, BASE_HEX, VALS(header_version), 0x0, - NULL, - HFILL } - }, - /* FIXME: Enable use of message name ??? */ - { &hf_skinny_messageid, - { "Message ID", "skinny.messageid", - FT_UINT32, BASE_HEX|BASE_EXT_STRING, &message_id_ext, 0x0, - "The function requested/done with this message.", - HFILL } - }, - - { &hf_skinny_deviceName, - { "Device name", "skinny.deviceName", - FT_STRING, BASE_NONE, NULL, 0x0, - "The device name of the phone.", - HFILL } - }, - - { &hf_skinny_stationUserId, - { "Station user ID", "skinny.stationUserId", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_stationInstance, - { "Station instance", "skinny.stationInstance", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_deviceType, - { "Device type", "skinny.deviceType", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &deviceTypes_ext, 0x0, - "DeviceType of the station.", - HFILL } - }, - - { &hf_skinny_maxStreams, - { "Max streams", "skinny.maxStreams", - FT_UINT32, BASE_DEC, NULL, 0x0, - "32 bit unsigned integer indicating the maximum number of simultansous RTP duplex streams that the client can handle.", - HFILL } - }, - - { &hf_skinny_activeStreams, - { "Active Streams", "skinny.activeStreams", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_phoneFeatures, - { "Phone Features", "skinny.phoneFeatures", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_maxButtons, - { "Maximum number of Buttons", "skinny.maxButtons", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_macAddress, - { "Mac Address", "skinny.macAddress", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_loadInfo, - { "Load Information / Firmware", "skinny.loadInfo", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_stationIpPort, - { "Station ip port", "skinny.stationIpPort", - FT_UINT16, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_stationKeypadButton, - { "Keypad button", "skinny.stationKeypadButton", - FT_UINT32, BASE_HEX|BASE_EXT_STRING, &keypadButtons_ext, 0x0, - "The button pressed on the phone.", - HFILL } - }, - - { &hf_skinny_calledPartyNumber, - { "Called party number", "skinny.calledParty", - FT_STRING, BASE_NONE, NULL, 0x0, - "The number called.", - HFILL } - }, - - { &hf_skinny_stimulus, - { "Stimulus", "skinny.stimulus", - FT_UINT32, BASE_HEX|BASE_EXT_STRING, &deviceStimuli_ext, 0x0, - "Reason for the device stimulus message.", - HFILL } - }, - - { &hf_skinny_stimulusInstance, - { "Stimulus instance", "skinny.stimulusInstance", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_lineNumber, - { "Line number", "skinny.lineNumber", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_speedDialNumber, - { "Speed-dial number", "skinny.speedDialNumber", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Which speed dial number", - HFILL } - }, - - { &hf_skinny_capCount, - { "Capabilities count", "skinny.capCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - "How many capabilities", - HFILL } - }, - - { &hf_skinny_payloadCapability, - { "Payload capability", "skinny.payloadCapability", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &mediaPayloads_ext, 0x0, - "The payload capability for this media capability structure.", - HFILL } - }, - - { &hf_skinny_maxFramesPerPacket, - { "Max frames per packet", "skinny.maxFramesPerPacket", - FT_UINT16, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_alarmSeverity, - { "Alarm severity", "skinny.alarmSeverity", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &alarmSeverities_ext, 0x0, - "The severity of the reported alarm.", - HFILL } - }, - - { &hf_skinny_alarmParam1, - { "Alarm param 1", "skinny.alarmParam1", - FT_UINT32, BASE_HEX, NULL, 0x0, - "An as yet undecoded param1 value from the alarm message", - HFILL } - }, - - { &hf_skinny_alarmParam2, - { "Alarm param 2", "skinny.alarmParam2", - FT_IPv4, BASE_NONE, NULL, 0x0, - "This is the second alarm parameter i think it's an ip address", - HFILL } - }, - - { &hf_skinny_receptionStatus, - { "Reception status", "skinny.receptionStatus", - FT_UINT32, BASE_DEC, VALS(multicastMediaReceptionStatus), 0x0, - "The current status of the multicast media.", - HFILL } - }, - - { &hf_skinny_passThruPartyID, - { "Pass-thru party ID", "skinny.passThruPartyID", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_ORCStatus, - { "Opened receive-channel status", "skinny.openReceiveChannelStatus", - FT_UINT32, BASE_DEC, VALS(openReceiveChanStatus), 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_IPVersion, - { "IP Version", "skinny.ipversion", - FT_UINT32, BASE_DEC, VALS(ipVersion), 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_ipAddress, - { "IP address", "skinny.ipAddress", - FT_IPv4, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_ipV6Address, - { "IPv6 address", "skinny.ipv6Address", - FT_IPv6, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_portNumber, - { "Port number", "skinny.portNumber", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_statsProcessingType, - { "Stats processing type", "skinny.statsProcessingType", - FT_UINT32, BASE_DEC, VALS(statsProcessingTypes), 0x0, - "What do do after you send the stats.", - HFILL } - }, - - { &hf_skinny_callIdentifier, - { "Call identifier", "skinny.callIdentifier", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_visibility, - { "Visibility", "skinny.visibility", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_packetsSent, - { "Packets sent", "skinny.packetsSent", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_octetsSent, - { "Octets sent", "skinny.octetsSent", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_packetsRecv, - { "Packets Received", "skinny.packetsRecv", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_octetsRecv, - { "Octets received", "skinny.octetsRecv", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_packetsLost, - { "Packets lost", "skinny.packetsLost", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_latency, - { "Latency(ms)", "skinny.latency", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Average packet latency during the call.", - HFILL } - }, - - { &hf_skinny_jitter, - { "Jitter", "skinny.jitter", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Average jitter during the call.", - HFILL } - }, - - { &hf_skinny_directoryNumber, - { "Directory number", "skinny.directoryNumber", - FT_STRING, BASE_NONE, NULL, 0x0, - "The number we are reporting statistics for.", - HFILL } - }, - - { &hf_skinny_lineInstance, - { "Line instance", "skinny.lineInstance", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The display call plane associated with this call.", - HFILL } - }, - - { &hf_skinny_softKeyEvent, - { "Soft-key event", "skinny.softKeyEvent", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &softKeyEvents_ext, 0x0, - "Which softkey event is being reported.", - HFILL } - }, - - { &hf_skinny_keepAliveInterval, - { "Keep-alive interval", "skinny.keepAliveInterval", - FT_UINT32, BASE_DEC, NULL, 0x0, - "How often are keep alives exchanges between the client and the call manager.", - HFILL } - }, - - { &hf_skinny_secondaryKeepAliveInterval, - { "Secondary keep-alive interval", "skinny.secondaryKeepAliveInterval", - FT_UINT32, BASE_DEC, NULL, 0x0, - "How often are keep alives exchanges between the client and the secondary call manager.", - HFILL } - }, - - { &hf_skinny_dateTemplate, - { "Date template", "skinny.dateTemplate", - FT_STRING, BASE_NONE, NULL, 0x0, - "The display format for the date/time on the phone.", - HFILL } - }, - - { &hf_skinny_buttonOffset, - { "Button offset", "skinny.buttonOffset", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Offset is the number of the first button referenced by this message.", - HFILL } - }, - - { &hf_skinny_buttonCount, - { "Buttons count", "skinny.buttonCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Number of (VALID) button definitions in this message.", - HFILL } - }, - - { &hf_skinny_totalButtonCount, - { "Total buttons count", "skinny.totalButtonCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The total number of buttons defined for this phone.", - HFILL } - }, - - { &hf_skinny_buttonInstanceNumber, - { "Instance number", "skinny.buttonInstanceNumber", - FT_UINT8, BASE_HEX|BASE_EXT_STRING, &keypadButtons_ext, 0x0, - "The button instance number for a button or the StationKeyPad value, repeats allowed.", - HFILL } - }, - - { &hf_skinny_buttonDefinition, - { "Button definition", "skinny.buttonDefinition", - FT_UINT8, BASE_HEX|BASE_EXT_STRING, &buttonDefinitions_ext, 0x0, - "The button type for this instance (ie line, speed dial, ....", - HFILL } - }, - - { &hf_skinny_softKeyOffset, - { "Soft-Key offset", "skinny.softKeyOffset", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The offset for the first soft key in this message.", - HFILL } - }, - - { &hf_skinny_softKeyCount, - { "Soft-keys count", "skinny.softKeyCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The number of valid softkeys in this message.", - HFILL } - }, - - { &hf_skinny_totalSoftKeyCount, - { "Total soft-keys count", "skinny.totalSoftKeyCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The total number of softkeys for this device.", - HFILL } - }, - - { &hf_skinny_softKeyLabel, - { "Soft-key label", "skinny.softKeyLabel", - FT_STRING, BASE_NONE, NULL, 0x0, - "The text label for this soft key.", - HFILL } - }, - - { &hf_skinny_softKeySetOffset, - { "Soft-key-set offset", "skinny.softKeySetOffset", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The offset for the first soft key set in this message.", - HFILL } - }, - - { &hf_skinny_softKeySetCount, - { "Soft-key-sets count", "skinny.softKeySetCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The number of valid softkey sets in this message.", - HFILL } - }, - - { &hf_skinny_totalSoftKeySetCount, - { "Total soft-key-sets count", "skinny.totalSoftKeySetCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The total number of softkey sets for this device.", - HFILL } - }, - - { &hf_skinny_softKeyTemplateIndex, - { "Soft-key template index", "skinny.softKeyTemplateIndex", - FT_UINT8, BASE_DEC|BASE_EXT_STRING, &softKeyEvents_ext, 0x0, - "Array of size 16 8-bit unsigned ints containing an index into the softKeyTemplate.", - HFILL } - }, - - { &hf_skinny_softKeyInfoIndex, - { "Soft-key info index", "skinny.softKeyInfoIndex", - FT_UINT16, BASE_DEC|BASE_EXT_STRING, &softKeyIndexes_ext, 0x0, - "Array of size 16 16-bit unsigned integers containing an index into the soft key description information.", - HFILL } - }, - - { &hf_skinny_softKeySetDescription, - { "Soft-key set description", "skinny.softKeySetDescription", - FT_UINT8, BASE_DEC|BASE_EXT_STRING, &keySetNames_ext, 0x0, - "A text description of what this softkey when this softkey set is displayed", - HFILL } - }, - - { &hf_skinny_softKeyMap, - { "Soft-key map","skinny.softKeyMap", - FT_UINT16, BASE_HEX, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_softKey0, - { "SoftKey0", "skinny.softKeyMap.0", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY0, - NULL, - HFILL } - }, - - { &hf_skinny_softKey1, - { "SoftKey1", "skinny.softKeyMap.1", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY1, - NULL, - HFILL } - }, - - { &hf_skinny_softKey2, - { "SoftKey2", "skinny.softKeyMap.2", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY2, - NULL, - HFILL } - }, - - { &hf_skinny_softKey3, - { "SoftKey3", "skinny.softKeyMap.3", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY3, - NULL, - HFILL } - }, - - { &hf_skinny_softKey4, - { "SoftKey4", "skinny.softKeyMap.4", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY4, - NULL, - HFILL } - }, - - { &hf_skinny_softKey5, - { "SoftKey5", "skinny.softKeyMap.5", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY5, - NULL, - HFILL } - }, - - { &hf_skinny_softKey6, - { "SoftKey6", "skinny.softKeyMap.6", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY6, - NULL, - HFILL } - }, - - { &hf_skinny_softKey7, - { "SoftKey7", "skinny.softKeyMap.7", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY7, - NULL, - HFILL } - }, - - { &hf_skinny_softKey8, - { "SoftKey8", "skinny.softKeyMap.8", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY8, - NULL, - HFILL } - }, - - { &hf_skinny_softKey9, - { "SoftKey9", "skinny.softKeyMap.9", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY9, - NULL, - HFILL } - }, - - { &hf_skinny_softKey10, - { "SoftKey10", "skinny.softKeyMap.10", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY10, - NULL, - HFILL } - }, - - { &hf_skinny_softKey11, - { "SoftKey11", "skinny.softKeyMap.11", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY11, - NULL, - HFILL } - }, - - { &hf_skinny_softKey12, - { "SoftKey12", "skinny.softKeyMap.12", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY12, - NULL, - HFILL } - }, - - { &hf_skinny_softKey13, - { "SoftKey13", "skinny.softKeyMap.13", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY13, - NULL, - HFILL } - }, - - { &hf_skinny_softKey14, - { "SoftKey14", "skinny.softKeyMap.14", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY14, - NULL, - HFILL } - }, - - { &hf_skinny_softKey15, - { "SoftKey15", "skinny.softKeyMap.15", - FT_BOOLEAN, 16, TFS(&softKeyMapValues), SKINNY_SOFTKEY15, - NULL, - HFILL } - }, - - { &hf_skinny_lampMode, - { "Lamp mode", "skinny.lampMode", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &stationLampModes_ext, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_messageTimeOutValue, - { "Message time-out", "skinny.messageTimeOutValue", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The timeout in seconds for this message", - HFILL } - }, - - { &hf_skinny_displayMessage, - { "Display message", "skinny.displayMessage", - FT_STRING, BASE_NONE, NULL, 0x0, - "The message displayed on the phone.", - HFILL } - }, - - { &hf_skinny_lineDirNumber, - { "Line directory number", "skinny.lineDirNumber", - FT_STRING, BASE_NONE, NULL, 0x0, - "The directory number for this line.", - HFILL } - }, - - { &hf_skinny_lineFullyQualifiedDisplayName, - { "Fully qualified display name", "skinny.fqdn", - FT_STRING, BASE_NONE, NULL, 0x0, - "The full display name for this line.", - HFILL } - }, - - { &hf_skinny_lineDisplayName, - { "Display name", "skinny.displayName", - FT_STRING, BASE_NONE, NULL, 0x0, - "The display name for this line.", - HFILL } - }, - - { &hf_skinny_speedDialDirNumber, - { "Speed-dial number", "skinny.speedDialDirNum", - FT_STRING, BASE_NONE, NULL, 0x0, - "the number to dial for this speed dial.", - HFILL } - }, - - { &hf_skinny_speedDialDisplayName, - { "Speed-dial display", "skinny.speedDialDisplay", - FT_STRING, BASE_NONE, NULL, 0x0, - "The text to display for this speed dial.", - HFILL } - }, - - { &hf_skinny_dateYear, - { "Year", "skinny.year", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The current year", - HFILL } - }, - - { &hf_skinny_dateMonth, - { "Month", "skinny.month", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The current month", - HFILL } - }, - - { &hf_skinny_dayOfWeek, - { "Day of week", "skinny.dayOfWeek", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The day of the week", - HFILL } - }, - - { &hf_skinny_dateDay, - { "Day", "skinny.day", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The day of the current month", - HFILL } - }, - - { &hf_skinny_dateHour, - { "Hour", "skinny.hour", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Hour of the day", - HFILL } - }, - - { &hf_skinny_dateMinute, - { "Minute", "skinny.minute", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_dateSeconds, - { "Seconds", "skinny.dateSeconds", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_dateMilliseconds, - { "Milliseconds", "skinny.dateMilliseconds", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_timeStamp, - { "Timestamp", "skinny.timeStamp", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Time stamp for the call reference", - HFILL } - }, - { &hf_skinny_callState, - { "Call state", "skinny.callState", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_stationCallStates_ext, 0x0, - "The D channel call state of the call", - HFILL } - }, - - { &hf_skinny_deviceTone, - { "Tone", "skinny.deviceTone", - FT_UINT32, BASE_HEX|BASE_EXT_STRING, &skinny_deviceTones_ext, 0x0, - "Which tone to play", - HFILL } - }, - - { &hf_skinny_callingPartyName, - { "Calling party name", "skinny.callingPartyName", - FT_STRING, BASE_NONE, NULL, 0x0, - "The passed name of the calling party.", - HFILL } - }, - - { &hf_skinny_callingPartyNumber, - { "Calling party number", "skinny.callingParty", - FT_STRING, BASE_NONE, NULL, 0x0, - "The passed number of the calling party.", - HFILL } - }, - - { &hf_skinny_calledPartyName, - { "Called party name", "skinny.calledPartyName", - FT_STRING, BASE_NONE, NULL, 0x0, - "The name of the party we are calling.", - HFILL } - }, - - { &hf_skinny_callType, - { "Call type", "skinny.callType", - FT_UINT32, BASE_DEC, VALS(skinny_callTypes), 0x0, - "What type of call, in/out/etc", - HFILL } - }, - - { &hf_skinny_originalCalledPartyName, - { "Original called party name", "skinny.originalCalledPartyName", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_originalCalledParty, - { "Original called party number", "skinny.originalCalledParty", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_ringType, - { "Ring type", "skinny.ringType", - FT_UINT32, BASE_HEX|BASE_EXT_STRING, &skinny_ringTypes_ext, 0x0, - "What type of ring to play", - HFILL } - }, - - { &hf_skinny_ringMode, - { "Ring mode", "skinny.ringMode", - FT_UINT32, BASE_HEX, VALS(skinny_ringModes), 0x0, - "What mode of ring to play", - HFILL } - }, - - { &hf_skinny_speakerMode, - { "Speaker", "skinny.speakerMode", - FT_UINT32, BASE_HEX, VALS(skinny_speakerModes), 0x0, - "This message sets the speaker mode on/off", - HFILL } - }, - - { &hf_skinny_remoteIpAddr, - { "Remote IP address", "skinny.remoteIpAddr", - FT_IPv4, BASE_NONE, NULL, 0x0, - "The remote end ip address for this stream", - HFILL } - }, - - { &hf_skinny_remotePortNumber, - { "Remote port", "skinny.remotePortNumber", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The remote port number listening for this stream", - HFILL } - }, - - { &hf_skinny_millisecondPacketSize, - { "MS/packet", "skinny.millisecondPacketSize", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The number of milliseconds of conversation in each packet", - HFILL } - }, - - { &hf_skinny_precedenceValue, - { "Precedence", "skinny.precedenceValue", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_silenceSuppression, - { "Silence suppression", "skinny.silenceSuppression", - FT_UINT32, BASE_HEX, VALS(skinny_silenceSuppressionModes), 0x0, - "Mode for silence suppression", - HFILL } - }, - - { &hf_skinny_g723BitRate, - { "G723 bitrate", "skinny.g723BitRate", - FT_UINT32, BASE_DEC, VALS(skinny_g723BitRates), 0x0, - "The G723 bit rate for this stream/JUNK if not g723 stream", - HFILL } - }, - - { &hf_skinny_conferenceID, - { "Conference ID", "skinny.conferenceID", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_deviceResetType, - { "Reset type", "skinny.deviceResetType", - FT_UINT32, BASE_DEC, VALS(skinny_deviceResetTypes), 0x0, - "How the devices it to be reset (reset/restart)", - HFILL } - }, - - { &hf_skinny_echoCancelType, - { "Echo-cancel type", "skinny.echoCancelType", - FT_UINT32, BASE_DEC, VALS(skinny_echoCancelTypes), 0x0, - "Is echo cancelling enabled or not", - HFILL } - }, - - { &hf_skinny_deviceUnregisterStatus, - { "Unregister status", "skinny.deviceUnregisterStatus", - FT_UINT32, BASE_DEC, VALS(skinny_deviceUnregisterStatusTypes), 0x0, - "The status of the device unregister request (*CAN* be refused)", - HFILL } - }, - - { &hf_skinny_hookFlashDetectMode, - { "Hook flash mode", "skinny.hookFlashDetectMode", - FT_UINT32, BASE_DEC, VALS(skinny_hookFlashDetectModes), 0x0, - "Which method to use to detect that a hook flash has occurred", - HFILL } - }, - - { &hf_skinny_detectInterval, - { "HF Detect Interval", "skinny.detectInterval", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The number of milliseconds that determines a hook flash has occurred", - HFILL } - }, - - { &hf_skinny_headsetMode, - { "Headset mode", "skinny.headsetMode", - FT_UINT32, BASE_DEC, VALS(skinny_headsetModes), 0x0, - "Turns on and off the headset on the set", - HFILL } - }, - - { &hf_skinny_microphoneMode, - { "Microphone mode", "skinny.microphoneMode", - FT_UINT32, BASE_DEC, VALS(skinny_microphoneModes), 0x0, - "Turns on and off the microphone on the set", - HFILL } - }, - - { &hf_skinny_activeForward, - { "Active forward", "skinny.activeForward", - FT_UINT32, BASE_DEC, NULL, 0x0, - "This is non zero to indicate that a forward is active on the line", - HFILL } - }, - - { &hf_skinny_forwardAllActive, - { "Forward all", "skinny.forwardAllActive", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Forward all calls", - HFILL } - }, - - { &hf_skinny_forwardBusyActive, - { "Forward busy", "skinny.forwardBusyActive", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Forward calls when busy", - HFILL } - }, - - { &hf_skinny_forwardNoAnswerActive, - { "Forward no answer", "skinny.forwardNoAnswerActive", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Forward only when no answer", - HFILL } - }, - - { &hf_skinny_forwardNumber, - { "Forward number", "skinny.forwardNumber", - FT_STRING, BASE_NONE, NULL, 0x0, - "The number to forward calls to.", - HFILL } - }, - - { &hf_skinny_userName, - { "Username", "skinny.userName", - FT_STRING, BASE_NONE, NULL, 0x0, - "Username for this device.", - HFILL } - }, - - { &hf_skinny_serverName, - { "Server name", "skinny.serverName", - FT_STRING, BASE_NONE, NULL, 0x0, - "The server name for this device.", - HFILL } - }, - - { &hf_skinny_numberLines, - { "Number of lines", "skinny.numberLines", - FT_UINT32, BASE_DEC, NULL, 0x0, - "How many lines this device has", - HFILL } - }, - - { &hf_skinny_numberSpeedDials, - { "Number of speed-dials", "skinny.numberSpeedDials", - FT_UINT32, BASE_DEC, NULL, 0x0, - "The number of speed dials this device has", - HFILL } - }, - - { &hf_skinny_sessionType, - { "Session type", "skinny.sessionType", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_sessionTypes_ext, 0x0, - "The type of this session.", - HFILL } - }, - - { &hf_skinny_version, - { "Version", "skinny.version", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_mediaEnunciationType, - { "Enunciation type", "skinny.mediaEnunciationType", - FT_UINT32, BASE_DEC, VALS(skinny_mediaEnunciationTypes), 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_serverIdentifier, - { "Server identifier", "skinny.serverIdentifier", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_serverListenPort, - { "Server port", "skinny.serverListenPort", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_serverIpAddress, - { "Server IP address", "skinny.serverIpAddress", - FT_IPv4, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_multicastPort, - { "Multicast port", "skinny.multicastPort", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_multicastIpAddress, - { "Multicast IP address", "skinny.multicastIpAddress", - FT_IPv4, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_tokenRejWaitTime, - { "Retry wait time", "skinny.tokenRejWaitTime", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_unknown, - { "Unknown data", "skinny.unknown", - FT_UINT32, BASE_HEX, NULL, 0x0, - "Place holder for unknown data.", - HFILL } - }, - - { &hf_skinny_rawData, - { "Unknown raw data", "skinny.rawData", - FT_BYTES, BASE_NONE, NULL, 0x0, - "Place holder for unknown raw data.", - HFILL } - }, - + { + "Header version", "skinny.hdr_version", FT_UINT32, BASE_HEX, VALS(header_version), 0x0, + NULL, HFILL }}, + { &hf_skinny_messageId, + { + "Message ID", "skinny.messageId", FT_UINT32, BASE_DEC|BASE_EXT_STRING, &message_id_ext, 0x0, + NULL, HFILL }}, { &hf_skinny_xmlData, - { "XML data", "skinny.xmlData", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_numberOfInServiceStreams, - { "Number of in-service streams", "skinny.numberOfInServiceStreams", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_maxStreamsPerConf, - { "Max streams per conf", "skinny.maxStreamsPerConf", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_numberOfOutOfServiceStreams, - { "Number of out-of-service streams", "skinny.numberOfOutOfServiceStreams", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_applicationID, - { "Application ID", "skinny.applicationID", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Application ID.", - HFILL } - }, - - { &hf_skinny_transactionID, - { "Transaction ID", "skinny.transactionID", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_serviceNum, - { "Service number", "skinny.serviceNum", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_serviceURLIndex, - { "Service URL index", "skinny.serviceURLIndex", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_featureIndex, - { "Feature index", "skinny.featureIndex", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_createConfResults, - { "Create conf results", "skinny.createConfResults", - FT_UINT32, BASE_DEC, VALS(skinny_createConfResults), 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_modifyConfResults, - { "Modify conf results", "skinny.modifyConfResults", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_modifyConfResults_ext, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_deleteConfResults, - { "Delete conf results", "skinny.deleteConfResults", - FT_UINT32, BASE_DEC, VALS(skinny_deleteConfResults), 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_addParticipantResults, - { "Add participant results", "skinny.addParticipantResults", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_addParticipantResults_ext, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_passThruData, - { "Pass-thru data", "skinny.passThruData", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_auditParticipantResults, - { "Audit participant results", "skinny.auditParticipantResults", - FT_UINT32, BASE_DEC, VALS(skinny_auditParticipantResults), 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_last, - { "Last", "skinny.last", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_numberOfEntries, - { "Number of entries", "skinny.numberOfEntries", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_participantEntry, - { "Participant entry", "skinny.participantEntry", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_resourceTypes, - { "ResourceType", "skinny.resourceTypes", - FT_UINT32, BASE_DEC, VALS(skinny_resourceTypes), 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_numberOfReservedParticipants, - { "Number of reserved participants", "skinny.numberOfReservedParticipants", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_numberOfActiveParticipants, - { "Number of active participants", "skinny.numberOfActiveParticipants", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_appID, - { "Application ID", "skinny.appID", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_appData, - { "Application data", "skinny.appData", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_appConfID, - { "Application conf ID", "skinny.appConfID", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_sequenceFlag, - { "Sequence flag", "skinny.sequenceFlag", - FT_UINT32, BASE_DEC, VALS(skinny_sequenceFlags), 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_displayPriority, - { "Display priority", "skinny.displayPriority", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_appInstanceID, - { "Application instance ID", "skinny.appInstanceID", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_routingID, - { "Routing ID", "skinny.routingID", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_audioCapCount, - { "Audio cap count", "skinny.audioCapCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_videoCapCount, - { "Video cap count", "skinny.videoCapCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_dataCapCount, - { "Data cap count", "skinny.dataCapCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_RTPPayloadFormat, - { "RTP payload format", "skinny.RTPPayloadFormat", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_customPictureFormatCount, - { "Custom picture format count", "skinny.customPictureFormatCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_pictureWidth, - { "Picture width", "skinny.pictureWidth", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_pictureHeight, - { "Picture height", "skinny.pictureHeight", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_pixelAspectRatio, - { "Pixel aspect ratio", "skinny.pixelAspectRatio", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_clockConversionCode, - { "Clock conversion code", "skinny.clockConversionCode", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_clockDivisor, - { "Clock divisor", "skinny.clockDivisor", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_activeStreamsOnRegistration, - { "Active streams on registration", "skinny.activeStreamsOnRegistration", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_maxBW, - { "Max BW", "skinny.maxBW", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_serviceResourceCount, - { "Service resource count", "skinny.serviceResourceCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_layoutCount, - { "Layout count", "skinny.layoutCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_layout, - { "Layout", "skinny.layout", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_Layouts_ext, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_maxConferences, - { "Max conferences", "skinny.maxConferences", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_activeConferenceOnRegistration, - { "Active conference on registration", "skinny.activeConferenceOnRegistration", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_transmitOrReceive, - { "Transmit or receive", "skinny.transmitOrReceive", - FT_UINT32, BASE_DEC, VALS(skinny_transmitOrReceive), 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_levelPreferenceCount, - { "Level preference count", "skinny.levelPreferenceCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_transmitPreference, - { "Transmit preference", "skinny.transmitPreference", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_format, - { "Format", "skinny.format", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_formatTypes_ext, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_maxBitRate, - { "Max bitrate", "skinny.maxBitRate", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_minBitRate, - { "Min bitrate", "skinny.minBitRate", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_MPI, - { "MPI", "skinny.MPI", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_serviceNumber, - { "Service number", "skinny.serviceNumber", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_temporalSpatialTradeOffCapability, - { "Temporal spatial trade off capability", "skinny.temporalSpatialTradeOffCapability", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_stillImageTransmission, - { "Still image transmission", "skinny.stillImageTransmission", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_h263_capability_bitfield, - { "H263 capability bitfield", "skinny.h263_capability_bitfield", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_annexNandWFutureUse, - { "Annex N and W future use", "skinny.annexNandWFutureUse", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_modelNumber, - { "Model number", "skinny.modelNumber", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_bandwidth, - { "Bandwidth", "skinny.bandwidth", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_protocolDependentData, - { "Protocol dependent data", "skinny.protocolDependentData", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_priority, - { "Priority", "skinny.priority", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_payloadDtmf, - { "Payload DTMF", "skinny.payloadDtmf", - FT_UINT32, BASE_DEC, NULL, 0x0, - "RTP payload type.", - HFILL } - }, - - { &hf_skinny_featureID, - { "Feature ID", "skinny.featureID", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_featureTextLabel, - { "Feature text label", "skinny.featureTextLabel", - FT_STRING, BASE_NONE, NULL, 0x0, - "The feature label text that is displayed on the phone.", - HFILL } - }, - - { &hf_skinny_featureStatus, - { "Feature status", "skinny.featureStatus", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_notify, - { "Notify", "skinny.notify", - FT_STRING, BASE_NONE, NULL, 0x0, - "The message notify text that is displayed on the phone.", - HFILL } - }, - - { &hf_skinny_endOfAnnAck, - { "End of ann. ack", "skinny.endOfAnnAck", - FT_UINT32, BASE_DEC, VALS(skinny_endOfAnnAck), 0x0, - "End of announcement ack.", - HFILL } - }, - - { &hf_skinny_annPlayMode, - { "Ann. play mode", "skinny.annPlayMode", - FT_UINT32, BASE_DEC, VALS(skinny_annPlayMode), 0x0, - "Announcement play mode.", - HFILL } - }, - - { &hf_skinny_annPlayStatus, - { "Ann. play status", "skinny.annPlayStatus", - FT_UINT32, BASE_DEC, VALS(skinny_annPlayStatus), 0x0, - "Announcement play status.", - HFILL } - }, - - { &hf_skinny_locale, - { "Locale", "skinny.locale", - FT_UINT32, BASE_DEC, NULL, 0x0, - "User locale ID.", - HFILL } - }, - - { &hf_skinny_country, - { "Country", "skinny.country", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Country ID (Network locale).", - HFILL } - }, - - { &hf_skinny_matrixConfPartyID, - { "Matrix conf party ID", "skinny.matrixConfPartyID", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Existing conference parties.", - HFILL } - }, - - { &hf_skinny_hearingConfPartyMask, - { "Hearing conf party mask", "skinny.hearingConfPartyMask", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Bit mask of conference parties to hear media received on this stream. Bit0 = matrixConfPartyID[0], Bit1 = matrixConfPartiID[1].", - HFILL } - }, - - { &hf_skinny_serviceURL, - { "Service URL value", "skinny.serviceURL", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_serviceURLDisplayName, - { "Service URL display name", "skinny.serviceURLDisplayName", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_callSelectStat, - { "Call select stat", "skinny.callSelectStat", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_isConferenceCreator, - { "Is conference creator", "skinny.isConferenceCreator", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_payload_rfc_number, - { "Payload RFC number", "skinny.payload_rfc_number", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_payloadType, - { "Payload type", "skinny.payloadType", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_bitRate, - { "Bitrate", "skinny.bitRate", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_pictureFormatCount, - { "Picture format count", "skinny.pictureFormatCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_confServiceNum, - { "Conf service number", "skinny.confServiceNum", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Conference service number.", - HFILL } - }, - + { + "XML data", "skinny.xmlData", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_ipv4or6, + { + "IPv4or6", "skinny.ipv4or6", FT_UINT32, BASE_DEC|BASE_EXT_STRING, &IpAddrType_ext, 0x0, + NULL, HFILL }}, { &hf_skinny_DSCPValue, - { "DSCP value", "skinny.DSCPValue", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_miscCommandType, - { "Misc command type", "skinny.miscCommandType", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_miscCommandType_ext, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_temporalSpatialTradeOff, - { "Temporal spatial trade-off", "skinny.temporalSpatialTradeOff", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_firstGOB, - { "First GOB", "skinny.firstGOB", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_numberOfGOBs, - { "Number of GOBs", "skinny.numberOfGOBs", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_firstMB, - { "First MB", "skinny.firstMB", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_numberOfMBs, - { "Number of MBs", "skinny.numberOfMBs", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_pictureNumber, - { "Picture number", "skinny.pictureNumber", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_longTermPictureIndex, - { "Long-term picture index", "skinny.longTermPictureIndex", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_recoveryReferencePictureCount, - { "Recovery-reference picture count", "skinny.recoveryReferencePictureCount", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_lastRedirectingPartyName, - { "Last redirecting party name", "skinny.lastRedirectingPartyName", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_lastRedirectingParty, - { "Last redirecting party", "skinny.lastRedirectingParty", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_cgpnVoiceMailbox, - { "Calling party voice mailbox", "skinny.cgpnVoiceMailbox", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_cdpnVoiceMailbox, - { "Called party voice mailbox", "skinny.cdpnVoiceMailbox", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_originalCdpnVoiceMailbox, - { "Original called party voice mailbox", "skinny.originalCdpnVoiceMailbox", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_lastRedirectingVoiceMailbox, - { "Last redirecting voice mailbox", "skinny.lastRedirectingVoiceMailbox", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_originalCdpnRedirectReason, - { "Original called party redirect reason", "skinny.originalCdpnRedirectReason", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_lastRedirectingReason, - { "Last redirecting reason", "skinny.lastRedirectingReason", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - + { + "DSCPValue", "skinny.DSCPValue", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_FutureUse1, + { + "FutureUse1", "skinny.FutureUse1", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_FutureUse2, + { + "FutureUse2", "skinny.FutureUse2", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_FutureUse3, + { + "FutureUse3", "skinny.FutureUse3", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit1, + { + "Bit1", "skinny.Generic.Bitfield.Bit1", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0001, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit10, + { + "Bit10", "skinny.Generic.Bitfield.Bit10", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0200, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit11, + { + "Bit11", "skinny.Generic.Bitfield.Bit11", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0400, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit12, + { + "Bit12", "skinny.Generic.Bitfield.Bit12", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0800, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit13, + { + "Bit13", "skinny.Generic.Bitfield.Bit13", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x1000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit14, + { + "Bit14", "skinny.Generic.Bitfield.Bit14", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x2000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit15, + { + "Bit14", "skinny.Generic.Bitfield.Bit15", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x4000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit16, + { + "Bit15", "skinny.Generic.Bitfield.Bit16", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x8000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit17, + { + "Bit17", "skinny.Generic.Bitfield.Bit17", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x10000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit18, + { + "Bit18", "skinny.Generic.Bitfield.Bit18", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x20000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit19, + { + "Bit19", "skinny.Generic.Bitfield.Bit19", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x40000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit2, + { + "Bit2", "skinny.Generic.Bitfield.Bit2", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0002, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit20, + { + "Bit20", "skinny.Generic.Bitfield.Bit20", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x80000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit21, + { + "Bit21", "skinny.Generic.Bitfield.Bit21", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x100000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit22, + { + "Bit22", "skinny.Generic.Bitfield.Bit22", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x200000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit23, + { + "Bit23", "skinny.Generic.Bitfield.Bit23", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x400000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit24, + { + "Bit24", "skinny.Generic.Bitfield.Bit24", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x800000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit25, + { + "Bit25", "skinny.Generic.Bitfield.Bit25", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x1000000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit26, + { + "Bit26", "skinny.Generic.Bitfield.Bit26", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x2000000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit27, + { + "Bit27", "skinny.Generic.Bitfield.Bit27", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x4000000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit28, + { + "Bit28", "skinny.Generic.Bitfield.Bit28", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x8000000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit29, + { + "Bit29", "skinny.Generic.Bitfield.Bit29", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x10000000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit3, + { + "Bit3", "skinny.Generic.Bitfield.Bit3", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0004, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit30, + { + "Bit30", "skinny.Generic.Bitfield.Bit30", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x20000000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit31, + { + "Bit31", "skinny.Generic.Bitfield.Bit31", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x40000000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit32, + { + "Bit32", "skinny.Generic.Bitfield.Bit32", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x80000000, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit4, + { + "Bit4", "skinny.Generic.Bitfield.Bit4", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0008, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit5, + { + "Bit5", "skinny.Generic.Bitfield.Bit5", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0010, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit6, + { + "Bit6", "skinny.Generic.Bitfield.Bit6", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0020, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit7, + { + "Bit7", "skinny.Generic.Bitfield.Bit7", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0040, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit8, + { + "Bit8", "skinny.Generic.Bitfield.Bit8", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0080, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_Generic_Bitfield_Bit9, + { + "Bit9", "skinny.Generic.Bitfield.Bit9", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0100, + "H263 Capability BitField", HFILL }}, + { &hf_skinny_MPI, + { + "MPI", "skinny.MPI", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_PhoneFeatures_Abbreviated_Dial, + { + "AbbrevDial", "skinny.PhoneFeatures.Abbreviated.Dial", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x8000, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_Bit1, + { + "Bit1", "skinny.PhoneFeatures.Bit1", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0001, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_Bit11, + { + "Bit11", "skinny.PhoneFeatures.Bit11", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0400, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_Bit12, + { + "Bit12", "skinny.PhoneFeatures.Bit12", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0800, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_Bit13, + { + "Bit13", "skinny.PhoneFeatures.Bit13", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x1000, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_Bit14, + { + "Bit14", "skinny.PhoneFeatures.Bit14", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x2000, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_Bit15, + { + "Bit15", "skinny.PhoneFeatures.Bit15", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x4000, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_Bit2, + { + "Bit2", "skinny.PhoneFeatures.Bit2", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0002, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_Bit3, + { + "Bit3", "skinny.PhoneFeatures.Bit3", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0004, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_Bit4, + { + "Bit4", "skinny.PhoneFeatures.Bit4", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0008, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_Bit6, + { + "Bit6", "skinny.PhoneFeatures.Bit6", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0020, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_Bit7, + { + "Bit7", "skinny.PhoneFeatures.Bit7", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0040, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_Bit9, + { + "Bit9", "skinny.PhoneFeatures.Bit9", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0100, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_DynamicMessages, + { + "DynamicMessages", "skinny.PhoneFeatures.DynamicMessages", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0080, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_RFC2833, + { + "RFC2833", "skinny.PhoneFeatures.RFC2833", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0200, + "Features this device supports", HFILL }}, + { &hf_skinny_PhoneFeatures_UTF8, + { + "UTF8Bit5", "skinny.PhoneFeatures.UTF8", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0010, + "Features this device supports", HFILL }}, + { &hf_skinny_RFC2833PayloadType, + { + "RFC2833PayloadType", "skinny.RFC2833PayloadType", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_RTCPPortNumber, + { + "RTCPPortNumber", "skinny.RTCPPortNumber", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_RTPPayloadFormat, + { + "RTPPayloadFormat", "skinny.RTPPayloadFormat", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_RestrictInformationType_BitsReserved, + { + "BitsReserved", "skinny.RestrictInformationType.BitsReserved", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0xffffff00, + NULL, HFILL }}, + { &hf_skinny_RestrictInformationType_CalledParty, + { + "CalledParty", "skinny.RestrictInformationType.CalledParty", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x000c, + NULL, HFILL }}, + { &hf_skinny_RestrictInformationType_CalledPartyName, + { + "CalledPartyName", "skinny.RestrictInformationType.CalledPartyName", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0004, + NULL, HFILL }}, + { &hf_skinny_RestrictInformationType_CalledPartyNumber, + { + "CalledPartyNumber", "skinny.RestrictInformationType.CalledPartyNumber", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0008, + NULL, HFILL }}, + { &hf_skinny_RestrictInformationType_CallingParty, + { + "CallingParty", "skinny.RestrictInformationType.CallingParty", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0003, + NULL, HFILL }}, + { &hf_skinny_RestrictInformationType_CallingPartyName, + { + "CallingPartyName", "skinny.RestrictInformationType.CallingPartyName", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0001, + NULL, HFILL }}, + { &hf_skinny_RestrictInformationType_CallingPartyNumber, + { + "CallingPartyNumber", "skinny.RestrictInformationType.CallingPartyNumber", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0002, + NULL, HFILL }}, + { &hf_skinny_RestrictInformationType_LastRedirectParty, + { + "LastRedirectParty", "skinny.RestrictInformationType.LastRedirectParty", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00c0, + NULL, HFILL }}, + { &hf_skinny_RestrictInformationType_LastRedirectPartyName, + { + "LastRedirectPartyName", "skinny.RestrictInformationType.LastRedirectPartyName", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0040, + NULL, HFILL }}, + { &hf_skinny_RestrictInformationType_LastRedirectPartyNumber, + { + "LastRedirectPartyNumber", "skinny.RestrictInformationType.LastRedirectPartyNumber", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0080, + NULL, HFILL }}, + { &hf_skinny_RestrictInformationType_OriginalCalledParty, + { + "OriginalCalledParty", "skinny.RestrictInformationType.OriginalCalledParty", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0030, + NULL, HFILL }}, + { &hf_skinny_RestrictInformationType_OriginalCalledPartyName, + { + "OriginalCalledPartyName", "skinny.RestrictInformationType.OriginalCalledPartyName", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0010, + NULL, HFILL }}, + { &hf_skinny_RestrictInformationType_OriginalCalledPartyNumber, + { + "OriginalCalledPartyNumber", "skinny.RestrictInformationType.OriginalCalledPartyNumber", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0020, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey1, + { + "SoftKey1", "skinny.SoftKeyMask.SoftKey1", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0001, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey10, + { + "SoftKey10", "skinny.SoftKeyMask.SoftKey10", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0200, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey11, + { + "SoftKey11", "skinny.SoftKeyMask.SoftKey11", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0400, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey12, + { + "SoftKey12", "skinny.SoftKeyMask.SoftKey12", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0800, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey13, + { + "SoftKey13", "skinny.SoftKeyMask.SoftKey13", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x1000, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey14, + { + "SoftKey14", "skinny.SoftKeyMask.SoftKey14", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x2000, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey15, + { + "SoftKey15", "skinny.SoftKeyMask.SoftKey15", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x4000, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey16, + { + "SoftKey16", "skinny.SoftKeyMask.SoftKey16", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x8000, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey2, + { + "SoftKey2", "skinny.SoftKeyMask.SoftKey2", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0002, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey3, + { + "SoftKey3", "skinny.SoftKeyMask.SoftKey3", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0004, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey4, + { + "SoftKey4", "skinny.SoftKeyMask.SoftKey4", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0008, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey5, + { + "SoftKey5", "skinny.SoftKeyMask.SoftKey5", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0010, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey6, + { + "SoftKey6", "skinny.SoftKeyMask.SoftKey6", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0020, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey7, + { + "SoftKey7", "skinny.SoftKeyMask.SoftKey7", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0040, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey8, + { + "SoftKey8", "skinny.SoftKeyMask.SoftKey8", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0080, + NULL, HFILL }}, + { &hf_skinny_SoftKeyMask_SoftKey9, + { + "SoftKey9", "skinny.SoftKeyMask.SoftKey9", FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x0100, + NULL, HFILL }}, + { &hf_skinny_Unknown, + { + "Unknown", "skinny.Unknown", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_active, + { + "active", "skinny.active", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_activeConferenceOnRegistration, + { + "Active Conference", "skinny.activeConferenceOnRegistration", FT_UINT32, BASE_DEC, NULL, 0x0, + "Active conference at Registration", HFILL }}, + { &hf_skinny_activeConferences, + { + "Active Conferences", "skinny.activeConferences", FT_UINT32, BASE_DEC, NULL, 0x0, + "Active Conferences at Registration", HFILL }}, + { &hf_skinny_activeForward, + { + "activeForward", "skinny.activeForward", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_activeStreams, + { + "Active RTP Streams", "skinny.activeStreams", FT_UINT32, BASE_DEC, NULL, 0x0, + "Active RTP Streams at Registration", HFILL }}, + { &hf_skinny_activeStreamsOnRegistration, + { + "activeStreamsOnRegistration", "skinny.activeStreamsOnRegistration", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_alarmInfo, + { + "alarmInfo", "skinny.alarmInfo", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_alignmentPadding, + { + "alignmentPadding", "skinny.alignmentPadding", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_annexNandWFutureUse, + { + "annexNandWFutureUse", "skinny.annexNandWFutureUse", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_appID, + { + "appID", "skinny.appID", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_appInstanceID, + { + "appInstanceID", "skinny.appInstanceID", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_applicationID, + { + "applicationID", "skinny.applicationID", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_areMessagesWaiting, + { + "areMessagesWaiting", "skinny.areMessagesWaiting", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_associatedStreamID, + { + "associatedStreamID", "skinny.associatedStreamID", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_audioCapCount, + { + "audioCapCount", "skinny.audioCapCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_audioLevelAdjustment, + { + "audioLevelAdjustment", "skinny.audioLevelAdjustment", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_averageBitRate, + { + "averageBitRate", "skinny.averageBitRate", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_bandwidth, + { + "bandwidth", "skinny.bandwidth", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_bitRate, + { + "bitRate", "skinny.bitRate", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_burstSize, + { + "burstSize", "skinny.burstSize", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_busyTrigger, + { + "busyTrigger", "skinny.busyTrigger", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_buttonCount, + { + "buttonCount", "skinny.buttonCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_buttonOffset, + { + "buttonOffset", "skinny.buttonOffset", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, { &hf_skinny_callInstance, - { "Call instance", "skinny.callInstance", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_callSecurityStatus, - { "Call security status", "skinny.callSecurityStatus", - FT_UINT32, BASE_DEC, VALS(skinny_callSecurityStatusTypes), 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_accessory, - { "Phone accessories", "skinny.accessories", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_accessories_ext, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_accessoryState, - { "Phone accessory state", "skinny.accessoryState", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &skinny_accessoryStates_ext, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_partyPIRestrictionBits_CallingPartyName, - { "RestrictCallingPartyName", "skinny.partyPIRestrictionBits.CallingPartyName", - FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x01, - NULL, HFILL } - }, - - { &hf_skinny_partyPIRestrictionBits_CallingPartyNumber, - { "RestrictCallingPartyNumber", "skinny.partyPIRestrictionBits.CallingPartyNumber", - FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x02, - NULL, HFILL } - }, - - { &hf_skinny_partyPIRestrictionBits_CalledPartyName, - { "RestrictCalledPartyName", "skinny.partyPIRestrictionBits.CalledPartyName", - FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x04, - NULL, HFILL } - }, - - { &hf_skinny_partyPIRestrictionBits_CalledPartyNumber, - { "RestrictCalledPartyNumber", "skinny.partyPIRestrictionBits.CalledPartyNumber", - FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x08, - NULL, HFILL } - }, - - { &hf_skinny_partyPIRestrictionBits_OriginalCalledPartyName, - { "RestrictOriginalCalledPartyName", "skinny.partyPIRestrictionBits.OriginalCalledPartyName", - FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x10, - NULL, HFILL } - }, - - { &hf_skinny_partyPIRestrictionBits_OriginalCalledPartyNumber, - { "RestrictOriginalCalledPartyNumber", "skinny.partyPIRestrictionBits.OriginalCalledPartyNumber", - FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x20, - NULL, HFILL } - }, - - { &hf_skinny_partyPIRestrictionBits_LastRedirectPartyName, - { "RestrictLastRedirectPartyName", "skinny.partyPIRestrictionBits.LastRedirectPartyName", - FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x40, - NULL, HFILL } - }, - - { &hf_skinny_partyPIRestrictionBits_LastRedirectPartyNumber, - { "RestrictLastRedirectPartyNumber", "skinny.partyPIRestrictionBits.LastRedirectPartyNumber", - FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x80, - NULL, HFILL } - }, - - { &hf_skinny_directoryIndex, - { "Directory index", "skinny.directoryIndex", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_directoryPhoneNumber, - { "Directory phone number", "skinny.directoryPhoneNumber", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_qualityStats, - { "Quality Statistics", "skinny.qualityStats", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_speedDialStatus, - { "Speeddial Status", "skinny.speedDialStatus", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - - { &hf_skinny_speedDialType, - { "Speeddial Type", "skinny.speedDialType", - FT_UINT32, BASE_DEC, VALS(buttonDefinitions), 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_startMediaTransmissionStatus, - { "Start MediaTransmission Status Type", "skinny.startMediaTransmissionStatus", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - { &hf_skinny_startMultiMediaTransmissionStatus, - { "Start MultiMediaTransmission Status Type", "skinny.startMultiMediaTransmissionStatus", - FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, - HFILL } - }, - - + { + "callInstance", "skinny.callInstance", FT_UINT32, BASE_DEC, NULL, 0x0, + "CallId", HFILL }}, + { &hf_skinny_callReference, + { + "callReference", "skinny.callReference", FT_UINT32, BASE_DEC, NULL, 0x0, + "CallId", HFILL }}, + { &hf_skinny_callSelectStat, + { + "callSelectStat", "skinny.callSelectStat", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_capAndVer, + { + "capAndVer", "skinny.capAndVer", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_capCount, + { + "capCount", "skinny.capCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_chan0MaxPayload, + { + "chan0MaxPayload", "skinny.chan0MaxPayload", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_chan2MaxPayload, + { + "chan2MaxPayload", "skinny.chan2MaxPayload", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_chan2MaxWindow, + { + "chan2MaxWindow", "skinny.chan2MaxWindow", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_chan3MaxPayload, + { + "chan3MaxPayload", "skinny.chan3MaxPayload", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_clockConversionCode, + { + "clockConversionCode", "skinny.clockConversionCode", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_clockDivisor, + { + "clockDivisor", "skinny.clockDivisor", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_codecMode, + { + "codecMode", "skinny.codecMode", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_codecParam1, + { + "codecParam1", "skinny.codecParam1", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_codecParam2, + { + "codecParam2", "skinny.codecParam2", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_confServiceNum, + { + "confServiceNum", "skinny.confServiceNum", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_conferenceID, + { + "conferenceID", "skinny.conferenceID", FT_UINT32, BASE_DEC, NULL, 0x0, + "Conference ID", HFILL }}, + { &hf_skinny_confirmRequired, + { + "confirmRequired", "skinny.confirmRequired", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_country, + { + "country", "skinny.country", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_customMaxBRandCPB, + { + "customMaxBRandCPB", "skinny.customMaxBRandCPB", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_customMaxDPB, + { + "customMaxDPB", "skinny.customMaxDPB", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_customMaxFS, + { + "customMaxFS", "skinny.customMaxFS", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_customMaxMBPS, + { + "customMaxMBPS", "skinny.customMaxMBPS", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_customPictureFormatCount, + { + "customPictureFormatCount", "skinny.customPictureFormatCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_dataCapCount, + { + "dataCapCount", "skinny.dataCapCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_dataLength, + { + "dataLength", "skinny.dataLength", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_dataSize, + { + "dataSize", "skinny.dataSize", FT_UINT32, BASE_DEC, NULL, 0x0, + "Data Size", HFILL }}, + { &hf_skinny_defendingPriority, + { + "defendingPriority", "skinny.defendingPriority", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_displayPriority, + { + "displayPriority", "skinny.displayPriority", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_dtmfType, + { + "dtmfType", "skinny.dtmfType", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_dynamicPayload, + { + "dynamicPayload", "skinny.dynamicPayload", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_failureNodeIpAddr, + { + "failureNodeIpAddr", "skinny.failureNodeIpAddr", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_featureCapabilities, + { + "featureCapabilities", "skinny.featureCapabilities", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_featureIndex, + { + "featureIndex", "skinny.featureIndex", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_featureStatus, + { + "featureStatus", "skinny.featureStatus", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_features, + { + "features", "skinny.features", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_firstGOB, + { + "firstGOB", "skinny.firstGOB", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_firstMB, + { + "firstMB", "skinny.firstMB", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_format, + { + "format", "skinny.format", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_forwardAllActive, + { + "forwardAllActive", "skinny.forwardAllActive", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_forwardBusyActive, + { + "forwardBusyActive", "skinny.forwardBusyActive", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_forwardNoAnswerActive, + { + "forwardNoAnswerActive", "skinny.forwardNoAnswerActive", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_hearingConfPartyMask, + { + "hearingConfPartyMask", "skinny.hearingConfPartyMask", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_instance, + { + "instance", "skinny.instance", FT_UINT32, BASE_DEC, NULL, 0x0, + "Device Instance", HFILL }}, + { &hf_skinny_instanceNumber, + { + "instanceNumber", "skinny.instanceNumber", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_ipAddr_ipv4, + { + "ipAddr IPv4 Address", "skinny.ipAddr.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_ipAddr_ipv6, + { + "ipAddr IPv6 Address", "skinny.ipAddr.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_ipV4AddressScope, + { + "ipV4AddressScope", "skinny.ipV4AddressScope", FT_UINT32, BASE_DEC, NULL, 0x0, + "IPv4 Address Scope", HFILL }}, + { &hf_skinny_ipV6AddressScope, + { + "ipV6AddressScope", "skinny.ipV6AddressScope", FT_UINT32, BASE_DEC, NULL, 0x0, + "IPv6 Address Scope", HFILL }}, + { &hf_skinny_isConferenceCreator, + { + "isConferenceCreator", "skinny.isConferenceCreator", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_isMKIPresent, + { + "isMKIPresent", "skinny.isMKIPresent", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_jitter, + { + "jitter", "skinny.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, + "Amount of Jitter", HFILL }}, + { &hf_skinny_keepAliveInterval, + { + "keepAliveInterval", "skinny.keepAliveInterval", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_key, + { + "key", "skinny.key", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_keyDerivationRate, + { + "keyDerivationRate", "skinny.keyDerivationRate", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_keylen, + { + "keylen", "skinny.keylen", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_last, + { + "last", "skinny.last", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_lastRedirectingReason, + { + "lastRedirectingReason", "skinny.lastRedirectingReason", FT_UINT32, BASE_DEC, NULL, 0x0, + "Last Redirecting Reason", HFILL }}, + { &hf_skinny_latency, + { + "latency", "skinny.latency", FT_UINT32, BASE_DEC, NULL, 0x0, + "Amount of Latency", HFILL }}, + { &hf_skinny_layoutCount, + { + "layoutCount", "skinny.layoutCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_layoutID, + { + "layoutID", "skinny.layoutID", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_level, + { + "level", "skinny.level", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_levelPreferenceCount, + { + "levelPreferenceCount", "skinny.levelPreferenceCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_lineDataEntries, + { + "lineDataEntries", "skinny.lineDataEntries", FT_UINT32, BASE_DEC, NULL, 0x0, + "Number of Line Data Entries", HFILL }}, + { &hf_skinny_lineDisplayOptions, + { + "lineDisplayOptions", "skinny.lineDisplayOptions", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_lineInstance, + { + "lineInstance", "skinny.lineInstance", FT_UINT32, BASE_DEC, NULL, 0x0, + "LineId", HFILL }}, + { &hf_skinny_lineNumber, + { + "lineNumber", "skinny.lineNumber", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_locale, + { + "locale", "skinny.locale", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_longTermPictureIndex, + { + "longTermPictureIndex", "skinny.longTermPictureIndex", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_macAddress, + { + "Mac Address", "skinny.macAddress", FT_ETHER, BASE_NONE, NULL, 0x0, + "Ethernet/Mac Address", HFILL }}, + { &hf_skinny_matrixConfPartyID, + { + "matrixConfPartyID", "skinny.matrixConfPartyID", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_maxBW, + { + "maxBW", "skinny.maxBW", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_maxBitRate, + { + "maxBitRate", "skinny.maxBitRate", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_maxConferences, + { + "Maximum Number of Concurrent Conferences", "skinny.maxConferences", FT_UINT32, BASE_DEC, NULL, 0x0, + "Indicates the maximum number of simultansous Conferences, which this client/appliance can handle", HFILL }}, + { &hf_skinny_maxFramesPerPacket, + { + "maxFramesPerPacket", "skinny.maxFramesPerPacket", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_maxNumCalls, + { + "maxNumCalls", "skinny.maxNumCalls", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_maxNumOfAvailLines, + { + "maxNumOfAvailLines", "skinny.maxNumOfAvailLines", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_maxNumberOfLines, + { + "maxNumberOfLines", "skinny.maxNumberOfLines", FT_UINT32, BASE_DEC, NULL, 0x0, + "Maximum number of lines", HFILL }}, + { &hf_skinny_maxProtocolVer, + { + "maxProtocolVer", "skinny.maxProtocolVer", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_maxRetryNumber, + { + "maxRetryNumber", "skinny.maxRetryNumber", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_maxStreams, + { + "Maximum Number of Concurrent RTP Streams", "skinny.maxStreams", FT_UINT32, BASE_DEC, NULL, 0x0, + "Indicates the maximum number of simultansous RTP duplex streams, which this client/appliance can handle.", HFILL }}, + { &hf_skinny_maxStreamsPerConf, + { + "maxStreamsPerConf", "skinny.maxStreamsPerConf", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_maximumBitRate, + { + "maximumBitRate", "skinny.maximumBitRate", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_millisecondPacketSize, + { + "millisecondPacketSize", "skinny.millisecondPacketSize", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_minBitRate, + { + "minBitRate", "skinny.minBitRate", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_mixingMode, + { + "mixingMode", "skinny.mixingMode", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_modAnd2833, + { + "modAnd2833", "skinny.modAnd2833", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_modelNumber, + { + "modelNumber", "skinny.modelNumber", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_multicastIpAddr_ipv4, + { + "multicastIpAddr IPv4 Address", "skinny.multicastIpAddr.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, + "ipaddress in big endian", HFILL }}, + { &hf_skinny_multicastIpAddr_ipv6, + { + "multicastIpAddr IPv6 Address", "skinny.multicastIpAddr.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, + "ipaddress in big endian", HFILL }}, + { &hf_skinny_multicastPortNumber, + { + "multicastPortNumber", "skinny.multicastPortNumber", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_noaudio, + { + "noaudio", "skinny.noaudio", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_none, + { + "none", "skinny.none", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_nse, + { + "nse", "skinny.nse", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_numNewMsgs, + { + "numNewMsgs", "skinny.numNewMsgs", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_numOldMsgs, + { + "numOldMsgs", "skinny.numOldMsgs", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_numberOctetsReceived, + { + "numberOctetsReceived", "skinny.numberOctetsReceived", FT_UINT32, BASE_DEC, NULL, 0x0, + "Number of Octets Received", HFILL }}, + { &hf_skinny_numberOctetsSent, + { + "numberOctetsSent", "skinny.numberOctetsSent", FT_UINT32, BASE_DEC, NULL, 0x0, + "Number of Octets Sent", HFILL }}, + { &hf_skinny_numberOfActiveParticipants, + { + "numberOfActiveParticipants", "skinny.numberOfActiveParticipants", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_numberOfEntries, + { + "numberOfEntries", "skinny.numberOfEntries", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_numberOfGOBs, + { + "numberOfGOBs", "skinny.numberOfGOBs", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_numberOfInServiceStreams, + { + "numberOfInServiceStreams", "skinny.numberOfInServiceStreams", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_numberOfLines, + { + "numberOfLines", "skinny.numberOfLines", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_numberOfMBs, + { + "numberOfMBs", "skinny.numberOfMBs", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_numberOfOutOfServiceStreams, + { + "numberOfOutOfServiceStreams", "skinny.numberOfOutOfServiceStreams", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_numberOfReservedParticipants, + { + "numberOfReservedParticipants", "skinny.numberOfReservedParticipants", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_numberOfSpeedDials, + { + "numberOfSpeedDials", "skinny.numberOfSpeedDials", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_numberPacketsLost, + { + "numberPacketsLost", "skinny.numberPacketsLost", FT_UINT32, BASE_DEC, NULL, 0x0, + "Number of Packets Lost", HFILL }}, + { &hf_skinny_numberPacketsReceived, + { + "numberPacketsReceived", "skinny.numberPacketsReceived", FT_UINT32, BASE_DEC, NULL, 0x0, + "Number of Packets Received", HFILL }}, + { &hf_skinny_numberPacketsSent, + { + "numberPacketsSent", "skinny.numberPacketsSent", FT_UINT32, BASE_DEC, NULL, 0x0, + "Number of Packets Sent", HFILL }}, + { &hf_skinny_originalCdpnRedirectReason, + { + "originalCdpnRedirectReason", "skinny.originalCdpnRedirectReason", FT_UINT32, BASE_DEC, NULL, 0x0, + "Original Called Party Redirect Reason", HFILL }}, + { &hf_skinny_parm1, + { + "parm1", "skinny.parm1", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_parm2, + { + "parm2", "skinny.parm2", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_participantEntry, + { + "participantEntry", "skinny.participantEntry", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_partyDirection, + { + "partyDirection", "skinny.partyDirection", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_passThruPartyID, + { + "passThruPartyID", "skinny.passThruPartyID", FT_UINT32, BASE_DEC, NULL, 0x0, + "PassThrough PartyId", HFILL }}, + { &hf_skinny_passthruPartyID, + { + "passthruPartyID", "skinny.passthruPartyID", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_payloadDtmf, + { + "payloadDtmf", "skinny.payloadDtmf", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_payloadType, + { + "payloadType", "skinny.payloadType", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_payload_rfc_number, + { + "payload_rfc_number", "skinny.payload.rfc.number", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_peakRate, + { + "peakRate", "skinny.peakRate", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_pictureFormatCount, + { + "pictureFormatCount", "skinny.pictureFormatCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_pictureHeight, + { + "pictureHeight", "skinny.pictureHeight", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_pictureNumber, + { + "pictureNumber", "skinny.pictureNumber", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_pictureWidth, + { + "pictureWidth", "skinny.pictureWidth", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_pixelAspectRatio, + { + "pixelAspectRatio", "skinny.pixelAspectRatio", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_portNumber, + { + "portNumber", "skinny.portNumber", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_precedenceDm, + { + "precedenceDm", "skinny.precedenceDm", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_precedenceLv, + { + "precedenceLv", "skinny.precedenceLv", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_precedenceValue, + { + "precedenceValue", "skinny.precedenceValue", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_preemptionPriority, + { + "preemptionPriority", "skinny.preemptionPriority", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_priority, + { + "priority", "skinny.priority", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_profile, + { + "profile", "skinny.profile", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_protocolDependentData, + { + "protocolDependentData", "skinny.protocolDependentData", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_protocolVer, + { + "Protocol Version", "skinny.protocolVer", FT_UINT16, BASE_DEC, NULL, 0x0, + "Maximum Supported Protocol Version", HFILL }}, + { &hf_skinny_recoveryReferencePictureCount, + { + "recoveryReferencePictureCount", "skinny.recoveryReferencePictureCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_remoteIpAddr_ipv4, + { + "remoteIpAddr IPv4 Address", "skinny.remoteIpAddr.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, + "ipaddress in big endian", HFILL }}, + { &hf_skinny_remoteIpAddr_ipv6, + { + "remoteIpAddr IPv6 Address", "skinny.remoteIpAddr.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, + "ipaddress in big endian", HFILL }}, + { &hf_skinny_remotePortNumber, + { + "remotePortNumber", "skinny.remotePortNumber", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_reserved_for_future_use, + { + "reserved_for_future_use", "skinny.reserved.for.future.use", FT_UINT32, BASE_DEC, NULL, 0x0, + "User Id", HFILL }}, + { &hf_skinny_retryTimer, + { + "retryTimer", "skinny.retryTimer", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_rfc2833, + { + "rfc2833", "skinny.rfc2833", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_routingID, + { + "routingID", "skinny.routingID", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_rsvpErrorFlag, + { + "rsvpErrorFlag", "skinny.rsvpErrorFlag", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_rsvpErrorSubCodeVal, + { + "rsvpErrorSubCodeVal", "skinny.rsvpErrorSubCodeVal", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_rtpMediaPort, + { + "rtpMediaPort", "skinny.rtpMediaPort", FT_UINT32, BASE_DEC, NULL, 0x0, + "RTP Media Port", HFILL }}, + { &hf_skinny_salt, + { + "salt", "skinny.salt", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_saltlen, + { + "saltlen", "skinny.saltlen", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_secondaryKeepAliveInterval, + { + "secondaryKeepAliveInterval", "skinny.secondaryKeepAliveInterval", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_serverInstance, + { + "serverInstance", "skinny.serverInstance", FT_UINT32, BASE_DEC, NULL, 0x0, + "Server Instance", HFILL }}, + { &hf_skinny_serverTcpListenPort, + { + "serverTcpListenPort", "skinny.serverTcpListenPort", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_serviceNum, + { + "serviceNum", "skinny.serviceNum", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_serviceNumber, + { + "serviceNumber", "skinny.serviceNumber", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_serviceResourceCount, + { + "serviceResourceCount", "skinny.serviceResourceCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_serviceURLIndex, + { + "serviceURLIndex", "skinny.serviceURLIndex", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_softKeyCount, + { + "softKeyCount", "skinny.softKeyCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_softKeyOffset, + { + "softKeyOffset", "skinny.softKeyOffset", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_softKeySetCount, + { + "softKeySetCount", "skinny.softKeySetCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_softKeySetOffset, + { + "softKeySetOffset", "skinny.softKeySetOffset", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_sourceIpAddr_ipv4, + { + "sourceIpAddr IPv4 Address", "skinny.sourceIpAddr.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_sourceIpAddr_ipv6, + { + "sourceIpAddr IPv6 Address", "skinny.sourceIpAddr.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_sourcePortNumber, + { + "sourcePortNumber", "skinny.sourcePortNumber", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_speedDialNumber, + { + "speedDialNumber", "skinny.speedDialNumber", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_sse, + { + "sse", "skinny.sse", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_standard, + { + "standard", "skinny.standard", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_startingLineInstance, + { + "startingLineInstance", "skinny.startingLineInstance", FT_UINT32, BASE_DEC, NULL, 0x0, + "Starting Line Instance", HFILL }}, + { &hf_skinny_stationIpAddr, + { + "stationIpAddr", "skinny.stationIpAddr", FT_IPv4, BASE_NONE, NULL, 0x0, + "IPv4 Address", HFILL }}, + { &hf_skinny_stationIpAddr_ipv4, + { + "stationIpAddr IPv4 Address", "skinny.stationIpAddr.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, + "ipaddress in big endian", HFILL }}, + { &hf_skinny_stationIpAddr_ipv6, + { + "stationIpAddr IPv6 Address", "skinny.stationIpAddr.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, + "ipaddress in big endian", HFILL }}, + { &hf_skinny_stationIpV6Addr, + { + "stationIpV6Addr", "skinny.stationIpV6Addr", FT_IPv6, BASE_NONE, NULL, 0x0, + "IPv5 Address", HFILL }}, + { &hf_skinny_stationIpV6Addr_ipv4, + { + "stationIpV6Addr IPv4 Address", "skinny.stationIpV6Addr.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_stationIpV6Addr_ipv6, + { + "stationIpV6Addr IPv6 Address", "skinny.stationIpV6Addr.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_stillImageTransmission, + { + "stillImageTransmission", "skinny.stillImageTransmission", FT_UINT32, BASE_DEC, NULL, 0x0, + "Still Image Transmission", HFILL }}, + { &hf_skinny_stimulusInstance, + { + "stimulusInstance", "skinny.stimulusInstance", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_stimulusStatus, + { + "stimulusStatus", "skinny.stimulusStatus", FT_UINT32, BASE_DEC, NULL, 0x0, + "Stimulus Status", HFILL }}, + { &hf_skinny_streamPassThroughID, + { + "streamPassThroughID", "skinny.streamPassThroughID", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_systemTime, + { + "systemTime", "skinny.systemTime", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_temporalSpatialTradeOff, + { + "temporalSpatialTradeOff", "skinny.temporalSpatialTradeOff", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_temporalSpatialTradeOffCapability, + { + "temporalSpatialTradeOffCapability", "skinny.temporalSpatialTradeOffCapability", FT_UINT32, BASE_DEC, NULL, 0x0, + "Temporal spatial trade off capability", HFILL }}, + { &hf_skinny_timeOutValue, + { + "timeOutValue", "skinny.timeOutValue", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_timer, + { + "timer", "skinny.timer", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_totalButtonCount, + { + "totalButtonCount", "skinny.totalButtonCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_totalNumOfConfiguredLines, + { + "totalNumOfConfiguredLines", "skinny.totalNumOfConfiguredLines", FT_UINT32, BASE_DEC, NULL, 0x0, + "Total Number of Configured Lines", HFILL }}, + { &hf_skinny_totalSoftKeyCount, + { + "totalSoftKeyCount", "skinny.totalSoftKeyCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_totalSoftKeySetCount, + { + "totalSoftKeySetCount", "skinny.totalSoftKeySetCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_transactionID, + { + "transactionID", "skinny.transactionID", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_transmitIpAddr_ipv4, + { + "transmitIpAddr IPv4 Address", "skinny.transmitIpAddr.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, + "ipaddress in big endian", HFILL }}, + { &hf_skinny_transmitIpAddr_ipv6, + { + "transmitIpAddr IPv6 Address", "skinny.transmitIpAddr.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, + "ipaddress in big endian", HFILL }}, + { &hf_skinny_transmitPort, + { + "transmitPort", "skinny.transmitPort", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_transmitPreference, + { + "transmitPreference", "skinny.transmitPreference", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_unknown2, + { + "unknown2", "skinny.unknown2", FT_UINT32, BASE_DEC, NULL, 0x0, + "unknown", HFILL }}, + { &hf_skinny_v150sprt, + { + "v150sprt", "skinny.v150sprt", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_vendor, + { + "vendor", "skinny.vendor", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_videoCapCount, + { + "videoCapCount", "skinny.videoCapCount", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_wDay, + { + "wDay", "skinny.wDay", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_wDayOfWeek, + { + "wDayOfWeek", "skinny.wDayOfWeek", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_wHour, + { + "wHour", "skinny.wHour", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_wMilliseconds, + { + "wMilliseconds", "skinny.wMilliseconds", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_wMinute, + { + "wMinute", "skinny.wMinute", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_wMonth, + { + "wMonth", "skinny.wMonth", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_wSecond, + { + "wSecond", "skinny.wSecond", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_wYear, + { + "wYear", "skinny.wYear", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_waitTimeBeforeNextReq, + { + "waitTimeBeforeNextReq", "skinny.waitTimeBeforeNextReq", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_AlternateCallingParty, + { + "AlternateCallingParty", "skinny.AlternateCallingParty", FT_STRING, BASE_NONE, NULL, 0x0, + "Alternate Calling Party Number", HFILL }}, + {&hf_skinny_DeviceName, + { + "DeviceName", "skinny.DeviceName", FT_STRING, BASE_NONE, NULL, 0x0, + "Device Name", HFILL }}, + {&hf_skinny_HuntPilotName, + { + "HuntPilotName", "skinny.HuntPilotName", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_HuntPilotNumber, + { + "HuntPilotNumber", "skinny.HuntPilotNumber", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_ServerName, + { + "ServerName", "skinny.ServerName", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_add_participant_result, + { + "add_participant_result", "skinny.add.participant.result", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &AddParticipantResult_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_alarmSeverity, + { + "alarmSeverity", "skinny.alarmSeverity", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &DeviceAlarmSeverity_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_algorithmID, + { + "algorithmID", "skinny.algorithmID", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &MediaEncryptionAlgorithmType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_annAckReq, + { + "annAckReq", "skinny.annAckReq", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &EndOfAnnAck_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_annPlayMode, + { + "annPlayMode", "skinny.annPlayMode", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &AnnPlayMode_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_annStatus, + { + "annStatus", "skinny.annStatus", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &PlayAnnStatus_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_appConfID, + { + "appConfID", "skinny.appConfID", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_appData, + { + "appData", "skinny.appData", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_appName, + { + "appName", "skinny.appName", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_audit_participant_result, + { + "audit_participant_result", "skinny.audit.participant.result", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &AuditParticipantResult_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_bridgeParticipantId, + { + "bridgeParticipantId", "skinny.bridgeParticipantId", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_buttonDefinition, + { + "buttonDefinition", "skinny.buttonDefinition", FT_UINT8, BASE_HEX | BASE_EXT_STRING, &ButtonType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_callHistoryDisposition, + { + "callHistoryDisposition", "skinny.callHistoryDisposition", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &CallHistoryDisposition_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_callSecurityStatus, + { + "callSecurityStatus", "skinny.callSecurityStatus", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &CallSecurityStatusType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_callState, + { + "callState", "skinny.callState", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &DCallState_ext, 0x0, + "CallState", HFILL }}, + {&hf_skinny_callType, + { + "callType", "skinny.callType", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &CallType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_calledParty, + { + "calledParty", "skinny.calledParty", FT_STRING, BASE_NONE, NULL, 0x0, + "CalledPartyNumber", HFILL }}, + {&hf_skinny_calledPartyName, + { + "calledPartyName", "skinny.calledPartyName", FT_STRING, BASE_NONE, NULL, 0x0, + "Called Party Name", HFILL }}, + {&hf_skinny_callingParty, + { + "callingParty", "skinny.callingParty", FT_STRING, BASE_NONE, NULL, 0x0, + "Calling Party Number", HFILL }}, + {&hf_skinny_callingPartyName, + { + "callingPartyName", "skinny.callingPartyName", FT_STRING, BASE_NONE, NULL, 0x0, + "Calling Party Name", HFILL }}, + {&hf_skinny_callingPartyNumber, + { + "callingPartyNumber", "skinny.callingPartyNumber", FT_STRING, BASE_NONE, NULL, 0x0, + "Calling Party Number", HFILL }}, + {&hf_skinny_cause, + { + "cause", "skinny.cause", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &SubscribeCause_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_cdpnVoiceMailbox, + { + "cdpnVoiceMailbox", "skinny.cdpnVoiceMailbox", FT_STRING, BASE_NONE, NULL, 0x0, + "Called Party Voicemail Box Number", HFILL }}, + {&hf_skinny_cgpnVoiceMailbox, + { + "cgpnVoiceMailbox", "skinny.cgpnVoiceMailbox", FT_STRING, BASE_NONE, NULL, 0x0, + "Calling Party Voicemail Box Number", HFILL }}, + {&hf_skinny_command, + { + "command", "skinny.command", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &MiscCommandType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_compressionType, + { + "compressionType", "skinny.compressionType", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &Media_PayloadType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_conferenceName, + { + "conferenceName", "skinny.conferenceName", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_data, + { + "Statistics", "skinny.data", FT_STRING, BASE_NONE, NULL, 0x0, + "variable field size (max: 600]", HFILL }}, + {&hf_skinny_dataCapabilityDirection, + { + "dataCapabilityDirection", "skinny.dataCapabilityDirection", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &TransmitOrReceive_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_dateTemplate, + { + "dateTemplate", "skinny.dateTemplate", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_delete_conf_result, + { + "delete_conf_result", "skinny.delete.conf.result", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &DeleteConfResult_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_deviceType, + { + "Device Type", "skinny.deviceType", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &DeviceType_ext, 0x0, + "Device Type of this phone / appliance", HFILL }}, + {&hf_skinny_dialedNumber, + { + "dialedNumber", "skinny.dialedNumber", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_direction, + { + "direction", "skinny.direction", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &RSVPDirection_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_directoryNum, + { + "directoryNum", "skinny.directoryNum", FT_STRING, BASE_NONE, NULL, 0x0, + "Directory Number", HFILL }}, + {&hf_skinny_ecValue, + { + "ecValue", "skinny.ecValue", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &Media_EchoCancellation_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_encryptionCapability, + { + "encryptionCapability", "skinny.encryptionCapability", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &Media_Encryption_Capability_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_errorCode, + { + "errorCode", "skinny.errorCode", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &QoSErrorCode_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_featureID, + { + "featureID", "skinny.featureID", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &SubscriptionFeatureID_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_featureTextLabel, + { + "featureTextLabel", "skinny.featureTextLabel", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_firmwareLoadName, + { + "firmwareLoadName", "skinny.firmwareLoadName", FT_STRING, BASE_NONE, NULL, 0x0, + "Firmware Load Name", HFILL }}, + {&hf_skinny_forwardAllDirnum, + { + "forwardAllDirnum", "skinny.forwardAllDirnum", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_forwardBusyDirnum, + { + "forwardBusyDirnum", "skinny.forwardBusyDirnum", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_forwardNoAnswerlDirnum, + { + "forwardNoAnswerlDirnum", "skinny.forwardNoAnswerlDirnum", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_g723BitRate, + { + "g723BitRate", "skinny.g723BitRate", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &Media_G723BitRate_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_headsetStatus, + { + "headsetStatus", "skinny.headsetStatus", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &HeadsetMode_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_ipAddressType, + { + "ipAddressType", "skinny.ipAddressType", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &IpAddrType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_ipAddressingMode, + { + "ipAddressingMode", "skinny.ipAddressingMode", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &IpAddrMode_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_kpButton, + { + "kpButton", "skinny.kpButton", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &KeyPadButton_ext, 0x0, + "KeyPad Button which was Pressed", HFILL }}, + {&hf_skinny_lampMode, + { + "lampMode", "skinny.lampMode", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &LampMode_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_lastRedirectingParty, + { + "lastRedirectingParty", "skinny.lastRedirectingParty", FT_STRING, BASE_NONE, NULL, 0x0, + "Last Redirecting Party Number", HFILL }}, + {&hf_skinny_lastRedirectingPartyName, + { + "lastRedirectingPartyName", "skinny.lastRedirectingPartyName", FT_STRING, BASE_NONE, NULL, 0x0, + "Last Redirecting Party Name", HFILL }}, + {&hf_skinny_lastRedirectingVoiceMailbox, + { + "lastRedirectingVoiceMailbox", "skinny.lastRedirectingVoiceMailbox", FT_STRING, BASE_NONE, NULL, 0x0, + "Last Redirecting Parties Voicemail Box Number", HFILL }}, + {&hf_skinny_layouts, + { + "layouts", "skinny.layouts", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &Layout_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_lineDirNumber, + { + "lineDirNumber", "skinny.lineDirNumber", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_lineFullyQualifiedDisplayName, + { + "lineFullyQualifiedDisplayName", "skinny.lineFullyQualifiedDisplayName", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_lineTextLabel, + { + "lineTextLabel", "skinny.lineTextLabel", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_mediaPathCapabilities, + { + "mediaPathCapabilities", "skinny.mediaPathCapabilities", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &MediaPathCapabilities_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_mediaPathEvent, + { + "mediaPathEvent", "skinny.mediaPathEvent", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &MediaPathEvent_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_mediaPathID, + { + "mediaPathID", "skinny.mediaPathID", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &MediaPathID_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_mediaTransportType, + { + "mediaTransportType", "skinny.mediaTransportType", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &MediaTransportType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_mediaType, + { + "mediaType", "skinny.mediaType", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &MediaType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_micMode, + { + "micMode", "skinny.micMode", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &MicrophoneMode_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_modify_conf_result, + { + "modify_conf_result", "skinny.modify.conf.result", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &ModifyConfResult_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_multimediaOpenReceiveChannelStatus, + { + "multimediaOpenReceiveChannelStatus", "skinny.multimediaOpenReceiveChannelStatus", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &OpenReceiveChanStatus_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_mwiControlNumber, + { + "mwiControlNumber", "skinny.mwiControlNumber", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_mwiTargetNumber, + { + "mwiTargetNumber", "skinny.mwiTargetNumber", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_mwi_notification_result, + { + "mwi_notification_result", "skinny.mwi.notification.result", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &MwiNotificationResult_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_notify, + { + "notify", "skinny.notify", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_openReceiveChannelStatus, + { + "openReceiveChannelStatus", "skinny.openReceiveChannelStatus", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &MediaStatus_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_originalCalledParty, + { + "originalCalledParty", "skinny.originalCalledParty", FT_STRING, BASE_NONE, NULL, 0x0, + "Original Called Party Number", HFILL }}, + {&hf_skinny_originalCalledPartyName, + { + "originalCalledPartyName", "skinny.originalCalledPartyName", FT_STRING, BASE_NONE, NULL, 0x0, + "Original Called Party Name", HFILL }}, + {&hf_skinny_originalCdpnVoiceMailbox, + { + "originalCdpnVoiceMailbox", "skinny.originalCdpnVoiceMailbox", FT_STRING, BASE_NONE, NULL, 0x0, + "Original Called Party Voicemail Box Number", HFILL }}, + {&hf_skinny_participantName, + { + "participantName", "skinny.participantName", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_participantNumber, + { + "participantNumber", "skinny.participantNumber", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_passThruData, + { + "passThruData", "skinny.passThruData", FT_STRING, BASE_NONE, NULL, 0x0, + "variable field size (max: 2000]", HFILL }}, + {&hf_skinny_payloadCapability, + { + "payloadCapability", "skinny.payloadCapability", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &Media_PayloadType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_portHandlingFlag, + { + "portHandlingFlag", "skinny.portHandlingFlag", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &PortHandling_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_privacy, + { + "privacy", "skinny.privacy", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &CallPrivacy_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_promptStatus, + { + "promptStatus", "skinny.promptStatus", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_receptionStatus, + { + "receptionStatus", "skinny.receptionStatus", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &MulticastMediaReceptionStatus_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_recording_status, + { + "recording_status", "skinny.recording.status", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &RecordingStatus_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_requestedIpAddrType, + { + "requestedIpAddrType", "skinny.requestedIpAddrType", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &IpAddrType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_resetType, + { + "resetType", "skinny.resetType", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &DeviceResetType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_resourceType, + { + "resourceType", "skinny.resourceType", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &ResourceType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_result, + { + "result", "skinny.result", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &CreateConfResult_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_resultCode, + { + "resultCode", "skinny.resultCode", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &MediaStatus_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_resvStyle, + { + "resvStyle", "skinny.resvStyle", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &ResvStyle_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_ringDuration, + { + "ringDuration", "skinny.ringDuration", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &RingDuration_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_ringMode, + { + "ringMode", "skinny.ringMode", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &RingMode_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_rsvpErrorCode, + { + "rsvpErrorCode", "skinny.rsvpErrorCode", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &RSVPErrorCode_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_sequenceFlag, + { + "sequenceFlag", "skinny.sequenceFlag", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &SequenceFlag_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_serverName, + { + "serverName", "skinny.serverName", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_serviceURL, + { + "serviceURL", "skinny.serviceURL", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_serviceURLDisplayName, + { + "serviceURLDisplayName", "skinny.serviceURLDisplayName", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_sessionType, + { + "sessionType", "skinny.sessionType", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &SessionType_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_softKeyEvent, + { + "softKeyEvent", "skinny.softKeyEvent", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &SoftKeyEvent_ext, 0x0, + "SoftKey Event", HFILL }}, + {&hf_skinny_softKeyInfoIndex, + { + "softKeyInfoIndex", "skinny.softKeyInfoIndex", FT_UINT16, BASE_HEX | BASE_EXT_STRING, &SoftKeyInfoIndex_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_softKeyLabel, + { + "softKeyLabel", "skinny.softKeyLabel", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_softKeySetIndex, + { + "softKeySetIndex", "skinny.softKeySetIndex", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &SoftKeySet_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_softKeyTemplateIndex, + { + "softKeyTemplateIndex", "skinny.softKeyTemplateIndex", FT_UINT8, BASE_HEX | BASE_EXT_STRING, &SoftKeyTemplateIndex_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_speakerMode, + { + "speakerMode", "skinny.speakerMode", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &SpeakerMode_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_speedDialDirNumber, + { + "speedDialDirNumber", "skinny.speedDialDirNumber", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_speedDialDisplayName, + { + "speedDialDisplayName", "skinny.speedDialDisplayName", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_ssValue, + { + "ssValue", "skinny.ssValue", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &Media_SilenceSuppression_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_startMediaTransmissionStatus, + { + "startMediaTransmissionStatus", "skinny.startMediaTransmissionStatus", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &MediaStatus_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_statsProcessingMode, + { + "Stats Processing Mode", "skinny.statsProcessingMode", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &StatsProcessingType_ext, 0x0, + "What do do after you send the stats", HFILL }}, + {&hf_skinny_status, + { + "status", "skinny.status", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &DeviceUnregisterStatus_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_stimulus, + { + "stimulus", "skinny.stimulus", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &DeviceStimulus_ext, 0x0, + "Device Stimulus", HFILL }}, + {&hf_skinny_subAppID, + { + "subAppID", "skinny.subAppID", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_subscriptionID, + { + "subscriptionID", "skinny.subscriptionID", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_text, + { + "text", "skinny.text", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_tone, + { + "tone", "skinny.tone", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &DeviceTone_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_toneAnnouncement, + { + "toneAnnouncement", "skinny.toneAnnouncement", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &DeviceTone_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_tone_output_direction, + { + "tone_output_direction", "skinny.tone.output.direction", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &ToneOutputDirection_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_unRegReasonCode, + { + "unRegReasonCode", "skinny.unRegReasonCode", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &UnRegReasonCode_ext, 0x0, + NULL, HFILL }}, + {&hf_skinny_userName, + { + "userName", "skinny.userName", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_vendorID, + { + "vendorID", "skinny.vendorID", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_version, + { + "version", "skinny.version", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + {&hf_skinny_videoCapabilityDirection, + { + "videoCapabilityDirection", "skinny.videoCapabilityDirection", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &TransmitOrReceive_ext, 0x0, + NULL, HFILL }}, }; /* Setup protocol subtree array */ static gint *ett[] = { &ett_skinny, &ett_skinny_tree, - &ett_skinny_softKeyMap, }; module_t *skinny_module; @@ -5336,14 +9590,27 @@ void proto_reg_handoff_skinny(void) { static gboolean skinny_prefs_initialized = FALSE; - dissector_handle_t skinny_handle; if (!skinny_prefs_initialized) { /* Skinny content type and internet media type used by other dissectors are the same */ media_type_dissector_table = find_dissector_table("media_type"); skinny_handle = new_create_dissector_handle(dissect_skinny, proto_skinny); dissector_add_uint("tcp.port", TCP_PORT_SKINNY, skinny_handle); + ssl_dissector_add(SSL_PORT_SKINNY, "skinny", TRUE); skinny_prefs_initialized = TRUE; } } + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 2 + * tab-width: 2 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=2 tabstop=2 expandtab: + * :indentSize=2:tabSize=2:noTabs=true: + */ diff --git a/epan/dissectors/packet-skinny.c.in b/epan/dissectors/packet-skinny.c.in new file mode 100644 index 0000000000..46897c2b23 --- /dev/null +++ b/epan/dissectors/packet-skinny.c.in @@ -0,0 +1,559 @@ +/* Do not modify this file. Changes will be overwritten */ +/* Generated Automatically */ +/* packet-skinny.c */ + +/* packet-skinny.c + * Dissector for the Skinny Client Control Protocol + * (The "D-Channel"-Protocol for Cisco Systems' IP-Phones) + * + * Author: Diederik de Groot , Copyright 2014 + * Rewritten to support newer skinny protocolversions (V0-V22) + * Based on previous versions/contributions: + * - Joerg Mayer , Copyright 2001 + * - Paul E. Erkkila (pee@erkkila.org) - fleshed out the decode + * skeleton to report values for most message/message fields. + * Much help from Guy Harris on figuring out the wireshark api. + * - packet-aim.c by Ralf Hoelzer , Copyright 2000 + * - Wireshark - Network traffic analyzer, + * By Gerald Combs , Copyright 1998 + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/* [[[cog +# +# Using Cog.py Inplace Code Generator +# +# Dependencies: +# - python +# - cog.py: http://nedbatchelder.com/code/cog/ +# - python.xml +# - python.xml.sax +# +cog.out('/*\n') +cog.out(' * Generated Automatically Using:\n') +cog.out(' * cog.py -D xmlfile=SkinnyProtocolOptimized.xml -d -c -o packet-skinny.c packet-skinny.c.in\n') +cog.out(' */\n') +]]]*/ +/*[[[end]]]*/ + +/* c-basic-offset: 2; tab-width: 2; indent-tabs-mode: nil + * vi: set shiftwidth=2 tabstop=2 expandtab: + * :indentSize=2:tabSize=2:noTabs=true: + */ + +#include "config.h" + +#include +#include +#include +#include + +#include "packet-rtp.h" +#include "packet-tcp.h" +#include "packet-ssl.h" +#include "packet-skinny.h" + +void proto_register_skinny(void); +void proto_reg_handoff_skinny(void); + + +#define TCP_PORT_SKINNY 2000 +#define SSL_PORT_SKINNY 2443 /* IANA assigned to PowerClient Central Storage Facility */ + +#define BASIC_MSG_TYPE 0x00 +#define V10_MSG_TYPE 0x0A +#define V11_MSG_TYPE 0x0B +#define V15_MSG_TYPE 0x0F +#define V16_MSG_TYPE 0x10 +#define V17_MSG_TYPE 0x11 +#define V18_MSG_TYPE 0x12 +#define V19_MSG_TYPE 0x13 +#define V20_MSG_TYPE 0x14 +#define V21_MSG_TYPE 0x15 +#define V22_MSG_TYPE 0x16 + +static const value_string header_version[] = { + { BASIC_MSG_TYPE, "Basic" }, + { V10_MSG_TYPE, "V10" }, + { V11_MSG_TYPE, "V11" }, + { V15_MSG_TYPE, "V15" }, + { V16_MSG_TYPE, "V16" }, + { V17_MSG_TYPE, "V17" }, + { V18_MSG_TYPE, "V18" }, + { V19_MSG_TYPE, "V19" }, + { V20_MSG_TYPE, "V20" }, + { V21_MSG_TYPE, "V21" }, + { V22_MSG_TYPE, "V22" }, + { 0 , NULL } +}; + +/* Declare MessageId */ +/* [[[cog +import parse_xml2skinny_dissector as xml2skinny +global skinny +global message_dissector_functions + +message_dissector_functions = '' +skinny = xml2skinny.xml2obj(xmlfile) + +cog.out('static const value_string message_id[] = {\n') +for message in skinny.message: + message_dissector_functions += '%s' %message.dissect() + cog.out(' { %s, "%s" },\n' %(message.opcode, message.name.replace('Message',''))) +cog.out(' {0 , NULL}\n') +cog.out('};\n') +cog.out('static value_string_ext message_id_ext = VALUE_STRING_EXT_INIT(message_id);\n') +]]]*/ +/*[[[end]]]*/ + + +/* Declare Enums and Defines */ +/* [[[cog +for enum in skinny.enum: + name = enum.name[0].upper() + enum.name[1:] + if enum.define == "yes": + for entries in enum.entries: + for entry in sorted(entries.entry, key=lambda x: int(x['value'],0)): + if entries.type is not None: + cog.out('#define {0:38} 0x{1:05x} /* {2} */\n' .format(entry.name.upper(), int(entry.value,0), entries.type)) + else: + cog.out('#define {0:38} 0x{1:05x}\n' .format(entry.name.upper(), int(entry.value,0))) + cog.out('\n') + cog.out('static const value_string %s[] = {\n' %(name)) + for entries in enum.entries: + for entry in sorted(entries.entry, key=lambda x: int(x['value'],0)): + if enum.define == "yes": + cog.out(' { %s, "%s" },\n' %(entry.name.upper(), entry.text)) + else: + cog.out(' { 0x%05x, "%s" },\n' %(int(entry.value,0), entry.text)) + cog.out(' { 0x00000, NULL }\n') + cog.out('};\n') + cog.out('static value_string_ext %s_ext = VALUE_STRING_EXT_INIT(%s);\n\n' %(name, name)) +]]]*/ +/*[[[end]]]*/ + +/* Staticly Declared Variables */ +static int proto_skinny = -1; +static int hf_skinny_messageId = -1; +static int hf_skinny_data_length = -1; +static int hf_skinny_hdr_version = -1; +static int hf_skinny_xmlData = -1; +static int hf_skinny_ipv4or6 = -1; + +/* [[[cog +for key in sorted(xml2skinny.fieldsArray.keys()): + cog.out('static int hf_skinny_%s = -1;\n' %key) +]]]*/ +/*[[[end]]]*/ + +static dissector_table_t media_type_dissector_table; + +/* Initialize the subtree pointers */ +static gint ett_skinny = -1; +static gint ett_skinny_tree = -1; + +/* desegmentation of SCCP */ +static gboolean skinny_desegment = TRUE; + +/* tap register id */ +static int skinny_tap = -1; + +/* skinny protocol tap info */ +#define MAX_SKINNY_MESSAGES_IN_PACKET 10 +static skinny_info_t pi_arr[MAX_SKINNY_MESSAGES_IN_PACKET]; +static int pi_current = 0; +static skinny_info_t *si; + +dissector_handle_t skinny_handle; + +/* Get the length of a single SCCP PDU */ +static guint +get_skinny_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset) +{ + guint32 hdr_data_length; + + /* Get the length of the SCCP packet. */ + hdr_data_length = tvb_get_letohl(tvb, offset); + + /* That length doesn't include the length of the header itself. */ + return hdr_data_length + 8; +} + +static void +dissect_skinny_xml(ptvcursor_t *cursor, int hfindex, packet_info *pinfo, guint32 length, guint32 maxlength) +{ + proto_item *item = NULL; + proto_tree *subtree = NULL; + dissector_handle_t handle = NULL; + proto_tree *tree = ptvcursor_tree(cursor); + guint32 offset = ptvcursor_current_offset(cursor); + tvbuff_t *tvb = ptvcursor_tvbuff(cursor); + tvbuff_t *next_tvb; + + if (length == 0) { + length = tvb_strnlen(tvb, offset, -1); + } + if (length >= maxlength) { + length = maxlength; + } + + ptvcursor_add_no_advance(cursor, hfindex, length, ENC_ASCII|ENC_NA); + + item = proto_tree_add_item(tree, hf_skinny_xmlData, tvb, offset, length, ENC_ASCII|ENC_NA); + subtree = proto_item_add_subtree(item, 0); + next_tvb = tvb_new_subset(tvb, offset, length, -1); + handle = dissector_get_string_handle(media_type_dissector_table, "text/xml"); + if (handle != NULL) { + call_dissector(handle, next_tvb, pinfo, subtree); + } + ptvcursor_advance(cursor, maxlength); +} + +static void +dissect_skinny_ipv4or6(ptvcursor_t *cursor, int hfindex_ipv4, int hfindex_ipv6, packet_info *pinfo) +{ + address src_addr; + guint32 ipversion = 0; + guint32 offset = ptvcursor_current_offset(cursor); + tvbuff_t *tvb = ptvcursor_tvbuff(cursor); + guint32 hdr_version = tvb_get_letohl(tvb, 4); + gboolean is_video = 0; + + /* ProtocolVersion > 18 include and extra field to declare IPv4 (0) / IPv6 (1) */ + if (hdr_version >= V18_MSG_TYPE) { + ipversion = tvb_get_letohl(tvb, offset); + ptvcursor_add(cursor, hf_skinny_ipv4or6, 4, ENC_LITTLE_ENDIAN); + } + if (ipversion == IPADDRTYPE_IPV4) { + guint32 ip_address; + src_addr.type = AT_IPv4; + src_addr.len = 4; + src_addr.data = (guint8 *)&ip_address; + ip_address = tvb_get_ipv4(tvb, offset); + rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset), 0, "Skinny", pinfo->fd->num, is_video, NULL); + ptvcursor_add(cursor, hfindex_ipv4, 4, ENC_BIG_ENDIAN); + if (hdr_version >= V18_MSG_TYPE) { + /* skip over the extra room for ipv6 addresses */ + ptvcursor_advance(cursor, 12); + } + } else if (ipversion == IPADDRTYPE_IPV6 || ipversion == IPADDRTYPE_IPV4_V6) { + struct e_in6_addr IPv6; + src_addr.type = AT_IPv6; + src_addr.len = 16; + src_addr.data = (guint16 *)&IPv6; + tvb_get_ipv6(tvb, offset, &IPv6); + rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset), 0, "Skinny", pinfo->fd->num, is_video, NULL); + ptvcursor_add(cursor, hfindex_ipv6, 16, ENC_BIG_ENDIAN); + } else { + /* Invalid : skip over ipv6 space completely */ + ptvcursor_advance(cursor, 16); + } +} + +static void +dissect_skinny_displayLabel(ptvcursor_t *cursor, int hfindex, guint32 length, guint32 maxlength) +{ + proto_item *item = NULL; + proto_tree *tree = ptvcursor_tree(cursor); + guint32 offset = ptvcursor_current_offset(cursor); + tvbuff_t *tvb = ptvcursor_tvbuff(cursor); + + const gchar *disp_string = NULL; + wmem_strbuf_t *wmem_new = NULL; + const gchar *replacestr = NULL; + guint x = 0; + guint append_replaced_str = 0; + + if (length == 0) { + length = tvb_strnlen(tvb, offset, -1) + 1; + } + if (length >= maxlength) { + length = maxlength; + } + + disp_string = (const gchar *) tvb_memdup(wmem_packet_scope(), tvb, offset, length); + item = proto_tree_add_item(tree, hfindex, tvb, offset, length, ENC_ASCII | ENC_NA); + + wmem_new = wmem_strbuf_sized_new(wmem_packet_scope(), strlen(disp_string), maxlength); + + while (*disp_string) { + replacestr = '\0'; + if (strlen(disp_string) > x+1) { + if (*disp_string == '\36') { + replacestr = try_val_to_str_ext(disp_string[x + 1], &DisplayLabels_36_ext); + } else if (*disp_string == '\200') { + replacestr = try_val_to_str_ext(disp_string[x + 1], &DisplayLabels_200_ext); + } + } + if (replacestr) { + disp_string++; x++; /* swallow replaced characters */ + wmem_strbuf_append(wmem_new, replacestr); + append_replaced_str = 1; + } else { + wmem_strbuf_append_c(wmem_new, *disp_string); + } + x++; + disp_string++; + } + + if (append_replaced_str) { + proto_item_append_text(item, " => \"%s\"" , wmem_strbuf_get_str(wmem_new)); + } + ptvcursor_advance(cursor, length); +} + +/*** Messages Handlers ***/ + +/* [[[cog +cog.out(message_dissector_functions) +]]]*/ +/*[[[end]]]*/ + +/* Messages Handler Array */ +/* [[[cog +cog.out('typedef void (*message_handler) (ptvcursor_t * cursor, packet_info *pinfo);\n') +cog.out('static const struct opcode2handler {\n') +cog.out(' guint16 opcode;\n'); +cog.out(' message_handler handler;\n'); +cog.out(' const char *name;\n'); +cog.out('} skinny_opcode2handler[] = {\n') +for message in skinny.message: + cog.out(' {%-6s, %-47s, "%s"},\n' %(message.opcode, message.gen_handler(), message.name)) +cog.out('};\n') +]]]*/ +/*[[[end]]]*/ + +/* Dissect a single SCCP PDU */ +static int dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +{ + guint offset = 0; + /*gboolean is_video = FALSE;*/ /* FIX ME: need to indicate video or not */ + ptvcursor_t* cursor; + + /* Header fields */ + guint32 hdr_data_length; + guint32 hdr_version; + guint32 data_messageid; + guint16 i; + + /* Set up structures we will need to add the protocol subtree and manage it */ + proto_tree *skinny_tree = NULL; + proto_item *ti = NULL; + + /* Initialization */ + /* + hdr_data_length = tvb_get_letohl(tvb, offset); + hdr_version = tvb_get_letohl(tvb, offset+4); + data_messageid = tvb_get_letohl(tvb, offset+8); + */ + hdr_data_length = tvb_get_letohl(tvb, 0); + hdr_version = tvb_get_letohl(tvb, 4); + data_messageid = tvb_get_letohl(tvb, 8); + + /* Initialise stat info for passing to tap */ + pi_current++; + if (pi_current == MAX_SKINNY_MESSAGES_IN_PACKET) + { + /* Overwrite info in first struct if run out of space... */ + pi_current = 0; + } + si = &pi_arr[pi_current]; + si->messId = data_messageid; + si->messageName = val_to_str_ext(data_messageid, &message_id_ext, "0x%08X (Unknown)"); + si->callId = 0; + si->lineId = 0; + si->passThruId = 0; + si->callState = 0; + g_free(si->callingParty); + si->callingParty = NULL; + g_free(si->calledParty); + si->calledParty = NULL; + si->openreceiveStatus = 0; + si->startmediatransmisionStatus = 0; + + /* In the interest of speed, if "tree" is NULL, don't do any work not + * necessary to generate protocol tree items. + */ + if (tree) { + ti = proto_tree_add_item(tree, proto_skinny, tvb, offset, hdr_data_length+8, ENC_NA); + skinny_tree = proto_item_add_subtree(ti, ett_skinny); + proto_tree_add_uint(skinny_tree, hf_skinny_data_length, tvb, offset, 4, hdr_data_length); + proto_tree_add_uint(skinny_tree, hf_skinny_hdr_version, tvb, offset+4, 4, hdr_version); + } + + col_add_fstr(pinfo->cinfo, COL_INFO,"%s ", si->messageName); + col_set_fence(pinfo->cinfo, COL_INFO); + + /*offset += 8;*/ + /*cursor = ptvcursor_new(skinny_tree, tvb, offset);*/ + + proto_tree_add_uint(skinny_tree, hf_skinny_messageId, tvb,offset+8, 4, data_messageid ); + /*ptvcursor_add(cursor, hf_skinny_messageId, 4, data_messageid);*/ + + offset += 12; + cursor = ptvcursor_new(skinny_tree, tvb, offset); + + for (i = 0; i < sizeof(skinny_opcode2handler)/sizeof(struct opcode2handler) ; i++) { + if (skinny_opcode2handler[i].opcode == data_messageid && skinny_opcode2handler[i].handler) { + skinny_opcode2handler[i].handler(cursor, pinfo); + } + } + ptvcursor_free(cursor); + + tap_queue_packet(skinny_tap, pinfo, si); + return tvb_captured_length(tvb); +} + +/* Code to actually dissect the packets */ +static int +dissect_skinny(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) +{ + /* The general structure of a packet: {IP-Header|TCP-Header|n*SKINNY} + * SKINNY-Packet: {Header(Size, Reserved)|Data(MessageID, Message-Data)} + */ + /* Header fields */ + guint32 hdr_data_length; + guint32 hdr_version; + + /* check, if this is really an SKINNY packet, they start with a length + 0 */ + + if (tvb_captured_length(tvb) < 8) + { + return 0; + } + /* get relevant header information */ + hdr_data_length = tvb_get_letohl(tvb, 0); + hdr_version = tvb_get_letohl(tvb, 4); + + /* data_size = MIN(8+hdr_data_length, tvb_length(tvb)) - 0xC; */ + + if ( + (hdr_data_length < 4) || + ((hdr_version != BASIC_MSG_TYPE) && + (hdr_version != V10_MSG_TYPE) && + (hdr_version != V11_MSG_TYPE) && + (hdr_version != V15_MSG_TYPE) && + (hdr_version != V16_MSG_TYPE) && + (hdr_version != V17_MSG_TYPE) && + (hdr_version != V18_MSG_TYPE) && + (hdr_version != V19_MSG_TYPE) && + (hdr_version != V20_MSG_TYPE) && + (hdr_version != V21_MSG_TYPE) && + (hdr_version != V22_MSG_TYPE)) + ) + { + /* Not an SKINNY packet, just happened to use the same port */ + return 0; + } + + /* Make entries in Protocol column and Info column on summary display */ + col_set_str(pinfo->cinfo, COL_PROTOCOL, "SKINNY"); + + col_set_str(pinfo->cinfo, COL_INFO, "Skinny Client Control Protocol"); + + tcp_dissect_pdus(tvb, pinfo, tree, skinny_desegment, 4, get_skinny_pdu_len, dissect_skinny_pdu, data); + + return tvb_captured_length(tvb); +} + +/* Register the protocol with Wireshark */ +void +proto_register_skinny(void) +{ + /* Setup list of header fields */ + static hf_register_info hf[] = { + { &hf_skinny_data_length, + { + "Data length", "skinny.data_length", FT_UINT32, BASE_DEC, NULL, 0x0, + "Number of bytes in the data portion.", HFILL }}, + { &hf_skinny_hdr_version, + { + "Header version", "skinny.hdr_version", FT_UINT32, BASE_HEX, VALS(header_version), 0x0, + NULL, HFILL }}, + { &hf_skinny_messageId, + { + "Message ID", "skinny.messageId", FT_UINT32, BASE_DEC|BASE_EXT_STRING, &message_id_ext, 0x0, + NULL, HFILL }}, + { &hf_skinny_xmlData, + { + "XML data", "skinny.xmlData", FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + { &hf_skinny_ipv4or6, + { + "IPv4or6", "skinny.ipv4or6", FT_UINT32, BASE_DEC|BASE_EXT_STRING, &IpAddrType_ext, 0x0, + NULL, HFILL }}, + /* [[[cog + for valuestr in sorted(xml2skinny.fieldsArray.values()): + cog.out('%s' %valuestr) + ]]]*/ + /*[[[end]]]*/ + }; + + /* Setup protocol subtree array */ + static gint *ett[] = { + &ett_skinny, + &ett_skinny_tree, + }; + + module_t *skinny_module; + + /* Register the protocol name and description */ + proto_skinny = proto_register_protocol("Skinny Client Control Protocol", + "SKINNY", "skinny"); + + /* Required function calls to register the header fields and subtrees used */ + proto_register_field_array(proto_skinny, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + + skinny_module = prefs_register_protocol(proto_skinny, NULL); + prefs_register_bool_preference(skinny_module, "desegment", + "Reassemble SCCP messages spanning multiple TCP segments", + "Whether the SCCP dissector should reassemble messages spanning multiple TCP segments." + " To use this option, you must also enable" + " \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.", + &skinny_desegment); + + skinny_tap = register_tap("skinny"); +} + +void +proto_reg_handoff_skinny(void) +{ + static gboolean skinny_prefs_initialized = FALSE; + + if (!skinny_prefs_initialized) { + /* Skinny content type and internet media type used by other dissectors are the same */ + media_type_dissector_table = find_dissector_table("media_type"); + skinny_handle = new_create_dissector_handle(dissect_skinny, proto_skinny); + dissector_add_uint("tcp.port", TCP_PORT_SKINNY, skinny_handle); + + ssl_dissector_add(SSL_PORT_SKINNY, "skinny", TRUE); + skinny_prefs_initialized = TRUE; + } +} + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 2 + * tab-width: 2 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=2 tabstop=2 expandtab: + * :indentSize=2:tabSize=2:noTabs=true: + */ diff --git a/epan/dissectors/packet-skinny.h b/epan/dissectors/packet-skinny.h index b9ef275bef..aa75633ab6 100644 --- a/epan/dissectors/packet-skinny.h +++ b/epan/dissectors/packet-skinny.h @@ -25,6 +25,7 @@ typedef struct _skinny_info_t { guint32 messId; + guint32 maxProtocolVersion; guint32 lineId; guint32 callId; guint32 passThruId; @@ -33,5 +34,7 @@ typedef struct _skinny_info_t gchar *callingParty; gchar *calledParty; gboolean hasCallInfo; + guint openreceiveStatus; + guint startmediatransmisionStatus; } skinny_info_t; diff --git a/epan/dissectors/packet-skinny.h.in b/epan/dissectors/packet-skinny.h.in new file mode 100644 index 0000000000..aa75633ab6 --- /dev/null +++ b/epan/dissectors/packet-skinny.h.in @@ -0,0 +1,40 @@ +/* packet-skinny.h + * Routines for skinny packet disassembly + * + * Wireshark - Network traffic analyzer + * By Gerald Combs + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + + +/* Container for tapping relevant data */ +typedef struct _skinny_info_t +{ + guint32 messId; + guint32 maxProtocolVersion; + guint32 lineId; + guint32 callId; + guint32 passThruId; + const gchar *messageName; + guint32 callState; + gchar *callingParty; + gchar *calledParty; + gboolean hasCallInfo; + guint openreceiveStatus; + guint startmediatransmisionStatus; +} skinny_info_t; + diff --git a/tools/SkinnyProtocolOptimized.xml b/tools/SkinnyProtocolOptimized.xml new file mode 100644 index 0000000000..adcce7b68c --- /dev/null +++ b/tools/SkinnyProtocolOptimized.xml @@ -0,0 +1,4062 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/parse_xml2skinny_dissector.py b/tools/parse_xml2skinny_dissector.py new file mode 100755 index 0000000000..02a5bbf346 --- /dev/null +++ b/tools/parse_xml2skinny_dissector.py @@ -0,0 +1,888 @@ +#!/usr/bin/env python2 +# +# Wireshark Dissector Generator for SkinnyProtocolOptimized.xml +# +# Author: Diederik de Groot +# Date: 2014-7-22 +# Skinny Protocol Versions: 0 through 22 +# +# Heritage: +# xml2obj based on http://code.activestate.com/recipes/149368-xml2obj/ +# +# Dependencies: +# python / xml / sax +# +# Called By: +# cog.py + packet-skinny.c.in for inplace code generation +# See: http://nedbatchelder.com/code/cog/ +# +# + +import re +import xml.sax.handler + +indentation = 0 +indent_str = '' +fieldsArray = {} +si_fields = {"callReference" : "si->callId", "lineInstance": "si->lineId", "passThruPartyId" : "si->passThruId", "callState" : "si->callState", "callingParty" : "si->callingParty", "calledParty" : "si->calledParty", "openReceiveChannelStatus" : "si->openreceiveStatus", "startMediaTransmissionStatus" : "si->startmediatransmisionStatus"} +debug = 1 + +def xml2obj(src): + """ + A function to converts XML data into native Python objects. + + """ + non_id_char = re.compile('[^_0-9a-zA-Z]') + + def _name_mangle(name): + return non_id_char.sub('_', name) + + class DataNode(object): + def __init__(self): + self._attrs = {} # XML attributes and child elements + self.data = None # child text data + self.parent = None + self.basemessage = None + self.intsize = 0 + self._children = [] + self.declared = [] + + def __len__(self): + # treat single element as a list of 1 + return 1 + def __getitem__(self, key): + if isinstance(key, basestring): + return self._attrs.get(key,None) + else: + return [self][key] + + def __contains__(self, name): + return self._attrs.has_key(name) + + def __nonzero__(self): + return bool(self._attrs or self.data) + + def __getattr__(self, name): + if name.startswith('__'): + # need to do this for Python special methods??? + raise AttributeError(name) + return self._attrs.get(name,None) + + def _add_xml_attr(self, name, value): + if name in self._attrs: + # multiple attribute of the same name are represented by a list + children = self._attrs[name] + if not isinstance(children, list): + children = [children] + self._attrs[name] = children + children.append(value) + else: + self._attrs[name] = value + + def _add_child(self, name, value): + #print "adding : %s / %s to %s" %(name,value, self.__class__) + self._children.append(value) + + def __str__(self): + return '%s:%s' %(self.__class__,self.name) + + def keys(self): + return self._attrs.keys() + + def __repr__(self): + items = {} + if self.data: + items.append(('data', self.data)) + return u'{%s}' % ', '.join([u'%s:%s' % (k,repr(v)) for k,v in items]) + + def __setitem__(self, key, value): + self._attrs[key] = value + + def getfieldnames(self): + return '' + + def declaration(self): + global fieldsArray + if self.name not in fieldsArray: + fieldsArray[self.name] = '/* UNKNOWN { &hf_skinny_%s,\n {\n"%s", "skinny.%s", FT_UINT32, BASE_DEC, NULL, 0x0,\n "%s", HFILL }}, */\n' %(self.name, self.name, self.name, self.comment) + return '' + + def dissect(self): + return self.name or '' + + def incr_indent(self): + global indentation + global indent_str + indentation += 1 + indent_str = '' + for x in range(0, indentation): + indent_str += ' ' + + def decr_indent(self): + global indentation + global indent_str + indentation -= 1 + indent_str = '' + for x in range(0, indentation): + indent_str += ' ' + + def indent_out(self, string): + return indent_str + string + + + class Message(DataNode): + ''' Message ''' + def __str__(self): + return self.name + + def gen_handler(self): + if self.fields is None: + # skip whole message and return NULL as handler + return 'NULL' + return 'handle_%s' %self.name + + def dissect(self): + ret = '' + declarations = 0 + + if (self.fields is not None): + ret += self.indent_out("/*\n") + ret += self.indent_out(" * Message: %s\n" %self.name) + ret += self.indent_out(" * Opcode: %s\n" %self.opcode) + ret += self.indent_out(" * Type: %s\n" %self.type) + ret += self.indent_out(" * Direction: %s\n" %self.direction) + ret += self.indent_out(" * VarLength: %s\n" %self.dynamic) + if self.comment: + ret += self.indent_out(" * Comment: %s\n" %self.comment) + ret += self.indent_out(" */\n") + ret += self.indent_out("static void\n") + ret += self.indent_out("handle_%s(ptvcursor_t *cursor, packet_info * pinfo _U_)\n" %self.name) + ret += self.indent_out("{\n") + self.incr_indent() + for fields in self.fields: + if fields.size_gt: + if self.basemessage.declared is None or "hdr_data_length" not in self.basemessage.declared: + ret += self.indent_out("guint32 hdr_data_length = tvb_get_letohl(ptvcursor_tvbuff(cursor), 0);\n") + self.basemessage.declared.append("hdr_data_length") + declarations += 1 + if not declarations: + for fields in self.fields[1:]: + if self.basemessage.declared is None or "hdr_version" not in self.basemessage.declared: + ret += self.indent_out("guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4);\n") + self.basemessage.declared.append("hdr_version") + declarations += 1 + for fields in self.fields: + ret += '%s' %fields.declaration() + declarations += 1 + + if declarations > 1: + ret += "\n" + + #ret += self.indent_out('if (!cursor || !pinfo) {return;}\n\n') # ugly check to get rid of compiler warning about unused parameters + if (self.fields is not None): + for fields in self.fields: + ret += '%s' %fields.dissect() + self.decr_indent() + ret += "}\n\n" + return ret + + class Fields(DataNode): + ''' Fields ''' + size_fieldnames= [] + + def declaration(self): + ret = '' + + #ret += '/* Fields Declaration */' + + for field in self._children: + ret += '%s' %(field.declaration()) + self.intsize += field.intsize + return ret + + def dissect(self, lookupguide=""): + ret = '' + ifstarted = 0 + #ret += "/* [PARENT: %s, BASEMESSAGE: %s] */\n" %(self.parent.name,self.basemessage.name) + + if ((self.beginversion or self.endversion) and (self.beginversion != "0" or self.endversion != "22")): + + ifstarted = 1 + ret += self.indent_out('if (') + if (self.beginversion and self.beginversion != "0"): + if (not self.endversion or self.endversion == "22"): + ret += 'hdr_version >= V%s_MSG_TYPE) {\n' %self.beginversion + else: + ret += 'hdr_version >= V%s_MSG_TYPE && ' %self.beginversion + if (self.endversion and self.endversion != "22"): + ret += 'hdr_version <= V%s_MSG_TYPE) {\n' %self.endversion + self.incr_indent() + + if self.size_gt: + ret += self.indent_out('if (hdr_data_length > %s) {\n' %self.size_gt) + self.incr_indent() + + # generate dissection + for field in self._children: + ret += '%s' %(field.dissect()) + + if self.size_gt: + self.decr_indent() + ret += self.indent_out('}\n') + + if ifstarted: + self.decr_indent() + ret += self.indent_out('}\n') + + return ret; + + class Integer(DataNode): + def __init__(self): + DataNode.__init__(self) + self.intsize = 0 + self.endian = "ENC_LITTLE_ENDIAN" + + def __str__(self): + return '%s:%s' %(self.__class__,self.name) + + def declaration(self): + ret = '' + + int_sizes = {'uint32':4,'uint16':2,'uint8':1,'int32':4,'int16':2,'int8':1,'ipport':4} + if self.endianness == "big": + self.endian = "ENC_BIG_ENDIAN" + if self.type in int_sizes: + self.intsize = int_sizes[self.type] + else: + print "ERROR integer %s with type: %s, could not be found" %(self.name, self.type) + + if self.declare == "yes": + if self.basemessage.declared is None or self.name not in self.basemessage.declared: + ret += self.indent_out('g%s %s = 0;\n' %(self.type, self.name)) + self.basemessage.declared.append(self.name) + + global fieldsArray + if self.name not in fieldsArray: + fieldsArray[self.name] ='{ &hf_skinny_%s,\n {\n "%s", "skinny.%s", FT_UINT%d, BASE_DEC, NULL, 0x0,\n %s, HFILL }},\n' %(self.name, self.comment if (self.comment and self.longcomment) else self.name, self.name.replace("_","."), self.intsize * 8, '"' + self.longcomment + '"' if self.longcomment else '"' + self.comment + '"' if self.comment else 'NULL') + return ret + + def dissect(self): + ret = '' + + size = 0 + if self.size_fieldname: + if self.basemessage.dynamic == "yes": + size = self.size_fieldname + else: + size = self.maxsize + elif self.size: + size = self.size + + if size: + variable = 'counter_%d' %indentation + ret += self.indent_out('{\n') + self.incr_indent() + ret += self.indent_out('guint32 %s = 0;\n' %(variable)); + if self.size_fieldname: + ret += self.indent_out('ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "%s [ref: %s = %%d, max:%s]", %s);\n' %(self.name, self.size_fieldname, size, self.size_fieldname)) + else: + ret += self.indent_out('ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "%s [max:%s]");\n' %(self.name, size)) + ret += self.indent_out('for (%s = 0; %s < %s; %s++) {\n' %(variable, variable, size, variable)); + if self.basemessage.dynamic == "no" and self.size_fieldname: + self.incr_indent() + ret += self.indent_out('if (%s < %s) {\n' %(variable,self.size_fieldname)) + self.incr_indent() + + if self.declare == "yes": + if self.endianness == "big": + if (self.intsize == 4): + ret += self.indent_out('%s = tvb_get_ntohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));\n' %(self.name)) + elif (self.intsize == 2): + ret += self.indent_out('%s = tvb_get_ntohs(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));\n' %(self.name)) + else: + ret += self.indent_out('%s = tvb_get_guint8(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));\n' %(self.name)) + else: + if (self.intsize == 4): + ret += self.indent_out('%s = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));\n' %(self.name)) + elif (self.intsize == 2): + ret += self.indent_out('%s = tvb_get_letohs(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));\n' %(self.name)) + else: + ret += self.indent_out('%s = tvb_get_guint8(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));\n' %(self.name)) + + if self.name in si_fields.keys(): + ret += self.indent_out('%s = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));\n' %(si_fields[self.name])) + + ret += self.indent_out('ptvcursor_add(cursor, hf_skinny_%s, %d, %s);\n' %(self.name, self.intsize, self.endian)) + + if size: + if self.basemessage.dynamic == "no" and self.size_fieldname: + self.decr_indent() + ret += self.indent_out('} else {\n') + ret += self.indent_out(' ptvcursor_advance(cursor, %d);\n' %self.intsize) + ret += self.indent_out('}\n') + self.decr_indent() + ret += self.indent_out('}\n') + ret += self.indent_out('ptvcursor_pop_subtree(cursor); /* end for loop tree: %s */\n' %self.name) + self.decr_indent() + ret += self.indent_out('}\n') + return ret + + class Enum(DataNode): + def __init__(self): + DataNode.__init__(self) + self.intsize = 0 + self.sparse = 0 + + def __str__(self): + return '%s:%s' %(self.__class__,self.name) + + def declaration(self): + ret = '' + prevvalue = 0 + enum_sizes = {'uint32':4,'uint16':2,'uint8':1} + if self.type in enum_sizes: + self.intsize = enum_sizes[self.type] + else: + print "ERROR enum %s with type: %s, could not be found" %(self.name, self.type) + + if self.declare == "yes": + if self.basemessage.declared is None or self.name not in self.basemessage.declared: + ret += self.indent_out('g%s %s = 0;\n' %(self.type, self.name)) + self.basemessage.declared.append(self.name) + + global fieldsArray + if self.name not in fieldsArray: + fieldsArray[self.name] ='{&hf_skinny_%s,\n {\n "%s", "skinny.%s", FT_UINT%d, BASE_HEX | BASE_EXT_STRING, &%s_ext, 0x0,\n %s, HFILL }},\n' %(self.name, self.comment if (self.comment and self.longcomment) else self.name, self.name.replace("_","."), self.intsize * 8, self.subtype[0].upper() + self.subtype[1:], '"' + self.longcomment + '"' if self.longcomment else '"' + self.comment + '"' if self.comment else 'NULL') + return ret + + def dissect(self): + ret = '' + endian = "ENC_LITTLE_ENDIAN" + + + size = 0 + if self.size_fieldname: + if self.basemessage.dynamic == "yes": + size = self.size_fieldname + else: + size = self.maxsize + elif self.size: + size = self.size + + if size: + variable = 'counter_%d' %indentation + ret += self.indent_out('{\n') + self.incr_indent() + ret += self.indent_out('guint32 %s = 0;\n' %(variable)); + if self.size_fieldname: + ret += self.indent_out('ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "%s [ref: %s = %%d, max:%s]", %s);\n' %(self.name, self.size_fieldname, size, self.size_fieldname)) + else: + ret += self.indent_out('ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "%s [max:%s]");\n' %(self.name, size)) + ret += self.indent_out('for (%s = 0; %s < %s; %s++) {\n' %(variable, variable, size, variable)); + if self.basemessage.dynamic == "no" and self.size_fieldname: + self.incr_indent() + ret += self.indent_out('if (%s < %s) {\n' %(variable,self.size_fieldname)) + self.incr_indent() + + if self.name in si_fields.keys(): + ret += self.indent_out('%s = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));\n' %(si_fields[self.name])) + + if self.declare == "yes": + if (self.intsize == 4): + ret += self.indent_out('%s = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));\n' %(self.name)) + elif (self.intsize == 2): + ret += self.indent_out('%s = tvb_get_letohs(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));\n' %(self.name)) + else: + ret += self.indent_out('%s = tvb_get_guint8(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));\n' %(self.name)) + + ret += self.indent_out('ptvcursor_add(cursor, hf_skinny_%s, %d, %s);\n' %(self.name, self.intsize, endian)) + + if size: + if self.basemessage.dynamic == "no" and self.size_fieldname: + self.decr_indent() + ret += self.indent_out('} else {\n') + ret += self.indent_out(' ptvcursor_advance(cursor, 4);\n') + ret += self.indent_out('}\n') + self.decr_indent() + ret += self.indent_out('}\n') + ret += self.indent_out('ptvcursor_pop_subtree(cursor); /* end for loop tree: %s */\n' %self.name) + self.decr_indent() + ret += self.indent_out('}\n') + return ret + + class String(DataNode): + def __init__(self): + DataNode.__init__(self) + + def __str__(self): + return '%s:%s' %(self.__class__,self.name) + + def declaration(self): + ret = '' + self.intsize = 0 + if self.size: + if self.size=="VariableDirnumSize": + self.intsize = 24 + else: + self.intsize = int(self.size) + elif self.maxsize and self.basemessage.dynamic == "no": + self.intsize = int(self.maxsize) + + if self.declare == "yes": + if self.size=="VariableDirnumSize": + if self.basemessage.declared is None or "VariableDirnumSize" not in self.basemessage.declared: + if self.basemessage.declared is None or "hdr_version" not in self.basemessage.declared: + #if (self.basemessage.fields is not None and len(self.basemessage.fields) == 1): + ret += self.indent_out('guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4);\n') + self.basemessage.declared.append("hdr_version") + ret += self.indent_out('guint32 VariableDirnumSize = (hdr_version >= V18_MSG_TYPE) ? 25 : 24;\n') + self.basemessage.declared.append("VariableDirnumSize") + else: + if self.basemessage.declared is None or self.name not in self.basemessage.declared: + ret += self.indent_out('guint32 %s = 0;\n' %self.name) + self.basemessage.declared.append(self.name) + + if self.basemessage.dynamic == "yes" and not self.subtype == "DisplayLabel": + if self.basemessage.declared is None or self.name + '_len' not in self.basemessage.declared: + ret += self.indent_out('guint32 %s_len = 0;\n' %self.name) + self.basemessage.declared.append(self.name + '_len') + + global fieldsArray + if self.name not in fieldsArray: + fieldsArray[self.name] = '{&hf_skinny_%s,\n {\n "%s", "skinny.%s", FT_STRING, BASE_NONE, NULL, 0x0,\n %s, HFILL }},\n' %(self.name, self.comment if (self.comment and self.longcomment) else self.name, self.name.replace("_","."), '"' + self.longcomment + '"' if self.longcomment else '"' + self.comment + '"' if self.comment else 'NULL') + return ret + + def dissect(self): + ret = '' + + if self.declare == "yes" and self.size != "VariableDirnumSize": + ret += self.indent_out('%s = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4);\n' %self.name) + + if self.subtype == "DisplayLabel": + if self.basemessage.dynamic == "yes": + ret += self.indent_out('dissect_skinny_displayLabel(cursor, hf_skinny_%s, 0, %d);\n' %(self.name, self.intsize)) + elif self.size_fieldname: + ret += self.indent_out('dissect_skinny_displayLabel(cursor, hf_skinny_%s, %s, %d);\n' %(self.name, self.size_fieldname, self.intsize)) + else: + ret += self.indent_out('dissect_skinny_displayLabel(cursor, hf_skinny_%s, %s, %d);\n' %(self.name, self.size, self.intsize)) + + elif self.basemessage.dynamic == "yes": + ret += self.indent_out('%s_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1;\n' %self.name) + ret += self.indent_out('if (%s_len > 1) {\n' %self.name) + if self.name in si_fields.keys(): + ret += self.indent_out(' %s = g_strdup(tvb_format_stringzpad(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), %s_len));\n' %(si_fields[self.name], self.name)) + ret += self.indent_out(' ptvcursor_add(cursor, hf_skinny_%s, %s_len, ENC_ASCII|ENC_NA);\n' %(self.name, self.name)) + ret += self.indent_out('} else {\n') + ret += self.indent_out(' ptvcursor_advance(cursor, 1);\n') + ret += self.indent_out('}\n') + elif self.size_fieldname: + if self.name in si_fields.keys(): + ret += self.indent_out('%s = g_strdup(tvb_format_stringzpad(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), %s));\n' %(si_fields[self.name], self.size_fieldname)) + ret += self.indent_out('ptvcursor_add(cursor, hf_skinny_%s, %s, ENC_ASCII|ENC_NA);\n' %(self.name, self.size_fieldname)) + else: + if self.name in si_fields.keys(): + ret += self.indent_out('%s = g_strdup(tvb_format_stringzpad(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), %s));\n' %(si_fields[self.name], self.size)) + ret += self.indent_out('ptvcursor_add(cursor, hf_skinny_%s, %s, ENC_ASCII|ENC_NA);\n' %(self.name, self.size)) + + return ret + + class Ether(DataNode): + def __init__(self): + DataNode.__init__(self) + + def __str__(self): + return '%s:%s' %(self.__class__,self.name) + + def declaration(self): + ret = '' + self.intsize = 6 + if self.size: + self.intsize = int(self.size) + elif self.maxsize and self.basemessage.dynamic == "no": + self.intsize = int(self.maxsize) + + if self.declare == "yes": + if self.basemessage.declared is None or self.name not in self.basemessage.declared: + ret += self.indent_out('guint32 %s = 0;\n' %self.name) + self.basemessage.declared.append(self.name) + + if self.basemessage.dynamic == "yes": + if self.basemessage.declared is None or self.name + '_len' not in self.basemessage.declared: + ret += self.indent_out('guint32 %s_len = 0;\n' %self.name) + self.basemessage.declared.append(self.name + '_len') + + global fieldsArray + if self.name not in fieldsArray: + fieldsArray[self.name] = '{ &hf_skinny_%s,\n {\n "%s", "skinny.%s", FT_ETHER, BASE_NONE, NULL, 0x0,\n %s, HFILL }},\n' %(self.name, self.comment if (self.comment and self.longcomment) else self.name, self.name.replace("_","."), '"' + self.longcomment + '"' if self.longcomment else '"' + self.comment + '"' if self.comment else 'NULL') + return ret + + def dissect(self): + ret = '' + + if self.basemessage.dynamic == "yes": + ret += self.indent_out('%s_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), -1)+1;\n' %self.name) + ret += self.indent_out('if (%s_len > 1) {\n' %self.name) + ret += self.indent_out(' ptvcursor_add(cursor, hf_skinny_%s, 6, ENC_NA);\n' %(self.name, self.name)) + ret += self.indent_out(' ptvcursor_advance(cursor, %s_len - 6);\n' %(self.name)) + ret += self.indent_out('} else {\n') + ret += self.indent_out(' ptvcursor_advance(cursor, 1);\n') + ret += self.indent_out('}\n') + elif self.size_fieldname: + ret += self.indent_out('ptvcursor_add(cursor, hf_skinny_%s, 6, ENC_NA);\n' %(self.name)) + ret += self.indent_out('ptvcursor_advance(cursor, %s - 6);\n' %(self.size_fieldname)) + else: + ret += self.indent_out('ptvcursor_add(cursor, hf_skinny_%s, 6, ENC_NA);\n' %(self.name)) + ret += self.indent_out('ptvcursor_advance(cursor, %s - 6);\n' %(self.size)) + return ret + + class BitField(DataNode): + def __init__(self): + DataNode.__init__(self) + + def __str__(self): + return '%s:%s' %(self.__class__,self.name) + + def declaration(self): + global fieldsArray + ret = '' + int_sizes = {'uint32':4,'uint16':2,'uint8':1,'int32':4,'int16':2,'int8':1} + self.intsize = 0 + if self.size in int_sizes: + self.intsize = int_sizes[self.size] + + for entries in self.entries: + for entry in entries.entry: + if entry.name not in fieldsArray: + fieldsArray[entry.name] = '{ &hf_skinny_%s,\n {\n "%s", "skinny.%s", FT_BOOLEAN, %d, TFS(&tfs_yes_no), %s,\n %s, HFILL }},\n' %(entry.name, entry.text, entry.name.replace("_","."), self.intsize * 8, entry.value, '"' + self.longcomment + '"' if self.longcomment else '"' + self.comment + '"' if self.comment else 'NULL') + + return ret + + def dissect(self): + ret = '' + ret += self.indent_out('ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "%s");\n' %(self.name)) + for entries in self.entries: + for entry in entries.entry: + ret += self.indent_out('ptvcursor_add_no_advance(cursor, hf_skinny_%s, %d, ENC_LITTLE_ENDIAN);\n' %(entry.name, self.intsize)) + ret += self.indent_out('ptvcursor_advance(cursor, %d);\n' %(self.intsize)) + ret += self.indent_out('ptvcursor_pop_subtree(cursor); /* end bitfield: %s */\n' %(self.name)) + + + return ret + + class Ip(DataNode): + def __init__(self): + DataNode.__init__(self) + self.intsize = 4 + if self.type == "ipv6": + self.intsize = 16 + + def __str__(self): + return '%s:%s' %(self.__class__,self.name) + + def declaration(self): + global fieldsArray + if self.name not in fieldsArray: + if self.type == "ipv4": + fieldsArray[self.name] = '{ &hf_skinny_%s,\n {\n "%s", "skinny.%s", FT_IPv4, BASE_NONE, NULL, 0x0,\n %s, HFILL }},\n' %(self.name, self.comment if (self.comment and self.longcomment) else self.name, self.name.replace("_","."), '"' + self.longcomment + '"' if self.longcomment else '"' + self.comment + '"' if self.comment else 'NULL') + else: + fieldsArray[self.name] = '{ &hf_skinny_%s,\n {\n "%s", "skinny.%s", FT_IPv6, BASE_NONE, NULL, 0x0,\n %s, HFILL }},\n' %(self.name, self.comment if (self.comment and self.longcomment) else self.name, self.name.replace("_","."), '"' + self.longcomment + '"' if self.longcomment else '"' + self.comment + '"' if self.comment else 'NULL') + return '' + + def dissect(self): + if self.type == "ipv4": + return self.indent_out('ptvcursor_add(cursor, hf_skinny_%s, 4, ENC_BIG_ENDIAN);\n' %self.name) + else: + return self.indent_out('ptvcursor_add(cursor, hf_skinny_%s, 16, ENC_BIG_ENDIAN);\n' %self.name) + + class Ipv4or6(DataNode): + def __init__(self): + DataNode.__init__(self) + self.intsize = 4 + if self.endianness is None: + self.intsize += 16 + + def __str__(self): + return '%s:%s' %(self.__class__,self.name) + + def declaration(self): + global fieldsArray + name = self.name + '_ipv4' + if name not in fieldsArray: + fieldsArray[name] = '{ &hf_skinny_%s,\n {\n "%s", "skinny.%s", FT_IPv4, BASE_NONE, NULL, 0x0,\n %s, HFILL }},\n' %(name, self.name + ' IPv4 Address', name.replace("_","."), '"' + self.longcomment + '"' if self.longcomment else '"' + self.comment + '"' if self.comment else 'NULL') + name = self.name + '_ipv6' + if name not in fieldsArray: + fieldsArray[name] = '{ &hf_skinny_%s,\n {\n "%s", "skinny.%s", FT_IPv6, BASE_NONE, NULL, 0x0,\n %s, HFILL }},\n' %(name, self.name + ' IPv6 Address', name.replace("_","."), '"' + self.longcomment + '"' if self.longcomment else '"' + self.comment + '"' if self.comment else 'NULL') + return '' + + def dissect(self): + return self.indent_out('dissect_skinny_ipv4or6(cursor, hf_skinny_%s_ipv4, hf_skinny_%s_ipv6, pinfo);\n' %(self.name, self.name)) + + class XML(DataNode): + def __init__(self): + DataNode.__init__(self) + self.intsize = 0 + + def __str__(self): + return '%s:%s' %(self.__class__,self.name) + + def declaration(self): + global fieldsArray + + if self.size: + self.intsize = int(self.size) + elif self.maxsize: + self.intsize = int(self.maxsize) + + if self.name not in fieldsArray: + fieldsArray[self.name] = '{ &hf_skinny_%s,\n {\n "%s", "skinny.%s", FT_STRING, BASE_NONE, NULL, 0x0,\n %s, HFILL }},\n' %(self.name, self.comment if (self.comment and self.longcomment) else self.name, self.name.replace("_","."), '"' + self.longcomment + '"' if self.longcomment else '"' + self.comment + '"' if self.comment else 'NULL') + return '' + + def dissect(self): + ret = '' + if self.size_fieldname: + ret += self.indent_out('dissect_skinny_xml(cursor, hf_skinny_%s, pinfo, %s, %d);\n' %(self.name, self.size_fieldname, self.intsize)) + else: + ret += self.indent_out('dissect_skinny_xml(cursor, hf_skinny_%s, pinfo, 0, %d);\n' %(self.name, self.intsize)) + return ret + + class Struct(DataNode): + def __str__(self): + return '// Struct : %s / %s / %s / %s\n' %(self.name, self.size, self.field_sizename, self.maxsize) + + def declaration(self): + ret = '' + + if (self.fields is not None and len(self.fields)): + if (len(self.fields) > 1): + if self.basemessage.declared is None or "hdr_version" not in self.basemessage.declared: + ret += self.indent_out("guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4);\n") + self.basemessage.declared.append("hdr_version") + for fields in self.fields: + ret += '%s' %fields.declaration() + self.intsize += fields.intsize + + return ret + + def dissect(self): + ret = '' + variable = 'counter_%d' %indentation + size = 0 + + if self.size_fieldname: + if self.basemessage.dynamic == "yes": + size = self.size_fieldname + else: + size = self.maxsize + elif self.size: + size = self.size + + if size: + ret += self.indent_out('{\n') + self.incr_indent() + if debug: + ret += self.indent_out('/* start struct : %s / size: %d */\n' %(self.name, self.intsize)) + ret += self.indent_out('guint32 %s = 0;\n' %(variable)); + if self.size_fieldname: + ret += self.indent_out('ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "%s [ref: %s = %%d, max:%s]", %s);\n' %(self.name, self.size_fieldname, size, self.size_fieldname)) + else: + ret += self.indent_out('ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "%s [max:%s]");\n' %(self.name, size)) + ret += self.indent_out('for (%s = 0; %s < %s; %s++) {\n' %(variable, variable, size, variable)); + if self.basemessage.dynamic == "no" and self.size_fieldname: + self.incr_indent() + ret += self.indent_out('if (%s < %s) {\n' %(variable,self.size_fieldname)) + self.incr_indent() + else: + ret += self.indent_out('{\n') + self.incr_indent() + if debug: + ret += self.indent_out('/* start struct : %s / size: %d */\n' %(self.name, self.intsize)) + ret += self.indent_out('ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "%s");\n' %(self.name)) + + if size: + if self.size_fieldname: + ret += self.indent_out('ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "%s [%%d / %%d]", %s + 1, %s);\n' %(self.name, variable, self.size_fieldname)) + else: + ret += self.indent_out('ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "%s [%%d / %%d]", %s + 1, %s);\n' %(self.name, variable, size)) + + if (self.fields is not None and len(self.fields)): + for fields in self.fields: + ret += '%s' %fields.dissect() + + if self.basemessage.dynamic == "no" and self.size_fieldname: + self.decr_indent() + ret += self.indent_out('} else {\n') + ret += self.indent_out(' ptvcursor_advance(cursor, %d);\n' %(self.intsize)) + ret += self.indent_out('}\n') + + if size: + ret += self.indent_out('ptvcursor_pop_subtree(cursor);\n') + if debug: + ret += self.indent_out('/* end for loop tree: %s */\n' %self.name) + self.decr_indent() + ret += self.indent_out('}\n') + + ret += self.indent_out('ptvcursor_pop_subtree(cursor);\n') + ret += self.indent_out('/* end struct: %s */\n' %self.name) + self.decr_indent() + ret += self.indent_out('}\n') + + return ret + + class Union(DataNode): + def __str__(self): + return '%s:%s' %(self.__class__,self.name) + + def declaration(self): + ret = '' + self.maxsize = 0 + if (self.fields is not None and len(self.fields)): + if (len(self.fields) > 1): + if self.basemessage.declared is None or "hdr_version" not in self.basemessage.declared: + ret += self.indent_out("guint32 hdr_version = tvb_get_letohl(ptvcursor_tvbuff(cursor), 4);\n") + self.basemessage.declared.append("hdr_version") + for fields in self.fields: + ret += '%s' %fields.declaration() + previous_lookup_eq = fields._children[0].lookup_eq + previous_lookup_le = fields._children[0].lookup_le + previous_lookup_ge = fields._children[0].lookup_ge + self.runningtotal = 0 + for field in fields._children: + if previous_lookup_eq != field.lookup_eq or previous_lookup_le != field.lookup_le or previous_lookup_ge == field.lookup_ge: + previous_lookup_eq = field.lookup_eq + previous_lookup_le = field.lookup_le + previous_lookup_ge = field.lookup_ge + self.runningtotal = 0 + + self.runningtotal += field.intsize + if self.runningtotal > self.maxsize: + self.maxsize = self.runningtotal + + self.intsize = self.maxsize + + return ret + + def dissect(self): + ret = '' + ifblock = self.indent_out('if') + skip = 0 + #ret += self.indent_out('/* Union : %s / maxsize: %s */\n' %(self.name, self.maxsize)) + + if (self.fields is not None and len(self.fields)): + for fields in self.fields: + for field in fields._children: + if self.lookup_guide and (field.lookup_ge or field.lookup_le or field.lookup_eq): + lookupguide = self.lookup_guide + # start block + subtree_text = '' + if field.lookup_ge and field.lookup_le: + ret += '%s (%s >= %s && %s <= %s)' %(ifblock, lookupguide, field.lookup_ge.upper(), lookupguide, field.lookup_le.upper()) + subtree_text = "%s <= %s <= %s" %(field.lookup_ge, lookupguide, field.lookup_le) + elif field.lookup_ge: + ret += '%s (%s >= %s)' %(ifblock, lookupguide, field.lookup_ge.upper()) + subtree_text = "%s >= %s" %(lookupguide, field.lookup_ge) + elif field.lookup_le: + ret += '%s (%s <= %s)' %(ifblock, lookupguide, field.lookup_le.upper()) + subtree_text = "%s <= %s" %(lookupguide, field.lookup_le) + elif field.lookup_eq: + if field.lookup_eq == "*": + ret += ' else' + subtree_text = "any %s" %(lookupguide) + elif field.lookup_eq == "skip": + continue + else: + ret += '%s (%s == %s)' %(ifblock, lookupguide, field.lookup_eq.upper()) + subtree_text = "%s is %s" %(lookupguide, field.lookup_eq) + + ret += self.indent_out(' {\n') + self.incr_indent() + if debug: + ret += self.indent_out('/* start union : %s / maxsize: %s */\n' %(self.name, self.maxsize)) + currsize = 0 + # dissect field + + ret += self.indent_out('ptvcursor_add_text_with_subtree(cursor, SUBTREE_UNDEFINED_LENGTH, ett_skinny_tree, "%s");\n' %subtree_text) + ret += '%s' %field.dissect() + ret += self.indent_out('ptvcursor_pop_subtree(cursor);\n') + + currsize += field.intsize + + # compensate length + if (self.maxsize - currsize) > 0: + ret += self.indent_out('ptvcursor_advance(cursor, %d);\n' %(self.maxsize - currsize)) + + self.decr_indent() + + # close block + ret += self.indent_out('}') + ifblock = ' else if' + else: + ret += '/* ERROR %s, missing lookup_guide */' %field.dissect() + ret += '\n' + + return ret + + class TreeBuilder(xml.sax.handler.ContentHandler): + def __init__(self): + self.stack = [] + self.root = DataNode() + self.previous = self.root + self.current = self.root + self.basemessage = None + self.text_parts = [] + def startElement(self, name, attrs): + objecttype = {"message": Message(), "fields": Fields(), "enum" : Enum(), "bitfield" : BitField(), "struct": Struct(), "union": Union(), "integer": Integer(), "string": String(), "ether": Ether(), "ip": Ip(), "ipv4or6": Ipv4or6(), "xml": XML()} + self.previous = self.current + self.stack.append((self.current, self.text_parts)) + if name in objecttype.keys(): + self.current = objecttype[name] + else: + self.current = DataNode() + if name == "message": + self.basemessage = self.current + self.text_parts = [] + #self.children = [] + self.current.parent = self.previous + self.current.basemessage = self.basemessage + # xml attributes --> python attributes + for k, v in attrs.items(): + self.current._add_xml_attr(_name_mangle(k), v) + + def endElement(self, name): + text = ''.join(self.text_parts).strip() + if text: + self.current.data = text + if self.current._attrs: + obj = self.current + else: + # a text only node is simply represented by the string + obj = text or '' + self.current, self.text_parts = self.stack.pop() + self.current._add_xml_attr(_name_mangle(name), obj) + self.current._add_child(_name_mangle(name), obj) + def characters(self, content): + self.text_parts.append(content) + + builder = TreeBuilder() + xml.sax.parse(src, builder) + return builder.root._attrs.values()[0] + +# skinny = xml2obj('SkinnyProtocolOptimized.xml') +# for message in skinny.message: +# print '%s' %message.dissect() + +#if __name__ == '__main__': +# import timeit +# print(timeit.timeit("generateMessageDissectors()", setup="from __main__ import generateMessageDissectors")) + + +#skinny = xml2obj('SkinnyProtocolOptimized.xml') +#for message in skinny.message: +# message.dissect() + +#for key,value in fieldsArray.items(): +# print "%s : %s" %(key,value) +#print '%r\n' %fieldsArray + +#skinny = xml2obj('SkinnyProtocolOptimized.xml') +#for message in skinny.message: +# print message.declaration()