FreeCalypso > hg > freecalypso-citrine
comparison g23m-gsm/ss/ss_for.c @ 0:75a11d740a02
initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 09 Jun 2016 00:02:41 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:75a11d740a02 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : GSM-PS (6147) | |
4 | Modul : SS_FOR | |
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 defines the functions for the formatter | |
18 | capability of the module supplementary services. | |
19 +----------------------------------------------------------------------------- | |
20 */ | |
21 | |
22 #ifndef SS_FOR_C | |
23 #define SS_FOR_C | |
24 | |
25 #include "config.h" | |
26 #include "fixedconf.h" | |
27 #include "condat-features.h" | |
28 | |
29 #define ENTITY_SS | |
30 | |
31 /*==== INCLUDES ===================================================*/ | |
32 #if defined (NEW_FRAME) | |
33 | |
34 #include <string.h> | |
35 #include <stdlib.h> | |
36 #include <stddef.h> | |
37 #include "typedefs.h" | |
38 #include "pcm.h" | |
39 #include "pconst.cdg" | |
40 #include "mconst.cdg" | |
41 #include "message.h" | |
42 #include "ccdapi.h" | |
43 #include "vsi.h" | |
44 #include "custom.h" | |
45 #include "gsm.h" | |
46 #include "prim.h" | |
47 #include "cnf_ss.h" | |
48 #include "mon_ss.h" | |
49 #include "pei.h" | |
50 #include "tok.h" | |
51 #include "ss.h" | |
52 | |
53 #else | |
54 | |
55 #include <string.h> | |
56 #include <stdlib.h> | |
57 #include <stddef.h> | |
58 #include "stddefs.h" | |
59 #include "pcm.h" | |
60 #include "pconst.cdg" | |
61 #include "mconst.cdg" | |
62 #include "message.h" | |
63 #include "ccdapi.h" | |
64 #include "custom.h" | |
65 #include "gsm.h" | |
66 #include "prim.h" | |
67 #include "cnf_ss.h" | |
68 #include "mon_ss.h" | |
69 #include "vsi.h" | |
70 #include "pei.h" | |
71 #include "tok.h" | |
72 #include "ss.h" | |
73 | |
74 #endif | |
75 | |
76 /*==== EXPORT =====================================================*/ | |
77 | |
78 /*==== PRIVAT =====================================================*/ | |
79 | |
80 /*==== VARIABLES ==================================================*/ | |
81 #ifdef TI_PS_HCOMM_CHANGE | |
82 #if defined (NEW_FRAME) | |
83 EXTERN T_HANDLE ss_handle; | |
84 #endif | |
85 #else | |
86 #if defined (NEW_FRAME) | |
87 EXTERN T_HANDLE hCommMM; /* MM Communication */ | |
88 EXTERN T_HANDLE ss_handle; | |
89 #else | |
90 EXTERN T_VSI_CHANDLE hCommMM; /* MM Communication */ | |
91 #endif | |
92 #endif /* TI_PS_HCOMM_CHANGE */ | |
93 | |
94 #if !defined (SHARED_CCD_BUF) | |
95 GLOBAL UBYTE _decodedMsg[MAX_MSTRUCT_LEN_SS]; | |
96 #else | |
97 GLOBAL UBYTE * _decodedMsg; | |
98 #endif | |
99 #ifdef SS_TEST | |
100 EXTERN UBYTE trc[]; | |
101 #endif | |
102 | |
103 /*==== FUNCTIONS ==================================================*/ | |
104 | |
105 /* | |
106 * ------------------------------------------------------------------- | |
107 * Procedures | |
108 * ------------------------------------------------------------------- | |
109 */ | |
110 | |
111 /* | |
112 +-----------------------------------------------------------------------+ | |
113 | PROJECT : GSM-PS (6147) MODULE : SS_FOR | | |
114 | STATE : code ROUTINE : for_mmss_establish_n_data_ind | | |
115 +-----------------------------------------------------------------------+ | |
116 | |
117 PURPOSE : This common routine process the primitives MMSS_ESTATBLISH_IND | |
118 and MMSS_DATA_IND | |
119 | |
120 */ | |
121 | |
122 | |
123 LOCAL void for_mmss_establish_n_data_ind(T_PRIM *prim) | |
124 { | |
125 GET_INSTANCE_DATA; | |
126 | |
127 CHAR *msg_type; | |
128 BOOL invalid_msg = FALSE; | |
129 T_sdu *sdu; | |
130 | |
131 TRACE_FUNCTION ("for_mmss_establish_n_data_ind()"); | |
132 | |
133 if(prim->custom.opc EQ MMSS_ESTABLISH_IND) | |
134 { | |
135 sdu = &((T_MMSS_ESTABLISH_IND *)P2D(prim))->sdu; | |
136 ss_data->est_flag = TRUE; | |
137 } | |
138 else | |
139 { | |
140 sdu = &((T_MMSS_DATA_IND *)P2D(prim))->sdu; | |
141 ss_data->est_flag = FALSE; | |
142 } | |
143 | |
144 if ((ss_data->ti & 7) NEQ 7) | |
145 { | |
146 sdu->o_buf += 8; | |
147 sdu->l_buf -= 8; | |
148 | |
149 CCD_START; | |
150 | |
151 if(ccd_decodeMsg (CCDENT_SS, | |
152 DOWNLINK, | |
153 (T_MSGBUF *) sdu, | |
154 (UBYTE *) _decodedMsg, | |
155 NOT_PRESENT_8BIT) NEQ ccdOK ) | |
156 { | |
157 USHORT parlist[6]; | |
158 UBYTE prev_err; | |
159 UBYTE ccd_err; | |
160 memset (parlist,0, sizeof (parlist)); | |
161 ccd_err = ccd_getFirstError (CCDENT_SS, parlist); | |
162 /* | |
163 * Error Handling | |
164 */ | |
165 ss_data->error = CAUSE_UNSPECIFIED; /*Normal*/ | |
166 do /* Read errors */ | |
167 { | |
168 switch (ccd_err) | |
169 { | |
170 case ERR_INVALID_MID: /* Send RELEASE REQUEST message with cause #97 */ | |
171 /*TS TS 24.010 Section 3.7.4 */ | |
172 send_rel_comp(CAUSE_MESSAGE_TYPE_NOT_IMPLEM); | |
173 PFREE(P2D(prim)); | |
174 CCD_END; | |
175 return; | |
176 | |
177 case ERR_COMPREH_REQUIRED: /* comprehension required */ | |
178 case ERR_MAND_ELEM_MISS: /* Mandatory elements missing */ | |
179 case ERR_MSG_LEN: /* Message Length exceeds its limit */ | |
180 /*TS TS 24.010 Section 3.7.5 */ | |
181 ss_data->error = CAUSE_INVALID_MAND_INFO; | |
182 break; | |
183 | |
184 #if defined (WIN32) | |
185 /* This part is interesting only in implementation and testing; may be | |
186 * included if specific handling for specific errors is required in | |
187 * future releases | |
188 */ | |
189 case ERR_IE_NOT_EXPECTED: | |
190 TRACE_ERROR("CCD ERROR: IE not expected. properly an R99 optional element like cell notification, eplmn, or t3302"); | |
191 break; | |
192 | |
193 case ERR_IE_SEQUENCE: | |
194 TRACE_EVENT_P1("Wrong sequence of IE, CCD error code = %u", ccd_err); | |
195 break; | |
196 | |
197 case ERR_MAX_IE_EXCEED: | |
198 TRACE_EVENT_P1("Maximum amount of repeatable IE has exceeded, CCD error code = %u", ccd_err); | |
199 break; | |
200 | |
201 case ERR_MAX_REPEAT: | |
202 TRACE_EVENT_P1("A repeatable IE occurs too often in the message, CCD error code = %u", ccd_err); | |
203 break; | |
204 | |
205 case ERR_PATTERN_MISMATCH: | |
206 case ERR_INVALID_TYPE: | |
207 TRACE_EVENT_P1 ("MNC decoding erroneous = %u", ccd_err); | |
208 break; | |
209 #endif /* #if defined (WIN32) */ | |
210 default: | |
211 #if defined (WIN32) | |
212 TRACE_EVENT_P1 ("Unexpected warnings/errors = %u", ccd_err); | |
213 #endif /* #if defined (WIN32) */ | |
214 break; /* No or non-interesting error */ | |
215 } | |
216 prev_err = ccd_err; | |
217 ccd_err = ccd_getNextError (CCDENT_SS, parlist); | |
218 }while ( prev_err NEQ ERR_NO_MORE_ERROR | |
219 AND !ss_check_critical_error(ss_data->error) ); | |
220 } | |
221 | |
222 switch (_decodedMsg[0]) | |
223 { | |
224 case D_SS_FACILITY: | |
225 ss_d_ss_facility (); | |
226 msg_type = "D_SS_FACILITY"; | |
227 break; | |
228 case D_SS_REGISTER: | |
229 ss_d_ss_register (); | |
230 msg_type = "D_SS_REGISTER"; | |
231 break; | |
232 case B_SS_REL_COMP: | |
233 ss_b_ss_rel_comp (); | |
234 msg_type = "B_SS_REL_COMP"; | |
235 break; | |
236 default: | |
237 /* This should NOT be reached */ | |
238 TRACE_FUNCTION("**UNKNOWN MESSAGE ID**"); | |
239 msg_type = "UNKNOWN MESSAGE"; | |
240 invalid_msg = TRUE; | |
241 break; | |
242 } | |
243 if(!invalid_msg) | |
244 { | |
245 TRACE_BINDUMP( ss_handle, | |
246 TC_USER4, | |
247 msg_type, | |
248 (&(sdu->buf[0]))+(((sdu->o_buf)>>3) -1), | |
249 (((sdu->l_buf)>>3) +1)); | |
250 } | |
251 | |
252 CCD_END; | |
253 } | |
254 else if(prim->custom.opc EQ MMSS_ESTABLISH_IND) | |
255 { | |
256 /* Establishment with a reserved TI. Release the MM connection */ | |
257 PALLOC (mmss_release_req, MMSS_RELEASE_REQ); /* T_MMSS_RELEASE_REQ */ | |
258 mmss_release_req->ti = ss_data->ti; | |
259 PSENDX (MM, mmss_release_req); | |
260 } | |
261 | |
262 PFREE(P2D(prim)); | |
263 } | |
264 | |
265 | |
266 /* | |
267 * ------------------------------------------------------------------- | |
268 * PRIMITIVE Processing functions | |
269 * ------------------------------------------------------------------- | |
270 */ | |
271 | |
272 | |
273 /* | |
274 +--------------------------------------------------------------------+ | |
275 | PROJECT : GSM-PS (6147) MODULE : SS_FOR | | |
276 | STATE : code ROUTINE : for_mmss_establish_ind | | |
277 +--------------------------------------------------------------------+ | |
278 | |
279 PURPOSE : Process the primitive MMSS_ESTATBLISH_IND. | |
280 | |
281 */ | |
282 | |
283 GLOBAL void for_mmss_establish_ind (T_MMSS_ESTABLISH_IND *mmss_establish_ind_org) | |
284 { | |
285 GET_INSTANCE_DATA; | |
286 | |
287 /* Enable the PCO to correctly decode the message */ | |
288 PPASS (mmss_establish_ind_org, mmss_establish_ind, MMSS_ESTABLISH_IND); | |
289 | |
290 TRACE_FUNCTION ("for_mmss_establish_ind()"); | |
291 | |
292 GET_PD (mmss_establish_ind->sdu, ss_data->pd); | |
293 GET_TI (mmss_establish_ind->sdu, ss_data->ti); | |
294 | |
295 ss_data->ti += ((ss_data->ti > 7) ? -8 : 8); | |
296 | |
297 for_mmss_establish_n_data_ind((T_PRIM *)D2P(mmss_establish_ind)); | |
298 } | |
299 | |
300 /* | |
301 +--------------------------------------------------------------------+ | |
302 | PROJECT : GSM-PS (6147) MODULE : SS_FOR | | |
303 | STATE : code ROUTINE : for_mmss_data_ind | | |
304 +--------------------------------------------------------------------+ | |
305 | |
306 PURPOSE : Process the primitive MMSS_DATA_IND. | |
307 | |
308 */ | |
309 | |
310 GLOBAL void for_mmss_data_ind (T_MMSS_DATA_IND *mmss_data_ind_org) | |
311 { | |
312 GET_INSTANCE_DATA; | |
313 | |
314 /* Enable the PCO to correctly decode the message */ | |
315 PPASS (mmss_data_ind_org, mmss_data_ind, MMSS_DATA_IND); | |
316 | |
317 TRACE_FUNCTION ("for_mmss_data_ind()"); | |
318 | |
319 GET_PD (mmss_data_ind->sdu, ss_data->pd); | |
320 GET_TI (mmss_data_ind->sdu, ss_data->ti); | |
321 | |
322 ss_data->ti += ((ss_data->ti > 7) ? -8 : 8); | |
323 | |
324 for_mmss_establish_n_data_ind((T_PRIM *)D2P(mmss_data_ind)); | |
325 } | |
326 | |
327 /* | |
328 * ------------------------------------------------------------------- | |
329 * SIGNAL Processing functions | |
330 * ------------------------------------------------------------------- | |
331 */ | |
332 | |
333 /* | |
334 +--------------------------------------------------------------------+ | |
335 | PROJECT : GSM-PS (6147) MODULE : SS_FOR | | |
336 | STATE : code ROUTINE : ss_for_data_req | | |
337 +--------------------------------------------------------------------+ | |
338 | |
339 PURPOSE : Process the signal DATA_REQ. | |
340 | |
341 */ | |
342 | |
343 GLOBAL void ss_for_data_req (USHORT bit_size_message) | |
344 { | |
345 GET_INSTANCE_DATA; | |
346 CHAR *msg_type; | |
347 BOOL invalid_msg = FALSE; | |
348 PALLOC_SDU (mmss_data_req, MMSS_DATA_REQ, bit_size_message); | |
349 | |
350 TRACE_FUNCTION ("ss_for_data_req()"); | |
351 | |
352 mmss_data_req->sdu.l_buf = bit_size_message; | |
353 mmss_data_req->sdu.o_buf = ENCODE_OFFSET; | |
354 | |
355 if (ccd_codeMsg (CCDENT_SS, | |
356 UPLINK, | |
357 (T_MSGBUF *) &mmss_data_req->sdu, | |
358 (UBYTE *) _decodedMsg, | |
359 NOT_PRESENT_8BIT) | |
360 EQ ccdOK) | |
361 { | |
362 SET_PD (mmss_data_req->sdu, PD_SS); | |
363 SET_TI (mmss_data_req->sdu, ss_data->ti); | |
364 | |
365 mmss_data_req->sdu.o_buf -= 8; | |
366 mmss_data_req->sdu.l_buf += 8; | |
367 | |
368 /* Trace Bindump() for uplink messages. | |
369 * called from mnss_facility_req / mnss_end_req / mnss_esatblish_req etc | |
370 */ | |
371 switch (_decodedMsg[0]) | |
372 { | |
373 case U_SS_FACILITY: | |
374 msg_type = "U_SS_FACILITY"; | |
375 break; | |
376 case U_SS_REGISTER: | |
377 msg_type = "U_SS_REGISTER"; | |
378 break; | |
379 case B_SS_REL_COMP: | |
380 msg_type = "B_SS_REL_COMP"; | |
381 break; | |
382 default: | |
383 TRACE_FUNCTION("**UNKNOWN MESSAGE ID**"); | |
384 msg_type = "UNKNOWN MESSAGE"; | |
385 invalid_msg = TRUE; | |
386 break; | |
387 } | |
388 if(!invalid_msg) | |
389 { | |
390 TRACE_BINDUMP( ss_handle, | |
391 TC_USER4, | |
392 msg_type, | |
393 (&(mmss_data_req->sdu.buf[0]))+(((mmss_data_req->sdu.o_buf)>>3) -1), | |
394 (((mmss_data_req->sdu.l_buf)>>3) +1)); | |
395 } | |
396 | |
397 PSENDX (MM, mmss_data_req); | |
398 } | |
399 else | |
400 { | |
401 PFREE (mmss_data_req); | |
402 } | |
403 } | |
404 | |
405 #endif /* #ifndef SS_FOR_C */ |