comparison gsm-fw/g23m-gsm/sms/sms_tls.c @ 673:2f7df7a314f8

gsm-fw/g23m-gsm subtree: initial import from LoCosto source
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 28 Sep 2014 23:20:04 +0000
parents
children d10585d665b4
comparison
equal deleted inserted replaced
672:0dc6f9e8e980 673:2f7df7a314f8
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-F&D (8411)
4 | Modul : SMS_TLP
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 transfer layer
18 | capability of the module Short Message Service.
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef SMS_TLS_C
23 #define SMS_TLS_C
24
25 #define ENTITY_SMS
26
27 /*==== INCLUDES ===================================================*/
28
29 #include <string.h>
30 #include <stdlib.h>
31 #include <stddef.h>
32 #include "typedefs.h"
33 #include "pcm.h"
34 #include "vsi.h"
35 #include "custom.h"
36 #include "gsm.h"
37 #include "message.h"
38 #include "ccdapi.h"
39 #include "prim.h"
40 #include "cus_sms.h"
41 #include "cnf_sms.h"
42 #include "mon_sms.h"
43 #include "pei.h"
44 #include "tok.h"
45 #include "sms.h"
46 #include "gdi.h"
47 #include "sms_em.h"
48
49 /*==== EXPORT ======================================================*/
50
51 /*==== PRIVAT ======================================================*/
52
53 /*==== VARIABLES ===================================================*/
54
55 /*==== FUNCTIONS ===================================================*/
56
57 LOCAL BOOL tl_modify_is_all (UBYTE modify)
58 {
59 switch (modify)
60 {
61 case SMS_MODIFY_NON:
62 case SMS_MODIFY_SCA:
63 case SMS_MODIFY_TPOA:
64 case SMS_MODIFY_TPOA_SCA:
65 return FALSE;
66 default:
67 break;
68 }
69 return TRUE; /* MODIFY_ALL: complete message is given */
70 }
71
72 LOCAL void tl_send_failure(USHORT cause)
73 {
74 GET_INSTANCE_DATA;
75
76 /*
77 * release connection
78 */
79 rl_release_req(SMS_INST.ti);
80
81 /*
82 * Send MNSMS_REPORT_IND indicating the cmms_mode value to ACI
83 * if CMMS_MODE is equal to 1or 2.
84 */
85 if(CMMS_ACTIVE)
86 {
87 tl_cmms_end();
88 }
89 /*
90 * SUBMIT_CNF
91 */
92 tl_mnsms_submit_cnf (SMS_SEL_MEM(sms_data),
93 SMS_SEL_REC(sms_data),
94 NOT_PRESENT_8BIT,
95 cause,
96 NULL);
97 }
98
99 /*---- SIGNALS -----------------------------------------------------*/
100
101 /*
102 +--------------------------------------------------------------------+
103 | PROJECT : GSM-PS (8410) MODULE : SMS_TLS |
104 | STATE : code ROUTINE : tl_establish_cnf |
105 +--------------------------------------------------------------------+
106
107 PURPOSE : Process the signal TL_ESTABLISH_CNF.
108
109 */
110
111 GLOBAL void tl_establish_cnf (
112 BOOL success)
113 {
114 GET_INSTANCE_DATA;
115
116 TRACE_FUNCTION ("tl_establish_cnf()");
117
118 #ifdef GPRS
119 if (success EQ FALSE)
120 {
121 /*
122 * Establishment Failed.
123 */
124 if (SMS_INST.downlink EQ SMS_DOWNLINK_LL_CHECK)
125 {
126 if (sms_data->mo_dst_pref EQ GPRS_SMS_GPRS_PREF)
127 {
128 /*
129 * using the preferred downlink LL failed, use CSD
130 */
131 TRACE_EVENT("Establishment failed on LL link, try gsm path instead");
132 /*
133 * set downlink type MMSMS
134 */
135 TRACE_EVENT("downlink = SMS_DOWNLINK_MMSMS");
136 SMS_INST.downlink = SMS_DOWNLINK_MMSMS;
137 /*
138 * try again
139 */
140 rl_establish_req(SMS_INST.ti);
141 return;
142 }
143 else
144 {
145 /*
146 * unsing the preferred downlink LL failed
147 */
148 TRACE_EVENT("Establishment failed on LL link, stop working");
149 /*
150 * handle event in report ind
151 */
152 tl_report_ind(NULL,SMS_CAUSE_NO_SERVICE);
153 return;
154 }
155 }
156
157 else if (SMS_INST.downlink EQ SMS_DOWNLINK_MMSMS)
158 {
159 if(sms_data->mo_dst_pref EQ GPRS_SMS_CCT_PREF)
160 {
161 /*
162 * using the preferred downlink MM failed, use PS
163 */
164 TRACE_EVENT("Establishment failed on MM link, try gprs path instead");
165
166 /*
167 * set downlink type LL
168 */
169 TRACE_EVENT("downlink = SMS_DOWNLINK_LL");
170 SMS_INST.downlink = SMS_DOWNLINK_LL_CHECK;
171 /*
172 * If CMMS_ACTIVE then send the MNSMS_REPORT_IND to ACI informing about
173 * the current cmms_mode value as GSM connection is failed.
174 */
175 if(CMMS_ACTIVE)
176 {
177 tl_cmms_end();
178 }
179
180 /*
181 * try again
182 */
183 rl_establish_req(SMS_INST.ti);
184 return;
185 }
186 /*
187 * else
188 * <<PS PREF failed CS fallback also failed>> case covered in cp layer.
189 */
190 }
191 }
192 #endif /* #ifdef GPRS */
193
194 switch (SMS_INST_GET_STATE (STATE_TL))
195 {
196 case TL_ESTABLISH:
197 switch (GET_STATE (STATE_EST))
198 {
199 case EST_SEND:
200
201 tl_establish_cnf_send();
202 break;
203
204 case EST_RTX:
205
206 tl_establish_cnf_rtx();
207 break;
208
209 case EST_CMD:
210
211 tl_establish_cnf_cmd();
212 break;
213
214 case EST_SMMA:
215
216 /*
217 * TL state transition: TL_OTHER
218 */
219 SMS_INST_SET_STATE (STATE_TL, TL_OTHER);
220 if (!rl_mem_avail_req ())
221 {
222 TRACE_EVENT("could not send SMMA");
223 /*
224 * TL state transition TL_OTHER
225 */
226 SMS_INST_SET_STATE (STATE_TL, TL_OTHER);
227 /*
228 * handle event in report ind
229 */
230 tl_report_ind(NULL,SMS_CAUSE_ENTITY_BUSY);
231 }
232
233 break;
234 }
235 break;
236
237 default:
238 TRACE_ERROR("TL_ESTABLISH_CNF in wrong state received");
239 }
240 }
241
242 /*
243 +--------------------------------------------------------------------+
244 | PROJECT : GSM-PS (8410) MODULE : SMS_TLS |
245 | STATE : code ROUTINE : tl_establish_cnf_send |
246 +--------------------------------------------------------------------+
247
248 PURPOSE : Process the signal TL_ESTABLISH_CNF
249 in state TL_SEND_ESTABLISH.
250
251 */
252
253 GLOBAL void tl_establish_cnf_send (void)
254 {
255 GET_INSTANCE_DATA;
256 drv_Return_Type pcm_result;
257 T_SIM_PDU *sim_pdu;
258
259 TRACE_FUNCTION ("tl_establish_cnf_send()");
260
261 if ( (SMS_SEL_REC(sms_data) NEQ SMS_RECORD_NOT_EXIST) AND
262 (!tl_modify_is_all (SMS_MODIFY(sms_data))) )
263 {
264 /*
265 * SEND - MODIFY
266 */
267 switch (SMS_SEL_MEM(sms_data))
268 {
269 case MEM_SM:
270
271 if (SMS_SEL_REC(sms_data) <= SMS_SIM_PROP(sms_data).max_record)
272 {
273 tl_set_access_fifo (ACCESS_BY_MMI);
274 /*
275 * TL state transition: TL_SEND
276 */
277 SET_STATE (STATE_MMI, MMI_READ);
278 SMS_INST_SET_STATE (STATE_TL, TL_SEND);
279 tl_sim_read_record_req (SMS_SEL_REC(sms_data));
280 }
281 else
282 {
283 tl_send_failure(SMS_CAUSE_INV_INDEX);
284 /*
285 * TL state transition: TL_IDLE
286 */
287 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
288 }
289 break;
290
291 case MEM_ME:
292
293 if (SMS_SEL_REC(sms_data) <= SMS_ME_PROP(sms_data).max_record)
294 {
295 USHORT max_record;
296 UBYTE misc;
297 UBYTE sim_msg[SIZE_EF_SMS];
298 MCAST (cp_data, U_CP_DATA);
299
300 /* Implements Measure#32: Row 109 */
301 pcm_result = pcm_ReadRecord ((UBYTE *)ef_sms_id,
302 (USHORT)SMS_SEL_REC(sms_data),
303 SIZE_EF_SMS,
304 sim_msg, &misc, &max_record);
305 if (pcm_result NEQ PCM_OK)
306 {
307 SMS_ME_PROP(sms_data).max_record = 0;
308 /*
309 * stop sending
310 */
311 tl_send_failure(SMS_CAUSE_MEM_FAIL);
312 /*
313 * TL state transition: TL_IDLE
314 */
315 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
316 break;
317 }
318 MALLOC (sim_pdu, sizeof(T_SIM_PDU));
319 CCD_START;
320 /*
321 * modify, prepare submit
322 */
323 if (tl_modify_submit (sim_pdu, SMS_MODIFY(sms_data),
324 SMS_SDU(sms_data), sim_msg) AND
325 tl_prepare_submit (sim_pdu, cp_data))
326 {
327 /*
328 * RL_DATA_REQ
329 */
330 if (!rl_data_req (SMS_INST.tp_mr, cp_data))
331 {
332 /*
333 * stop sending
334 */
335 tl_send_failure(SMS_CAUSE_ENTITY_BUSY);
336 /*
337 * TL state transition: TL_IDLE
338 */
339 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
340 }
341 else
342 {
343 SMS_EM_MO_SHORT_MESSAGE;
344 /*
345 * TL state transition: TL_SEND
346 */
347 SMS_INST_SET_STATE (STATE_TL, TL_SEND);
348 }
349 }
350 else
351 {
352 /*
353 * stop sending
354 */
355 tl_send_failure(SMS_CAUSE_PARAM_WRONG);
356 /*
357 * TL state transition: TL_IDLE
358 */
359 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
360 }
361 CCD_END;
362 MFREE (sim_pdu);
363 }
364 else
365 {
366 /*
367 * stop sending
368 */
369 tl_send_failure(SMS_CAUSE_INV_INDEX);
370 /*
371 * TL state transition: TL_IDLE
372 */
373 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
374 }
375 break;
376
377 default:
378 /*
379 * stop sending
380 */
381 tl_send_failure(SMS_CAUSE_PARAM_WRONG);
382 /*
383 * TL state transition: TL_IDLE
384 */
385 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
386 }
387 }
388 else /* no record given, or no previous mem read */
389 {
390 /*
391 * SEND - STRAIGHT
392 */
393 USHORT cause = SMS_NO_ERROR;
394
395 switch (SMS_SEL_MEM(sms_data))
396 {
397 case MEM_SM:
398 if (SMS_SEL_REC(sms_data) > SMS_SIM_PROP(sms_data).max_record)
399 {
400 cause = SMS_CAUSE_INV_INDEX;
401 }
402 break;
403
404 case MEM_ME:
405 if (SMS_SEL_REC(sms_data) > SMS_ME_PROP(sms_data).max_record)
406 {
407 cause = SMS_CAUSE_INV_INDEX;
408 }
409 break;
410
411 default:
412 if (SMS_SEL_REC(sms_data) NEQ SMS_RECORD_NOT_EXIST)
413 {
414 cause = SMS_CAUSE_PARAM_WRONG;
415 }
416 break;
417 }
418
419 if (cause EQ SMS_NO_ERROR)
420 {
421 /* Do some additional tests on the SMS SDU */
422 if (SMS_SDU(sms_data)->l_buf EQ 0)
423 {
424 TRACE_ERROR ("MNSMS_SUBMIT_REQ: sms_sdu empty");
425 cause = SMS_CAUSE_PARAM_WRONG;
426 }
427 if ((SMS_SDU(sms_data)->l_buf >> 3) +
428 (SMS_SDU(sms_data)->o_buf >> 3) > SIM_PDU_LEN)
429 {
430 TRACE_ERROR ("MNSMS_SUBMIT_REQ: sms_sdu out of range");
431 cause = SMS_CAUSE_PARAM_WRONG;
432 }
433 }
434
435 if (cause EQ SMS_NO_ERROR) /* error on previous parameter check? */
436 {
437 MCAST (cp_data, U_CP_DATA);
438 MALLOC (sim_pdu, sizeof(T_SIM_PDU));
439
440 CCD_START;
441 ccd_decodeMsg (CCDENT_SMS, BOTH,
442 (T_MSGBUF *)SMS_SDU(sms_data),
443 (UBYTE *)sim_pdu, SMS_VT_SIM_PDU);
444 /*
445 * prepare submit
446 */
447 if (tl_prepare_submit (sim_pdu, cp_data))
448 {
449 /*
450 * RL_DATA_REQ
451 */
452 if (!rl_data_req (SMS_INST.tp_mr, cp_data))
453 {
454 cause = SMS_CAUSE_ENTITY_BUSY;
455 }
456 else
457 {
458 SMS_EM_MO_SHORT_MESSAGE;
459 /*
460 * TL state transition
461 */
462 SMS_INST_SET_STATE (STATE_TL, TL_SEND);
463 }
464 }
465 else
466 {
467 cause = SMS_CAUSE_PARAM_WRONG;
468 }
469
470 MFREE (sim_pdu);
471 CCD_END;
472 }
473 if (cause NEQ SMS_NO_ERROR)
474 {
475 /*
476 * stop sending
477 */
478 tl_send_failure(cause);
479 /*
480 * TL state transition: TL_IDLE
481 */
482 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
483 }
484 }
485 }
486
487 /*
488 +--------------------------------------------------------------------+
489 | PROJECT : GSM-PS (8410) MODULE : SMS_TLS |
490 | STATE : code ROUTINE : tl_establish_cnf_rtx |
491 +--------------------------------------------------------------------+
492
493 PURPOSE : Process the signal TL_ESTABLISH_CNF
494 in state TL_RTX_ESTABLISH.
495
496 */
497 GLOBAL void tl_establish_cnf_rtx (void)
498 {
499 GET_INSTANCE_DATA;
500
501 TRACE_FUNCTION ("tl_establish_cnf_rtx()");
502
503 {
504 MCAST (cp_data, U_CP_DATA); /* T_U_CP_DATA */
505 BUF_tpdu *tpdu = &cp_data->cp_user_data_ul.rp_data_ul.rp_user_data.tpdu;
506 /*
507 * check whether data req still exists
508 */
509 if (SMS_DATA_REQ(sms_data) EQ NULL)
510 {
511 TRACE_ERROR("Horror: cannot retransmit DATA REQ: buffer gone");
512 return;
513 }
514 /*
515 * Inform ACI that MO transmission attempt is still going on
516 */
517 /* tl_mnsms_send_prog_ind(sms_data); */ /* TCS 4.x and above */
518
519 CCD_START;
520
521 /*
522 * Revert addition of PD and TI
523 */
524 SMS_DATA_REQ(sms_data)->sdu.o_buf += BSIZE_TI_PD;
525 SMS_DATA_REQ(sms_data)->sdu.l_buf -= BSIZE_TI_PD;
526
527 ccd_decodeMsg (CCDENT_SMS,
528 UPLINK,
529 (T_MSGBUF *)&SMS_DATA_REQ(sms_data)->sdu,
530 (UBYTE *)cp_data,
531 NOT_PRESENT_8BIT);
532
533 /*
534 * Set the TP-RD bit in the SMS-SUBMIT.
535 * No usage of CCD here, this would be inefficient.
536 */
537 tpdu->b_tpdu[tpdu->o_tpdu >> 3] |= 0x04;
538 /*
539 * TL state transition: TL_SEND
540 */
541 SMS_INST_SET_STATE (STATE_TL, TL_SEND);
542 /*
543 * RL_DATA_REQ
544 */
545 rl_data_req (SMS_INST.tp_mr, cp_data);
546
547 CCD_END;
548 }
549 }
550
551 /*
552 +--------------------------------------------------------------------+
553 | PROJECT : GSM-PS (8410) MODULE : SMS_TLS |
554 | STATE : code ROUTINE : tl_establish_cnf_cmd |
555 +--------------------------------------------------------------------+
556
557 PURPOSE : Process the signal TL_ESTABLISH_CNF
558 in state TL_CMD_ESTABLISH.
559
560 */
561
562 GLOBAL void tl_establish_cnf_cmd(void)
563 {
564 GET_INSTANCE_DATA;
565 T_SIM_PDU *sim_pdu;
566
567 TRACE_FUNCTION ("tl_establish_cnf_cmd()");
568
569 CCD_START;
570
571 MALLOC (sim_pdu, sizeof(T_SIM_PDU));
572 memset (sim_pdu, 0, sizeof(T_SIM_PDU));
573
574 ccd_decodeMsg (CCDENT_SMS, BOTH,
575 (T_MSGBUF *)SMS_SDU(sms_data),
576 (UBYTE *)sim_pdu, SMS_VT_SIM_PDU);
577
578 if (sim_pdu->tp_mti EQ SMS_COMMAND AND sim_pdu->v_tpdu)
579 {
580 MCAST (cp_data, U_CP_DATA);
581
582 /* ++SMS_INST.tp_mr; */
583 sim_pdu->tpdu.b_tpdu[1] = SMS_INST.tp_mr;
584 SMS_TP_REF_RET(sms_data) = SMS_INST.tp_mr;
585
586 SMS_INST_SET_STATE (STATE_TL, TL_COMMAND);
587
588 SMS_EM_MO_SHORT_MESSAGE_COMMAND;
589
590 cp_data->cp_user_data_ul.v_rp_error = FALSE;
591 cp_data->cp_user_data_ul.v_rp_ack = FALSE;
592 memset (&cp_data->cp_user_data_ul.rp_data_ul, 0,
593 sizeof (T_rp_data_ul));
594
595 memcpy (&cp_data->cp_user_data_ul.rp_data_ul.rp_addr,
596 &sim_pdu->rp_addr, sizeof (T_rp_addr));
597 cp_data->cp_user_data_ul.rp_data_ul.rp_user_data.tp_mti
598 = sim_pdu->tp_mti;
599 memcpy (&cp_data->cp_user_data_ul.rp_data_ul.rp_user_data.tpdu,
600 &sim_pdu->tpdu, sizeof (BUF_tpdu));
601 cp_data->cp_user_data_ul.rp_data_ul.rp_user_data.v_tpdu
602 = TRUE;
603 cp_data->cp_user_data_ul.v_rp_data_ul = TRUE;
604
605
606 /*
607 * RL_DATA_REQ
608 */
609 if (!rl_data_req (SMS_INST.tp_mr, cp_data))
610 {
611 tl_mnsms_command_cnf (NOT_PRESENT_8BIT, SMS_CAUSE_ENTITY_BUSY, NULL);
612 }
613 }
614 else
615 {
616 tl_mnsms_command_cnf (NOT_PRESENT_8BIT, SMS_CAUSE_PARAM_WRONG, NULL);
617 }
618
619 MFREE (sim_pdu);
620 CCD_END;
621 }
622 /*
623 +--------------------------------------------------------------------+
624 | PROJECT : GSM-PS (8410) MODULE : SMS_TLS |
625 | STATE : code ROUTINE : tl_data_ind |
626 +--------------------------------------------------------------------+
627
628 PURPOSE : Process the signal DATA_IND.
629
630 */
631
632 GLOBAL void tl_data_ind (
633 T_rp_data_dl *rp_data_dl)
634 {
635 GET_INSTANCE_DATA;
636 TRACE_FUNCTION ("tl_data_ind()");
637
638 /* Valid tp-user data will not be set to TRUE unless futher decoding is done
639 * so removed check rp_data_dl->rp_addr.v_tpdu
640 */
641 if (rp_data_dl EQ NULL OR !rp_data_dl->rp_addr.v_ton)
642 {
643 /*
644 * RP_ERROR =>
645 */
646 rl_report_req_error (SMS_RP_CS_INV_MAND_INFO, NULL);
647 /*
648 * RL_RELEASE_REQ ==>
649 */
650 rl_release_req(SMS_INST.ti);
651 return;
652 }
653 switch (rp_data_dl->rp_user_data.tp_mti)
654 {
655 case SMS_DELIVER:
656 {
657 MCAST (sms_deliver, TP_DELIVER);
658
659 TRACE_EVENT ("SMS DELIVER");
660
661 if (SMS_RP_RCVD(sms_data) EQ NULL)
662 {
663 MALLOC (SMS_RP_RCVD(sms_data), sizeof(T_rp_data_dl));
664 }
665 memcpy (SMS_RP_RCVD(sms_data), rp_data_dl,
666 sizeof(T_rp_data_dl));
667
668 /*
669 *If Valid TP user Data is missing in RP Message, send RP ERROR
670 * This is done by checking v_tp_ud field
671 */
672 if ( ccd_decodeMsg (CCDENT_SMS,
673 DOWNLINK,
674 (T_MSGBUF *)&SMS_RP_RCVD(sms_data)->rp_user_data.tpdu,
675 (UBYTE *)sms_deliver,
676 SMS_VT_DELIVER) EQ ccdError )
677 {
678 /*
679 * RP_ERROR =>
680 */
681 rl_report_req_error (SMS_RP_CS_INV_MAND_INFO, NULL);
682 /*
683 * RL_RELEASE_REQ ==>
684 */
685 rl_release_req(SMS_INST.ti);
686 break;
687 }
688
689 SMS_INST_SET_STATE (STATE_TL, TL_RECEIVE);
690
691 SMS_DCS(sms_data) = sms_deliver->tp_dcs;
692 SMS_PID(sms_data) = sms_deliver->tp_pid;
693 #ifdef FF_SMS_23430
694 if (tl_handle_23430 (sms_deliver))
695 return;
696 #endif
697 switch (sms_deliver->tp_pid)
698 {
699 case SMS_PID_SM_TYPE_0:
700 /*
701 * "A short message type 0 indicates that the ME must acknowledge
702 * receipt of the short message but shall discard its contents."
703 * [3GPP 23.040 subclause 9.2.3.9]
704 */
705 rl_report_req_ack (NULL);
706 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
707
708 MFREE (SMS_RP_RCVD(sms_data));
709 SMS_RP_RCVD(sms_data) = NULL;
710 break;
711
712 case SMS_PID_REP_SM_TYPE_1:
713 case SMS_PID_REP_SM_TYPE_2:
714 case SMS_PID_REP_SM_TYPE_3:
715 case SMS_PID_REP_SM_TYPE_4:
716 case SMS_PID_REP_SM_TYPE_5:
717 case SMS_PID_REP_SM_TYPE_6:
718 case SMS_PID_REP_SM_TYPE_7:
719 case SMS_PID_RET_CALL_MSG:
720 /*
721 * replace short messages
722 */
723 tl_replace_message (sms_deliver);
724 break;
725 case SMS_PID_SIM_DOWNLOAD:
726 /*
727 * SIM data download
728 */
729 #ifdef SIM_TOOLKIT
730 if (sms_data->download_sms AND
731 tl_check_class_2 (sms_deliver->tp_dcs))
732 {
733 tl_build_envelope_sms_download (SMS_RP_RCVD(sms_data));
734 }
735 else
736 #endif
737 tl_handle_message (sms_deliver);
738 break;
739
740 #ifdef REL99
741 /* Currently EGPRS over TIA/EIA-136 is not supported and hence it
742 * is treated as below. If TIA/EIA-136 is supported, the message
743 * should be passed to ME for routing to the application handling
744 * ANSI-136 data
745 */
746 case SMS_PID_ANSI_136_R_DATA:
747 if( tl_check_class_2 (sms_deliver->tp_dcs) )
748 {
749 #ifdef SIM_TOOLKIT
750 /* Download it to SIM only if both SAT is supported and data download
751 * service is enabled
752 */
753 if (sms_data->download_sms)
754 {
755 tl_build_envelope_sms_download (SMS_RP_RCVD(sms_data));
756 }
757 else
758 {
759 /* 11.14 8.d.0 Sec 7.1.1 mentions about storing the message when
760 * If the service "data download via SMS-PP" is not allocated
761 * and activated only for protocol identifier = SIM data download.
762 * Hence discard the message and send NACK indicating inability
763 * to handle the message*/
764 T_rp_user_data *rp_ud;
765 MALLOC (rp_ud, sizeof(T_rp_user_data));
766 rp_ud->tpdu.o_tpdu = 0;
767 rp_ud->tp_mti = rp_ud->tpdu.b_tpdu[0] = SMS_DELIVER_REPORT;
768 rp_ud->tpdu.b_tpdu[1] = SMS_FCS_TP_PID_UNSPEC; /* TP-FCS */
769 rp_ud->tpdu.b_tpdu[2] = 0; /* TP-PI */
770 rp_ud->tpdu.l_tpdu = 24; /* 3 bytes */
771 rp_ud->v_tpdu = TRUE;
772 rl_report_req_error (SMS_RP_CS_PROTOCOL_ERROR, rp_ud);
773 /*
774 * RL_RELEASE_REQ ==>
775 */
776 rl_release_req( SMS_INST.ti);
777 MFREE (rp_ud);
778
779 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
780 MFREE (SMS_RP_RCVD(sms_data));
781 SMS_RP_RCVD(sms_data) = NULL;
782 }
783 #else
784 /*
785 * Discard the message and send NACK
786 */
787 T_rp_user_data *rp_ud;
788 MALLOC (rp_ud, sizeof(T_rp_user_data));
789 rp_ud->tpdu.o_tpdu = 0;
790 rp_ud->tp_mti = rp_ud->tpdu.b_tpdu[0] = SMS_DELIVER_REPORT;
791 rp_ud->tpdu.b_tpdu[1] = SMS_FCS_TP_PID_UNSPEC; /* TP-FCS */
792 rp_ud->tpdu.b_tpdu[2] = 0; /* TP-PI */
793 rp_ud->tpdu.l_tpdu = 24; /* 3 bytes */
794 rp_ud->v_tpdu = TRUE;
795 rl_report_req_error (SMS_RP_CS_PROTOCOL_ERROR, rp_ud);
796 /*
797 * RL_RELEASE_REQ ==>
798 */
799 rl_release_req(SMS_INST.ti);
800 MFREE (rp_ud);
801
802 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
803 MFREE (SMS_RP_RCVD(sms_data));
804 SMS_RP_RCVD(sms_data) = NULL;
805 #endif
806 }
807 else
808 {
809 tl_handle_message (sms_deliver);
810 }
811 break;
812 #endif /* REL99 */
813
814 case SMS_PID_ME_DEPERSON:
815 /*
816 * ME de-personalization short message
817 */
818 #ifdef SIM_PERS_OTA
819 {
820 PALLOC (mnsms_OTA_message_ind, MNSMS_OTA_MESSAGE_IND);
821 memcpy (&mnsms_OTA_message_ind->tp_ud, &sms_deliver->tp_ud, sizeof(T_tp_ud));
822 mnsms_OTA_message_ind->tp_dcs = sms_deliver->tp_dcs ;
823 mnsms_OTA_message_ind->tp_pid = sms_deliver->tp_pid;
824 #ifdef TI_PS_HCOMM_CHANGE
825 PSEND (_hCommMMI, mnsms_OTA_message_ind);
826 #else
827 PSEND (hCommMMI, mnsms_OTA_message_ind);
828 #endif
829 break;
830 }
831 #else
832 break;
833 #endif
834 case SMS_PID_ME_DOWNLOAD:
835 /*
836 * ME download short message
837 */
838 default:
839 tl_handle_message (sms_deliver);
840 break;
841 }
842 break;
843 }
844
845 case SMS_STATUS_REPORT:
846 TRACE_EVENT ("SMS STATUS REPORT");
847
848 if (sms_data->ds EQ DS1)
849 {
850 /*
851 * only if requested by MMI
852 */
853 PALLOC (status_ind, MNSMS_STATUS_IND);
854
855 SMS_EM_SMS_STATUS_MESSAGE;
856
857 tl_build_status_rep (rp_data_dl, status_ind);
858 PSENDX (MMI, status_ind);
859
860 if (SMS_MT_ACK_MODE(sms_data) EQ SMS_MHC_PH2PLUS)
861 {
862 SMS_INST_SET_STATE (STATE_TL, TL_RECEIVE);
863 break;
864 }
865 }
866 rl_report_req_ack (NULL);
867 break;
868
869 default:
870 /*
871 * RP_ERROR =>
872 */
873 rl_report_req_error (SMS_RP_CS_SEM_INC_MSG, NULL);
874 /*
875 * RL_RELEASE_REQ ==>
876 */
877 rl_release_req(SMS_INST.ti);
878 break;
879 }
880 }
881
882 /*
883 +--------------------------------------------------------------------+
884 | PROJECT : GSM-PS (8410) MODULE : SMS_TLS |
885 | STATE : code ROUTINE : tl_timeout_ind |
886 +--------------------------------------------------------------------+
887
888 PURPOSE : Process the signal TL_TIMEOUT_IND.
889
890 */
891 GLOBAL void tl_timeout_ind ( USHORT timer_id)
892 {
893 GET_INSTANCE_DATA;
894
895 TRACE_FUNCTION ("tl_timeout_ind()");
896
897 switch (SMS_INST_GET_STATE (STATE_TL))
898 {
899 /* -------------------------------------- */
900 case TL_ESTABLISH:
901 /* -------------------------------------- */
902
903 switch (GET_STATE(STATE_EST))
904 {
905 case EST_SEND:
906 /*
907 * Connection establishment for the SUBMIT has failed
908 */
909 TRACE_EVENT("Connection establishment for SUBMIT request failed");
910
911 TRACE_EVENT_P1 ("TL retrans #%d", SMS_INST.tl_retx);
912
913 if (SMS_INST.tl_retx < TL_MAX_RETANS)
914 {
915 /*
916 * Maximum number of TL retransmissions not exceeded.
917 * Retry establishment.
918 */
919 SMS_INST.tl_retx++;
920 /*
921 * establish connection
922 */
923 #ifdef REL99
924 tl_mnsms_send_prog_ind();
925 #endif /* REL99 */
926 tl_establish_connection(FALSE);
927 }
928 else
929 {
930 /*
931 * clean up instance
932 */
933 if (SMS_SDU(sms_data) NEQ NULL)
934 {
935 MFREE (SMS_SDU(sms_data));
936 SMS_SDU(sms_data) = NULL;
937 }
938 SMS_SEL_REC(sms_data) = SMS_RECORD_NOT_EXIST;
939 /*
940 * TL state transition TL_IDLE
941 */
942 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
943 /*
944 * SUBMIT_CNF
945 */
946 tl_mnsms_submit_cnf (SMS_SEL_MEM(sms_data),
947 SMS_RECORD_NOT_EXIST,
948 SMS_TP_REF_RET(sms_data),
949 SMS_CAUSE_NET_TIMEOUT,
950 SMS_SDU(sms_data));
951 /*
952 * End the cmms session
953 */
954 if(CMMS_ACTIVE)
955 {
956 tl_cmms_end();
957 }
958
959 }
960 break;
961
962 case EST_CMD:
963 /*
964 * Connection establishment for the COMMAND has failed
965 */
966 TRACE_EVENT("Connection establishment for COMMAND request failed");
967
968 TRACE_EVENT_P1 ("TL retrans #%d", SMS_INST.tl_retx);
969
970 if (SMS_INST.tl_retx < TL_MAX_RETANS)
971 {
972 /*
973 * Maximum number of TL retransmissions not exceeded.
974 * Retry establishment.
975 */
976 SMS_INST.tl_retx++;
977 /*
978 * establish connection
979 */
980 #ifdef REL99
981 tl_mnsms_send_prog_ind();
982 #endif
983 tl_establish_connection(FALSE);
984 }
985 else
986 {
987 /*
988 * clean up instance
989 */
990 if (SMS_SDU(sms_data) NEQ NULL)
991 {
992 MFREE (SMS_SDU(sms_data));
993 SMS_SDU(sms_data) = NULL;
994 }
995 SMS_SEL_REC(sms_data) = SMS_RECORD_NOT_EXIST;
996 /*
997 * TL state transition
998 */
999 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
1000 /*
1001 * COMMAND_CNF
1002 */
1003 tl_mnsms_command_cnf (SMS_TP_REF_RET(sms_data),
1004 SMS_CAUSE_NET_TIMEOUT,
1005 SMS_SDU(sms_data));
1006 }
1007 break;
1008
1009 case EST_RTX:
1010 TRACE_EVENT("timeout establishment for retransmission ignored");
1011 break;
1012
1013 case EST_SMMA:
1014 /*
1015 * Connection establishment for the SMMA has failed
1016 */
1017 TRACE_EVENT("Connection establishment for SMMA request failed");
1018
1019 TRACE_EVENT_P1 ("TL retrans #%d", SMS_INST.tl_retx);
1020
1021 if (SMS_INST.tl_retx < TL_MAX_RETANS)
1022 {
1023 /*
1024 * Maximum number of TL retransmissions not exceeded.
1025 * Retry establishment.
1026 */
1027 SMS_INST.tl_retx++;
1028 /*
1029 * try again
1030 */
1031 SMS_INST.retrans = TRUE;
1032 /*
1033 * establish connection
1034 */
1035
1036 tl_establish_connection(FALSE);
1037
1038 }
1039 else
1040 {
1041 /*
1042 * TL state transition TL_OTHER
1043 */
1044 SMS_INST_SET_STATE (STATE_TL, TL_OTHER);
1045 /*
1046 * handle event in report ind
1047 */
1048 tl_report_ind(NULL,SMS_CAUSE_NET_TIMEOUT);
1049 }
1050 break;
1051 }
1052 break;
1053
1054 /* -------------------------------------- */
1055 case TL_SEND:
1056 /* -------------------------------------- */
1057 /*
1058 * sending of the SUBMIT has failed
1059 */
1060 TRACE_EVENT("Transmission for SUBMIT request failed");
1061
1062 TRACE_EVENT_P1 ("TL retrans #%d", SMS_INST.tl_retx);
1063
1064 if (SMS_INST.tl_retx < TL_MAX_RETANS)
1065 {
1066 /*
1067 * Maximum number of TL retransmissions not exceeded.
1068 * Retry establishment.
1069 */
1070 SMS_INST.tl_retx++;
1071 #ifdef REL99
1072 tl_mnsms_send_prog_ind();
1073 #endif /* REl99 */
1074
1075 /*
1076 * TL state transition TL_ESTABLISH
1077 * EST state transition EST_RTX
1078 */
1079 SMS_INST_SET_STATE (STATE_TL, TL_ESTABLISH);
1080 SET_STATE(STATE_EST,EST_RTX);
1081 /*
1082 * establish connection
1083 */
1084 tl_establish_connection(FALSE);
1085 }
1086 else
1087 {
1088 /*
1089 * clean up instance
1090 */
1091 if (SMS_SDU(sms_data) NEQ NULL)
1092 {
1093 MFREE (SMS_SDU(sms_data));
1094 SMS_SDU(sms_data) = NULL;
1095 }
1096 SMS_SEL_REC(sms_data) = SMS_RECORD_NOT_EXIST;
1097 /*
1098 * TL state transition TL_IDLE
1099 */
1100 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
1101 /*
1102 * SUBMIT_CNF
1103 */
1104 tl_mnsms_submit_cnf (SMS_SEL_MEM(sms_data),
1105 SMS_RECORD_NOT_EXIST,
1106 SMS_TP_REF_RET(sms_data),
1107 SMS_CAUSE_NET_TIMEOUT,
1108 SMS_SDU(sms_data));
1109 /*
1110 * End the cmms session
1111 */
1112 if(CMMS_ACTIVE)
1113 {
1114 tl_cmms_end();
1115 }
1116 }
1117 break;
1118
1119 /* -------------------------------------- */
1120 case TL_COMMAND:
1121 /* -------------------------------------- */
1122 /*
1123 * sending of the COMMAND has failed
1124 */
1125 TRACE_EVENT("Transmission for COMMAND request failed");
1126
1127 TRACE_EVENT_P1 ("TL retrans #%d", SMS_INST.tl_retx);
1128
1129 if (SMS_INST.tl_retx < TL_MAX_RETANS)
1130 {
1131 /*
1132 * Maximum number of TL retransmissions not exceeded.
1133 * Retry establishment.
1134 */
1135 SMS_INST.tl_retx++;
1136 #ifdef REL99
1137 tl_mnsms_send_prog_ind();
1138 #endif /* REl99 */
1139 /*
1140 * TL state transition TL_ESTABLISH
1141 * EST state transition EST_CMD
1142 */
1143 SMS_INST_SET_STATE (STATE_TL, TL_ESTABLISH);
1144 SET_STATE(STATE_EST,EST_CMD);
1145 /*
1146 * establish connection
1147 */
1148 tl_establish_connection(FALSE);
1149 }
1150 else
1151 {
1152 /*
1153 * clean up instance
1154 */
1155 if (SMS_SDU(sms_data) NEQ NULL)
1156 {
1157 MFREE (SMS_SDU(sms_data));
1158 SMS_SDU(sms_data) = NULL;
1159 }
1160 SMS_SEL_REC(sms_data) = SMS_RECORD_NOT_EXIST;
1161 /*
1162 * TL state transition TL_IDLE
1163 */
1164 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
1165 /*
1166 * COMMAND_CNF
1167 */
1168 tl_mnsms_command_cnf (SMS_TP_REF_RET(sms_data),
1169 SMS_CAUSE_NET_TIMEOUT,
1170 SMS_SDU(sms_data));
1171 }
1172 break;
1173
1174 /* -------------------------------------- */
1175 default:
1176 /* -------------------------------------- */
1177
1178 // TRACE_EVENT("TL_TIMEOUT_IND ignored");
1179 if (timer_id EQ TRAM)
1180 {
1181 /*
1182 * sending of the SMMA has failed
1183 */
1184 TRACE_EVENT("Transmission for SMMA failed");
1185 /*
1186 * ??? !!! ???
1187 */
1188 --SMS_RP_REF(sms_data);
1189 /*
1190 * TL state transition TL_ESTABLISH
1191 * EST state transition EST_SMMA
1192 */
1193 SMS_INST_SET_STATE (STATE_TL, TL_ESTABLISH);
1194 SET_STATE(STATE_EST,EST_SMMA);
1195 /*
1196 * try again
1197 */
1198 SMS_INST.retrans = TRUE;
1199 /*
1200 * establish connection
1201 */
1202 tl_establish_connection(FALSE);
1203 }
1204 else
1205 {
1206 tl_report_ind(NULL,SMS_CAUSE_NET_TIMEOUT);
1207 }
1208 break;
1209 }
1210 }
1211 /*
1212 +--------------------------------------------------------------------+
1213 | PROJECT : GSM-PS (8410) MODULE : SMS_TLS |
1214 | STATE : code ROUTINE : tl_report_ind |
1215 +--------------------------------------------------------------------+
1216
1217 PURPOSE : Process the signal TL_REPORT_IND.
1218
1219 */
1220
1221 LOCAL UBYTE tl_check_condx_send (T_BACKUP *prop,
1222 UBYTE mem_type,
1223 UBYTE condx,
1224 UBYTE rec_num)
1225 {
1226 if (condx EQ SMS_CONDX_OVR_NON)
1227 {
1228 if ((rec_num = tl_get_free_space (mem_type)) NEQ 0)
1229 return rec_num;
1230 else
1231 return SMS_RECORD_NOT_EXIST;
1232 }
1233 else if (condx EQ SMS_CONDX_OVR_MO)
1234 {
1235 switch (tl_get_status (prop, rec_num - 1))
1236 {
1237 case SMS_RECORD_REC_UNREAD:
1238 case SMS_RECORD_REC_READ:
1239 if ((rec_num = tl_get_free_space (mem_type)) NEQ 0)
1240 return rec_num;
1241 return SMS_RECORD_NOT_EXIST;
1242
1243 default:
1244 break;
1245 }
1246 }
1247 return rec_num;
1248 }
1249
1250 GLOBAL void tl_report_ind (T_rp_user_data *rp_user_data,
1251 USHORT cause)
1252 {
1253 GET_INSTANCE_DATA;
1254 T_SIM_PDU *sim_pdu;
1255 UBYTE rec_num, next_rec_num = 0;
1256
1257 TRACE_FUNCTION ("tl_report_ind()");
1258
1259 #ifdef REL99
1260 if (cause NEQ SMS_NO_ERROR)
1261 {
1262 SMS_INST.failed_msg_rec_num = SMS_SEL_REC(sms_data);
1263 SMS_INST.failed_msg_mem = SMS_SEL_MEM(sms_data);
1264 }
1265 #endif
1266
1267 if (sms_data)
1268 {
1269 if (SMS_SDU(sms_data) NEQ NULL)
1270 {
1271 MFREE (SMS_SDU(sms_data));
1272 SMS_SDU(sms_data) = NULL;
1273 }
1274
1275 /*
1276 * An SMS DELIVER REPORT TPDU is carried as a RP User Data element within
1277 * an RP ERROR PDU and is part of the negative acknowledgement to an SMS
1278 * DELIVER or SMS STATUS REPORT.
1279 *
1280 * An SMS DELIVER REPORT TPDU is also carried as a RP User Data element
1281 * within an RP ACK PDU and is part of a positive acknowledgement to a
1282 * SMS DELIVER or SMS STATUS REPORT.
1283 * [3gpp 23.040 clause 9.2.2.1a]
1284 *
1285 * The cause value (invalid / non-invalid) is used to distinguish whether
1286 * the RP user data (SMS DELIVER REPORT) came with RP-ACK / RP-ERROR.
1287 */
1288
1289 if (IS_CAUSE_INVALID(cause) AND
1290 (rp_user_data NEQ NULL AND rp_user_data->v_tpdu))
1291 {
1292 MALLOC (sim_pdu, sizeof(T_SIM_PDU));
1293 MALLOC (SMS_SDU(sms_data), sizeof(T_sms_sdu));
1294
1295 memset (&sim_pdu->rp_addr, 0, sizeof(T_rp_addr));
1296 sim_pdu->tp_mti = rp_user_data->tp_mti;
1297 sim_pdu->tpdu = rp_user_data->tpdu;
1298 sim_pdu->v_tpdu = TRUE;
1299 sim_pdu->tp_vt_mti = SMS_VT_SIM_PDU;
1300
1301 SMS_SDU(sms_data)->o_buf = 0;
1302 SMS_SDU(sms_data)->l_buf = SIM_PDU_LEN<<3;
1303 if (ccd_codeMsg (CCDENT_SMS, BOTH,
1304 (T_MSGBUF *)SMS_SDU(sms_data),
1305 (UBYTE *)sim_pdu, SMS_VT_SIM_PDU) NEQ ccdOK)
1306 {
1307 MFREE (SMS_SDU(sms_data));
1308 SMS_SDU(sms_data) = NULL;
1309 }
1310 MFREE (sim_pdu);
1311 }
1312 switch (SMS_INST_GET_STATE (STATE_TL))
1313 {
1314 /* -------------------------------------- */
1315 case TL_ESTABLISH:
1316 /* -------------------------------------- */
1317
1318 switch (GET_STATE(STATE_EST))
1319 {
1320 case EST_SEND:
1321 case EST_RTX:
1322 /*
1323 * TL state transition TL_SEND
1324 */
1325 SMS_INST_SET_STATE (STATE_TL, TL_SEND);
1326 break;
1327 case EST_CMD:
1328 /*
1329 * TL state transition TL_COMMAND
1330 */
1331 SMS_INST_SET_STATE (STATE_TL, TL_COMMAND);
1332 break;
1333 case EST_SMMA:
1334 if (SMS_INST.retrans)
1335 {
1336 SMS_INST.retrans = FALSE;
1337 /*
1338 * TL state transition TL_OTHER
1339 */
1340 SMS_INST_SET_STATE (STATE_TL, TL_OTHER);
1341 }
1342 else
1343 {
1344 /*
1345 * RL_START_TRAM_REQ
1346 */
1347 rl_start_tram_req();
1348 return;
1349 }
1350 break;
1351 default:
1352 TRACE_ERROR("Invalid EST state!");
1353 /*
1354 * TL state transition TL_IDLE
1355 */
1356 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
1357 break;
1358 }
1359 /*
1360 * TL_REPORT_IND recursive
1361 */
1362 tl_report_ind(rp_user_data,cause);
1363 return;
1364
1365 /* -------------------------------------- */
1366 case TL_SEND:
1367 /* -------------------------------------- */
1368
1369 if (!IS_CAUSE_INVALID(cause) AND
1370 (rp_user_data NEQ NULL) AND (SMS_INST.tl_retx > 0))
1371 {
1372 /*
1373 * Retransmission case as of 23.040 subclause 9.2.3.6
1374 * and RP ERROR with RP USER DATA received. Check whether
1375 * the RP USER DATA contains a SMS SUBMIT REPORT with TP-FCS set to
1376 * "SM Rejected - Duplicate SM".
1377 * If so the transmission has been a success and not a failure.
1378 */
1379 MCAST (tp_sbmt_rep_err, TP_SBMT_REP_ERR); /* T_TP_SBMT_REP_ERR */
1380 BUF_tpdu *tpdu = &rp_user_data->tpdu;
1381 BYTE ccd_result;
1382
1383 switch (tpdu->b_tpdu[tpdu->o_tpdu >> 3] & 0x3)
1384 {
1385 case SMS_SUBMIT_REPORT:
1386 /* Copy tpdu from rp_user_data, it's part of decoded msg buffer */
1387 MALLOC (tpdu, sizeof(BUF_tpdu));
1388 memcpy (tpdu, &rp_user_data->tpdu, sizeof (BUF_tpdu));
1389
1390 CCD_START;
1391 ccd_result = ccd_decodeMsg (CCDENT_SMS, DOWNLINK,
1392 (T_MSGBUF *)tpdu,
1393 (UBYTE *)tp_sbmt_rep_err,
1394 SMS_VT_SBMT_REP_ERR);
1395 if (ccd_result NEQ ccdOK)
1396 {
1397 /* Could error handling be elaborated here? */
1398 TRACE_ERROR ("ccd decoding problem");
1399 }
1400
1401 if (tp_sbmt_rep_err->tp_fcs EQ SMS_FCS_REJ_DUPL_SM)
1402 {
1403 TRACE_EVENT ("SC had SMS");
1404 cause = SMS_NO_ERROR; /* Enter "no error" handling below */
1405 /* Since the transmission was successful, the data stored for
1406 retransmission can be freed */
1407 if (SMS_DATA_REQ(sms_data) NEQ NULL)
1408 {
1409 PFREE (SMS_DATA_REQ(sms_data));
1410 SMS_DATA_REQ(sms_data) = NULL;
1411 }
1412 }
1413 CCD_END;
1414
1415 MFREE (tpdu);
1416 break;
1417
1418 default:
1419 break; /* Do nothing, it is an error */
1420 }
1421 }
1422
1423 if (IS_CAUSE_INVALID(cause) AND SMS_SEL_REC(sms_data) > 0)
1424 {
1425 if (SMS_SEL_MEM(sms_data) EQ MEM_SM AND
1426 SMS_SEL_REC(sms_data) <= SMS_SIM_PROP(sms_data).max_record)
1427 {
1428 if ((rec_num = tl_check_condx_send (&SMS_SIM_PROP(sms_data),
1429 MEM_SM,
1430 SMS_CONDX(sms_data),
1431 SMS_SEL_REC(sms_data)))
1432 NEQ SMS_RECORD_NOT_EXIST)
1433 SMS_SEL_REC(sms_data) = rec_num;
1434 else
1435 {
1436 #ifdef REL99
1437 if(SMS_INST.failed_msg_retx EQ FALSE)
1438 {
1439 #endif
1440 tl_mnsms_submit_cnf (MEM_SM, SMS_RECORD_NOT_EXIST,
1441 SMS_TP_REF_RET(sms_data),
1442 SMS_CAUSE_MEM_FULL, SMS_SDU(sms_data));
1443 #ifdef REL99
1444 }
1445 else
1446 {
1447 tl_mnsms_retrans_cnf (MEM_SM, SMS_RECORD_NOT_EXIST,
1448 SMS_TP_REF_RET(sms_data),
1449 SMS_CAUSE_MEM_FULL, SMS_SDU(sms_data));
1450 }
1451 #endif
1452
1453 break;
1454 }
1455 {
1456 UBYTE sim_acc_ix;
1457 T_SMS_SIM_ACCESS_INFO *sms_sim_access_info_ptr;
1458 if (tl_sms_reserve_req_id(&sim_acc_ix))
1459 {
1460 PALLOC (update_req, SIM_UPDATE_RECORD_REQ);
1461 sms_sim_access_info_ptr = &sms_data->sms_sim_access_info[sim_acc_ix];
1462 update_req->source = SRC_SMS;
1463 update_req->req_id = sim_acc_ix;
1464 update_req->v_path_info = FALSE;
1465 update_req->datafield = sms_sim_access_info_ptr->datafield
1466 = SIM_SMS;
1467 update_req->record = sms_sim_access_info_ptr->rec_num
1468 = SMS_SEL_REC(sms_data);
1469 update_req->length = SIM_LENGTH_SMS_RECORD;
1470
1471 tl_convert_mo_to_mem (SMS_DATA_REQ(sms_data),
1472 update_req->linear_data);
1473
1474 PSENDX (SIM, update_req);
1475 }
1476 }
1477 tl_store_status (&SMS_SIM_PROP(sms_data), rec_num-1, SIM_SMS_PENDING);
1478 tl_set_access_fifo (ACCESS_BY_MMI);
1479 SET_STATE (STATE_MMI, MMI_REPLACE);
1480 /*
1481 * concat control
1482 */
1483 if (sms_data->concat_cntrl.concatenation NEQ TRUE)
1484 {
1485 /*
1486 * RL_RELEASE_REQ ==>
1487 */
1488 rl_release_req(SMS_INST.ti);
1489 }
1490 return;
1491 }
1492 if (SMS_SEL_MEM(sms_data) EQ MEM_ME AND
1493 SMS_SEL_REC(sms_data) <= SMS_ME_PROP(sms_data).max_record)
1494 {
1495 UBYTE data[SIZE_EF_SMS];
1496
1497 if ((rec_num = tl_check_condx_send (&SMS_ME_PROP(sms_data),
1498 MEM_ME,
1499 SMS_CONDX(sms_data),
1500 SMS_SEL_REC(sms_data)))
1501 NEQ SMS_RECORD_NOT_EXIST)
1502 SMS_SEL_REC(sms_data) = rec_num;
1503 else
1504 {
1505 #ifdef REL99
1506 if(SMS_INST.failed_msg_retx EQ FALSE)
1507 {
1508 #endif
1509 tl_mnsms_submit_cnf (MEM_ME, SMS_RECORD_NOT_EXIST,
1510 SMS_TP_REF_RET(sms_data),
1511 SMS_CAUSE_MEM_FULL, SMS_SDU(sms_data));
1512 #ifdef REL99
1513 }
1514 else
1515 {
1516 tl_mnsms_retrans_cnf (MEM_ME, SMS_RECORD_NOT_EXIST,
1517 SMS_TP_REF_RET(sms_data),
1518 SMS_CAUSE_MEM_FULL, SMS_SDU(sms_data));
1519 }
1520 #endif
1521 break;
1522 }
1523 tl_convert_mo_to_mem (SMS_DATA_REQ(sms_data), data);
1524 /* Implements Measure#32: Row 113 */
1525 if (pcm_WriteRecord ((UBYTE *)ef_sms_id, SMS_SEL_REC(sms_data),
1526 SIZE_EF_SMS, data) NEQ DRV_OK)
1527 {
1528 cause = SMS_CAUSE_MEM_FAIL;
1529 }
1530 }
1531 }
1532 /*
1533 * MNSMS_SUBMIT_CNF =>
1534 */
1535 #ifdef REL99
1536 if(SMS_INST.failed_msg_retx EQ FALSE)
1537 {
1538 #endif
1539 tl_mnsms_submit_cnf (SMS_SEL_MEM(sms_data), SMS_RECORD_NOT_EXIST,
1540 SMS_TP_REF_RET(sms_data), cause, SMS_SDU(sms_data));
1541 #ifdef REL99
1542 }
1543 else
1544 {
1545 tl_mnsms_retrans_cnf (SMS_SEL_MEM(sms_data), SMS_RECORD_NOT_EXIST,
1546 SMS_TP_REF_RET(sms_data), cause, SMS_SDU(sms_data));
1547 }
1548 #endif
1549 /*
1550 * concat control
1551 */
1552 if ((sms_data->concat_cntrl.concatenation EQ TRUE) AND !CMMS_ACTIVE)
1553 {
1554 if (cause EQ SMS_NO_ERROR)
1555 {
1556 /*
1557 * start timer TLCT for next submit req supervision
1558 */
1559 sms_timer_start(TLCT);
1560 /*
1561 * TL State Transition TL_SEND_CONTD
1562 */
1563 SMS_INST_SET_STATE (STATE_TL, TL_SEND_CONTD);
1564 /*
1565 * do not release connection now
1566 */
1567 sms_data->concat_cntrl.release_pending = TRUE;
1568 return;
1569 }
1570 else
1571 {
1572 /*
1573 * error case: end concatenation series
1574 */
1575 sms_data->concat_cntrl.concatenation = FALSE;
1576 }
1577 }
1578 else
1579 {
1580 /*
1581 * cmms control
1582 */
1583 if(CMMS_ACTIVE AND (sms_data->cmms_release_pending EQ TRUE))
1584 {
1585 tl_cmms_start();
1586 SMS_INST_SET_STATE (STATE_TL, TL_SEND_CONTD);
1587
1588 if (sms_data->concat_cntrl.concatenation EQ TRUE)
1589 {
1590 if (cause EQ SMS_NO_ERROR)
1591 {
1592 sms_data->concat_cntrl.release_pending = TRUE;
1593 }
1594 else
1595 {
1596 /*
1597 * error case: end concatenation series
1598 */
1599 sms_data->concat_cntrl.concatenation = FALSE;
1600 }
1601 }
1602 return;
1603 }
1604 else
1605 if(CMMS_ACTIVE)
1606 {
1607 tl_cmms_end();
1608 }
1609 }
1610 break;
1611
1612 /* -------------------------------------- */
1613 case TL_COMMAND:
1614 /* -------------------------------------- */
1615
1616 #ifdef REL99
1617 if(SMS_INST.failed_msg_retx EQ FALSE)
1618 {
1619 #endif
1620
1621 tl_mnsms_command_cnf (SMS_TP_REF_RET(sms_data), cause, SMS_SDU(sms_data));
1622 #ifdef REL99
1623 }
1624 else
1625 {
1626 tl_mnsms_retrans_cnf (NOT_PRESENT_8BIT, SMS_RECORD_NOT_EXIST,
1627 SMS_TP_REF_RET(sms_data), cause, SMS_SDU(sms_data));
1628 }
1629 #endif
1630
1631 break;
1632
1633 /* -------------------------------------- */
1634 case TL_RECEIVE:
1635 /* -------------------------------------- */
1636
1637 if (!IS_CAUSE_INVALID(cause))
1638 {
1639 switch (GET_STATE (STATE_NET))
1640 {
1641 case NET_WRITE:
1642 case NET_READ:
1643 break;
1644 default:
1645 if (SMS_MT_ACK_MODE(sms_data) EQ SMS_MHC_PH2PLUS)
1646 tl_mnsms_error_ind ((USHORT)((GET_CAUSE_DEFBY(cause) EQ DEFBY_CONDAT)?
1647 cause: SMS_CAUSE_NET_TIMEOUT));
1648 break;
1649 }
1650 SET_STATE (STATE_NET, NET_IDLE);
1651 }
1652
1653 /* -------------------------------------- */
1654 case TL_OTHER:
1655 /* -------------------------------------- */
1656
1657 if (GET_STATE (STATE_MMI) EQ MMI_DELETE)
1658 {
1659 if (!tl_sms_memo_exceeded (TRUE))
1660 {
1661 if(SMS_REC_STATUS(sms_data) NEQ CMGD_DEL_INDEX)
1662 {
1663 if(SMS_SEL_MEM(sms_data) EQ MEM_SM)
1664 {
1665 /* Status value is given. Find the next record satisfying this status value */
1666 next_rec_num = tl_search_record_for_delete (&SMS_SIM_PROP(sms_data),
1667 SMS_SEL_REC(sms_data),
1668 SMS_REC_STATUS(sms_data));
1669 }
1670 else if(SMS_SEL_MEM(sms_data) EQ MEM_ME)
1671 {
1672 /* Status value is given. Find the next record satisfying this status value */
1673 next_rec_num = tl_search_record_for_delete (&SMS_ME_PROP(sms_data),
1674 SMS_SEL_REC(sms_data),
1675 SMS_REC_STATUS(sms_data));
1676 }
1677 }
1678 tl_mnsms_delete_cnf (SMS_SEL_MEM(sms_data), SMS_SEL_REC(sms_data), next_rec_num,
1679 SIM_NO_ERROR);
1680 SET_STATE (STATE_MMI, MMI_IDLE);
1681 #ifdef SIM_TOOLKIT
1682 if (sms_data->file_update_ind NEQ NULL)
1683 {
1684 T_SIM_FILE_UPDATE_IND *file_update_ind = sms_data->file_update_ind;
1685 sms_data->file_update_ind = NULL;
1686 tl_sim_file_update_ind (file_update_ind);
1687 }
1688 #endif
1689 break;
1690 }
1691 else
1692 {
1693 /*
1694 * RL_RELEASE_REQ ==>
1695 */
1696 rl_release_req(SMS_INST.ti);
1697 return;
1698 }
1699 }
1700 else if (GET_STATE (STATE_MMI) EQ MMI_RESUME)
1701 {
1702 /*
1703 * <<acknowledgment>> of SMMA message for
1704 * user initiated RESUME
1705 * we expect here that the given tl_report_ind signal
1706 * is generated in the following cases:
1707 * - success (positive ack for smma)
1708 * - error (negative ack for smma)
1709 * - repeated timeout (waiting for ack exceeded limit)
1710 */
1711 /*
1712 * Unset memory full condition in any case
1713 */
1714 sms_data->pr_cntrl.delivery_state = SMS_DELIVER_STATUS_RESUME;
1715 /*
1716 * save cause
1717 */
1718 if (IS_CAUSE_INVALID(cause))
1719 {
1720 sms_data->pr_cntrl.save_cause = SMS_NO_ERROR;
1721 }
1722 else
1723 {
1724 sms_data->pr_cntrl.save_cause = cause;
1725 }
1726 /*
1727 * Unset notification flag on sim
1728 */
1729 tl_sms_memo_resume();
1730 break;
1731 }
1732 else if (GET_STATE (STATE_MMI) NEQ MMI_IDLE)
1733 {
1734 SET_STATE (STATE_MMI, MMI_IDLE);
1735 #ifdef SIM_TOOLKIT
1736 if (sms_data->file_update_ind NEQ NULL)
1737 {
1738 T_SIM_FILE_UPDATE_IND *file_update_ind = sms_data->file_update_ind;
1739 sms_data->file_update_ind = NULL;
1740 tl_sim_file_update_ind (file_update_ind);
1741 }
1742 #endif
1743 break;
1744 }
1745 /*FALLTHROUGH*/ /*lint -fallthrough*/
1746
1747 /* -------------------------------------- */
1748 case TL_IDLE:
1749 /* -------------------------------------- */
1750
1751 if (SMS_ENT_STATE(sms_data) EQ SMS_STATE_INITIALISING)
1752 {
1753 if (!tl_sms_memo_exceeded (TRUE))
1754 {
1755 tl_mnsms_report_ind (SMS_ENT_STATE(sms_data) = SMS_STATE_READY);
1756 break;
1757 }
1758 else
1759 {
1760 /*
1761 * RL_RELEASE_REQ ==>
1762 */
1763 rl_release_req(SMS_INST.ti);
1764 return;
1765 }
1766 }
1767 break;
1768
1769 /* -------------------------------------- */
1770 default:
1771 /* -------------------------------------- */
1772
1773 TRACE_EVENT("TL_REPORT_IND ignored");
1774 break;
1775 }
1776
1777 if (SMS_SDU(sms_data) NEQ NULL)
1778 {
1779 MFREE (SMS_SDU(sms_data));
1780 SMS_SDU(sms_data) = NULL;
1781 }
1782 SMS_SEL_REC(sms_data) = SMS_RECORD_NOT_EXIST;
1783 /*
1784 * TL State Transition TL_IDLE
1785 */
1786 SMS_INST_SET_STATE (STATE_TL, TL_IDLE);
1787 /*
1788 * RL_RELEASE_REQ ==>
1789 */
1790 rl_release_req(SMS_INST.ti);
1791 }
1792 }
1793
1794 /*
1795 +--------------------------------------------------------------------+
1796 | PROJECT : GSM-PS (8410) MODULE : SMS_TLF |
1797 | STATE : code ROUTINE : tl_cmms_end |
1798 +--------------------------------------------------------------------+
1799
1800 PURPOSE : Function used for ending the CMMS Session
1801
1802 */
1803
1804 GLOBAL void tl_cmms_end(void)
1805 {
1806 GET_INSTANCE_DATA;
1807 TRACE_FUNCTION ("tl_cmms_end()");
1808
1809 sms_data->cmms_release_pending = FALSE;
1810 sms_timer_stop(TMMS);
1811 tl_mnsms_cmms_end_ind();
1812 }
1813
1814 #endif /* #ifndef SMS_TLS_C */