FreeCalypso > hg > fc-magnetite
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() */ |