1 /*****************************************************************************
2
3 FileName: Q931mes.c
4
5 Contents: Pack/Unpack functions. These functions will unpack a Q931
6 message from the bit packed original format into structs
7 that contains variables sized by the user. It will also pack
8 the struct back into a Q.931 message as required.
9
10 See q931.h for description.
11
12 License/Copyright:
13
14 Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
15 email:janvb@caselaboratories.com
16
17 Redistribution and use in source and binary forms, with or without
18 modification, are permitted provided that the following conditions are
19 met:
20
21 * Redistributions of source code must retain the above copyright notice,
22 this list of conditions and the following disclaimer.
23 * Redistributions in binary form must reproduce the above copyright notice,
24 this list of conditions and the following disclaimer in the documentation
25 and/or other materials provided with the distribution.
26 * Neither the name of the Case Labs, Ltd nor the names of its contributors
27 may be used to endorse or promote products derived from this software
28 without specific prior written permission.
29
30 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
31 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
32 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
34 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
35 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
36 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
37 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
38 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
39 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
40 POSSIBILITY OF SUCH DAMAGE.
41
42 *****************************************************************************/
43
44 #include "Q931.h"
45
46 /**
47 * Q931MesgHeader
48 * \brief Create Q.931 Message header
49 */
Q931MesgHeader(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * mes,L3UCHAR * OBuf,L3INT Size,L3INT * IOff)50 L3INT Q931MesgHeader(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *mes, L3UCHAR *OBuf, L3INT Size, L3INT *IOff)
51 {
52 L3INT Octet = *IOff;
53
54 Q931Log(pTrunk, Q931_LOG_DEBUG, "Creating Q.931 Message Header:\n ProtDisc %d (%#x), CRV %d (%#x), CRVflag: %d (%#x), MesType: %d (%#x)\n",
55 mes->ProtDisc, mes->ProtDisc, mes->CRV, mes->CRV, mes->CRVFlag, mes->CRVFlag, mes->MesType, mes->MesType);
56
57 OBuf[Octet++] = mes->ProtDisc; /* Protocol discriminator */
58 if (!Q931_IS_BRI(pTrunk)) {
59 OBuf[Octet++] = 2; /* length is 2 octets */
60 OBuf[Octet++] = (L3UCHAR)((mes->CRV >> 8) & 0x7f) | ((mes->CRVFlag << 7) & 0x80); /* msb */
61 OBuf[Octet++] = (L3UCHAR) (mes->CRV & 0xff); /* lsb */
62 } else {
63 OBuf[Octet++] = 1; /* length is 1 octet */
64 OBuf[Octet++] = (L3UCHAR) (mes->CRV & 0x7f) | ((mes->CRVFlag << 7) & 0x80); /* CRV & flag */
65 }
66 OBuf[Octet++] = mes->MesType; /* message header */
67
68 *IOff = Octet;
69 return 0;
70 }
71
72
73 /*****************************************************************************
74
75 Function: Q931Umes_Alerting
76
77 *****************************************************************************/
78
Q931Umes_Alerting(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)79 L3INT Q931Umes_Alerting(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
80 {
81 L3INT OOff = 0;
82 L3INT rc = Q931E_NO_ERROR;
83
84 while (IOff < Size) {
85 switch (IBuf[IOff]) {
86 case Q931ie_BEARER_CAPABILITY:
87 case Q931ie_CHANNEL_IDENTIFICATION:
88 case Q931ie_PROGRESS_INDICATOR:
89 case Q931ie_DISPLAY:
90 case Q931ie_SIGNAL:
91 case Q931ie_HIGH_LAYER_COMPATIBILITY:
92 case Q931ie_USER_USER:
93 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
94 if (rc != Q931E_NO_ERROR)
95 return rc;
96 break;
97 default:
98 return Q931E_ILLEGAL_IE;
99 break;
100 }
101 }
102
103 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
104 return Q931E_NO_ERROR;
105 }
106
107 /*****************************************************************************
108
109 Function: Q931Pmes_Alerting
110
111 *****************************************************************************/
Q931Pmes_Alerting(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)112 L3INT Q931Pmes_Alerting(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
113 {
114 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
115 L3INT rc = Q931E_NO_ERROR;
116 L3INT Octet = 0;
117
118 /* Q931 Message Header */
119 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
120
121 /* Bearer capability */
122 if (Q931IsIEPresent(pMes->BearerCap)) {
123 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_BEARER_CAPABILITY](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet)) != 0)
124 return rc;
125 }
126
127 /* Channel Identification */
128 if (Q931IsIEPresent(pMes->ChanID)) {
129 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
130 return rc;
131 }
132
133 /* Progress indicator */
134 if (Q931IsIEPresent(pMes->ProgInd)) {
135 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
136 return rc;
137 }
138
139 /* Display */
140 if (Q931IsIEPresent(pMes->Display)) {
141 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
142 return rc;
143 }
144
145 /* Signal */
146 if (Q931IsIEPresent(pMes->Signal)) {
147 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
148 return rc;
149 }
150
151 /* High Layer Compatibility */
152 if (Q931IsIEPresent(pMes->HLComp)) {
153 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_HIGH_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet)) != 0)
154 return rc;
155 }
156
157 *OSize = Octet;
158 return rc;
159 }
160
161 /*****************************************************************************
162
163 Function: Q931Umes_CallProceeding
164
165 *****************************************************************************/
Q931Umes_CallProceeding(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)166 L3INT Q931Umes_CallProceeding(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
167 {
168 L3INT OOff = 0;
169 L3INT rc = Q931E_NO_ERROR;
170
171 while (IOff < Size) {
172 switch (IBuf[IOff]) {
173 case Q931ie_BEARER_CAPABILITY:
174 case Q931ie_CHANNEL_IDENTIFICATION:
175 case Q931ie_PROGRESS_INDICATOR:
176 case Q931ie_DISPLAY:
177 case Q931ie_HIGH_LAYER_COMPATIBILITY:
178 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
179 if (rc != Q931E_NO_ERROR)
180 return rc;
181 break;
182 default:
183 return Q931E_ILLEGAL_IE;
184 break;
185 }
186 }
187
188 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
189 return Q931E_NO_ERROR;
190 }
191
192 /*****************************************************************************
193
194 Function: Q931Pmes_CallProceeding
195
196 *****************************************************************************/
Q931Pmes_CallProceeding(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)197 L3INT Q931Pmes_CallProceeding(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
198 {
199 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
200 L3INT rc = Q931E_NO_ERROR;
201 L3INT Octet = 0;
202
203 /* Q931 Message Header */
204 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
205
206 /* Bearer capability */
207 if (Q931IsIEPresent(pMes->BearerCap)) {
208 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_BEARER_CAPABILITY](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet)) != 0)
209 return rc;
210 }
211
212 /* Channel Identification */
213 if (Q931IsIEPresent(pMes->ChanID)) {
214 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
215 return rc;
216 }
217
218 /* Progress indicator */
219 if (Q931IsIEPresent(pMes->ProgInd)) {
220 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
221 return rc;
222 }
223
224 /* Display */
225 if (Q931IsIEPresent(pMes->Display)) {
226 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
227 return rc;
228 }
229
230 /* High Layer Compatibility */
231 if (Q931IsIEPresent(pMes->HLComp)) {
232 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_HIGH_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet)) != 0)
233 return rc;
234 }
235
236 *OSize = Octet;
237 return rc;
238 }
239
240 /*****************************************************************************
241
242 Function: Q931Umes_CongestionControl
243
244 *****************************************************************************/
Q931Umes_CongestionControl(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)245 L3INT Q931Umes_CongestionControl(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
246 {
247 L3BOOL RetCode = L3FALSE;
248
249 NoWarning(mes);
250 NoWarning(IBuf);
251
252 return RetCode;
253 }
254
255
256 /*****************************************************************************
257
258 Function: Q931Pmes_CongestionControl
259
260 *****************************************************************************/
Q931Pmes_CongestionControl(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)261 L3INT Q931Pmes_CongestionControl(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
262 {
263 L3BOOL RetCode = L3FALSE;
264
265 NoWarning(OBuf);
266 NoWarning(IBuf);
267
268 *OSize = 0;
269 return RetCode;
270 }
271
272 /*****************************************************************************
273
274 Function: Q931Umes_Connect
275
276 *****************************************************************************/
Q931Umes_Connect(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)277 L3INT Q931Umes_Connect(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
278 {
279 L3INT OOff = 0;
280 L3INT rc = Q931E_NO_ERROR;
281
282 while (IOff < Size) {
283 switch (IBuf[IOff]) {
284 case Q931ie_BEARER_CAPABILITY:
285 case Q931ie_CHANNEL_IDENTIFICATION:
286 case Q931ie_PROGRESS_INDICATOR:
287 case Q931ie_DISPLAY:
288 case Q931ie_DATETIME:
289 case Q931ie_SIGNAL:
290 case Q931ie_LOW_LAYER_COMPATIBILITY:
291 case Q931ie_HIGH_LAYER_COMPATIBILITY:
292 case Q931ie_CONNECTED_NUMBER: /* not actually used, seen while testing BRI PTMP TE */
293 case Q931ie_USER_USER:
294 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
295 if (rc != Q931E_NO_ERROR)
296 return rc;
297 break;
298
299 default:
300 Q931Log(pTrunk, Q931_LOG_ERROR, "Illegal IE %#hhx in Connect Message\n", IBuf[IOff]);
301
302 return Q931E_ILLEGAL_IE;
303 break;
304 }
305 }
306
307 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
308 return Q931E_NO_ERROR;
309 }
310
311 /*****************************************************************************
312
313 Function: Q931Pmes_Connect
314
315 *****************************************************************************/
Q931Pmes_Connect(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)316 L3INT Q931Pmes_Connect(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
317 {
318 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
319 L3INT rc = Q931E_NO_ERROR;
320 L3INT Octet = 0;
321
322 /* Q931 Message Header */
323 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
324
325 /* Bearer capability */
326 if (Q931IsIEPresent(pMes->BearerCap)) {
327 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_BEARER_CAPABILITY](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet)) != 0)
328 return rc;
329 }
330
331 /* Channel Identification */
332 if (Q931IsIEPresent(pMes->ChanID)) {
333 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
334 return rc;
335 }
336
337 /* Progress indicator */
338 if (Q931IsIEPresent(pMes->ProgInd)) {
339 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
340 return rc;
341 }
342
343 /* Display */
344 if (Q931IsIEPresent(pMes->Display)) {
345 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
346 return rc;
347 }
348
349 /* Date/Time */
350 if (Q931IsIEPresent(pMes->DateTime)) {
351 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DATETIME](pTrunk, Q931GetIEPtr(pMes->DateTime,pMes->buf), OBuf, &Octet)) != 0)
352 return rc;
353 }
354
355 /* Signal */
356 if (Q931IsIEPresent(pMes->Signal)) {
357 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
358 return rc;
359 }
360
361 /* Low Layer Compatibility */
362 if (Q931IsIEPresent(pMes->LLComp)) {
363 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_LOW_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->LLComp,pMes->buf), OBuf, &Octet)) != 0)
364 return rc;
365 }
366
367 /* High Layer Compatibility */
368 if (Q931IsIEPresent(pMes->HLComp)) {
369 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_HIGH_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet)) != 0)
370 return rc;
371 }
372
373 *OSize = Octet;
374 return rc;
375 }
376
377 /*****************************************************************************
378
379 Function: Q931Umes_ConnectAck
380
381 *****************************************************************************/
Q931Umes_ConnectAck(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)382 L3INT Q931Umes_ConnectAck(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
383 {
384 L3INT OOff = 0;
385 L3INT rc = Q931E_NO_ERROR;
386
387 while (IOff < Size) {
388 switch (IBuf[IOff]) {
389 case Q931ie_DISPLAY:
390 case Q931ie_SIGNAL:
391 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
392 if (rc != Q931E_NO_ERROR)
393 return rc;
394 break;
395 default:
396 return Q931E_ILLEGAL_IE;
397 break;
398 }
399 }
400
401 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
402 return Q931E_NO_ERROR;
403 }
404
405
406 /*****************************************************************************
407
408 Function: Q931Pmes_ConnectAck
409
410 *****************************************************************************/
Q931Pmes_ConnectAck(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)411 L3INT Q931Pmes_ConnectAck(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
412 {
413 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
414 L3INT rc = Q931E_NO_ERROR;
415 L3INT Octet = 0;
416
417 /* Q931 Message Header */
418 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
419
420 /* Display */
421 if (Q931IsIEPresent(pMes->Display)) {
422 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
423 return rc;
424 }
425
426 /* Signal */
427 if (Q931IsIEPresent(pMes->Signal)) {
428 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
429 return rc;
430 }
431
432 *OSize = Octet;
433 return rc;
434 }
435
436 /*****************************************************************************
437
438 Function: Q931Umes_Disconnect
439
440 *****************************************************************************/
Q931Umes_Disconnect(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)441 L3INT Q931Umes_Disconnect(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
442 {
443 L3INT OOff = 0;
444 L3INT rc = Q931E_NO_ERROR;
445
446 while (IOff < Size) {
447 switch (IBuf[IOff]) {
448 case Q931ie_CAUSE:
449 case Q931ie_PROGRESS_INDICATOR:
450 case Q931ie_DISPLAY:
451 case Q931ie_SIGNAL:
452 case Q931ie_FACILITY:
453 case Q931ie_USER_USER:
454 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
455 if (rc != Q931E_NO_ERROR)
456 return rc;
457 break;
458 default:
459 return Q931E_ILLEGAL_IE;
460 break;
461 }
462 }
463
464 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
465 return Q931E_NO_ERROR;
466 }
467
468 /*****************************************************************************
469
470 Function: Q931Pmes_Disconnect
471
472 *****************************************************************************/
Q931Pmes_Disconnect(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)473 L3INT Q931Pmes_Disconnect(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
474 {
475 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
476 L3INT rc = Q931E_NO_ERROR;
477 L3INT Octet = 0;
478
479 /* Q931 Message Header */
480 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
481
482 /* Cause */
483 if (Q931IsIEPresent(pMes->Cause)) {
484 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
485 return rc;
486 }
487
488 /* Progress indicator */
489 if (Q931IsIEPresent(pMes->ProgInd)) {
490 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
491 return rc;
492 }
493
494 /* Display */
495 if (Q931IsIEPresent(pMes->Display)) {
496 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
497 return rc;
498 }
499
500 /* Signal */
501 if (Q931IsIEPresent(pMes->Signal)) {
502 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
503 return rc;
504 }
505
506 *OSize = Octet;
507 return rc;
508 }
509
510 /*****************************************************************************
511
512 Function: Q931Umes_Information
513
514 *****************************************************************************/
Q931Umes_Information(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)515 L3INT Q931Umes_Information(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
516 {
517 L3INT OOff = 0;
518 L3INT rc = Q931E_NO_ERROR;
519
520 while (IOff < Size) {
521 switch (IBuf[IOff]) {
522 case Q931ie_SENDING_COMPLETE:
523 case Q931ie_DISPLAY:
524 case Q931ie_KEYPAD_FACILITY:
525 case Q931ie_CALLED_PARTY_NUMBER:
526 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
527 if (rc != Q931E_NO_ERROR)
528 return rc;
529 break;
530 default:
531 return Q931E_ILLEGAL_IE;
532 break;
533 }
534 }
535
536 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
537 return Q931E_NO_ERROR;
538 }
539
540 /*****************************************************************************
541
542 Function: Q931Pmes_Information
543
544 *****************************************************************************/
Q931Pmes_Information(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)545 L3INT Q931Pmes_Information(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
546 {
547 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
548 L3INT rc = Q931E_NO_ERROR;
549 L3INT Octet = 0;
550
551 /* Q931 Message Header */
552 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
553
554 /* Sending Complete */
555 if (Q931IsIEPresent(pMes->SendComplete)) {
556 OBuf[Octet++] = (L3UCHAR)(pMes->SendComplete & 0x00ff);
557 }
558
559 /* Display */
560 if (Q931IsIEPresent(pMes->Display)) {
561 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
562 return rc;
563 }
564
565 /* Keypad Facility */
566 if (Q931IsIEPresent(pMes->KeypadFac)) {
567 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_KEYPAD_FACILITY](pTrunk, Q931GetIEPtr(pMes->KeypadFac,pMes->buf), OBuf, &Octet)) != 0)
568 return rc;
569 }
570
571 /* Signal */
572 if (Q931IsIEPresent(pMes->Signal)) {
573 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
574 return rc;
575 }
576
577 /* Called Party number */
578 if (Q931IsIEPresent(pMes->CalledNum)) {
579 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLED_PARTY_NUMBER](pTrunk, Q931GetIEPtr(pMes->CalledNum,pMes->buf), OBuf, &Octet)) != 0)
580 return rc;
581 }
582
583 *OSize = Octet;
584 return rc;
585 }
586
587 /*****************************************************************************
588
589 Function: Q931Umes_Notify
590
591 *****************************************************************************/
Q931Umes_Notify(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)592 L3INT Q931Umes_Notify(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
593 {
594 L3INT OOff = 0;
595 L3INT rc = Q931E_NO_ERROR;
596
597 while (IOff < Size) {
598 switch (IBuf[IOff]) {
599 case Q931ie_BEARER_CAPABILITY:
600 case Q931ie_NOTIFICATION_INDICATOR:
601 case Q931ie_DISPLAY:
602 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
603 if (rc != Q931E_NO_ERROR)
604 return rc;
605 break;
606 default:
607 return Q931E_ILLEGAL_IE;
608 break;
609 }
610 }
611
612 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
613 return Q931E_NO_ERROR;
614 }
615
616 /*****************************************************************************
617
618 Function: Q931Pmes_Notify
619
620 *****************************************************************************/
Q931Pmes_Notify(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)621 L3INT Q931Pmes_Notify(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
622 {
623 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
624 L3INT rc = Q931E_NO_ERROR;
625 L3INT Octet = 0;
626
627 /* Q931 Message Header */
628 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
629
630 /* Bearer capability */
631 if (Q931IsIEPresent(pMes->BearerCap)) {
632 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_BEARER_CAPABILITY](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet)) != 0)
633 return rc;
634 }
635
636 /* Display */
637 if (Q931IsIEPresent(pMes->Display)) {
638 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
639 return rc;
640 }
641
642 *OSize = Octet;
643 return rc;
644 }
645
646 /*****************************************************************************
647
648 Function: Q931Umes_Progress
649
650 *****************************************************************************/
Q931Umes_Progress(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)651 L3INT Q931Umes_Progress(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
652 {
653 L3INT OOff = 0;
654 L3INT rc = Q931E_NO_ERROR;
655
656 while (IOff < Size) {
657 switch (IBuf[IOff]) {
658 case Q931ie_BEARER_CAPABILITY:
659 case Q931ie_CAUSE:
660 case Q931ie_PROGRESS_INDICATOR:
661 case Q931ie_DISPLAY:
662 case Q931ie_HIGH_LAYER_COMPATIBILITY:
663 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
664 if (rc != Q931E_NO_ERROR)
665 return rc;
666 break;
667 default:
668 return Q931E_ILLEGAL_IE;
669 break;
670 }
671 }
672
673 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
674 return Q931E_NO_ERROR;
675 }
676
677 /*****************************************************************************
678
679 Function: Q931Pmes_Progress
680
681 *****************************************************************************/
Q931Pmes_Progress(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)682 L3INT Q931Pmes_Progress(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
683 {
684 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
685 L3INT rc = Q931E_NO_ERROR;
686 L3INT Octet = 0;
687
688 /* Q931 Message Header */
689 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
690
691 /* Bearer capability */
692 if (Q931IsIEPresent(pMes->BearerCap)) {
693 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_BEARER_CAPABILITY](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet)) != 0)
694 return rc;
695 }
696
697 /* Cause */
698 if (Q931IsIEPresent(pMes->Cause)) {
699 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
700 return rc;
701 }
702
703 /* Progress indicator */
704 if (Q931IsIEPresent(pMes->ProgInd)) {
705 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
706 return rc;
707 }
708
709 /* Display */
710 if (Q931IsIEPresent(pMes->Display)) {
711 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
712 return rc;
713 }
714
715 /* High Layer Compatibility */
716 if (Q931IsIEPresent(pMes->HLComp)) {
717 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_HIGH_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet)) != 0)
718 return rc;
719 }
720
721 *OSize = Octet;
722 return rc;
723 }
724
725 /*****************************************************************************
726
727 Function: Q931Umes_Release
728
729 *****************************************************************************/
Q931Umes_Release(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)730 L3INT Q931Umes_Release(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
731 {
732 L3INT OOff = 0;
733 L3INT rc = Q931E_NO_ERROR;
734
735 while (IOff < Size) {
736 switch (IBuf[IOff]) {
737 case Q931ie_CAUSE:
738 case Q931ie_DISPLAY:
739 case Q931ie_SIGNAL:
740 case Q931ie_USER_USER:
741 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
742 if (rc != Q931E_NO_ERROR)
743 return rc;
744 break;
745 default:
746 return Q931E_ILLEGAL_IE;
747 break;
748 }
749 }
750
751 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
752 return Q931E_NO_ERROR;
753 }
754
755 /*****************************************************************************
756
757 Function: Q931Pmes_Release
758
759 *****************************************************************************/
Q931Pmes_Release(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)760 L3INT Q931Pmes_Release(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
761 {
762 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
763 L3INT rc = Q931E_NO_ERROR;
764 L3INT Octet = 0;
765
766 /* Q931 Message Header */
767 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
768
769 /* Cause */
770 if (Q931IsIEPresent(pMes->Cause)) {
771 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
772 return rc;
773 }
774
775 /* Display */
776 if (Q931IsIEPresent(pMes->Display)) {
777 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
778 return rc;
779 }
780
781 /* Signal */
782 if (Q931IsIEPresent(pMes->Signal)) {
783 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
784 return rc;
785 }
786
787 *OSize = Octet;
788 return rc;
789 }
790
791 /*****************************************************************************
792
793 Function: Q931Umes_ReleaseComplete
794
795 *****************************************************************************/
Q931Umes_ReleaseComplete(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)796 L3INT Q931Umes_ReleaseComplete(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
797 {
798 L3INT OOff = 0;
799 L3INT rc = Q931E_NO_ERROR;
800
801 while (IOff < Size) {
802 switch (IBuf[IOff]) {
803 case Q931ie_CAUSE:
804 case Q931ie_DISPLAY:
805 case Q931ie_SIGNAL:
806 case Q931ie_USER_USER:
807 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
808 if (rc != Q931E_NO_ERROR)
809 return rc;
810 break;
811 default:
812 return Q931E_ILLEGAL_IE;
813 break;
814 }
815 }
816
817 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
818 return Q931E_NO_ERROR;
819 }
820
821 /*****************************************************************************
822
823 Function: Q931Pmes_ReleaseComplete
824
825 *****************************************************************************/
Q931Pmes_ReleaseComplete(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)826 L3INT Q931Pmes_ReleaseComplete(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
827 {
828 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
829 L3INT rc = Q931E_NO_ERROR;
830 L3INT Octet = 0;
831
832 /* Q931 Message Header */
833 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
834
835 /* Cause */
836 if (Q931IsIEPresent(pMes->Cause)) {
837 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
838 return rc;
839 }
840
841 /* Display */
842 if (Q931IsIEPresent(pMes->Display)) {
843 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
844 return rc;
845 }
846
847 /* Signal */
848 if (Q931IsIEPresent(pMes->Signal)) {
849 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
850 return rc;
851 }
852
853 *OSize = Octet;
854 return rc;
855 }
856
857 /*****************************************************************************
858
859 Function: Q931Umes_Restart
860
861 *****************************************************************************/
Q931Umes_Restart(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)862 L3INT Q931Umes_Restart(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
863 {
864 L3INT OOff = 0;
865 L3INT rc = Q931E_NO_ERROR;
866
867 while (IOff < Size) {
868 switch (IBuf[IOff]) {
869 case Q931ie_CHANNEL_IDENTIFICATION:
870 case Q931ie_DISPLAY:
871 case Q931ie_RESTART_INDICATOR:
872 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
873 if (rc != Q931E_NO_ERROR)
874 return rc;
875 break;
876 default:
877 return Q931E_ILLEGAL_IE;
878 break;
879 }
880 }
881
882 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
883 return Q931E_NO_ERROR;
884 }
885
886 /*****************************************************************************
887
888 Function: Q931Pmes_Restart
889
890 *****************************************************************************/
Q931Pmes_Restart(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)891 L3INT Q931Pmes_Restart(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
892 {
893 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
894 L3INT rc = Q931E_NO_ERROR;
895 L3INT Octet = 0;
896
897 /* Q931 Message Header */
898 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
899
900 /* ChanID */
901 if (Q931IsIEPresent(pMes->ChanID)) {
902 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
903 return rc;
904 }
905
906 /* Display */
907 if (Q931IsIEPresent(pMes->Display)) {
908 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
909 return rc;
910 }
911
912 /* RestartInd */
913 if (Q931IsIEPresent(pMes->RestartInd)) {
914 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_RESTART_INDICATOR](pTrunk, Q931GetIEPtr(pMes->RestartInd,pMes->buf), OBuf, &Octet)) != 0)
915 return rc;
916 }
917
918 *OSize = Octet;
919 return rc;
920 }
921
922 /*****************************************************************************
923
924 Function: Q931Umes_RestartAck
925
926 *****************************************************************************/
Q931Umes_RestartAck(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * OBuf,L3INT IOff,L3INT Size)927 L3INT Q931Umes_RestartAck(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *OBuf, L3INT IOff, L3INT Size)
928 {
929 Q931mes_Generic *mes = (Q931mes_Generic*)OBuf;
930 L3INT OOff = 0;
931 L3INT rc = Q931E_NO_ERROR;
932
933 while (IOff < Size) {
934 switch (IBuf[IOff]) {
935 case Q931ie_CHANNEL_IDENTIFICATION:
936 case Q931ie_DISPLAY:
937 case Q931ie_RESTART_INDICATOR:
938 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
939 if (rc != Q931E_NO_ERROR)
940 return rc;
941 break;
942 default:
943 return Q931E_ILLEGAL_IE;
944 break;
945 }
946 }
947
948 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
949 return Q931E_NO_ERROR;
950 }
951
952 /*****************************************************************************
953
954 Function: Q931Pmes_RestartAck
955
956 *****************************************************************************/
Q931Pmes_RestartAck(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)957 L3INT Q931Pmes_RestartAck(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
958 {
959 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
960 L3INT rc = Q931E_NO_ERROR;
961 L3INT Octet = 0;
962
963 /* Q931 Message Header */
964 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
965
966 /* ChanID */
967 if (Q931IsIEPresent(pMes->ChanID)) {
968 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
969 return rc;
970 }
971
972 /* Display */
973 if (Q931IsIEPresent(pMes->Display)) {
974 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
975 return rc;
976 }
977
978 /* RestartInd */
979 if (Q931IsIEPresent(pMes->RestartInd)) {
980 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_RESTART_INDICATOR](pTrunk, Q931GetIEPtr(pMes->RestartInd,pMes->buf), OBuf, &Octet)) != 0)
981 return rc;
982 }
983
984 *OSize = Octet;
985 return rc;
986 }
987
988 /*****************************************************************************
989
990 Function: Q931Umes_Resume
991
992 *****************************************************************************/
Q931Umes_Resume(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)993 L3INT Q931Umes_Resume(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
994 {
995 L3INT OOff = 0;
996 L3INT rc = Q931E_NO_ERROR;
997
998 while (IOff < Size) {
999 switch (IBuf[IOff]) {
1000 case Q931ie_CALL_IDENTITY:
1001 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1002 if (rc != Q931E_NO_ERROR)
1003 return rc;
1004 break;
1005 default:
1006 return Q931E_ILLEGAL_IE;
1007 break;
1008 }
1009 }
1010
1011 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1012 return Q931E_NO_ERROR;
1013 }
1014
1015 /*****************************************************************************
1016
1017 Function: Q931Pmes_Resume
1018
1019 *****************************************************************************/
Q931Pmes_Resume(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1020 L3INT Q931Pmes_Resume(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1021 {
1022 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1023 L3INT rc = Q931E_NO_ERROR;
1024 L3INT Octet = 0;
1025
1026 /* Q931 Message Header */
1027 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1028
1029 /* Call Identity */
1030 if (Q931IsIEPresent(pMes->CallID)) {
1031 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALL_IDENTITY](pTrunk, Q931GetIEPtr(pMes->CallID,pMes->buf), OBuf, &Octet)) != 0)
1032 return rc;
1033 }
1034
1035 *OSize = Octet;
1036 return rc;
1037 }
1038
1039 /*****************************************************************************
1040
1041 Function: Q931Umes_ResumeAck
1042
1043 *****************************************************************************/
Q931Umes_ResumeAck(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)1044 L3INT Q931Umes_ResumeAck(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1045 {
1046 L3INT OOff = 0;
1047 L3INT rc = Q931E_NO_ERROR;
1048
1049 while (IOff < Size) {
1050 switch (IBuf[IOff]) {
1051 case Q931ie_CHANNEL_IDENTIFICATION:
1052 case Q931ie_DISPLAY:
1053 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1054 if (rc != Q931E_NO_ERROR)
1055 return rc;
1056 break;
1057 default:
1058 return Q931E_ILLEGAL_IE;
1059 break;
1060 }
1061 }
1062
1063 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1064 return Q931E_NO_ERROR;
1065 }
1066
1067
1068 /*****************************************************************************
1069
1070 Function: Q931Pmes_ResumeAck
1071
1072 *****************************************************************************/
Q931Pmes_ResumeAck(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1073 L3INT Q931Pmes_ResumeAck(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1074 {
1075 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1076 L3INT rc = Q931E_NO_ERROR;
1077 L3INT Octet = 0;
1078
1079 /* Q931 Message Header */
1080 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1081
1082 /* Channel Identification */
1083 if (Q931IsIEPresent(pMes->ChanID)) {
1084 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
1085 return rc;
1086 }
1087
1088 /* Display */
1089 if (Q931IsIEPresent(pMes->Display)) {
1090 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1091 return rc;
1092 }
1093
1094 *OSize = Octet;
1095 return rc;
1096 }
1097
1098 /*****************************************************************************
1099
1100 Function: Q931Umes_ResumeReject
1101
1102 *****************************************************************************/
Q931Umes_ResumeReject(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)1103 L3INT Q931Umes_ResumeReject(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1104 {
1105 L3INT OOff = 0;
1106 L3INT rc = Q931E_NO_ERROR;
1107
1108 while (IOff < Size) {
1109 switch (IBuf[IOff]) {
1110 case Q931ie_CAUSE:
1111 case Q931ie_DISPLAY:
1112 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1113 if (rc != Q931E_NO_ERROR)
1114 return rc;
1115 break;
1116 default:
1117 return Q931E_ILLEGAL_IE;
1118 break;
1119 }
1120 }
1121
1122 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1123 return Q931E_NO_ERROR;
1124 }
1125
1126
1127 /*****************************************************************************
1128
1129 Function: Q931Pmes_ResumeReject
1130
1131 *****************************************************************************/
Q931Pmes_ResumeReject(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1132 L3INT Q931Pmes_ResumeReject(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1133 {
1134 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1135 L3INT rc = Q931E_NO_ERROR;
1136 L3INT Octet = 0;
1137
1138 /* Q931 Message Header */
1139 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1140
1141 /* Cause */
1142 if (Q931IsIEPresent(pMes->Cause)) {
1143 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
1144 return rc;
1145 }
1146
1147 /* Display */
1148 if (Q931IsIEPresent(pMes->Display)) {
1149 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1150 return rc;
1151 }
1152
1153 *OSize = Octet;
1154 return rc;
1155 }
1156
Q931Umes_Segment(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT OOff)1157 L3INT Q931Umes_Segment(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT OOff)
1158 {
1159 L3INT i = IOff;
1160
1161 return IOff - i;
1162 }
1163
Q931Pmes_Segment(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1164 L3INT Q931Pmes_Segment(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1165 {
1166 L3BOOL RetCode = L3FALSE;
1167
1168 *OSize = 0;
1169 return RetCode;
1170 }
1171
1172 /*****************************************************************************
1173
1174 Function: Q931Umes_Setup
1175
1176 *****************************************************************************/
Q931Umes_Setup(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)1177 L3INT Q931Umes_Setup(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1178 {
1179 L3INT ir = 0;
1180 L3INT OOff = 0;
1181 L3INT rc = Q931E_NO_ERROR;
1182
1183 while (IOff < Size) {
1184 switch (IBuf[IOff]) {
1185 case Q931ie_SENDING_COMPLETE:
1186 IOff++;
1187 break;
1188
1189 case Q931ie_BEARER_CAPABILITY:
1190 case Q931ie_CHANNEL_IDENTIFICATION:
1191 case Q931ie_PROGRESS_INDICATOR:
1192 case Q931ie_NETWORK_SPECIFIC_FACILITIES:
1193 case Q931ie_DISPLAY:
1194 case Q931ie_DATETIME:
1195 case Q931ie_KEYPAD_FACILITY:
1196 case Q931ie_SIGNAL:
1197 case Q931ie_CALLING_PARTY_NUMBER:
1198 case Q931ie_CALLING_PARTY_SUBADDRESS:
1199 case Q931ie_CALLED_PARTY_NUMBER:
1200 case Q931ie_CALLED_PARTY_SUBADDRESS:
1201 case Q931ie_TRANSIT_NETWORK_SELECTION:
1202 case Q931ie_LOW_LAYER_COMPATIBILITY:
1203 case Q931ie_HIGH_LAYER_COMPATIBILITY:
1204 case Q931ie_FACILITY:
1205 case Q931ie_USER_USER:
1206 case Q931ie_REDIRECTING_NUMBER:
1207 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1208 if (rc != Q931E_NO_ERROR)
1209 return rc;
1210 break;
1211
1212 case Q931ie_REPEAT_INDICATOR:
1213 if (ir < 2) {
1214 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1215 ir++;
1216 } else {
1217 return Q931E_ILLEGAL_IE;
1218 }
1219 break;
1220
1221 default:
1222 return Q931E_ILLEGAL_IE;
1223 break;
1224 }
1225 }
1226
1227 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1228 return Q931E_NO_ERROR;
1229 }
1230
1231 /*****************************************************************************
1232
1233 Function: Q931Pmes_Setup
1234
1235 Decription: Pack a Q931mes_Generic into a real Q.931 message. The user will
1236 set up a SETUP message and issue this to the stack where it
1237 is processed by Q931ProcSetup that processes and validates
1238 it before it actually sends it out. This function is called
1239 to compute the real Q.931 message.
1240
1241 Parameters: IBuf[IN] Ptr to un-packed struct
1242 ISize[IN] Size of input buffer (unpacked message).
1243 OBuf[OUT] Ptr to packed 'octet' wise message.
1244 OSize[OUT] Size of packed message.
1245
1246 Called By: Q931ProcSetup
1247
1248 *****************************************************************************/
Q931Pmes_Setup(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1249 L3INT Q931Pmes_Setup(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1250 {
1251 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1252 L3INT rc = Q931E_NO_ERROR;
1253 L3INT Octet = 0;
1254
1255 /* Q931 Message Header */
1256 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1257
1258 /* Sending Complete */
1259 if (Q931IsIEPresent(pMes->SendComplete)) {
1260 OBuf[Octet++] = (L3UCHAR)Q931ie_SENDING_COMPLETE & 0xff;
1261 }
1262
1263 /* Repeat Indicator */
1264 if (Q931IsIEPresent(pMes->RepeatInd)) {
1265 OBuf[Octet++] = (L3UCHAR)Q931ie_REPEAT_INDICATOR & 0xff;
1266 }
1267
1268 /* Bearer capability */
1269 if (Q931IsIEPresent(pMes->BearerCap)) {
1270 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_BEARER_CAPABILITY](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet)) != 0)
1271 return rc;
1272 } else {
1273 rc = Q931E_BEARERCAP;
1274 }
1275
1276 /* Channel Identification */
1277 if (Q931IsIEPresent(pMes->ChanID)) {
1278 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
1279 return rc;
1280 }
1281
1282 /* Progress indicator */
1283 if (Q931IsIEPresent(pMes->ProgInd)) {
1284 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
1285 return rc;
1286 }
1287
1288 /* Network spesific facilities */
1289 if (Q931IsIEPresent(pMes->NetFac)) {
1290 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_NETWORK_SPECIFIC_FACILITIES](pTrunk, Q931GetIEPtr(pMes->NetFac,pMes->buf), OBuf, &Octet)) != 0)
1291 return rc;
1292 }
1293
1294 /* Display */
1295 if (Q931IsIEPresent(pMes->Display)) {
1296 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1297 return rc;
1298 }
1299
1300 /* Date/Time */
1301 if (Q931IsIEPresent(pMes->DateTime)) {
1302 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DATETIME](pTrunk, Q931GetIEPtr(pMes->DateTime,pMes->buf), OBuf, &Octet)) != 0)
1303 return rc;
1304 }
1305
1306 /* Keypad Facility */
1307 if (Q931IsIEPresent(pMes->KeypadFac)) {
1308 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_KEYPAD_FACILITY](pTrunk, Q931GetIEPtr(pMes->KeypadFac,pMes->buf), OBuf, &Octet)) != 0)
1309 return rc;
1310 }
1311
1312 /* Signal */
1313 if (Q931IsIEPresent(pMes->Signal)) {
1314 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
1315 return rc;
1316 }
1317
1318 /* Calling Party Number */
1319 if (Q931IsIEPresent(pMes->CallingNum)) {
1320 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLING_PARTY_NUMBER](pTrunk, Q931GetIEPtr(pMes->CallingNum,pMes->buf), OBuf, &Octet)) != 0)
1321 return rc;
1322 }
1323
1324 /* Calling Party Subaddress */
1325 if (Q931IsIEPresent(pMes->CallingSub)) {
1326 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLING_PARTY_SUBADDRESS](pTrunk, Q931GetIEPtr(pMes->CallingSub,pMes->buf), OBuf, &Octet)) != 0)
1327 return rc;
1328 }
1329
1330 /* Called Party number */
1331 if (Q931IsIEPresent(pMes->CalledNum)) {
1332 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLED_PARTY_NUMBER](pTrunk, Q931GetIEPtr(pMes->CalledNum,pMes->buf), OBuf, &Octet)) != 0)
1333 return rc;
1334 }
1335
1336 /* Called party subaddress */
1337 if (Q931IsIEPresent(pMes->CalledSub)) {
1338 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLED_PARTY_SUBADDRESS](pTrunk, Q931GetIEPtr(pMes->CalledSub,pMes->buf), OBuf, &Octet)) != 0)
1339 return rc;
1340 }
1341
1342 /* Transit network selection */
1343 if (Q931IsIEPresent(pMes->TransNetSel)) {
1344 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_TRANSIT_NETWORK_SELECTION](pTrunk, Q931GetIEPtr(pMes->TransNetSel,pMes->buf), OBuf, &Octet)) != 0)
1345 return rc;
1346 }
1347
1348 /* Repeat Indicator */
1349 if (Q931IsIEPresent(pMes->LLRepeatInd)) {
1350 rc = Q931E_UNKNOWN_IE;/* TODO */
1351 }
1352
1353 /* Low Layer Compatibility */
1354 if (Q931IsIEPresent(pMes->LLComp)) {
1355 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_LOW_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->LLComp,pMes->buf), OBuf, &Octet)) != 0)
1356 return rc;
1357 }
1358
1359 /* High Layer Compatibility */
1360 if (Q931IsIEPresent(pMes->HLComp)) {
1361 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_HIGH_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet)) != 0)
1362 return rc;
1363 }
1364
1365 *OSize = Octet;
1366 return rc;
1367 }
1368
1369 /*****************************************************************************
1370
1371 Function: Q931Umes_SetupAck
1372
1373 *****************************************************************************/
Q931Umes_SetupAck(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)1374 L3INT Q931Umes_SetupAck(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1375 {
1376 L3INT OOff = 0;
1377 L3INT rc = Q931E_NO_ERROR;
1378
1379 while (IOff < Size) {
1380 switch (IBuf[IOff]) {
1381 case Q931ie_CHANNEL_IDENTIFICATION:
1382 case Q931ie_PROGRESS_INDICATOR:
1383 case Q931ie_DISPLAY:
1384 case Q931ie_SIGNAL:
1385 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1386 if (rc != Q931E_NO_ERROR)
1387 return rc;
1388 break;
1389 default:
1390 return Q931E_ILLEGAL_IE;
1391 break;
1392 }
1393 }
1394
1395 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1396 return Q931E_NO_ERROR;
1397 }
1398
1399 /*****************************************************************************
1400
1401 Function: Q931Pmes_SetupAck
1402
1403 *****************************************************************************/
Q931Pmes_SetupAck(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1404 L3INT Q931Pmes_SetupAck(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1405 {
1406 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1407 L3INT rc = Q931E_NO_ERROR;
1408 L3INT Octet = 0;
1409
1410 /* Q931 Message Header */
1411 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1412
1413 /* Channel Identification */
1414 if (Q931IsIEPresent(pMes->ChanID)) {
1415 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
1416 return rc;
1417 }
1418
1419 /* Progress indicator */
1420 if (Q931IsIEPresent(pMes->ProgInd)) {
1421 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
1422 return rc;
1423 }
1424
1425 /* Display */
1426 if (Q931IsIEPresent(pMes->Display)) {
1427 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1428 return rc;
1429 }
1430
1431 /* Signal */
1432 if (Q931IsIEPresent(pMes->Signal)) {
1433 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
1434 return rc;
1435 }
1436
1437 *OSize = Octet;
1438 return rc;
1439 }
1440
1441 /*****************************************************************************
1442
1443 Function: Q931Umes_Status
1444
1445 *****************************************************************************/
Q931Umes_Status(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)1446 L3INT Q931Umes_Status(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1447 {
1448 L3INT OOff = 0;
1449 L3INT rc = Q931E_NO_ERROR;
1450
1451 while (IOff < Size) {
1452 switch (IBuf[IOff]) {
1453 case Q931ie_CAUSE:
1454 case Q931ie_CALL_STATE:
1455 case Q931ie_DISPLAY:
1456 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1457 if (rc != Q931E_NO_ERROR)
1458 return rc;
1459 break;
1460 default:
1461 return Q931E_ILLEGAL_IE;
1462 break;
1463 }
1464 }
1465
1466 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1467 return Q931E_NO_ERROR;
1468 }
1469
1470
1471 /*****************************************************************************
1472
1473 Function: Q931Pmes_Status
1474
1475 *****************************************************************************/
Q931Pmes_Status(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1476 L3INT Q931Pmes_Status(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1477 {
1478 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1479 L3INT rc = Q931E_NO_ERROR;
1480 L3INT Octet = 0;
1481
1482 /* Q931 Message Header */
1483 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1484
1485 /* Cause */
1486 if (Q931IsIEPresent(pMes->Cause)) {
1487 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
1488 return rc;
1489 }
1490
1491 /* Call State */
1492 if (Q931IsIEPresent(pMes->CallState)) {
1493 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALL_STATE](pTrunk, Q931GetIEPtr(pMes->CallState,pMes->buf), OBuf, &Octet)) != 0)
1494 return rc;
1495 }
1496
1497 /* Display */
1498 if (Q931IsIEPresent(pMes->Display)) {
1499 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1500 return rc;
1501 }
1502
1503 *OSize = Octet;
1504 return rc;
1505 }
1506
1507 /*****************************************************************************
1508
1509 Function: Q931Umes_StatusEnquiry
1510
1511 *****************************************************************************/
Q931Umes_StatusEnquiry(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)1512 L3INT Q931Umes_StatusEnquiry(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1513 {
1514 L3INT OOff = 0;
1515 L3INT rc = Q931E_NO_ERROR;
1516
1517 while (IOff < Size) {
1518 switch (IBuf[IOff]) {
1519 case Q931ie_DISPLAY:
1520 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1521 if (rc != Q931E_NO_ERROR)
1522 return rc;
1523 break;
1524 default:
1525 return Q931E_ILLEGAL_IE;
1526 break;
1527 }
1528 }
1529
1530 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1531 return Q931E_NO_ERROR;
1532 }
1533
1534 /*****************************************************************************
1535
1536 Function: Q931Pmes_StatusEnquiry
1537
1538 *****************************************************************************/
Q931Pmes_StatusEnquiry(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1539 L3INT Q931Pmes_StatusEnquiry(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1540 {
1541 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1542 L3INT rc = Q931E_NO_ERROR;
1543 L3INT Octet = 0;
1544
1545 /* Q931 Message Header */
1546 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1547
1548 /* Display */
1549 if (Q931IsIEPresent(pMes->Display)) {
1550 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1551 return rc;
1552 }
1553
1554 *OSize = Octet;
1555
1556 return rc;
1557 }
1558
1559 /*****************************************************************************
1560
1561 Function: Q931Umes_Suspend
1562
1563 *****************************************************************************/
Q931Umes_Suspend(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)1564 L3INT Q931Umes_Suspend(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1565 {
1566 L3INT OOff = 0;
1567 L3INT rc = Q931E_NO_ERROR;
1568
1569 while (IOff < Size) {
1570 switch (IBuf[IOff]) {
1571 case Q931ie_CALL_IDENTITY:
1572 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1573 if (rc != Q931E_NO_ERROR)
1574 return rc;
1575 break;
1576 default:
1577 return Q931E_ILLEGAL_IE;
1578 break;
1579 }
1580 }
1581
1582 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1583 return Q931E_NO_ERROR;
1584 }
1585
1586 /*****************************************************************************
1587
1588 Function: Q931Pmes_Suspend
1589
1590 *****************************************************************************/
Q931Pmes_Suspend(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1591 L3INT Q931Pmes_Suspend(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1592 {
1593 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1594 L3INT rc = Q931E_NO_ERROR;
1595 L3INT Octet = 0;
1596
1597 /* Q931 Message Header */
1598 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1599
1600 /* Call Identity */
1601 if (Q931IsIEPresent(pMes->CallID)) {
1602 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALL_IDENTITY](pTrunk, Q931GetIEPtr(pMes->CallID,pMes->buf), OBuf, &Octet)) != 0)
1603 return rc;
1604 }
1605
1606 *OSize = Octet;
1607 return rc;
1608 }
1609
1610 /*****************************************************************************
1611
1612 Function: Q931Umes_SuspendAck
1613
1614 *****************************************************************************/
Q931Umes_SuspendAck(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)1615 L3INT Q931Umes_SuspendAck(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1616 {
1617 L3INT OOff = 0;
1618 L3INT rc = Q931E_NO_ERROR;
1619
1620 while (IOff < Size) {
1621 switch (IBuf[IOff]) {
1622 case Q931ie_DISPLAY:
1623 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1624 if (rc != Q931E_NO_ERROR)
1625 return rc;
1626 break;
1627 default:
1628 return Q931E_ILLEGAL_IE;
1629 break;
1630 }
1631 }
1632
1633 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1634 return Q931E_NO_ERROR;
1635 }
1636
1637 /*****************************************************************************
1638
1639 Function: Q931Pmes_SuspendAck
1640
1641 *****************************************************************************/
Q931Pmes_SuspendAck(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1642 L3INT Q931Pmes_SuspendAck(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1643 {
1644 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1645 L3INT rc = Q931E_NO_ERROR;
1646 L3INT Octet = 0;
1647
1648 /* Q931 Message Header */
1649 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1650
1651 /* Display */
1652 if (Q931IsIEPresent(pMes->Display)) {
1653 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1654 return rc;
1655 }
1656
1657 *OSize = Octet;
1658 return rc;
1659 }
1660
1661 /*****************************************************************************
1662
1663 Function: Q931Umes_SuspendReject
1664
1665 *****************************************************************************/
Q931Umes_SuspendReject(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)1666 L3INT Q931Umes_SuspendReject(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1667 {
1668 L3INT OOff = 0;
1669 L3INT rc = Q931E_NO_ERROR;
1670
1671 while (IOff < Size) {
1672 switch (IBuf[IOff]) {
1673 case Q931ie_CAUSE:
1674 case Q931ie_DISPLAY:
1675 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1676 if (rc != Q931E_NO_ERROR)
1677 return rc;
1678 break;
1679 default:
1680 return Q931E_ILLEGAL_IE;
1681 break;
1682 }
1683 }
1684
1685 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1686 return Q931E_NO_ERROR;
1687 }
1688
1689 /*****************************************************************************
1690
1691 Function: Q931Pmes_SuspendReject
1692
1693 *****************************************************************************/
Q931Pmes_SuspendReject(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1694 L3INT Q931Pmes_SuspendReject(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1695 {
1696 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1697 L3INT rc = Q931E_NO_ERROR;
1698 L3INT Octet = 0;
1699
1700 /* Q931 Message Header */
1701 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1702
1703 /* Cause */
1704 if (Q931IsIEPresent(pMes->Cause)) {
1705 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
1706 return rc;
1707 }
1708
1709 /* Display */
1710 if (Q931IsIEPresent(pMes->Display)) {
1711 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1712 return rc;
1713 }
1714
1715 *OSize = Octet;
1716 return rc;
1717 }
1718
1719 /*****************************************************************************
1720
1721 Function: Q931Umes_UserInformation
1722
1723 *****************************************************************************/
Q931Umes_UserInformation(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT I,L3INT O)1724 L3INT Q931Umes_UserInformation(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT I, L3INT O)
1725 {
1726 L3BOOL RetCode = L3FALSE;
1727
1728 NoWarning(mes);
1729 NoWarning(IBuf);
1730
1731 return RetCode;
1732 }
1733
1734 /*****************************************************************************
1735
1736 Function: Q931Pmes_UserInformation
1737
1738 *****************************************************************************/
Q931Pmes_UserInformation(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1739 L3INT Q931Pmes_UserInformation(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1740 {
1741 L3BOOL RetCode = L3FALSE;
1742
1743 NoWarning(OBuf);
1744 NoWarning(IBuf);
1745
1746 *OSize = 0;
1747
1748 return RetCode;
1749 }
1750
1751 /*****************************************************************************
1752
1753 Function: Q931Umes_Service
1754
1755 *****************************************************************************/
Q931Umes_Service(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)1756 L3INT Q931Umes_Service(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1757 {
1758 L3INT OOff = 0;
1759 L3INT rc = Q931E_NO_ERROR;
1760
1761 while (IOff < Size) {
1762 switch (IBuf[IOff]) {
1763 case Q931ie_CHANNEL_IDENTIFICATION:
1764 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1765 if (rc != Q931E_NO_ERROR)
1766 return rc;
1767 break;
1768 case Q931ie_CHANGE_STATUS:
1769 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1770 if (rc != Q931E_NO_ERROR)
1771 return rc;
1772 break;
1773 default:
1774 return Q931E_ILLEGAL_IE;
1775 break;
1776 }
1777 }
1778
1779 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1780 return Q931E_NO_ERROR;
1781 }
1782
1783 /*****************************************************************************
1784
1785 Function: Q931Pmes_Service
1786
1787 *****************************************************************************/
Q931Pmes_Service(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1788 L3INT Q931Pmes_Service(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1789 {
1790 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1791 L3INT rc = Q931E_NO_ERROR;
1792 L3INT Octet = 0;
1793
1794 /* Q931 Message Header */
1795 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1796
1797 /* Display */
1798 if (Q931IsIEPresent(pMes->ChanID)) {
1799 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
1800 return rc;
1801 }
1802
1803 if (Q931IsIEPresent(pMes->ChangeStatus)) {
1804 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANGE_STATUS](pTrunk, Q931GetIEPtr(pMes->ChangeStatus,pMes->buf), OBuf, &Octet)) != 0)
1805 return rc;
1806 }
1807
1808 *OSize = Octet;
1809 return rc;
1810 }
1811
1812 /*****************************************************************************
1813
1814 Function: Q931Umes_ServiceAck
1815
1816 *****************************************************************************/
Q931Umes_ServiceAck(Q931_TrunkInfo_t * pTrunk,L3UCHAR * IBuf,Q931mes_Generic * mes,L3INT IOff,L3INT Size)1817 L3INT Q931Umes_ServiceAck(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1818 {
1819 L3INT OOff = 0;
1820 L3INT rc = Q931E_NO_ERROR;
1821
1822 while (IOff < Size) {
1823 switch (IBuf[IOff]) {
1824 case Q931ie_CHANNEL_IDENTIFICATION:
1825 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1826 if (rc != Q931E_NO_ERROR)
1827 return rc;
1828 break;
1829 case Q931ie_CHANGE_STATUS:
1830 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1831 if (rc != Q931E_NO_ERROR)
1832 return rc;
1833 break;
1834 default:
1835 return Q931E_ILLEGAL_IE;
1836 break;
1837 }
1838 }
1839
1840 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1841 return Q931E_NO_ERROR;
1842 }
1843
1844 /*****************************************************************************
1845
1846 Function: Q931Pmes_ServiceAck
1847
1848 *****************************************************************************/
Q931Pmes_ServiceAck(Q931_TrunkInfo_t * pTrunk,Q931mes_Generic * IBuf,L3INT ISize,L3UCHAR * OBuf,L3INT * OSize)1849 L3INT Q931Pmes_ServiceAck(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1850 {
1851 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1852 L3INT rc = Q931E_NO_ERROR;
1853 L3INT Octet = 0;
1854
1855 /* Q931 Message Header */
1856 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1857
1858 if (Q931IsIEPresent(pMes->ChangeStatus)) {
1859 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANGE_STATUS](pTrunk, Q931GetIEPtr(pMes->ChangeStatus,pMes->buf), OBuf, &Octet)) != 0)
1860 return rc;
1861 }
1862
1863 if (Q931IsIEPresent(pMes->ChanID)) {
1864 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
1865 return rc;
1866 }
1867
1868 *OSize = Octet;
1869 return rc;
1870 }
1871