FreeCalypso > hg > fc-magnetite
comparison src/g23m-gprs/llc/llc_uitxp.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 | 4cb2e85d9d6a |
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 primitives as described in | |
19 | the SDL-documentation (UITX-statemachine) | |
20 +----------------------------------------------------------------------------- | |
21 */ | |
22 | |
23 #ifndef LLC_UITXP_C | |
24 #define LLC_UITXP_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" | |
41 #include "llc_uitxf.h" /* to get local UITX functions */ | |
42 #include "llc_txs.h" /* to get signal interface to TX */ | |
43 #include <string.h> /* to get memcpy */ | |
44 /*==== CONST ================================================================*/ | |
45 | |
46 /*==== LOCAL VARS ===========================================================*/ | |
47 | |
48 /*==== PRIVATE FUNCTIONS ====================================================*/ | |
49 | |
50 /*==== PUBLIC FUNCTIONS =====================================================*/ | |
51 | |
52 /* | |
53 +------------------------------------------------------------------------------ | |
54 | Function : uitx_ll_unitdesc_req | |
55 +------------------------------------------------------------------------------ | |
56 | Description : Handles the primitive LL_UNITDESC_REQ | |
57 | | |
58 | Parameters : *ll_unitdesc_req - Ptr to primitive payload | |
59 | | |
60 +------------------------------------------------------------------------------ | |
61 */ | |
62 /*#if defined(CF_FAST_EXEC) || defined(_SIMULATION_) || \ | |
63 defined(LL_2to1) */ | |
64 | |
65 GLOBAL void uitx_ll_unitdesc_req | |
66 ( | |
67 #ifdef LL_DESC | |
68 T_LL_UNITDESC_REQ *ll_unitdesc_req_ | |
69 #else | |
70 T_LL_UNITDATA_REQ *ll_unitdesc_req_ | |
71 #endif | |
72 ) | |
73 { | |
74 /* | |
75 * Indicates if the frame shall be ciphered or not (LL_CIPHER_ON/OFF). | |
76 */ | |
77 UBYTE cipher; | |
78 T_FRAME_NUM used_nu; | |
79 ULONG used_oc; | |
80 | |
81 TRACE_FUNCTION( "uitx_ll_unitdesc_req" ); | |
82 | |
83 { | |
84 /* | |
85 * PPASS added to let the FRAME know that the primitive has to be copied | |
86 * now for duplicating primiives. Otherwise the changed primitie will be duplicated | |
87 */ | |
88 #ifdef LL_DESC | |
89 PPASS (ll_unitdesc_req_, ll_unitdesc_req, LL_UNITDESC_REQ); | |
90 #else | |
91 PPASS (ll_unitdesc_req_, ll_unitdesc_req, LL_UNITDATA_REQ); | |
92 #endif | |
93 | |
94 SWITCH_LLC (ll_unitdesc_req->sapi); | |
95 #ifdef REL99 | |
96 llc_data->cur_pfi = ll_unitdesc_req->pkt_flow_id; /* store current packet flow identifier */ | |
97 #endif | |
98 TRACE_EVENT_P1("packet flow id = %d",ll_unitdesc_req->pkt_flow_id); | |
99 | |
100 llc_data->cur_qos = ll_unitdesc_req->ll_qos; /* store current QoS */ | |
101 llc_data->cur_radio_prio = ll_unitdesc_req->radio_prio; /* store current radio prioirity */ | |
102 /* The stored PFI,QOS and radio priority is later used to copy to PFI,QOS and radio priority | |
103 respectively of control messages like SABM,DM,XID response,etc. */ | |
104 TRACE_EVENT_P1("radio priority = %d",ll_unitdesc_req->radio_prio); | |
105 TRACE_EVENT_P1("peak throughput = %d",ll_unitdesc_req->ll_qos.peak); | |
106 | |
107 /* | |
108 * Overwrite cipher request on all SAPIs except GMM. They don't | |
109 * know anything about ciphering in current design. | |
110 */ | |
111 if (ll_unitdesc_req->sapi != LL_SAPI_1) | |
112 { | |
113 if (llc_data->ciphering_algorithm == LLGMM_CIPHER_NO_ALGORITHM) | |
114 cipher = LL_CIPHER_OFF; | |
115 else | |
116 cipher = LL_CIPHER_ON; | |
117 } | |
118 else | |
119 { | |
120 cipher = ll_unitdesc_req->cipher; | |
121 } | |
122 | |
123 #ifdef LL_DESC | |
124 TRACE_3_PARA("s:%d len:%d c:%d", ll_unitdesc_req->sapi, | |
125 ll_unitdesc_req->desc_list3.list_len, | |
126 cipher ); | |
127 #else | |
128 TRACE_3_PARA("s:%d len:%d c:%d", ll_unitdesc_req->sapi, | |
129 BYTELEN(ll_unitdesc_req->sdu.l_buf), | |
130 cipher ); | |
131 #endif | |
132 | |
133 /* | |
134 * Set up the attached counter to CCI_NO_ATTACHE. | |
135 */ | |
136 ll_unitdesc_req->attached_counter = CCI_NO_ATTACHE; | |
137 | |
138 #ifdef REL99 | |
139 /* | |
140 * Packet flow identifier is passed transparantly if data request is from SNDCP. | |
141 * If data request is from GMM fill PFI = LL_PFI_SIGNALING, | |
142 * If data request is from GSMS fill PFI = LL_PFI_SMS | |
143 * for all other SAPs(if sapi 2 & 8 are supported in future) set pkt_flow_id is to LL_PKT_FLOW_ID_NOT_PRES, | |
144 * until specification are clarified. | |
145 */ | |
146 switch(ll_unitdesc_req->sapi) | |
147 { | |
148 | |
149 case LL_SAPI_3: | |
150 case LL_SAPI_5: | |
151 case LL_SAPI_9: | |
152 case LL_SAPI_11: | |
153 /*Packet flow identifier is passed transparantly if data request is from SNDCP.*/ | |
154 break; | |
155 | |
156 case LL_SAPI_1: | |
157 /* | |
158 * From 24.008 & 23.060 it is interpreted that for all signalling data, a | |
159 * predefined PFI LL_PFI_SIGNALING shall be used. | |
160 */ | |
161 ll_unitdesc_req->pkt_flow_id = LL_PFI_SIGNALING; | |
162 ll_unitdesc_req->ll_qos.peak = LL_PEAK_256K; | |
163 break; | |
164 | |
165 case LL_SAPI_7: | |
166 /* | |
167 * From 24.008 & 23.060 it is interpreted that for all SMS data, a | |
168 * predefined PFI LL_PFI_SMS shall be used. | |
169 */ | |
170 ll_unitdesc_req->pkt_flow_id = LL_PFI_SMS; | |
171 break; | |
172 | |
173 default: | |
174 /* | |
175 * It is possible when system support llc sapi 2 and 8. | |
176 * Fill PFI valuse it LL_PKT_FLOW_ID_NOT_PRES, until it is clarified in the specifications. | |
177 */ | |
178 ll_unitdesc_req->pkt_flow_id = LL_PKT_FLOW_ID_NOT_PRES; | |
179 break; | |
180 } | |
181 #endif /* REL99 */ | |
182 /* | |
183 * In case of SAPI 7 (GSMS) all requests has to use the relclass LL_RLC_PROT. | |
184 */ | |
185 if (ll_unitdesc_req->sapi EQ LL_SAPI_7) | |
186 { | |
187 ll_unitdesc_req->ll_qos.relclass = LL_RLC_PROT; | |
188 } | |
189 | |
190 switch (GET_STATE(UITX)) | |
191 { | |
192 case UITX_ADM_READY: | |
193 /* | |
194 * NOTE: uitx_build_ui_header expects desc_list3 to already contain data. | |
195 * The header is inserted _before_ the data, so desc_list3.o_buf is being | |
196 * decremented. | |
197 */ | |
198 uitx_build_ui_header | |
199 ( | |
200 #ifdef LL_DESC | |
201 &ll_unitdesc_req->desc_list3, | |
202 #else | |
203 &ll_unitdesc_req->sdu, | |
204 #endif | |
205 MS_COMMAND, | |
206 ll_unitdesc_req->sapi, | |
207 llc_data->uitx->vu, | |
208 cipher, | |
209 ll_unitdesc_req->ll_qos.relclass | |
210 ); | |
211 | |
212 used_nu = llc_data->uitx->vu; | |
213 used_oc = llc_data->sapi->oc_ui_tx; | |
214 | |
215 llc_data->uitx->vu ++; | |
216 | |
217 if (llc_data->uitx->vu > MAX_SEQUENCE_NUMBER) | |
218 { | |
219 llc_data->uitx->vu = 0; | |
220 llc_data->sapi->oc_ui_tx += (MAX_SEQUENCE_NUMBER+1); | |
221 } | |
222 | |
223 SET_STATE (UITX, UITX_ADM_NOT_READY); | |
224 | |
225 if (ll_unitdesc_req->ll_qos.relclass EQ LL_RLC_PROT) | |
226 { | |
227 /* | |
228 * Label S_DATA | |
229 */ | |
230 if (ll_unitdesc_req->sapi EQ LL_SAPI_1) | |
231 { | |
232 sig_uitx_tx_data_req (ll_unitdesc_req, cipher, GRLC_DTACS_MOBILITY_MANAGEMENT, used_nu, used_oc); | |
233 } | |
234 else | |
235 { | |
236 sig_uitx_tx_data_req (ll_unitdesc_req, cipher, GRLC_DTACS_DEF, used_nu, used_oc); | |
237 } | |
238 } | |
239 else /* LL_PROT/LL_NO_REL */ | |
240 { | |
241 /* | |
242 * Label S_UNITDATA | |
243 */ | |
244 sig_uitx_tx_unitdata_req (ll_unitdesc_req, cipher, used_nu, used_oc); | |
245 } | |
246 break; | |
247 | |
248 case UITX_TLLI_UNASSIGNED_READY: | |
249 /* | |
250 * LLC is not capable of sending data in state TLLI_UNASSIGNED. | |
251 */ | |
252 #ifdef LL_DESC | |
253 llc_cl_desc3_free((T_desc3*)ll_unitdesc_req->desc_list3.first); | |
254 #endif | |
255 PFREE (ll_unitdesc_req); | |
256 | |
257 SET_STATE (UITX, UITX_TLLI_UNASSIGNED_NOT_READY); | |
258 break; | |
259 | |
260 default: | |
261 #ifdef LL_DESC | |
262 llc_cl_desc3_free((T_desc3*)ll_unitdesc_req->desc_list3.first); | |
263 #endif | |
264 PFREE (ll_unitdesc_req); | |
265 | |
266 TRACE_ERROR( "ll_unitdesc_req unexpected" ); | |
267 break; | |
268 } | |
269 } | |
270 }/* uitx_ll_unitdesc_req */ | |
271 | |
272 /*#endif*/ /* CF_FAST_EXEC || _SIMULATION_ */ | |
273 | |
274 /* | |
275 +------------------------------------------------------------------------------ | |
276 | Function : uitx_ll_unitdata_req | |
277 +------------------------------------------------------------------------------ | |
278 | Description : Handles the primitive LL_UNITDATA_REQ | |
279 | | |
280 | Parameters : *ll_unitdata_req - Ptr to primitive payload | |
281 | | |
282 +------------------------------------------------------------------------------ | |
283 */ | |
284 #ifdef LL_DESC | |
285 | |
286 #ifndef CF_FAST_EXEC | |
287 | |
288 GLOBAL void uitx_ll_unitdata_req (T_LL_UNITDATA_REQ *ll_unitdata_req) | |
289 { | |
290 T_desc3 *desc3 = NULL; | |
291 U16 len, offset; | |
292 U8 *buf; | |
293 | |
294 TRACE_FUNCTION( "uitx_ll_unitdata_req" ); | |
295 | |
296 /* | |
297 * Allocate primitive and fill in the structure elements | |
298 */ | |
299 { | |
300 PALLOC(ll_unitdesc_req, LL_UNITDESC_REQ); | |
301 | |
302 ll_unitdesc_req->sapi = ll_unitdata_req->sapi; | |
303 ll_unitdesc_req->tlli = ll_unitdata_req->tlli; | |
304 ll_unitdesc_req->ll_qos = ll_unitdata_req->ll_qos; | |
305 ll_unitdesc_req->cipher = ll_unitdata_req->cipher; | |
306 ll_unitdesc_req->radio_prio = ll_unitdata_req->radio_prio; | |
307 ll_unitdesc_req->seg_pos = ll_unitdata_req->seg_pos; | |
308 ll_unitdesc_req->attached_counter = ll_unitdata_req->attached_counter; | |
309 #ifdef REL99 | |
310 ll_unitdesc_req->pkt_flow_id = ll_unitdata_req->pkt_flow_id; | |
311 #endif /* REL99 */ | |
312 /* | |
313 * Allocate memory block for simulating desc2 (desc3->buffer) and set the values of the | |
314 * desc3-elements. | |
315 */ | |
316 len = ll_unitdata_req->sdu.l_buf >> 3; /* BIT to BYTE */ | |
317 offset = ll_unitdata_req->sdu.o_buf >> 3; /* BIT to BYTE */ | |
318 | |
319 desc3 = llc_palloc_desc(len, offset); /* Only one desc3 and buffer is allocated */ | |
320 | |
321 buf= (U8*)desc3->buffer; | |
322 | |
323 memcpy(&buf[desc3->offset], | |
324 &ll_unitdata_req->sdu.buf[offset], | |
325 len); | |
326 | |
327 ll_unitdesc_req->desc_list3.first = (U32)desc3; | |
328 ll_unitdesc_req->desc_list3.list_len = desc3->len; | |
329 | |
330 | |
331 /* | |
332 * Primitive is handled in uitx_ll_unitdesc_req | |
333 */ | |
334 uitx_ll_unitdesc_req (ll_unitdesc_req); | |
335 } | |
336 PFREE(ll_unitdata_req); | |
337 | |
338 } /* uitx_ll_unitdata_req() */ | |
339 | |
340 #endif /* CF_FAST_EXEC */ | |
341 | |
342 #endif /* LL_DESC */ |