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 #ifndef _Q921_PRIV_H_
44 #define _Q921_PRIV_H_
45
46 #ifdef _MSC_VER
47 #ifndef __inline__
48 #define __inline__ __inline
49 #endif
50 #if (_MSC_VER >= 1400)
51 #ifndef _CRT_SECURE_NO_DEPRECATE
52 #define _CRT_SECURE_NO_DEPRECATE
53 #endif
54 #ifndef _CRT_NONSTDC_NO_DEPRECATE
55 #define _CRT_NONSTDC_NO_DEPRECATE
56 #endif
57 #endif
58 #ifndef strcasecmp
59 #define strcasecmp(s1, s2) _stricmp(s1, s2)
60 #endif
61 #ifndef strncasecmp
62 #define strncasecmp(s1, s2, n) _strnicmp(s1, s2, n)
63 #endif
64 #ifndef snprintf
65 #define snprintf _snprintf
66 #endif
67 #endif
68
69 typedef enum
70 {
71 Q921_STATE_STOPPED = 0,
72 Q921_STATE_TEI_UNASSIGNED = 1,
73 Q921_STATE_TEI_AWAITING,
74 Q921_STATE_TEI_ESTABLISH,
75 Q921_STATE_TEI_ASSIGNED,
76 Q921_STATE_AWAITING_ESTABLISHMENT,
77 Q921_STATE_AWAITING_RELEASE,
78 Q921_STATE_MULTIPLE_FRAME_ESTABLISHED,
79 Q921_STATE_TIMER_RECOVERY
80 } Q921State_t;
81
82
83
84
85 enum Q921_Flags {
86 Q921_FLAG_L3_INITIATED = (1 << 0),
87
88 Q921_FLAG_UI_FRAME_QUEUED = (1 << 1),
89 Q921_FLAG_I_FRAME_QUEUED = (1 << 2),
90
91 Q921_FLAG_ACK_PENDING = (1 << 3),
92 Q921_FLAG_REJECT = (1 << 4),
93
94 Q921_FLAG_RECV_BUSY = (1 << 5),
95 Q921_FLAG_PEER_RECV_BUSY = (1 << 6)
96 };
97
98 #define Q921_SET_FLAG(x, f) ((x)->flags |= f)
99 #define Q921_CHECK_FLAG(x, f) ((x)->flags & f)
100 #define Q921_CLEAR_FLAG(x, f) ((x)->flags &= ~f)
101
102
103
104
105
106 #define Q921_SAPI_TEI 63
107 #define Q921_LAYER_ENT_ID_TEI 0x0f
108 #define Q921_LAYER_ENT_ID_Q931 0x08
109
110
111 typedef enum {
112 Q921_TEI_ID_REQUEST = 1,
113 Q921_TEI_ID_ASSIGNED,
114 Q921_TEI_ID_DENIED,
115 Q921_TEI_ID_CHECKREQ,
116 Q921_TEI_ID_CHECKRESP,
117 Q921_TEI_ID_REMOVE,
118 Q921_TEI_ID_VERIFY
119 } Q921TeiMessageType_t;
120
121
122
123
124
125 struct Q921_Link {
126 L2UCHAR tei;
127
128 L2UCHAR va;
129 L2UCHAR vs;
130 L2UCHAR vr;
131
132 L2INT flags;
133 Q921State_t state;
134
135 L2ULONG N202;
136 L2ULONG N200;
137
138 L2ULONG TM01;
139
140 L2ULONG T200;
141 L2ULONG T201;
142 L2ULONG T203;
143
144 L2USHORT ri;
145
146
147 L2UCHAR UIFrameQueue[Q921MAXHDLCSPACE];
148 L2UCHAR IFrameQueue[Q921MAXHDLCSPACE];
149 L2UCHAR IFrameResendQueue[Q921MAXHDLCSPACE];
150 };
151
152
153 #define Q921_LINK_CONTEXT(tr, tei) \
154 (Q921_IS_PTMP_NT(tr) && tei != Q921_TEI_BCAST) ? ((struct Q921_Link *)&(tr)->context[tei]) : (tr)->context
155
156 #define Q921_TRUNK_CONTEXT(tr) \
157 (tr)->context
158
159 #define Q921_LOGBUFSIZE 2000
160 #define INITIALIZED_MAGIC 42
161
162
163
164
165 #define Q921_INC_COUNTER(x) (x = (x + 1) % 128)
166 #define Q921_DEC_COUNTER(x) (x = (x) ? (x - 1) : 127)
167
168 #define Q921_UFRAME_HEADER_SIZE 3
169 #define Q921_UFRAME_DATA_OFFSET(tr) ((tr)->Q921HeaderSpace + Q921_UFRAME_HEADER_SIZE)
170
171 #define Q921_SFRAME_HEADER_SIZE 4
172 #define Q921_SFRAME_DATA_OFFSET(tr) ((tr)->Q921HeaderSpace + Q921_SFRAME_HEADER_SIZE)
173
174 #define Q921_IFRAME_HEADER_SIZE 4
175 #define Q921_IFRAME_DATA_OFFSET(tr) ((tr)->Q921HeaderSpace + Q921_IFRAME_HEADER_SIZE)
176
177 #define Q921_IS_TE(x) ((x)->NetUser == Q921_TE)
178 #define Q921_IS_NT(x) ((x)->NetUser == Q921_NT)
179
180 #define Q921_IS_STOPPED(tr) ((tr)->state == Q921_STATE_STOPPED)
181
182
183 #define Q921_IS_READY(tr) ((tr)->state >= Q921_STATE_TEI_ASSIGNED)
184
185 #define Q921_IS_PTMP(x) ((x)->NetType == Q921_PTMP)
186 #define Q921_IS_PTMP_TE(x) ((x)->NetType == Q921_PTMP && (x)->NetUser == Q921_TE)
187 #define Q921_IS_PTMP_NT(x) ((x)->NetType == Q921_PTMP && (x)->NetUser == Q921_NT)
188
189 #define Q921_IS_PTP(x) ((x)->NetType == Q921_PTP)
190 #define Q921_IS_PTP_TE(x) ((x)->NetType == Q921_PTP && (x)->NetUser == Q921_TE)
191 #define Q921_IS_PTP_NT(x) ((x)->NetType == Q921_PTP && (x)->NetUser == Q921_NT)
192
193
194 #define Q921_COMMAND(x) ((x)->NetUser == Q921_TE ? 0 : 1)
195 #define Q921_RESPONSE(x) ((x)->NetUser == Q921_TE ? 1 : 0)
196
197 #define Q921_IS_COMMAND(tr, x) ((x) == (Q921_IS_TE(tr) ? 1 : 0))
198 #define Q921_IS_RESPONSE(tr, x) ((x) == (Q921_IS_TE(tr) ? 0 : 1))
199
200
201
202
203
204
205
206
207
208 static int Q921Tx21Proc(L2TRUNK trunk, L2UCHAR *Msg, L2INT size);
209 static int Q921Tx23Proc(L2TRUNK trunk, Q921DLMsg_t ind, L2UCHAR tei, L2UCHAR *Msg, L2INT size);
210
211
212
213
214
215 static L2ULONG Q921GetTime(void);
216
217 static void Q921T200TimerStart(L2TRUNK trunk, L2UCHAR tei);
218 static void Q921T200TimerStop(L2TRUNK trunk, L2UCHAR tei);
219 static void Q921T200TimerReset(L2TRUNK trunk, L2UCHAR tei);
220 static void Q921T200TimerExpire(L2TRUNK trunk, L2UCHAR tei);
221
222 static void Q921T201TimerStart(L2TRUNK trunk, L2UCHAR tei);
223 static void Q921T201TimerStop(L2TRUNK trunk, L2UCHAR tei);
224
225 static void Q921T201TimerExpire(L2TRUNK trunk, L2UCHAR tei);
226
227 static void Q921T202TimerStart(L2TRUNK trunk);
228 static void Q921T202TimerStop(L2TRUNK trunk);
229 static void Q921T202TimerReset(L2TRUNK trunk);
230 static void Q921T202TimerExpire(L2TRUNK trunk);
231
232 static void Q921T203TimerStart(L2TRUNK trunk, L2UCHAR tei);
233 static void Q921T203TimerStop(L2TRUNK trunk, L2UCHAR tei);
234 static void Q921T203TimerReset(L2TRUNK trunk, L2UCHAR tei);
235 static void Q921T203TimerExpire(L2TRUNK trunk, L2UCHAR tei);
236
237 static void Q921TM01TimerStart(L2TRUNK trunk, L2UCHAR tei);
238
239 static void Q921TM01TimerReset(L2TRUNK trunk, L2UCHAR tei);
240
241
242
243
244
245 static int Q921SendS(L2TRUNK trunk, L2UCHAR Sapi, char cr, L2UCHAR Tei, char pf, L2UCHAR sv, L2UCHAR *mes, L2INT size);
246 static int Q921SendU(L2TRUNK trunk, L2UCHAR Sapi, char cr, L2UCHAR Tei, char pf, L2UCHAR m, L2UCHAR *mes, L2INT size);
247
248 static int Q921SendRNR(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf);
249 static int Q921SendREJ(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf);
250 static int Q921SendSABME(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf);
251 static int Q921SendDM(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf);
252 static int Q921SendDISC(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf);
253 static int Q921SendUA(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf);
254 static int Q921SendUN(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf, L2UCHAR *mes, L2INT size);
255 static int Q921SendRR(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf);
256
257
258
259
260 static int Q921ProcIFrame(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
261 static int Q921ProcSFrame(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
262 static int Q921ProcUFrame(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
263
264 static int Q921ProcSABME(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
265 static int Q921ProcDM(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
266 static int Q921ProcUA(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
267 static int Q921ProcDISC(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
268 static int Q921ProcRR(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
269 static int Q921ProcRNR(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
270 static int Q921ProcREJ(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
271
272
273
274
275
276 static int Q921SendEnquiry(L2TRUNK trunk, L2UCHAR tei);
277 static int Q921SendEnquiryResponse(L2TRUNK trunk, L2UCHAR tei);
278 static void Q921ResetExceptionConditions(L2TRUNK trunk, L2UCHAR tei);
279 static int Q921EstablishDataLink(L2TRUNK trunk, L2UCHAR tei);
280 static int Q921NrErrorRecovery(L2TRUNK trunk, L2UCHAR tei);
281 static int Q921InvokeRetransmission(L2TRUNK trunk, L2UCHAR tei, L2UCHAR nr);
282 static int Q921AcknowledgePending(L2TRUNK trunk, L2UCHAR tei);
283
284
285
286
287
288
289
290
291 static int Q921SendQueuedIFrame(L2TRUNK trunk, L2UCHAR tei);
292 static int Q921EnqueueI(L2TRUNK trunk, L2UCHAR Sapi, char cr, L2UCHAR Tei, char pf, L2UCHAR *mes, L2INT size);
293
294
295
296
297 static int Q921TeiSendAssignRequest(L2TRUNK trunk);
298 static int Q921TeiProcAssignResponse(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
299 static int Q921TeiSendVerifyRequest(L2TRUNK trunk);
300 static int Q921TeiProcCheckRequest(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
301 static int Q921TeiProcRemoveRequest(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
302 static int Q921TeiProcAssignRequest(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
303 static int Q921TeiProcCheckResponse(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
304 static int Q921TeiProcVerifyRequest(L2TRUNK trunk, L2UCHAR *mes, L2INT size);
305 static int Q921TeiSendRemoveRequest(L2TRUNK trunk, L2UCHAR tei);
306 static int Q921TeiSendDenyResponse(L2TRUNK trunk, L2UCHAR tei, L2USHORT ri);
307 static int Q921TeiSendAssignedResponse(L2TRUNK trunk, L2UCHAR tei, L2USHORT ri);
308 static int Q921TeiSendCheckRequest(L2TRUNK trunk, L2UCHAR tei);
309
310
311
312
313 static int Q921Log(L2TRUNK trunk, Q921LogLevel_t level, const char *fmt, ...);
314 static int Q921LogMesg(L2TRUNK trunk, Q921LogLevel_t level, L2UCHAR received, L2UCHAR *mes, L2INT size, const char *fmt, ...);
315
316
317
318
319 static int Q921ChangeState(L2TRUNK trunk, Q921State_t state, L2UCHAR tei);
320
321 #endif