comparison src/g23m-gprs/gmm/gmm_rxp.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 : GPRS (8441)
4 | Modul : gmm_rxp.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 is part of the entity GMM and implements all
18 | functions to handles the incoming primitives as described in
19 | the SDL-documentation (RX-statemachine)
20 +-----------------------------------------------------------------------------
21 */
22
23 #ifndef GMM_RXP_C
24 #define GMM_RXP_C
25 #endif
26
27 #define ENTITY_GMM
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 "ccdapi.h" /* to get CCD API */
37 #include "cnf_gmm.h" /* to get cnf-definitions */
38 #include "mon_gmm.h" /* to get mon-definitions */
39 #include "prim.h" /* to get the definitions of used SAP and directions */
40 #include "gmm.h" /* to get the global entity definitions */
41
42 #include "gmm_kerns.h" /* to get some signals */
43 #include "gmm_rxf.h" /* to get some functions */
44
45 #include <string.h> /* to get memset */
46
47 /*==== CONST ================================================================*/
48
49 /*==== LOCAL VARS ===========================================================*/
50
51 /*==== PRIVATE FUNCTIONS ====================================================*/
52
53 /*==== PUBLIC FUNCTIONS =====================================================*/
54
55
56
57 /*
58 +------------------------------------------------------------------------------
59 | Function : rx_ll_unitdata_ind
60 +------------------------------------------------------------------------------
61 | Description : Handles the primitive LL_UNITDATA_IND
62 |
63 | Parameters : *ll_unitdata_ind - Ptr to primitive payload
64 |
65 +------------------------------------------------------------------------------
66 */
67 GLOBAL void rx_ll_unitdata_ind ( T_LL_UNITDATA_IND *ll_unitdata_ind_ )
68 {
69 UBYTE pd;
70 UBYTE tiskip;
71 UBYTE ccdenttype;
72 #ifndef GMM_TCS4
73 U8 *payload;
74 U16 length;
75 #endif
76
77 GMM_TRACE_FUNCTION( "rx_ll_unitdata_ind" );
78 {
79 PPASS (ll_unitdata_ind_, ll_unitdata_ind, LL_UNITDATA_IND );
80
81
82 switch( GET_STATE( RX ) )
83 {
84 case RX_READY:
85 /*
86 * get the Protokol discriminator
87 */
88 GET_PD (ll_unitdata_ind->sdu, pd);
89
90 if ( pd == PD_SM )
91 {
92 /*
93 * macro PPASS (ll_unitdata_ind,
94 * gmmsm_unitdata_ind,
95 * GMMSM_UNITDATA_IND);
96 * is not possible, because o f different parameters
97 */
98 #ifdef GMM_TCS4
99 PALLOC_SDU ( gmmsm_unitdata_ind, MMPM_UNITDATA_IND, (USHORT)(ll_unitdata_ind->sdu.l_buf+ll_unitdata_ind->sdu.o_buf) );
100 #else
101 PALLOC_SDU ( gmmsm_unitdata_ind, GMMSM_UNITDATA_IND, (USHORT)(ll_unitdata_ind->sdu.l_buf+ll_unitdata_ind->sdu.o_buf) );
102 #endif
103 gmmsm_unitdata_ind->sdu.l_buf = ll_unitdata_ind->sdu.l_buf;
104 gmmsm_unitdata_ind->sdu.o_buf = ll_unitdata_ind->sdu.o_buf;
105 memcpy (&gmmsm_unitdata_ind->sdu.buf[0],&ll_unitdata_ind->sdu.buf[0],
106 (gmmsm_unitdata_ind->sdu.l_buf+gmmsm_unitdata_ind->sdu.o_buf+7)/8);
107
108 PSEND ( hCommSM, gmmsm_unitdata_ind );
109
110 #ifdef TRACE_EVE
111 #ifndef GMM_TCS4
112 switch ( gmmsm_unitdata_ind->sdu.buf[((gmmsm_unitdata_ind->sdu.o_buf)>>3)+1])
113 {
114 case ACTIVATE_PDP_REQ:
115 TRACE_EVENT ( "OPar: ACTIVATE_PDP_REQ");break;
116 case ACTIVATE_PDP_ACC:
117 TRACE_EVENT ( "OPar: ACTIVATE_PDP_ACC");break;
118 case ACTIVATE_PDP_REJ:
119 TRACE_EVENT ( "OPar: ACTIVATE_PDP_REJ");break;
120 case REQ_PDP_ACT:
121 TRACE_EVENT ( "OPar: REQ_PDP_ACT");break;
122 case REQ_PDP_ACT_REJ:
123 TRACE_EVENT ( "OPar: REQ_PDP_ACT_REJ");break;
124 case MOD_PDP_REQ:
125 TRACE_EVENT ( "OPar: MOD_PDP_REQ");break;
126 case MOD_PDP_ACC:
127 TRACE_EVENT ( "OPar: MOD_PDP_ACC");break;
128 case DEACT_PDP_REQ:
129 TRACE_EVENT ( "OPar: DEACT_PDP_REQ");break;
130 case DEACT_PDP_ACC:
131 TRACE_EVENT ( "OPar: DEACT_PDP_ACC");break;
132 case SM_STATUS:
133 TRACE_EVENT ( "OPar: SM_STATUS");break;
134 default:
135 TRACE_EVENT ( "OPar: SNDCP unknown");break;
136 }
137 #else /* #ifndef GMM_TCS4 */
138 switch ( gmmsm_unitdata_ind->sdu.buf[((gmmsm_unitdata_ind->sdu.o_buf)>>3)+1])
139 {
140 case ACTIVATE_PDP_CONTEXT_REQUEST:
141 TRACE_EVENT ( "OPar: ACTIVATE_PDP_CONTEXT_REQUEST");break;
142 case ACTIVATE_PDP_CONTEXT_ACCEPT:
143 TRACE_EVENT ( "OPar: ACTIVATE_PDP_CONTEXT_ACCEPT");break;
144 case ACTIVATE_PDP_CONTEXT_REJECT:
145 TRACE_EVENT ( "OPar: ACTIVATE_PDP_CONTEXT_REJECT");break;
146 case REQUEST_PDP_CONTEXT_ACTIVATION:
147 TRACE_EVENT ( "OPar: REQUEST_PDP_CONTEXT_ACTIVATION");break;
148 case REQUEST_PDP_CONTEXT_ACTIVATION_REJECT:
149 TRACE_EVENT ( "OPar: REQUEST_PDP_CONTEXT_ACTIVATION_REJECT");break;
150 case U_MODIFY_PDP_CONTEXT_REQUEST:
151 TRACE_EVENT ( "OPar: U_MODIFY_PDP_CONTEXT_REQUEST");break;
152 case U_MODIFY_PDP_CONTEXT_ACCEPT:
153 TRACE_EVENT ( "OPar: U_MODIFY_PDP_CONTEXT_ACCEPT");break;
154 case DEACTIVATE_PDP_CONTEXT_REQUEST:
155 TRACE_EVENT ( "OPar: DEACTIVATE_PDP_CONTEXT_REQUEST");break;
156 case DEACTIVATE_PDP_CONTEXT_ACCEPT:
157 TRACE_EVENT ( "OPar: DEACTIVATE_PDP_CONTEXT_ACCEPT");break;
158 case SM_STATUS:
159 TRACE_EVENT ( "OPar: SM_STATUS");break;
160 default:
161 TRACE_EVENT ( "OPar: SNDCP unknown");break;
162 }
163 #endif /* #ifndef GMM_TCS4 */
164 #endif /* _SIMULATION_ */
165
166 PFREE ( ll_unitdata_ind );
167 GMM_RETURN;
168 }
169 else if ( PD_GMM != pd && PD_TST != pd )
170 {
171 /*
172 * 04.07 ch. 11.2.3.1.1
173 * "If the Mobile Station receives, on a SAP where it expects standard L3 messages, a
174 * standard L3 message with a protocol discriminator different from those specified in
175 * table 11.2, or for a protocol that it does not support, the Mobile Station shall
176 * ignore the message."
177 */
178 TRACE_ERROR ("message with wrong PD received");
179
180 PFREE (ll_unitdata_ind);
181 GMM_RETURN;
182 }
183 GET_TI (ll_unitdata_ind->sdu, tiskip);
184
185 if ( tiskip != SKIP_VALID )
186 {
187 TRACE_ERROR ("SKIP is invalid in reseived GMM meassage");
188 PFREE ( ll_unitdata_ind );
189 GMM_RETURN;
190 }
191 /*
192 * rx_decode_msg
193 */
194 ll_unitdata_ind->sdu.l_buf -= 8;
195 ll_unitdata_ind->sdu.o_buf += 8;
196 ccdenttype = (PD_GMM==pd)?CCDENT_GMM:CCDENT_TST;
197
198 if (ccdOK != ccd_decodeMsg (ccdenttype,
199 DOWNLINK,
200 (T_MSGBUF /*FAR*/ *) &ll_unitdata_ind->sdu,
201 (UBYTE /*FAR*/ *) _decodedMsg,
202 NOT_PRESENT_8BIT)
203 )
204 {
205 /*
206 * Error Handling
207 */
208 USHORT parlist[6];
209 UBYTE ccd_err;
210
211 /*
212 * clear parlist
213 */
214 memset (parlist,0, sizeof (parlist));
215 ccd_err = ccd_getFirstError (ccdenttype, parlist);
216
217 /*
218 * Error Handling
219 */
220 do
221 {
222 switch (ccd_err)
223 {
224 case ERR_COMPREH_REQUIRED: /* Comprehension required */
225 case ERR_MAND_ELEM_MISS: /* Mandatory elements missing */
226 rx_gmm_status (ERRCS_INVALID_M_INFO);
227 TRACE_ERROR( "CCD ERROR: Mandatory elements missing");
228 PFREE (ll_unitdata_ind);
229 GMM_RETURN;
230 /* break; */
231 case ERR_IE_NOT_EXPECTED:
232 TRACE_ERROR("CCD ERROR: IE not expected. properly an R99 optional element like cell notification, eplmn, or t3302");
233 break;
234 case ERR_IE_SEQUENCE:
235 TRACE_ERROR("wrong sequence of information elements");
236 break;
237 case ERR_MAX_IE_EXCEED:
238 TRACE_ERROR("maximum amount of repeatable information elements has exceeded");
239 break;
240 case ERR_MAX_REPEAT:
241 TRACE_ERROR("a repeatable element occurs too often in the message");
242 break;
243 case ERR_INVALID_MID:
244 rx_gmm_status (ERRCS_TYPE_INVALID);
245 TRACE_ERROR("the message ID is not correct");
246 PFREE (ll_unitdata_ind);
247 GMM_RETURN;
248 case ERR_INTERNAL_ERROR:
249 TRACE_ERROR("an internal CCD error occured ");
250 rx_gmm_status (ERRCS_MESSAGE_INVALID);
251 PFREE (ll_unitdata_ind);
252 GMM_RETURN;
253 /* break; */
254 default:
255 TRACE_ERROR( "CCD ERROR: unknown error");
256 break;
257 /* break; */
258 }
259 ccd_err = ccd_getNextError (ccdenttype, parlist);
260 }while(ccd_err NEQ ERR_NO_MORE_ERROR);
261 }
262
263 #ifndef GMM_TCS4
264 payload = &(ll_unitdata_ind->sdu.buf[0]); /* beginning of buffer */
265 payload += (ll_unitdata_ind->sdu.o_buf) >> 3; /* plus offset (bytes) */
266 length = (ll_unitdata_ind->sdu.l_buf) >> 3; /* length (bytes, bits / 8) */
267 #endif
268
269 switch (_decodedMsg[0])
270 {
271 case ATTACH_ACCEPT:
272 TRACE_0_PARA ( "ATTACH_ACC");
273 #ifndef GMM_TCS4
274 TRACE_BINDUMP( GMM_handle,
275 TC_USER4,
276 "ATTACH ACCEPT",
277 payload,
278 length);
279 #endif
280 sig_rx_kern_att_acc_ind ();
281 break;
282 case ATTACH_REJECT:
283 TRACE_0_PARA ( "ATTACH_REJ");
284 #ifndef GMM_TCS4
285 TRACE_BINDUMP( GMM_handle,
286 TC_USER4,
287 "ATTACH REJECT",
288 payload,
289 length);
290 #endif
291 sig_rx_kern_att_rej_ind ();
292 break;
293 case D_DETACH_REQUEST:
294 TRACE_0_PARA ( "D_DETACH_REQ");
295 sig_rx_kern_det_req_ind ();
296 break;
297 case D_DETACH_ACCEPT:
298 TRACE_0_PARA ( "D_DETACH_ACC");
299 sig_rx_kern_det_acc_ind ();
300 break;
301 case ROUTING_AREA_UPDATE_ACCEPT:
302 TRACE_0_PARA ( "RAU_ACC");
303 #ifndef GMM_TCS4
304 TRACE_BINDUMP( GMM_handle,
305 TC_USER4,
306 "ROUTING AREA UPDATE ACCEPT",
307 payload,
308 length);
309 #endif
310 sig_rx_kern_rau_acc_ind ();
311 break;
312 case ROUTING_AREA_UPDATE_REJECT:
313 TRACE_0_PARA ( "RAU_REJ");
314 #ifndef GMM_TCS4
315 TRACE_BINDUMP( GMM_handle,
316 TC_USER4,
317 "ROUTING AREA UPDATE REJECT",
318 payload,
319 length);
320 #endif
321 sig_rx_kern_rau_rej_ind ();
322 break;
323 case P_TMSI_REALLOCATION_COMMAND:
324 TRACE_0_PARA ( "PTMSI_REALLOC_CMD");
325 sig_rx_kern_realloc_cmd_ind ();
326 break;
327 case AUTHENTICATION_AND_CIPHERING_REQUEST:
328 TRACE_0_PARA ( "A&C_REQ");
329 sig_rx_kern_auth_req_ind ();
330 break;
331 case AUTHENTICATION_AND_CIPHERING_REJECT:
332 TRACE_0_PARA ( "A&C_REJ");
333 sig_rx_kern_auth_rej_ind ();
334 break;
335 case IDENTITY_REQUEST:
336 TRACE_0_PARA ( "ID_REQ");
337 sig_rx_kern_id_req_ind ();
338 break;
339 case GMM_STATUS:
340 TRACE_0_PARA ( "GMM_STATUS");
341 sig_rx_kern_status_ind ();
342 break;
343 case GMM_INFORMATION:
344 TRACE_0_PARA ( "GMM_INFO");
345 sig_rx_kern_info_ind ();
346 break;
347 case GPRS_TEST_MODE_CMD:
348 TRACE_0_PARA ( "GPRS_TEST_MODE_CMD");
349 sig_rx_kern_tst_cmd_ind ();
350 break;
351 #ifdef GMM_TCS4
352 #ifdef FF_EGPRS
353 case EGPRS_START_RADIO_BLOCK_LOOPBACK_CMD:
354 TRACE_0_PARA ( "EGPRS_START_RADIO_BLOCK_LOOPBACK_CMD");
355 sig_rx_kern_egprs_loopb_cmd_ind ();
356 break;
357 #endif /*FF_EGPRS*/
358 #endif /*GMM_TCS4*/
359 default:
360 /*
361 * This branch should never be reached
362 */
363 rx_gmm_status ( ERRCS_TYPE_INVALID );
364 TRACE_ERROR( "NO valid GMM message reseived" );
365 break;
366 }
367
368 PFREE (ll_unitdata_ind);
369 break;
370 default:
371 PFREE (ll_unitdata_ind);
372 TRACE_ERROR( "LL_UNITDATA_IND unexpected" );
373 break;
374 }
375 }
376 GMM_RETURN;
377 } /* rx_ll_unitdata_ind() */