Chan_SCCP-[4.0.1_STABLE]
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
sccp_protocol.h
Go to the documentation of this file.
1 
2 /*!
3  * \file sccp_protocol.h
4  * \brief SCCP Protocol Header
5  * \author Sergio Chersovani <mlists [at] c-net.it>
6  * \note Reworked, but based on chan_sccp code.
7  * The original chan_sccp driver that was made by Zozo which itself was derived from the chan_skinny driver.
8  * Modified by Jan Czmok and Julien Goodwin
9  * \note This program is free software and may be modified and distributed under the terms of the GNU Public License.
10  * See the LICENSE file at the top of the source tree.
11  *
12  * \note Thank you Federico Santulli for SPCP support
13  *
14  * $Date: 2012-01-02 14:56:08 +0100 (Mon, 02 Jan 2012) $
15  * $Revision: 3147 $
16  */
17 
18 # ifndef __SCCP_PROTOCOL_H
19 #define __SCCP_PROTOCOL_H
20 
21 #include "sccp_labels.h"
22 
23 #define SCCP_DRIVER_SUPPORTED_PROTOCOL_LOW 3 /*!< At least we require protocol V.3 */
24 #define SCCP_DRIVER_SUPPORTED_PROTOCOL_HIGH 20 /*!< We support up to protocol V.17 */
25 
26 #define SCCP_PROTOCOL 0
27 #define SPCP_PROTOCOL 1
28 
29 #define DEFAULT_SCCP_PORT 2000 /*!< SCCP uses port 2000. */
30 #define DEFAULT_SCCP_SECURE_PORT 2443 /*!< SCCP secure port 2443. */
31 #define DEFAULT_SCCP_BACKLOG 2 /*!< the listen baklog. */
32 #define SCCP_MAX_AUTOLOGIN 100 /*!< Maximum allowed of autologins per device */
33 #define SCCP_KEEPALIVE 5 /*!< Default keepalive time if not specified in sccp.conf. */
34 
35 #define SKINNY_PHONE_FEATURES_PROTOCOLVERSION 0xFF
36 #define SKINNY_PHONE_FEATURES_ABBRDIAL 1<<31
37 #define SKINNY_PHONE_FEATURES_DYNAMIC_MESSAGES 1<<24
38 
39 /*!
40  * \brief Skinny Device Feature (ENUM)
41  */
42 typedef enum {
45 } skinny_devfeature_t; /*!< Skinny Device Feature Enum */
46 
47 /*!
48  * \brief internal chan_sccp call state (c->callstate) (Enum)
49  */
50 typedef enum {
77 } sccp_channelState_t; /*!< internal Chan_SCCP Call State c->callstate */
78 
79 /*!
80  * \brief SCCP ChannelState Structure
81  */
82 static const struct sccp_channelstate {
84  const char *const text;
85 } sccp_channelstates[] = {
86  /* *INDENT-OFF* */
87  {SCCP_CHANNELSTATE_DOWN, "DOWN"},
88  {SCCP_CHANNELSTATE_OFFHOOK, "OFFHOOK"},
89  {SCCP_CHANNELSTATE_ONHOOK, "ONHOOK"},
90  {SCCP_CHANNELSTATE_RINGOUT, "RINGOUT"},
91  {SCCP_CHANNELSTATE_RINGING, "RINGING"},
92  {SCCP_CHANNELSTATE_CONNECTED, "CONNECTED"},
93  {SCCP_CHANNELSTATE_BUSY, "BUSY "},
94  {SCCP_CHANNELSTATE_CONGESTION, "CONGESTION"},
95  {SCCP_CHANNELSTATE_HOLD, "HOLD "},
96  {SCCP_CHANNELSTATE_CALLWAITING, "CALLWAITING"},
97  {SCCP_CHANNELSTATE_CALLTRANSFER, "CALLTRANSFER"},
98  {SCCP_CHANNELSTATE_CALLPARK, "CALLPARK"},
99  {SCCP_CHANNELSTATE_PROCEED, "PROCEED"},
100  {SCCP_CHANNELSTATE_CALLREMOTEMULTILINE, "CALLREMOTEMULTILINE"},
101  {SCCP_CHANNELSTATE_INVALIDNUMBER, "INVALIDNUMBER"},
102  {SCCP_CHANNELSTATE_DIALING, "DIALING"},
103  {SCCP_CHANNELSTATE_PROGRESS, "PROGRESS"},
104  {SCCP_CHANNELSTATE_GETDIGITS, "GETDIGITS"},
105  {SCCP_CHANNELSTATE_CALLCONFERENCE, "CALLCONFERENCE"},
106  {SCCP_CHANNELSTATE_SPEEDDIAL, "SPEEDDIAL"},
107  {SCCP_CHANNELSTATE_DIGITSFOLL, "DIGITSFOLL"},
108  {SCCP_CHANNELSTATE_INVALIDCONFERENCE, "INVALIDCONFERENCE"},
109  {SCCP_CHANNELSTATE_CONNECTEDCONFERENCE, "CONNECTEDCONFERENCE"},
110  {SCCP_CHANNELSTATE_BLINDTRANSFER, "BLINDTRANSFER"},
111  {SCCP_CHANNELSTATE_ZOMBIE, "ZOMBIE"},
112  {SCCP_CHANNELSTATE_DND, "DND"}
113  /* *INDENT-ON* */
114 };
115 
116 /*!
117  * \brief Skinny Miscellaneous Command Type (Enum)
118  */
119 typedef enum {
128 } sccp_miscCommandType_t; /*!< misccommand types */
129 
130 static const struct sccp_miscCommandType {
131  uint8_t id;
132  const char *const text;
134  {
135  0, "videoFreezePicture"}, {
136  1, "videoFastUpdatePicture"}, {
137  2, "videoFastUpdateGOB"}, {
138  3, "videoFastUpdateMB"}, {
139  4, "lostPicture"}, {
140  5, "lostPartialPicture"}, {
141  6, "recoveryReferencePicture"}, {
142  7, "temporalSpatialTradeOff"}, {
143  0, NULL}
144 };
145 
146 static const struct sccp_formatTypes {
147  uint8_t id;
148  const char *const text;
149 } skinny_formatTypes[] = {
150  {
151  0, ""}, {
152  1, "sqcif (128x96)"}, {
153  2, "qcif (176x144)"}, {
154  3, "cif (352x288)"}, {
155  4, "4cif (704x576)"}, {
156  5, "16cif (1408x1152)"}, {
157 6, "custom_base"},};
158 
159 /*!
160  * \brief SCCP BLF States for Dynamic Speeddials (ENUM)
161  */
162 typedef enum {
163  SCCP_BLF_STATUS_UNKNOWN = 0, /*!< unknown status - default */
164  SCCP_BLF_STATUS_IDLE = 1, /*!< not in use */
165  SCCP_BLF_STATUS_INUSE = 2, /*!< in use */
166  SCCP_BLF_STATUS_DND = 3, /*!< dnd */
167  SCCP_BLF_STATUS_ALERTING = 4 /*!< alerting */
168 } sccp_BFLState_t; /*!< blf states for dynamic speeddials */
169 
170 #define SCCP_CFWD_NONE 0
171 #define SCCP_CFWD_ALL 1
172 #define SCCP_CFWD_BUSY 2
173 #define SCCP_CFWD_NOANSWER 3
174 
175 /*!
176  * \brief SCCP CallForwardState Structure
177  */
178 static const struct sccp_callforwardstate {
180  const char *const text;
181  const char *const longtext;
183  /* *INDENT-OFF* */
184  {SCCP_CFWD_NONE, "None", "No Call Forward"},
185  {SCCP_CFWD_ALL, "All", "All Calls are forwarded"},
186  {SCCP_CFWD_BUSY, "Busy", "Call is forwarded when busy"},
187  {SCCP_CFWD_NOANSWER, "NoAnswer", "Call is forwarded when no-answer"},
188  /* *INDENT-ON* */
189 };
190 
191 /*
192  * SCCP/Skinny Lookup Types
193  */
194 #define SCCP_MESSAGE 0
195 #define SCCP_ACCESSORY 1
196 #define SCCP_ACCESSORY_STATE 2
197 #define SCCP_EXTENSION_STATE 3
198 #define SCCP_DNDMODE 4
199 #define SKINNY_TONE 5
200 #define SKINNY_ALARM 6
201 #define SKINNY_DEVICETYPE 7
202 #define SKINNY_DEVICE_RS 8
203 #define SKINNY_STIMULUS 9
204 #define SKINNY_BUTTONTYPE 10
205 #define SKINNY_LAMPMODE 11
206 #define SKINNY_STATION 12
207 #define SKINNY_LBL 13
208 #define SKINNY_CALLTYPE 14
209 #define SKINNY_KEYMODE 15
210 #define SKINNY_DEVICE_STATE 16
211 #define SKINNY_CODEC 17
212 
213 /*!
214  * \brief Skinny Protocol Call States (ENUM)
215  */
216 typedef enum {
235 
236 /*!
237  * \brief Skinny Protocol Call Type (ENUM)
238  */
239 typedef enum {
243 } skinny_calltype_t; /*!< Skinny Calltype */
244 
245 /*!
246  * \brief Skinny CallType Structure
247  */
248 static const struct skinny_calltype {
250  const char *const text;
251 } skinny_calltypes[] = {
252  /* *INDENT-OFF* */
253  {SKINNY_CALLTYPE_INBOUND, "Inbound"},
254  {SKINNY_CALLTYPE_OUTBOUND, "Outbound"},
255  {SKINNY_CALLTYPE_FORWARD, "Forward"},
256  /* *INDENT-ON* */
257 };
258 
259 /*!
260  * \brief Skinny Device Feature Structure
261  */
262 static const struct skinny_devfeature {
264  const char *const text;
265 } skinny_devfeatures[] = {
266  /* *INDENT-OFF* */
267  {SKINNY_DEVFEATURE_DYNAMIC_MESSAGE, "Dynamic Messages"},
268  {SKINNY_DEVFEATURE_ABBREVIATED_DIAL, "Abbreviated Dial"},
269  /* *INDENT-ON* */
270 };
271 
272 /*!
273  * \brief Skinny Call Priority (ENUM)
274  */
275 typedef enum {
281 } skinny_callPriority_t; /*!< Skinny Call Priority */
282 
283 /*!
284  * \brief Skinny Call Visibility (ENUM)
285  */
286 typedef enum {
290 } skinny_callinfo_visibility_t; /*!< Skinny Call Info Visibility */
291 
292 /*!
293  * \brief Skinny Call Security (ENUM)
294  */
295 typedef enum {
299 } skinny_callstate_security_t; /*!< Skinny CallSecurityInfo */
300 
301 #define StationMaxDeviceNameSize 16
302 #define StationMaxButtonTemplateSize 56
303 #define StationMaxButtonTemplateNameSize 44
304 #define StationDateTemplateSize 6
305 //#define StationMaxDisplayTextSize 33
306 #define StationMaxDisplayTextSize 32
307 #define StationMaxDisplayNotifySize 32
308 #define StationMaxDirnumSize 24
309 #define StationMaxNameSize 40
310 #define StationMaxSoftKeyDefinition 32
311 #define StationMaxSoftKeySetDefinition 16
312 #define StationMaxSoftKeyIndex 16
313 #define StationMaxSoftKeyLabelSize 16
314 #define StationMaxVersionSize 16
315 #define StationMaxServers 5
316 #define ServerMaxNameSize 48
317 #define StationMaxServiceURLSize 256
318 #define StationMaxPorts 16
319 #define StationMaxXMLMessage 2048
320 
321 #define APPID_CONFERENCE 1
322 #define APPID_PROVISION 2
323 
324 /* skinny tones skinny_tone2str */
325 #define SKINNY_TONE_SILENCE 0
326 #define SKINNY_TONE_DTMF1 1
327 #define SKINNY_TONE_DTMF2 2
328 #define SKINNY_TONE_DTMF3 3
329 #define SKINNY_TONE_DTMF4 4
330 #define SKINNY_TONE_DTMF5 5
331 #define SKINNY_TONE_DTMF6 6
332 #define SKINNY_TONE_DTMF7 7
333 #define SKINNY_TONE_DTMF8 8
334 #define SKINNY_TONE_DTMF9 9
335 #define SKINNY_TONE_DTMF0 0xa
336 #define SKINNY_TONE_DTMFSTAR 0xe
337 #define SKINNY_TONE_DTMFPOUND 0xf
338 #define SKINNY_TONE_DTMFA 0x10
339 #define SKINNY_TONE_DTMFB 0x11
340 #define SKINNY_TONE_DTMFC 0x12
341 #define SKINNY_TONE_DTMFD 0x13
342 #define SKINNY_TONE_INSIDEDIALTONE 0x21
343 #define SKINNY_TONE_OUTSIDEDIALTONE 0x22
344 #define SKINNY_TONE_LINEBUSYTONE 0x23
345 #define SKINNY_TONE_ALERTINGTONE 0x24
346 #define SKINNY_TONE_REORDERTONE 0x25
347 #define SKINNY_TONE_RECORDERWARNINGTONE 0x26
348 #define SKINNY_TONE_RECORDERDETECTEDTONE 0x27
349 #define SKINNY_TONE_REVERTINGTONE 0x28
350 #define SKINNY_TONE_RECEIVEROFFHOOKTONE 0x29
351 #define SKINNY_TONE_PARTIALDIALTONE 0x2a
352 #define SKINNY_TONE_NOSUCHNUMBERTONE 0x2b
353 #define SKINNY_TONE_BUSYVERIFICATIONTONE 0x2c
354 #define SKINNY_TONE_CALLWAITINGTONE 0x2d
355 #define SKINNY_TONE_CONFIRMATIONTONE 0x2e
356 #define SKINNY_TONE_CAMPONINDICATIONTONE 0x2f
357 #define SKINNY_TONE_RECALLDIALTONE 0x30
358 #define SKINNY_TONE_ZIPZIP 0x31
359 #define SKINNY_TONE_ZIP 0x32
360 #define SKINNY_TONE_BEEPBONK 0x33
361 #define SKINNY_TONE_MUSICTONE 0x34
362 #define SKINNY_TONE_HOLDTONE 0x35
363 #define SKINNY_TONE_TESTTONE 0x36
364 #define SKINNY_TONE_DTMONITORWARNINGTONE 0x37
365 #define SKINNY_TONE_ADDCALLWAITING 0x40
366 #define SKINNY_TONE_PRIORITYCALLWAIT 0x41
367 #define SKINNY_TONE_RECALLDIAL 0x42
368 #define SKINNY_TONE_BARGIN 0x43
369 #define SKINNY_TONE_DISTINCTALERT 0x44
370 #define SKINNY_TONE_PRIORITYALERT 0x45
371 #define SKINNY_TONE_REMINDERRING 0x46
372 #define SKINNY_TONE_PRECEDENCE_RINGBACK 0x47
373 #define SKINNY_TONE_PREEMPTIONTONE 0x48
374 #define SKINNY_TONE_MF1 0x50
375 #define SKINNY_TONE_MF2 0x51
376 #define SKINNY_TONE_MF3 0x52
377 #define SKINNY_TONE_MF4 0x53
378 #define SKINNY_TONE_MF5 0x54
379 #define SKINNY_TONE_MF6 0x55
380 #define SKINNY_TONE_MF7 0x56
381 #define SKINNY_TONE_MF8 0x57
382 #define SKINNY_TONE_MF9 0x58
383 #define SKINNY_TONE_MF0 0x59
384 #define SKINNY_TONE_MFKP1 0x5a
385 #define SKINNY_TONE_MFST 0x5b
386 #define SKINNY_TONE_MFKP2 0x5c
387 #define SKINNY_TONE_MFSTP 0x5d
388 #define SKINNY_TONE_MFST3P 0x5e
389 #define SKINNY_TONE_MILLIWATT 0x5f
390 #define SKINNY_TONE_MILLIWATTTEST 0x60
391 #define SKINNY_TONE_HIGHTONE 0x61
392 #define SKINNY_TONE_FLASHOVERRIDE 0x62
393 #define SKINNY_TONE_FLASH 0x63
394 #define SKINNY_TONE_PRIORITY 0x64
395 #define SKINNY_TONE_IMMEDIATE 0x65
396 #define SKINNY_TONE_PREAMPWARN 0x66
397 #define SKINNY_TONE_2105HZ 0x67
398 #define SKINNY_TONE_2600HZ 0x68
399 #define SKINNY_TONE_440HZ 0x69
400 #define SKINNY_TONE_300HZ 0x6a
401 #define SKINNY_TONE_MLPP_PALA 0x77
402 #define SKINNY_TONE_MLPP_ICA 0x78
403 #define SKINNY_TONE_MLPP_VCA 0x79
404 #define SKINNY_TONE_MLPP_BPA 0x7A
405 #define SKINNY_TONE_MLPP_BNEA 0x7B
406 #define SKINNY_TONE_MLPP_UPA 0x7C
407 #define SKINNY_TONE_NOTONE 0x7f
408 
409 /*!
410  * \brief Skinny Tone Structure
411  */
412 static const struct skinny_tone {
413  uint8_t tone;
414  const char *const text;
415 } skinny_tones[] = {
416  /* *INDENT-OFF* */
417  {SKINNY_TONE_SILENCE, "Silence"},
418  {SKINNY_TONE_DTMF1, "DTMF 1"},
419  {SKINNY_TONE_DTMF2, "DTMF 2"},
420  {SKINNY_TONE_DTMF3, "DTMF 3"},
421  {SKINNY_TONE_DTMF4, "DTMF 4"},
422  {SKINNY_TONE_DTMF5, "DTMF 5"},
423  {SKINNY_TONE_DTMF6, "DTMF 6"},
424  {SKINNY_TONE_DTMF7, "DTMF 7"},
425  {SKINNY_TONE_DTMF8, "DTMF 8"},
426  {SKINNY_TONE_DTMF9, "DTMF 9"},
427  {SKINNY_TONE_DTMF0, "DTMF 0"},
428  {SKINNY_TONE_DTMFSTAR, "DTMF Star"},
429  {SKINNY_TONE_DTMFPOUND, "DTMF Pound"},
430  {SKINNY_TONE_DTMFA, "DTMF A"},
431  {SKINNY_TONE_DTMFB, "DTMF B"},
432  {SKINNY_TONE_DTMFC, "DTMF C"},
433  {SKINNY_TONE_DTMFD, "DTMF D"},
434  {SKINNY_TONE_INSIDEDIALTONE, "Inside Dial Tone"},
435  {SKINNY_TONE_OUTSIDEDIALTONE, "Outside Dial Tone"},
436  {SKINNY_TONE_LINEBUSYTONE, "Line Busy Tone"},
437  {SKINNY_TONE_ALERTINGTONE, "Alerting Tone"},
438  {SKINNY_TONE_REORDERTONE, "Reorder Tone"},
439  {SKINNY_TONE_RECORDERWARNINGTONE, "Recorder Warning Tone"},
440  {SKINNY_TONE_RECORDERDETECTEDTONE, "Recorder Detected Tone"},
441  {SKINNY_TONE_REVERTINGTONE, "Reverting Tone"},
442  {SKINNY_TONE_RECEIVEROFFHOOKTONE, "Receiver OffHook Tone"},
443  {SKINNY_TONE_PARTIALDIALTONE, "Partial Dial Tone"},
444  {SKINNY_TONE_NOSUCHNUMBERTONE, "No Such Number Tone"},
445  {SKINNY_TONE_BUSYVERIFICATIONTONE, "Busy Verification Tone"},
446  {SKINNY_TONE_CALLWAITINGTONE, "Call Waiting Tone"},
447  {SKINNY_TONE_CONFIRMATIONTONE, "Confirmation Tone"},
448  {SKINNY_TONE_CAMPONINDICATIONTONE, "Camp On Indication Tone"},
449  {SKINNY_TONE_RECALLDIALTONE, "Recall Dial Tone"},
450  {SKINNY_TONE_ZIPZIP, "Zip Zip"},
451  {SKINNY_TONE_ZIP, "Zip"},
452  {SKINNY_TONE_BEEPBONK, "Beep Bonk"},
453  {SKINNY_TONE_MUSICTONE, "Music Tone"},
454  {SKINNY_TONE_HOLDTONE, "Hold Tone"},
455  {SKINNY_TONE_TESTTONE, "Test Tone"},
456  {SKINNY_TONE_DTMONITORWARNINGTONE, "DT Monitor Warning Tone"},
457  {SKINNY_TONE_ADDCALLWAITING, "Add Call Waiting"},
458  {SKINNY_TONE_PRIORITYCALLWAIT, "Priority Call Wait"},
459  {SKINNY_TONE_RECALLDIAL, "Recall Dial"},
460  {SKINNY_TONE_BARGIN, "Barg In"},
461  {SKINNY_TONE_DISTINCTALERT, "Distinct Alert"},
462  {SKINNY_TONE_PRIORITYALERT, "Priority Alert"},
463  {SKINNY_TONE_REMINDERRING, "Reminder Ring"},
464  {SKINNY_TONE_PRECEDENCE_RINGBACK, "Precedence RingBank"},
465  {SKINNY_TONE_PREEMPTIONTONE, "Pre-EmptionTone"},
466  {SKINNY_TONE_MF1, "MF1"},
467  {SKINNY_TONE_MF2, "MF2"},
468  {SKINNY_TONE_MF3, "MF3"},
469  {SKINNY_TONE_MF4, "MF4"},
470  {SKINNY_TONE_MF5, "MF5"},
471  {SKINNY_TONE_MF6, "MF6"},
472  {SKINNY_TONE_MF7, "MF7"},
473  {SKINNY_TONE_MF8, "MF8"},
474  {SKINNY_TONE_MF9, "MF9"},
475  {SKINNY_TONE_MF0, "MF0"},
476  {SKINNY_TONE_MFKP1, "MFKP1"},
477  {SKINNY_TONE_MFST, "MFST"},
478  {SKINNY_TONE_MFKP2, "MFKP2"},
479  {SKINNY_TONE_MFSTP, "MFSTP"},
480  {SKINNY_TONE_MFST3P, "MFST3P"},
481  {SKINNY_TONE_MILLIWATT, "MILLIWATT"},
482  {SKINNY_TONE_MILLIWATTTEST, "MILLIWATT TEST"},
483  {SKINNY_TONE_HIGHTONE, "HIGH TONE"},
484  {SKINNY_TONE_FLASHOVERRIDE, "FLASH OVERRIDE"},
485  {SKINNY_TONE_FLASH, "FLASH"},
486  {SKINNY_TONE_PRIORITY, "PRIORITY"},
487  {SKINNY_TONE_IMMEDIATE, "IMMEDIATE"},
488  {SKINNY_TONE_PREAMPWARN, "PRE-AMP WARN"},
489  {SKINNY_TONE_2105HZ, "2105 HZ"},
490  {SKINNY_TONE_2600HZ, "2600 HZ"},
491  {SKINNY_TONE_440HZ, "440 HZ"},
492  {SKINNY_TONE_300HZ, "300 HZ"},
493  {SKINNY_TONE_MLPP_PALA, "MLPP Pala"},
494  {SKINNY_TONE_MLPP_ICA, "MLPP Ica"},
495  {SKINNY_TONE_MLPP_VCA, "MLPP Vca"},
496  {SKINNY_TONE_MLPP_BPA, "MLPP Bpa"},
497  {SKINNY_TONE_MLPP_BNEA, "MLPP Bnea"},
498  {SKINNY_TONE_MLPP_UPA, "MLPP Upa"},
499  {SKINNY_TONE_NOTONE, "No Tone"},
500  /* *INDENT-ON* */
501 };
502 
503 /* alarm skinny_alarm2str*/
504 #define SKINNY_ALARM_CRITICAL 0
505 #define SKINNY_ALARM_WARNING 1
506 #define SKINNY_ALARM_INFORMATIONAL 2
507 #define SKINNY_ALARM_UNKNOWN 4
508 #define SKINNY_ALARM_MAJOR 7
509 #define SKINNY_ALARM_MINOR 8
510 #define SKINNY_ALARM_MARGINAL 10
511 #define SKINNY_ALARM_TRACEINFO 20
512 
513 /*!
514  * \brief Skinny Alarm Structure
515  */
516 static const struct skinny_alarm {
517  uint8_t alarm;
518  const char *const text;
519 } skinny_alarms[] = {
520  /* *INDENT-OFF* */
521  {SKINNY_ALARM_CRITICAL, "Critical"},
522  {SKINNY_ALARM_WARNING, "Warning"},
523  {SKINNY_ALARM_INFORMATIONAL, "Informational"},
524  {SKINNY_ALARM_UNKNOWN, "Unknown"},
525  {SKINNY_ALARM_MAJOR, "Major"},
526  {SKINNY_ALARM_MINOR, "Minor"},
527  {SKINNY_ALARM_MARGINAL, "Marginal"},
528  {SKINNY_ALARM_TRACEINFO, "TraceInfo"},
529  /* *INDENT-ON* */
530 };
531 
532 /* devices type */
533 #define SKINNY_DEVICETYPE_UNDEFINED 0
534 #define SKINNY_DEVICETYPE_30SPPLUS 1
535 #define SKINNY_DEVICETYPE_12SPPLUS 2
536 #define SKINNY_DEVICETYPE_12SP 3
537 #define SKINNY_DEVICETYPE_12 4
538 #define SKINNY_DEVICETYPE_30VIP 5
539 //#define SKINNY_DEVICETYPE_TELECASTER 6
540 //#define SKINNY_DEVICETYPE_TELECASTER_MGR 7
541 //#define SKINNY_DEVICETYPE_TELECASTER_BUS 8
542 //#define SKINNY_DEVICETYPE_POLYCOM 9
543 #define SKINNY_DEVICETYPE_VGC 10
544 #define SKINNY_DEVICETYPE_ATA186 12
545 #define SKINNY_DEVICETYPE_ATA188 12 /*!< ATA188 -FS */
546 #define SKINNY_DEVICETYPE_VIRTUAL30SPPLUS 20
547 #define SKINNY_DEVICETYPE_PHONEAPPLICATION 21
548 #define SKINNY_DEVICETYPE_ANALOGACCESS 30
549 #define SKINNY_DEVICETYPE_DIGITALACCESSPRI 40
550 #define SKINNY_DEVICETYPE_DIGITALACCESST1 41
551 #define SKINNY_DEVICETYPE_DIGITALACCESSTITAN2 42
552 #define SKINNY_DEVICETYPE_DIGITALACCESSLENNON 43
553 #define SKINNY_DEVICETYPE_ANALOGACCESSELVIS 47
554 #define SKINNY_DEVICETYPE_CONFERENCEBRIDGE 50
555 #define SKINNY_DEVICETYPE_CONFERENCEBRIDGEYOKO 51
556 #define SKINNY_DEVICETYPE_CONFERENCEBRIDGEDIXIELAND 52
557 #define SKINNY_DEVICETYPE_CONFERENCEBRIDGESUMMIT 53
558 #define SKINNY_DEVICETYPE_H225 60
559 #define SKINNY_DEVICETYPE_H323PHONE 61
560 #define SKINNY_DEVICETYPE_H323TRUNK 62
561 #define SKINNY_DEVICETYPE_MUSICONHOLD 70
562 #define SKINNY_DEVICETYPE_PILOT 71
563 #define SKINNY_DEVICETYPE_TAPIPORT 72
564 #define SKINNY_DEVICETYPE_TAPIROUTEPOINT 73
565 #define SKINNY_DEVICETYPE_VOICEINBOX 80
566 #define SKINNY_DEVICETYPE_VOICEINBOXADMIN 81
567 #define SKINNY_DEVICETYPE_LINEANNUNCIATOR 82
568 #define SKINNY_DEVICETYPE_SOFTWAREMTPDIXIELAND 83
569 #define SKINNY_DEVICETYPE_CISCOMEDIASERVER 84
570 #define SKINNY_DEVICETYPE_CONFERENCEBRIDGEFLINT 85
571 #define SKINNY_DEVICETYPE_ROUTELIST 90
572 #define SKINNY_DEVICETYPE_LOADSIMULATOR 100
573 #define SKINNY_DEVICETYPE_MEDIA_TERM_POINT 110
574 #define SKINNY_DEVICETYPE_MEDIA_TERM_POINTYOKO 111
575 #define SKINNY_DEVICETYPE_MEDIA_TERM_POINTDIXIELAND 112
576 #define SKINNY_DEVICETYPE_MEDIA_TERM_POINTSUMMIT 113
577 #define SKINNY_DEVICETYPE_MGCPSTATION 120
578 #define SKINNY_DEVICETYPE_MGCPTRUNK 121
579 #define SKINNY_DEVICETYPE_RASPROXY 122
580 #define SKINNY_DEVICETYPE_TRUNK 125
581 #define SKINNY_DEVICETYPE_ANNUNCIATOR 126
582 #define SKINNY_DEVICETYPE_MONITORBRIDGE 127
583 #define SKINNY_DEVICETYPE_RECORDER 128
584 #define SKINNY_DEVICETYPE_MONITORBRIDGEYOKO 129
585 #define SKINNY_DEVICETYPE_SIPTRUNK 131
586 #define SKINNY_DEVICETYPE_NOTDEFINED 255
587 #define SKINNY_DEVICETYPE_CISCO7902 30008
588 #define SKINNY_DEVICETYPE_CISCO7905 20000
589 #define SKINNY_DEVICETYPE_CISCO7906 369 /*!< 7906 -FS */
590 #define SKINNY_DEVICETYPE_CISCO7910 6 /*!< 7910 */
591 #define SKINNY_DEVICETYPE_CISCO7911 307
592 #define SKINNY_DEVICETYPE_CISCO7912 30007
593 #define SKINNY_DEVICETYPE_CISCO7920 30002
594 #define SKINNY_DEVICETYPE_CISCO7921 365
595 #define SKINNY_DEVICETYPE_CISCO7925 484 /*!< 7925 -FS */
596 #define SKINNY_DEVICETYPE_CISCO7931 348
597 #define SKINNY_DEVICETYPE_CISCO7935 9
598 #define SKINNY_DEVICETYPE_CISCO7936 30019
599 #define SKINNY_DEVICETYPE_CISCO7937 431
600 #define SKINNY_DEVICETYPE_CISCO7940 8 /*!< 7940 */
601 #define SKINNY_DEVICETYPE_CISCO7941 115
602 #define SKINNY_DEVICETYPE_CISCO7941GE 309
603 #define SKINNY_DEVICETYPE_CISCO7942 434
604 #define SKINNY_DEVICETYPE_CISCO7945 435
605 #define SKINNY_DEVICETYPE_CISCO7960 7 /*!< 7960 */
606 #define SKINNY_DEVICETYPE_CISCO7961 30018
607 #define SKINNY_DEVICETYPE_CISCO7961GE 308
608 #define SKINNY_DEVICETYPE_CISCO7962 404
609 #define SKINNY_DEVICETYPE_CISCO7965 436
610 #define SKINNY_DEVICETYPE_CISCO7970 30006
611 #define SKINNY_DEVICETYPE_CISCO7971 119
612 #define SKINNY_DEVICETYPE_CISCO7975 437
613 #define SKINNY_DEVICETYPE_CISCO7985 302
614 #define SKINNY_DEVICETYPE_NOKIA_E_SERIES 275 /*!< Nokia S60 */
615 #define SKINNY_DEVICETYPE_CISCO_IP_COMMUNICATOR 30016
616 #define SKINNY_DEVICETYPE_GATEWAY_AN 30027 /*!< Analog gateway */
617 #define SKINNY_DEVICETYPE_GATEWAY_BRI 30028 /*!< BRI gateway */
618 #define SKINNY_DEVICETYPE_NOKIA_ICC 376 /*!< nokia icc client V2 */
619 #define SKINNY_DEVICETYPE_CISCO6901 547
620 #define SKINNY_DEVICETYPE_CISCO6911 548
621 #define SKINNY_DEVICETYPE_CISCO6921 495
622 #define SKINNY_DEVICETYPE_CISCO6941 496
623 #define SKINNY_DEVICETYPE_CISCO6945 564
624 #define SKINNY_DEVICETYPE_CISCO6961 497
625 #define SKINNY_DEVICETYPE_CISCO8941 586
626 #define SKINNY_DEVICETYPE_CISCO8945 585
627 #define SKINNY_DEVICETYPE_CISCO8961 540
628 
629 /* SPA Devices */
630 #define SKINNY_DEVICETYPE_SPA_521S 80000 /*!< SPA 521G */
631 #define SKINNY_DEVICETYPE_SPA_525G 80005 /*!< SPA 525G */
632 #define SKINNY_DEVICETYPE_SPA_525G2 80009 /*!< SPA 525G2 */
633 
634 /* Extension Modules */
635 #define SKINNY_DEVICETYPE_CISCO7914 124 /*!< Expansion module */
636 #define SKINNY_DEVICETYPE_CISCO7915_12BUTTONS 227 /*!< 7915 12-Button Line Expansion Module */
637 #define SKINNY_DEVICETYPE_CISCO7915 228 /*!< 7915 24-Button Line Expansion Module */
638 #define SKINNY_DEVICETYPE_CISCO7916_12BUTTONS 229 /*!< 7916 12-Button Line Expansion Module */
639 #define SKINNY_DEVICETYPE_CISCO7916 230 /*!< 7916 24-Button Line Expansion Module */
640 
641 /*!
642  * \brief Skinny DeviceType Structure
643  */
644 static const struct skinny_devicetype {
645  uint32_t devicetype;
646  const char *const text;
647 } skinny_devicetypes[] = {
648  /* *INDENT-OFF* */
649  {SKINNY_DEVICETYPE_UNDEFINED, "Undefined: Maybe you forgot the devicetype in your config"},
650  {SKINNY_DEVICETYPE_30SPPLUS, "30SP plus"},
651  {SKINNY_DEVICETYPE_12SPPLUS, "12SP plus"},
652  {SKINNY_DEVICETYPE_12SP, "12SP"},
653  {SKINNY_DEVICETYPE_12, "12"},
654  {SKINNY_DEVICETYPE_30VIP, "30 VIP"},
655 // { SKINNY_DEVICETYPE_TELECASTER , "Telecaster" },
656 // { SKINNY_DEVICETYPE_TELECASTER_MGR , "Telecaster Manager" },
657 // { SKINNY_DEVICETYPE_TELECASTER_BUS , "Telecaster Bus" },
658 // { SKINNY_DEVICETYPE_POLYCOM , "Polycom" },
659  {SKINNY_DEVICETYPE_VGC, "VGC"},
660  {SKINNY_DEVICETYPE_ATA186, "Cisco Ata 186"},
661  {SKINNY_DEVICETYPE_ATA188, "Cisco Ata 188"},
662  {SKINNY_DEVICETYPE_CISCO7910, "Cisco 7910"},
663  {SKINNY_DEVICETYPE_CISCO7960, "Cisco 7960"},
664  {SKINNY_DEVICETYPE_CISCO7940, "Cisco 7940"},
665  {SKINNY_DEVICETYPE_VIRTUAL30SPPLUS, "Virtual 30SP plus"},
666  {SKINNY_DEVICETYPE_PHONEAPPLICATION, "Phone Application"},
667  {SKINNY_DEVICETYPE_ANALOGACCESS, "Analog Access"},
668  {SKINNY_DEVICETYPE_DIGITALACCESSPRI, "Digital Access PRI"},
669  {SKINNY_DEVICETYPE_DIGITALACCESST1, "Digital Access T1"},
670  {SKINNY_DEVICETYPE_DIGITALACCESSTITAN2, "Digital Access Titan2"},
671  {SKINNY_DEVICETYPE_ANALOGACCESSELVIS, "Analog Access Elvis"},
672  {SKINNY_DEVICETYPE_DIGITALACCESSLENNON, "Digital Access Lennon"},
673  {SKINNY_DEVICETYPE_CONFERENCEBRIDGE, "Conference Bridge"},
674  {SKINNY_DEVICETYPE_CONFERENCEBRIDGEYOKO, "Conference Bridge Yoko"},
675  {SKINNY_DEVICETYPE_CONFERENCEBRIDGEDIXIELAND, "Conference Bridge Dixieland"},
676  {SKINNY_DEVICETYPE_CONFERENCEBRIDGESUMMIT, "Conference Bridge Summit"},
677  {SKINNY_DEVICETYPE_H225, "H225"},
678  {SKINNY_DEVICETYPE_H323PHONE, "H323 Phone"},
679  {SKINNY_DEVICETYPE_H323TRUNK, "H323 Trunk"},
680  {SKINNY_DEVICETYPE_MUSICONHOLD, "Music On Hold"},
681  {SKINNY_DEVICETYPE_PILOT, "Pilot"},
682  {SKINNY_DEVICETYPE_TAPIPORT, "Tapi Port"},
683  {SKINNY_DEVICETYPE_TAPIROUTEPOINT, "Tapi Route Point"},
684  {SKINNY_DEVICETYPE_VOICEINBOX, "Voice In Box"},
685  {SKINNY_DEVICETYPE_VOICEINBOXADMIN, "Voice Inbox Admin"},
686  {SKINNY_DEVICETYPE_LINEANNUNCIATOR, "Line Annunciator"},
687  {SKINNY_DEVICETYPE_ROUTELIST, "Route List"},
688  {SKINNY_DEVICETYPE_LOADSIMULATOR, "Load Simulator"},
689  {SKINNY_DEVICETYPE_MEDIA_TERM_POINT, "Media Termination Point"},
690  {SKINNY_DEVICETYPE_MEDIA_TERM_POINTYOKO, "Media Termination Point Yoko"},
691  {SKINNY_DEVICETYPE_MEDIA_TERM_POINTDIXIELAND, "Media Termination Point Dixieland"},
692  {SKINNY_DEVICETYPE_MEDIA_TERM_POINTSUMMIT, "Media Termination Point Summit"},
693  {SKINNY_DEVICETYPE_MGCPSTATION, "MGCP Station"},
694  {SKINNY_DEVICETYPE_MGCPTRUNK, "MGCP Trunk"},
695  {SKINNY_DEVICETYPE_RASPROXY, "RAS Proxy"},
696  {SKINNY_DEVICETYPE_TRUNK, "Trunk"},
697  {SKINNY_DEVICETYPE_ANNUNCIATOR, "Annuciator"},
698  {SKINNY_DEVICETYPE_MONITORBRIDGE, "Monitor Bridge"},
699  {SKINNY_DEVICETYPE_RECORDER, "Recorder"},
700  {SKINNY_DEVICETYPE_MONITORBRIDGEYOKO, "Monitor Bridge Yoko"},
701  {SKINNY_DEVICETYPE_SIPTRUNK, "Sip Trunk"},
702  {SKINNY_DEVICETYPE_NOTDEFINED, "Not Defined"},
703  {SKINNY_DEVICETYPE_CISCO7920, "Cisco 7920"},
704  {SKINNY_DEVICETYPE_CISCO7902, "Cisco 7902"},
705  {SKINNY_DEVICETYPE_CISCO7905, "Cisco 7905"},
706  {SKINNY_DEVICETYPE_CISCO7906, "Cisco 7906"},
707  {SKINNY_DEVICETYPE_CISCO7911, "Cisco 7911"},
708  {SKINNY_DEVICETYPE_CISCO7912, "Cisco 7912"},
709  {SKINNY_DEVICETYPE_CISCO7931, "Cisco 7931"},
710  {SKINNY_DEVICETYPE_CISCO7921, "Cisco 7921"},
711  {SKINNY_DEVICETYPE_CISCO7925, "Cisco 7925"},
712  {SKINNY_DEVICETYPE_CISCO7935, "Cisco 7935"},
713  {SKINNY_DEVICETYPE_CISCO7936, "Cisco 7936"},
714  {SKINNY_DEVICETYPE_CISCO7937, "Cisco 7937"},
715  {SKINNY_DEVICETYPE_CISCO_IP_COMMUNICATOR, "Cisco IP Communicator"},
716  {SKINNY_DEVICETYPE_CISCO7941, "Cisco 7941"},
717  {SKINNY_DEVICETYPE_CISCO7941GE, "Cisco 7941 GE"},
718  {SKINNY_DEVICETYPE_CISCO7942, "Cisco 7942"},
719  {SKINNY_DEVICETYPE_CISCO7945, "Cisco 7945"},
720  {SKINNY_DEVICETYPE_CISCO7961, "Cisco 7961"},
721  {SKINNY_DEVICETYPE_CISCO7961GE, "Cisco 7961 GE"},
722  {SKINNY_DEVICETYPE_CISCO7962, "Cisco 7962"},
723  {SKINNY_DEVICETYPE_CISCO7965, "Cisco 7965"},
724  {SKINNY_DEVICETYPE_CISCO7970, "Cisco 7970"},
725  {SKINNY_DEVICETYPE_CISCO7971, "Cisco 7971"},
726  {SKINNY_DEVICETYPE_CISCO7975, "Cisco 7975"},
727  {SKINNY_DEVICETYPE_CISCO7985, "Cisco 7985"},
728  {SKINNY_DEVICETYPE_NOKIA_ICC, "Nokia ICC client"},
729 
730  {SKINNY_DEVICETYPE_CISCO6901, "Cisco 6901"},
731  {SKINNY_DEVICETYPE_CISCO6911, "Cisco 6911"},
732  {SKINNY_DEVICETYPE_CISCO6921, "Cisco 6921"},
733  {SKINNY_DEVICETYPE_CISCO6941, "Cisco 6941"},
734  {SKINNY_DEVICETYPE_CISCO6945, "Cisco 6945"},
735  {SKINNY_DEVICETYPE_CISCO6961, "Cisco 6961"},
736 
737  /* Cisco 89XX */
738  {SKINNY_DEVICETYPE_CISCO8941, "Cisco 8941"},
739  {SKINNY_DEVICETYPE_CISCO8945, "Cisco 8945"},
740  {SKINNY_DEVICETYPE_CISCO8961, "Cisco 896"},
741 
742  /* SPA devices */
743  {SKINNY_DEVICETYPE_SPA_521S, "Cisco SPA 521S"},
744  {SKINNY_DEVICETYPE_SPA_525G, "Cisco SPA 525G"},
745  {SKINNY_DEVICETYPE_SPA_525G2, "Cisco SPA 525G2"},
746 
747  /* *INDENT-ON* */
748 };
749 
750 #define SKINNY_DEVICE_RS_NONE 0
751 #define SKINNY_DEVICE_RS_PROGRESS 1
752 #define SKINNY_DEVICE_RS_FAILED 2
753 #define SKINNY_DEVICE_RS_OK 3
754 #define SKINNY_DEVICE_RS_TIMEOUT 4
755 
756 /*!
757  * \brief Skinny Device RS Structure
758  */
759 static const struct skinny_device_registrationstate {
761  const char *const text;
763  /* *INDENT-OFF* */
764  {SKINNY_DEVICE_RS_NONE, "None"},
765  {SKINNY_DEVICE_RS_PROGRESS, "Progress"},
766  {SKINNY_DEVICE_RS_FAILED, "Failed"},
767  {SKINNY_DEVICE_RS_OK, "OK"},
768  {SKINNY_DEVICE_RS_TIMEOUT, "Time Out"},
769  /* *INDENT-ON* */
770 };
771 
772 /*!
773  * \brief SCCP Device State (ENUM)
774  */
775 typedef enum {
781 } sccp_devicestate_t; /*!< Internal Chan_SCCP Device State */
782 
783 /*!
784  * \brief Skinny Device State Structure
785  */
786 static const struct skinny_device_state {
788  const char *const text;
789 } skinny_device_states[] = {
790  /* *INDENT-OFF* */
791  {SCCP_DEVICESTATE_ONHOOK, "On Hook"},
792  {SCCP_DEVICESTATE_OFFHOOK, "Off Hook"},
793  {SCCP_DEVICESTATE_UNAVAILABLE, "Unavailable"},
794  {SCCP_DEVICESTATE_DND, "Do Not Disturb"},
795  {SCCP_DEVICESTATE_FWDALL, "Forward All"},
796  /* *INDENT-ON* */
797 };
798 
799 /* stimulus */
800 #define SKINNY_STIMULUS_LASTNUMBERREDIAL 1
801 #define SKINNY_STIMULUS_SPEEDDIAL 2
802 #define SKINNY_STIMULUS_HOLD 3
803 #define SKINNY_STIMULUS_TRANSFER 4
804 #define SKINNY_STIMULUS_FORWARDALL 5
805 #define SKINNY_STIMULUS_FORWARDBUSY 6
806 #define SKINNY_STIMULUS_FORWARDNOANSWER 7
807 #define SKINNY_STIMULUS_DISPLAY 8
808 #define SKINNY_STIMULUS_LINE 9
809 #define SKINNY_STIMULUS_T120CHAT 0xA
810 #define SKINNY_STIMULUS_T120WHITEBOARD 0xB
811 #define SKINNY_STIMULUS_T120APPLICATIONSHARING 0xC
812 #define SKINNY_STIMULUS_T120FILETRANSFER 0xD
813 #define SKINNY_STIMULUS_VIDEO 0xE
814 #define SKINNY_STIMULUS_VOICEMAIL 0xF
815 #define SKINNY_STIMULUS_AUTOANSWERRELEASE 0x10
816 #define SKINNY_STIMULUS_AUTOANSWER 0x11
817 #define SKINNY_STIMULUS_SELECT 0x12
818 #define SKINNY_STIMULUS_DEV_FEATURE 0x13
819 #define SKINNY_STIMULUS_SERVICEURL 0x14
820 #define SKINNY_STIMULUS_BLF 0x15
821 #define SKINNY_STIMULUS_MALICIOUSCALL 0x1B
822 #define SKINNY_STIMULUS_GENERICAPPB1 0x21
823 #define SKINNY_STIMULUS_GENERICAPPB2 0x22
824 #define SKINNY_STIMULUS_GENERICAPPB3 0x23
825 #define SKINNY_STIMULUS_GENERICAPPB4 0x24
826 #define SKINNY_STIMULUS_GENERICAPPB5 0x25
827 #define SKINNY_STIMULUS_MEETMECONFERENCE 0x7b
828 #define SKINNY_STIMULUS_CONFERENCE 0x7d
829 #define SKINNY_STIMULUS_CALLPARK 0x7e
830 #define SKINNY_STIMULUS_CALLPICKUP 0x7f
831 #define SKINNY_STIMULUS_GROUPCALLPICKUP 0x80
832 
833 /*!
834  * \brief Skinny Stimulus Structure
835  */
836 static const struct skinny_stimulus {
837  uint8_t stimulus;
838  const char *const text;
839 } skinny_stimuly[] = {
840  /* *INDENT-OFF* */
841  {SKINNY_STIMULUS_LASTNUMBERREDIAL, "Last Number Redial"},
842  {SKINNY_STIMULUS_SPEEDDIAL, "SpeedDial"},
843  {SKINNY_STIMULUS_HOLD, "Hold"},
844  {SKINNY_STIMULUS_TRANSFER, "Transfer"},
845  {SKINNY_STIMULUS_FORWARDALL, "Forward All"},
846  {SKINNY_STIMULUS_FORWARDBUSY, "Forward Busy"},
847  {SKINNY_STIMULUS_FORWARDNOANSWER, "Forward No Answer"},
848  {SKINNY_STIMULUS_DISPLAY, "Display"},
849  {SKINNY_STIMULUS_LINE, "Line"},
850  {SKINNY_STIMULUS_T120CHAT, "T120 Chat"},
851  {SKINNY_STIMULUS_T120WHITEBOARD, "T120 Whiteboard"},
852  {SKINNY_STIMULUS_T120APPLICATIONSHARING, "T120 Application Sharing"},
853  {SKINNY_STIMULUS_T120FILETRANSFER, "T120 File Transfer"},
854  {SKINNY_STIMULUS_VIDEO, "Video"},
855  {SKINNY_STIMULUS_VOICEMAIL, "VoiceMail"},
856  {SKINNY_STIMULUS_AUTOANSWERRELEASE, "Auto Answer Release"},
857  {SKINNY_STIMULUS_AUTOANSWER, "Auto Answer"},
858  {SKINNY_STIMULUS_SELECT, "Select"},
859  {SKINNY_STIMULUS_DEV_FEATURE, "DevFeature"},
860  {SKINNY_STIMULUS_SERVICEURL, "ServiceURL"},
861  {SKINNY_STIMULUS_BLF, "Busy Lamp Field"},
862  {SKINNY_STIMULUS_MALICIOUSCALL, "Malicious Call"},
863  {SKINNY_STIMULUS_GENERICAPPB1, "Generic App B1"},
864  {SKINNY_STIMULUS_GENERICAPPB2, "Generic App B2"},
865  {SKINNY_STIMULUS_GENERICAPPB3, "Generic App B3"},
866  {SKINNY_STIMULUS_GENERICAPPB4, "Generic App B4"},
867  {SKINNY_STIMULUS_GENERICAPPB5, "Generic App B5"},
868  {SKINNY_STIMULUS_MEETMECONFERENCE, "Meet Me Conference"},
869  {SKINNY_STIMULUS_CONFERENCE, "Conference"},
870  {SKINNY_STIMULUS_CALLPARK, "Call Park"},
871  {SKINNY_STIMULUS_CALLPICKUP, "Call Pickup"},
872  {SKINNY_STIMULUS_GROUPCALLPICKUP, "Group Call Pickup"},
873  /* *INDENT-ON* */
874 };
875 
876 #define SKINNY_BUTTONTYPE_UNUSED 0x00
877 #define SKINNY_BUTTONTYPE_LASTNUMBERREDIAL 0x01
878 #define SKINNY_BUTTONTYPE_SPEEDDIAL 0x02
879 #define SKINNY_BUTTONTYPE_HOLD 0x03
880 #define SKINNY_BUTTONTYPE_TRANSFER 0x04
881 #define SKINNY_BUTTONTYPE_FORWARDALL 0x05
882 #define SKINNY_BUTTONTYPE_FORWARDBUSY 0x06
883 #define SKINNY_BUTTONTYPE_FORWARDNOANSWER 0x07
884 #define SKINNY_BUTTONTYPE_DISPLAY 0x08
885 #define SKINNY_BUTTONTYPE_LINE 0x09
886 #define SKINNY_BUTTONTYPE_T120CHAT 0x0a
887 #define SKINNY_BUTTONTYPE_T120WHITEBOARD 0x0b
888 #define SKINNY_BUTTONTYPE_T120APPLICATIONSHARING 0x0c
889 #define SKINNY_BUTTONTYPE_T120FILETRANSFER 0x0d
890 #define SKINNY_BUTTONTYPE_VIDEO 0x0e
891 #define SKINNY_BUTTONTYPE_VOICEMAIL 0x0f
892 #define SKINNY_BUTTONTYPE_ANSWERRELEASE 0x10
893 #define SKINNY_BUTTONTYPE_AUTOANSWER 0x11
894 #define SKINNY_BUTTONTYPE_FEATURE 0x13
895 #define SKINNY_BUTTONTYPE_SERVICEURL 0x14
896 #define SKINNY_BUTTONTYPE_BLFSPEEDDIAL 0x15
897 #define SKINNY_BUTTONTYPE_GENERICAPPB1 0x21
898 #define SKINNY_BUTTONTYPE_GENERICAPPB2 0x22
899 #define SKINNY_BUTTONTYPE_GENERICAPPB3 0x23
900 #define SKINNY_BUTTONTYPE_GENERICAPPB4 0x24
901 #define SKINNY_BUTTONTYPE_GENERICAPPB5 0x25
902 #define SKINNY_BUTTONTYPE_MULTIBLINKFEATURE 0x26
903 
904 #define SKINNY_BUTTONTYPE_MEETMECONFERENCE 0x7B
905 #define SKINNY_BUTTONTYPE_CONFERENCE 0x7D
906 #define SKINNY_BUTTONTYPE_CALLPARK 0x7E
907 #define SKINNY_BUTTONTYPE_CALLPICKUP 0x7F
908 #define SKINNY_BUTTONTYPE_GROUPCALLPICKUP 0x80
909 
910 #define SKINNY_BUTTONTYPE_MOBILITY 0x81
911 #define SKINNY_BUTTONTYPE_TEST6 0x82
912 #define SKINNY_BUTTONTYPE_TEST8 0x85
913 #define SKINNY_BUTTONTYPE_TEST9 0x86
914 #define SKINNY_BUTTONTYPE_TESTA 0x87
915 #define SKINNY_BUTTONTYPE_TESTB 0x88
916 #define SKINNY_BUTTONTYPE_TESTC 0x89
917 #define SKINNY_BUTTONTYPE_TESTD 0x8A
918 #define SKINNY_BUTTONTYPE_TEST7 0x8B
919 
920 #define SKINNY_BUTTONTYPE_TESTE 0xC0
921 #define SKINNY_BUTTONTYPE_TESTF 0xC1
922 #define SKINNY_BUTTONTYPE_MESSAGES 0xC2
923 #define SKINNY_BUTTONTYPE_DIRECTORY 0xC3
924 #define SKINNY_BUTTONTYPE_TESTI 0xC4
925 #define SKINNY_BUTTONTYPE_APPLICATION 0xC5
926 #define SKINNY_BUTTONTYPE_HEADSET 0xC6
927 
928 #define SKINNY_BUTTONTYPE_KEYPAD 0xF0
929 #define SKINNY_BUTTONTYPE_AEC 0xFd
930 #define SKINNY_BUTTONTYPE_UNDEFINED 0xFF
931 
932 /* this is not a skinny button type. Used for speeddial/line buttons */
933 #define SCCP_BUTTONTYPE_MULTI 0xF1
934 #define SCCP_BUTTONTYPE_LINE 0xF2
935 #define SCCP_BUTTONTYPE_SPEEDDIAL 0xF3
936 #define SCCP_BUTTONTYPE_HINT 0xF4
937 
938 /*!
939  * \brief Skinny ButtonType Structure
940  */
941 static const struct skinny_buttontype {
942  uint8_t buttontype;
943  const char *const text;
944 } skinny_buttontypes[] = {
945  /* *INDENT-OFF* */
946  {SKINNY_BUTTONTYPE_UNUSED, "Unused"},
947  {SKINNY_BUTTONTYPE_LASTNUMBERREDIAL, "Last Number Redial"},
948  {SKINNY_BUTTONTYPE_SPEEDDIAL, "SpeedDial"},
949  {SKINNY_BUTTONTYPE_HOLD, "Hold"},
950  {SKINNY_BUTTONTYPE_TRANSFER, "Transfer"},
951  {SKINNY_BUTTONTYPE_FORWARDALL, "Forward All"},
952  {SKINNY_BUTTONTYPE_FORWARDBUSY, "Forward Busy"},
953  {SKINNY_BUTTONTYPE_FORWARDNOANSWER, "Forward No Answer"},
954  {SKINNY_BUTTONTYPE_DISPLAY, "Display"},
955  {SKINNY_BUTTONTYPE_LINE, "Line"},
956  {SKINNY_BUTTONTYPE_T120CHAT, "T120 Chat"},
957  {SKINNY_BUTTONTYPE_T120WHITEBOARD, "T120 Whiteboard"},
958  {SKINNY_BUTTONTYPE_T120APPLICATIONSHARING, "T120 Application Sharing"},
959  {SKINNY_BUTTONTYPE_T120FILETRANSFER, "T120 File Transfer"},
960  {SKINNY_BUTTONTYPE_VIDEO, "Video"},
961  {SKINNY_BUTTONTYPE_VOICEMAIL, "Voicemail"},
962  {SKINNY_BUTTONTYPE_ANSWERRELEASE, "Answer Release"},
963  {SKINNY_BUTTONTYPE_AUTOANSWER, "Auto Answer"},
964  {SKINNY_BUTTONTYPE_GENERICAPPB1, "Generic App B1"},
965  {SKINNY_BUTTONTYPE_GENERICAPPB2, "Generic App B2"},
966  {SKINNY_BUTTONTYPE_GENERICAPPB3, "Generic App B3"},
967  {SKINNY_BUTTONTYPE_GENERICAPPB4, "Generic App B4"},
968  {SKINNY_BUTTONTYPE_GENERICAPPB5, "Generic App B5"},
969  {SKINNY_BUTTONTYPE_MEETMECONFERENCE, "Meet Me Conference"},
970  {SKINNY_BUTTONTYPE_CONFERENCE, "Conference"},
971  {SKINNY_BUTTONTYPE_CALLPARK, "Call Park"},
972  {SKINNY_BUTTONTYPE_CALLPICKUP, "Call Pickup"},
973  {SKINNY_BUTTONTYPE_GROUPCALLPICKUP, "Group Call Pickup"},
974  {SKINNY_BUTTONTYPE_KEYPAD, "Keypad"},
975  {SKINNY_BUTTONTYPE_AEC, "AEC"},
976  {SKINNY_BUTTONTYPE_UNDEFINED, "Undefined"},
977  /* *INDENT-ON* */
978 };
979 
980 /* unregister */
981 #define SKINNY_UNREGISTERSTATUS_OK 0
982 #define SKINNY_UNREGISTERSTATUS_ERROR 1
983 #define SKINNY_UNREGISTERSTATUS_NAK 2 /*!< we have an active channel */
984 
985 /*!
986  * \brief Skinny Lamp Mode (ENUM)
987  */
988 typedef enum {
989  SKINNY_LAMP_OFF = 1, /*!< Lamp Off, 0% Duty */
990  SKINNY_LAMP_ON = 2, /*!< Lamp On, 100% Duty */
991  SKINNY_LAMP_WINK = 3, /*!< Lamp slow blink, ~90% Duty */
992  SKINNY_LAMP_FLASH = 4, /*!< Lamp very fast blink, ~70% Duty */
993  SKINNY_LAMP_BLINK = 5 /*!< Lamp slow blink, ~50% Duty */
995 
996 /*!
997  * \brief Skinny Lamp Structure
998  */
999 static const struct skinny_lampmode {
1001  const char *const text;
1002 } skinny_lampmodes[] = {
1003  /* *INDENT-OFF* */
1004  {SKINNY_LAMP_OFF, "Lamp Off"},
1005  {SKINNY_LAMP_ON, "Lamp On"},
1006  {SKINNY_LAMP_WINK, "Lamp Wink"},
1007  {SKINNY_LAMP_FLASH, "Lamp Flash"},
1008  {SKINNY_LAMP_BLINK, "Lamp Blink"},
1009  /* *INDENT-ON* */
1010 };
1011 
1012 /* media silence suppression */
1013 #define SKINNY_MEDIA_SILENCESUPPRESSION_OFF 0
1014 #define SKINNY_MEDIA_SILENCESUPPRESSION_ON 1
1015 
1016 /* media echo cancel */
1017 #define SKINNY_MEDIA_ECHOCANCELLATION_OFF 0
1018 #define SKINNY_MEDIA_ECHOCANCELLATION_ON 1
1019 
1020 /* G723 bitrate */
1021 #define SKINNY_MEDIA_G723BRATE_NONE 0
1022 #define SKINNY_MEDIA_G723BRATE_5_3 1
1023 #define SKINNY_MEDIA_G723BRATE_6_4 2
1024 
1025 /* device reset and restart */
1026 #define SKINNY_DEVICE_RESET 1
1027 #define SKINNY_DEVICE_RESTART 2
1028 
1029 /* statistic processing */
1030 #define SKINNY_STATSPROCESSING_CLEAR 0
1031 #define SKINNY_STATSPROCESSING_DONOTCLEAR 1
1032 
1033 /* ringer types */
1034 #define SKINNY_STATION_RINGOFF 1
1035 #define SKINNY_STATION_INSIDERING 2
1036 #define SKINNY_STATION_OUTSIDERING 3
1037 #define SKINNY_STATION_FEATURERING 4
1038 #define SKINNY_STATION_SILENTRING 5
1039 #define SKINNY_STATION_URGENTRING 6
1040 
1041 /*!
1042  * \brief Skinny Station Structure
1043  */
1044 static const struct skinny_station {
1045  uint8_t station;
1046  const char *const text;
1047 } skinny_stations[] = {
1048  /* *INDENT-OFF* */
1049  {SKINNY_STATION_RINGOFF, "Ring Off"},
1050  {SKINNY_STATION_INSIDERING, "Inside"},
1051  {SKINNY_STATION_OUTSIDERING, "Outside"},
1052  {SKINNY_STATION_FEATURERING, "Feature"},
1053  {SKINNY_STATION_SILENTRING, "Silent"},
1054  {SKINNY_STATION_URGENTRING, "Urgent"},
1055  /* *INDENT-ON* */
1056 };
1057 
1058 /* speaker status */
1059 #define SKINNY_STATIONSPEAKER_ON 1
1060 #define SKINNY_STATIONSPEAKER_OFF 2
1061 
1062 /* mic status */
1063 #define SKINNY_STATIONMIC_ON 1
1064 #define SKINNY_STATIONMIC_OFF 2
1065 
1066 /* headset status */
1067 #define SKINNY_STATIONHEADSET_ON 1
1068 #define SKINNY_STATIONHEADSET_OFF 2
1069 
1070 /*!
1071  * \brief Skinny Codecs (ENUM)
1072  */
1073 typedef enum {
1115 } skinny_codec_t;
1116 
1117 /*!
1118  * \brief Skinny codec types (ENUM)
1119  */
1120 typedef enum {
1128 
1129 /*!
1130  * \brief Skinny Codec Structure
1131  */
1132 static const struct skinny_codec {
1134  const char *const shortname; // used in sccp.conf
1135  const char *const name; // used in sccp.conf
1136  const char *const text; // used to display the codec name
1138  const char *mimesubtype; // rfc mime sub-type e.g. L16
1139  unsigned int sample_rate;
1140  unsigned int sound_quality;
1141 } skinny_codecs[] = {
1142  /* *INDENT-OFF* */
1143  {SKINNY_CODEC_NONE, "", "", "No codec", SKINNY_CODEC_TYPE_UNKNOWN, NULL, 0, 0},
1144  {SKINNY_CODEC_NONSTANDARD, "", "", "Non-standard codec", SKINNY_CODEC_TYPE_UNKNOWN, NULL, 0, 0},
1145  {SKINNY_CODEC_IS11172, "is11172", "is11172", "IS11172 AudioCap", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1146  {SKINNY_CODEC_IS13818, "is13872", "is13872", "IS13818 AudioCap", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1147  {SKINNY_CODEC_GSM_FULLRATE, "gsm", "gsm/full", "GSM Full Rate", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 2},
1148  {SKINNY_CODEC_GSM_HALFRATE, "gsm", "gsm/half", "GSM Half Rate", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1149  {SKINNY_CODEC_GSM_ENH_FULLRATE, "gsm", "gsm/enh", "GSM Enhanced Full Rate", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 2},
1150  {SKINNY_CODEC_WIDEBAND_256K, "slin16", "slin16", "Wideband 256k", SKINNY_CODEC_TYPE_AUDIO, "L16", 16000, 3},
1151  {SKINNY_CODEC_GSM, "gsm", "gsm", "GSM", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1152  {SKINNY_CODEC_ACTIVEVOICE, "activevoice", "activevoice", "ActiveVoice", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1153  {SKINNY_CODEC_G711_ALAW_64K, "alaw", "alaw/64k", "G.711 A-law 64k", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 2},
1154  {SKINNY_CODEC_G711_ALAW_56K, "alaw", "alaw/56k", "G.711 A-law 56k", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1155  {SKINNY_CODEC_G711_ULAW_64K, "ulaw", "ulaw/64k", "G.711 u-law 64k", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 2},
1156  {SKINNY_CODEC_G711_ULAW_56K, "ulaw", "ulaw/56k", "G.711 u-law 56k", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1157  {SKINNY_CODEC_G722_64K, "g722", "g722/64k", "G.722 64k", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 3},
1158  {SKINNY_CODEC_G722_56K, "g722", "g722/56k", "G.722 56k", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 3},
1159  {SKINNY_CODEC_G722_48K, "g722", "g722/48k", "G.722 48k", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 2},
1160  {SKINNY_CODEC_G722_1_24K, "g722.1", "g722.1/24k", "G722.1 24k (Siren7)", SKINNY_CODEC_TYPE_AUDIO, "G7221", 16000, 3},
1161  {SKINNY_CODEC_G722_1_32K, "g722.1", "g722.1/32k", "G722.1 32k (Siren14)", SKINNY_CODEC_TYPE_AUDIO, "G7221", 32000, 4},
1162  {SKINNY_CODEC_G723_1, "g723", "g723", "G.723.1", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1163  {SKINNY_CODEC_G726_16K, "g726", "g726/16k", "G.726 16K", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1164  {SKINNY_CODEC_G726_24K, "g726", "g726/24k", "G.726 24K", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1165  {SKINNY_CODEC_G726_32K, "g726", "g726/32k", "G.726 32K", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1166  {SKINNY_CODEC_G728, "g728", "g728", "G.728", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1167  {SKINNY_CODEC_G729, "g729", "g729", "G.729", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1168  {SKINNY_CODEC_G729_A, "g729", "g729a", "G.729 Annex A", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1169  {SKINNY_CODEC_G729_B_LOW, "g729", "g729b/low", "G.729B Low Complexity", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1170  {SKINNY_CODEC_G729_B, "g729", "g729b", "G.729 Annex B", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1171  {SKINNY_CODEC_G729_AB, "g729", "g729ab", "G.729 Annex A + B", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1172  {SKINNY_CODEC_G729_ANNEX_B, "g729", "g729/annex/b", "G.729 Annex B", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1173  {SKINNY_CODEC_ISAC, "isac", "isac", "iSAC", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1174  {SKINNY_CODEC_H224, "h224", "h224", "H.224", SKINNY_CODEC_TYPE_AUDIO, NULL, 0, 1},
1175  {SKINNY_CODEC_H261, "h261", "h261", "H.261", SKINNY_CODEC_TYPE_VIDEO, NULL, 0, 1},
1176  {SKINNY_CODEC_H263, "h263", "h263", "H.263", SKINNY_CODEC_TYPE_VIDEO, "H263", 0, 1},
1177  {SKINNY_CODEC_H263P, "h263", "h263p", "Vieo H.263+", SKINNY_CODEC_TYPE_VIDEO, NULL, 0, 1},
1178  {SKINNY_CODEC_H264, "h264", "h264", "H.264", SKINNY_CODEC_TYPE_VIDEO, "H264", 0, 1},
1179  {SKINNY_CODEC_T120, "t120", "t120", "T.140", SKINNY_CODEC_TYPE_TEXT, NULL, 0, 1},
1180  {SKINNY_CODEC_RFC2833_DYNPAYLOAD,"rfc2833", "rfc2833", "RFC 2833 Dyn Pay Load", SKINNY_CODEC_TYPE_MIXED, NULL, 0, 1},
1181  {SKINNY_CODEC_DATA_64K, "data", "data/64k", "Data 64k", SKINNY_CODEC_TYPE_DATA, NULL, 0, 1},
1182  {SKINNY_CODEC_DATA_56K, "data", "data/56k", "Data 56k", SKINNY_CODEC_TYPE_DATA, NULL, 0, 1},
1183  {SKINNY_CODEC_AAC, "aac", "aac", "AAC", SKINNY_CODEC_TYPE_DATA, NULL, 0, 1},
1184  /* *INDENT-ON* */
1185 };
1186 
1187 /* device dtmfmode */
1188 #define SCCP_DTMFMODE_INBAND 0
1189 #define SCCP_DTMFMODE_OUTOFBAND 1
1190 
1191 /*!
1192  * \brief SCCP AutoAnswer Mode (ENUM)
1193  */
1194 typedef enum {
1195  SCCP_AUTOANSWER_NONE = 0, /*!< 1 way audio - MIC OFF */
1196  SCCP_AUTOANSWER_1W = 1, /*!< 1 way audio - MIC OFF */
1197  SCCP_AUTOANSWER_2W = 2, /*!< 2 way audio - MIC ON */
1199 
1200 #define SCCP_DNDMODE_OFF 0 /*!< dnd not permitted on the device */
1201 #define SCCP_DNDMODE_REJECT 1 /*!< busy signal */
1202 #define SCCP_DNDMODE_SILENT 2 /*!< ringing state with no ringer tone */
1203 #define SCCP_DNDMODE_USERDEFINED 3 /*!< the user defines the mode by pressing the softkey */
1204 
1205 /*!
1206  * \brief Skinny Transmit or Receive flag
1207  */
1208 typedef enum {
1212 
1213 /*!
1214  * \brief SCCP DNDMode Structure
1215  */
1216 static const struct skinny_transmitOrReceiveModes {
1217  uint8_t mode;
1218  const char *const text;
1220  /* *INDENT-OFF* */
1221  {SKINNY_STATION_RECEIVE, "Receive only"},
1222  {SKINNY_STATION_TRANSMIT, "Transmit only"},
1223  {SKINNY_STATION_TRANSMIT | SKINNY_STATION_RECEIVE, "Transmit and Receive"},
1224  /* *INDENT-ON* */
1225 };
1226 
1227 /*!
1228  * \brief SCCP DNDMode Structure
1229  */
1230 static const struct sccp_dndmode {
1231  uint8_t dndmode;
1232  const char *const text;
1233 } sccp_dndmodes[] = {
1234  /* *INDENT-OFF* */
1235  {SCCP_DNDMODE_OFF, "Off"},
1236  {SCCP_DNDMODE_REJECT, "Reject"},
1237  {SCCP_DNDMODE_SILENT, "Silent"},
1238  {SCCP_DNDMODE_USERDEFINED, "User Defined"},
1239  /* *INDENT-ON* */
1240 };
1241 
1242 #define SCCP_BLINDTRANSFER_RING 0 /*!< default */
1243 #define SCCP_BLINDTRANSFER_MOH 1 /*!< music on hold */
1244 
1245 #define MAX_CUSTOM_PICTURES 6
1246 #define MAX_LAYOUT_WITH_SAME_SERVICE 5
1247 #define MAX_SERVICE_TYPE 4
1248 #define SKINNY_MAX_CAPABILITIES 18 /*!< max capabilities allowed in Cap response message */
1249 #define SKINNY_MAX_VIDEO_CAPABILITIES 10
1250 #define SKINNY_MAX_DATA_CAPABILITIES 5
1251 #define MAX_LEVEL_PREFERENCE 4
1252 
1253 /*!
1254  * \brief Button List Structure
1255 */
1256 typedef struct {
1257  uint8_t instance; /*!< Button Instance */
1258  uint8_t type; /*!< Button Type */
1259  void *ptr; /*!< Pointer to the next Button */
1260 } btnlist; /*!< Button List Structure */
1261 
1262 /*!
1263  * \brief Button Modes Structure
1264  */
1265 typedef struct {
1266  const char *type; /*!< Button Type */
1267  int buttonCount; /*!< Button Count */
1268  const btnlist *buttons; /*!< Button List */
1269 } button_modes; /*!< Button Modes Structure */
1270 
1271 /*!
1272  * \brief SCCP Message Types Enum
1273  */
1274 typedef enum {
1275  /* Client -> Server */
1278  IpPortMessage = 0x0002,
1282  OffHookMessage = 0x0006,
1283  OnHookMessage = 0x0007,
1295  AlarmMessage = 0x0020,
1324 
1325  /* This are from protocol V 11 CCM7 */
1329 
1330  /* Server -> Client */
1334  // ??
1336  SetLampMessage = 0x0086,
1344  // ?
1346 
1352  DefineTimeDate = 0x0094,
1357  VersionMessage = 0x0098,
1359  ClearDisplay = 0x009A,
1364  Reset = 0x009F,
1365 
1377 
1424 
1425  /* sent by us */
1435 
1436  /* received from phone */
1443 
1444  /* SPCP client -> server */
1446 
1447  /* SPCP server -> client */
1450 } sccp_message_t; /*!< SCCP Message Types Enum */
1451 
1452 /*!
1453  * \brief SCCP Message Type Structure
1454  */
1455 static const struct sccp_messagetype {
1457  const char *const text;
1458 } sccp_messagetypes[] = {
1459  /* *INDENT-OFF* */
1460  {KeepAliveMessage, "Keep Alive Message"},
1461  {RegisterMessage, "Register Message"},
1462  {IpPortMessage, "Ip-Port Message"},
1463  {KeypadButtonMessage, "Keypad Button Message"},
1464  {EnblocCallMessage, "Enbloc Call Message"},
1465  {StimulusMessage, "Stimulus Message"},
1466  {OffHookMessage, "Off-Hook Message"},
1467  {OnHookMessage, "On-Hook Message"},
1468  {HookFlashMessage, "Hook-Flash Message"},
1469  {ForwardStatReqMessage, "Forward State Request"},
1470  {SpeedDialStatReqMessage, "Speed-Dial State Request"},
1471  {LineStatReqMessage, "Line State Request"},
1472  {ConfigStatReqMessage, "Config State Request"},
1473  {TimeDateReqMessage, "Time Date Request"},
1474  {ButtonTemplateReqMessage, "Button Template Request"},
1475  {VersionReqMessage, "Version Request"},
1476  {CapabilitiesResMessage, "Capabilities Response Message"},
1477  {MediaPortListMessage, "Media Port List Message"},
1478  {ServerReqMessage, "Server Request"},
1479  {AlarmMessage, "Alarm Message"},
1480  {MulticastMediaReceptionAck, "Multicast Media Reception Acknowledge"},
1481  {OpenReceiveChannelAck, "Open Receive Channel Acknowledge"},
1482  {ConnectionStatisticsRes, "Connection Statistics Response"},
1483  {OffHookWithCgpnMessage, "Off-Hook With Cgpn Message"},
1484  {SoftKeySetReqMessage, "SoftKey Set Request"},
1485  {SoftKeyEventMessage, "SoftKey Event Message"},
1486  {UnregisterMessage, "Unregister Message"},
1487  {SoftKeyTemplateReqMessage, "SoftKey Template Request"},
1488  {RegisterTokenRequest, "Register Token Request"},
1489  {MediaTransmissionFailure, "Media Transmission Failure"},
1490  {HeadsetStatusMessage, "Headset Status Message"},
1491  {MediaResourceNotification, "Media Resource Notification"},
1492  {RegisterAvailableLinesMessage, "Register Available Lines Message"},
1493  {DeviceToUserDataMessage, "Device To User Data Message"},
1494  {DeviceToUserDataResponseMessage, "Device To User Data Response"},
1495  {UpdateCapabilitiesMessage, "Update Capabilities Message"},
1496  {OpenMultiMediaReceiveChannelAckMessage, "Open MultiMedia Receive Channel Acknowledge"},
1497  {ClearConferenceMessage, "Clear Conference Message"},
1498  {ServiceURLStatReqMessage, "Service URL State Request"},
1499  {FeatureStatReqMessage, "Feature State Request"},
1500  {CreateConferenceResMessage, "Create Conference Response"},
1501  {DeleteConferenceResMessage, "Delete Conference Response"},
1502  {ModifyConferenceResMessage, "Modify Conference Response"},
1503  {AddParticipantResMessage, "Add Participant Response"},
1504  {AuditConferenceResMessage, "Audit Conference Response"},
1505  {AuditParticipantResMessage, "Audit Participant Response"},
1506  {DeviceToUserDataVersion1Message, "Device To User Data Version1 Message"},
1507  {DeviceToUserDataResponseVersion1Message, "Device To User Data Version1 Response"},
1508  {DialedPhoneBookMessage, "Dialed PhoneBook Message"},
1509  {AccessoryStatusMessage, "Accessory Status Message"},
1510  {Unknown_0x004A_Message, "Undefined 0x004A Message"},
1511  {RegisterAckMessage, "Register Acknowledge"},
1512  {StartToneMessage, "Start Tone Message"},
1513  {StopToneMessage, "Stop Tone Message"},
1514  {SetRingerMessage, "Set Ringer Message"},
1515  {SetLampMessage, "Set Lamp Message"},
1516  {SetHkFDetectMessage, "Set HkF Detect Message"},
1517  {SetSpeakerModeMessage, "Set Speaker Mode Message"},
1518  {SetMicroModeMessage, "Set Micro Mode Message"},
1519  {StartMediaTransmission, "Start Media Transmission"},
1520  {StopMediaTransmission, "Stop Media Transmission"},
1521  {StartMediaReception, "Start Media Reception"},
1522  {StopMediaReception, "Stop Media Reception"},
1523  {CallInfoMessage, "Call Information Message"},
1524  {ForwardStatMessage, "Forward State Message"},
1525  {SpeedDialStatMessage, "SpeedDial State Message"},
1526  {LineStatMessage, "Line State Message"},
1527  {ConfigStatMessage, "Config State Message"},
1528  {DefineTimeDate, "Define Time Date"},
1529  {StartSessionTransmission, "Start Session Transmission"},
1530  {StopSessionTransmission, "Stop Session Transmission"},
1531  {ButtonTemplateMessage, "Button Template Message"},
1532  {ButtonTemplateMessageSingle, "Button Template Message Single"},
1533  {VersionMessage, "Version Message"},
1534  {DisplayTextMessage, "Display Text Message"},
1535  {ClearDisplay, "Clear Display"},
1536  {CapabilitiesReqMessage, "Capabilities Request"},
1537  {EnunciatorCommandMessage, "Enunciator Command Message"},
1538  {RegisterRejectMessage, "Register Reject Message"},
1539  {ServerResMessage, "Server Response"},
1540  {Reset, "Reset"},
1541  {KeepAliveAckMessage, "Keep Alive Acknowledge"},
1542  {StartMulticastMediaReception, "Start MulticastMedia Reception"},
1543  {StartMulticastMediaTransmission, "Start MulticastMedia Transmission"},
1544  {StopMulticastMediaReception, "Stop MulticastMedia Reception"},
1545  {StopMulticastMediaTransmission, "Stop MulticastMedia Transmission"},
1546  {OpenReceiveChannel, "Open Receive Channel"},
1547  {CloseReceiveChannel, "Close Receive Channel"},
1548  {ConnectionStatisticsReq, "Connection Statistics Request"},
1549  {SoftKeyTemplateResMessage, "SoftKey Template Response"},
1550  {SoftKeySetResMessage, "SoftKey Set Response"},
1551  {SelectSoftKeysMessage, "Select SoftKeys Message"},
1552  {CallStateMessage, "Call State Message"},
1553  {DisplayPromptStatusMessage, "Display Prompt Status Message"},
1554  {ClearPromptStatusMessage, "Clear Prompt Status Message"},
1555  {DisplayNotifyMessage, "Display Notify Message"},
1556  {ClearNotifyMessage, "Clear Notify Message"},
1557  {ActivateCallPlaneMessage, "Activate Call Plane Message"},
1558  {DeactivateCallPlaneMessage, "Deactivate Call Plane Message"},
1559  {UnregisterAckMessage, "Unregister Acknowledge"},
1560  {BackSpaceReqMessage, "Back Space Request"},
1561  {RegisterTokenAck, "Register Token Acknowledge"},
1562  {RegisterTokenReject, "Register Token Reject"},
1563  {StartMediaFailureDetection, "Start Media Failure Detection"},
1564  {DialedNumberMessage, "Dialed Number Message"},
1565  {UserToDeviceDataMessage, "User To Device Data Message"},
1566  {FeatureStatMessage, "Feature State Message"},
1567  {DisplayPriNotifyMessage, "Display Pri Notify Message"},
1568  {ClearPriNotifyMessage, "Clear Pri Notify Message"},
1569  {StartAnnouncementMessage, "Start Announcement Message"},
1570  {StopAnnouncementMessage, "Stop Announcement Message"},
1571  {AnnouncementFinishMessage, "Announcement Finish Message"},
1572  {NotifyDtmfToneMessage, "Notify DTMF Tone Message"},
1573  {SendDtmfToneMessage, "Send DTMF Tone Message"},
1574  {SubscribeDtmfPayloadReqMessage, "Subscribe DTMF Payload Request"},
1575  {SubscribeDtmfPayloadResMessage, "Subscribe DTMF Payload Response"},
1576  {SubscribeDtmfPayloadErrMessage, "Subscribe DTMF Payload Error Message"},
1577  {UnSubscribeDtmfPayloadReqMessage, "UnSubscribe DTMF Payload Request"},
1578  {UnSubscribeDtmfPayloadResMessage, "UnSubscribe DTMF Payload Response"},
1579  {UnSubscribeDtmfPayloadErrMessage, "UnSubscribe DTMF Payload Error Message"},
1580  {ServiceURLStatMessage, "ServiceURL State Message"},
1581  {CallSelectStatMessage, "Call Select State Message"},
1582  {OpenMultiMediaChannelMessage, "Open MultiMedia Channel Message"},
1583  {StartMultiMediaTransmission, "Start MultiMedia Transmission"},
1584  {StopMultiMediaTransmission, "Stop MultiMedia Transmission"},
1585  {MiscellaneousCommandMessage, "Miscellaneous Command Message"},
1586  {FlowControlCommandMessage, "Flow Control Command Message"},
1587  {CloseMultiMediaReceiveChannel, "Close MultiMedia Receive Channel"},
1588  {CreateConferenceReqMessage, "Create Conference Request"},
1589  {DeleteConferenceReqMessage, "Delete Conference Request"},
1590  {ModifyConferenceReqMessage, "Modify Conference Request"},
1591  {AddParticipantReqMessage, "Add Participant Request"},
1592  {DropParticipantReqMessage, "Drop Participant Request"},
1593  {AuditConferenceReqMessage, "Audit Conference Request"},
1594  {AuditParticipantReqMessage, "Audit Participant Request"},
1595  {UserToDeviceDataVersion1Message, "User To Device Data Version1 Message"},
1596  {DisplayDynamicNotifyMessage, "Display Dynamic Notify Message"},
1597  {DisplayDynamicPriNotifyMessage, "Display Dynamic Priority Notify Message"},
1598  {DisplayDynamicPromptStatusMessage, "Display Dynamic Prompt Status Message"},
1599  {FeatureStatDynamicMessage, "SpeedDial State Dynamic Message"},
1600  {LineStatDynamicMessage, "Line State Dynamic Message"},
1601  {ServiceURLStatDynamicMessage, "Service URL Stat Dynamic Messages"},
1602  {SpeedDialStatDynamicMessage, "SpeedDial Stat Dynamic Message"},
1603  {CallInfoDynamicMessage, "Call Information Dynamic Message"},
1604  {DialedPhoneBookAckMessage, "Dialed PhoneBook Ack Message"},
1605  {Unknown_0x0153_Message, "Undefined 0x0153 Message"},
1606  {StartMediaTransmissionAck, "Start Media Transmission Acknowledge"},
1607  {StartMultiMediaTransmissionAck, "Start Media Transmission Acknowledge"},
1608  {ExtensionDeviceCaps, "Extension Device Capabilities Message"},
1609  {XMLAlarmMessage, "XML-AlarmMessage"},
1610  {SPCPRegisterTokenRequest, "SPCP Register Token RequestCODEC"},
1611  {SPCPRegisterTokenAck, "SCPA RegisterMessageACK"},
1612  {SPCPRegisterTokenReject, "SCPA RegisterMessageReject"},
1613  /* *INDENT-ON* */
1614 };
1615 
1616 #define SCCP_ACCESSORY_NONE 0x00 /*!< Added for compatibility with old phones -FS */
1617 #define SCCP_ACCESSORY_HEADSET 0x01
1618 #define SCCP_ACCESSORY_HANDSET 0x02
1619 #define SCCP_ACCESSORY_SPEAKER 0x03
1620 
1621 /*!
1622  * \brief SCCP Accessory Structure
1623  */
1624 static const struct sccp_accessory {
1625  uint8_t accessory;
1626  const char *const text;
1627 } sccp_accessories[] = {
1628  /* *INDENT-OFF* */
1629  {SCCP_ACCESSORY_NONE, "None"},
1630  {SCCP_ACCESSORY_HEADSET, "Headset"},
1631  {SCCP_ACCESSORY_HANDSET, "Handset"},
1632  {SCCP_ACCESSORY_SPEAKER, "Speaker"},
1633  /* *INDENT-ON* */
1634 };
1635 
1636 #define SCCP_ACCESSORYSTATE_NONE 0x00 /*!< Added for compatibility with old phones -FS */
1637 #define SCCP_ACCESSORYSTATE_OFFHOOK 0x01
1638 #define SCCP_ACCESSORYSTATE_ONHOOK 0x02
1639 
1640 /*!
1641  * \brief SCCP Accessory State Structure
1642  */
1643 static const struct sccp_accessory_state {
1645  const char *const text;
1646 } sccp_accessory_states[] = {
1647  /* *INDENT-OFF* */
1648  {SCCP_ACCESSORYSTATE_NONE, "None"},
1649  {SCCP_ACCESSORYSTATE_ONHOOK, "On Hook"},
1650  {SCCP_ACCESSORYSTATE_OFFHOOK, "Off Hook"},
1651  /* *INDENT-ON* */
1652 };
1653 
1654 /*=====================================================================================================*/
1655 
1656 /*!
1657  * \brief Station Identifier Structure
1658  */
1659 typedef struct {
1660  char deviceName[StationMaxDeviceNameSize]; /*!< Device name */
1661  uint32_t lel_userid; /*!< User ID */
1662  uint32_t lel_instance; /*!< Instance */
1663 } StationIdentifier; /*!< Station Identifier Structure */
1664 
1665 /*!
1666  * \brief Station Button Definition Structure
1667  */
1668 typedef struct {
1669  uint8_t instanceNumber; /*!< set to instance number or StationKeyPadButton value */
1670  uint8_t buttonDefinition; /*!< set to one of the preceding Bt values */
1671 } StationButtonDefinition; /*!< Station Button Definition Structure */
1672 
1673 /*!
1674  * \brief Media Payload Capability Structure
1675  */
1676 typedef struct {
1677  skinny_codec_t lel_payloadCapability; /*!< Payload Capability (Codec Used) */
1678  uint32_t lel_maxFramesPerPacket; /*!< Maximum Number of Frames per IP Packet / Number of milliseconds of audio per RTP Packet */
1679  union {
1680  uint8_t futureUse[8];
1681  uint8_t lel_g723BitRate; /*!< g723 Bit Rate (1=5.3 Kbps, 2=6.4 Kbps) */
1682  } PAYLOADS; /*!< Payloads */
1683 } MediaCapabilityStructure; /*!< Media Payload Capability Structure */
1684 
1685 /*!
1686  * \brief Station Soft Key Definition Structure
1687  */
1688 typedef struct {
1689  char softKeyLabel[StationMaxSoftKeyLabelSize]; /*!< Soft Key Label */
1690  uint32_t lel_softKeyEvent; /*!< Soft Key Event */
1691 } StationSoftKeyDefinition; /*!< Station Soft Key Definition Structure */
1692 
1693 /*!
1694  * \brief Station Soft Key Set Definition Structure
1695  */
1696 typedef struct {
1697  uint8_t softKeyTemplateIndex[StationMaxSoftKeyIndex]; /*!< Soft Key Template Index */
1698  uint16_t les_softKeyInfoIndex[StationMaxSoftKeyIndex]; /*!< Soft Key Info Index */
1699 } StationSoftKeySetDefinition; /*!< Station Soft Key Set Definition Structure */
1700 
1701 /*!
1702  * \brief Station Identifier Structure
1703  */
1704 typedef struct {
1705  char serverName[ServerMaxNameSize]; /*!< Server Name */
1706 } ServerIdentifier; /*!< Server Identifier Structure */
1707 
1708 /*!
1709  * \brief Layout Config Structure (Update Capabilities Message Struct)
1710  * \since 20080111
1711  */
1712 typedef struct {
1713  uint32_t layout; /*!< Layout \todo what is layout? */
1714 } layoutConfig_t; /*!< Layout Config Structure */
1715 
1716 /*!
1717  * \brief Video Level Preference Structure
1718  */
1719 typedef struct {
1720  uint32_t transmitPreference; /*!< Transmit Preference */
1721  uint32_t format; /*!< Format / Codec */
1722  uint32_t maxBitRate; /*!< Maximum BitRate */
1723  uint32_t minBitRate; /*!< Minimum BitRate */
1724  uint32_t MPI; /*!< */
1725  uint32_t serviceNumber; /*!< Service Number */
1726 } levelPreference_t; /*!< Level Preference Structure */
1727 
1728 /*!
1729  * \brief Service Resource Structure
1730  */
1731 typedef struct {
1732  uint32_t layoutCount; /*!< Layout Count */
1734  uint32_t serviceNum; /*!< Service Number */
1735  uint32_t maxStreams; /*!< Maximum number of Streams */
1736  uint32_t maxConferences; /*!< Maximum number of Conferences */
1737  uint32_t activeConferenceOnRegistration; /*!< Active Conference On Registration */
1738 } serviceResource_t; /*!< Service Resource Structure */
1739 
1740 /*!
1741  * \brief Picture Format Structure
1742  */
1743 typedef struct {
1744  uint32_t customPictureFormatWidth; /*!< Picture Width */
1745  uint32_t customPictureFormatHeight; /*!< Picture Height */
1746  uint32_t customPictureFormatpixelAspectRatio; /*!< Picture Pixel Aspect Ratio */
1747  uint32_t customPictureFormatpixelclockConversionCode; /*!< Picture Pixel Conversion Code */
1748  uint32_t customPictureFormatpixelclockDivisor; /*!< Picture Pixel Divisor */
1749 } customPictureFormat_t; /*!< Picture Format Structure */
1750 
1751 /*!
1752  * \brief Audio Capabilities Structure
1753  */
1754 typedef struct {
1755  skinny_codec_t lel_payloadCapability; /*!< PayLoad Capability */
1756  uint32_t lel_maxFramesPerPacket; /*!< Maximum Number of Frames per IP Packet */
1757  uint32_t lel_unknown[2]; /*!< this are related to G.723 */
1758 } audioCap_t; /*!< Audio Capabilities Structure */
1759 
1760 /*!
1761  * \brief Video Capabilities Structure
1762  */
1763 typedef struct {
1764  skinny_codec_t lel_payloadCapability; /*!< PayLoad Capability */
1765  uint32_t lel_transmitOreceive; /*!< Transmit of Receive */
1766  uint32_t lel_levelPreferenceCount; /*!< Level of Preference Count */
1767 
1768  levelPreference_t levelPreference[MAX_LEVEL_PREFERENCE]; /*!< Level Preference */
1769 
1770 // uint32_t lel_codec_options[2]; /*!< Codec Options */
1771 
1772  union {
1773  struct {
1774  uint32_t unknown1;
1775  uint32_t unknown2;
1776  } h263;
1777  struct {
1778  uint32_t profile; /*!< H264 profile */
1779  uint32_t level; /*!< H264 level */
1780  } h264;
1781  } codec_options;
1782 
1783  /**
1784  * Codec options contains data specific for every codec
1785  *
1786  * Here is a list of known parameters per codec
1787  // H.261
1788  uint32_t lel_temporalSpatialTradeOffCapability;
1789  uint32_t lel_stillImageTransmission;
1790 
1791  // H.263
1792  uint32_t lel_h263_capability_bitfield;
1793  uint32_t lel_annexNandWFutureUse;
1794 
1795  // Video
1796  uint32_t lel_modelNumber;
1797  uint32_t lel_bandwidth;
1798  */
1799 } videoCap_t; /*!< Video Capabilities Structure */
1800 
1801 /*!
1802  * \brief Data Capabilities Structure
1803  */
1804 typedef struct {
1805  uint32_t payloadCapability; /*!< Payload Capability */
1806  uint32_t transmitOrReceive; /*!< Transmit or Receive */
1807  uint32_t protocolDependentData; /*!< Protocol Dependent Data */
1808  uint32_t maxBitRate; /*!< Maximum BitRate */
1809 } dataCap_t; /*!< Data Capabilities Structure */
1810 
1811 /*!
1812  * \brief Audio Parameters Structure
1813  */
1814 typedef struct {
1815  uint32_t millisecondPacketSize; /*!< Packet Size per Milli Second */
1816  uint32_t lel_echoCancelType; /*!< Echo Cancelation Type */
1817  uint32_t lel_g723BitRate; /*!< only used with G.723 payload */
1818 } audioParameter_t; /*!< Audio Parameters Structure */
1819 
1820 /*!
1821  * \brief Picture Format Structure
1822  */
1823 typedef struct {
1824  uint32_t format; /*!< Picture Format */
1825  uint32_t mpi; /*!< MPI */
1826 } pictureFormat_t; /*!< Picture Format Structure */
1827 
1828 /*!
1829  * \brief H261 Video Capability Structure
1830  */
1831 typedef struct {
1832  uint32_t temporalSpatialTradeOffCapability; /*!< Temporal Spatial Trade Off Capability */
1833  uint32_t stillImageTransmission; /*!< Still Image Transmission */
1834 } h261VideoCapability_t; /*!< H261 Video Capability Structure */
1835 
1836 /*!
1837  * \brief H263 Video Capability Structure
1838  */
1839 typedef struct {
1840  uint32_t h263CapabilityBitfield; /*!< H263 Capability Bit-Field */
1841  uint32_t annexNandwFutureUse; /*!< Annex Nandw for Future Use */
1842 } h263VideoCapability_t; /*!< H262 Vidio Capability Structure */
1843 
1844 /*!
1845  * \brief vieo Video Capability Structure
1846  */
1847 typedef struct {
1848  uint32_t modelNumber; /*!< Model Number */
1849  uint32_t bandwidth; /*!< BandWidth */
1850 } vieoVideoCapability_t; /*!< vieo Video Capability Structure */
1851 
1852 /*!
1853  * \brief Data Parameter Structure
1854  */
1855 typedef struct {
1856  uint32_t protocolDependentData; /*!< Protocol Dependent Data */
1857  uint32_t maxBitRate; /*!< Maximum BitRate */
1858 } dataParameter_t; /*!< Data Parameter Structure */
1859 
1860 /*!
1861  * \brief Video Parameter Structure
1862  * \since 20100103
1863  */
1864 // typedef struct {
1865 // uint32_t bitRate; /*!< BitRate (default 384) */
1866 // uint32_t pictureFormatCount; /*!< Picture Format Count (default 0) */
1867 // pictureFormat_t pictureFormat[3]; /*!< Picture Format Array */
1868 // uint32_t confServiceNum; /*!< Conf Service Number */
1869 // uint32_t dummy; /*!< dummy */
1870 // h261VideoCapability_t h261VideoCapability; /*!< H261 Video Capability */
1871 // h263VideoCapability_t h263VideoCapability; /*!< H263 Video Capability */
1872 // vieoVideoCapability_t vieoVideoCapability; /*!< vieo Video Capability */
1873 // } videoParameter_t; /*!< Video Parameter Structure */
1874 
1875 /*!
1876  * \brief Video Parameter Structure
1877  * \since 20110718
1878  */
1879 typedef struct {
1880  uint32_t bitRate; /*!< BitRate (default 384) */
1881  uint32_t pictureFormatCount; /*!< Picture Format Count (default 0) */
1882  pictureFormat_t pictureFormat[5]; /*!< Picture Format Array */
1883  uint32_t confServiceNum; /*!< Conf Service Number */
1884  uint32_t profile;
1885  uint32_t level;
1888  uint32_t decpicbuf;
1889  uint32_t brandcpb;
1890  uint16_t dummy1;
1891  uint16_t dummy2;
1892  uint32_t dummy3;
1893  uint32_t dummy4;
1894  uint32_t dummy5;
1895  uint32_t dummy6;
1896  uint32_t dummy7;
1897  uint32_t dummy8;
1898 } videoParameter_t; /*!< Video Parameter Structure */
1899 
1900 /*!
1901  * \brief SCCP Data Union
1902  */
1903 typedef union {
1904 
1905  /* 0x0048 is phone call list update (comes from phone 7921
1906  * phones when you press the dial button without a number.
1907  * It looks like this:
1908  *
1909  * 00000000 - 00 00 00 00 01 00 00 00 4B 0D 00 00 34 30 30 30 ........K...4000
1910  * 00000010 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1911  * 00000020 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1912  * 00000030 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1913  * 00000040 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1914  * 00000050 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1915  * 00000060 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1916  * 00000070 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1917  * 00000080 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1918  * 00000090 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1919  * 000000A0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1920  * 000000B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1921  * 000000C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1922  * 000000D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1923  * 000000E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1924  * 000000F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1925  * 00000100 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1926  * First DWORD is Index shifted of 4 bits (i think the 4 bits param is something)
1927  * Second DWORD is line instance related to the call
1928  * Third DWORD is unknown, Next there is the phone number [260 bytes]
1929  */
1930 
1931  struct {
1932  uint32_t lel_NumberIndex; /*!< Number Index (this must be shifted 4 bits right) */
1933  uint32_t lel_lineinstance; /*!< Line Instance */
1934  uint32_t lel_unknown; /*!< \todo Unknown */
1935  char phonenumber[260]; /*!< \todo I don't know if this is exact */
1936  } DialedPhoneBookMessage; /*!< Dialed Phone Book Message Structure */
1937 
1938  struct {
1939  uint32_t lel_NumberIndex; /*!< Number Index (this must be shifted 4 bits right) */
1940  uint32_t lel_lineinstance; /*!< Line Instance */
1941  uint32_t lel_unknown; /*!< \todo Unknown */
1942  uint32_t lel_unknown2; /*!< \todo Unknown2 */
1943  } DialedPhoneBookAckMessage; /*!< Dialed Phone Book Acknowledgement Structure */
1944 
1945  struct {
1946  uint32_t lel_appID;
1950  uint32_t lel_dataLength;
1952  } UserToDeviceDataMessage; /*!< User to Device Message Structure */
1953 
1954  struct {
1955  uint32_t lel_appID;
1956  uint32_t lel_lineInstance;
1957  uint32_t lel_callReference;
1958  uint32_t lel_transactionID;
1959  uint32_t lel_dataLength;
1964  uint32_t lel_routing;
1965  char data; // dummy char for variable length message
1966  } UserToDeviceDataVersion1Message; /*!< User to Device Version1 Message Structure */
1967 
1968  struct {
1969  uint32_t lel_appID;
1970  uint32_t lel_lineInstance;
1971  uint32_t lel_callReference;
1972  uint32_t lel_transactionID;
1973  uint32_t lel_dataLength;
1974  char data[StationMaxXMLMessage];
1975  } DeviceToUserDataMessage; /*!< Device to User Message Structure */
1976 
1977  struct {
1978  uint32_t lel_appID;
1979  uint32_t lel_lineInstance;
1980  uint32_t lel_callReference;
1981  uint32_t lel_transactionID;
1982  uint32_t lel_dataLength;
1983  char data[StationMaxXMLMessage];
1984  } DeviceToUserDataResponseMessage; /*!< Device to User Response Message Structure */
1985 
1986  struct {
1987  uint32_t lel_appID;
1988  uint32_t lel_lineInstance;
1989  uint32_t lel_callReference;
1990  uint32_t lel_transactionID;
1991  uint32_t lel_dataLength;
1992  uint32_t lel_sequenceFlag;
1993  uint32_t lel_displayPriority;
1994  uint32_t lel_conferenceID;
1995  uint32_t lel_appInstanceID;
1996  uint32_t lel_routing;
1997  char data[StationMaxXMLMessage];
1998  } DeviceToUserDataVersion1Message; /*!< Device to User Version1 Message Structure */
1999 
2000  struct {
2001  uint32_t lel_appID;
2002  uint32_t lel_lineInstance;
2003  uint32_t lel_callReference;
2004  uint32_t lel_transactionID;
2005  uint32_t lel_dataLength;
2006  uint32_t lel_sequenceFlag;
2007  uint32_t lel_displayPriority;
2008  uint32_t lel_conferenceID;
2009  uint32_t lel_appInstanceID;
2010  uint32_t lel_routing;
2011  char data[StationMaxXMLMessage];
2013 
2014  /* AccessoryStatusMessage (0x0073):
2015  * This indicates the phone headset, handset or speaker status.
2016  *
2017  * FIRST DWORD: 0x0001 = HEADSET, 0x0002 = HANDSET, 0x0003 = SPEAKERMODE
2018  * SECOND DWORD: 0x0001 = OFFHOOK, 0x0002 = ONHOOK
2019  * THIRD DWORD: ALWAYS 0x0000 UNKNOWN
2020  */
2021 
2022  struct {
2023  uint32_t lel_AccessoryID; /*!< Accessory ID */
2024  uint32_t lel_AccessoryStatus; /*!< Accessory Status */
2025  uint32_t lel_unknown; /*!< Unknown */
2026  } AccessoryStatusMessage; /*!< Accessory Status Message Structure */
2027 
2028  // Message 0x4A len 12 (cisco ip communicator uses it)
2029  // 00000000 - 03 00 00 00 01 00 00 00 00 00 00 00 ............
2030 
2031  struct {
2032  uint32_t lel_unknown1; /*!< Unknown */
2033  uint32_t lel_unknown2; /*!< Unknown */
2034  uint32_t lel_unknown3; /*!< Unknown */
2035  } Unknown_0x004A_Message; /*!< \todo Unknown 0x004A Message Structure */
2036 
2037  struct { // INCOMPLETE
2038  uint32_t lel_conferenceID; /*!< Conference ID */
2040  uint32_t lel_callReference; /*!< Call Reference */
2041  uint32_t lel_maxBitRate; /*!< maxBitRate */
2042  } Unknown_0x0141_Message; /*!< \todo Unknown 0x0141 Message Structure */
2043 
2044  struct {
2045  uint32_t lel_instance; /*!< Instance */
2046  uint32_t lel_type; /*!< always 0x15 */
2047  uint32_t lel_status; /*!< status */
2048  char DisplayName[StationMaxNameSize]; /*!< SpeedDial Display Name \todo shoud be dynamic - readMessage - OVERRUN remaining bytes=29 messageType=0x146 */
2049  } FeatureStatDynamicMessage; /*!< Speed Dial Stat Dynamic Message Structure */
2050 
2051  struct { // OK
2053  uint32_t dummy;
2054  } DisplayDynamicNotifyMessage; // 0x0143
2055 
2056  struct { // OK
2057  uint32_t lel_displayTimeout;
2058  uint32_t lel_priority;
2059  uint32_t dummy;
2060  } DisplayDynamicPriNotifyMessage; // 0x0144;
2061 
2062  struct {
2063  uint32_t lel_messageTimeout; /*!< Message Timeout */
2064  uint32_t lel_lineInstance; /*!< Line Instance */
2065  uint32_t lel_callReference; /*!< Call Reference */
2066  /* here follow the message string
2067  * take care rest of size should
2068  * be calculated with string
2069  * size + 1 (NULL TERMINATION)
2070  * padded by 4
2071  */
2072  uint32_t dummy; /*!< Dummy, this is just for addressing, it doesn't matter */
2073  } DisplayDynamicPromptStatusMessage; /*!< Display Dynamic Prompt Status Message Structure */
2074 
2075  struct {
2076  uint32_t lel_conferenceID;
2077  uint32_t lel_serviceNum;
2079 
2080  struct {
2081  uint32_t lel_lineNumber; /*!< Line Number */
2082  uint32_t lel_lineType; /*!< Line Type */
2083  uint32_t dummy; /*!< Dummy */
2084  } LineStatDynamicMessage; /*!< Line Stat Dynmic Message Structure */
2085 
2086  struct {
2087  uint32_t lel_speedDialNumber; /*!< Speed Dial Number */
2088  uint32_t dummy; /*!< Dummy */
2089  } Unknown_0x0149_Message; /*!< Unknown 0x0149 Message Structure */
2090 
2091  struct {
2092  uint32_t lel_lineId; /*!< Line ID */
2093  uint32_t lel_callRef; /*!< Call Reference */
2094  uint32_t lel_callType; /*!< Call Type (INBOUND=1, OUTBOUND=2, FORWARD=3) */
2095  uint32_t lel_originalCdpnRedirectReason; /*!< Original CalledParty Redirect Reason */
2096  uint32_t lel_lastRedirectingReason; /*!< Last Redirecting Reason */
2097  uint32_t lel_callInstance; /*!< Call Instance */
2098  uint32_t lel_callSecurityStatus; /*!< Call Security Status */
2099  uint32_t partyPIRestrictionBits; /*!< Party PI Restriction Bits Structure
2100  0 RestrictCallingPartyName
2101  1 RestrictCallingPartyNumber
2102  2 RestrictCalledPartyName
2103  3 RestrictCalledPartyNumber
2104  4 RestrictOriginalCalledPartyName
2105  5 RestrictOriginalCalledPartyNumber
2106  6 RestrictLastRedirectPartyName
2107  7 RestrictLastRedirectPartyNumber */
2108  uint32_t dummy; /*!< Dummy */
2109  /*
2110  * Here there are the following informations:
2111  *
2112  char callingParty[StationMaxDirnumSize];
2113  char calledParty[StationMaxDirnumSize];
2114  char originalCalledParty[StationMaxDirnumSize];
2115  char lastRedirectingParty[StationMaxDirnumSize];
2116  char cgpnVoiceMailbox[StationMaxDirnumSize];
2117  char cdpnVoiceMailbox[StationMaxDirnumSize];
2118  char originalCdpnVoiceMailbox[StationMaxDirnumSize];
2119  char lastRedirectingVoiceMailbox[StationMaxDirnumSize];
2120  char callingPartyName[StationMaxNameSize];
2121  char calledPartyName[StationMaxNameSize];
2122  char originalCalledPartyName[StationMaxNameSize];
2123  char lastRedirectingPartyName[StationMaxNameSize];
2124  */
2125  } CallInfoDynamicMessage; /*!< Call Information Dynamic Message Structure */
2126 
2127  /*
2128  * Unhandled SCCP Message: unknown(0x0159) 168 bytes length
2129  * 00000000 - 01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 ................
2130  * 00000010 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2131  * 00000020 - 00 00 00 00 6D 61 78 2D 63 68 61 69 6E 65 64 3D ....max-chained=
2132  * 00000030 - 32 20 64 65 76 69 63 65 4C 69 6E 65 3D 31 34 00 2 deviceLine=14.
2133  * 00000040 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2134  * 00000050 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2135  * 00000060 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2136  * 00000070 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2137  * 00000080 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2138  * 00000090 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2139  * 000000A0 - 00 00 00 00 00 00 00 00 ........
2140  *
2141  * This was sent by a single 7970 with one CP-7914 attached.
2142  * Message is related to Addons and i suppose it notifies their
2143  * number, capacity and index.
2144  */
2145 
2146  struct {
2147  char dummy[168]; /*!< Dummy */
2148  } Unknown_0x0159_Message; /*!< Unknown 0x0159 Message Strucute */
2149 
2150  struct {
2151  uint32_t lel_callReference; /*!< Call Reference */
2152  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
2153  uint32_t lel_callReference1; /*!< Call Reference1 */
2154  uint32_t bel_ipAddr; /*!< Ip Address Array (This field is apparently in big-endian format, even though most other fields are in little-endian format.) */
2155  uint32_t lel_portNumber; /*!< Port Number */
2156  uint32_t lel_smtStatus; /*!< Start Media Transmission Status */
2157  uint32_t lel_unknown1; /*!< Unknown 2 */
2158  } StartMediaTransmissionAck; /*!< Start Media Transmission Acknowledgement Structure */
2159 
2160  /* this is from a 7941
2161  Unhandled SCCP Message: unknown(0x0154) 44 bytes length
2162  00000000 - 03 00 00 00 FC FF FF FF 03 00 00 00 00 00 00 00 ................
2163  00000010 - C0 A8 09 24 00 00 00 00 00 00 00 00 00 00 00 00 ...$............
2164  00000020 - 00 00 00 00 03 00 00 00 00 00 00 00 ............
2165  */
2166 
2167  struct {
2168  uint32_t lel_callReference; /*!< Call Reference */
2169  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
2170  uint32_t lel_callReference1; /*!< Call Reference 1 */
2171  uint32_t lel_unknown1; /*!< i think this switches from IPv4 to IPv6 (0x00 in IPv4) */
2172  /* include IPv6 support */
2173  char bel_ipAddr[16]; /*!< This field is apparently in big-endian format, even though most other fields are in little-endian format. */
2174  uint32_t lel_portNumber; /*!< Port Number */
2175  uint32_t lel_smtStatus; /*!< startmediatransmission status */
2176  uint32_t lel_unknown2; /*!< Unknown */
2177  } StartMediaTransmissionAck_v17; /*!< Start Media Transmission Acknowledgement used in protocoll version 17 */
2178 
2179  // No struct
2180 
2181  struct {
2182  } StationKeepAliveMessage; /*!< Station Keep Alive Message */
2183 
2184  /* this is register message from 7940 with load 8.1.1 (protocol 0)
2185  * 00000010 - 00 00 00 00 01 00 00 00 0A 0A 0A D2 07 00 00 00 ................
2186  * 00000020 - 00 00 00 00 00 00 00 00 0B 00 60 85 00 00 00 00 ................
2187  * 00000030 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2188  * 00000040 - 00 00 00 00 ....
2189  */
2190 
2191  /* Register message from Cisco 7941 with load v8.5.3 (protocol 17)
2192  *
2193  * 00000000 53 45 50 30 30 31 46 39 45 32 36 36 33 36 39 00 SEP001F9E266369.
2194  * 00000010 00 00 00 00 00 00 00 00 c0 a8 09 24 73 00 00 00 ...........$s...
2195  * 00000020 05 00 00 00 00 00 00 00 11 00 72 85 01 00 00 00 ..........r.....
2196  * 00000030 00 00 00 00 00 1f 9e 26 63 69 00 00 00 00 00 00 .......&ci......
2197  * 00000040 03 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 ................
2198  * 00000050 00 00 00 00 00 00 00 00 00 00 00 00 53 43 43 50 ............SCCP
2199  * 00000060 34 31 2e 38 2d 35 2d 33 53 00 00 00 00 00 00 00 41.8-5-3S.......
2200  * 00000070 00 00 00 00 00 00 00 00 00 00 00 00 ............
2201  */
2202 
2203  /* Register message from Cisco 6961 with load v8.5.3 (protocol 15)
2204  * 00000000 - 53 45 50 30 30 31 31 32 31 46 46 38 41 33 45 00 SEP001121FF8A3
2205  * 00000010 - 00 00 00 00 01 00 00 00 53 DA 5E 14 F1 01 00 00 ........S.^...
2206  * 00000020 - 28 00 00 00 00 00 00 00 0F 20 70 85 00 00 00 00 (........ p...
2207  * 00000030 - 00 00 00 00 30 30 31 31 32 31 46 46 38 41 33 45 ....001121FF8A
2208  * 00000040 - 00 00 00 00
2209  */
2210 
2211  /* Register message from Cisco 7960 with v8.1.2 (protocol 11)
2212  * 00000000 - 53 45 50 30 30 31 42 35 33 35 43 44 33 44 36 00 SEP001B535CD3D6.
2213  * 00000010 - 00 00 00 00 01 00 00 00 0A 0F 0F B2 07 00 00 00 ................
2214  * 00000020 - 00 00 00 00 00 00 00 00 0B 00 60 85 00 00 00 00 ................
2215  * 00000030 - 00 00 00 00 00 00 00 00 00 00 00 00 52 49 4E 47 ............RING
2216  * 00000040 - 00 00 00 00 ....
2217  */
2218  struct {
2219  StationIdentifier sId; /*!< Station Identifier */
2220  uint32_t lel_stationIpAddr; /*c0:a8:09:24=192.168.9.36 *//*!< Station IP Address */
2221  uint32_t lel_deviceType; /*73:00:00:00=115 *//*!< Device Type as part of SKINNY_DEVICETYPE_* */
2222  uint32_t lel_maxStreams; /*05:00:00:00=5 *//*!< Max Streams */
2223  uint32_t lel_activeStreams; /*00:00:00:00=0 *//*!< number of active streams */
2224  uint32_t phone_features; /*11:00:72:85 =17. *//*!< PhoneFeatures (ProtocolVersion + Features) */
2225  uint32_t lel_sockettype; /*01:00:00:00 *//*!< MacAddress if 0x00=ASCII, 0x01=HEX */
2226  uint32_t lel_unknown1; /*00:00:00:00 *//*!< Unknown */
2227  uint8_t lel_bytes1[12]; /* *//*!< byte array */
2228  uint32_t lel_unknown2;
2229  uint32_t lel_maxButtons;
2230  char ipv6Address[16];
2231  uint32_t lel_unknown3;
2232  char loadInfo[32];
2233 
2234  /* 7910:
2235  02 00 00 00 // protocolVer (1st bit)
2236  08 00 00 00 == 8
2237  00 00 00 00
2238  02 00 00 00 == 2
2239  ce f1 00 00 // == (61092 / 206 / 241) 1668 dn-size 420
2240  */
2241  } RegisterMessage; /*!< Register Message Structure */
2242 
2243  struct {
2244  StationIdentifier sId; /*!< Station Identifier */
2245  uint8_t protocolVer; /*!< Maximum Protocol Version */
2246  uint32_t lel_deviceType; /*!< Device Type as part of SKINNY_DEVICETYPE_* */
2247  uint8_t lel_unknown3;
2248  } RegisterMessage36; /*!< Register Message Structure */
2249 
2250  struct {
2251  // All char arrays are in multiples of 32bit
2252  struct {
2253  char deviceName[StationMaxDeviceNameSize]; /*!< Device Name */
2254  uint32_t lel_stationUserId; /*!< Station User ID (Not In Use) */
2255  uint32_t lel_stationInstance; /*!< Station Instance */
2256  } station_identifier; /*!< Station Identifier */
2257 
2258  char userName[StationMaxNameSize]; /*!< User Name */
2259  char serverName[StationMaxNameSize]; /*!< Server Name */
2260  uint32_t lel_numberLines; /*!< Number of Lines configured */
2261  uint32_t lel_numberSpeedDials; /*!< Number of SpeedDials configured */
2262  } ConfigStatMessage; /*!< Configuration Status Message - Server -> Client */
2263 
2264  struct {
2265  uint32_t les_rtpMediaPort; /*!< RTP Media Port */
2266  } IpPortMessage; /*!< Ip Port Message - Superseded by including the IP Port info in the OpenReceiveChannelAck Message */
2267 
2268  struct {
2269  uint32_t lel_kpButton; /*!< KeyPad Button */
2270  uint32_t lel_lineInstance; /*!< Line Instance on device */
2271  uint32_t lel_callReference; /*!< Call Reference - current channel identifier */
2272  } KeypadButtonMessage; /*!< KeyPad Button Message - Client -> Server */
2273 
2274  struct {
2275  char calledParty[StationMaxDirnumSize]; /*!< Called Party */
2276  } EnblocCallMessage; /*!< Enbloc Call Message - Client -> Server */
2277 
2278  struct {
2279  uint32_t lel_stimulus; /*!< Stimulus */
2280  uint32_t lel_stimulusInstance; /*!< Stimulus Instance (normally set to 1 (except speed dial and line)) */
2281  } StimulusMessage; /*!< Stimulus Message - Client -> Server */
2282 
2283  struct {
2284  } OffHookMessage; /*!< Off Hook Message Structure */
2285 
2286  struct {
2287  char callingPartyNumber[StationMaxDirnumSize]; /*!< Calling Party Number */
2288  } OffHookMessageWithCallingPartyNum; /*!< Off Hook With Calling Party Number Message Structure
2289  Goes Off Hook and provides a Calling Party Number to the PBX used by multiline Devices
2290  */
2291 
2292  struct {
2293  } OnHookMessage; /*!< On Hook Message Structure */
2294 
2295  struct {
2296  } HookFlashMessage; /*!< Hook Flash Message Structure */
2297 
2298  struct {
2299  uint32_t lel_deviceType; /*!< Device Type as part of SKINNY_DEVICETYPE_* */
2300  uint32_t lel_numberOfInServiceStreams; /*!< Number Of In-Service Streams */
2301  uint32_t lel_maxStreamsPerConf; /*!< Maximum Streams Per Configuration */
2302  uint32_t lel_numberOfOutOfServiceStreams; /*!< Number of Out-Of_Service Streams */
2303  } MediaResourceNotification; /*!< Media Resource Notification - Client -> Server */
2304 
2305  struct {
2306  uint32_t lel_lineNumber; /*!< lineNumber for which Forward should be set */
2307  } ForwardStatReqMessage; /*!< Forward Status Request Message - Client -> Server */
2308 
2309  struct {
2310  uint32_t lel_speedDialNumber; /*!< instance on device */
2311  } SpeedDialStatReqMessage; /*!< Speed Dial Status Request Message - Client -> Server */
2312 
2313  struct {
2314  uint32_t lel_lineNumber; /*!< instance on device */
2315  } LineStatReqMessage; /*!< Line Status Request Message - Client -> Server */
2316 
2317  struct {
2318  } ConfigStatReqMessage; /*!< Configuration Status Request Message - Client -> Server */
2319 
2320  struct {
2321  } TimeDateReqMessage; /*!< Time Date Request Message - Client -> Server */
2322 
2323  struct {
2324  uint32_t lel_totalButtonCount; /*!< number of available buttons */
2325  } ButtonTemplateReqMessage; /*!< Button Template Request Message - Client -> Server */
2326 
2327  struct {
2328  } VersionReqMessage; /*!< Version Request Message - Client -> Server */
2329 
2330  struct {
2331  uint32_t lel_count; /*!< Count */
2332  MediaCapabilityStructure caps[SKINNY_MAX_CAPABILITIES]; /*!< MediaCapabilities */
2333  } CapabilitiesResMessage; /*!< Capabilities Resource Message - Client -> Server */
2334 
2335  struct {
2336  uint32_t portCount; /*!< portCount contains the total number of RTP ports supported by the device. */
2337  uint32_t rtpMediaPort[StationMaxPorts]; /*!< RtpMediaPort contains the list of RTP port numbers. */
2338  } MediaPortListMessage; /*!< Media Port List Message Structure
2339  Used instead of the StationIpPort message for Devices which have multiple RTP stream ports.
2340  Devices like media bridges */
2341 
2342  struct {
2343  } ServerReqMessage; /*!< Server Request Message - Client -> Server */
2344 
2345  struct {
2346  uint32_t lel_alarmSeverity; /*!< Alarm Severity Level */
2347  char text[80]; /*!< Alarm Text */
2348  uint32_t lel_parm1; /*!< Alarm Parameter 1 */
2349  uint32_t lel_parm2; /*!< Alarm Parameter 2 */
2350  } AlarmMessage; /*!< Alarm Message - Client -> Server */
2351 
2352  /* 0x34 FeatureStatReqMessage */
2353  struct {
2354  uint32_t lel_featureInstance; /*!< instance on device */
2355  uint32_t lel_unknown; /*!< unknown */
2356  } FeatureStatReqMessage; /*!< Feature Stat Request Message - Client -> Server */
2357 
2358  struct {
2359  uint32_t lel_serviceURLIndex; /*!< instance on device */
2360  } ServiceURLStatReqMessage; /*!< Service URL Stat Request Message - Client -> Server */
2361 
2362  /*
2363  [Jan 6 17:05:50] WARNING[29993]: sccp_actions.c:59 sccp_handle_unknown_message:
2364  Unhandled SCCP Message: 48 - UpdateCapabilitiesMessage with length 1844
2365 
2366  This is from a 7970 with no video caps
2367  00000000 - 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2368  00000010 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2369  00000020 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2370  00000030 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2371  00000040 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2372  00000050 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2373  00000060 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2374  00000070 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2375  00000080 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2376  00000090 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2377  000000A0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2378  000000B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2379  000000C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2380  000000D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2381  000000E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2382  000000F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2383  00000100 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2384  00000110 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2385  00000120 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2386  00000130 - 00 00 00 00 00 00 00 00 19 00 00 00 28 00 00 00 ............(...
2387  00000140 - 00 00 00 00 00 00 00 00 04 00 00 00 28 00 00 00 ............(...
2388  00000150 - 00 00 00 00 00 00 00 00 02 00 00 00 28 00 00 00 ............(...
2389  00000160 - 00 00 00 00 00 00 00 00 0F 00 00 00 3C 00 00 00 ............<...
2390  00000170 - 00 00 00 00 00 00 00 00 10 00 00 00 3C 00 00 00 ............<...
2391  00000180 - 00 00 00 00 00 00 00 00 0B 00 00 00 3C 00 00 00 ............<...
2392  00000190 - 00 00 00 00 00 00 00 00 0C 00 00 00 3C 00 00 00 ............<...
2393  000001A0 - 00 00 00 00 00 00 00 00 01 01 00 00 01 00 00 00 ................
2394  000001B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2395  000001C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2396  000001D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2397  000001E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2398  000001F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2399  00000200 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2400  00000210 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2401  00000220 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2402  00000230 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2403  00000240 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2404  00000250 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2405  00000260 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2406  00000270 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2407  00000280 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2408  00000290 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2409  000002A0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2410  000002B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2411  000002C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2412  000002D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2413  000002E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2414  000002F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2415  00000300 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2416  00000310 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2417  00000320 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2418  00000330 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2419  00000340 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2420  00000350 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2421  00000360 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2422  00000370 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2423  00000380 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2424  00000390 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2425  000003A0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2426  000003B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2427  000003C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2428  000003D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2429  000003E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2430  000003F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2431  00000400 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2432  00000410 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2433  00000420 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2434  00000430 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2435  00000440 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2436  00000450 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2437  00000460 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2438  00000470 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2439  00000480 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2440  00000490 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2441  000004A0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2442  000004B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2443  000004C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2444  000004D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2445  000004E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2446  000004F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2447  00000500 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2448  00000510 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2449  00000520 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2450  00000530 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2451  00000540 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2452  00000550 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2453  00000560 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2454  00000570 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2455  00000580 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2456  00000590 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2457  000005A0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2458  000005B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2459  000005C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2460  000005D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2461  000005E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2462  000005F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2463  00000600 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2464  00000610 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2465  00000620 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2466  00000630 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2467  00000640 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2468  00000650 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2469  00000660 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2470  00000670 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2471  00000680 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2472  00000690 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2473  000006A0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2474  000006B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2475  000006C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2476  000006D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2477  000006E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2478  000006F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2479  00000700 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2480  00000710 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2481  00000720 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2482  00000730 - 00 00 00 00 ....
2483 
2484  this is from a 7940 with Video Advantage on PC Port
2485  00000000 - 08 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 ................
2486  00000010 - 00 00 00 00 22 4B 01 00 0C CC CC CC 00 11 21 F1 ...."K..........
2487  00000020 - 22 4B 00 74 AA AA 03 00 00 0C 20 00 02 B4 B8 67 "K.t...... ....g
2488  00000030 - 00 01 00 13 53 45 50 30 30 31 31 32 31 46 31 32 ....SEP001122334
2489  00000040 - 32 34 42 00 02 00 11 00 00 00 01 01 01 CC 00 04 455.............
2490  00000050 - 0A 0A 0A D2 00 03 00 0A 50 6F 72 74 20 31 00 04 ........Port 1..
2491  00000060 - 00 08 00 00 00 90 00 05 00 10 50 30 30 33 30 38 ..........P00308
2492  00000070 - 30 30 31 30 30 30 00 06 00 17 43 69 73 63 6F 20 001000....Cisco
2493  00000080 - 49 50 20 50 68 6F 6E 65 20 37 39 34 00 00 00 00 IP Phone 794....
2494  00000090 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2495  000000A0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2496  000000B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2497  000000C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2498  000000D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2499  000000E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2500  000000F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2501  00000100 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2502  00000110 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2503  00000120 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2504  00000130 - 00 00 00 00 00 00 00 00 19 00 00 00 78 00 00 00 ............x...
2505  00000140 - 00 00 00 00 00 00 00 00 04 00 00 00 28 00 00 00 ............(...
2506  00000150 - 00 00 00 00 00 00 00 00 02 00 00 00 28 00 00 00 ............(...
2507  00000160 - 00 00 00 00 00 00 00 00 0F 00 00 00 3C 00 00 00 ............<...
2508  00000170 - 00 00 00 00 00 00 00 00 10 00 00 00 3C 00 00 00 ............<...
2509  00000180 - 00 00 00 00 00 00 00 00 0B 00 00 00 3C 00 00 00 ............<...
2510  00000190 - 00 00 00 00 00 00 00 00 0C 00 00 00 3C 00 00 00 ............<...
2511  000001A0 - 00 00 00 00 00 00 00 00 01 01 00 00 04 00 00 00 ................
2512  000001B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2513  000001C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2514  000001D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2515  000001E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2516  000001F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2517  00000200 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2518  00000210 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2519  00000220 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2520  00000230 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2521  00000240 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2522  00000250 - 00 00 00 00 00 00 00 00 65 00 00 00 03 00 00 00 ........e.......
2523  00000260 - 02 00 00 00 32 00 00 00 02 00 00 00 98 3A 00 00 ....2........:..
2524  00000270 - F4 01 00 00 01 00 00 00 00 00 00 00 33 00 00 00 ............3...
2525  00000280 - 03 00 00 00 98 3A 00 00 F4 01 00 00 01 00 00 00 .....:..........
2526  00000290 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2527  000002A0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2528  000002B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2529  000002C0 - 00 00 00 00 00 00 00 00 00 00 00 00 67 00 00 00 ............g...
2530  000002D0 - 03 00 00 00 01 00 00 00 34 00 00 00 03 00 00 00 ........4.......
2531  000002E0 - 98 3A 00 00 F4 01 00 00 01 00 00 00 00 00 00 00 .:..............
2532  000002F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2533  00000300 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2534  00000310 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2535  00000320 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2536  00000330 - 00 00 00 00 00 00 00 00 40 00 00 00 32 00 00 00 ........@...2...
2537  00000340 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2538  00000350 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2539  00000360 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2540  00000370 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2541  00000380 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2542  00000390 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2543  000003A0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2544  000003B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2545  000003C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2546  000003D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2547  000003E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2548  000003F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2549  00000400 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2550  00000410 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2551  00000420 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2552  00000430 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2553  00000440 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2554  00000450 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2555  00000460 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2556  00000470 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2557  00000480 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2558  00000490 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2559  000004A0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2560  000004B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2561  000004C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2562  000004D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2563  000004E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2564  000004F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2565  00000500 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2566  00000510 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2567  00000520 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2568  00000530 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2569  00000540 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2570  00000550 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2571  00000560 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2572  00000570 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2573  00000580 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2574  00000590 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2575  000005A0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2576  000005B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2577  000005C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2578  000005D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2579  000005E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2580  000005F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2581  00000600 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2582  00000610 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2583  00000620 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2584  00000630 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2585  00000640 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2586  00000650 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2587  00000660 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2588  00000670 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2589  00000680 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2590  00000690 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2591  000006A0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2592  000006B0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2593  000006C0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2594  000006D0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2595  000006E0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2596  000006F0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2597  00000700 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2598  00000710 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2599  00000720 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2600  00000730 - 00 00 00 00 ....
2601  */
2602 
2603  struct {
2604  uint32_t lel_audioCapCount; /*!< Audio Capability Count */
2605  uint32_t lel_videoCapCount; /*!< Video Capability Count */
2606  uint32_t lel_dataCapCount; /*!< Data Capability Count */
2607  uint32_t RTPPayloadFormat; /*!< RTP Payload Format */
2608  uint32_t customPictureFormatCount; /*!< Custom Picture Format Count */
2609 
2610  customPictureFormat_t customPictureFormat[MAX_CUSTOM_PICTURES]; /*!< Custom Picture Format */
2611 
2612  uint32_t activeStreamsOnRegistration; /*!< Active Streams on Registration */
2613  uint32_t maxBW; /*!< Max BW ?? */
2614 
2615  uint32_t serviceResourceCount; /*!< Service Resource Count */
2616  serviceResource_t serviceResource[MAX_SERVICE_TYPE]; /*!< Service Resource */
2617 
2618  audioCap_t audioCaps[SKINNY_MAX_CAPABILITIES]; /*!< Audio Capabilities */
2619  videoCap_t videoCaps[SKINNY_MAX_VIDEO_CAPABILITIES]; /*!< Video Capabilities */
2620  dataCap_t dataCaps[SKINNY_MAX_DATA_CAPABILITIES]; /*!< Data Capabilities */
2621 
2622  uint32_t unknown; /*!< Unknown */
2623  } UpdateCapabilitiesMessage; /*!< Update Capabilities Message Structure */
2624 
2625  struct {
2626  uint32_t receptionStatus; /*!< Reception Status */
2627  uint32_t passThruPartyID; /*!< Pass Through Party ID */
2628  } MulticastMediaReceptionAck; /*!< Multicast Media Reception Acknowledgement Message - Client -> Server */
2629 
2630  struct {
2631  uint32_t lel_orcStatus; /*!< receiveChanStatus */
2632  uint32_t bel_ipAddr; /*!< This field is apparently in big-endian format,
2633  even though most other fields are in
2634  little-endian format. */
2635  uint32_t lel_portNumber; /*!< Port Number */
2636  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
2637  uint32_t lel_callReference; /*!< Call Reference */
2638  } OpenReceiveChannelAck; /*!< Open Receive Channel Acknowledgement */
2639 
2640  /* this is v17 open receive channel ack
2641  * 0000 28 00 00 00 11 00 00 00 22 00 00 00 ST AT US xx (.......".......
2642  * 0010 00 00 00 00 IP IP IP IP 00 00 00 00 00 00 00 00 ......."........
2643  * 0020 00 00 00 00 3a 4c 00 00 53 00 00 01 54 ae 9d 01 ....:L..S...T...
2644  */
2645 
2646  struct {
2647  uint32_t lel_orcStatus; /*!< Receive Channel Status */
2648  uint32_t lel_unknown1; /*!< I think this switches from IPv4 to IPv6 (0x00 in IPv4) */
2649  /* include IPv6 support */
2650  char bel_ipAddr[16]; /*!< This field is apparently in big-endian format,
2651  even though most other fields are in
2652  little-endian format. */
2653  uint32_t lel_portNumber; /*!< Port Number */
2654  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
2655  uint32_t lel_callReference; /*!< Call Reference */
2656  } OpenReceiveChannelAck_v17; /*!< Open Receive Channel Acknowledgement v17 */
2657 
2658  struct {
2659  uint32_t lel_orcStatus; /*!< receiveChanStatus */
2660  uint32_t bel_ipAddr; /*!< This field is apparently in big-endian format,
2661  even though most other fields are in
2662  little-endian format. */
2663  uint32_t lel_portNumber;
2664  uint32_t lel_passThruPartyId;
2665  uint32_t lel_callReference;
2666 
2668 
2669  struct {
2670  uint32_t lel_orcStatus; /*!< status */
2671  uint32_t lel_unknown1; /*!< I think this switches from IPv4 to IPv6 (0x00 in IPv4) */
2672  /* include IPv6 support */
2673  char bel_ipAddr[16]; /*!< This field is apparently in big-endian format,
2674  even though most other fields are in
2675  little-endian format. */
2676  uint32_t lel_portNumber;
2677  uint32_t lel_passThruPartyId;
2678  uint32_t lel_callReference;
2679 
2680  } OpenMultiMediaReceiveChannelAckMessage_v17;
2681 
2682  struct {
2683  char DirectoryNumber[StationMaxDirnumSize]; /*!< Directory Number */
2684  uint32_t lel_CallIdentifier; /*!< Call Identifier */
2685  uint32_t lel_StatsProcessingType; /*!< Stats Processing Type */
2686  uint32_t lel_SentPackets; /*!< Sent Packets */
2687  uint32_t lel_SentOctets; /*!< Sent Octets */
2688  uint32_t lel_RecvdPackets; /*!< Received Packets */
2689  uint32_t lel_RecvdOctets; /*!< Received Octets */
2690  uint32_t lel_LostPkts; /*!< Lost Packets */
2691  uint32_t lel_Jitter; /*!< Jitter */
2692  uint32_t lel_latency; /*!< Latency */
2693  } ConnectionStatisticsRes; /*!< Connection Statistics Response Message - Server -> Client */
2694 
2695  struct {
2696  char DirectoryNumber[28]; /*!< Directory Number */
2697  uint32_t lel_CallIdentifier; /*!< Call Identifier */
2698 // uint32_t lel_StatsProcessingType; /*!< Stats Processing Type */
2699  uint32_t lel_SentPackets; /*!< Sent Packets */
2700  uint32_t lel_SentOctets; /*!< Sent Octets */
2701  uint32_t lel_RecvdPackets; /*!< Received Packets */
2702  uint32_t lel_RecvdOctets; /*!< Received Octets */
2703  uint32_t lel_LostPkts; /*!< Lost Packets */
2704  uint32_t lel_Jitter; /*!< Jitter */
2705  uint32_t lel_latency; /*!< Latency */
2706  uint8_t bytes[2]; /*!< Latency */
2707  } ConnectionStatisticsRes_V19; /*!< Connection Statistics Response Message - Client -> Server (used when protocol version >= 19) */
2708 
2709  struct {
2710  char calledParty[StationMaxDirnumSize]; /*!< Called Party Array */
2711  } OffHookWithCgpnMessage; /*!< Off Hook With Calling Party Name Message Structure */
2712 
2713  struct {
2714  } SoftKeySetReqMessage; /*!< Soft Key Set Request Message Structure */
2715 
2716  struct {
2717  uint32_t lel_softKeyEvent; /*!< Soft Key Event */
2718  uint32_t lel_lineInstance; /*!< Line Instance on device (indicated callplane) */
2719  uint32_t lel_callReference; /*!< Call Reference ID */
2721 
2722  struct {
2723  } UnregisterMessage; /*!< Unregister Message Structure */
2724 
2725  struct {
2726  } SoftKeyTemplateReqMessage; /*!< Soft Key Template Request Message Structure */
2727 
2728  struct {
2729  StationIdentifier sId; /*!< Station Identifier */
2730  uint32_t lel_stationIpAddr; /*!< Station IP Address */
2731  uint32_t lel_deviceType; /*!< Device Type as part of SKINNY_DEVICETYPE_* */
2732  char ipv6Address[16];
2733  uint32_t unknown;
2734  } RegisterTokenRequest; /*!< Register Token Request */
2735 
2736  struct {
2737  uint32_t lel_conferenceId; /*!< Conference ID */
2738  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
2739  uint32_t bel_remoteIpAddr; /*!< This field is apparently in big-endian */
2740  uint32_t lel_remotePortNumber; /*!< Remote Port Number */
2741  uint32_t lel_callRef; /*!< Call Reference */
2743 
2744  struct {
2745  uint32_t lel_hsMode; /*!< Head Set Mode */
2746  } HeadsetStatusMessage; /*!< Headset Status Message Structure */
2747 
2748  struct {
2749  uint32_t lel_keepAliveInterval; /*!< Keep Alive Interval to the Primary Server */
2750  char dateTemplate[StationDateTemplateSize]; /*!< Date Template */
2751  uint8_t filler1; /*!< Filler 1 */
2752  uint8_t filler2; /*!< Filler 2 */
2753  uint32_t lel_secondaryKeepAliveInterval; /*!< Keep Alive Interval to the Secundairy Server */
2754  uint8_t protocolVer; /*!< Protocol Version */
2755  uint8_t unknown1; /*!< Unknown */
2756  uint8_t unknown2; /*!< Unknown */
2757  uint8_t unknown3; /*!< Unknown */
2758  } RegisterAckMessage; /*!< Register Acknowledgement Message Structure */
2759 
2760  struct {
2761  uint32_t lel_tone; /*!< Tone */
2762  uint32_t lel_toneTimeout; /*!< Tone Timeout */
2763  uint32_t lel_lineInstance; /*!< Line Instance */
2764  uint32_t lel_callReference; /*!< Call Reference */
2765  } StartToneMessage; /*!< Start Tone Message Structure */
2766 
2767  struct {
2768  uint32_t lel_lineInstance; /*!< Line Instance */
2769  uint32_t lel_callReference; /*!< Call Reference */
2770  /* protocol v12 mod */
2771  uint32_t lel_unknown1; /*!< Unknown */
2772  } StopToneMessage;
2773 
2774  struct {
2775  uint32_t lel_ringMode; /*!< Ring Mode */
2776  uint32_t lel_unknown1; /*!< Unknown (always 1) */
2777  uint32_t lel_lineInstance; /*!< Line Instance */
2778  uint32_t lel_callReference; /*!< Call Reference */
2779  } SetRingerMessage; /*!< Set Ringer Message Structure */
2780 
2781  struct {
2782  uint32_t lel_stimulus; /*!< Stimulus */
2783  uint32_t lel_stimulusInstance; /*!< Stimulus Instance */
2784  uint32_t lel_lampMode; /*!< Lamp Mode (MWI) */
2785  } SetLampMessage; /*!< Set Lamp Message Structure */
2786 
2787  struct {
2788  } SetHkFDetectMessage; /*!< Set Hkf Detect Message Structure */
2789 
2790  struct {
2791  uint32_t lel_speakerMode; /*!< Spreaker Mode */
2792  } SetSpeakerModeMessage; /*!< Set Speaker Mode Message Structure */
2793 
2794  struct {
2795  uint32_t lel_micMode; /*!< Microphone Mode */
2796  } SetMicroModeMessage; /*!< Set Microphone Mode Message Structure */
2797 
2798  struct {
2799  uint32_t lel_conferenceId; /*!< Conference ID */
2800  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
2801  uint32_t bel_remoteIpAddr; /*!< This field is apparently in big-endian
2802  format, even though most other fields are
2803  little-endian. */
2804  uint32_t lel_remotePortNumber; /*!< Remote Port Number */
2805  uint32_t lel_millisecondPacketSize; /*!< Packet Size per MilliSecond */
2806  uint32_t lel_payloadType; /*!< Media_PayloadType */
2807  uint32_t lel_precedenceValue; /*!< Precedence Value */
2808  uint32_t lel_ssValue; /*!< Simple String Value */
2809  uint32_t lel_maxFramesPerPacket; /*!< Maximum Frames per Packet */
2810  uint32_t lel_g723BitRate; /*!< only used with G.723 payload */
2811  uint32_t lel_conferenceId1; /*!< Conference ID 1 */
2812  uint32_t unknown1; /*!< Unknown */
2813  uint32_t unknown2; /*!< Unknown */
2814  uint32_t unknown3; /*!< Unknown */
2815  uint32_t unknown4; /*!< Unknown */
2816  uint32_t unknown5; /*!< Unknown */
2817  uint32_t unknown6; /*!< Unknown */
2818  uint32_t unknown7; /*!< Unknown */
2819  uint32_t unknown8; /*!< Unknown */
2820  uint32_t unknown9; /*!< Unknown */
2821  uint32_t unknown10; /*!< Unknown */
2822  /* protocol v11 mods */
2823  uint32_t unknown11; /*!< Unknown */
2824  uint32_t unknown12; /*!< Unknown */
2825  uint32_t unknown13; /*!< Unknown */
2826  uint32_t unknown14; /*!< Unknown */
2827  uint32_t lel_rtpDTMFPayload; /*!< RTP DTMP PayLoad (this is often set to 0x65 (101)) */
2828  uint32_t lel_rtptimeout; /*!< RTP TimeOut */
2829  /* protocol v11 fields */
2830  uint32_t unknown15;
2831  uint32_t unknown16;
2833 
2834  /* StartMediaTransmission v17
2835  * 0000 88 00 00 00 11 00 00 00 8a 00 00 00 54 ae 9d 01 ............T...
2836  * 0010 53 00 00 01 00 00 00 00 c0 a8 09 2c 00 00 00 00 S..........,....
2837  * 0020 00 00 00 00 00 00 00 00 c6 4c 00 00 14 00 00 00 .........L......
2838  * 0030 04 00 00 00 b8 00 00 00 00 00 00 00 00 00 00 00 ................
2839  * 0040 00 00 00 00 54 ae 9d 01 00 00 00 00 00 00 00 00 ....T...........
2840  * 0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2841  * 0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2842  * 0070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2843  * 0080 00 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 00 ................
2844  */
2845 
2846  struct {
2847  uint32_t lel_conferenceId; /*!< Conference ID */
2848  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
2849  uint32_t lel_unknown1; /*!< Unknown */
2850  char bel_remoteIpAddr[16]; /*!< This field is apparently in big-endian
2851  format, even though most other fields are
2852  little-endian. */
2853  uint32_t lel_remotePortNumber; /*!< Remote Port Number */
2854  uint32_t lel_millisecondPacketSize; /*!< Packet Size per Millisecond */
2855  uint32_t lel_payloadType; /*!< Media_PayloadType */
2856  uint32_t lel_precedenceValue; /*!< Precedence Value */
2857  uint32_t lel_ssValue; /*!< Simple String Value */
2858  uint32_t lel_maxFramesPerPacket; /*!< Maximum Frames per Packet */
2859  uint32_t lel_g723BitRate; /*!< G.723 BitRate (only used with G.723 payload) */
2860  uint32_t lel_conferenceId1; /*!< Conference ID 1 */
2861  uint32_t lel_unknown2; /*!< Unknown */
2862  uint32_t lel_unknown3; /*!< Unknown */
2863  uint32_t lel_unknown4; /*!< Unknown */
2864  uint32_t lel_unknown5; /*!< Unknown */
2865  uint32_t lel_unknown6; /*!< Unknown */
2866  uint32_t lel_unknown7; /*!< Unknown */
2867  uint32_t lel_unknown8; /*!< Unknown */
2868  uint32_t lel_unknown9; /*!< Unknown */
2869  uint32_t lel_unknown10; /*!< Unknown */
2870  uint32_t lel_unknown11; /*!< Unknown */
2871  uint32_t lel_unknown12; /*!< Unknown */
2872  uint32_t lel_unknown13; /*!< Unknown */
2873  uint32_t lel_unknown14; /*!< Unknown */
2874  uint32_t lel_unknown15; /*!< Unknown */
2875  uint32_t lel_rtpDTMFPayload; /*!< RTP DTMP PayLoad (this is often set to 0x65 (101)) */
2876  uint32_t lel_rtptimeout; /*!< RTP Timeout (this is set to 0x0A) */
2877  uint32_t lel_unknown18; /*!< Unknown */
2878  uint32_t lel_unknown19; /*!< Unknown */
2879  } StartMediaTransmission_v17; /*!< Start Media Transmission v17 Structure */
2880 
2881  struct {
2882  uint32_t lel_conferenceId; /*!< Conference ID */
2883  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
2884  uint32_t lel_conferenceId1; /*!< Conference ID 1 */
2885  uint32_t lel_unknown1; /*!< Unknown (proto v17) */
2886  } StopMediaTransmission; /*!< Stop Media Transmission Structure */
2887 
2888  struct {
2889  uint32_t lel_conferenceId; /*!< Conference ID */
2890  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
2891  uint32_t lel_conferenceId1; /*!< Conference ID 1 */
2892  uint32_t lel_unknown1; /*!< Unknown (proto v17) */
2894 
2895  struct {
2897 
2898  struct {
2899  uint32_t lel_conferenceId; /*!< Conference ID 1 */
2900  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
2901  } StopMediaReception; /*!< Stop Media Reception Structure */
2902 
2903  struct {
2904  char callingPartyName[StationMaxNameSize]; /*!< Calling Party Name */
2905  char callingParty[StationMaxDirnumSize]; /*!< Calling Party ID */
2906  char calledPartyName[StationMaxNameSize]; /*!< Called Party Name */
2907  char calledParty[StationMaxDirnumSize]; /*!< Called Party ID */
2908  uint32_t lel_lineId; /*!< Line ID */
2909  uint32_t lel_callRef; /*!< Call Reference */
2910  uint32_t lel_callType; /*!< Call Type (INBOUND=1, OUTBOUND=2, FORWARD=3) */
2911  char originalCalledPartyName[StationMaxNameSize]; /*!< Original Calling Party Name */
2912  char originalCalledParty[StationMaxDirnumSize]; /*!< Original Calling Party ID */
2913  char lastRedirectingPartyName[StationMaxNameSize]; /*!< Original Called Party Name */
2914  char lastRedirectingParty[StationMaxDirnumSize]; /*!< Original Called Party ID */
2915  uint32_t originalCdpnRedirectReason; /*!< Original Called Party Redirect Reason */
2916  uint32_t lastRedirectingReason; /*!< Last Redirecting Reason */
2917  char cgpnVoiceMailbox[StationMaxDirnumSize]; /*!< Calling Party Voicemail Box */
2918  char cdpnVoiceMailbox[StationMaxDirnumSize]; /*!< Called Party Voicemail Box */
2919  char originalCdpnVoiceMailbox[StationMaxDirnumSize]; /*!< Original Called Party VoiceMail Box */
2920  char lastRedirectingVoiceMailbox[StationMaxDirnumSize]; /*!< Last Redirecting VoiceMail Box */
2921  uint32_t lel_callInstance; /*!< Call Instance */
2922  uint32_t lel_callSecurityStatus; /*!< Call Security Status */
2923  uint32_t partyPIRestrictionBits; /*!< Party PI Restriction Bits (
2924  0 RestrictCallingPartyName
2925  1 RestrictCallingPartyNumber
2926  2 RestrictCalledPartyName
2927  3 RestrictCalledPartyNumber
2928  4 RestrictOriginalCalledPartyName
2929  5 RestrictOriginalCalledPartyNumber
2930  6 RestrictLastRedirectPartyName
2931  7 RestrictLastRedirectPartyNumber) */
2932  } CallInfoMessage; /*!< Call Info Message Structure */
2933 
2934  struct {
2935  char calledParty[StationMaxDirnumSize]; /*!< Called Party */
2936  uint32_t lel_lineId; /*!< Line ID */
2937  uint32_t lel_callRef; /*!< Call Reference */
2938  } DialedNumberMessage; /*!< Dialed Number Message Structure */
2939 
2940  struct {
2941  char calledParty[25]; /*!< Called Party */
2942  uint32_t lel_lineId; /*!< Line ID */
2943  uint32_t lel_callRef; /*!< Call Reference */
2944  uint8_t padding1[3];
2945  } DialedNumberMessageV19; /*!< Dialed Number Message Structure -TEST */
2946 
2947  struct {
2948  uint32_t lel_status; /*!< Status (0=inactive, 1=active) */
2949  uint32_t lel_lineNumber; /*!< Line Number */
2950  uint32_t lel_cfwdallstatus; /*!< Call Forward All Status */
2951  char cfwdallnumber[StationMaxDirnumSize]; /*!< Call Forward All Number */
2952  uint32_t lel_cfwdbusystatus; /*!< Call Forward on Busy Status */
2953  char cfwdbusynumber[StationMaxDirnumSize]; /*!< Call Forward on Busy Number */
2954  uint32_t lel_cfwdnoanswerstatus; /*!< Call Forward on No-Answer Status */
2955  char cfwdnoanswernumber[StationMaxDirnumSize]; /*!< Call Forward on No-Answer Number */
2956  } ForwardStatMessage; /*!< Forward Status Message Structure */
2957 
2958  struct {
2959  uint32_t lel_status; /*!< Status (0=inactive, 1=active) */
2960  uint32_t lel_lineNumber; /*!< Line Number */
2961  uint32_t lel_cfwdallstatus; /*!< Call Forward All Status */
2962  char cfwdallnumber[StationMaxDirnumSize]; /*!< Call Forward All Number */
2963  uint32_t lel_cfwdbusystatus; /*!< Call Forward on Busy Status */
2964  char cfwdbusynumber[StationMaxDirnumSize]; /*!< Call Forward on Busy Number */
2965  uint32_t lel_cfwdnoanswerstatus; /*!< Call Forward on No-Answer Status */
2966  char cfwdnoanswernumber[StationMaxDirnumSize]; /*!< Call Forward on No-Answer Number */
2967  uint32_t lel_unknown; /*!< 00 00 00 ff */
2968  } ForwardStatMessageV19; /*!< Forward Status Message Structure */
2969 
2970  struct {
2971  uint32_t lel_speedDialNumber; /*!< SpeedDial Number */
2972  char speedDialDirNumber[StationMaxDirnumSize]; /*!< SpeedDial Dir Number */
2973  char speedDialDisplayName[StationMaxNameSize]; /*!< SpeedDial Display Name */
2974  } SpeedDialStatMessage; /*!< SpeedDial Status Message Structure */
2975 
2976  struct {
2977  uint32_t lel_lineNumber; /*!< Line Number */
2978  char lineDirNumber[StationMaxDirnumSize]; /*!< Line Dir Number */
2979  char lineFullyQualifiedDisplayName[StationMaxNameSize]; /*!< Line Fully Qualified Display Name */
2980  char lineDisplayName[StationMaxButtonTemplateNameSize]; /*!< Line Display Name */
2981  } LineStatMessage; /*!< Line Status Messages Structure */
2982 
2983  struct {
2984  uint32_t lel_year; /*!< Year */
2985  uint32_t lel_month; /*!< Month */
2986  uint32_t lel_dayOfWeek; /*!< Day of the Week (\todo Starting su=0|1) */
2987  uint32_t lel_day; /*!< Day */
2988  uint32_t lel_hour; /*!< Hour */
2989  uint32_t lel_minute; /*!< Minute */
2990  uint32_t lel_seconds; /*!< Seconds */
2991  uint32_t lel_milliseconds; /*!< MilliSeconds */
2992  uint32_t lel_systemTime; /*!< System Time */
2993  } DefineTimeDate; /*!< Definition of Date/Time Structure */
2994 
2995  struct {
2996  } StartSessionTransmission; /*!< Start Session Transmission Structure */
2997  struct {
2998  } StopSessionTransmission; /*!< Stop Session Transmission Structure */
2999 
3000  struct {
3001  uint32_t lel_buttonOffset; /*!< Button OffSet */
3002  uint32_t lel_buttonCount; /*!< Button Count */
3003  uint32_t lel_totalButtonCount; /*!< Total Number of Buttons */
3004  StationButtonDefinition definition[StationMaxButtonTemplateSize]; /*!< Station Button Definition */
3005  } ButtonTemplateMessage; /*!< Button Template Message Structure */
3006 
3007  struct {
3008  uint32_t lel_buttonOffset; /*!< Button OffSet */
3009  uint32_t lel_buttonCount; /*!< Button Count */
3010  uint32_t lel_totalButtonCount; /*!< Total Number of Buttons */
3011  StationButtonDefinition definition[1]; /*!< Station Button Definition */
3012  } ButtonTemplateMessageSingle; /*!< Button Template Message Structure */
3013 
3014  struct {
3015  char requiredVersion[StationMaxVersionSize]; /*!< Required Version */
3016  } VersionMessage; /*!< Version Message Structure */
3017 
3018  struct {
3019  char displayMessage[StationMaxDisplayTextSize]; /*!< Display Message */
3020  /* uint32_t lel_displayTimeout; *//*!< Display Timeout */
3021  } DisplayTextMessage; /*!< Display Text Message */
3022 
3023  struct {
3024  uint32_t unknown;
3025  } ClearDisplay;
3026 
3027  struct {
3028  } CapabilitiesReqMessage; /*!< Capabilities Reqest Message Structure */
3029  struct {
3030  } EnunciatorCommandMessage; /*!< Enunciator Command Message Structure */
3031 
3032  struct {
3033  char text[StationMaxDisplayTextSize]; /*!< Rejection Text */
3034  } RegisterRejectMessage; /*!< Register Reject Message Structure */
3035 
3036  struct {
3037  ServerIdentifier server[StationMaxServers]; /*!< Server Identifier */
3038  uint32_t serverListenPort[StationMaxServers]; /*!< Server is Listening on Port */
3039  uint32_t serverIpAddr[StationMaxServers]; /*!< Server IP Port */
3040  } ServerResMessage; /*!< Server Result Message Structure */
3041 
3042  struct {
3043  uint32_t lel_resetType; /*!< Reset Type (1=Reset, 2=Restart) */
3044  } Reset; /*!< Reset Message Structure */
3045 
3046  struct {
3047  } KeepAliveAckMessage; /*!< Keep Aliver Acknowledgement Message Structure */
3048 
3049  struct {
3050  uint32_t lel_conferenceID; /*!< Conference ID */
3051  uint32_t lel_passThruPartyID; /*!< Pass Through Party ID */
3052  uint32_t lel_multicastIpAddress; /*!< Multicast IP Address */
3053  uint32_t lel_multicastPort; /*!< Multicast Port */
3054  uint32_t lel_millisecondPacketSize; /*!< Millisecond Packet Size */
3055  skinny_codec_t lel_payloadCapability; /*!< PayLoad Capability */
3056  uint32_t lel_echoCancelType; /*!< Echo Cancelation Type */
3057  uint32_t lel_g723BitRate; /*!< G.723 Bit Rate (only applies to G.723 */
3058  } StartMulticastMediaReception; /*!< Start Multicast Media Reception Message Structure */
3059 
3060  struct {
3061  uint32_t lel_conferenceID; /*!< Conference ID */
3062  uint32_t lel_passThruPartyID; /*!< Pass Through Party ID */
3063  uint32_t lel_multicastIpAddress; /*!< Multicast IP Address */
3064  uint32_t lel_multicastPort; /*!< Multicast Port */
3065  uint32_t lel_millisecondPacketSize; /*!< Millisecond Packet Size */
3066  skinny_codec_t lel_payloadCapability; /*!< PayLoad Capability */
3067  uint32_t lel_precedenceValue; /*!< Precedence Value */
3068  uint32_t lel_silenceSuppression; /*!< Silence Suppression */
3069  uint32_t lel_maxFramesPerPacket; /*!< Max Frames Per Packet */
3070  uint32_t lel_g723BitRate; /*!< G.723 Bit Rate (only applies to G.723 */
3071  } StartMulticastMediaTransmission; /*!< Start Multicast Media Transmission Message Structure */
3072 
3073  /*
3074  * based on miscCommandType we have other struct
3075  * following the Miscellaneous Command Message
3076  */
3077 
3078  struct {
3079  uint32_t lel_conferenceId; /*!< Conference ID */
3080  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3081  uint32_t lel_callReference; /*!< Call Reference */
3082  uint32_t lel_miscCommandType; /*!< Miscellaneous Command Type */
3083  union {
3084  uint32_t unknown[10];
3085  struct {
3086  uint32_t bel_remoteIpAddr;
3087  uint32_t unknown1;
3088  uint32_t unknown2;
3089  uint32_t unknown3;
3090  uint32_t unknown4;
3091  uint32_t lel_value1;
3092  uint32_t lel_value2;
3093  uint32_t lel_value3;
3094  uint32_t lel_value4;
3095  } videoFastUpdatePicture;
3096 
3097  struct {
3098  uint32_t lel_firstGOB;
3100  } videoFastUpdateGOB;
3101 
3102  struct {
3103  uint32_t lel_firstGOB;
3104  uint32_t lel_firstMB;
3106  } videoFastUpdateMB;
3107 
3108  struct {
3111  } lostPicture;
3112 
3113  struct {
3114  uint32_t lel_pictureNumber;
3115  uint32_t lel_longTermPictureIndex;
3116  uint32_t lel_firstMB;
3117  uint32_t lel_numberOfMBs;
3118  } lostPartialPicture;
3119  } data;
3120  } MiscellaneousCommandMessage; /*!< Miscellaneous Command Message Structure */
3121 
3122  struct {
3123  uint32_t lel_conferenceID; /*!< Conference ID */
3124  uint32_t lel_passThruPartyID; /*!< Pass Through Party ID */
3125  } StopMulticastMediaReception; /*!< Stop Multicast Media Reception Message Structure */
3126 
3127  struct {
3128  uint32_t lel_conferenceID; /*!< Conference ID */
3129  uint32_t lel_passThruPartyID; /*!< Pass Through Party ID */
3130  } StopMulticastMediaTransmission; /*!< Stop Multicast Media Transmission Message Structure */
3131 
3132  /* this is v11 message from ccm7
3133  * 0000 60 00 00 00 00 00 00 00 05 01 00 00 5b ae 9d 01 `...........[...
3134  * 0010 5a 00 00 01 14 00 00 00 04 00 00 00 00 00 00 00 Z...............
3135  * 0020 00 00 00 00 5b ae 9d 01 00 00 00 00 00 00 00 00 ....[...........
3136  * 0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
3137  * 0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
3138  * 0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
3139  * 0060 00 00 00 00 0a 00 00 00 ........
3140  */
3141 
3142  struct {
3143  uint32_t lel_conferenceId; /*!< Conference ID */
3144  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3145  uint32_t lel_millisecondPacketSize; /*!< Millisecond Packet Size */
3146  uint32_t lel_payloadType; /*!< Media_Payload Type */
3147  uint32_t lel_vadValue; /*!< VAD Value */
3148  uint32_t lel_g723BitRate; /*!< G.723 Payload (Only applies to G.723) */
3149  /* protocol version 5 fields */
3150  uint32_t lel_conferenceId1; /*!< Conference ID */
3151  uint32_t unknown1; /*!< Unknown */
3152  uint32_t unknown2; /*!< Unknown */
3153  uint32_t unknown3; /*!< Unknown */
3154  uint32_t unknown4; /*!< Unknown */
3155  uint32_t unknown5; /*!< Unknown */
3156  uint32_t unknown6; /*!< Unknown */
3157  uint32_t unknown7; /*!< Unknown */
3158  uint32_t unknown8; /*!< Unknown */
3159  uint32_t unknown9; /*!< Unknown */
3160  uint32_t unknown10; /*!< Unknown */
3161  /* protocol version 11 fields */
3162  uint32_t unknown11; /*!< Unknown */
3163  uint32_t unknown12; /*!< Unknown */
3164  uint32_t unknown13; /*!< Unknown */
3165  uint32_t unknown14; /*!< Unknown */
3166  uint32_t lel_rtpDTMFPayload; /*!< RTP DTMF PayLoad (this is often set to 0x65 (101)) */
3167  uint32_t lel_rtptimeout; /*!< RTP Timeout (this is always 0x0A) */
3168  /* protocol version 15 fields */
3169  uint32_t unknown15;
3170  uint32_t unknown16;
3171  char bel_remoteIpAddr[16];
3172  uint32_t lel_unknown17; /*!< this is always 0xFA0 */
3173  } OpenReceiveChannel; /*!< Open Receive Channel Message Structure */
3174 
3175  /* OpenReceiveChannel v17
3176  * 0000 84 00 00 00 11 00 00 00 05 01 00 00 ec bc 68 01 ..............h.
3177  * 0010 07 00 00 01 14 00 00 00 04 00 00 00 00 00 00 00 ................
3178  * 0020 00 00 00 00 ec bc 68 01 00 00 00 00 00 00 00 00 ......h.........
3179  * 0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
3180  * 0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
3181  * 0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
3182  * 0060 00 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 00 ................
3183  * 0070 00 00 00 00 c0 a8 09 2c 00 00 00 00 00 00 00 00 .......,........
3184  * 0080 00 00 00 00 a0 0f 00 00 00 00 00 00 ............
3185  */
3186 
3187  struct {
3188  uint32_t lel_conferenceId; /*!< Conference ID */
3189  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3190  uint32_t lel_millisecondPacketSize; /*!< Millisecond Packet Size */
3191  uint32_t lel_payloadType; /*!< Media_Payload Type */
3192  uint32_t lel_vadValue; /*!< VAD Value */
3193  uint32_t lel_g723BitRate; /*!< G.723 Payload (Only applies to G.723) */
3194  /* protocol version 5 fields */
3195  uint32_t lel_conferenceId1; /*!< Conference ID */
3196  uint32_t unknown1; /*!< Unknown */
3197  uint32_t unknown2; /*!< Unknown */
3198  uint32_t unknown3; /*!< Unknown */
3199  uint32_t unknown4; /*!< Unknown */
3200  uint32_t unknown5; /*!< Unknown */
3201  uint32_t unknown6; /*!< Unknown */
3202  uint32_t unknown7; /*!< Unknown */
3203  uint32_t unknown8; /*!< Unknown */
3204  uint32_t unknown9; /*!< Unknown */
3205  uint32_t unknown10; /*!< Unknown */
3206  uint32_t unknown11; /*!< Unknown */
3207  uint32_t unknown12; /*!< Unknown */
3208  uint32_t unknown13; /*!< Unknown */
3209  uint32_t unknown14; /*!< Unknown */
3210  uint32_t lel_rtpDTMFPayload; /*!< RTP DTMF PayLoad (this is often set to 0x65 (101)) */
3211  uint32_t lel_rtptimeout; /*!< RTP Timeout (this is always 0x0A) */
3212  uint32_t unknown17; /*!< Unknown */
3213  uint32_t unknown18; /*!< Unknown */
3214  uint32_t unknown19; /*!< Unknown */
3215  char bel_remoteIpAddr[16]; /*!< Remote IP Address */
3216  uint32_t lel_unknown20; /*!< Unknown (this is always 0xFA0) */
3217  uint32_t unknown21; /*!< Unknown */
3218  } OpenReceiveChannel_v17; /*!< Open Receive Channel Message Structure v17 */
3219 
3220  struct {
3221  uint32_t lel_conferenceId; /*!< Conference ID */
3222  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3223  /* version 5 fields */
3224  uint32_t lel_conferenceId1; /*!< Conference ID 1 */
3225  } CloseReceiveChannel; /*!< Close Receive Channel */
3226 
3227  struct {
3228  uint32_t lel_conferenceId; /*!< Conference ID */
3229  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3230  /* version 5 fields */
3231  uint32_t lel_conferenceId1; /*!< Conference ID 1 */
3233 
3234  struct { // Request Statistics from Phone
3235  char DirectoryNumber[StationMaxDirnumSize]; /*!< Directory Number */
3236  uint32_t lel_callReference; /*!< Call Reference */
3237  uint32_t lel_StatsProcessing; /*!< Statistics Processing */
3238  } ConnectionStatisticsReq; /*!< Connection Statistics Request Message Structure */
3239 
3240  struct { // Request Statistics from Phone
3241  char DirectoryNumber[StationMaxDirnumSize]; /*!< Directory Number */
3242  uint8_t byte;
3243  uint32_t lel_callReference; /*!< Call Reference */
3244  uint32_t lel_StatsProcessing; /*!< Statistics Processing */
3245  } ConnectionStatisticsReq_V19; /*!< Connection Statistics Request Message Structure */
3246 
3247  struct {
3248  uint32_t lel_softKeyOffset; /*!< Soft Key Off Set */
3249  uint32_t lel_softKeyCount; /*!< Soft Key Count */
3250  uint32_t lel_totalSoftKeyCount; /*!< Total Number of Soft Keys */
3251  StationSoftKeyDefinition definition[1]; /*!< Station Soft Key Definition (dummy) */
3252  } SoftKeyTemplateResMessage; /*!< Soft Key Template Result Message Structure */
3253 
3254  struct {
3255  uint32_t lel_softKeySetOffset; /*!< Soft Key Off Set */
3256  uint32_t lel_softKeySetCount; /*!< Soft Key Count */
3257  uint32_t lel_totalSoftKeySetCount; /*!< Total Number of Soft Keys */
3258  StationSoftKeySetDefinition definition[StationMaxSoftKeySetDefinition]; /*!< Station Soft Key Definition */
3259  } SoftKeySetResMessage; /*!< Soft Key Set Result Message Structure */
3260 
3261  struct {
3262  uint32_t lel_lineInstance; /*!< Line Instance */
3263  uint32_t lel_callReference; /*!< Call Reference */
3264  uint32_t lel_softKeySetIndex; /*!< Soft Key Set Index */
3265  uint32_t les_validKeyMask; /*!< Valid Key Mask */
3266  } SelectSoftKeysMessage; /*!< Select Soft Keys Message Structure */
3267 
3268  struct {
3269  uint32_t lel_callState; /*!< Call State */
3270  uint32_t lel_lineInstance; /*!< Line Instance */
3271  uint32_t lel_callReference; /*!< Call Reference */
3272  uint32_t lel_visibility; /*!< Visibility */
3273  uint32_t lel_priority; /*!< Priority */
3274  uint32_t lel_unknown3; /*!< Unknown */
3275  } CallStateMessage; /*!< Call State Message Structure */
3276 
3277  struct {
3278  uint32_t lel_messageTimeout; /*!< Message Timeout */
3279  char promptMessage[32]; /*!< Prompt Message (Max Lenght 32) */
3280  uint32_t lel_lineInstance; /*!< Line Instance */
3281  uint32_t lel_callReference; /*!< Call Reference */
3282  } DisplayPromptStatusMessage; /*!< Display Prompt Status Message Structure */
3283 
3284  struct {
3285  uint32_t lel_lineInstance; /*!< Line Instance */
3286  uint32_t lel_callReference; /*!< Call Reference */
3287  } ClearPromptStatusMessage; /*!< Clear Prompt Status Message Structure */
3288 
3289  struct {
3290  uint32_t lel_displayTimeout; /*!< Display Timeout */
3291  char displayMessage[StationMaxDisplayNotifySize]; /*!< Display Message */
3292  } DisplayNotifyMessage; /*!< Display Notify Message Structure */
3293 
3294  struct {
3295  } ClearNotifyMessage; /*!< Clear Notify Message Structure */
3296 
3297  /* 0x11F FeatureStatMessage */
3298  struct {
3299  uint32_t lel_featureInstance; /*!< Feature Instance */
3300  uint32_t lel_featureID; /*!< Feature ID */
3301  char featureTextLabel[StationMaxNameSize]; /*!< Feature Text Label */
3302  uint32_t lel_featureStatus; /*!< Feature Status */
3303  } FeatureStatMessage; /*!< Feature Status Message Structure */
3304 
3305  struct {
3306  uint32_t lel_serviceURLIndex; /*!< Service URL Index */
3307  char URL[StationMaxServiceURLSize]; /*!< Actual URL */
3308  char label[StationMaxNameSize]; /*!< Label */
3309  } ServiceURLStatMessage; /*!< Service URL Stat Message Structure */
3310 
3311  struct { // Used Above Protocol 7 */
3312  uint32_t lel_serviceURLIndex; /*!< Service URL Index */
3313  uint32_t dummy; /*!< Dummy */
3314  } ServiceURLStatDynamicMessage; /*!< Service URL Stat Message Structure */
3315 
3316  struct {
3317  uint32_t lel_status; /*!< Status */
3318  uint32_t lel_callReference; /*!< Call Reference */
3319  uint32_t lel_lineInstance; /*!< Line Instance */
3320  } CallSelectStatMessage; /*!< Call Select Status Message Structure */
3321 
3322 // struct {
3323 // uint32_t lel_conferenceID; /*!< Conference ID */
3324 // uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3325 // skinny_codec_t lel_payloadCapability; /*!< payload capability */
3326 // uint32_t lel_lineInstance; /*!< Line Instance */
3327 // uint32_t lel_callReference; /*!< Call Reference */
3328 // uint32_t lel_payload_rfc_number; /*!< */
3329 // uint32_t lel_payloadType; /*!< payload type */
3330 // uint32_t lel_isConferenceCreator; /*!< we can set it to 0 */
3331 //
3332 // audioParameter_t audioParameter; /*!< Audio Parameter */
3333 // videoParameter_t videoParameter; /*!< Video Parameter */
3334 // dataParameter_t dataParameter; /*!< Data Parameter */
3335 //
3336 // uint32_t unknown[12]; /*!< Unknown */
3337 // } OpenMultiMediaChannelMessage; /*!< Open Multi Media Channel Message Structure */
3338 //
3339 // struct {
3340 // uint32_t lel_conferenceID; /*!< Conference ID */
3341 // uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3342 // skinny_codec_t lel_payloadCapability; /*!< payload capability */
3343 // uint32_t lel_lineInstance; /*!< Line Instance */
3344 // uint32_t lel_callReference; /*!< Call Reference */
3345 // uint32_t lel_payload_rfc_number; /*!< */
3346 // uint32_t lel_payloadType; /*!< payload type */
3347 // uint32_t lel_isConferenceCreator; /*!< we can set it to 0 */
3348 //
3349 // audioParameter_t audioParameter; /*!< Audio Parameter */
3350 // videoParameter_t videoParameter; /*!< Video Parameter */
3351 // dataParameter_t dataParameter; /*!< Data Parameter */
3352 //
3353 // uint32_t unknown[19]; /*!< Unknown */
3354 // } OpenMultiMediaChannelMessage_v17; /*!< Open Multi Media Channel Message Structure */
3355 
3356  struct {
3357  uint32_t lel_conferenceID; /*!< Conference ID */
3358  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3359  skinny_codec_t lel_payloadCapability; /*!< payload capability */
3360  uint32_t lel_lineInstance; /*!< Line Instance */
3361  uint32_t lel_callReference; /*!< Call Reference */
3362  uint32_t lel_payload_rfc_number; /*!< */
3363  uint32_t lel_payloadType; /*!< payload type */
3364  uint32_t lel_isConferenceCreator; /*!< we can set it to 0 */
3365 
3366  videoParameter_t videoParameter; /*!< Video Parameter */
3367  } OpenMultiMediaChannelMessage; /*!< Open Multi Media Channel Message Structure */
3368 
3369  struct {
3370  uint32_t lel_conferenceID; /*!< Conference ID */
3371  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3372  skinny_codec_t lel_payloadCapability; /*!< payload capability */
3373  uint32_t lel_lineInstance; /*!< Line Instance */
3374  uint32_t lel_callReference; /*!< Call Reference */
3375  uint32_t lel_payload_rfc_number; /*!< */
3376  uint32_t lel_payloadType; /*!< payload type */
3377  uint32_t lel_isConferenceCreator; /*!< we can set it to 0 */
3378 
3379  videoParameter_t videoParameter; /*!< Video Parameter */
3380  } OpenMultiMediaChannelMessage_v17; /*!< Open Multi Media Channel Message Structure */
3381 
3382  /*!
3383  * \since 20100104 -MC
3384  * \note update 20100722
3385  * 0000 ac 00 00 00 00 00 00 00 32 01 00 00 0b 00 00 01
3386  0010 82 00 00 01 67 00 00 00 ac 11 01 66 45 15 00 00
3387  0020 0b 00 00 01 00 00 00 00 61 00 00 00 88 00 00 00
3388  0030 00 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3389  0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3390  0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3391  0060 00 00 00 00 40 00 00 00 32 00 00 00 5b 52 3a 4c
3392  0070 50 20 2d 20 48 50 3a 20 30 2c 20 4e f8 15 24 00
3393  0080 c4 02 89 09 9c ee 5a 0a 88 06 18 00 54 ef 5a 0a
3394  0090 64 7e fb 77 58 31 f8 77 ff ff ff ff 64 ef 5a 0a
3395  00a0 c2 b7 fc 77 78 07 18 00 20 16 24 00 40 16 24 00
3396  00b0 20 16 24 00
3397  *
3398  *
3399  */
3400 #if 0
3401  struct {
3402  uint32_t lel_conferenceID; /*!< Conference ID */
3403  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3404  skinny_codec_t lel_payloadCapability; /*!< payload capability */
3405 
3406  uint32_t bel_remoteIpAddr; /*!< This field is apparently in big-endian
3407  format, even though most other fields are
3408  little-endian. */
3409  uint32_t lel_remotePortNumber; /*!< Remote Port Number */
3410  uint32_t lel_callReference; /*!< Call Reference */
3411  uint32_t lel_payload_rfc_number; /*!< Payload RFC Number */
3412  uint32_t lel_payloadType; /*!< payload type */
3413  uint32_t lel_DSCPValue; /*!< DSCP Value */
3414 
3415  audioParameter_t audioParameter; /*!< Audio Parameter */
3416  videoParameter_t videoParameter; /*!< Video Parameter */
3417  dataParameter_t dataParameter; /*!< Data Parameter */
3418 
3419  uint32_t unknown[12]; /*!< Unknown */
3420 
3421  } StartMultiMediaTransmission; /*!< Start MultiMedia Transmission Message Structure */
3422 
3423  struct {
3424  uint32_t lel_conferenceID; /*!< Conference ID */
3425  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3426  skinny_codec_t lel_payloadCapability; /*!< payload capability */
3427  uint32_t unknown1; /*!< */
3428 
3429  char bel_remoteIpAddr[16]; /*!< This field is apparently in big-endian
3430  format, even though most other fields are
3431  little-endian. */
3432  uint32_t lel_remotePortNumber; /*!< Remote Port Number */
3433  uint32_t lel_callReference; /*!< Call Reference */
3434  uint32_t lel_payload_rfc_number; /*!< Payload RFC Number */
3435  uint32_t lel_payloadType; /*!< payload type */
3436  uint32_t lel_DSCPValue; /*!< DSCP Value */
3437 
3438  audioParameter_t audioParameter; /*!< Audio Parameter */
3439  videoParameter_t videoParameter; /*!< Video Parameter */
3440  dataParameter_t dataParameter; /*!< Data Parameter */
3441 
3442  uint32_t unknown[12]; /*!< Unknown */
3443 
3444  } StartMultiMediaTransmission_v17; /*!< Start MultiMedia Transmission Message Structure */
3445 #endif
3446 
3447  struct {
3448  uint32_t lel_conferenceID; /*!< Conference ID */
3449  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3450  skinny_codec_t lel_payloadCapability; /*!< payload capability */
3451 
3452  uint32_t bel_remoteIpAddr; /*!< This field is apparently in big-endian
3453  format, even though most other fields are
3454  little-endian. */
3455  uint32_t lel_remotePortNumber; /*!< Remote Port Number */
3456  uint32_t lel_callReference; /*!< Call Reference */
3457  uint32_t lel_payload_rfc_number; /*!< Payload RFC Number */
3458  uint32_t lel_payloadType; /*!< payload type */
3459  uint32_t lel_DSCPValue; /*!< DSCP Value */
3460 
3461  videoParameter_t videoParameter; /*!< Video Parameter */
3462 
3463  } StartMultiMediaTransmission; /*!< Start MultiMedia Transmission Message Structure */
3464 
3465  struct {
3466  uint32_t lel_conferenceID; /*!< Conference ID */
3467  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3468  skinny_codec_t lel_payloadCapability; /*!< payload capability */
3469  uint32_t unknown1; /*!< */
3470 
3471  char bel_remoteIpAddr[16]; /*!< This field is apparently in big-endian
3472  format, even though most other fields are
3473  little-endian. */
3474  uint32_t lel_remotePortNumber; /*!< Remote Port Number */
3475  uint32_t lel_callReference; /*!< Call Reference */
3476  uint32_t lel_payload_rfc_number; /*!< Payload RFC Number */
3477  uint32_t lel_payloadType; /*!< payload type */
3478  uint32_t lel_DSCPValue; /*!< DSCP Value */
3479 
3480  videoParameter_t videoParameter; /*!< Data Parameter */
3481 
3482  } StartMultiMediaTransmission_v17; /*!< Start MultiMedia Transmission Message Structure */
3483 
3484  struct {
3485  uint32_t lel_callReference; /*!< Call Reference */
3486  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3487  uint32_t lel_callReference1; /*!< Call Reference1 */
3488  uint32_t bel_ipAddr; /*!< This field is apparently in big-endian format, even though most other fields are little-endian. */
3489  uint32_t lel_portNumber; /*!< Port Number */
3490  uint32_t lel_smtStatus; /*!< Start Media Transmission Status */
3491  uint32_t lel_unknown2; /*!< Unknown 2 */
3492  } StartMultiMediaTransmissionAck; /*!< Start Media Transmission Acknowledgement Structure */
3493 
3494  struct {
3495  uint32_t lel_callReference; /*!< Call Reference */
3496  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3497  uint32_t lel_callReference1; /*!< Call Reference 1 */
3498  uint32_t lel_unknown1; /*!< i think this switches from IPv4 to IPv6 (0x00 in IPv4) */
3499  /* include IPv6 support */
3500  char bel_ipAddr[16]; /*!< This field is apparently in big-endian format, even though most other fields are in little-endian format. */
3501  uint32_t lel_portNumber; /*!< Port Number */
3502  uint32_t lel_smtStatus; /*!< startmediatransmission status */
3503  uint32_t lel_unknown2; /*!< Unknown */
3504  } StartMultiMediaTransmissionAck_v17; /*!< Start Media Transmission Acknowledgement used in protocoll version 17 */
3505 
3506  struct {
3507  uint32_t lel_displayTimeout; /*!< Display Timeout */
3508  uint32_t lel_priority; /*!< Priority */
3509  char displayMessage[StationMaxDisplayNotifySize]; /*!< Display Message */
3510  } DisplayPriNotifyMessage; /*!< Display Priority Notify Message Structure */
3511 
3512  struct {
3513  } ClearPriNotifyMessage; /*!< Clear Priority Notify Message Structure */
3514 
3515  struct {
3516  uint32_t lel_lineInstance; /*!< Line Instance */
3517  } ActivateCallPlaneMessage; /*!< Activate Call Plane Message Structure */
3518 
3519  struct {
3520  } DeactivateCallPlaneMessage; /*!< Deactivate Call Plane Message Structure */
3521 
3522  struct {
3523  uint32_t lel_status; /*!< Status */
3524  } UnregisterAckMessage; /*!< Unregister Ackknowledge Message Structure */
3525 
3526  struct {
3527  uint32_t lel_lineInstance; /*!< Line Instance */
3528  uint32_t lel_callReference; /*!< Call Reference */
3529  } BackSpaceReqMessage; /*!< Back Space Request Message Message Structure */
3530 
3531  struct {
3532  } RegisterTokenAck; /*!< Register Token Ackknowledge Message Structure */
3533 
3534  struct {
3535  uint32_t lel_tokenRejWaitTime; /*!< Back Off Time */
3536  } RegisterTokenReject; /*!< Register Token Reject Message Structure */
3537 
3538  /*!
3539  *
3540  * \since 20100103 -MC
3541  */
3542  struct {
3543  uint32_t lel_conferenceID; /*!< Conference ID */
3544  uint32_t lel_passThruPartyId; /*!< Pass Through Party ID */
3545  uint32_t lel_callReference; /*!< Call Reference */
3546  uint32_t maxBitRate; /*!< Maximum BitRate */
3548 
3549  struct {
3550  uint32_t lel_conferenceID; /*!< Conference ID */
3551  uint32_t lel_numberOfReservedParticipants; /*!< Number of Reserved Participants */
3552  uint32_t lel_resourceTypes; /*!< Resource Types */
3553  uint32_t lel_appID; /*!< Application ID */
3554  uint8_t lel_appConfID; /*!< Conference Application ID */
3555  char lel_unknown[31]; /*!< Unknown */
3556  char lel_appData[24]; /*!< Application Data */
3557  uint32_t lel_data_length; /*!< Application Data Length */
3558  uint8_t lel__passThruData; /*!< Pass Through Data */
3559  } CreateConferenceReqMessage; /*!< Create Conference Request Message Structure */
3560 
3561  struct {
3562  uint32_t lel_conferenceID; /*!< Conference ID */
3563  } DeleteConferenceReqMessage; /*!< Delete Conference Request Message Structure */
3564 
3565  /* SCCP Firmware version > 9.1 */
3566  struct {
3567  char le_data[2004]; /*!< XML Alarm Message Data */
3568  } XMLAlarmMessage; /*!< XML Alarm Message Structure */
3569 
3570  /* SPA */
3571  struct {
3572  StationIdentifier sId; /*!< Station Identifier */
3573  uint32_t lel_stationIpAddr; /*!< Station IP Address */
3574  uint32_t lel_deviceType; /*!< Device Type as part of SKINNY_DEVICETYPE_* */
3575  uint32_t maxStreams; /*!< Max Streams */
3577 
3578  struct {
3579  uint32_t lel_features;
3581 
3582  struct {
3583  uint32_t lel_features;
3585 
3586 } sccp_data_t; /*!< SCCP Data Structure */
3587 
3588 /*!
3589  * \brief SCCP MOO Message Structure
3590  */
3591 
3592 typedef struct {
3593  uint32_t length; /*!< Message Length */
3594  uint32_t lel_reserved; /*!< Reserved Message */
3595  uint32_t lel_messageId; /*!< Message ID */
3596  sccp_data_t msg; /*!< Message [SCCP Data] */
3597 } sccp_moo_t; /*!< MOO Message Structure */
3598 
3599 /* So in theory, a message should never be bigger than this.
3600  * If it is, we abort the connection */
3601 #define SCCP_MAX_PACKET sizeof(sccp_moo_t)
3602 
3603 #include "sccp_softkeys.h"
3604 #include "sccp_labels.h"
3605 
3606 static const uint8_t softkeysmap[] = {
3639 // SKINNY_LBL_CBARGE,
3640 }; /*!< Soft Keys Map as INT */
3641 
3642 /*!
3643  * \brief Soft Key Modes Structure
3644  */
3645 
3646 typedef struct {
3647  uint8_t id; /*!< Soft Key ID */
3648  uint8_t *ptr; /*!< Point to next Mode */
3649  uint8_t count; /*!< Soft Key Count */
3650 } softkey_modes; /*!< Soft Key Modes Structure */
3651 
3652 #define KEYMODE_ONHOOK 0
3653 #define KEYMODE_CONNECTED 1
3654 #define KEYMODE_ONHOLD 2
3655 #define KEYMODE_RINGIN 3
3656 #define KEYMODE_OFFHOOK 4
3657 #define KEYMODE_CONNTRANS 5
3658 #define KEYMODE_DIGITSFOLL 6
3659 #define KEYMODE_CONNCONF 7
3660 #define KEYMODE_RINGOUT 8
3661 #define KEYMODE_OFFHOOKFEAT 9
3662 #define KEYMODE_INUSEHINT 10
3663 #define KEYMODE_ONHOOKSTEALABLE 11
3664 
3665 /*!
3666  * \brief Skinny KeyMode Structure
3667  */
3668 static const struct skinny_keymode {
3669  uint8_t keymode;
3670  const char *const text;
3671 } skinny_keymodes[] = {
3672  /* *INDENT-OFF* */
3673  {KEYMODE_ONHOOK, "On Hook"},
3674  {KEYMODE_CONNECTED, "Connected"},
3675  {KEYMODE_ONHOLD, "On Hold"},
3676  {KEYMODE_RINGIN, "Ringin"},
3677  {KEYMODE_OFFHOOK, "Off Hook"},
3678  {KEYMODE_CONNTRANS, "Connected with Transfer"},
3679  {KEYMODE_DIGITSFOLL, "Digits after dialing first digit "},
3680  {KEYMODE_CONNCONF, "Connected with Conference"},
3681  {KEYMODE_RINGOUT, "Ring Out"},
3682  {KEYMODE_OFFHOOKFEAT, "Off Hook with Features"},
3683  {KEYMODE_INUSEHINT, "In Use Hint"},
3684  {KEYMODE_ONHOOKSTEALABLE, "On Hook with Stealable Remote Call"},
3685  /* *INDENT-ON* */
3686 };
3687 
3688 static uint8_t skSet_Onhook[] = {
3693 // SKINNY_LBL_CFWDBUSY,
3694 // SKINNY_LBL_CFWDNOANSWER,
3695 #ifdef CS_SCCP_PICKUP
3698 #endif
3699 // SKINNY_LBL_CONFLIST,
3700 
3701 }; /*!< SKINNY SoftKeys Set "Onhook" as INT */
3702 
3703 static uint8_t skSet_OnhookStealable[] = {
3707 #ifdef CS_SCCP_PICKUP
3710 #endif
3713 }; /*!< SKINNY SoftKeys Set "Onhook" as INT */
3714 
3715 static uint8_t skSet_Connected[] = {
3718 #ifdef CS_SCCP_PARK
3720 #endif
3721 #ifdef CS_SCCP_DIRTRFR
3723 #endif
3726 // SKINNY_LBL_CFWDNOANSWER,
3728 }; /*!< SKINNY SoftKeys Set "Connected" as INT */
3729 
3730 static uint8_t skSet_Onhold[] = {
3735 #ifdef CS_SCCP_CONFERENCE
3737  //SKINNY_LBL_CONFRN,
3738 #endif
3739 #ifdef CS_SCCP_DIRTRFR
3742 #endif
3744 }; /*!< SKINNY SoftKeys Set "On Hold" as INT */
3745 
3746 static uint8_t skSet_Ringin[] = {
3751 // SKINNY_LBL_TRANSFER,
3752 // SKINNY_LBL_DIRTRFR
3753 }; /*!< SKINNY SoftKeys Set "Ring-IN" as INT */
3754 
3755 static uint8_t skSet_Offhook[] = {
3761 // SKINNY_LBL_CFWDNOANSWER,
3762 #ifdef CS_SCCP_PICKUP
3765 #endif
3768 // SKINNY_LBL_CBARGE,
3769 }; /*!< SKINNY SoftKeys Set "OffHook" as INT */
3770 
3771 static uint8_t skSet_Conntrans[] = {
3775 #ifdef CS_SCCP_CONFERENCE
3777 #endif
3778 #ifdef CS_SCCP_PARK
3780 #endif
3781 #ifdef CS_SCCP_DIRTRFR
3784 #endif
3788 // SKINNY_LBL_CFWDNOANSWER,
3789 }; /*!< SKINNY SoftKeys Set "Connected With Transfer" as INT */
3790 
3791 static uint8_t skSet_DigitsFoll[] = {
3795 }; /*!< SKINNY SoftKeys Set "Digits after dialing first digit" as INT */
3796 
3797 static uint8_t skSet_Connconf[] = {
3801 }; /*!< SKINNY SoftKeys Set "Connected with Conference" as INT */
3802 
3803 static uint8_t skSet_RingOut[] = {
3809 // SKINNY_LBL_CFWDBUSY,
3810 // SKINNY_LBL_CFWDNOANSWER,
3811 }; /*!< SKINNY SoftKeys Set "Ring-Out" as INT */
3812 
3813 static uint8_t skSet_Offhookfeat[] = {
3816 }; /*!< SKINNY SoftKeys Set "Off Hook with Features" as INT */
3817 
3818 // in use hint keyset
3819 static uint8_t skSet_InUseHint[] = {
3821 // SKINNY_LBL_ENDCALL,
3824 }; /*!< SKINNY SoftKeys Set "Hint In Use" as INT */
3825 
3826 /*!
3827  */
3828 static const softkey_modes SoftKeyModes[] = {
3829  /* According to CCM dump:
3830  * OnHook(0), Connected(1), OnHold(2), RingIn(3)
3831  * OffHook(4), ConnectedWithTransfer(5)
3832  * Digitsafterdialingfirstdigit(6), Connected with Conference (7)
3833  * RingOut (8), OffHookWithFeatures (9), InUseHint(10)
3834  */
3835  /* *INDENT-OFF* */
3836  {KEYMODE_ONHOOK, skSet_Onhook, sizeof(skSet_Onhook) / sizeof(uint8_t)},
3837  {KEYMODE_CONNECTED, skSet_Connected, sizeof(skSet_Connected) / sizeof(uint8_t)},
3838  {KEYMODE_ONHOLD, skSet_Onhold, sizeof(skSet_Onhold) / sizeof(uint8_t)},
3839  {KEYMODE_RINGIN, skSet_Ringin, sizeof(skSet_Ringin) / sizeof(uint8_t)},
3840  {KEYMODE_OFFHOOK, skSet_Offhook, sizeof(skSet_Offhook) / sizeof(uint8_t)},
3841  {KEYMODE_CONNTRANS, skSet_Conntrans, sizeof(skSet_Conntrans) / sizeof(uint8_t)},
3842  {KEYMODE_DIGITSFOLL, skSet_DigitsFoll, sizeof(skSet_DigitsFoll) / sizeof(uint8_t)},
3843  {KEYMODE_CONNCONF, skSet_Connconf, sizeof(skSet_Connconf) / sizeof(uint8_t)},
3844  {KEYMODE_RINGOUT, skSet_RingOut, sizeof(skSet_RingOut) / sizeof(uint8_t)},
3845  {KEYMODE_OFFHOOKFEAT, skSet_Offhookfeat, sizeof(skSet_Offhookfeat) / sizeof(uint8_t)},
3846  {KEYMODE_INUSEHINT, skSet_InUseHint, sizeof(skSet_InUseHint) / sizeof(uint8_t)},
3848  /* *INDENT-ON* */
3849 }; /*!< SoftKey Modes Constants */
3850 
3851 /*!
3852  * \brief SCCP Device Protocol Structure
3853  *
3854  * Connect Specific CallBack-Functions to Particular SCCP Protocol Versions
3855  */
3856 typedef struct {
3857  const char *name;
3858  const uint8_t version;
3859 
3860  /* protocol callbacks */
3861  void (*const sendCallInfo) (const sccp_device_t * device, const sccp_channel_t * channel);
3862  void (*const sendDialedNumber) (const sccp_device_t * device, const sccp_channel_t * channel);
3863  void (*const sendRegisterAck) (const sccp_device_t * device, uint8_t keepAliveInterval, uint8_t secondaryKeepAlive, char *dateformat);
3864  void (*const displayPrompt) (const sccp_device_t * device, uint8_t lineInstance, uint8_t callid, uint8_t timeout, const char *message);
3865  void (*const displayNotify) (const sccp_device_t * device, uint8_t timeout, const char *message);
3866  void (*const displayPriNotify) (const sccp_device_t * device, uint8_t priority, uint8_t timeout, const char *message);
3867  void (*const sendCallforwardMessage) (const sccp_device_t * device, const void *linedevice);
3868  void (*const sendUserToDeviceDataVersionMessage) (const sccp_device_t * device, const void *xmlData, uint8_t priority);
3869  void (*const sendFastPictureUpdate) (const sccp_device_t * device, const sccp_channel_t * channel);
3871 
3874 
3875 # endif /* __SCCP_PROTOCOL_H */