This source file includes following definitions.
- Q931Api_InitTrunk
- Q931SetMesProc
- Q931SetIEProc
- Q931SetTimeoutProc
- Q931SetTimerDefault
- Q931GetMesSize
- Q931AppendIE
- Q931GetUniqueCRV
- Q931InitMesGeneric
- Q931InitMesResume
- Q931InitMesRestartAck
- Q931InitIEBearerCap
- Q931InitIEChanID
- Q931InitIEProgInd
- Q931InitIENetFac
- Q931InitIEDisplay
- Q931InitIEDateTime
- Q931InitIEKeypadFac
- Q931InitIESignal
- Q931InitIECallingNum
- Q931InitIECallingSub
- Q931InitIECalledNum
- Q931InitIECalledSub
- Q931InitIETransNetSel
- Q931InitIELLComp
- Q931InitIEHLComp
- Q931ProcUnknownMessage
- Q931ProcUnexpectedMessage
- Q931Disconnect
- Q931ReleaseComplete
- Q931AckRestart
- Q931AckSetup
- Q931AckConnect
- Q931AckService
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 #include "Q931.h"
40 #include "memory.h"
41
42 extern L3INT Q931L4HeaderSpace;
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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
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
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
170 void Q931SetTimeoutProc(L3UCHAR dialect, L3UCHAR timer, q931timeout_func_t *Q931TimeoutProc)
171 {
172 if(Q931Timeout != NULL)
173 Q931Timeout[dialect][timer] = Q931TimeoutProc;
174 }
175
176 void Q931SetTimerDefault(L3UCHAR dialect, L3UCHAR timer, q931timer_t timeout)
177 {
178 Q931Timer[dialect][timer] = timeout;
179 }
180
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
192
193
194
195
196
197
198
199
200
201
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
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
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
243 L3INT Q931InitMesResume(Q931mes_Generic * pMes)
244 {
245 pMes->ProtDisc = 0x08;
246 pMes->CRV = 0;
247 pMes->MesType = Q931mes_RESUME;
248
249 pMes->Size = Q931GetMesSize(pMes);
250 pMes->CallID = 0;
251 return 0;
252 }
253
254 L3INT Q931InitMesRestartAck(Q931mes_Generic * pMes)
255 {
256 pMes->ProtDisc = 0x08;
257 pMes->CRV = 0;
258 pMes->MesType = Q931mes_RESTART_ACKNOWLEDGE;
259
260 pMes->Size = Q931GetMesSize(pMes);
261 pMes->ChanID = 0;
262 pMes->Display = 0;
263 pMes->RestartInd = 0;
264 pMes->RestartWin = 0;
265 return 0;
266 }
267
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;
280 pIE->SyncAsync = 0;
281 pIE->Negot = 0;
282 pIE->UserRate = 0;
283 pIE->InterRate = 0;
284 pIE->NIConTx = 0;
285 pIE->NIConRx = 0;
286 pIE->FlowCtlTx = 0;
287 pIE->FlowCtlRx = 0;
288 pIE->HDR = 0;
289 pIE->MultiFrame = 0;
290 pIE->Mode = 0;
291 pIE->LLInegot = 0;
292 pIE->Assignor = 0;
293 pIE->InBandNeg = 0;
294 pIE->NumStopBits = 0;
295 pIE->NumDataBits = 0;
296 pIE->Parity = 0;
297 pIE->DuplexMode = 0;
298 pIE->ModemType = 0;
299 pIE->Layer2Ident = 0;
300 pIE->UIL2Prot = 0;
301 pIE->Layer3Ident = 0;
302 pIE->UIL3Prot = 0;
303 pIE->AL3Info1 = 0;
304 pIE->AL3Info2 = 0;
305
306 return 0;
307 }
308
309 L3INT Q931InitIEChanID(Q931ie_ChanID *pIE)
310 {
311 pIE->IEId = Q931ie_CHANNEL_IDENTIFICATION;
312 pIE->Size = sizeof(Q931ie_ChanID);
313 pIE->IntIDPresent = 0;
314 pIE->IntType = 0;
315 pIE->PrefExcl = 0;
316 pIE->DChanInd = 0;
317 pIE->InfoChanSel = 0;
318 pIE->InterfaceID = 0;
319 pIE->CodStand = 0;
320 pIE->NumMap = 0;
321 pIE->ChanMapType = 0;
322 pIE->ChanSlot = 0;
323
324 return 0;
325 }
326
327 L3INT Q931InitIEProgInd(Q931ie_ProgInd * pIE)
328 {
329 pIE->IEId = Q931ie_PROGRESS_INDICATOR;
330 pIE->Size = sizeof(Q931ie_ProgInd);
331 pIE->CodStand = 0;
332 pIE->Location = 0;
333 pIE->ProgDesc = 0;
334
335 return 0;
336 }
337
338 L3INT Q931InitIENetFac(Q931ie_NetFac * pIE)
339 {
340 pIE->IEId = Q931ie_NETWORK_SPECIFIC_FACILITIES;
341 pIE->Size = sizeof(Q931ie_NetFac);
342 pIE->LenNetID = 0;
343 pIE->TypeNetID = 0;
344 pIE->NetIDPlan = 0;
345 pIE->NetFac = 0;
346 pIE->NetID[0] = 0;
347 return 0;
348 }
349
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
358 L3INT Q931InitIEDateTime(Q931ie_DateTime * pIE)
359 {
360 pIE->IEId = Q931ie_DATETIME;
361 pIE->Size = sizeof(Q931ie_DateTime);
362 pIE->Year = 0;
363 pIE->Month = 0;
364 pIE->Day = 0;
365 pIE->Hour = 0;
366 pIE->Minute = 0;
367 pIE->Second = 0;
368
369 return 0;
370 }
371
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
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
388 L3INT Q931InitIECallingNum(Q931ie_CallingNum * pIE)
389 {
390 pIE->IEId = Q931ie_CALLING_PARTY_NUMBER;
391 pIE->Size = sizeof(Q931ie_CallingNum);
392 pIE->TypNum = 0;
393 pIE->NumPlanID = 0;
394 pIE->PresInd = 0;
395 pIE->ScreenInd = 0;
396 pIE->Digit[0] = 0;
397
398 return 0;
399 }
400
401 L3INT Q931InitIECallingSub(Q931ie_CallingSub * pIE)
402 {
403 pIE->IEId = Q931ie_CALLING_PARTY_SUBADDRESS;
404 pIE->Size = sizeof(Q931ie_CallingSub);
405 pIE->TypNum = 0;
406 pIE->OddEvenInd = 0;
407 pIE->Digit[0] = 0;
408
409 return 0;
410 }
411
412 L3INT Q931InitIECalledNum(Q931ie_CalledNum * pIE)
413 {
414 pIE->IEId = Q931ie_CALLED_PARTY_NUMBER;
415 pIE->Size = sizeof(Q931ie_CalledNum);
416 pIE->TypNum = 0;
417 pIE->NumPlanID = 0;
418 pIE->Digit[0] = 0;
419
420 return 0;
421 }
422
423 L3INT Q931InitIECalledSub(Q931ie_CalledSub * pIE)
424 {
425 pIE->IEId = Q931ie_CALLED_PARTY_SUBADDRESS;
426 pIE->Size = sizeof(Q931ie_CalledSub);
427 pIE->TypNum = 0;
428 pIE->OddEvenInd = 0;
429 pIE->Digit[0] = 0;
430
431 return 0;
432 }
433
434 L3INT Q931InitIETransNetSel(Q931ie_TransNetSel * pIE)
435 {
436 pIE->IEId = Q931ie_TRANSIT_NETWORK_SELECTION;
437 pIE->Size = sizeof(Q931ie_TransNetSel);
438 pIE->Type = 0;
439 pIE->NetIDPlan = 0;
440 pIE->NetID[0] = 0;
441
442 return 0;
443 }
444
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;
451 pIE->ITransCap = 0;
452 pIE->NegotInd = 0;
453 pIE->TransMode = 0;
454 pIE->InfoRate = 0;
455 pIE->RateMul = 0;
456 pIE->Layer1Ident = 0;
457 pIE->UIL1Prot = 0;
458 pIE->SyncAsync = 0;
459 pIE->Negot = 0;
460 pIE->UserRate = 0;
461 pIE->InterRate = 0;
462 pIE->NIConTx = 0;
463 pIE->NIConRx = 0;
464 pIE->FlowCtlTx = 0;
465 pIE->FlowCtlRx = 0;
466 pIE->HDR = 0;
467 pIE->MultiFrame = 0;
468 pIE->ModeL1 = 0;
469 pIE->NegotLLI = 0;
470 pIE->Assignor = 0;
471 pIE->InBandNeg = 0;
472 pIE->NumStopBits = 0;
473 pIE->NumDataBits = 0;
474 pIE->Parity = 0;
475 pIE->DuplexMode = 0;
476 pIE->ModemType = 0;
477 pIE->Layer2Ident = 0;
478 pIE->UIL2Prot = 0;
479 pIE->ModeL2 = 0;
480 pIE->Q933use = 0;
481 pIE->UsrSpcL2Prot = 0;
482 pIE->WindowSize = 0;
483 pIE->Layer3Ident = 0;
484 pIE->OptL3Info = 0;
485 pIE->ModeL3 = 0;
486 #if 0
487 pIE->ModeX25op = 0;
488 #endif
489 pIE->DefPackSize = 0;
490 pIE->PackWinSize = 0;
491 pIE->AddL3Info = 0;
492
493 return 0;
494 }
495
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
504 L3INT Q931ProcUnknownMessage(Q931_TrunkInfo_t *pTrunk,L3UCHAR * b, L3INT iFrom)
505 {
506
507 (void)pTrunk;
508 (void)b;
509 (void)iFrom;
510
511 return 0;
512 }
513
514 L3INT Q931ProcUnexpectedMessage(Q931_TrunkInfo_t *pTrunk,L3UCHAR * b, L3INT iFrom)
515 {
516
517 (void)pTrunk;
518 (void)b;
519 (void)iFrom;
520
521 return 0;
522 }
523
524 L3INT Q931Disconnect(Q931_TrunkInfo_t *pTrunk, L3INT iTo, L3INT iCRV, L3INT iCause)
525 {
526
527 (void)pTrunk;
528 (void)iTo;
529 (void)iCRV;
530 (void)iCause;
531
532 return 0;
533 }
534
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
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
550 ptr->CRVFlag = !(ptr->CRVFlag);
551
552
553 RetCode = Q931Proc[pTrunk->Dialect][ptr->MesType](pTrunk, buf, 4);
554
555 return RetCode;
556 }
557
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
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
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)