This source file includes following definitions.
- DMSUmes_Setup
- DMSPmes_Setup
- DMSUmes_0x0f
- DMSPmes_0x0f
- DMSUmes_0x07
- DMSPmes_0x07
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
40
41
42
43
44
45
46
47 #include "DMS.h"
48
49
50
51
52
53
54 L3INT DMSUmes_Setup(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
55 {
56 L3INT ir = 0;
57 L3INT OOff = 0;
58 L3INT rc = Q931E_NO_ERROR;
59 L3UCHAR last_codeset = 0, codeset = 0;
60 L3UCHAR shift_lock = 1;
61
62 while (IOff < Size) {
63 if (!shift_lock) {
64 codeset = last_codeset;
65 }
66
67 if ((IBuf[IOff] & 0xF0) == Q931ie_SHIFT ) {
68 shift_lock = (IBuf[IOff] & 0x08);
69 if (shift_lock) {
70 last_codeset = codeset;
71 }
72 codeset = ((IBuf[IOff] & 0x07));
73 IOff++;
74 }
75
76 if (codeset == 0) {
77 switch (IBuf[IOff]) {
78 case Q931ie_SENDING_COMPLETE:
79 case Q931ie_BEARER_CAPABILITY:
80 case Q931ie_CHANNEL_IDENTIFICATION:
81 case Q931ie_PROGRESS_INDICATOR:
82 case Q931ie_NETWORK_SPECIFIC_FACILITIES:
83 case Q931ie_DISPLAY:
84 case Q931ie_DATETIME:
85 case Q931ie_KEYPAD_FACILITY:
86 case Q931ie_SIGNAL:
87 case Q931ie_CALLING_PARTY_NUMBER:
88 case Q931ie_CALLING_PARTY_SUBADDRESS:
89 case Q931ie_CALLED_PARTY_NUMBER:
90 case Q931ie_CALLED_PARTY_SUBADDRESS:
91 case Q931ie_TRANSIT_NETWORK_SELECTION:
92 case Q931ie_LOW_LAYER_COMPATIBILITY:
93 case Q931ie_HIGH_LAYER_COMPATIBILITY:
94 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
95 if (rc != Q931E_NO_ERROR)
96 return rc;
97 break;
98 case Q931ie_REPEAT_INDICATOR:
99 if (ir < 2) {
100 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
101 ir++;
102 } else {
103 return Q931E_ILLEGAL_IE;
104 }
105 break;
106 default:
107 return Q931E_ILLEGAL_IE;
108 break;
109 }
110 } else if (codeset == 6) {
111 switch (IBuf[IOff]) {
112 case Q931ie_GENERIC_DIGITS:
113 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
114 if (rc != Q931E_NO_ERROR)
115 return rc;
116 break;
117 default:
118 return Q931E_ILLEGAL_IE;
119 break;
120 }
121
122 } else {
123 return Q931E_ILLEGAL_IE;
124 }
125 }
126 mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
127 return Q931E_NO_ERROR;
128 }
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148 L3INT DMSPmes_Setup(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
149 {
150 L3INT rc = Q931E_NO_ERROR;
151 Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
152 L3INT Octet = 0;
153
154
155 Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
156
157
158 if (Q931IsIEPresent(pMes->SendComplete)) {
159 OBuf[Octet++] = (L3UCHAR)(pMes->SendComplete & 0x00ff);
160 }
161
162
163 if (Q931IsIEPresent(pMes->RepeatInd)) {
164 OBuf[Octet++] = (L3UCHAR)(pMes->RepeatInd & 0x00ff);
165 }
166
167
168 if (Q931IsIEPresent(pMes->BearerCap)) {
169 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_BEARER_CAPABILITY](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet)) != 0)
170 return rc;
171 } else {
172 rc = Q931E_BEARERCAP;
173 }
174
175
176 if (Q931IsIEPresent(pMes->ChanID)) {
177 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
178 return rc;
179 }
180
181
182 if (Q931IsIEPresent(pMes->ProgInd)) {
183 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
184 return rc;
185 }
186
187
188 if (Q931IsIEPresent(pMes->NetFac)) {
189 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_NETWORK_SPECIFIC_FACILITIES](pTrunk, Q931GetIEPtr(pMes->NetFac,pMes->buf), OBuf, &Octet)) != 0)
190 return rc;
191 }
192
193
194 if (Q931IsIEPresent(pMes->Display)) {
195 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
196 return rc;
197 }
198
199
200 if (Q931IsIEPresent(pMes->DateTime)) {
201 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DATETIME](pTrunk, Q931GetIEPtr(pMes->DateTime,pMes->buf), OBuf, &Octet)) != 0)
202 return rc;
203 }
204
205
206 if (Q931IsIEPresent(pMes->KeypadFac)) {
207 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_KEYPAD_FACILITY](pTrunk, Q931GetIEPtr(pMes->KeypadFac,pMes->buf), OBuf, &Octet)) != 0)
208 return rc;
209 }
210
211
212 if (Q931IsIEPresent(pMes->Signal)) {
213 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
214 return rc;
215 }
216
217
218 if (Q931IsIEPresent(pMes->CallingNum)) {
219 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLING_PARTY_NUMBER](pTrunk, Q931GetIEPtr(pMes->CallingNum,pMes->buf), OBuf, &Octet)) != 0)
220 return rc;
221 }
222
223
224 if (Q931IsIEPresent(pMes->CallingSub)) {
225 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLING_PARTY_SUBADDRESS](pTrunk, Q931GetIEPtr(pMes->CallingSub,pMes->buf), OBuf, &Octet)) != 0)
226 return rc;
227 }
228
229
230 if (Q931IsIEPresent(pMes->CalledNum)) {
231 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLED_PARTY_NUMBER](pTrunk, Q931GetIEPtr(pMes->CalledNum,pMes->buf), OBuf, &Octet)) != 0)
232 return rc;
233 }
234
235
236
237 if (Q931IsIEPresent(pMes->CalledSub)) {
238 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLED_PARTY_SUBADDRESS](pTrunk, Q931GetIEPtr(pMes->CalledSub,pMes->buf), OBuf, &Octet)) != 0)
239 return rc;
240 }
241
242
243 if (Q931IsIEPresent(pMes->TransNetSel)) {
244 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_TRANSIT_NETWORK_SELECTION](pTrunk, Q931GetIEPtr(pMes->TransNetSel,pMes->buf), OBuf, &Octet)) != 0)
245 return rc;
246 }
247
248
249 if (Q931IsIEPresent(pMes->LLRepeatInd)) {
250 rc = Q931E_UNKNOWN_IE;
251 }
252
253
254 if (Q931IsIEPresent(pMes->LLComp)) {
255 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_LOW_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->LLComp,pMes->buf), OBuf, &Octet)) != 0)
256 return rc;
257 }
258
259
260 if (Q931IsIEPresent(pMes->HLComp)) {
261 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_HIGH_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet)) != 0)
262 return rc;
263 }
264
265 *OSize = Octet;
266 return rc;
267 }
268
269
270
271
272
273
274
275 L3INT DMSUmes_0x0f(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
276 {
277 if (mes->ProtDisc == 8) {
278 return Q931Umes_ConnectAck(pTrunk, IBuf, mes, IOff, Size);
279 }
280
281 if (mes->ProtDisc == 3) {
282 return Q931Umes_Service(pTrunk, IBuf, mes, IOff, Size);
283 }
284
285 return Q931E_UNKNOWN_MESSAGE;
286 }
287
288
289
290
291
292
293 L3INT DMSPmes_0x0f(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
294 {
295 Q931mes_Generic *mes = (Q931mes_Generic *)IBuf;
296
297 if (mes->ProtDisc == 8) {
298 return Q931Pmes_ConnectAck(pTrunk, IBuf, ISize, OBuf, OSize);
299 }
300
301 if (mes->ProtDisc == 3) {
302 return Q931Pmes_Service(pTrunk, IBuf, ISize, OBuf, OSize);
303 }
304
305 return Q931E_UNKNOWN_MESSAGE;
306 }
307
308
309
310
311
312
313 L3INT DMSUmes_0x07(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
314 {
315 if (mes->ProtDisc == 8) {
316 return Q931Umes_Connect(pTrunk, IBuf, mes, IOff, Size);
317 }
318
319 if (mes->ProtDisc == 3) {
320 return Q931Umes_ServiceAck(pTrunk, IBuf, mes, IOff, Size);
321 }
322
323 return Q931E_UNKNOWN_MESSAGE;
324 }
325
326
327
328
329
330
331 L3INT DMSPmes_0x07(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
332 {
333 Q931mes_Generic *mes = (Q931mes_Generic *)IBuf;
334
335 if (mes->ProtDisc == 8) {
336 return Q931Pmes_Connect(pTrunk, IBuf, ISize, OBuf, OSize);
337 }
338
339 if (mes->ProtDisc == 3) {
340 return Q931Pmes_ServiceAck(pTrunk, IBuf, ISize, OBuf, OSize);
341 }
342
343 return Q931E_UNKNOWN_MESSAGE;
344 }