FreeCalypso > hg > fc-tourmaline
comparison src/g23m-gprs/sm/sm.c @ 1:fa8dc04885d8
src/g23m-*: import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:25:50 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:4e78acac3d88 | 1:fa8dc04885d8 |
---|---|
1 /*---------------------------------------------------------------------------- | |
2 | Project : 3G PS | |
3 | Module : SM | |
4 +----------------------------------------------------------------------------- | |
5 | Copyright 2003 Texas Instruments. | |
6 | All rights reserved. | |
7 | | |
8 | This file is confidential and a trade secret of Texas | |
9 | Instruments . | |
10 | The receipt of or possession of this file does not convey | |
11 | any rights to reproduce or disclose its contents or to | |
12 | manufacture, use, or sell anything it may describe, in | |
13 | whole, or in part, without the specific written consent of | |
14 | Texas Instruments. | |
15 +----------------------------------------------------------------------------- | |
16 | Purpose: Utility functions implementation in the SM entity. | |
17 | For design details, see: | |
18 | 8010.908 SM Detailed Specification | |
19 +---------------------------------------------------------------------------*/ | |
20 | |
21 /*==== DECLARATION CONTROL =================================================*/ | |
22 | |
23 /*==== INCLUDES =============================================================*/ | |
24 | |
25 #include <stdio.h> | |
26 #include "sm.h" | |
27 | |
28 /*==== CONSTS ===============================================================*/ | |
29 | |
30 /*==== TYPES ================================================================*/ | |
31 | |
32 /*==== LOCALS ===============================================================*/ | |
33 | |
34 /*==== PRIVATE FUNCTIONS ====================================================*/ | |
35 | |
36 /*==== PUBLIC FUNCTIONS =====================================================*/ | |
37 | |
38 /* | |
39 +------------------------------------------------------------------------------ | |
40 | Function : sm_nsapi2nsapi_set | |
41 +------------------------------------------------------------------------------ | |
42 | Description : Returns nsapi_set corresponding to the input NSAPI | |
43 | | |
44 | Parameters : nsapi - NSAPI to convert to nsapi_set | |
45 +------------------------------------------------------------------------------ | |
46 */ | |
47 U16 sm_nsapi2nsapi_set(int /*@alt U8@*/ nsapi) | |
48 { | |
49 return (U16)(1UL << (U8)nsapi); | |
50 } | |
51 | |
52 /* | |
53 +------------------------------------------------------------------------------ | |
54 | Function : sm_add_nsapi_to_nsapi_set | |
55 +------------------------------------------------------------------------------ | |
56 | Description : Returns nsapi_set with nsapi added to it (1 << nsapi). | |
57 | | |
58 | Parameters : nsapi - NSAPI to add | |
59 | nsapi_set - nsapi_set to which to add NSAPI | |
60 +------------------------------------------------------------------------------ | |
61 */ | |
62 U16 sm_add_nsapi_to_nsapi_set(int /*@alt U8@*/ nsapi, U16 nsapi_set) | |
63 { | |
64 return (nsapi_set | sm_nsapi2nsapi_set(nsapi)); | |
65 } | |
66 | |
67 /* | |
68 +------------------------------------------------------------------------------ | |
69 | Function : sm_remove_nsapi_from_nsapi_set | |
70 +------------------------------------------------------------------------------ | |
71 | Description : Returns nsapi_set with nsapi removed from it (1 << nsapi). | |
72 | | |
73 | Parameters : nsapi - NSAPI to remove | |
74 | nsapi_set - nsapi_set in which to remove NSAPI | |
75 +------------------------------------------------------------------------------ | |
76 */ | |
77 U16 sm_remove_nsapi_from_nsapi_set(int /*@alt U8@*/ nsapi, U16 nsapi_set) | |
78 { | |
79 return (nsapi_set & (0xffff ^ sm_nsapi2nsapi_set(nsapi))); | |
80 } | |
81 | |
82 /* | |
83 +------------------------------------------------------------------------------ | |
84 | Function : sm_is_nsapi_in_nsapi_set | |
85 +------------------------------------------------------------------------------ | |
86 | Description : Returns TRUE iff the input NSAPI (converted to nsapi_set) is | |
87 | set in the input nsapi_set. | |
88 | | |
89 | Parameters : nsapi - NSAPI whose presence to check | |
90 | nsapi_set - nsapi_set to compare | |
91 +------------------------------------------------------------------------------ | |
92 */ | |
93 BOOL sm_is_nsapi_in_nsapi_set(int /*@alt U8,U16@*/ nsapi, U16 nsapi_set) | |
94 { | |
95 return ((nsapi_set & sm_nsapi2nsapi_set(nsapi)) != 0); | |
96 } | |
97 | |
98 /* | |
99 +------------------------------------------------------------------------------ | |
100 | Function : sm_nsapi_to_index | |
101 +------------------------------------------------------------------------------ | |
102 | Description : Returns array index corresponding to NSAPI (nsapi - 5) | |
103 | | |
104 | Parameters : nsapi - NSAPI value | |
105 +------------------------------------------------------------------------------ | |
106 */ | |
107 U16 /*@alt int@*/ sm_nsapi_to_index(U16 /*@alt U8,int@*/nsapi) | |
108 { | |
109 TRACE_ASSERT((T_NAS_nsapi)nsapi >= NAS_NSAPI_5 && nsapi <= NAS_NSAPI_15); | |
110 return (nsapi - (U16)NAS_NSAPI_5); | |
111 } | |
112 | |
113 /* | |
114 +------------------------------------------------------------------------------ | |
115 | Function : sm_index_to_nsapi | |
116 +------------------------------------------------------------------------------ | |
117 | Description : Returns nsapi value corresponding to array index (index + 5) | |
118 | | |
119 | Parameters : index - index value | |
120 +------------------------------------------------------------------------------ | |
121 */ | |
122 U16 /*@alt int@*/ sm_index_to_nsapi(U16 /*@alt U8,int@*/index) | |
123 { | |
124 TRACE_ASSERT(index < SM_MAX_NSAPI_OFFSET); | |
125 return (index + (U16)NAS_NSAPI_5); | |
126 } | |
127 | |
128 /* | |
129 +------------------------------------------------------------------------------ | |
130 | Function : sm_get_pdp_context_status | |
131 +------------------------------------------------------------------------------ | |
132 | Description : Get the network status of all NSAPIs. A bit is set in the | |
133 | nsapi_set, iff the context corresponding to the NSAPI is | |
134 | not in network state INACTIVE. | |
135 | | |
136 | Parameters : None | |
137 +------------------------------------------------------------------------------ | |
138 */ | |
139 U16 sm_get_pdp_context_status(void) | |
140 { | |
141 return sm_data.sm_context_activation_status; | |
142 } | |
143 | |
144 /* | |
145 +------------------------------------------------------------------------------ | |
146 | Function : sm_get_current_rat | |
147 +------------------------------------------------------------------------------ | |
148 | Description : Returns the RAT in which SM is currently active | |
149 | | |
150 | Parameters : None | |
151 +------------------------------------------------------------------------------ | |
152 */ | |
153 T_PS_rat /*@alt U8@*/sm_get_current_rat(void) | |
154 { | |
155 return sm_data.sm_current_rat; | |
156 } | |
157 | |
158 /* | |
159 +------------------------------------------------------------------------------ | |
160 | Function : sm_set_current_rat | |
161 +------------------------------------------------------------------------------ | |
162 | Description : Sets the RAT in which SM is currently active | |
163 | | |
164 | Parameters : rat - Active RAT (GSM / UMTS) | |
165 +------------------------------------------------------------------------------ | |
166 */ | |
167 void sm_set_current_rat(T_PS_rat rat) | |
168 { | |
169 if (rat == PS_RAT_GSM || rat == PS_RAT_UMTS_FDD) { | |
170 sm_data.sm_current_rat = rat; | |
171 } else { | |
172 (void)TRACE_ERROR("Tried to set unknown RAT! (This is OK for EDGE)"); | |
173 } | |
174 } | |
175 | |
176 /* | |
177 +------------------------------------------------------------------------------ | |
178 | Function : sm_get_current_nw_release | |
179 +------------------------------------------------------------------------------ | |
180 | Description : Returns the core network release of the network in which SM | |
181 | is currently active | |
182 | | |
183 | Parameters : None | |
184 +------------------------------------------------------------------------------ | |
185 */ | |
186 T_PS_sgsn_rel /*@alt U8@*/ sm_get_current_nw_release(void) | |
187 { | |
188 return sm_data.sm_current_nw_release; | |
189 } | |
190 | |
191 /* | |
192 +------------------------------------------------------------------------------ | |
193 | Function : sm_is_suspended | |
194 +------------------------------------------------------------------------------ | |
195 | Description : Returns TRUE if SM is suspended, i.e. has received an | |
196 | MMPM_SUSPEND_IND primitive from MM. | |
197 | | |
198 | Parameters : None | |
199 +------------------------------------------------------------------------------ | |
200 */ | |
201 BOOL sm_is_suspended(void) | |
202 { | |
203 return sm_data.sm_suspended; | |
204 } | |
205 | |
206 /* | |
207 +------------------------------------------------------------------------------ | |
208 | Function : sm_is_attached | |
209 +------------------------------------------------------------------------------ | |
210 | Description : Returns TRUE if SM is attached, i.e. has received an | |
211 | MMPM_ATTACH_IND primitive from MM. | |
212 | | |
213 | Parameters : None | |
214 +------------------------------------------------------------------------------ | |
215 */ | |
216 BOOL sm_is_attached(void) | |
217 { | |
218 return sm_data.sm_attached; | |
219 } | |
220 | |
221 /* | |
222 +------------------------------------------------------------------------------ | |
223 | Function : sm_is_secondary | |
224 +------------------------------------------------------------------------------ | |
225 | Description : Returns TRUE if secondary flag is set for the context. | |
226 | | |
227 | Parameters : context - Context data | |
228 +------------------------------------------------------------------------------ | |
229 */ | |
230 BOOL sm_is_secondary(struct T_SM_CONTEXT_DATA *context) | |
231 { | |
232 return (context->flags & (U8)SM_CONTEXT_FLAG_SECONDARY_CONTEXT) != (U8)0; | |
233 } | |
234 | |
235 /* | |
236 +------------------------------------------------------------------------------ | |
237 | Function : sm_set_secondary | |
238 +------------------------------------------------------------------------------ | |
239 | Description : Set secondary flag for the input context | |
240 | | |
241 | Parameters : context - Context data | |
242 +------------------------------------------------------------------------------ | |
243 */ | |
244 void sm_set_secondary(struct T_SM_CONTEXT_DATA *context) | |
245 { | |
246 context->flags |= (U8)SM_CONTEXT_FLAG_SECONDARY_CONTEXT; | |
247 } | |
248 | |
249 /* | |
250 +------------------------------------------------------------------------------ | |
251 | Function : sm_set_started_during_suspend | |
252 +------------------------------------------------------------------------------ | |
253 | Description : Set started during suspend flag for the context | |
254 | | |
255 | Parameters : context - Context data | |
256 +------------------------------------------------------------------------------ | |
257 */ | |
258 void sm_set_started_during_suspend(struct T_SM_CONTEXT_DATA *context) | |
259 { | |
260 if (sm_is_suspended()) { | |
261 context->flags |= (U8)SM_CONTEXT_FLAG_STARTED_DURING_SUSPEND; | |
262 } else { | |
263 context->flags &= 0xff ^ (U8)SM_CONTEXT_FLAG_STARTED_DURING_SUSPEND; | |
264 } | |
265 } | |
266 | |
267 /* | |
268 +------------------------------------------------------------------------------ | |
269 | Function : sm_clear_started_during_suspend | |
270 +------------------------------------------------------------------------------ | |
271 | Description : Clear started during suspend flag for the context | |
272 | | |
273 | Parameters : context - Context data | |
274 +------------------------------------------------------------------------------ | |
275 */ | |
276 void sm_clear_started_during_suspend(struct T_SM_CONTEXT_DATA *context) | |
277 { | |
278 context->flags &= 0xff ^ (U8)SM_CONTEXT_FLAG_STARTED_DURING_SUSPEND; | |
279 } | |
280 | |
281 /* | |
282 +------------------------------------------------------------------------------ | |
283 | Function : sm_is_started_during_suspend | |
284 +------------------------------------------------------------------------------ | |
285 | Description : Return TRUE if started during suspend flag is set for the | |
286 | context. | |
287 | | |
288 | Parameters : context - Context data | |
289 +------------------------------------------------------------------------------ | |
290 */ | |
291 BOOL sm_is_started_during_suspend(struct T_SM_CONTEXT_DATA *context) | |
292 { | |
293 return (context->flags & (U8)SM_CONTEXT_FLAG_STARTED_DURING_SUSPEND) != (U8)0; | |
294 } | |
295 | |
296 /* | |
297 +------------------------------------------------------------------------------ | |
298 | Function : sm_mark_context_for_deallocation | |
299 +------------------------------------------------------------------------------ | |
300 | Description : Set pending deallocation flag for the context | |
301 | | |
302 | Parameters : context - Context data | |
303 +------------------------------------------------------------------------------ | |
304 */ | |
305 void sm_mark_context_for_deallocation(struct T_SM_CONTEXT_DATA *context) | |
306 { | |
307 context->flags |= (U8)SM_CONTEXT_FLAG_PENDING_DEALLOCATION; | |
308 } | |
309 | |
310 /* | |
311 +------------------------------------------------------------------------------ | |
312 | Function : sm_is_context_pending_deallocation | |
313 +------------------------------------------------------------------------------ | |
314 | Description : Returns TRUE if pending deallocation flag is set for the context | |
315 | | |
316 | Parameters : context - Context data | |
317 +------------------------------------------------------------------------------ | |
318 */ | |
319 BOOL sm_is_context_pending_deallocation(struct T_SM_CONTEXT_DATA *context) | |
320 { | |
321 return (context->flags & (U8)SM_CONTEXT_FLAG_PENDING_DEALLOCATION) != (U8)0; | |
322 } | |
323 | |
324 /* | |
325 +------------------------------------------------------------------------------ | |
326 | Function : sm_set_context_pending_reactivation | |
327 +------------------------------------------------------------------------------ | |
328 | Description : Set or clear pending reactivation flag for the context | |
329 | | |
330 | Parameters : context - Context data | |
331 +------------------------------------------------------------------------------ | |
332 */ | |
333 void sm_set_context_pending_reactivation(struct T_SM_CONTEXT_DATA *context, BOOL flag) | |
334 { | |
335 if (flag) | |
336 { | |
337 context->flags |= (U8)(U8)SM_CONTEXT_FLAG_PENDING_REACTIVATION; | |
338 } else { | |
339 context->flags &= 0xff ^ (U8)(U8)SM_CONTEXT_FLAG_PENDING_REACTIVATION; | |
340 } | |
341 } | |
342 | |
343 /* | |
344 +------------------------------------------------------------------------------ | |
345 | Function : sm_is_context_pending_reactivation | |
346 +------------------------------------------------------------------------------ | |
347 | Description : Returns TRUE if pending reactivation flag is set for the context | |
348 | | |
349 | Parameters : context - Context data | |
350 +------------------------------------------------------------------------------ | |
351 */ | |
352 BOOL sm_is_context_pending_reactivation(struct T_SM_CONTEXT_DATA *context) | |
353 { | |
354 return (context->flags & (U8)SM_CONTEXT_FLAG_PENDING_REACTIVATION) != (U8)0; | |
355 } | |
356 | |
357 /* | |
358 +------------------------------------------------------------------------------ | |
359 | Function : sm_is_aci_update_required | |
360 +------------------------------------------------------------------------------ | |
361 | Description : Returns TRUE if one of the flags affecting the SMREG interface | |
362 | have changed/are set. | |
363 | | |
364 | Parameters : update_flags - Update flags | |
365 +------------------------------------------------------------------------------ | |
366 */ | |
367 BOOL sm_is_aci_update_required(T_SM_UPDATE_FLAGS update_flags) | |
368 { | |
369 if ((int)(update_flags & SM_UPDATE_QOS) != 0 || | |
370 (int)(update_flags & SM_UPDATE_QOS_DOWNGRADE) != 0 || | |
371 (int)(update_flags & SM_UPDATE_ADDRESS) != 0 || | |
372 (int)(update_flags & SM_UPDATE_COMP_PARAMS) != 0) { | |
373 return TRUE; | |
374 } | |
375 return FALSE; | |
376 } | |
377 | |
378 /* | |
379 +------------------------------------------------------------------------------ | |
380 | Function : sm_is_user_plane_update_required | |
381 +------------------------------------------------------------------------------ | |
382 | Description : Returns TRUE if one of the flags affecting the SM interface | |
383 | have changed/are set. | |
384 | | |
385 | Parameters : update_flags - Update flags | |
386 +------------------------------------------------------------------------------ | |
387 */ | |
388 BOOL sm_is_user_plane_update_required(T_SM_UPDATE_FLAGS update_flags) | |
389 { | |
390 if ((int)(update_flags & SM_UPDATE_QOS) != 0 || | |
391 (int)(update_flags & SM_UPDATE_COMP_PARAMS) != 0 || | |
392 (int)(update_flags & SM_UPDATE_SAPI_RADIO_PRIO_PFI) != 0) { | |
393 return TRUE; | |
394 } | |
395 return FALSE; | |
396 } | |
397 | |
398 /* | |
399 +------------------------------------------------------------------------------ | |
400 | Function : sm_set_pfi_included | |
401 +------------------------------------------------------------------------------ | |
402 | Description : Set PFI included flag for the context | |
403 | | |
404 | Parameters : context - Context data | |
405 +------------------------------------------------------------------------------ | |
406 */ | |
407 void sm_set_pfi_included(struct T_SM_CONTEXT_DATA *context, BOOL flag) | |
408 { | |
409 if (flag) | |
410 { | |
411 context->flags |= (U8)SM_CONTEXT_FLAG_PFI_PRESENT; | |
412 } else { | |
413 context->flags &= 0xff ^ (U8)SM_CONTEXT_FLAG_PFI_PRESENT; | |
414 } | |
415 } | |
416 | |
417 /* | |
418 +------------------------------------------------------------------------------ | |
419 | Function : sm_is_pfi_included | |
420 +------------------------------------------------------------------------------ | |
421 | Description : Return TRUE if PFI included flag is set for the context. | |
422 | | |
423 | Parameters : context - Context data | |
424 +------------------------------------------------------------------------------ | |
425 */ | |
426 BOOL sm_is_pfi_included(struct T_SM_CONTEXT_DATA *context) | |
427 { | |
428 return (context->flags & (U8)SM_CONTEXT_FLAG_PFI_PRESENT) != (U8)0; | |
429 } | |
430 | |
431 /* | |
432 +------------------------------------------------------------------------------ | |
433 | Function : sm_is_llc_sapi_valid | |
434 +------------------------------------------------------------------------------ | |
435 | Description : Return TRUE if the LLC SAPI provided is valid, FALSE otherwise. | |
436 | | |
437 | Parameters : llc_sapi - LLC SAPI | |
438 | ti - TI for context | |
439 +------------------------------------------------------------------------------ | |
440 */ | |
441 BOOL sm_is_llc_sapi_valid(U8 llc_sapi, U8 ti) | |
442 { | |
443 /* This check is only valid in non-UMTS-single mode configurations */ | |
444 #if !defined(TI_UMTS) || defined(TI_DUAL_MODE) | |
445 T_CAUSE_ps_cause cause; | |
446 | |
447 if ( (llc_sapi == PS_SAPI_3) || | |
448 (llc_sapi == PS_SAPI_5) || | |
449 (llc_sapi == PS_SAPI_9) || | |
450 (llc_sapi == PS_SAPI_11) ) | |
451 { | |
452 /* LLC SAPI is OK. Return TRUE. */ | |
453 return TRUE; | |
454 } else { | |
455 /* LLC SAPI has a reserved value. Send a status message. */ | |
456 cause.ctrl_value = CAUSE_is_from_nwsm; | |
457 cause.value.nwsm_cause = (U16)CAUSE_NWSM_INVALID_MANDATORY_ELEMENT; | |
458 send_msg_sm_status(ti, &cause); | |
459 return FALSE; | |
460 } | |
461 #else | |
462 /* In UMTS single mode, this check is disabled */ | |
463 return TRUE; | |
464 #endif | |
465 } | |
466 | |
467 /* | |
468 +------------------------------------------------------------------------------ | |
469 | Function : sm_set_current_nw_release | |
470 +------------------------------------------------------------------------------ | |
471 | Description : Sets the core network release of the network in which SM | |
472 | is currently active | |
473 | | |
474 | Parameters : sgsn_rel - Network release (pre-R99 / R99) | |
475 +------------------------------------------------------------------------------ | |
476 */ | |
477 void sm_set_current_nw_release(T_PS_sgsn_rel sgsn_rel) | |
478 { | |
479 if (sgsn_rel == PS_SGSN_98_OLDER || sgsn_rel == PS_SGSN_99_ONWARDS) { | |
480 sm_data.sm_current_nw_release = sgsn_rel; | |
481 } | |
482 else { /*The Berlin way*/ | |
483 /*If SGSN release is unknown set the value to R98*/ | |
484 (void)TRACE_ERROR("Tried to set unknown core network release. \ | |
485 Setting R97 as default !"); | |
486 sm_data.sm_current_nw_release = PS_SGSN_98_OLDER; | |
487 } | |
488 } | |
489 | |
490 /* | |
491 +------------------------------------------------------------------------------ | |
492 | Function : sm_set_aci_cause | |
493 +------------------------------------------------------------------------------ | |
494 | Description : Sets the cause value for a context. Used during retransmissions | |
495 | etc. | |
496 | | |
497 | Parameters : context - context data | |
498 | ctrl_cause - cause originator | |
499 | cause - vause value | |
500 +------------------------------------------------------------------------------ | |
501 */ | |
502 void sm_set_aci_cause(struct T_SM_CONTEXT_DATA *context, | |
503 T_CAUSE_ctrl_value ctrl_cause, U16 cause) | |
504 { | |
505 (void)TRACE_EVENT_P2("sm_set_aci_cause(ctrl=%d, cause=%04x)", (int)ctrl_cause, cause); | |
506 TRACE_ASSERT(context != NULL); | |
507 /*lint -e613 (Possible use of null pointer 'context' in left argument to operator '->') */ | |
508 context->aci_cause.ctrl_value = ctrl_cause; | |
509 context->aci_cause.value.nwsm_cause = cause; | |
510 /*lint +e613 (Possible use of null pointer 'context' in left argument to operator '->') */ | |
511 } | |
512 | |
513 /* | |
514 +------------------------------------------------------------------------------ | |
515 | Function : sm_get_aci_cause | |
516 +------------------------------------------------------------------------------ | |
517 | Description : Gets the cause value for a context. Used during retransmissions | |
518 | etc. | |
519 | | |
520 | Parameters : context - context data | |
521 +------------------------------------------------------------------------------ | |
522 */ | |
523 /*@observer@*/ | |
524 T_CAUSE_ps_cause *sm_get_aci_cause(struct T_SM_CONTEXT_DATA *context) | |
525 { | |
526 TRACE_ASSERT(context != NULL); | |
527 /*lint -e613 (Possible use of null pointer 'context' in left argument to operator '->') */ | |
528 return &context->aci_cause; | |
529 } | |
530 | |
531 /* | |
532 +------------------------------------------------------------------------------ | |
533 | Function : sm_set_nw_cause | |
534 +------------------------------------------------------------------------------ | |
535 | Description : Sets the cause value for a context. Used during retransmissions | |
536 | etc. | |
537 | | |
538 | Parameters : context - context data | |
539 | ctrl_cause - cause originator | |
540 | cause - vause value | |
541 +------------------------------------------------------------------------------ | |
542 */ | |
543 void sm_set_nw_cause(struct T_SM_CONTEXT_DATA *context, | |
544 T_CAUSE_ctrl_value ctrl_cause, U16 cause) | |
545 { | |
546 TRACE_ASSERT(context != NULL); | |
547 /*lint -e613 (Possible use of null pointer 'context' in left argument to operator '->') */ | |
548 context->nw_cause.ctrl_value = ctrl_cause; | |
549 context->nw_cause.value.nwsm_cause = cause; | |
550 /*lint +e613 (Possible use of null pointer 'context' in left argument to operator '->') */ | |
551 } | |
552 | |
553 /* | |
554 +------------------------------------------------------------------------------ | |
555 | Function : sm_get_nw_cause | |
556 +------------------------------------------------------------------------------ | |
557 | Description : Gets the cause value for a context. Used during retransmissions | |
558 | etc. | |
559 | | |
560 | Parameters : context - context data | |
561 +------------------------------------------------------------------------------ | |
562 */ | |
563 /*@observer@*/ | |
564 T_CAUSE_ps_cause *sm_get_nw_cause(struct T_SM_CONTEXT_DATA *context) | |
565 { | |
566 TRACE_ASSERT(context != NULL); | |
567 /*lint -e613 (Possible use of null pointer 'context' in left argument to operator '->') */ | |
568 #ifdef DEBUG | |
569 if (context->nw_cause.ctrl_value != CAUSE_is_from_nwsm && | |
570 context->nw_cause.ctrl_value != CAUSE_is_from_sm) { | |
571 (void)TRACE_EVENT_P2("sm_get_nw_cause(): ERROR! Cause element not " | |
572 "initialized or not from SM (ctrl=%d, cause=%d)", | |
573 context->nw_cause.ctrl_value, context->nw_cause.value.nwsm_cause); | |
574 } | |
575 #endif | |
576 return &context->nw_cause; | |
577 /*lint +e613 (Possible use of null pointer 'context' in left argument to operator '->') */ | |
578 } | |
579 | |
580 /*==== END OF FILE ==========================================================*/ |