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