comparison src/g23m-fad/rlp/rlp_tim.c @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
comparison
equal deleted inserted replaced
0:b6a5e36de839 1:d393cd9bb723
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : CSD (8411)
4 | Modul : Rlp_tim.c
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This Modul defines the timer handling functions
18 | for the component Radio Link Protocol of the base station
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef RLP_TIM_C
23 #define RLP_TIM_C
24 #endif
25
26 #define ENTITY_RLP
27
28 /*==== INCLUDES ===================================================*/
29
30 #include <string.h>
31 #include "typedefs.h"
32 #include "vsi.h"
33 #include "macdef.h"
34 #include "custom.h"
35 #include "gsm.h"
36 #include "cus_rlp.h"
37 #include "prim.h"
38 #include "tok.h"
39 #include "rlp.h"
40
41 /*==== EXPORT =====================================================*/
42
43 /*==== PRIVAT =====================================================*/
44
45 /*==== VARIABLES ==================================================*/
46
47 /*==== FUNCTIONS ==================================================*/
48
49 /*
50 +------------------------------------------------------------------------------
51 | Function : tim_tt
52 +------------------------------------------------------------------------------
53 | Description : Timeout of timer TT
54 |
55 | Parameters :
56 |
57 |
58 | Return :
59 +------------------------------------------------------------------------------
60 */
61
62
63 LOCAL void tim_tt (void)
64 {
65
66 BOOL retransError;
67
68 TRACE_FUNCTION ("tim_tt()");
69
70 switch (GET_STATE (KER))
71 {
72 case RLP_PENDING_CONNECT_REQ:
73 /*
74 * processing for state RLP_PENDING_CONNECT_REQ
75 */
76 rlp_data->ker.Poll_xchg = IW_IDLE;
77
78 if (rlp_data->ker.SABM_Count > rlp_data->ker.N2)
79 {
80 ker_send_rlp_error_ind (RLP_ERR_SABM_RETRANS);
81 SET_STATE (KER, RLP_PERMANENT_ERROR);
82 }
83 else
84 rlp_data->ker.SABM_State = ISW_SEND;
85 break;
86
87 case RLP_CONNECTION_ESTABLISHED:
88 /*
89 * processing for state RLP_CONNECTION_ESTABLISHED
90 */
91 rlp_data->ker.Poll_xchg = IW_IDLE;
92
93 sbm_check_rej_count(&retransError);
94
95 if (!retransError)
96 {
97 switch (rlp_data->ker.Poll_State)
98 {
99 case ISW_IDLE:
100 rlp_data->ker.Poll_State = ISW_SEND;
101 break;
102
103 case ISW_WAIT:
104 if (rlp_data->ker.Poll_Count <= rlp_data->ker.N2)
105 rlp_data->ker.Poll_State = ISW_SEND;
106
107 else
108 {
109 ker_reset_all_t_rcvs ();
110 rbm_reset_srej_slots();
111 TIMERSTOP (TRCVR_HANDLE);
112 rlp_data->ker.DISC_State = ISW_SEND;
113 rlp_data->ker.DISC_Count = 0;
114 rlp_data->ker.DISC_PBit = 1;
115
116 ker_deinit_link_vars ();
117 rlp_data->ker.DISC_Ind = TRUE;
118
119 SET_STATE (KER, RLP_DISCONNECT_INITIATED);
120 TRACE_EVENT("#10");
121 }
122 break;
123 }
124 }
125 else
126 {
127 ker_reset_all_t_rcvs ();
128 rbm_reset_srej_slots();
129 TIMERSTOP (TRCVR_HANDLE);
130
131 rlp_data->ker.DISC_State = ISW_SEND;
132 rlp_data->ker.DISC_Count = 0;
133 rlp_data->ker.DISC_PBit = 1;
134
135 ker_deinit_link_vars ();
136 rlp_data->ker.DISC_Ind = TRUE;
137
138 SET_STATE (KER, RLP_DISCONNECT_INITIATED);
139 TRACE_EVENT("#11");
140 }
141
142 break;
143
144 case RLP_DISCONNECT_INITIATED:
145 /*
146 * processing for state RLP_DISCONNECT_INITIATED
147 */
148 if (rlp_data->ker.DISC_PBit EQ 1)
149 rlp_data->ker.Poll_xchg = IW_IDLE;
150
151 if (rlp_data->ker.DISC_Count > rlp_data->ker.N2)
152 {
153 ker_send_rlp_error_ind (RLP_ERR_DISC_RETRANS);
154 SET_STATE (KER, RLP_PERMANENT_ERROR);
155 }
156 else
157 rlp_data->ker.DISC_State = ISW_SEND;
158 break;
159
160 case RLP_PENDING_RESET_REQ:
161 /*
162 * processing for state RLP_PENDING_RESET_REQ
163 */
164 rlp_data->ker.Poll_xchg = IW_IDLE;
165 if (rlp_data->ker.SABM_Count > rlp_data->ker.N2)
166 {
167 ker_send_rlp_error_ind (RLP_ERR_SABM_RETRANS);
168 SET_STATE (KER, RLP_PERMANENT_ERROR);
169 }
170 else
171 rlp_data->ker.SABM_State = ISW_SEND;
172 break;
173
174 case RLP_PENDING_REMAP_REQ:
175 /*
176 * processing for state RLP_PENDING_REMAP_REQ
177 */
178 rlp_data->ker.Poll_xchg = IW_IDLE;
179
180 ker_send_rlp_error_ind (RLP_ERR_REMAP_RETRANS);
181 SET_STATE (KER, RLP_PERMANENT_ERROR);
182 }
183 }
184
185 /*
186 +------------------------------------------------------------------------------
187 | Function : tim_tul_rcv
188 +------------------------------------------------------------------------------
189 | Description : Timeout of timer TUL_RCV
190 |
191 | Parameters : -
192 |
193 |
194 | Return : -
195 +------------------------------------------------------------------------------
196 */
197
198
199 LOCAL void tim_tul_rcv (void)
200 {
201 TRACE_FUNCTION ("tim_tul_rcv()");
202
203 switch (GET_STATE (KER))
204 {
205 case RLP_CONNECTION_ESTABLISHED:
206 case RLP_PENDING_REMAP_REQ:
207 case RLP_REMAP_DATA:
208 /*
209 * processing for states RLP_CONNECTION_ESTABLISHED
210 * RLP_PENDING_REMAP_REQ:
211 * RLP_REMAP_DATA:
212 */
213 switch (rlp_data->ker.UL_Rcv_State)
214 {
215 case IW_WAIT:
216 {
217 T_RLP_DATA_IND *rlp_data_ind;
218
219 if (rlp_data->rbm.CurrPrimCou > 0 )
220 {
221 /* if some data are there */
222 rlp_data_ind = rbm_get_curr_prim ();
223 /*
224 * send the waiting but not complete filled prim to L2R
225 */
226 PSENDX (L2R, rlp_data_ind);
227 rlp_data->ker.UL_Rcv_State = IW_IDLE;
228 }
229 else
230 {
231 TRACE_EVENT("no data to send!");
232 }
233 break;
234 }
235 }
236 break;
237 }
238 }
239
240 /*
241 +------------------------------------------------------------------------------
242 | Function : tim_trcvr
243 +------------------------------------------------------------------------------
244 | Description : Timeout of timer TRCVR
245 |
246 | Parameters : -
247 |
248 |
249 | Return : -
250 +------------------------------------------------------------------------------
251 */
252
253
254 LOCAL void tim_trcvr (void)
255 {
256 TRACE_FUNCTION ("tim_trcvr()");
257
258 switch (GET_STATE (KER))
259 {
260 case RLP_CONNECTION_ESTABLISHED:
261 /*
262 * processing for state RLP_CONNECTION_ESTABLISHED
263 */
264 switch (rlp_data->ker.REJ_State)
265 {
266 case ISW_WAIT:
267 ker_reset_all_t_rcvs();
268 rbm_reset_srej_slots();
269
270 TIMERSTOP(TT_HANDLE);
271 rlp_data->ker.REJ_State = ISW_IDLE; /* jk: acc. ETSI after timer reset IDLE */
272 /* in order to enable new REJ condition */
273 /*
274 * Don't disconnect
275 * a timeout of TRCVR can be ignored
276 * The network will get a timeout for the sent frames,
277 * which we have not received.
278 */
279 /*
280 rlp_data->ker.DISC_State = ISW_SEND;
281 rlp_data->ker.DISC_Count = 0;
282
283 switch(rlp_data->ker.Poll_xchg)
284 {
285 case IW_IDLE:
286 rlp_data->ker.DISC_PBit = 1;
287 break;
288
289 default:
290 rlp_data->ker.DISC_PBit = 0;
291 break;
292 }
293
294 ker_deinit_link_vars();
295 rlp_data->ker.DISC_Ind = TRUE;
296 SET_STATE (KER, RLP_DISCONNECT_INITIATED);
297 TRACE_EVENT("#12");
298 */
299 break;
300 }
301 break;
302 }
303 }
304
305 /*
306 +------------------------------------------------------------------------------
307 | Function : tim_trcvs
308 +------------------------------------------------------------------------------
309 | Description : Timeout of timer TRCVS
310 |
311 | Parameters : rcvs_slot
312 |
313 |
314 | Return : -
315 +------------------------------------------------------------------------------
316 */
317
318
319 LOCAL void tim_trcvs (T_FRAME_NUM rcvs_slot)
320 {
321 TRACE_FUNCTION ("tim_trcvs()");
322
323 TRACE_EVENT_P1 ("Timeout RCVS[%d]", rcvs_slot);
324
325 if (GET_STATE (KER) EQ RLP_CONNECTION_ESTABLISHED)
326 {
327 if (rbm_is_state_wait(rcvs_slot))
328 {
329 rlp_data->ker.SREJ_Count--;
330
331 if(srm_get_counter(rcvs_slot) > rlp_data->ker.N2)
332 {
333 ker_reset_all_t_rcvs();
334 rbm_reset_srej_slots();
335 TIMERSTOP(TT_HANDLE);
336 rlp_data->ker.DISC_State = ISW_SEND;
337 rlp_data->ker.DISC_Count = 0;
338
339 switch(rlp_data->ker.Poll_xchg)
340 {
341 case IW_IDLE:
342 rlp_data->ker.DISC_PBit = 1;
343 break;
344
345 default:
346 rlp_data->ker.DISC_PBit = 0;
347 break;
348 }
349 ker_deinit_link_vars();
350 rlp_data->ker.DISC_Ind = TRUE;
351 SET_STATE (KER, RLP_DISCONNECT_INITIATED);
352 TRACE_EVENT("#13");
353 }
354 else
355 {
356 rbm_set_rslot_wait2srej (rcvs_slot);
357 }
358 }
359 }
360 }
361
362 /*
363 +------------------------------------------------------------------------------
364 | Function : tim_txid
365 +------------------------------------------------------------------------------
366 | Description : Timeout of timer TXID
367 |
368 | Parameters : -
369 |
370 |
371 | Return : -
372 +------------------------------------------------------------------------------
373 */
374
375
376 LOCAL void tim_txid (void)
377 {
378 TRACE_FUNCTION ("tim_txid()");
379
380 switch (GET_STATE (KER))
381 {
382 case RLP_ADM_AND_DETACHED:
383 /*
384 * no processing for state RLP_ADM_AND_DETACHED
385 */
386 break;
387
388 default:
389 /*
390 * processing for all other kernel states
391 */
392 rlp_data->ker.Poll_xchg = IW_IDLE;
393 if (rlp_data->ker.XID_Count >= rlp_data->ker.N2)
394 {
395 ker_send_rlp_error_ind (RLP_ERR_XID_RETRANS);
396 SET_STATE (KER, RLP_PERMANENT_ERROR);
397 }
398 else
399 {
400 SET_STATE(KERXID_C, ISW_SEND);
401 rlp_data->ker.XID_Count++;
402 }
403 break;
404 }
405 }
406
407 /*
408 +------------------------------------------------------------------------------
409 | Function : rlp_exec_timeout
410 +------------------------------------------------------------------------------
411 | Description : execute timeout function depending on index
412 |
413 | Parameters : index
414 |
415 |
416 | Return : -
417 +------------------------------------------------------------------------------
418 */
419
420 GLOBAL void rlp_exec_timeout (USHORT index)
421 {
422 T_FRAME_NUM rcvs_slot;
423
424 TRACE_FUNCTION ("rlp_exec_timeout()");
425
426 switch (index)
427 {
428 case TT_HANDLE:
429 tim_tt ();
430 break;
431
432 case TUL_RCV_HANDLE:
433 tim_tul_rcv ();
434 break;
435
436 case TRCVR_HANDLE:
437 tim_trcvr ();
438 break;
439
440 case TXID_HANDLE:
441 tim_txid ();
442 break;
443
444 default:
445 if ( index < MAX_SREJ_COUNT )
446 {
447 /* case TRCVS_HANDLE: */
448 if ((rcvs_slot = ker_getSlotTRCVS (index)) NEQ INVALID_IDX)
449 {
450 /*
451 * store the index of the rcvs_timer
452 */
453 rlp_data->rcvs_slot = rcvs_slot;
454 tim_trcvs (rlp_data->rcvs_slot);
455 }
456 }
457 else
458 {
459 TRACE_EVENT ("UNDEFINED TIMEOUT");
460 }
461 break;
462 }
463 }
464
465