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