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 */