1 /*****************************************************************************
2 
3   FileName:		Q931api.c
4 
5   Contents:		api (Application Programming Interface) functions.
6 				See	q931.h for description.
7 
8   License/Copyright:
9 
10   Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
11   email:janvb@caselaboratories.com
12 
13   Redistribution and use in source and binary forms, with or without
14   modification, are permitted provided that the following conditions are
15   met:
16 
17     * Redistributions of source code must retain the above copyright notice,
18 	  this list of conditions and the following disclaimer.
19     * Redistributions in binary form must reproduce the above copyright notice,
20 	  this list of conditions and the following disclaimer in the documentation
21 	  and/or other materials provided with the distribution.
22     * Neither the name of the Case Labs, Ltd nor the names of its contributors
23 	  may be used to endorse or promote products derived from this software
24 	  without specific prior written permission.
25 
26   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36   POSSIBILITY OF SUCH DAMAGE.
37 *****************************************************************************/
38 
39 #include "Q931.h"
40 #include "memory.h"
41 
42 extern L3INT Q931L4HeaderSpace;
43 
44 /*
45 L3INT Q931CreateMesIndex(L3INT mc)
46 {
47     if(mc < 0 || mc > 127 )
48         return Q931E_INTERNAL;
49 
50     if(Q931MesCount >127)
51         return Q931E_INTERNAL;
52 
53     Q931MesIndex[mc] = Q931MesCount ++;
54 
55     return Q931E_NO_ERROR;
56 }
57 */
58 /*
59 L3INT Q931CreateIEIndex(L3INT iec)
60 {
61     if(iec < 0 || iec > 127 )
62         return Q931E_INTERNAL;
63 
64     if(Q931IECount > 127)
65         return Q931E_INTERNAL;
66 
67     Q931IEIndex[iec] = Q931IECount ++;
68 
69     return Q931E_NO_ERROR;
70 }
71 */
72 
Q931Api_InitTrunk(Q931_TrunkInfo_t * pTrunk,Q931Dialect_t Dialect,Q931NetUser_t NetUser,Q931_TrunkType_t TrunkType,Q931Tx34CB_t Q931Tx34CBProc,Q931Tx32CB_t Q931Tx32CBProc,Q931ErrorCB_t Q931ErrorCBProc,void * PrivateData32,void * PrivateData34)73 L3INT Q931Api_InitTrunk(Q931_TrunkInfo_t *pTrunk,
74 						Q931Dialect_t Dialect,
75 						Q931NetUser_t NetUser,
76 						Q931_TrunkType_t TrunkType,
77 						Q931Tx34CB_t Q931Tx34CBProc,
78 						Q931Tx32CB_t Q931Tx32CBProc,
79 						Q931ErrorCB_t Q931ErrorCBProc,
80 						void *PrivateData32,
81 						void *PrivateData34)
82 {
83 	int y, dchannel, maxchans, has_sync = 0;
84 
85 	switch(TrunkType)
86 	{
87 	case Q931_TrType_E1:
88 		dchannel = 16;
89 		maxchans = 31;
90 		has_sync = 1;
91 		break;
92 
93 	case Q931_TrType_T1:
94 	case Q931_TrType_J1:
95 		dchannel = 24;
96 		maxchans = 24;
97 		break;
98 
99 	case Q931_TrType_BRI:
100 	case Q931_TrType_BRI_PTMP:
101 		dchannel = 3;
102 		maxchans = 3;
103 		break;
104 
105 	default:
106 		return 0;
107 	}
108 
109 	pTrunk->Q931Tx34CBProc = Q931Tx34CBProc;
110 	pTrunk->Q931Tx32CBProc = Q931Tx32CBProc;
111 	pTrunk->Q931ErrorCBProc = Q931ErrorCBProc;
112 	pTrunk->PrivateData32 = PrivateData32;
113 	pTrunk->PrivateData34 = PrivateData34;
114 
115     pTrunk->LastCRV			= 0;
116     pTrunk->Dialect			= Dialect + NetUser;
117     pTrunk->Enabled			= 0;
118     pTrunk->TrunkType		= TrunkType;
119     pTrunk->NetUser			= NetUser;
120     pTrunk->TrunkState		= 0;
121 	pTrunk->autoRestartAck	= 0;
122     for(y=0; y < Q931MAXCHPERTRUNK; y++)
123     {
124         pTrunk->ch[y].Available = 1;
125 
126         if(has_sync && y == 0)
127         {
128             pTrunk->ch[y].ChanType = Q931_ChType_Sync;
129         }
130         else if(y == dchannel)
131         {
132             pTrunk->ch[y].ChanType = Q931_ChType_D;
133         }
134         else if(y > maxchans)
135         {
136             pTrunk->ch[y].ChanType = Q931_ChType_NotUsed;
137         }
138         else
139         {
140 			pTrunk->ch[y].ChanType = Q931_ChType_B;
141         }
142     }
143 
144     for(y=0; y < Q931MAXCALLPERTRUNK; y++)
145     {
146         pTrunk->call[y].InUse = 0;
147 
148     }
149 	return 1;
150 }
151 
Q931SetMesProc(L3UCHAR mes,L3UCHAR dialect,q931proc_func_t * Q931ProcFunc,q931umes_func_t * Q931UmesFunc,q931pmes_func_t * Q931PmesFunc)152 void Q931SetMesProc(L3UCHAR mes, L3UCHAR dialect, q931proc_func_t *Q931ProcFunc, q931umes_func_t *Q931UmesFunc, q931pmes_func_t *Q931PmesFunc)
153 {
154     if(Q931ProcFunc != NULL)
155         Q931Proc[dialect][mes] = Q931ProcFunc;
156     if(Q931UmesFunc != NULL)
157         Q931Umes[dialect][mes] = Q931UmesFunc;
158     if(Q931PmesFunc != NULL)
159         Q931Pmes[dialect][mes] = Q931PmesFunc;
160 }
161 
Q931SetIEProc(L3UCHAR iec,L3UCHAR dialect,q931pie_func_t * Q931PieProc,q931uie_func_t * Q931UieProc)162 void Q931SetIEProc(L3UCHAR iec, L3UCHAR dialect, q931pie_func_t *Q931PieProc, q931uie_func_t *Q931UieProc)
163 {
164     if(Q931PieProc != NULL)
165         Q931Pie[dialect][iec] = Q931PieProc;
166     if(Q931UieProc != NULL)
167         Q931Uie[dialect][iec] = Q931UieProc;
168 }
169 
Q931SetTimeoutProc(L3UCHAR dialect,L3UCHAR timer,q931timeout_func_t * Q931TimeoutProc)170 void Q931SetTimeoutProc(L3UCHAR dialect, L3UCHAR timer, q931timeout_func_t *Q931TimeoutProc)
171 {
172 	if(Q931Timeout != NULL)
173 		Q931Timeout[dialect][timer] = Q931TimeoutProc;
174 }
175 
Q931SetTimerDefault(L3UCHAR dialect,L3UCHAR timer,q931timer_t timeout)176 void Q931SetTimerDefault(L3UCHAR dialect, L3UCHAR timer, q931timer_t timeout)
177 {
178 	Q931Timer[dialect][timer] = timeout;
179 }
180 
Q931GetMesSize(Q931mes_Generic * pMes)181 L3INT Q931GetMesSize(Q931mes_Generic *pMes)
182 {
183 
184     L3UCHAR *p = &pMes->buf[0];
185     L3INT Size = (L3INT)(p - (L3UCHAR *)pMes);
186     return Size;
187 }
188 
189 /*****************************************************************************
190 
191   Function:     q931AppendIE
192 
193   Description:  Append IE to the message.
194 
195   Parameters:   pm      Ptr to message.
196                 pi      Ptr to information element
197 
198   Return Value  ie setting
199 
200 *****************************************************************************/
201 
Q931AppendIE(L3UCHAR * pm,L3UCHAR * pi)202 ie Q931AppendIE( L3UCHAR *pm, L3UCHAR *pi)
203 {
204 	ie IE = 0;
205 	Q931mes_Generic * pMes= (Q931mes_Generic *)pm;
206 	Q931ie_BearerCap * pIE= (Q931ie_BearerCap *)pi;
207 	L3INT iISize = pIE->Size;
208 
209 	L3UCHAR *pBuf = &pMes->buf[0];
210 	L3INT Off = (L3INT)(pMes->Size - (pBuf - pm));
211 	IE = (ie)(Off | 0x8000);
212 
213 	memcpy(&pm[pMes->Size], pi, iISize);
214 
215 	pMes->Size += iISize;
216 
217 	return IE;
218 }
219 
220 /*****************************************************************************
221 *****************************************************************************/
222 static L3INT crv={1};
223 
Q931GetUniqueCRV(Q931_TrunkInfo_t * pTrunk)224 L3INT Q931GetUniqueCRV(Q931_TrunkInfo_t *pTrunk)
225 {
226 	L3INT max = (Q931_IS_BRI(pTrunk)) ? Q931_BRI_MAX_CRV : Q931_PRI_MAX_CRV;
227 
228 	crv++;
229 	crv = (crv <= max) ? crv : 1;
230 
231 	return crv;
232 }
233 
Q931InitMesGeneric(Q931mes_Generic * pMes)234 L3INT Q931InitMesGeneric(Q931mes_Generic *pMes)
235 {
236 	memset(pMes, 0, sizeof(*pMes));
237 	pMes->ProtDisc		= 0x08;
238 	pMes->Size			= Q931GetMesSize(pMes);
239 
240 	return 0;
241 }
242 
Q931InitMesResume(Q931mes_Generic * pMes)243 L3INT Q931InitMesResume(Q931mes_Generic * pMes)
244 {
245 	pMes->ProtDisc		= 0x08;
246 	pMes->CRV			= 0;		/* CRV to be allocated, might be receive*/
247 	pMes->MesType		= Q931mes_RESUME;
248 
249 	pMes->Size			= Q931GetMesSize(pMes);
250     pMes->CallID        = 0;        /* Channel Identification               */
251 	return 0;
252 }
253 
Q931InitMesRestartAck(Q931mes_Generic * pMes)254 L3INT Q931InitMesRestartAck(Q931mes_Generic * pMes)
255 {
256 	pMes->ProtDisc		= 0x08;
257 	pMes->CRV			= 0;		/* CRV to be allocated, might be receive*/
258 	pMes->MesType		= Q931mes_RESTART_ACKNOWLEDGE;
259 
260 	pMes->Size			= Q931GetMesSize(pMes);
261     pMes->ChanID        = 0;        /* Channel Identification               */
262 	pMes->Display		= 0;
263 	pMes->RestartInd	= 0;
264 	pMes->RestartWin	= 0;
265 	return 0;
266 }
267 
Q931InitIEBearerCap(Q931ie_BearerCap * pIE)268 L3INT Q931InitIEBearerCap(Q931ie_BearerCap *pIE)
269 {
270 	pIE->IEId			= Q931ie_BEARER_CAPABILITY;
271 	pIE->Size			= sizeof(Q931ie_BearerCap);
272 	pIE->CodStand		= 0;
273 	pIE->ITC			= 0;
274 	pIE->TransMode		= 0;
275 	pIE->ITR			= 0x10;
276 	pIE->RateMul		= 0;
277 
278 	pIE->Layer1Ident	= 0;
279 	pIE->UIL1Prot		= 0;        /* User Information Layer 1 Protocol    */
280 	pIE->SyncAsync		= 0;        /* Sync/Async                           */
281 	pIE->Negot			= 0;
282 	pIE->UserRate		= 0;
283 	pIE->InterRate		= 0;        /* Intermediate Rate                    */
284 	pIE->NIConTx		= 0;
285 	pIE->NIConRx		= 0;
286 	pIE->FlowCtlTx		= 0;        /* Flow control on Tx                   */
287 	pIE->FlowCtlRx		= 0;        /* Flow control on Rx                   */
288 	pIE->HDR			= 0;
289 	pIE->MultiFrame		= 0;        /* Multi frame support                  */
290 	pIE->Mode			= 0;
291 	pIE->LLInegot		= 0;
292 	pIE->Assignor		= 0;        /* Assignor/assignee                    */
293 	pIE->InBandNeg		= 0;        /* In-band/out-band negot.              */
294 	pIE->NumStopBits	= 0;        /* Number of stop bits                  */
295 	pIE->NumDataBits	= 0;        /* Number of data bits.                 */
296 	pIE->Parity			= 0;
297 	pIE->DuplexMode		= 0;
298 	pIE->ModemType		= 0;
299 	pIE->Layer2Ident	= 0;
300 	pIE->UIL2Prot		= 0;        /* User Information Layer 2 Protocol    */
301 	pIE->Layer3Ident	= 0;
302 	pIE->UIL3Prot		= 0;        /* User Information Layer 3 Protocol    */
303 	pIE->AL3Info1		= 0;
304 	pIE->AL3Info2		= 0;
305 
306 	return 0;
307 }
308 
Q931InitIEChanID(Q931ie_ChanID * pIE)309 L3INT Q931InitIEChanID(Q931ie_ChanID *pIE)
310 {
311 	pIE->IEId			= Q931ie_CHANNEL_IDENTIFICATION;
312 	pIE->Size			= sizeof(Q931ie_ChanID);
313 	pIE->IntIDPresent	= 0;        /* Int. id. present                     */
314 	pIE->IntType		= 0;        /* Int. type                            */
315 	pIE->PrefExcl		= 0;        /* Pref./Excl.                          */
316 	pIE->DChanInd		= 0;        /* D-channel ind.                       */
317 	pIE->InfoChanSel	= 0;        /* Info. channel selection              */
318 	pIE->InterfaceID	= 0;        /* Interface identifier                 */
319 	pIE->CodStand		= 0;		/* Code standard                        */
320 	pIE->NumMap			= 0;        /* Number/Map                           */
321 	pIE->ChanMapType	= 0;        /* Channel type/Map element type        */
322 	pIE->ChanSlot		= 0;        /* Channel number/Slot map              */
323 
324 	return 0;
325 }
326 
Q931InitIEProgInd(Q931ie_ProgInd * pIE)327 L3INT Q931InitIEProgInd(Q931ie_ProgInd * pIE)
328 {
329 	pIE->IEId			= Q931ie_PROGRESS_INDICATOR;
330 	pIE->Size			= sizeof(Q931ie_ProgInd);
331 	pIE->CodStand		= 0;        /* Coding standard                      */
332 	pIE->Location		= 0;        /* Location                             */
333 	pIE->ProgDesc		= 0;        /* Progress description                 */
334 
335 	return 0;
336 }
337 
Q931InitIENetFac(Q931ie_NetFac * pIE)338 L3INT Q931InitIENetFac(Q931ie_NetFac * pIE)
339 {
340 	pIE->IEId			= Q931ie_NETWORK_SPECIFIC_FACILITIES;
341 	pIE->Size			= sizeof(Q931ie_NetFac);
342 	pIE->LenNetID		= 0;        /* Length of network facilities id.     */
343 	pIE->TypeNetID		= 0;        /* Type of network identification       */
344 	pIE->NetIDPlan		= 0;        /* Network identification plan.         */
345 	pIE->NetFac			= 0;        /* Network specific facility spec.      */
346 	pIE->NetID[0]		= 0;
347 	return 0;
348 }
349 
Q931InitIEDisplay(Q931ie_Display * pIE)350 L3INT Q931InitIEDisplay(Q931ie_Display * pIE)
351 {
352 	pIE->IEId			= Q931ie_DISPLAY;
353 	pIE->Size			= sizeof(Q931ie_Display);
354 	pIE->Display[0]		= 0;
355 	return 0;
356 }
357 
Q931InitIEDateTime(Q931ie_DateTime * pIE)358 L3INT Q931InitIEDateTime(Q931ie_DateTime * pIE)
359 {
360 	pIE->IEId			= Q931ie_DATETIME;
361 	pIE->Size			= sizeof(Q931ie_DateTime);
362 	pIE->Year			= 0;        /* Year                                 */
363 	pIE->Month			= 0;        /* Month                                */
364 	pIE->Day			= 0;        /* Day                                  */
365 	pIE->Hour			= 0;        /* Hour                                 */
366 	pIE->Minute			= 0;        /* Minute                               */
367 	pIE->Second			= 0;        /* Second                               */
368 
369 	return 0;
370 }
371 
Q931InitIEKeypadFac(Q931ie_KeypadFac * pIE)372 L3INT Q931InitIEKeypadFac(Q931ie_KeypadFac * pIE)
373 {
374 	pIE->IEId			= Q931ie_KEYPAD_FACILITY;
375 	pIE->Size			= sizeof(Q931ie_KeypadFac);
376 	pIE->KeypadFac[0]	= 0;
377 	return 0;
378 }
379 
Q931InitIESignal(Q931ie_Signal * pIE)380 L3INT Q931InitIESignal(Q931ie_Signal * pIE)
381 {
382 	pIE->IEId			= Q931ie_SIGNAL;
383 	pIE->Size			= sizeof(Q931ie_Signal);
384 	pIE->Signal			= 0;
385 	return 0;
386 }
387 
Q931InitIECallingNum(Q931ie_CallingNum * pIE)388 L3INT Q931InitIECallingNum(Q931ie_CallingNum * pIE)
389 {
390 	pIE->IEId			= Q931ie_CALLING_PARTY_NUMBER;
391 	pIE->Size			= sizeof(Q931ie_CallingNum);
392 	pIE->TypNum			= 0;        /* Type of number                       */
393 	pIE->NumPlanID		= 0;        /* Numbering plan identification        */
394 	pIE->PresInd		= 0;        /* Presentation indicator               */
395 	pIE->ScreenInd		= 0;        /* Screening indicator                  */
396 	pIE->Digit[0]		= 0;        /* Number digits (IA5)                  */
397 
398 	return 0;
399 }
400 
Q931InitIECallingSub(Q931ie_CallingSub * pIE)401 L3INT Q931InitIECallingSub(Q931ie_CallingSub * pIE)
402 {
403 	pIE->IEId			= Q931ie_CALLING_PARTY_SUBADDRESS;
404 	pIE->Size			= sizeof(Q931ie_CallingSub);
405 	pIE->TypNum			= 0;        /* Type of subaddress                   */
406 	pIE->OddEvenInd		= 0;        /* Odd/Even indicator                   */
407 	pIE->Digit[0]		= 0;        /* Digits                               */
408 
409 	return 0;
410 }
411 
Q931InitIECalledNum(Q931ie_CalledNum * pIE)412 L3INT Q931InitIECalledNum(Q931ie_CalledNum * pIE)
413 {
414 	pIE->IEId			= Q931ie_CALLED_PARTY_NUMBER;
415 	pIE->Size			= sizeof(Q931ie_CalledNum);
416 	pIE->TypNum			= 0;        /* Type of Number                       */
417 	pIE->NumPlanID		= 0;        /* Numbering plan identification        */
418 	pIE->Digit[0]		= 0;        /* Digit (IA5)                          */
419 
420 	return 0;
421 }
422 
Q931InitIECalledSub(Q931ie_CalledSub * pIE)423 L3INT Q931InitIECalledSub(Q931ie_CalledSub * pIE)
424 {
425 	pIE->IEId			= Q931ie_CALLED_PARTY_SUBADDRESS;
426 	pIE->Size			= sizeof(Q931ie_CalledSub);
427 	pIE->TypNum			= 0;        /* Type of subaddress                   */
428 	pIE->OddEvenInd		= 0;        /* Odd/Even indicator                   */
429 	pIE->Digit[0]		= 0;        /* Digits                               */
430 
431 	return 0;
432 }
433 
Q931InitIETransNetSel(Q931ie_TransNetSel * pIE)434 L3INT Q931InitIETransNetSel(Q931ie_TransNetSel * pIE)
435 {
436 	pIE->IEId			= Q931ie_TRANSIT_NETWORK_SELECTION;
437 	pIE->Size			= sizeof(Q931ie_TransNetSel);
438 	pIE->Type			= 0;        /* Type of network identifier           */
439 	pIE->NetIDPlan		= 0;        /* Network idetification plan           */
440 	pIE->NetID[0]		= 0;        /* Network identification(IA5)          */
441 
442 	return 0;
443 }
444 
Q931InitIELLComp(Q931ie_LLComp * pIE)445 L3INT Q931InitIELLComp(Q931ie_LLComp * pIE)
446 {
447 	pIE->IEId			= Q931ie_LOW_LAYER_COMPATIBILITY;
448 	pIE->Size			= sizeof(Q931ie_LLComp);
449 
450 	pIE->CodStand		= 0;        /* Coding standard                      */
451 	pIE->ITransCap		= 0;        /* Information transfer capability      */
452 	pIE->NegotInd		= 0;        /* Negot indic.                         */
453 	pIE->TransMode		= 0;        /* Transfer Mode                        */
454 	pIE->InfoRate		= 0;        /* Information transfer rate            */
455 	pIE->RateMul		= 0;        /* Rate multiplier                      */
456 	pIE->Layer1Ident	= 0;        /* Layer 1 ident.                       */
457 	pIE->UIL1Prot		= 0;        /* User information layer 1 protocol    */
458 	pIE->SyncAsync		= 0;        /* Synch/asynch                         */
459 	pIE->Negot			= 0;        /* Negot                                */
460 	pIE->UserRate		= 0;        /* User rate                            */
461 	pIE->InterRate		= 0;        /* Intermediate rate                    */
462 	pIE->NIConTx		= 0;        /* NIC on Tx                            */
463 	pIE->NIConRx		= 0;        /* NIC on Rx                            */
464 	pIE->FlowCtlTx		= 0;        /* Flow control on Tx                   */
465 	pIE->FlowCtlRx		= 0;        /* Flow control on Rx                   */
466 	pIE->HDR			= 0;        /* Hdr/no hdr                           */
467 	pIE->MultiFrame		= 0;        /* Multiframe                           */
468 	pIE->ModeL1			= 0;		/* Mode L1								*/
469 	pIE->NegotLLI		= 0;        /* Negot. LLI                           */
470 	pIE->Assignor		= 0;        /* Assignor/Assignor ee                 */
471 	pIE->InBandNeg		= 0;        /* In-band negot.                       */
472 	pIE->NumStopBits	= 0;        /* Number of stop bits                  */
473 	pIE->NumDataBits	= 0;        /* Number of data bits                  */
474 	pIE->Parity			= 0;        /* Parity                               */
475 	pIE->DuplexMode		= 0;        /* Duplex Mode                          */
476 	pIE->ModemType		= 0;        /* Modem type                           */
477 	pIE->Layer2Ident	= 0;        /* Layer 2 ident.                       */
478 	pIE->UIL2Prot		= 0;        /* User information layer 2 protocol    */
479 	pIE->ModeL2			= 0;        /* ModeL2                               */
480 	pIE->Q933use		= 0;        /* Q.9333 use                           */
481 	pIE->UsrSpcL2Prot	= 0;        /* User specified layer 2 protocol info */
482 	pIE->WindowSize		= 0;        /* Window size (k)                      */
483 	pIE->Layer3Ident	= 0;        /* Layer 3 ident                        */
484 	pIE->OptL3Info		= 0;        /* Optional layer 3 protocol info.      */
485 	pIE->ModeL3			= 0;        /* Mode of operation                    */
486 #if 0
487 	pIE->ModeX25op		= 0;        /* Mode of operation X.25               */
488 #endif
489 	pIE->DefPackSize	= 0;        /* Default packet size                  */
490 	pIE->PackWinSize	= 0;        /* Packet window size                   */
491 	pIE->AddL3Info		= 0;        /* Additional Layer 3 protocol info     */
492 
493 	return 0;
494 }
495 
Q931InitIEHLComp(Q931ie_HLComp * pIE)496 L3INT Q931InitIEHLComp(Q931ie_HLComp * pIE)
497 {
498 	pIE->IEId			= Q931ie_HIGH_LAYER_COMPATIBILITY;
499 	pIE->Size			= sizeof(Q931ie_HLComp);
500 
501 	return 0;
502 }
503 
Q931ProcUnknownMessage(Q931_TrunkInfo_t * pTrunk,L3UCHAR * b,L3INT iFrom)504 L3INT Q931ProcUnknownMessage(Q931_TrunkInfo_t *pTrunk,L3UCHAR * b, L3INT iFrom)
505 {
506 	/* TODO:  Unhandled paramaters */
507 	(void)pTrunk;
508 	(void)b;
509 	(void)iFrom;
510 
511     return 0;
512 }
513 
Q931ProcUnexpectedMessage(Q931_TrunkInfo_t * pTrunk,L3UCHAR * b,L3INT iFrom)514 L3INT Q931ProcUnexpectedMessage(Q931_TrunkInfo_t *pTrunk,L3UCHAR * b, L3INT iFrom)
515 {
516 	/* TODO:  Unhandled paramaters */
517 	(void)pTrunk;
518 	(void)b;
519 	(void)iFrom;
520 
521     return 0;
522 }
523 
Q931Disconnect(Q931_TrunkInfo_t * pTrunk,L3INT iTo,L3INT iCRV,L3INT iCause)524 L3INT Q931Disconnect(Q931_TrunkInfo_t *pTrunk, L3INT iTo, L3INT iCRV, L3INT iCause)
525 {
526 	/* TODO:  Unhandled paramaters */
527 	(void)pTrunk;
528 	(void)iTo;
529 	(void)iCRV;
530 	(void)iCause;
531 
532     return 0;
533 }
534 
Q931ReleaseComplete(Q931_TrunkInfo_t * pTrunk,L3UCHAR * buf)535 L3INT Q931ReleaseComplete(Q931_TrunkInfo_t *pTrunk, L3UCHAR *buf)
536 {
537     Q931mes_Header *ptr = (Q931mes_Header*)&buf[Q931L4HeaderSpace];
538 	ptr->MesType = Q931mes_RELEASE_COMPLETE;
539 	ptr->CRVFlag = !(ptr->CRVFlag);
540 	return Q931Tx32Data(pTrunk,0,buf,ptr->Size);
541 }
542 
Q931AckRestart(Q931_TrunkInfo_t * pTrunk,L3UCHAR * buf)543 L3INT Q931AckRestart(Q931_TrunkInfo_t *pTrunk, L3UCHAR *buf)
544 {
545 	L3INT RetCode;
546 
547     Q931mes_Header *ptr = (Q931mes_Header*)&buf[Q931L4HeaderSpace];
548 	ptr->MesType = Q931mes_RESTART_ACKNOWLEDGE;
549 	//if (ptr->CRV) {
550 		ptr->CRVFlag = !(ptr->CRVFlag);
551 		//}
552 
553 	RetCode = Q931Proc[pTrunk->Dialect][ptr->MesType](pTrunk, buf, 4);
554 
555     return RetCode;
556 }
557 
Q931AckSetup(Q931_TrunkInfo_t * pTrunk,L3UCHAR * buf)558 L3INT Q931AckSetup(Q931_TrunkInfo_t *pTrunk, L3UCHAR *buf)
559 {
560 	L3INT RetCode;
561 
562     Q931mes_Header *ptr = (Q931mes_Header*)&buf[Q931L4HeaderSpace];
563 	ptr->MesType = Q931mes_SETUP_ACKNOWLEDGE;
564 
565 	RetCode = Q931Proc[pTrunk->Dialect][ptr->MesType](pTrunk, buf, 4);
566 
567     return RetCode;
568 }
569 
Q931AckConnect(Q931_TrunkInfo_t * pTrunk,L3UCHAR * buf)570 L3INT Q931AckConnect(Q931_TrunkInfo_t *pTrunk, L3UCHAR *buf)
571 {
572 	L3INT RetCode;
573 
574     Q931mes_Header *ptr = (Q931mes_Header*)&buf[Q931L4HeaderSpace];
575 	ptr->MesType = Q931mes_CONNECT_ACKNOWLEDGE;
576 
577 	RetCode = Q931Proc[pTrunk->Dialect][ptr->MesType](pTrunk, buf, 4);
578 
579     return RetCode;
580 }
581 
Q931AckService(Q931_TrunkInfo_t * pTrunk,L3UCHAR * buf)582 L3INT Q931AckService(Q931_TrunkInfo_t *pTrunk, L3UCHAR *buf)
583 {
584 	L3INT RetCode;
585 
586     Q931mes_Header *ptr = (Q931mes_Header*)&buf[Q931L4HeaderSpace];
587 	ptr->MesType = Q931mes_SERVICE_ACKNOWLEDGE;
588 	if (ptr->CRV) {
589 		ptr->CRVFlag = !(ptr->CRVFlag);
590 	}
591 
592 	RetCode = Q931Proc[pTrunk->Dialect][ptr->MesType](pTrunk, buf, 4);
593 
594     return RetCode;
595 }
596 
597 Q931_ENUM_NAMES(DIALECT_TYPE_NAMES, DIALECT_STRINGS)
598 Q931_STR2ENUM(q931_str2Q931Dialect_type, q931_Q931Dialect_type2str, Q931Dialect_t, DIALECT_TYPE_NAMES, Q931_Dialect_Count)
599