comparison src/g23m-gsm/rr/rr_datg.c @ 104:27a4235405c6

src/g23m-gsm: import from LoCosto source
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 04 Oct 2016 18:24:05 +0000
parents
children
comparison
equal deleted inserted replaced
103:76d139c7a25e 104:27a4235405c6
1 /*
2 +-----------------------------------------------------------------------------
3 | Project :
4 | Modul :
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 module holds the functions for handling primitives
18 | sent from entity GRR to entity RR and vice versa.
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef RR_DATG_C
23 #define RR_DATG_C
24
25 #ifdef GPRS
26
27 #define ENTITY_RR
28
29 /*==== INCLUDES ===================================================*/
30
31 #include <string.h>
32 #include <stddef.h>
33 #include "typedefs.h"
34 #include "pcm.h"
35 #include "pconst.cdg"
36 #include "mconst.cdg"
37 #include "message.h"
38 #include "ccdapi.h"
39 #include "vsi.h"
40 #include "custom.h"
41 #include "gsm.h"
42 #include "prim.h"
43 #include "pei.h"
44 #include "tok.h"
45 #include "rr_gprs.h"
46 #include "rr.h"
47
48 static UBYTE get_r_bit (void);
49 static void handle_non_gprs_param(T_non_gprs* non_gprs);
50 static void dat_rrgrr_rr_est_ind (void);
51 static void dat_build_rr_initialisation_request (void);
52
53 /*
54 +-----------------------------------------------------------------------------+
55 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
56 | STATE : code ROUTINE : dat_rrgrr_channel_req |
57 +-----------------------------------------------------------------------------+
58
59 PURPOSE : Process the primitive RRGRR_CHANNEL_REQ received from GRR.
60 This primitive indicates to the RR to send a channel request
61
62 */
63
64 void dat_rrgrr_channel_req (T_RRGRR_CHANNEL_REQ *chan_req)
65 {
66 GET_INSTANCE_DATA;
67 USHORT req = (USHORT) (chan_req->req_data + 0x0400);
68 TRACE_FUNCTION ("gprs_rrgrr_channel_req()");
69
70 /*
71 * check availability of GPRS
72 */
73 switch (GET_STATE(STATE_GPRS)) /* rr_data->gprs_data.gprs_avail) */
74 {
75 case GPRS_PIM_BCCH:
76 case GPRS_PAM_BCCH:
77 case GPRS_PTM_BCCH:
78 if (GET_STATE(STATE_DAT) NEQ DAT_NULL)
79 {
80 switch (req)
81 {
82 case ESTCS_GPRS_1P:
83 case ESTCS_GPRS_SB:
84 case ESTCS_PAGING:
85 /*
86 * reset values used in the Packet Access
87 * Procedure
88 */
89 if (IS_TIMER_ACTIVE(T3126))
90 {
91 TIMERSTOP(T3126);
92 }
93 memset(rr_data->gprs_data.rr_sdu, NOT_PRESENT_8BIT,
94 sizeof(rr_data->gprs_data.rr_sdu));
95 rr_data->gprs_data.tma_in_progress = FALSE;
96 rr_data->gprs_data.fn = NOT_PRESENT_32BIT;
97 rr_data->gprs_data.req_ref_idx = NOT_PRESENT_8BIT;
98 rr_data->sc_data.first_attempt = TRUE;
99 rr_data->repeat_est = FALSE;
100 /* start procedure */
101 dat_start_immediate_assign((USHORT)(req EQ
102 ESTCS_PAGING ? ESTCS_GPRS_PAGING : req));
103 SET_STATE(STATE_GPRS, GPRS_PAM_BCCH);
104 break;
105 default:
106 TRACE_EVENT("channel request with wrong value");
107 break;
108 }
109 }
110 else
111 {
112 TRACE_EVENT ("store channel req");
113 if(! srv_store_prim((T_PRIM *)D2P(chan_req)))
114 {
115 TRACE_EVENT("prim store full");
116 PFREE(chan_req);
117 }
118 return;
119 }
120 break;
121 case GPRS_PIM_PBCCH:
122 case GPRS_PAM_PBCCH:
123 case GPRS_PTM_PBCCH:
124 TRACE_EVENT ("chan_req w/ PBCCH!");
125 break;
126 case GPRS_ACTIVATED:
127 TRACE_EVENT ("no cell selected yet, or cell supports no GPRS");
128 break;
129 case GPRS_SUSPENDED_BCCH:
130 case GPRS_SUSPENDED_PBCCH:
131 TRACE_EVENT ("GPRS is suspended!");
132 break;
133 default:
134 TRACE_EVENT ("GPRS not supported");
135 break;
136 }
137 PFREE (chan_req);
138 }
139
140 /*
141 +-----------------------------------------------------------------------------+
142 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
143 | STATE : code ROUTINE : dat_check_gprs_imm_ass |
144 +-----------------------------------------------------------------------------+
145
146 PURPOSE : checks an incoming immediate assignment message and forwards
147 it to GRR if necessary.
148
149 */
150
151 GLOBAL BOOL dat_check_gprs_imm_ass (T_MPH_UNITDATA_IND * unitdata,
152 T_D_IMM_ASSIGN * imm_assign,
153 UBYTE index)
154 {
155 GET_INSTANCE_DATA;
156 BOOL ret = FALSE;
157 int send_indication = 0;
158
159 TRACE_FUNCTION ("dat_check_gprs_imm_ass()");
160
161 if (GET_STATE(STATE_GPRS) NEQ GPRS_PAM_BCCH)
162 return FALSE; /* normal circuit switched handling */
163
164 TRACE_EVENT_P7 ("fn=%u tma=%u ri=%x d_t=%u (tmaip=%u fn=%d ri=%d)",
165 unitdata->fn, imm_assign->tma, index, imm_assign->d_t,
166 rr_data->gprs_data.tma_in_progress, rr_data->gprs_data.fn,
167 rr_data->gprs_data.req_ref_idx);
168
169 if (imm_assign->tma EQ TMA_1)
170 {
171 /* Message indicates to be the first message of two in a
172 * two-message assignment of a downlink TBF.
173 */
174 if (rr_data->gprs_data.tma_in_progress)
175 {
176 TRACE_ERROR ("more than one TMA after another!");
177 TRACE_EVENT_P4 ("ri=%x?%x(old) fn=%u?%u(old)",
178 index, rr_data->gprs_data.req_ref_idx,
179 unitdata->fn, rr_data->gprs_data.fn);
180 }
181
182 rr_data->gprs_data.tma_in_progress = TRUE;
183
184 /*
185 * store message, framenumber and burst index
186 */
187 gprs_rrgrr_store_sdu(rr_data->gprs_data.rr_sdu, &unitdata->sdu);
188 rr_data->gprs_data.fn = unitdata->fn;
189 rr_data->gprs_data.req_ref_idx = index;
190 ret = TRUE; /* further treatment by GRR */
191 }
192 else
193 {
194 if (rr_data->gprs_data.tma_in_progress)
195 { /*
196 * MS awaits the second message of two in a two-message assignment
197 * of a downlink TBF.
198 * The message must belong to the same channel request
199 * and the time difference must be less than two multiframes.
200 */
201 BOOL in_time, same_reference_index;
202 U32 delta_fn;
203
204 if (rr_data->gprs_data.fn > unitdata->fn)
205 delta_fn = unitdata->fn + HYPERFRAME - rr_data->gprs_data.fn;
206 else
207 delta_fn = unitdata->fn - rr_data->gprs_data.fn;
208
209 in_time = (delta_fn/51) < 2;
210 same_reference_index = rr_data->gprs_data.req_ref_idx EQ index;
211
212 TRACE_EVENT_P6 ("TMA:delta_fn=%u %s time, %sequal ref idx(%x?%x): %s",
213 delta_fn, in_time?"in":"out of", same_reference_index?"":"un",
214 rr_data->gprs_data.req_ref_idx, index,
215 (in_time AND same_reference_index)?"OK":"not ok");
216
217 if (in_time AND same_reference_index)
218 { /* This is the matching second message of a tma.
219 * -> Send both immediate assignments
220 */
221 send_indication = 2;
222 ret = TRUE; /* further treatment by GRR */
223 }
224 else
225 {
226 TRACE_ERROR ("MS awaits second message of a tma, this is not the right one!");
227
228 if (!in_time)
229 {
230 /*
231 * If the MS does not received the second IMMEDIATE ASSIGNMENT message
232 * in a two-message assignment within two multiframe periods following
233 * the first message, the MS shall discard the IA message received.
234 */
235 rr_data->gprs_data.tma_in_progress = FALSE;
236 rr_data->gprs_data.fn = NOT_PRESENT_32BIT;
237 rr_data->gprs_data.req_ref_idx = NOT_PRESENT_8BIT;
238 }
239
240 if(imm_assign->d_t EQ D_T_TBF)
241 {
242 /*
243 * stop timer and set RR state
244 * the handling of PDCH is done by GPRS
245 */
246 ret = TRUE; /* further treatment by GPRS */
247 }
248 else
249 {
250 /*
251 * allocation on SDCCH for GPRS
252 * normal RR establishment
253 */
254 ret = FALSE;
255 }
256 }
257 }
258 else
259 { /*
260 * MS donīt await the second message of two in a two-message assignment
261 * of a downlink TBF and the message isnīt the first message of a tma.
262 *
263 * -> Send one indication to GRR
264 */
265 send_indication = 1;
266
267 if(imm_assign->d_t EQ D_T_TBF)
268 {
269 /*
270 * stop timer and set RR state
271 * the handling of PDCH is done by GPRS
272 */
273 ret = TRUE; /* further treatment by GRR */
274 }
275 else
276 /*
277 * allocation on SDCCH for GPRS
278 * normal RR establishment
279 */
280 ret = FALSE;
281 }
282 }
283
284 if (send_indication)
285 {
286 if (send_indication EQ 2)
287 {
288 PALLOC_SDU ( rrgrr_ia_ind, RRGRR_IA_IND, MAX_L2_FRAME_SIZE * BITS_PER_BYTE); /* T_RRGRR_IA_IND */
289 /*
290 * indicate first immediate assignment
291 */
292 gprs_rrgrr_fill_from_stored_sdu(&rrgrr_ia_ind->sdu, rr_data->gprs_data.rr_sdu);
293 rrgrr_ia_ind->fn = 0; /* not valid */
294 rrgrr_ia_ind->r_bit = 0; /* not valid */
295 PSENDX (GRR, rrgrr_ia_ind);
296 }
297 {
298 PALLOC_SDU ( rrgrr_ia_ind2, RRGRR_IA_IND, MAX_L2_FRAME_SIZE * BITS_PER_BYTE); /* T_RRGRR_IA_IND */
299 /*
300 * indicate second or sole immediate assignment
301 */
302 if (unitdata->sdu.o_buf >= 8)
303 {
304 unitdata->sdu.o_buf -= 8;
305 unitdata->sdu.l_buf += 8;
306 }
307 else
308 {
309 TRACE_ERROR("dat_check_gprs_imm_ass(), not able to move offset o_buf");
310 }
311 gprs_rrgrr_fill_from_stored_sdu(&rrgrr_ia_ind2->sdu,
312 &unitdata->sdu.buf[unitdata->sdu.o_buf/8]);
313 rrgrr_ia_ind2->fn = unitdata->fn;
314 rrgrr_ia_ind2->r_bit = get_r_bit ();
315 PSENDX (GRR, rrgrr_ia_ind2);
316 }
317 }
318
319 TRACE_EVENT_P1 ("dat_check_gprs_imm_ass() returns %u", ret);
320 return ret;
321 }
322
323
324 /*
325 +-----------------------------------------------------------------------------+
326 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
327 | STATE : code ROUTINE : gprs_check_immediate_assignment_ext |
328 +-----------------------------------------------------------------------------+
329
330 PURPOSE : checks an incoming immediate assignment extended message
331 and forwards it to GRR if necessary.
332
333 */
334
335 GLOBAL void dat_check_imm_ass_ext (T_MPH_UNITDATA_IND * unitdata,
336 UBYTE index)
337 {
338 GET_INSTANCE_DATA;
339 TRACE_FUNCTION ("grps_check_immediate_assignment_ext()");
340
341 /*switch (rr_data->ms_data.establish_cause)
342 {
343 case ESTCS_GPRS_1P:
344 case ESTCS_GPRS_SB:
345 case ESTCS_GPRS_PAGING:*/
346 switch (GET_STATE(STATE_GPRS))
347 {
348 case GPRS_PAM_BCCH:
349 /*
350 * Immediate Assignment Extended received on AGCH during connection
351 * establishment
352 */
353 {
354 PALLOC_SDU (rrgrr_iaext_ind, RRGRR_IAEXT_IND, MAX_L2_FRAME_SIZE * BITS_PER_BYTE);
355 gprs_rrgrr_store_sdu(rr_data->gprs_data.rr_sdu, &unitdata->sdu);
356 gprs_rrgrr_fill_from_stored_sdu(&rrgrr_iaext_ind->sdu, rr_data->gprs_data.rr_sdu);
357
358 rrgrr_iaext_ind->ia_index = index;
359 rrgrr_iaext_ind->fn = unitdata->fn;
360 rrgrr_iaext_ind->r_bit = get_r_bit();
361
362 PSENDX (GRR, rrgrr_iaext_ind);
363 }
364 break;
365 default:
366 break;
367 }
368 }
369
370 /*
371 +-----------------------------------------------------------------------------+
372 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
373 | STATE : code ROUTINE : att_check_imm_ass_rej |
374 +-----------------------------------------------------------------------------+
375
376 PURPOSE : checks an incoming immediate assignment reject message and forwards
377 it to GRR if necessary.
378
379 */
380
381 GLOBAL UBYTE dat_check_imm_ass_rej (UBYTE wait_ind)
382 {
383 GET_INSTANCE_DATA;
384 UBYTE ret = FALSE;
385
386 TRACE_FUNCTION ("att_check_imm_ass_rej()");
387
388 /*
389 switch (rr_data->ms_data.establish_cause)
390 {
391 case ESTCS_GPRS_1P:
392 case ESTCS_GPRS_SB:
393 case ESTCS_GPRS_PAGING:
394 */
395 switch (GET_STATE(STATE_GPRS))
396 {
397 case GPRS_PAM_BCCH:
398 /*
399 * Immediate Assignment Reject received on AGCH during connection
400 * establishment
401 */
402 {
403 PALLOC( rrgrr_assignment_rej_ind, RRGRR_ASSIGNMENT_REJ_IND);
404
405 rrgrr_assignment_rej_ind->wait_ind = wait_ind;
406 rrgrr_assignment_rej_ind->r_bit = get_r_bit ();
407
408 PSENDX (GRR, rrgrr_assignment_rej_ind);
409 }
410 ret = TRUE;
411 break;
412 /* return TRUE; */
413 default:
414 break;
415 }
416 return ret;
417 /* return FALSE; */
418 }
419
420 /*
421 +-----------------------------------------------------------------------------+
422 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
423 | STATE : code ROUTINE : dat_check_imm_assign_pch |
424 +-----------------------------------------------------------------------------+
425
426 PURPOSE : checks an incoming immediate assignment message in idle mode on
427 PCH
428
429 */
430
431 GLOBAL UBYTE dat_check_imm_assign_pch (T_MPH_UNITDATA_IND * unitdata,
432 T_D_IMM_ASSIGN * imm_assign)
433 {
434 GET_INSTANCE_DATA;
435 TRACE_FUNCTION ("dat_check_imm_assign_pch()");
436 TRACE_EVENT("check dl ass");
437 if(imm_assign->d_t EQ D_T_TBF AND
438 imm_assign->dl EQ DL_1)
439 {
440 PALLOC_SDU ( rrgrr_ia_ind, RRGRR_IA_DOWNLINK_IND, MAX_L2_FRAME_SIZE * BITS_PER_BYTE);
441 switch(GET_STATE(STATE_GPRS))
442 {
443 case GPRS_NULL:
444 case GPRS_ACTIVATED:
445 /*
446 * here it would be possible to store it if we are in
447 * cell reselection
448 * but i think this does not make sense:
449 * -> this is not page (ia_dl is only cell wide),
450 * -> we dont know if its actually for us.
451 * -> first we have to do a Cell Update.
452 */
453 case GPRS_SUSPENDED_BCCH:
454 case GPRS_SUSPENDED_PBCCH:
455 TRACE_EVENT_P1("dl ass in state %d", GET_STATE(STATE_GPRS) );
456 PFREE(rrgrr_ia_ind);
457 return TRUE;
458 case GPRS_PIM_BCCH:
459 case GPRS_PAM_BCCH:
460 /*
461 * Immediate Assignment received in idle mode and it is a PDCH
462 */
463 TRACE_EVENT("dl ass");
464 rr_data->start_cell_reselection = FALSE;
465 TRACE_EVENT_P1("start_cell_reselection %d", rr_data->start_cell_reselection);
466 gprs_rrgrr_store_sdu(rr_data->gprs_data.rr_sdu, &unitdata->sdu);
467 gprs_rrgrr_fill_from_stored_sdu(&rrgrr_ia_ind->sdu, rr_data->gprs_data.rr_sdu);
468 rrgrr_ia_ind->fn = unitdata->fn;
469 rrgrr_ia_ind->r_bit = NOT_PRESENT_8BIT;
470
471 PSENDX (GRR, rrgrr_ia_ind);
472 return TRUE;
473 default:
474 PFREE(rrgrr_ia_ind);
475 return FALSE;
476 }
477 }
478 return FALSE;
479 }
480
481
482
483 /*
484 +-----------------------------------------------------------------------------+
485 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
486 | STATE : code ROUTINE : dat_check_packet_paging_ind |
487 +-----------------------------------------------------------------------------+
488
489 PURPOSE : checks an incoming paging whether it is for GPRS.
490
491 */
492
493 UBYTE dat_check_packet_paging_ind (T_MPH_PAGING_IND * pag_ind)
494 {
495 GET_INSTANCE_DATA;
496 UBYTE ret=2;
497 TRACE_FUNCTION ("dat_check_packet_paging_ind ()");
498
499 if (pag_ind->channel_needed EQ CN_PACKET)
500 {
501 switch(GET_STATE(STATE_GPRS))
502 {
503 case GPRS_PIM_BCCH:
504 {
505 /*
506 * Inform GRR about packet paging
507 */
508 PALLOC ( rrgrr_packet_paging_ind, RRGRR_PACKET_PAGING_IND );
509 switch (pag_ind->identity_type)
510 {
511 case ID_IMSI:
512 rrgrr_packet_paging_ind->pg_type = RRGRR_IMSI;
513 break;
514 case ID_PTMSI:
515 rrgrr_packet_paging_ind->pg_type = RRGRR_PTMSI;
516 break;
517 default:
518 TRACE_EVENT("packet paging with TMSI");
519 break;
520 }
521 PSENDX (GRR, rrgrr_packet_paging_ind);
522 }
523 ret = 2;
524 break;
525 case GPRS_NULL:
526 case GPRS_ACTIVATED:
527 /*strange cases, ignore it */
528 break;
529 case GPRS_SUSPENDED_BCCH:
530 case GPRS_SUSPENDED_PBCCH:
531 /*is is a packet paging but we are suspended so ignore it*/
532 ret = 2;
533 break;
534 default:
535 break;
536 }
537 }
538 else
539 {
540 /* normal CS paging */
541 switch(GET_STATE(STATE_GPRS))
542 {
543 case GPRS_SUSPENDED_BCCH:
544 case GPRS_SUSPENDED_PBCCH:
545 case GPRS_NULL:
546 case GPRS_ACTIVATED:
547 /* we are already suspended so just react to the paging */
548 /* or GPRS is not activated */
549 ret = 0;
550 break;
551 default:
552 /* ask GRR */
553 ret = 1;
554 break;
555 }
556 }
557 return ret;
558 }
559
560
561 /*
562 +-----------------------------------------------------------------------------+
563 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
564 | STATE : code ROUTINE : gprs_start_sabm |
565 +-----------------------------------------------------------------------------+
566
567 PURPOSE : starts connection establishment if a packet service is requested.
568
569 */
570
571 BOOL dat_gprs_start_sabm(void)
572 {
573 GET_INSTANCE_DATA;
574 TRACE_FUNCTION ("gprs_start_sabm()");
575
576 switch (GET_STATE(STATE_GPRS))
577 {
578 /*
579 * Mobile originated packet connection
580 */
581 case GPRS_PAM_BCCH:
582 dat_build_rr_initialisation_request ();
583 return TRUE;
584 default:
585 return FALSE;
586 }
587 }
588
589
590 /*
591 +-----------------------------------------------------------------------------+
592 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
593 | STATE : code ROUTINE : gprs_build_rr_initialisation_request|
594 +-----------------------------------------------------------------------------+
595
596 PURPOSE : starts connection establishment if a mobile originated packet
597 service is requested and it builds
598
599 */
600
601 static void dat_build_rr_initialisation_request (void)
602 {
603 GET_INSTANCE_DATA;
604 MCAST (rr_init_req, D_RR_INIT_REQ);
605 PALLOC_MSG (establish_req, DL_ESTABLISH_REQ, D_RR_INIT_REQ);
606
607 TRACE_FUNCTION ("grps_build_rr_initialisation_request()");
608 TRACE_EVENT ("POWER CLASS: grps_build_rr_initialisation_request()");
609
610 dat_code_prr_channel (&establish_req->ch_type,
611 &establish_req->sapi,
612 rr_data->sc_data.chan_desc.chan_type);
613
614 /*
615 * fill message parameter
616 */
617 rr_init_req->msg_type = D_RR_INIT_REQ;
618 rr_init_req->ciph_key_num.key_seq = rr_data->ms_data.cksn;
619 memcpy(&rr_init_req->mob_class_2, &rr_data->ms_data.classmark2,
620 sizeof(rr_init_req->mob_class_2));
621
622 /*
623 * set power classes
624 */
625 rr_init_req->mob_class_2.rf_pow_cap = att_get_power ();
626
627 /*
628 * set all other parameter
629 */
630 rr_init_req->chan_coding.mac_mode = rr_data->gprs_data.mac_req;
631 rr_init_req->chan_coding.cod_scheme = rr_data->gprs_data.cs_req;
632
633 /*
634 * store tlli independent from the used binary format
635 */
636 rr_init_req->ded_tlli.l_ded_tlli = 32;
637 rr_init_req->ded_tlli.o_ded_tlli = 0;
638 ccd_codeByte (rr_init_req->ded_tlli.b_ded_tlli, 0, 8, (UBYTE)(rr_data->gprs_data.tlli >> 24));
639 ccd_codeByte (rr_init_req->ded_tlli.b_ded_tlli, 8, 8, (UBYTE)(rr_data->gprs_data.tlli >> 16));
640 ccd_codeByte (rr_init_req->ded_tlli.b_ded_tlli, 16, 8, (UBYTE)(rr_data->gprs_data.tlli >> 8));
641 ccd_codeByte (rr_init_req->ded_tlli.b_ded_tlli, 24, 8, (UBYTE)rr_data->gprs_data.tlli);
642
643 rr_init_req->chan_req_desc.or_ty = rr_data->gprs_data.p_chan_req_des.mo_mt;
644
645 if (rr_init_req->chan_req_desc.or_ty)
646 {
647 rr_init_req->chan_req_desc.v_crd_prio = 1;
648 rr_init_req->chan_req_desc.crd_prio = rr_data->gprs_data.p_chan_req_des.prio;
649 rr_init_req->chan_req_desc.v_rlc_mode = 1;
650 rr_init_req->chan_req_desc.rlc_mode = rr_data->gprs_data.p_chan_req_des.rlc_mode_req;
651 rr_init_req->chan_req_desc.v_llc_fr_type = 1;
652 rr_init_req->chan_req_desc.llc_fr_type = rr_data->gprs_data.p_chan_req_des.llc_type;
653 rr_init_req->chan_req_desc.v_rbw = 1;
654 rr_init_req->chan_req_desc.rbw = rr_data->gprs_data.p_chan_req_des.req_bwd;
655 rr_init_req->chan_req_desc.v_rlc_c_oct = 1;
656 rr_init_req->chan_req_desc.rlc_c_oct = rr_data->gprs_data.p_chan_req_des.rlc_octets;
657 }
658
659 rr_init_req->gprs_meas_res.c_val = rr_data->gprs_data.gprs_meas_results.c_value;
660 rr_init_req->gprs_meas_res.rxqual = rr_data->gprs_data.gprs_meas_results.rxqual;
661 rr_init_req->gprs_meas_res.sign_var = rr_data->gprs_data.gprs_meas_results.sign_var;
662
663 for_dat_est_req_content (establish_req);
664 }
665
666
667 /*
668 +-----------------------------------------------------------------------------+
669 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
670 | STATE : code ROUTINE : gprs_stop_dcch_ind |
671 +-----------------------------------------------------------------------------+
672
673 PURPOSE : inform GRR about failed layer 2 establishment.
674
675 */
676 void dat_stop_dcch_ind (UBYTE stop_cause)
677 {
678 GET_INSTANCE_DATA;
679 PALLOC(stop, RRGRR_STOP_DCCH_IND);
680 TRACE_FUNCTION ("gprs_stop_dcch_ind()");
681 stop->stop_cause = stop_cause;
682 /* we will do a CR anyway */
683 SET_STATE(STATE_GPRS, GPRS_ACTIVATED);
684 PSENDX(GRR, stop);
685 }
686
687
688
689 /*
690 +-----------------------------------------------------------------------------+
691 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
692 | STATE : code ROUTINE : gprs_rrgrr_gprs_data_req |
693 +-----------------------------------------------------------------------------+
694
695 PURPOSE : The primitive RRGRR_GPRS_DATA_REQ contains various parameters from
696 GRR. Layer 1 is configured and some data are stored.
697 */
698
699 void dat_rrgrr_gprs_data_req (T_RRGRR_GPRS_DATA_REQ *data_req)
700 {
701 GET_INSTANCE_DATA;
702 /*
703 * store parameter
704 */
705
706 rr_data->gprs_data.tlli = data_req->tlli;
707 rr_data->gprs_data.p_chan_req_des = data_req->p_chan_req_des;
708 rr_data->gprs_data.gprs_meas_results = data_req->gprs_meas_results;
709 rr_data->gprs_data.mac_req = data_req->mac_req;
710 rr_data->gprs_data.cs_req = data_req->cs_req;
711 rr_data->gprs_data.current_rai = data_req->rai;
712
713 if(rr_data->gprs_data.ptmsi NEQ data_req->old_ptmsi OR
714 rr_data->gprs_data.ptmsi2 NEQ data_req->new_ptmsi)
715 {
716 rr_data->gprs_data.ptmsi = data_req->old_ptmsi;
717 rr_data->gprs_data.ptmsi2 = data_req->new_ptmsi;
718 att_mph_identity_req ();
719 }
720
721 PFREE (data_req);
722 }
723
724
725 /*
726 +-----------------------------------------------------------------------------+
727 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
728 | STATE : code ROUTINE : dat_rrgrr_data_ind |
729 +-----------------------------------------------------------------------------+
730
731 PURPOSE : Send the primitive rrgrr_data_ind to GRR.
732 This primitive indicates to the GRR that a
733 CTRL Message on DCCH for RR was received.
734 IN : frame_number
735 OUT : rrgrr_data_ind
736
737 */
738
739 void dat_rrgrr_data_ind (T_DL_DATA_IND* dl_data_ind)
740 {
741 USHORT soff,doff;
742 PALLOC_SDU ( rrgrr_data_ind, RRGRR_DATA_IND, dl_data_ind->sdu.l_buf );
743
744 TRACE_EVENT ("dat_rrgrr_data_ind ()");
745
746 /*
747 * compute byte offsets (soff,doff) into message streams,
748 * assume that o_buf is multiple of 8
749 */
750
751 doff = (USHORT)(rrgrr_data_ind->sdu.o_buf / BITS_PER_BYTE);
752 soff = (USHORT)( dl_data_ind->sdu.o_buf / BITS_PER_BYTE);
753
754 memcpy ( &rrgrr_data_ind->sdu.buf[doff],
755 & dl_data_ind->sdu.buf[soff], BYTELEN ( dl_data_ind->sdu.l_buf ) );
756
757 rrgrr_data_ind->fn = NOT_PRESENT_32BIT;
758
759 PFREE ( dl_data_ind );
760 PSENDX (GRR, rrgrr_data_ind);
761 }
762
763 /*
764 +-----------------------------------------------------------------------------+
765 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
766 | STATE : code ROUTINE : gprs_rrgrr_data_req |
767 +-----------------------------------------------------------------------------+
768
769 PURPOSE : Process the primitive RRGRR_DATA_REQ received from GRR.
770 This primitive indicates to the RR to send a block on DCCH.
771 IN :
772 OUT :
773
774 */
775
776 void dat_rrgrr_data_req (T_RRGRR_DATA_REQ *rrgrr_data_req)
777 {
778 GET_INSTANCE_DATA;
779 TRACE_EVENT ("dat_rrgrr_data_req ()");
780
781 switch(GET_STATE(STATE_GPRS))
782 {
783 case GPRS_DEDI_SDCCH:
784 {
785 PPASS (rrgrr_data_req, dl_data_req, DL_DATA_REQ);
786
787 dat_code_prr_channel (&dl_data_req->ch_type,
788 &dl_data_req->sapi,
789 rr_data->sc_data.chan_desc.chan_type);
790 dat_vsd_bit_set ((T_L3_SDU *)&dl_data_req->sdu, SET_ONLY);
791 for_dat_l3_data_req (dl_data_req);
792 }
793 break;
794 default:
795 break;
796 }
797
798 PFREE (rrgrr_data_req);
799 }
800
801 /*
802 +-----------------------------------------------------------------------------+
803 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
804 | STATE : code ROUTINE : dat_rgrr_suspend_dcch_req |
805 +-----------------------------------------------------------------------------+
806
807 PURPOSE : Process the primitive RRGRR_SUSPEND_DCCH_REQ received from GRR.
808 This primitive is used by GRR to order RR to stop the
809 dedicated channel. It is only a trigger.
810 IN : RRGRR-SUSPEND-DCCH-REQ
811 OUT : DL-SUSPEND-REQ and MPH-DEDICATED-REQ
812
813 */
814 void dat_rrgrr_suspend_dcch_req( T_RRGRR_SUSPEND_DCCH_REQ *suspend_dcch_req)
815 {
816 GET_INSTANCE_DATA;
817 PALLOC (dedicated_req, MPH_DEDICATED_REQ);
818
819 TRACE_EVENT ("dat_rrgrr_suspend_dcch_req ()");
820
821 for_suspend_layer_2();
822
823 memset (dedicated_req, 0, sizeof (T_MPH_DEDICATED_REQ));
824 dedicated_req->mod = MODE_PDCH_ASSIGN;
825 PSENDX (PL, dedicated_req);
826
827 SET_STATE (STATE_DAT, DAT_PDCH_ASS);
828
829 PFREE (suspend_dcch_req);
830 }
831
832 /*
833 +-----------------------------------------------------------------------------+
834 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
835 | STATE : code ROUTINE : dat_rrgrr_suspend_dcch_cnf |
836 +-----------------------------------------------------------------------------+
837
838 PURPOSE : Create the primitive RRGRR_SUSPEND_DCCH_CNF and send it to GRR.
839 As a response GRR will start the establishment of a TBF.
840 IN : nothing
841 OUT : RRGRR_SUSPEND_DCCH_CNF
842
843 */
844 void dat_rrgrr_suspend_dcch_cnf( void )
845 {
846 PALLOC (suspend_dcch_cnf, RRGRR_SUSPEND_DCCH_CNF);
847 PSENDX (GRR, suspend_dcch_cnf);
848 }
849
850
851 /*
852 +-----------------------------------------------------------------------------+
853 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
854 | STATE : code ROUTINE : dat_rrgrr_reconnect_dcch_req |
855 +-----------------------------------------------------------------------------+
856
857 PURPOSE : Process the primitive RRGRR-RECONNECT-DCCH-REQ received from GRR.
858 This primitive is used by GRR during a PDCH Assignment procedure
859 and RR Network Controlled Cell Change Order to order RR to
860 continue with the dedicated channel.
861 IN : T-RRGRR-RECONNECT-DCCH-REQ
862 OUT : DL-DATA-REQ(u-assign-fail) or MPH_DEDICATED_FAIL_REQ
863
864 */
865 void dat_rrgrr_reconnect_dcch_req (T_RRGRR_RECONNECT_DCCH_REQ *reconnect_dcch_req)
866 {
867 GET_INSTANCE_DATA;
868 TRACE_EVENT ("dat_rrgrr_reconnect_dcch_req()");
869
870 if ( rr_data->gprs_data.tbf_est EQ TBF_EST_PDCH OR
871 rr_data->gprs_data.tbf_est EQ TBF_EST_CCO )
872 {
873 UBYTE next_state;
874
875 if ( rr_data->gprs_data.tbf_est EQ TBF_EST_PDCH )
876 next_state = DAT_PDCH_ASS_3;
877 else
878 next_state = DAT_CCO_3;
879
880 /*
881 * The dedicated channel has been suspended at PL and DL.
882 * However RR could not established the TBF.
883 */
884
885 rr_data->gprs_data.tbf_est = TBF_EST_NONE;
886 dat_code_mph_old_chan_req();
887 rr_data->gprs_data.reconn_cause = reconnect_dcch_req->reconn_cause;
888 rr_data->gprs_data.cco_need_reconnect_cnf = TRUE;
889 SET_STATE (STATE_DAT, next_state);
890 }
891 else /* Any other state assuming D_PDCH_ASS_CMD has been sent to GRR.
892 GRR cannot evaluate the message. */
893 {
894 MCAST (u_assign_fail, U_ASSIGN_FAIL);
895 PALLOC_MSG (dl_data_req, DL_DATA_REQ, U_ASSIGN_FAIL);
896
897 /*
898 * set channel type and SAPI
899 */
900 dat_code_prr_channel (&dl_data_req->ch_type,
901 &dl_data_req->sapi,
902 rr_data->sc_data.chan_desc.chan_type);
903
904 u_assign_fail->msg_type = U_ASSIGN_FAIL;
905 u_assign_fail->rr_cause = reconnect_dcch_req->reconn_cause;
906 for_dat_data_req (dl_data_req);
907
908 dat_rrgrr_reconnect_dcch_cnf (RECONN_OK);
909 }
910 PFREE (reconnect_dcch_req);
911 }
912
913 /*
914 +-----------------------------------------------------------------------------+
915 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
916 | STATE : code ROUTINE : dat_rrgrr_reconnect_dcch_cnf |
917 +-----------------------------------------------------------------------------+
918
919 PURPOSE : Create the primitive RRGRR_RECONNECT_DCCH_CNF and send it to GRR.
920 This indicates the outcome of the Reconnection procedure to GRR.
921 IN : nothing
922 OUT : RRGRR-RECONNECT-DCCH-CNF
923
924 */
925 void dat_rrgrr_reconnect_dcch_cnf( UBYTE reconn_state )
926 {
927 PALLOC (reconnect_dcch_cnf, RRGRR_RECONNECT_DCCH_CNF);
928 TRACE_EVENT ("dat_rrgrr_reconnect_dcch_cnf()");
929 reconnect_dcch_cnf->reconn_state = reconn_state;
930 PSENDX (GRR, reconnect_dcch_cnf);
931 }
932
933 /*
934 +-----------------------------------------------------------------------------+
935 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
936 | STATE : code ROUTINE : dat_rgrr_resumed_tbf_req |
937 +-----------------------------------------------------------------------------+
938
939 PURPOSE : Process the primitive RRGRR-RESUMED-TBF-REQ received from GRR.
940 This primitive is used by GRR to order RR to indicate the
941 successful outcome of a TBF establishment at GRR.
942 This is applicable during PDCH Assignment and RR Network Contolled
943 Cell Change Order.
944 IN : RRGRR-RESUMED-TBF-REQ
945 OUT : MPH-IDLE-REQ and DL-RELEASE-REQ
946
947 */
948 void dat_rrgrr_resumed_tbf_req( T_RRGRR_RESUMED_TBF_REQ *resumed_tbf_req )
949 {
950 GET_INSTANCE_DATA;
951 TRACE_EVENT ("dat_rrgrr_resumed_tbf_req ()");
952
953 if ( rr_data->gprs_data.tbf_est EQ TBF_EST_PDCH OR
954 rr_data->gprs_data.tbf_est EQ TBF_EST_CCO )
955 {
956 PALLOC (dl_release_req, DL_RELEASE_REQ);
957
958 rr_data->gprs_data.tbf_est = TBF_EST_NONE;
959
960 att_build_idle_req(SC_INDEX, MODE_PACKET_TRANSFER);
961
962 /*
963 * Note that also during a Cell Change Order the states DAT_PDCH* are used.
964 */
965
966 SET_STATE (STATE_GPRS, GPRS_PTM_BCCH);
967 SET_STATE (STATE_DAT, DAT_PDCH_ASS_2);
968
969 dat_code_prr_channel (&dl_release_req->ch_type,
970 &dl_release_req->sapi,
971 rr_data->sc_data.chan_desc.chan_type);
972
973 dl_release_req->mode = DL_NORMAL_RELEASE;
974 PSENDX (DL, dl_release_req);
975 }
976 PFREE (resumed_tbf_req);
977 }
978
979 /*
980 +-----------------------------------------------------------------------------+
981 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
982 | STATE : code ROUTINE : dat_rrgrr_resumed_tbf_cnf |
983 +-----------------------------------------------------------------------------+
984
985 PURPOSE : Create a primitive RGRR_RESUMED_TBF_CNF and send it to GRR.
986 This indicates the successful outcome of the release of the DCCH
987 which was in use before the TBF was established.
988 IN : nothing
989 OUT : RGRR-RESUMED-TBF-CNF
990
991 */
992 void dat_rrgrr_resumed_tbf_cnf( void )
993 {
994 GET_INSTANCE_DATA;
995 PALLOC (rrgrr_resumed_tbf_cnf, RRGRR_RESUMED_TBF_CNF);
996
997 TRACE_EVENT ("dat_rrgrr_resumed_tbf_cnf ()");
998
999 SET_STATE(STATE_GPRS, GPRS_PTM_BCCH);
1000 SET_STATE(STATE_DAT, DAT_IDLE);
1001 SET_STATE(STATE_ATT, ATT_IDLE);
1002
1003 PSENDX (GRR, rrgrr_resumed_tbf_cnf);
1004 }
1005
1006 /*
1007 +-----------------------------------------------------------------------------+
1008 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1009 | STATE : code ROUTINE : dat_rrgrr_change_order |
1010 +-----------------------------------------------------------------------------+
1011
1012 PURPOSE : Handle the message RR Network Controlled Cell Change Order.
1013 IN : DL-DATA-IND
1014 OUT : RRGRR-DATA-IND
1015
1016 */
1017 void dat_rrgrr_change_order (T_DL_DATA_IND *dl_data_ind, T_D_CHANGE_ORDER *d_change_order)
1018 {
1019 GET_INSTANCE_DATA;
1020 for_check_cell_descr (&d_change_order->cell_desc); /* check if the BCCH is ok */
1021
1022 if ( rr_data->ms_data.error.cs EQ 0 ) /* '0' indicates successful message decoding */
1023 {
1024 T_cell_desc *cell_desc;
1025
1026 for_suspend_layer_2();
1027
1028 if ( rr_data->gprs_data.dl_data_ind NEQ NULL )
1029 {
1030 PFREE ( rr_data->gprs_data.dl_data_ind );
1031 }
1032 rr_data->gprs_data.dl_data_ind = dl_data_ind;
1033
1034 dat_att_null();
1035 cs_set_all();
1036
1037 cell_desc = &d_change_order->cell_desc;
1038 rr_data->gprs_data.bsic = (UBYTE)(( cell_desc->ncc << 3 ) + cell_desc->bcc);
1039 rr_data->gprs_data.arfcn = (USHORT)(( cell_desc->bcch_arfcn_hi << 8 ) +
1040 cell_desc->bcch_arfcn_lo);
1041 TIMERSTOP(T_DEDICATED_MODE);
1042 rr_data->mode_after_dedi = MODE_CELL_CHANGE_ORDER;
1043 att_stop_dedicated();
1044 }
1045 else
1046 {
1047 MCAST (handov_fail, U_HANDOV_FAIL);
1048 PALLOC_MSG (dl_data_req, DL_DATA_REQ, U_HANDOV_FAIL);
1049
1050 handov_fail->msg_type = U_HANDOV_FAIL;
1051 handov_fail->rr_cause = RRC_PROT_UNSPECIFIED;
1052 dat_code_prr_channel (&dl_data_req->ch_type,
1053 &dl_data_req->sapi,
1054 rr_data->sc_data.chan_desc.chan_type);
1055 for_dat_data_req (dl_data_req);
1056 PFREE ( dl_data_ind );
1057 }
1058 }
1059
1060
1061 /*
1062 +-----------------------------------------------------------------------------+
1063 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1064 | STATE : code ROUTINE : dat_check_packet_access |
1065 +-----------------------------------------------------------------------------+
1066
1067 PURPOSE : change state from conn. establishment to dedicated
1068 IN :
1069 OUT :
1070
1071 */
1072
1073 BOOL dat_check_packet_access(void)
1074 {
1075 GET_INSTANCE_DATA;
1076 if(GET_STATE(STATE_GPRS) EQ GPRS_PAM_BCCH)
1077 {
1078 SET_STATE(STATE_GPRS, GPRS_DEDI_SDCCH);
1079 return TRUE;
1080 }
1081 else return FALSE;
1082 }
1083
1084 /*
1085 +-----------------------------------------------------------------------------+
1086 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1087 | STATE : code ROUTINE : dat_ask_paging_ind |
1088 +-----------------------------------------------------------------------------+
1089
1090 PURPOSE : Ask GRR if paging should be processed. Answer will come in
1091 RRGRR_RR_EST_RSP primitive
1092
1093 */
1094
1095 void dat_ask_paging_ind (T_MPH_PAGING_IND *pag_ind)
1096 {
1097 GET_INSTANCE_DATA;
1098 TRACE_FUNCTION ("dat_ask_paging_ind ()");
1099
1100 rr_data->gprs_data.pag_dat.id_type = pag_ind->identity_type;
1101 rr_data->gprs_data.pag_dat.chan_need = pag_ind->channel_needed;
1102
1103 rr_data->start_cell_reselection = FALSE;
1104 TRACE_EVENT_P1("start_cell_reselection %d", rr_data->start_cell_reselection);
1105 /* ask GRR if paging should be processed */
1106 dat_rrgrr_rr_est_ind ();
1107 }
1108
1109 /*
1110 +-----------------------------------------------------------------------------+
1111 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1112 | STATE : code ROUTINE : dat_ask_paging_ind_pa_only |
1113 +-----------------------------------------------------------------------------+
1114
1115 PURPOSE : Ask GRR if paging should be processed. Answer will come in
1116 RRGRR_RR_EST_RSP primitive. Only applicable in state GPRS_PA.
1117
1118 */
1119
1120 void dat_ask_paging_ind_pa_only (T_MPH_PAGING_IND *pag_ind)
1121 {
1122 GET_INSTANCE_DATA;
1123 if ( GET_STATE(STATE_GPRS) EQ GPRS_PAM_BCCH AND pag_ind->channel_needed NEQ CN_PACKET )
1124 dat_ask_paging_ind ( pag_ind );
1125 }
1126
1127 /*
1128 +-----------------------------------------------------------------------------+
1129 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1130 | STATE : code ROUTINE : dat_rrgrr_rr_est_ind |
1131 +-----------------------------------------------------------------------------+
1132
1133 PURPOSE : Send the primitive rrgrr_est_ind to GRR.
1134 This primitive indicates to the GRR that an RR connection
1135 establishment was received from the network via paging.
1136 It is only a trigger.
1137 IN :
1138 OUT : rrgrr_rr_est_ind
1139
1140 */
1141
1142 static void dat_rrgrr_rr_est_ind (void)
1143 {
1144 PALLOC ( rrgrr_est_ind, RRGRR_RR_EST_IND );
1145 TRACE_EVENT ("dat_rrgrr_est_ind ()");
1146 PSENDX (GRR, rrgrr_est_ind);
1147 }
1148
1149 /*
1150 +-----------------------------------------------------------------------------+
1151 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1152 | STATE : code ROUTINE : dat_rrgrr_rr_est_req |
1153 +-----------------------------------------------------------------------------+
1154
1155 PURPOSE : Process the primitive RRGRR_RR_EST_REQ received from GRR.
1156 This primitive indicates to the RR a RR connection establishment
1157 was received on paging channel (PCCCH or PACCH). RR has to start
1158 a RR connection as if it has received a connection establishment
1159 on CCCH.
1160 IN :
1161 OUT :
1162
1163 */
1164
1165 void dat_rrgrr_rr_est_req (T_RRGRR_RR_EST_REQ *est_req)
1166 {
1167 GET_INSTANCE_DATA;
1168 TRACE_EVENT ("dat_rrgrr_rr_est_req ()");
1169
1170 switch(GET_STATE(STATE_GPRS))
1171 {
1172 case GPRS_PTM_BCCH:
1173 case GPRS_PAM_BCCH:
1174 case GPRS_PTM_PBCCH:
1175 case GPRS_PAM_PBCCH:
1176 case GPRS_PIM_PBCCH:
1177 rr_data->gprs_data.gprs_suspend = est_req->susp_req;
1178 rr_data->gprs_data.gprs_resump = GPRS_RESUMPTION_ACK;
1179
1180 if(est_req->non_gprs.v_non_gprs)
1181 {
1182 handle_non_gprs_param(&est_req->non_gprs);
1183 }
1184
1185 switch(GET_STATE(STATE_GPRS))
1186 {
1187 case GPRS_PIM_BCCH:
1188 case GPRS_PAM_BCCH:
1189 case GPRS_PTM_BCCH:
1190 SET_STATE(STATE_GPRS, GPRS_SUSPENDED_BCCH);
1191 break;
1192 case GPRS_PIM_PBCCH:
1193 case GPRS_PAM_PBCCH:
1194 case GPRS_PTM_PBCCH:
1195 SET_STATE(STATE_GPRS, GPRS_SUSPENDED_PBCCH);
1196 break;
1197 default:
1198 break;
1199 }
1200
1201 dat_begin_start_immediate_assign (est_req->ident_type,
1202 est_req->ch_needed);
1203 break;
1204 default:
1205 break;
1206 }
1207 PFREE (est_req);
1208 }
1209
1210 /*
1211 +-----------------------------------------------------------------------------+
1212 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1213 | STATE : code ROUTINE : handle_non_gprs_param |
1214 +-----------------------------------------------------------------------------+
1215
1216 PURPOSE : Processes RGRR_RR_EST_REQ parameters received from GRR.
1217 IN : Non GPRS parameter structure of the RRGRR_RR_EST_REQ primitive.
1218 OUT :
1219
1220 */
1221
1222 static void handle_non_gprs_param(T_non_gprs* non_gprs)
1223 {
1224 GET_INSTANCE_DATA;
1225 rr_data->nc_data[SC_INDEX].control_descr.att = non_gprs->att;
1226 rr_data->nc_data[SC_INDEX].control_descr.bs_ag_blks_res = non_gprs->bs_ag_blks_res;
1227 rr_data->nc_data[SC_INDEX].control_descr.ccch_conf = non_gprs->ccch_conf;
1228 rr_data->nc_data[SC_INDEX].control_descr.bs_pa_mfrms = non_gprs->bs_pa_mfrms;
1229 rr_data->nc_data[SC_INDEX].rach.max_retrans = non_gprs->max_retrans;
1230 rr_data->nc_data[SC_INDEX].rach.tx_integer = non_gprs->tx_integer;
1231 rr_data->nc_data[SC_INDEX].select_para.ms_txpwr_max_cch = non_gprs->gprs_ms_txpwr_max_cch;
1232 rr_data->nc_data[SC_INDEX].select_para.neci = non_gprs->neci;
1233 rr_data->sc_data.cd.cell_options.pow_ctrl = non_gprs->pwrc;
1234
1235 if(non_gprs->dtx EQ 2)
1236 rr_data->sc_data.cd.dtx = DTX_NOT_USED;
1237 else
1238 rr_data->sc_data.cd.dtx = DTX_USED;
1239
1240 rr_data->sc_data.cd.dtx_half = rr_data->sc_data.cd.dtx_full =
1241 rr_data->sc_data.cd.dtx;
1242
1243 rr_data->sc_data.cd.cell_options.rlt = non_gprs->radio_link_timeout;
1244
1245 if(non_gprs->ec)
1246 rr_data->nc_data[SC_INDEX].rach.ac &= 0x0400;
1247 if(non_gprs->v_T3212)
1248 rr_data->nc_data[SC_INDEX].control_descr.t3212 = non_gprs->T3212;
1249
1250 #ifdef REL99
1251 /*Copy Early Classmark Sending Control flag received in PSI2 by GRR*/
1252 rr_data->nc_data[SC_INDEX].c2_par.ecsc = non_gprs->ecsc;
1253 #endif
1254 }
1255 /*
1256 +-----------------------------------------------------------------------------+
1257 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1258 | STATE : code ROUTINE : dat_rrgrr_rr_est_rsp |
1259 +-----------------------------------------------------------------------------+
1260
1261 PURPOSE : Process the primitive RRGRR_RR_EST_RSP received from GRR.
1262 This primitive indicates to the RR whether an establishment of
1263 RR connection is allowed or not. This primitive is an answer
1264 to the RRGRR_RR_EST_IND primitive.
1265 IN :
1266 OUT :
1267
1268 */
1269
1270 void dat_rrgrr_rr_est_rsp (T_RRGRR_RR_EST_RSP *est_rsp)
1271 {
1272 GET_INSTANCE_DATA;
1273 TRACE_EVENT ("dat_rrgrr_rr_est_rsp ()");
1274
1275 rr_data->start_cell_reselection = TRUE;
1276 TRACE_EVENT_P1("start_cell_reselection %d", rr_data->start_cell_reselection);
1277
1278 /* establishment allowed */
1279 if (est_rsp->rr_est)
1280 {
1281 rr_data->gprs_data.gprs_suspend = est_rsp->susp_req;
1282 rr_data->gprs_data.gprs_resump = GPRS_RESUMPTION_ACK;
1283 switch(GET_STATE(STATE_GPRS))
1284 {
1285 case GPRS_PIM_BCCH:
1286 case GPRS_PAM_BCCH:
1287 case GPRS_PTM_BCCH:
1288 SET_STATE(STATE_GPRS, GPRS_SUSPENDED_BCCH);
1289 break;
1290 case GPRS_PIM_PBCCH:
1291 case GPRS_PAM_PBCCH:
1292 case GPRS_PTM_PBCCH:
1293 SET_STATE(STATE_GPRS, GPRS_SUSPENDED_PBCCH);
1294 break;
1295 default:
1296 break;
1297 }
1298 dat_begin_start_immediate_assign (rr_data->gprs_data.pag_dat.id_type,
1299 rr_data->gprs_data.pag_dat.chan_need);
1300 }
1301
1302 rr_data->gprs_data.pag_dat.id_type = 0;
1303 rr_data->gprs_data.pag_dat.chan_need = 0;
1304
1305 PFREE (est_rsp);
1306 }
1307
1308
1309 /*
1310 +-----------------------------------------------------------------------------+
1311 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1312 | STATE : code ROUTINE : dat_gprs_suspend_req |
1313 +-----------------------------------------------------------------------------+
1314
1315 PURPOSE : Builds GPRS suspension request message.
1316 IN :
1317 OUT :
1318
1319 */
1320
1321 void dat_gprs_suspend_req (void)
1322 {
1323 GET_INSTANCE_DATA;
1324 if(rr_data->gprs_data.gprs_suspend)
1325 {
1326 /*
1327 * building of the GPRS Suspension Request message
1328 */
1329 MCAST (susp_req, U_GPRS_SUSP_REQ);
1330 PALLOC_MSG (dl_data_req, DL_DATA_REQ, U_GPRS_SUSP_REQ);
1331
1332 /*
1333 * set channel type and SAPI for layer 2
1334 */
1335 dat_code_prr_channel (&dl_data_req->ch_type,
1336 &dl_data_req->sapi,
1337 rr_data->sc_data.chan_desc.chan_type);
1338 susp_req->msg_type = U_GPRS_SUSP_REQ;
1339
1340 /*
1341 * store tlli independent from the used binary format
1342 */
1343 susp_req->ded_tlli.l_ded_tlli = 32;
1344 susp_req->ded_tlli.o_ded_tlli = 0;
1345 ccd_codeByte (susp_req->ded_tlli.b_ded_tlli, 0, 8,
1346 (UBYTE)(rr_data->gprs_data.tlli >> 24));
1347 ccd_codeByte (susp_req->ded_tlli.b_ded_tlli, 8, 8,
1348 (UBYTE)(rr_data->gprs_data.tlli >> 16));
1349 ccd_codeByte (susp_req->ded_tlli.b_ded_tlli, 16, 8,
1350 (UBYTE)(rr_data->gprs_data.tlli >> 8));
1351 ccd_codeByte (susp_req->ded_tlli.b_ded_tlli, 24, 8,
1352 (UBYTE) rr_data->gprs_data.tlli);
1353
1354
1355 switch(rr_data->ms_data.establish_cause)
1356 {
1357 case ESTCS_SERV_REQ_BY_MM:
1358 susp_req->susp_cause = SUSP_C_LU;
1359 break;
1360 case ESTCS_EMRG_CAL:
1361 case ESTCS_CAL_REEST:
1362 case ESTCS_MOB_ORIG_SPCH_CAL_BY_CC:
1363 case ESTCS_MOB_ORIG_DATA_CAL_BY_CC:
1364 case ESTCS_MOB_ORIG_DATA_CAL_BY_CC_HR_SUFF:
1365 case ESTCS_PAGING:
1366 susp_req->susp_cause = SUSP_C_CALL;
1367 break;
1368 case ESTCS_MOB_ORIG_CAL_BY_SS_SMS:
1369 susp_req->susp_cause = SUSP_C_SMS; /* SUSP_C_SS */
1370 break;
1371 default:
1372 break;
1373 }
1374
1375 memcpy(susp_req->rout_area_id.mcc,rr_data->gprs_data.current_rai.plmn.mcc, SIZE_MCC);
1376 memcpy(susp_req->rout_area_id.mnc,rr_data->gprs_data.current_rai.plmn.mnc, SIZE_MNC);
1377 if (susp_req->rout_area_id.mnc[2] EQ 0x0f)
1378 susp_req->rout_area_id.c_mnc = 2;
1379 else
1380 susp_req->rout_area_id.c_mnc = SIZE_MNC;
1381
1382 susp_req->rout_area_id.rac = rr_data->gprs_data.current_rai.rac;
1383 susp_req->rout_area_id.lac = rr_data->gprs_data.current_rai.lac;
1384
1385 rr_data->gprs_data.gprs_resump = GPRS_RESUMPTION_NOT_ACK;
1386 /*
1387 * send to layer 2
1388 */
1389 for_dat_data_req (dl_data_req);
1390 }
1391
1392 }
1393
1394 /*
1395 +-----------------------------------------------------------------------------+
1396 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1397 | STATE : code ROUTINE : gprs_rrgrr_stop_task |
1398 +-----------------------------------------------------------------------------+
1399
1400 PURPOSE : Process the primitive RRGRR_STOP_TASK_REQ received from GRR.
1401 This primitive indicates to the RR that a specific task on RR side
1402 should be stopped.
1403 IN :
1404 OUT :
1405
1406 */
1407
1408 void gprs_rrgrr_stop_task( T_RRGRR_STOP_TASK_REQ *stop_task)
1409 {
1410 GET_INSTANCE_DATA;
1411 TRACE_EVENT ("gprs_rrgrr_stop_task");
1412
1413 switch(stop_task->ctrl_task)
1414 {
1415 case RR_TASK_1:
1416 {
1417 switch(GET_STATE(STATE_GPRS))
1418 {
1419 case GPRS_PAM_BCCH:
1420 rr_data->start_cell_reselection = TRUE;
1421 TRACE_EVENT_P1("start_cell_reselection %d", rr_data->start_cell_reselection);
1422 if(stop_task->task.v_stop_ccch NEQ INVALID_MSG)
1423 {
1424 att_build_idle_req(SC_INDEX, MODE_PACKET_TRANSFER);
1425 TIMERSTOP(T3126);
1426 SET_STATE(STATE_GPRS, GPRS_PTM_BCCH);
1427 SET_STATE(STATE_DAT, DAT_IDLE);
1428 SET_STATE(STATE_ATT, ATT_IDLE);
1429 {
1430 PALLOC(stop_cnf, RRGRR_STOP_TASK_CNF);
1431 PSENDX(GRR, stop_cnf);
1432 }
1433 }
1434 break;
1435 case GPRS_PIM_BCCH:
1436 if(stop_task->task.v_stop_ccch NEQ INVALID_MSG)
1437 {
1438 /*
1439 * XXX we still have a problem if the search terminates
1440 * and we want to select to the HPLMN cell just in the moment
1441 * after we have sent the IA_DOWNLINK_IND but before receiving
1442 * the STOP_TASK_REQ. But we should not stop the search
1443 * before, because maybe the IA_DOWNLINK was not actually
1444 * addressing us.
1445 */
1446
1447 if (rr_data->ms_data.req_mm_service EQ FUNC_NET_SRCH_BY_MMI)
1448 {
1449 /*inform MM and stop everything*/
1450 /*
1451 * send Please Retry to the MMI
1452 */
1453 rr_data->sc_data.found_entries = 0;
1454 att_code_rr_abort_ind (RRCS_ABORT_CEL_SEL_FAIL);
1455 }
1456 att_build_idle_req(SC_INDEX, MODE_PACKET_TRANSFER);
1457 SET_STATE(STATE_GPRS, GPRS_PTM_BCCH);
1458 SET_STATE(STATE_DAT, DAT_IDLE);
1459 SET_STATE(STATE_ATT, ATT_IDLE);
1460 {
1461 PALLOC(stop_cnf, RRGRR_STOP_TASK_CNF);
1462 PSENDX(GRR, stop_cnf);
1463 }
1464 }
1465 /*
1466 * If a search is active in idle this is set to false
1467 * it is also set to false on sending the IA_DL to GRR
1468 * If the IA_DL is for us we abort the search and enter TBF
1469 * that means that the start_cr flag is always set to true
1470 * If the IA_DL is not for us then the start_cr flag should only be
1471 * reset if no search is ongoing.
1472 */
1473 if (rr_data->ms_data.req_mm_service NEQ FUNC_NET_SRCH_BY_MMI)
1474 {
1475 rr_data->start_cell_reselection = TRUE;
1476 TRACE_EVENT_P1("start_cell_reselection %d", rr_data->start_cell_reselection);
1477 }
1478 break;
1479 default:
1480 break;
1481 }
1482 }
1483 break;
1484 case LEAVE_PIM_PBCCH:
1485 {
1486 TRACE_EVENT("LEAVE PIM");
1487 /* stop CCCH reading if running */
1488 /* SET_STATE(STATE_DAT, DAT_NULL); avoid reacting to crossing prim */
1489 /* stop CBCH reading if running */
1490 /* stop active ncell procedures */
1491 if (rr_data->ms_data.req_mm_service EQ FUNC_NET_SRCH_BY_MMI)
1492 {
1493 /*inform MM and stop everything*/
1494 /*
1495 * send Please Retry to the MMI
1496 */
1497 rr_data->sc_data.found_entries = 0;
1498 att_code_rr_abort_ind (RRCS_ABORT_CEL_SEL_FAIL);
1499 }
1500 {
1501 PALLOC(mph_mon_ctrl_req, MPH_MON_CTRL_REQ );
1502 mph_mon_ctrl_req->action = LEAVING_PIM_PBCCH;
1503 PSENDX (PL, mph_mon_ctrl_req);
1504 }
1505 {
1506 PALLOC(stop_cnf, RRGRR_STOP_TASK_CNF);
1507 PSENDX(GRR, stop_cnf);
1508 }
1509 /* XXX stop PLMN scan ? */
1510 }
1511 break;
1512 case LEAVE_PAM_PBCCH:
1513 {
1514 PALLOC(mph_mon_ctrl_req, MPH_MON_CTRL_REQ );
1515 TRACE_EVENT("LEAVE PAM");
1516 mph_mon_ctrl_req->action = LEAVING_PAM_PBCCH;
1517 PSENDX (PL, mph_mon_ctrl_req);
1518 {
1519 PALLOC(stop_cnf, RRGRR_STOP_TASK_CNF);
1520 PSENDX(GRR, stop_cnf);
1521 }
1522 }
1523 break;
1524 case LEAVE_PTM_PBCCH:
1525
1526 {
1527 PALLOC(mph_mon_ctrl_req, MPH_MON_CTRL_REQ );
1528 TRACE_EVENT("LEAVE PTM");
1529 mph_mon_ctrl_req->action = LEAVING_PTM_PBCCH;
1530 PSENDX (PL, mph_mon_ctrl_req);
1531
1532 {
1533 PALLOC(stop_cnf, RRGRR_STOP_TASK_CNF);
1534 PSENDX(GRR, stop_cnf);
1535 }
1536 }
1537 break;
1538 default:
1539 break;
1540
1541 }
1542 PFREE(stop_task);
1543 }
1544
1545 /*
1546 +-----------------------------------------------------------------------------+
1547 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1548 | STATE : code ROUTINE : dat_rrgrr_activate_req |
1549 +-----------------------------------------------------------------------------+
1550
1551 PURPOSE : Process the primitive RRGRR_ACTIVATE_REQ received from GRR.
1552 This primitive activates RR. RR acts as if the MS is only
1553 GSM service mobile. Monitor CCCH and BCCH.
1554 IN :
1555 OUT :
1556
1557 */
1558
1559 void dat_rrgrr_activate_req (T_RRGRR_ACTIVATE_REQ *act_req)
1560 {
1561 GET_INSTANCE_DATA;
1562 TRACE_EVENT ("dat_rrgrr_activate_req ()");
1563
1564 rr_data->gprs_data.gprs_suspend = act_req->susp_req;
1565 rr_data->gprs_data.rac = act_req->rac;
1566 rr_data->gprs_data.gprs_resump = GPRS_RESUMPTION_ACK;
1567
1568 switch(GET_STATE(STATE_GPRS))
1569 {
1570 case GPRS_PIM_PBCCH:
1571 case GPRS_PAM_PBCCH:
1572 case GPRS_PTM_PBCCH:
1573
1574 /* we need the parameters from GRR to make
1575 * a MO call
1576 */
1577 if(act_req->non_gprs.v_non_gprs)
1578 {
1579 handle_non_gprs_param(&act_req->non_gprs);
1580 }
1581 break;
1582 case GPRS_PIM_BCCH:
1583 /* nothing to do, just wait for MM to start with RR_ESTABLISH_REQ */
1584 /*SET_STATE(STATE_GPRS, GPRS_SUSPENDED_BCCH); do this on
1585 RR_ESTABLISH_REQ */
1586 break;
1587 case GPRS_PAM_BCCH:
1588 case GPRS_PTM_BCCH:
1589 /*
1590 * abort procedures we are doing for GPRS
1591 * and go back to idle mode to wait for the
1592 * RR_ESTABLISH_REQ
1593 */
1594 rr_data->gprs_data.page_mode = PAG_MODE_DEFAULT;
1595 #ifdef REL99
1596 #else
1597 att_return_to_idle();
1598 #endif
1599 SET_STATE(STATE_GPRS, GPRS_PIM_BCCH);
1600 #ifdef REL99
1601 att_return_to_idle();
1602 #endif
1603 break;
1604 default:
1605 break;
1606 }
1607
1608 PFREE (act_req);
1609 }
1610
1611 /*
1612 +-----------------------------------------------------------------------------+
1613 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1614 | STATE : code ROUTINE : dat_set_gprs_resump |
1615 +-----------------------------------------------------------------------------+
1616
1617 PURPOSE : Sets stored GPRS resumption value to the RR_RELEASE_IND primitive
1618 to send.
1619 IN : Pointer to RR_RELEASE_IND primitive.
1620 OUT :
1621
1622 */
1623
1624 void dat_set_gprs_resump (T_RR_RELEASE_IND* rr_release_ind)
1625 {
1626 GET_INSTANCE_DATA;
1627 rr_release_ind->gprs_resumption = rr_data->gprs_data.gprs_resump;
1628 }
1629
1630
1631
1632 /*
1633 +-----------------------------------------------------------------------------+
1634 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1635 | STATE : code ROUTINE : dat_gprs_set_suspended |
1636 +-----------------------------------------------------------------------------+
1637
1638 PURPOSE : Sets state to GPRS_SUSPENDED_PBCCH or GPRS_SUSPENDED_BCCH
1639 IN :
1640 OUT :
1641
1642 */
1643
1644
1645 void dat_gprs_set_suspended(void)
1646 {
1647 GET_INSTANCE_DATA;
1648 switch(GET_STATE(STATE_GPRS))
1649 {
1650 case GPRS_PIM_PBCCH:
1651 case GPRS_PAM_PBCCH:
1652 case GPRS_PTM_PBCCH:
1653 SET_STATE(STATE_GPRS, GPRS_SUSPENDED_PBCCH);
1654 break;
1655 case GPRS_PIM_BCCH:
1656 case GPRS_PAM_BCCH:
1657 case GPRS_PTM_BCCH:
1658 SET_STATE(STATE_GPRS, GPRS_SUSPENDED_BCCH);
1659 break;
1660 default:
1661 break;
1662 }
1663 }
1664
1665 #ifdef REL99
1666 /*
1667 +-----------------------------------------------------------------------------+
1668 | PROJECT : GSM-GPRS (6147) MODULE : RR_GPRS |
1669 | STATE : code ROUTINE : dat_gprs_set_suspended |
1670 +-----------------------------------------------------------------------------+
1671
1672 PURPOSE : Sets state to GPRS_SUSPENDED_PBCCH or GPRS_SUSPENDED_BCCH
1673 IN :
1674 OUT :
1675
1676 */
1677 BOOL dat_gprs_cell_in_ptm(void)
1678 {
1679 GET_INSTANCE_DATA;
1680 switch(GET_STATE(STATE_GPRS))
1681 {
1682 case GPRS_PTM_PBCCH:
1683 case GPRS_PTM_BCCH:
1684 return TRUE;
1685 default:
1686 return FALSE;
1687 }
1688 }
1689 #endif
1690
1691 /*===========================================================================*/
1692 /*
1693 * L O C A L S
1694 */
1695 /*===========================================================================*/
1696 /*
1697 +-----------------------------------------------------------------------------+
1698 | PROJECT : GSM-GPRS (??6147) MODULE : RR_GPRS |
1699 | STATE : code ROUTINE : get_r_bit |
1700 +-----------------------------------------------------------------------------+
1701
1702 PURPOSE : R-bit for the IA-prims
1703 IN : access counter
1704 OUT : r_bit
1705
1706 */
1707
1708 static UBYTE get_r_bit (void)
1709 {
1710 GET_INSTANCE_DATA;
1711 UBYTE r_bit;
1712
1713 switch (rr_data->ms_data.access_counter)
1714 {
1715 case 0:
1716 r_bit = NOT_PRESENT_8BIT;
1717 break;
1718 case 1:
1719 r_bit = CHAN_REQ_SENT_ONCE;
1720 break;
1721 default:
1722 r_bit = CHAN_REQ_SENT_MORE;
1723 break;
1724 }
1725 return r_bit;
1726 }
1727
1728 #endif /* GPRS */
1729 #endif /* RR_DATG_C */