comparison src/g23m-gprs/llc/llc_uitxs.c @ 183:219afcfc6250

src/g23m-gprs: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Oct 2016 04:24:13 +0000
parents
children
comparison
equal deleted inserted replaced
182:f02d0a0e1849 183:219afcfc6250
1 /*
2 +-----------------------------------------------------------------------------
3 | Project :
4 | Modul :
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 is part of the entity LLC and implements all
18 | functions to handles the incoming process internal signals as
19 | described in the SDL-documentation (UITX-statemachine)
20 +-----------------------------------------------------------------------------
21 */
22
23 #ifndef LLC_UITXS_C
24 #define LLC_UITXS_C
25 #endif
26
27 #define ENTITY_LLC
28
29 /*==== INCLUDES =============================================================*/
30
31 #include "typedefs.h" /* to get Condat data types */
32 #include "vsi.h" /* to get a lot of macros */
33 #include "macdef.h"
34 #include "gprs.h"
35 #include "gsm.h" /* to get a lot of macros */
36 #include "cnf_llc.h" /* to get cnf-definitions */
37 #include "mon_llc.h" /* to get mon-definitions */
38 #include "prim.h" /* to get the definitions of used SAP and directions */
39 #include "llc.h" /* to get the global entity definitions */
40 #include "llc_f.h" /* to get llc-functions */
41 #include "llc_uitxf.h" /* to get local UITX functions */
42 #include "llc_txs.h" /* to get signal interface to TX */
43
44 /*==== CONST ================================================================*/
45
46 /*==== LOCAL VARS ===========================================================*/
47
48 /*==== PRIVATE FUNCTIONS ====================================================*/
49
50 /*==== PUBLIC FUNCTIONS =====================================================*/
51
52
53
54 /*
55 +------------------------------------------------------------------------------
56 | Function : sig_llme_uitx_assign_req
57 +------------------------------------------------------------------------------
58 | Description : Handles the internal signal SIG_LLME_UITX_ASSIGN_REQ
59 |
60 | Parameters :
61 |
62 +------------------------------------------------------------------------------
63 */
64 GLOBAL void sig_llme_uitx_assign_req (void)
65 {
66 TRACE_ISIG( "sig_llme_uitx_assign_req" );
67
68 switch (GET_STATE(UITX))
69 {
70 case UITX_TLLI_UNASSIGNED_NOT_READY:
71 /*
72 * <R.LLC.TLLI_ASS.A.007>, <R.LLC.TLLI_ASS.A.008>
73 */
74 uitx_init_sapi();
75
76 /*
77 * <R.LLC.TLLI_ASS.A.006>
78 */
79 SET_STATE (UITX, UITX_ADM_NOT_READY);
80 break;
81 case UITX_TLLI_UNASSIGNED_READY:
82 /*
83 * <R.LLC.TLLI_ASS.A.007>, <R.LLC.TLLI_ASS.A.008>
84 */
85 uitx_init_sapi();
86
87 /*
88 * <R.LLC.TLLI_ASS.A.006>
89 */
90 SET_STATE (UITX, UITX_ADM_READY);
91 break;
92 default:
93 TRACE_ERROR( "SIG_LLME_UITX_ASSIGN_REQ unexpected" );
94 break;
95 }
96 } /* sig_llme_uitx_assign_req() */
97
98
99
100 /*
101 +------------------------------------------------------------------------------
102 | Function : sig_llme_uitx_unassign_req
103 +------------------------------------------------------------------------------
104 | Description : Handles the internal signal SIG_LLME_UITX_UNASSIGN_REQ
105 |
106 | Parameters :
107 |
108 +------------------------------------------------------------------------------
109 */
110 GLOBAL void sig_llme_uitx_unassign_req (void)
111 {
112 TRACE_ISIG( "sig_llme_uitx_unassign_req" );
113
114 switch (GET_STATE(UITX))
115 {
116 case UITX_ADM_NOT_READY:
117 SET_STATE (UITX, UITX_TLLI_UNASSIGNED_NOT_READY);
118 break;
119 case UITX_ADM_READY:
120 SET_STATE (UITX, UITX_TLLI_UNASSIGNED_READY);
121 break;
122 default:
123 TRACE_ERROR( "SIG_LLME_UITX_UNASSIGN_REQ unexpected" );
124 break;
125 }
126 } /* sig_llme_uitx_unassign_req() */
127
128
129
130 /*
131 +------------------------------------------------------------------------------
132 | Function : sig_llme_uitx_reset_req
133 +------------------------------------------------------------------------------
134 | Description : Handles the internal signal SIG_LLME_UITX_RESET_REQ
135 |
136 | Parameters :
137 |
138 +------------------------------------------------------------------------------
139 */
140 GLOBAL void sig_llme_uitx_reset_req (void)
141 {
142 TRACE_ISIG( "sig_llme_uitx_reset_req" );
143
144 switch (GET_STATE(UITX))
145 {
146 case UITX_ADM_NOT_READY:
147 /*
148 * No break!
149 */
150 case UITX_ADM_READY:
151 /*
152 * ATTENTION:
153 * Only use this procedure as long as it initialises only the requested
154 * variables on reset (V(U) as of V6.4.0).
155 */
156 uitx_init_sapi();
157 break;
158 default:
159 TRACE_ERROR( "SIG_LLME_UITX_RESET_REQ unexpected" );
160 break;
161 }
162 } /* sig_llme_uitx_reset_req() */
163
164
165
166 /*
167 +------------------------------------------------------------------------------
168 | Function : sig_tx_uitx_ready_ind
169 +------------------------------------------------------------------------------
170 | Description : Handles the internal signal SIG_TX_UITX_READY_IND
171 |
172 | Parameters :
173 |
174 +------------------------------------------------------------------------------
175 */
176 GLOBAL void sig_tx_uitx_ready_ind (void)
177 {
178 TRACE_ISIG( "sig_tx_uitx_ready_ind" );
179
180 switch (GET_STATE(UITX))
181 {
182 case UITX_TLLI_UNASSIGNED_NOT_READY:
183 /*
184 * This case should not be necessary, however, it depends on the assign
185 * order within LLME if this case is executed.
186 */
187 SET_STATE (UITX, UITX_TLLI_UNASSIGNED_READY);
188
189 /*
190 * No flow control for SAPI 1.
191 */
192 if (llc_data->current_sapi != LL_SAPI_1)
193 {
194 PALLOC (ll_unitready_ind, LL_UNITREADY_IND);
195
196 ll_unitready_ind->sapi = llc_data->current_sapi;
197
198 /*
199 * Send primitive LL-UNITREADY-IND to either SNDCP or GSMS,
200 * depending on the SAPI.
201 */
202 switch (llc_data->current_sapi)
203 {
204 case LL_SAPI_3:
205 case LL_SAPI_5:
206 case LL_SAPI_9:
207 case LL_SAPI_11:
208 TRACE_1_OUT_PARA("s:%d", ll_unitready_ind->sapi);
209 PSEND (hCommSNDCP, ll_unitready_ind);
210 break;
211 case LL_SAPI_7:
212 #ifndef LL_2to1
213 TRACE_PRIM_TO("GSMS");
214 TRACE_1_OUT_PARA("s:%d", ll_unitready_ind->sapi);
215 PSEND (hCommGSMS, ll_unitready_ind);
216 #else
217 PFREE (ll_unitready_ind);
218 #endif
219 break;
220 default:
221 PFREE (ll_unitready_ind);
222 TRACE_ERROR ("invalid global SAPI value");
223 break;
224 }
225 } /* end of validity range of ll_unitready_ind */
226 break;
227 case UITX_TLLI_UNASSIGNED_READY:
228 /*
229 * NOTE: This signal is always send when enough space for one more
230 * frame is available in the local transmit buffer queue of TX.
231 * Therefore it can be safely ignored if UITX is already in
232 * state *_READY.
233 */
234 break;
235 case UITX_ADM_NOT_READY:
236 SET_STATE (UITX, UITX_ADM_READY);
237
238 if (llc_data->current_sapi != LL_SAPI_1)
239 {
240 PALLOC (ll_unitready_ind, LL_UNITREADY_IND);
241
242 ll_unitready_ind->sapi = llc_data->current_sapi;
243
244 /*
245 * Send primitive LL-UNITREADY-IND to either SNDCP or GSMS,
246 * depending on the SAPI.
247 */
248 switch (llc_data->current_sapi)
249 {
250 case LL_SAPI_3:
251 case LL_SAPI_5:
252 case LL_SAPI_9:
253 case LL_SAPI_11:
254 TRACE_1_OUT_PARA("s:%d", ll_unitready_ind->sapi);
255 PSEND (hCommSNDCP, ll_unitready_ind);
256 break;
257 case LL_SAPI_7:
258 #ifndef LL_2to1
259 TRACE_PRIM_TO("GSMS");
260 TRACE_1_OUT_PARA("s:%d", ll_unitready_ind->sapi);
261 PSEND (hCommGSMS, ll_unitready_ind);
262 #else
263 PFREE (ll_unitready_ind);
264 #endif
265 break;
266 default:
267 PFREE (ll_unitready_ind);
268 TRACE_ERROR ("invalid global SAPI");
269 break;
270 }
271 } /* end of validity range of ll_unitready_ind */
272 break;
273 case UITX_ADM_READY:
274 /*
275 * NOTE: This signal is always send when enough space for one more
276 * frame is available in the local transmit buffer queue of TX.
277 * Therefore it can be safely ignored if UITX is already in
278 * state *_READY.
279 */
280 break;
281 default:
282 TRACE_ERROR( "SIG_TX_UITX_READY_IND unexpected" );
283 break;
284 }
285 } /* sig_tx_uitx_ready_ind() */
286
287
288 /*
289 +------------------------------------------------------------------------------
290 | Function : sig_tx_uitx_trigger_ind
291 +------------------------------------------------------------------------------
292 | Description : Handles the internal signal SIG_TX_UITX_TRIGGER_IND
293 |
294 | Parameters : cause - trigger cause
295 |
296 +------------------------------------------------------------------------------
297 */
298 GLOBAL void sig_tx_uitx_trigger_ind (UBYTE cause)
299 {
300 T_FRAME_NUM used_nu;
301 ULONG used_oc;
302 UBYTE cipher_mode;
303 #ifdef LL_DESC
304 T_desc3 *desc3;
305 #endif
306
307
308 TRACE_ISIG( "sig_tx_uitx_trigger_ind" );
309
310 switch (GET_STATE(UITX))
311 {
312 case UITX_ADM_READY:
313 /*
314 * NOTE: llc_current_sapi is assumed to be LL_SAPI_1, when this signal
315 * is being received. Thus it is an error if UITX is not in state
316 * ADM_READY, because that means that the local transmit queue in TX for
317 * SAPI 1 is not big enough!
318 */
319 {
320
321 #ifndef LL_DESC
322 PALLOC_SDU (ll_unitdesc_req, LL_UNITDATA_REQ, UI_FRAME_MIN_OCTETS*8);
323
324 #else
325 PALLOC (ll_unitdesc_req, LL_UNITDESC_REQ);
326 desc3 = llc_palloc_desc(0, UI_FRAME_MIN_OCTETS);
327 #endif
328
329 ll_unitdesc_req->sapi = llc_data->current_sapi;
330 ll_unitdesc_req->tlli = llc_data->tlli_new;
331 ll_unitdesc_req->ll_qos.delay = LL_DELAY_SUB;
332 ll_unitdesc_req->ll_qos.relclass = LL_NO_REL;
333 ll_unitdesc_req->ll_qos.peak = LL_PEAK_SUB;
334 ll_unitdesc_req->ll_qos.preced = LL_PRECED_SUB;
335 ll_unitdesc_req->ll_qos.mean = LL_MEAN_SUB;
336 ll_unitdesc_req->radio_prio = LL_RADIO_PRIO_1;
337
338 #ifdef REL99
339 /*
340 * From 24.008 & 23.060 it is interpreted that for all signalling data, a
341 * predefined PFI LL_PFI_SIGNALING shall be used.
342 */
343 ll_unitdesc_req->pkt_flow_id = LL_PFI_SIGNALING;
344 #endif /* REL99 */
345
346 cipher_mode = LL_CIPHER_OFF;
347
348 #ifndef LL_DESC
349
350 /*
351 * No attach to primitive necessary. There is no retransmission.
352 */
353 ll_unitdesc_req->attached_counter = CCI_NO_ATTACHE;
354
355 ll_unitdesc_req->sdu.l_buf = 0;
356 ll_unitdesc_req->sdu.o_buf = UI_CTRL_MIN_OCTETS * 8;
357
358 /*
359 * uitx_build_ui_header expects SDU to already contain data. The
360 * header is inserted _before_ sdu.o_buf, so set o_but to the length
361 * of the header.
362 */
363 uitx_build_ui_header (&ll_unitdesc_req->sdu, MS_COMMAND,
364 llc_data->current_sapi, llc_data->uitx->vu, cipher_mode,
365 ll_unitdesc_req->ll_qos.relclass);
366 #else
367 ll_unitdesc_req->attached_counter = CCI_NO_ATTACHE;
368 ll_unitdesc_req->desc_list3.first = (ULONG)desc3;
369 ll_unitdesc_req->desc_list3.list_len = desc3->len;
370
371 uitx_build_ui_header (&ll_unitdesc_req->desc_list3, MS_COMMAND,
372 llc_data->current_sapi, llc_data->uitx->vu, cipher_mode,
373 ll_unitdesc_req->ll_qos.relclass);
374 #endif
375 used_nu = llc_data->uitx->vu;
376 used_oc = llc_data->sapi->oc_ui_tx;
377
378 llc_data->uitx->vu ++;
379
380 if (llc_data->uitx->vu > MAX_SEQUENCE_NUMBER)
381 {
382 llc_data->uitx->vu = 0;
383 llc_data->sapi->oc_ui_tx += (MAX_SEQUENCE_NUMBER+1);
384 }
385 sig_uitx_tx_data_req (ll_unitdesc_req, cipher_mode, cause, used_nu, used_oc);
386 }
387 break;
388
389 default:
390 TRACE_ERROR( "SIG_TX_UITX_TRIGGER_IND unexpected" );
391 break;
392 }
393
394
395
396 } /* sig_tx_uitx_trigger_ind() */