rlc_rrc.c 38.6 KB
Newer Older
Lionel Gauthier's avatar
Lionel Gauthier committed
1
/*******************************************************************************
Lionel Gauthier's avatar
Lionel Gauthier committed
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
    OpenAirInterface
    Copyright(c) 1999 - 2014 Eurecom

    OpenAirInterface is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.


    OpenAirInterface is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with OpenAirInterface.The full GNU General Public License is
   included in this distribution in the file called "COPYING". If not,
   see <http://www.gnu.org/licenses/>.

  Contact Information
  OpenAirInterface Admin: openair_admin@eurecom.fr
  OpenAirInterface Tech : openair_tech@eurecom.fr
  OpenAirInterface Dev  : openair4g-devel@eurecom.fr

ghaddab's avatar
ghaddab committed
26
  Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
Lionel Gauthier's avatar
Lionel Gauthier committed
27 28

 *******************************************************************************/
29 30 31 32 33
/*
                                rlc_rrc.c
                             -------------------
  AUTHOR  : Lionel GAUTHIER
  COMPANY : EURECOM
Lionel Gauthier's avatar
Lionel Gauthier committed
34
  EMAIL   : Lionel.Gauthier at eurecom dot fr
35 36 37 38 39 40 41 42
*/

#define RLC_RRC_C
#include "rlc.h"
#include "rlc_am.h"
#include "rlc_um.h"
#include "rlc_tm.h"
#include "UTIL/LOG/log.h"
43 44 45
#ifdef OAI_EMU
#include "UTIL/OCG/OCG_vars.h"
#endif
46 47 48 49 50 51 52 53 54 55 56
#include "RLC-Config.h"
#include "DRB-ToAddMod.h"
#include "DRB-ToAddModList.h"
#include "SRB-ToAddMod.h"
#include "SRB-ToAddModList.h"
#include "DL-UM-RLC.h"
#ifdef Rel10
#include "PMCH-InfoList-r9.h"
#endif

#include "LAYER2/MAC/extern.h"
57
#include "assertions.h"
58
//-----------------------------------------------------------------------------
59 60 61 62 63 64 65
rlc_op_status_t rrc_rlc_config_asn1_req (const module_id_t           enb_mod_idP,
                                         const module_id_t           ue_mod_idP,
                                         const frame_t               frameP,
                                         const eNB_flag_t            enb_flagP,
                                         const SRB_ToAddModList_t   * const srb2add_listP,
                                         const DRB_ToAddModList_t   * const drb2add_listP,
                                         const DRB_ToReleaseList_t  * const drb2release_listP
Lionel Gauthier's avatar
Lionel Gauthier committed
66
#if defined(Rel10)
67
                                        ,const PMCH_InfoList_r9_t * const pmch_InfoList_r9_pP
Lionel Gauthier's avatar
Lionel Gauthier committed
68 69 70 71 72 73 74 75
#endif
  ) {
  //-----------------------------------------------------------------------------
  rb_id_t                rb_id           = 0;
  logical_chan_id_t      lc_id           = 0;
  DRB_Identity_t         drb_id          = 0;
  DRB_Identity_t*        pdrb_id         = NULL;
  long int               cnt             = 0;
76 77 78 79 80
  const SRB_ToAddMod_t  *srb_toaddmod_p  = NULL;
  const DRB_ToAddMod_t  *drb_toaddmod_p  = NULL;
  rlc_union_t           *rlc_union_p     = NULL;
  hash_key_t             key             = HASHTABLE_QUESTIONABLE_KEY_VALUE;
  hashtable_rc_t         h_rc;
Lionel Gauthier's avatar
Lionel Gauthier committed
81 82 83 84 85
#if defined(Rel10)
  int                        i, j;
  MBMS_SessionInfoList_r9_t *mbms_SessionInfoList_r9_p = NULL;
  MBMS_SessionInfo_r9_t     *MBMS_SessionInfo_p        = NULL;
  mbms_session_id_t          mbms_session_id;
86
  mbms_service_id_t          mbms_service_id;
Lionel Gauthier's avatar
Lionel Gauthier committed
87
  DL_UM_RLC_t                dl_um_rlc;
88 89


90
#endif
91

92 93
  LOG_D(RLC, "[FRAME %5u][%s][RLC_RRC][MOD %u/%u] CONFIG REQ ASN1 \n",
          frameP,
Lionel Gauthier's avatar
Lionel Gauthier committed
94
          (enb_flagP) ? "eNB" : "UE",
95 96 97 98
          enb_mod_idP,
          ue_mod_idP);

#ifdef OAI_EMU
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
    if (enb_flagP) {
        AssertFatal ((enb_mod_idP >= oai_emulation.info.first_enb_local) && (oai_emulation.info.nb_enb_local > 0),
            "eNB module id is too low (%u/%d)!\n",
            enb_mod_idP,
            oai_emulation.info.first_enb_local);
        AssertFatal ((enb_mod_idP < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local)) && (oai_emulation.info.nb_enb_local > 0),
            "eNB module id is too high (%u/%d)!\n",
            enb_mod_idP,
            oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local);
        AssertFatal (ue_mod_idP  < NB_UE_INST,
            "UE module id is too high (%u/%d)!\n",
            ue_mod_idP,
            oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
    } else {
        AssertFatal (ue_mod_idP  < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local),
            "UE module id is too high (%u/%d)!\n",
            ue_mod_idP,
            oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
        AssertFatal (ue_mod_idP  >= oai_emulation.info.first_ue_local,
            "UE module id is too low (%u/%d)!\n",
            ue_mod_idP,
            oai_emulation.info.first_ue_local);
    }
122
#endif
123 124
  if (srb2add_listP != NULL) {
      for (cnt=0;cnt<srb2add_listP->list.count;cnt++) {
125
         rb_id = srb2add_listP->list.array[cnt]->srb_Identity;
126
         lc_id  = rb_id + 2;
127 128

         LOG_D(RLC, "Adding SRB %d, rb_id %d\n",srb2add_listP->list.array[cnt]->srb_Identity,rb_id);
Lionel Gauthier's avatar
Lionel Gauthier committed
129
          srb_toaddmod_p = srb2add_listP->list.array[cnt];
130

Lionel Gauthier's avatar
Lionel Gauthier committed
131 132
          if (srb_toaddmod_p->rlc_Config) {
              switch (srb_toaddmod_p->rlc_Config->present) {
133 134 135
                  case SRB_ToAddMod__rlc_Config_PR_NOTHING:
                      break;
                  case SRB_ToAddMod__rlc_Config_PR_explicitValue:
Lionel Gauthier's avatar
Lionel Gauthier committed
136
                      switch (srb_toaddmod_p->rlc_Config->choice.explicitValue.present) {
137 138 139
                          case RLC_Config_PR_NOTHING:
                              break;
                          case RLC_Config_PR_am:
140 141 142 143 144 145 146 147 148
                              if (rrc_rlc_add_rlc (enb_mod_idP, ue_mod_idP, frameP, enb_flagP, SRB_FLAG_YES, MBMS_FLAG_NO, rb_id, lc_id, RLC_MODE_AM) != NULL) {
                                  config_req_rlc_am_asn1 (
                                      enb_mod_idP,
                                      ue_mod_idP,
                                      frameP,
                                      enb_flagP,
                                      SRB_FLAG_YES,
                                      &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.am,
                                      rb_id);
149
                              } else {
150 151 152 153 154 155
                                  LOG_E(RLC, "[FRAME %5u][%s][RLC_RRC][MOD %u/%u] ERROR IN ALLOCATING SRB %d \n",
                                      frameP,
                                      (enb_flagP) ? "eNB" : "UE",
                                      enb_mod_idP,
                                      ue_mod_idP,
                                      rb_id);
156 157 158
                              }
                              break;
                          case RLC_Config_PR_um_Bi_Directional:
159 160 161 162 163 164 165 166 167 168 169 170 171
                              if (rrc_rlc_add_rlc (enb_mod_idP, ue_mod_idP, frameP, enb_flagP, SRB_FLAG_YES, MBMS_FLAG_NO, rb_id, lc_id, RLC_MODE_UM) != NULL) {
                                  config_req_rlc_um_asn1(
                                      enb_mod_idP,
                                      ue_mod_idP,
                                      frameP,
                                      enb_flagP,
                                      SRB_FLAG_YES,
                                      MBMS_FLAG_NO,
                                      UNUSED_PARAM_MBMS_SESSION_ID,
                                      UNUSED_PARAM_MBMS_SERVICE_ID,
                                      &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.um_Bi_Directional.ul_UM_RLC,
                                      &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.um_Bi_Directional.dl_UM_RLC,
                                      rb_id);
172
                              } else {
173 174 175 176 177 178
                                  LOG_E(RLC, "[FRAME %5u][%s][RLC_RRC][MOD %u/%u] ERROR IN ALLOCATING SRB %d \n",
                                      frameP,
                                      (enb_flagP) ? "eNB" : "UE",
                                      enb_mod_idP,
                                      ue_mod_idP,
                                      rb_id);
179 180 181
                              }
                              break;
                          case RLC_Config_PR_um_Uni_Directional_UL:
182 183 184 185 186 187 188 189 190 191 192 193 194
                              if (rrc_rlc_add_rlc (enb_mod_idP, ue_mod_idP, frameP, enb_flagP, SRB_FLAG_YES, MBMS_FLAG_NO, rb_id, lc_id, RLC_MODE_UM) != NULL) {
                                  config_req_rlc_um_asn1(
                                      enb_mod_idP,
                                      ue_mod_idP,
                                      frameP,
                                      enb_flagP,
                                      SRB_FLAG_YES,
                                      MBMS_FLAG_NO,
                                      UNUSED_PARAM_MBMS_SESSION_ID,
                                      UNUSED_PARAM_MBMS_SERVICE_ID,
                                      &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.um_Uni_Directional_UL.ul_UM_RLC,
                                      NULL,
                                      rb_id);
195
                              } else {
196 197 198 199 200 201
                                  LOG_E(RLC, "[FRAME %5u][%s][RLC_RRC][MOD %u/%u] ERROR IN ALLOCATING SRB %d \n",
                                      frameP,
                                      (enb_flagP) ? "eNB" : "UE",
                                      enb_mod_idP,
                                      ue_mod_idP,
                                      rb_id);
202 203 204
                              }
                              break;
                          case RLC_Config_PR_um_Uni_Directional_DL:
205 206 207 208 209 210 211 212 213 214 215 216 217
                              if (rrc_rlc_add_rlc (enb_mod_idP, ue_mod_idP, frameP, enb_flagP, SRB_FLAG_YES, MBMS_FLAG_NO, rb_id, lc_id, RLC_MODE_UM) != NULL) {
                                  config_req_rlc_um_asn1(
                                      enb_mod_idP,
                                      ue_mod_idP,
                                      frameP,
                                      enb_flagP,
                                      SRB_FLAG_YES,
                                      MBMS_FLAG_NO,
                                      UNUSED_PARAM_MBMS_SESSION_ID,
                                      UNUSED_PARAM_MBMS_SERVICE_ID,
                                      NULL,
                                      &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.um_Uni_Directional_DL.dl_UM_RLC,
                                      rb_id);
218
                              } else {
219 220 221 222 223 224
                                  LOG_E(RLC, "[FRAME %5u][%s][RLC_RRC][MOD %u/%u] ERROR IN ALLOCATING SRB %d \n",
                                      frameP,
                                      (enb_flagP) ? "eNB" : "UE",
                                       enb_mod_idP,
                                       ue_mod_idP,
                                       rb_id);
225 226
                              }
                              break;
227

Cedric Roux's avatar
Cedric Roux committed
228
                          default:
229 230
                              LOG_E(RLC, "[FRAME %5u][%s][RLC_RRC][MOD %u/%u] UNKNOWN RLC CONFIG %d \n",
                                      frameP,
Lionel Gauthier's avatar
Lionel Gauthier committed
231
                                      (enb_flagP) ? "eNB" : "UE",
232 233
                                      enb_mod_idP,
                                      ue_mod_idP,
Lionel Gauthier's avatar
Lionel Gauthier committed
234
                                      srb_toaddmod_p->rlc_Config->choice.explicitValue.present);
Cedric Roux's avatar
Cedric Roux committed
235
                              break;
236 237 238 239
                      }
                      break;
                  case SRB_ToAddMod__rlc_Config_PR_defaultValue:
#warning TO DO SRB_ToAddMod__rlc_Config_PR_defaultValue
240 241 242 243 244 245 246 247 248 249 250 251 252
                    if (rrc_rlc_add_rlc   (enb_mod_idP, ue_mod_idP, frameP, enb_flagP, SRB_FLAG_YES, MBMS_FLAG_NO, rb_id, lc_id, RLC_MODE_UM) != NULL) {
                        config_req_rlc_um_asn1(
                            enb_mod_idP,
                            ue_mod_idP,
                            frameP,
                            enb_flagP,
                            SRB_FLAG_YES,
                            MBMS_FLAG_NO,
                            UNUSED_PARAM_MBMS_SESSION_ID,
                            UNUSED_PARAM_MBMS_SERVICE_ID,
                            NULL, // TO DO DEFAULT CONFIG
                            NULL, // TO DO DEFAULT CONFIG
                            rb_id);
253
                      } else {
254
                          LOG_D(RLC, "[FRAME %5u][%s][RLC_RRC][MOD %u/%u] ERROR IN ALLOCATING SRB %d \n",
255
                                  frameP,
Lionel Gauthier's avatar
Lionel Gauthier committed
256
                                  (enb_flagP) ? "eNB" : "UE",
257 258 259
                                  enb_mod_idP,
                                  ue_mod_idP,
                                  rb_id);
260 261 262 263 264 265 266 267 268
                      }
                      break;
                  default:;
              }
          }
      }
  }
  if (drb2add_listP != NULL) {
      for (cnt=0;cnt<drb2add_listP->list.count;cnt++) {
Lionel Gauthier's avatar
Lionel Gauthier committed
269
          drb_toaddmod_p = drb2add_listP->list.array[cnt];
270

271 272 273 274
          drb_id = drb_toaddmod_p->drb_Identity;
          lc_id  = drb_id + 2;

          LOG_D(RLC, "Adding DRB %d, lc_id %d\n",drb_id,lc_id);
275

276

Lionel Gauthier's avatar
Lionel Gauthier committed
277
          if (drb_toaddmod_p->rlc_Config) {
278

Lionel Gauthier's avatar
Lionel Gauthier committed
279
              switch (drb_toaddmod_p->rlc_Config->present) {
280 281 282
                  case RLC_Config_PR_NOTHING:
                      break;
                  case RLC_Config_PR_am:
283 284 285 286 287 288 289 290 291
                      if (rrc_rlc_add_rlc (enb_mod_idP, ue_mod_idP, frameP, enb_flagP, SRB_FLAG_NO, MBMS_FLAG_NO, drb_id, lc_id, RLC_MODE_AM) != NULL) {
                          config_req_rlc_am_asn1 (
                              enb_mod_idP,
                              ue_mod_idP,
                              frameP,
                              enb_flagP,
                              SRB_FLAG_NO,
                              &drb_toaddmod_p->rlc_Config->choice.am,
                              drb_id);
292 293 294
                      }
                      break;
                  case RLC_Config_PR_um_Bi_Directional:
295 296 297 298 299 300 301 302 303 304 305 306 307
                      if (rrc_rlc_add_rlc (enb_mod_idP, ue_mod_idP, frameP, enb_flagP, SRB_FLAG_NO, MBMS_FLAG_NO, drb_id, lc_id, RLC_MODE_UM) != NULL) {
                          config_req_rlc_um_asn1(
                              enb_mod_idP,
                              ue_mod_idP,
                              frameP,
                              enb_flagP,
                              SRB_FLAG_NO,
                              MBMS_FLAG_NO,
                              UNUSED_PARAM_MBMS_SESSION_ID,
                              UNUSED_PARAM_MBMS_SERVICE_ID,
                              &drb_toaddmod_p->rlc_Config->choice.um_Bi_Directional.ul_UM_RLC,
                              &drb_toaddmod_p->rlc_Config->choice.um_Bi_Directional.dl_UM_RLC,
                              drb_id);
308 309 310
                      }
                      break;
                  case RLC_Config_PR_um_Uni_Directional_UL:
311 312 313 314 315 316 317 318 319 320 321 322 323
                      if (rrc_rlc_add_rlc (enb_mod_idP, ue_mod_idP, frameP, enb_flagP, SRB_FLAG_NO, MBMS_FLAG_NO, drb_id, lc_id, RLC_MODE_UM) != NULL) {
                          config_req_rlc_um_asn1(
                              enb_mod_idP,
                              ue_mod_idP,
                              frameP,
                              enb_flagP,
                              SRB_FLAG_NO,
                              MBMS_FLAG_NO,
                              UNUSED_PARAM_MBMS_SESSION_ID,
                              UNUSED_PARAM_MBMS_SERVICE_ID,
                              &drb_toaddmod_p->rlc_Config->choice.um_Uni_Directional_UL.ul_UM_RLC,
                              NULL,
                              drb_id);
324 325 326
                      }
                      break;
                  case RLC_Config_PR_um_Uni_Directional_DL:
327 328 329 330 331 332 333 334 335 336 337 338 339
                      if (rrc_rlc_add_rlc (enb_mod_idP, ue_mod_idP, frameP, enb_flagP, SRB_FLAG_NO, MBMS_FLAG_NO, drb_id, lc_id, RLC_MODE_UM) != NULL) {
                          config_req_rlc_um_asn1(
                              enb_mod_idP,
                              ue_mod_idP,
                              frameP,
                              enb_flagP,
                              SRB_FLAG_NO,
                              MBMS_FLAG_NO,
                              UNUSED_PARAM_MBMS_SESSION_ID,
                              UNUSED_PARAM_MBMS_SERVICE_ID,
                              NULL,
                              &drb_toaddmod_p->rlc_Config->choice.um_Uni_Directional_DL.dl_UM_RLC,
                              drb_id);
340 341 342
                      }
                      break;
                  default:
Lionel Gauthier's avatar
Lionel Gauthier committed
343
                      LOG_W(RLC, "[FRAME %5u][%s][RLC_RRC][MOD %u/%u][RB %u] unknown drb_toaddmod_p->rlc_Config->present \n",
344
                              frameP,
Lionel Gauthier's avatar
Lionel Gauthier committed
345
                              (enb_flagP) ? "eNB" : "UE",
346 347 348
                              enb_mod_idP,
                              ue_mod_idP,
                              drb_id);
349 350 351 352 353
              }
          }
      }
  }
  if (drb2release_listP != NULL) {
354 355
      for (cnt=0;cnt<drb2release_listP->list.count;cnt++) {
          pdrb_id = drb2release_listP->list.array[cnt];
356
          rrc_rlc_remove_rlc(enb_mod_idP, ue_mod_idP, frameP, enb_flagP, SRB_FLAG_NO, MBMS_FLAG_NO, *pdrb_id);
357
      }
358 359
  }

Lionel Gauthier's avatar
Lionel Gauthier committed
360
#if defined(Rel10)
361

Lionel Gauthier's avatar
Lionel Gauthier committed
362 363 364 365 366
  if (pmch_InfoList_r9_pP != NULL) {
      for (i=0;i<pmch_InfoList_r9_pP->list.count;i++) {
          mbms_SessionInfoList_r9_p = &(pmch_InfoList_r9_pP->list.array[i]->mbms_SessionInfoList_r9);
          for (j=0;j<mbms_SessionInfoList_r9_p->list.count;j++) {
              MBMS_SessionInfo_p = mbms_SessionInfoList_r9_p->list.array[j];
367 368 369
              mbms_session_id    = MBMS_SessionInfo_p->sessionId_r9->buf[0];
              lc_id              = mbms_session_id;
              mbms_service_id    = MBMS_SessionInfo_p->tmgi_r9.serviceId_r9.buf[2]; //serviceId is 3-octet string
370

Lionel Gauthier's avatar
Lionel Gauthier committed
371 372
              // can set the mch_id = i
              if (enb_flagP) {
Lionel Gauthier's avatar
Lionel Gauthier committed
373
                rb_id =  (mbms_service_id * maxSessionPerPMCH ) + mbms_session_id;//+ (maxDRB + 3) * MAX_MOBILES_PER_ENB; // 1
374 375
                rlc_mbms_lcid2service_session_id_eNB[enb_mod_idP][lc_id].service_id                     = mbms_service_id;
                rlc_mbms_lcid2service_session_id_eNB[enb_mod_idP][lc_id].session_id                     = mbms_session_id;
376

377
                rlc_mbms_enb_set_lcid_by_rb_id(enb_mod_idP,rb_id,lc_id);
378
              } else {
Lionel Gauthier's avatar
Lionel Gauthier committed
379
                rb_id =  (mbms_service_id * maxSessionPerPMCH ) + mbms_session_id; // + (maxDRB + 3); // 15
380 381 382
                rlc_mbms_lcid2service_session_id_ue[ue_mod_idP][lc_id].service_id                    = mbms_service_id;
                rlc_mbms_lcid2service_session_id_ue[ue_mod_idP][lc_id].session_id                    = mbms_session_id;
                rlc_mbms_ue_set_lcid_by_rb_id(ue_mod_idP,rb_id,lc_id);
383
              }
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400
              key = RLC_COLL_KEY_MBMS_VALUE(enb_mod_idP, ue_mod_idP, enb_flagP, mbms_service_id, mbms_session_id);

              h_rc = hashtable_get(rlc_coll_p, key, (void**)&rlc_union_p);
              if (h_rc == HASH_TABLE_KEY_NOT_EXISTS) {
                  rlc_union_p = rrc_rlc_add_rlc   (
                      enb_mod_idP,
                      ue_mod_idP,
                      frameP,
                      enb_flagP,
                      SRB_FLAG_NO,
                      MBMS_FLAG_YES,
                      rb_id,
                      lc_id,
                      RLC_MODE_UM);
                  AssertFatal(rlc_union_p != NULL, "ADD MBMS RLC UM FAILED");
              }

401 402 403 404 405 406 407 408 409 410
              LOG_D(RLC, "[FRAME %5u][%s][RLC_RRC][MOD %u/%u] CONFIG REQ MBMS ASN1 LC ID %u RB ID %u SESSION ID %u SERVICE ID %u\n",
                    frameP,
                    (enb_flagP) ? "eNB" : "UE",
                    enb_mod_idP,
                    ue_mod_idP,
                    lc_id,
                    rb_id,
                    mbms_session_id,
                    mbms_service_id
                   );
Lionel Gauthier's avatar
Lionel Gauthier committed
411 412 413 414
              dl_um_rlc.sn_FieldLength = SN_FieldLength_size5;
              dl_um_rlc.t_Reordering   = T_Reordering_ms0;

              config_req_rlc_um_asn1 (
415 416 417 418 419 420 421 422 423 424 425
                  enb_mod_idP,
                  ue_mod_idP,
                  frameP,
                  enb_flagP,
                  SRB_FLAG_NO,
                  MBMS_FLAG_YES,
                  mbms_session_id,
                  mbms_service_id,
                  NULL,
                  &dl_um_rlc,
                  rb_id);
426 427 428
          }
      }
  }
429
#endif
430

431 432
  LOG_D(RLC, "[FRAME %5u][%s][RLC_RRC][MOD %u/%u] CONFIG REQ ASN1 END \n",
         frameP,
Lionel Gauthier's avatar
Lionel Gauthier committed
433 434
         (enb_flagP) ? "eNB" : "UE",
         enb_flagP,
435 436
         enb_mod_idP,
         ue_mod_idP);
437 438 439
  return RLC_OP_STATUS_OK;
}
//-----------------------------------------------------------------------------
440 441
void
rb_free_rlc_union (void *rlcu_pP)
442 443
{
//-----------------------------------------------------------------------------
444 445 446 447 448 449 450 451 452 453 454 455 456 457
  rlc_union_t * rlcu_p;
    if (rlcu_pP) {
        rlcu_p = (rlc_union_t *)(rlcu_pP);
        switch (rlcu_p->mode) {
          case RLC_MODE_AM:
              rlc_am_cleanup(&rlcu_p->rlc.am);
              break;
          case RLC_MODE_UM:
              rlc_um_cleanup(&rlcu_p->rlc.um);
              break;
          case RLC_MODE_TM:
              rlc_tm_cleanup(&rlcu_p->rlc.tm);
              break;
          default:
458 459 460 461
            LOG_W(RLC,
                "%s %p unknown RLC type\n",
                __FUNCTION__,
                rlcu_pP);
462 463
            break;
        }
464 465 466 467
        LOG_D(RLC,
            "%s %p \n",
            __FUNCTION__,
            rlcu_pP);
468 469
        free(rlcu_p);
    }
470
}
471

Lionel Gauthier's avatar
 
Lionel Gauthier committed
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502
//-----------------------------------------------------------------------------
rlc_op_status_t rrc_rlc_remove_ue (
    const module_id_t enb_mod_idP,
    const module_id_t ue_mod_idP,
    const frame_t     frameP,
    const eNB_flag_t  enb_flagP) {
//-----------------------------------------------------------------------------
    logical_chan_id_t      lcid            = 0;
    rb_id_t                rb_id;

    for (rb_id = 1; rb_id <= 2; rb_id++) {
        rrc_rlc_remove_rlc(enb_mod_idP,
                           ue_mod_idP,
                           frameP,
                           enb_flagP,
                           SRB_FLAG_YES,
                           MBMS_FLAG_NO,
                           rb_id);
    }
    for (rb_id = 1; rb_id <= maxDRB; rb_id++) {
        rrc_rlc_remove_rlc(enb_mod_idP,
                           ue_mod_idP,
                           frameP,
                           enb_flagP,
                           SRB_FLAG_NO,
                           MBMS_FLAG_NO,
                           rb_id);
    }
    return RLC_OP_STATUS_OK;
}

503
//-----------------------------------------------------------------------------
504 505 506 507 508 509 510 511
rlc_op_status_t rrc_rlc_remove_rlc   (
    const module_id_t enb_mod_idP,
    const module_id_t ue_mod_idP,
    const frame_t     frameP,
    const eNB_flag_t  enb_flagP,
    const srb_flag_t  srb_flagP,
    const MBMS_flag_t MBMS_flagP,
    const rb_id_t     rb_idP) {
512
//-----------------------------------------------------------------------------
513 514 515
    logical_chan_id_t      lcid            = 0;
    hash_key_t             key             = HASHTABLE_QUESTIONABLE_KEY_VALUE;
    hashtable_rc_t         h_rc;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
516
    rlc_union_t           *rlc_union_p = NULL;
517 518 519
#ifdef Rel10
    rlc_mbms_id_t         *mbms_id_p  = NULL;
#endif
520
#ifdef OAI_EMU
521
    AssertFatal ((enb_mod_idP >= oai_emulation.info.first_enb_local) && (oai_emulation.info.nb_enb_local > 0),
522 523 524 525 526 527 528
        "eNB module id is too low (%u/%d)!\n",
        enb_mod_idP,
        oai_emulation.info.first_enb_local);
    AssertFatal (enb_mod_idP < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local),
        "eNB module id is too high (%u/%d)!\n",
        enb_mod_idP,
        oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local);
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
    if (enb_flagP) {
        AssertFatal (ue_mod_idP  < NB_UE_INST,
            "UE module id is too high (%u/%d)!\n",
            ue_mod_idP,
            oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
    } else {
        AssertFatal (ue_mod_idP  < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local),
            "UE module id is too high (%u/%d)!\n",
            ue_mod_idP,
            oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
        AssertFatal (ue_mod_idP  >= oai_emulation.info.first_ue_local,
            "UE module id is too low (%u/%d)!\n",
            ue_mod_idP,
            oai_emulation.info.first_ue_local);
    }
544
#endif
545

546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570
#ifdef Rel10
  if (MBMS_flagP == TRUE) {
      if (enb_flagP) {
          lcid = rlc_mbms_enb_get_lcid_by_rb_id(enb_mod_idP,rb_idP);
          mbms_id_p = &rlc_mbms_lcid2service_session_id_eNB[enb_mod_idP][lcid];

          rlc_mbms_lcid2service_session_id_eNB[enb_mod_idP][lcid].service_id = 0;
          rlc_mbms_lcid2service_session_id_eNB[enb_mod_idP][lcid].session_id = 0;
          rlc_mbms_rbid2lcid_ue[enb_mod_idP][rb_idP] = RLC_LC_UNALLOCATED;
      } else {
          lcid = rlc_mbms_ue_get_lcid_by_rb_id(ue_mod_idP,rb_idP);
          mbms_id_p = &rlc_mbms_lcid2service_session_id_ue[ue_mod_idP][lcid];

          rlc_mbms_lcid2service_session_id_eNB[ue_mod_idP][lcid].service_id = 0;
          rlc_mbms_lcid2service_session_id_eNB[ue_mod_idP][lcid].session_id = 0;
          rlc_mbms_rbid2lcid_ue[ue_mod_idP][rb_idP] = RLC_LC_UNALLOCATED;
      }
      key = RLC_COLL_KEY_MBMS_VALUE(enb_mod_idP, ue_mod_idP, enb_flagP, mbms_id_p->service_id, mbms_id_p->session_id);
  } else
#endif
  {
      key = RLC_COLL_KEY_VALUE(enb_mod_idP, ue_mod_idP, enb_flagP, rb_idP, srb_flagP);
  }


571
    AssertFatal (rb_idP < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rb_idP, NB_RB_MAX);
572

Lionel Gauthier's avatar
 
Lionel Gauthier committed
573
    h_rc = hashtable_get(rlc_coll_p, key, &rlc_union_p);
574
    if (h_rc == HASH_TABLE_OK) {
Lionel Gauthier's avatar
 
Lionel Gauthier committed
575 576 577 578 579 580 581 582 583 584 585 586 587
        switch (rlc_union_p->mode) {
            case RLC_MODE_AM:
                rlc_am_cleanup(&rlc_union_p->rlc.am);
                break;
            case RLC_MODE_UM:
                rlc_um_cleanup(&rlc_union_p->rlc.um);
                break;
            case RLC_MODE_TM:
                rlc_tm_cleanup(&rlc_union_p->rlc.tm);
                break;
            default:
        }
        h_rc = hashtable_remove(rlc_coll_p, key);
588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604
        LOG_D(RLC, "[Frame %05u][%s][RLC_RRC][INST %u/%u][%s %u] RELEASED %s\n",
            frameP,
            (enb_flagP) ? "eNB" : "UE",
            enb_mod_idP,
            ue_mod_idP,
            (srb_flagP) ? "SRB" : "DRB",
            rb_idP,
            (srb_flagP) ? "SRB" : "DRB");
    } else if (h_rc == HASH_TABLE_KEY_NOT_EXISTS) {
        LOG_W(RLC, "[Frame %05u][%s][RLC_RRC][INST %u/%u][%s %u] RELEASE : RLC NOT FOUND %s\n",
            frameP,
            (enb_flagP) ? "eNB" : "UE",
            enb_mod_idP,
            ue_mod_idP,
            (srb_flagP) ? "SRB" : "DRB",
            rb_idP,
            (srb_flagP) ? "SRB" : "DRB");
605
    } else {
606 607 608 609 610 611 612 613 614 615
        LOG_E(RLC, "[Frame %05u][%s][RLC_RRC][INST %u/%u][%s %u] RELEASE : INTERNAL ERROR %s\n",
            frameP,
            (enb_flagP) ? "eNB" : "UE",
            enb_mod_idP,
            ue_mod_idP,
            (srb_flagP) ? "SRB" : "DRB",
            rb_idP,
            (srb_flagP) ? "SRB" : "DRB");    }

    return RLC_OP_STATUS_OK;
616 617
}
//-----------------------------------------------------------------------------
618 619 620 621 622 623 624 625 626 627
rlc_union_t* rrc_rlc_add_rlc   (
    const module_id_t       enb_mod_idP,
    const module_id_t       ue_mod_idP,
    const frame_t           frameP,
    const eNB_flag_t        enb_flagP,
    const srb_flag_t        srb_flagP,
    const MBMS_flag_t       MBMS_flagP,
    const rb_id_t           rb_idP,
    const logical_chan_id_t chan_idP,
    const rlc_mode_t        rlc_modeP) {
628
//-----------------------------------------------------------------------------
629 630 631 632 633 634 635
  hash_key_t             key         = HASHTABLE_QUESTIONABLE_KEY_VALUE;
  hashtable_rc_t         h_rc;
  rlc_union_t           *rlc_union_p = NULL;
#ifdef Rel10
    rlc_mbms_id_t         *mbms_id_p  = NULL;
    logical_chan_id_t      lcid            = 0;
#endif
636

637
#ifdef OAI_EMU
638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660
    if (enb_flagP) {
        AssertFatal ((enb_mod_idP >= oai_emulation.info.first_enb_local) && (oai_emulation.info.nb_enb_local > 0),
            "eNB module id is too low (%u/%d)!\n",
            enb_mod_idP,
            oai_emulation.info.first_enb_local);
        AssertFatal ((enb_mod_idP < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local)) && (oai_emulation.info.nb_enb_local > 0),
            "eNB module id is too high (%u/%d)!\n",
            enb_mod_idP,
            oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local);
        AssertFatal (ue_mod_idP  < NB_UE_INST,
            "UE module id is too high (%u/%d)!\n",
            ue_mod_idP,
            oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
    } else {
        AssertFatal (ue_mod_idP  < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local),
            "UE module id is too high (%u/%d)!\n",
            ue_mod_idP,
            oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
        AssertFatal (ue_mod_idP  >= oai_emulation.info.first_ue_local,
            "UE module id is too low (%u/%d)!\n",
            ue_mod_idP,
            oai_emulation.info.first_ue_local);
    }
661
#endif
Lionel Gauthier's avatar
Lionel Gauthier committed
662 663 664 665
    if (MBMS_flagP == FALSE) {
        AssertFatal (rb_idP < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rb_idP, NB_RB_MAX);
        AssertFatal (chan_idP < RLC_MAX_LC, "LC id is too high (%u/%d)!\n", chan_idP, RLC_MAX_LC);
    }
666

667 668 669 670
#ifdef Rel10
  if (MBMS_flagP == TRUE) {
      if (enb_flagP) {
          lcid = rlc_mbms_enb_get_lcid_by_rb_id(enb_mod_idP,rb_idP);
Lionel Gauthier's avatar
Lionel Gauthier committed
671 672 673 674 675
          LOG_I(RLC,
                  "[Frame %05u] lcid %d = rlc_mbms_enb_get_lcid_by_rb_id(enb_mod_idP %u, rb_idP %u)\n",
                  frameP,lcid, enb_mod_idP, rb_idP);

          mbms_id_p = &rlc_mbms_lcid2service_session_id_eNB[enb_mod_idP][lcid];
676

Lionel Gauthier's avatar
Lionel Gauthier committed
677 678 679
          //LG 2014-04-15rlc_mbms_lcid2service_session_id_eNB[enb_mod_idP][lcid].service_id = 0;
          //LG 2014-04-15rlc_mbms_lcid2service_session_id_eNB[enb_mod_idP][lcid].session_id = 0;
          //LG 2014-04-15rlc_mbms_rbid2lcid_eNB[enb_mod_idP][rb_idP] = RLC_LC_UNALLOCATED;
680 681
      } else {
          lcid = rlc_mbms_ue_get_lcid_by_rb_id(ue_mod_idP,rb_idP);
Lionel Gauthier's avatar
Lionel Gauthier committed
682
          mbms_id_p = &rlc_mbms_lcid2service_session_id_ue[ue_mod_idP][lcid];
683

Lionel Gauthier's avatar
Lionel Gauthier committed
684 685 686
          //LG 2014-04-15rlc_mbms_lcid2service_session_id_eNB[ue_mod_idP][lcid].service_id = 0;
          //LG 2014-04-15rlc_mbms_lcid2service_session_id_eNB[ue_mod_idP][lcid].session_id = 0;
          //LG 2014-04-15rlc_mbms_rbid2lcid_ue[ue_mod_idP][rb_idP] = RLC_LC_UNALLOCATED;
687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710
      }
      key = RLC_COLL_KEY_MBMS_VALUE(enb_mod_idP, ue_mod_idP, enb_flagP, mbms_id_p->service_id, mbms_id_p->session_id);
  } else
#endif
  {
      key = RLC_COLL_KEY_VALUE(enb_mod_idP, ue_mod_idP, enb_flagP, rb_idP, srb_flagP);
  }

  h_rc = hashtable_get(rlc_coll_p, key, (void**)&rlc_union_p);
  if (h_rc == HASH_TABLE_OK) {
      LOG_W(RLC, "[Frame %05u][%s][RLC_RRC][INST %u/%u][%s %u] rrc_rlc_add_rlc , already exist %s\n",
          frameP,
          (enb_flagP) ? "eNB" : "UE",
          enb_mod_idP,
          ue_mod_idP,
          (srb_flagP) ? "SRB" : "DRB",
          rb_idP,
          (srb_flagP) ? "SRB" : "DRB");
      AssertFatal(rlc_union_p->mode == rlc_modeP, "Error rrc_rlc_add_rlc , already exist but RLC mode differ");
      return rlc_union_p;
  } else if (h_rc == HASH_TABLE_KEY_NOT_EXISTS) {
      rlc_union_p = calloc(1, sizeof(rlc_union_t));
      h_rc = hashtable_insert(rlc_coll_p, key, rlc_union_p);
      if (h_rc == HASH_TABLE_OK) {
Lionel Gauthier's avatar
Lionel Gauthier committed
711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731
#ifdef Rel10
          if (MBMS_flagP == TRUE) {
              LOG_I(RLC, "[Frame %05u][%s][RLC_RRC][INST %u/%u] RLC service id %u session id %u rrc_rlc_add_rlc\n",
                  frameP,
                  (enb_flagP) ? "eNB" : "UE",
                  enb_mod_idP,
                  ue_mod_idP,
                  mbms_id_p->service_id,
                  mbms_id_p->session_id);
          } else
#endif
          {
              LOG_I(RLC, "[Frame %05u][%s][RLC_RRC][INST %u/%u][%s %u] rrc_rlc_add_rlc  %s\n",
                  frameP,
                  (enb_flagP) ? "eNB" : "UE",
                  enb_mod_idP,
                  ue_mod_idP,
                  (srb_flagP) ? "SRB" : "DRB",
                  rb_idP,
                  (srb_flagP) ? "SRB" : "DRB");
          }
732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757
          rlc_union_p->mode = rlc_modeP;
          return rlc_union_p;
      } else {
          LOG_E(RLC, "[Frame %05u][%s][RLC_RRC][INST %u/%u][%s %u] rrc_rlc_add_rlc  FAILED %s\n",
              frameP,
              (enb_flagP) ? "eNB" : "UE",
              enb_mod_idP,
              ue_mod_idP,
              (srb_flagP) ? "SRB" : "DRB",
              rb_idP,
              (srb_flagP) ? "SRB" : "DRB");
          free(rlc_union_p);
          rlc_union_p = NULL;
          return NULL;
      }
  } else {
      LOG_E(RLC, "[Frame %05u][%s][RLC_RRC][INST %u/%u][%s %u] rrc_rlc_add_rlc , INTERNAL ERROR %s\n",
          frameP,
          (enb_flagP) ? "eNB" : "UE",
          enb_mod_idP,
          ue_mod_idP,
          (srb_flagP) ? "SRB" : "DRB",
          rb_idP,
          (srb_flagP) ? "SRB" : "DRB");
  }
  return NULL;
758 759
}
//-----------------------------------------------------------------------------
760 761 762 763 764 765 766 767 768 769
rlc_op_status_t rrc_rlc_config_req   (
    const module_id_t     enb_mod_idP,
    const module_id_t     ue_mod_idP,
    const frame_t         frameP,
    const eNB_flag_t      enb_flagP,
    const srb_flag_t      srb_flagP,
    const MBMS_flag_t     mbms_flagP,
    const config_action_t actionP,
    const rb_id_t         rb_idP,
    const rlc_info_t      rlc_infoP) {
770 771 772
//-----------------------------------------------------------------------------
    rlc_op_status_t status;

773
    LOG_D(RLC, "[FRAME %05u][%s][RLC][MOD %u/%u] CONFIG_REQ for Rab %u\n",
774
            frameP,
Lionel Gauthier's avatar
Lionel Gauthier committed
775
            (enb_flagP) ? "eNB" : "UE",
776 777 778 779 780
            enb_mod_idP,
            ue_mod_idP,
            rb_idP);

#ifdef OAI_EMU
781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803
    if (enb_flagP) {
        AssertFatal ((enb_mod_idP >= oai_emulation.info.first_enb_local) && (oai_emulation.info.nb_enb_local > 0),
            "eNB module id is too low (%u/%d)!\n",
            enb_mod_idP,
            oai_emulation.info.first_enb_local);
        AssertFatal ((enb_mod_idP < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local)) && (oai_emulation.info.nb_enb_local > 0),
            "eNB module id is too high (%u/%d)!\n",
            enb_mod_idP,
            oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local);
        AssertFatal (ue_mod_idP  < NB_UE_INST,
            "UE module id is too high (%u/%d)!\n",
            ue_mod_idP,
            oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
    } else {
        AssertFatal (ue_mod_idP  < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local),
            "UE module id is too high (%u/%d)!\n",
            ue_mod_idP,
            oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
        AssertFatal (ue_mod_idP  >= oai_emulation.info.first_ue_local,
            "UE module id is too low (%u/%d)!\n",
            ue_mod_idP,
            oai_emulation.info.first_ue_local);
    }
804 805
#endif
    AssertFatal (rb_idP < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rb_idP, NB_RB_MAX);
806 807
    switch (actionP) {

808
        case CONFIG_ACTION_ADD:
809 810
            if (rrc_rlc_add_rlc(enb_mod_idP, ue_mod_idP, frameP, enb_flagP, srb_flagP, MBMS_FLAG_NO, rb_idP, rb_idP, rlc_infoP.rlc_mode) != NULL) {
              return RLC_OP_STATUS_INTERNAL_ERROR;
811
            }
812
            // no break, fall to next case
813
        case CONFIG_ACTION_MODIFY:
814
            switch (rlc_infoP.rlc_mode) {
Lionel Gauthier's avatar
Lionel Gauthier committed
815
                case RLC_MODE_AM:
816
                    LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] MODIFY RB AM\n",
817
                            frameP,
818 819 820 821 822
                            enb_mod_idP,
                            ue_mod_idP,
                            rb_idP);

                    config_req_rlc_am(
823 824 825 826 827 828 829
                        enb_mod_idP,
                        ue_mod_idP,
                        frameP,
                        enb_flagP,
                        srb_flagP,
                        &rlc_infoP.rlc.rlc_am_info,
                        rb_idP);
830
                    break;
Lionel Gauthier's avatar
Lionel Gauthier committed
831
                case RLC_MODE_UM:
832
                    LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] MODIFY RB UM\n",
833
                            frameP,
834 835 836 837
                            enb_mod_idP,
                            ue_mod_idP,
                            rb_idP);
                    config_req_rlc_um(
838 839 840 841 842 843 844
                        enb_mod_idP,
                        ue_mod_idP,
                        frameP,
                        enb_flagP,
                        srb_flagP,
                        &rlc_infoP.rlc.rlc_um_info,
                        rb_idP);
845
                    break;
Lionel Gauthier's avatar
Lionel Gauthier committed
846
                case RLC_MODE_TM:
847
                    LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] MODIFY RB TM\n",
848
                            frameP,
849 850 851 852
                            enb_mod_idP,
                            ue_mod_idP,
                            rb_idP);
                    config_req_rlc_tm(
853 854 855 856 857 858 859
                        enb_mod_idP,
                        ue_mod_idP,
                        frameP,
                        enb_flagP,
                        srb_flagP,
                        &rlc_infoP.rlc.rlc_tm_info,
                        rb_idP);
860 861 862 863 864 865
                    break;
                default:
                return RLC_OP_STATUS_BAD_PARAMETER;
            }
            break;

866
        case CONFIG_ACTION_REMOVE:
867
            return rrc_rlc_remove_rlc(enb_mod_idP, ue_mod_idP, frameP, enb_flagP, srb_flagP, mbms_flagP, rb_idP);
868 869 870 871 872 873 874 875
            break;
        default:
            return RLC_OP_STATUS_BAD_PARAMETER;
    }

    return RLC_OP_STATUS_OK;
}
//-----------------------------------------------------------------------------
876 877 878 879 880 881 882 883 884 885 886
rlc_op_status_t rrc_rlc_data_req     (
    const module_id_t enb_mod_idP,
    const module_id_t ue_mod_idP,
    const frame_t     frameP,
    const eNB_flag_t  enb_flagP,
    const MBMS_flag_t MBMS_flagP,
    const rb_id_t     rb_idP,
    const mui_t       muiP,
    const confirm_t   confirmP,
    const sdu_size_t  sdu_sizeP,
    char* sduP) {
887 888 889 890 891 892
//-----------------------------------------------------------------------------
  mem_block_t*   sdu;

  sdu = get_free_mem_block(sdu_sizeP);
  if (sdu != NULL) {
    memcpy (sdu->data, sduP, sdu_sizeP);
893
    return rlc_data_req(enb_mod_idP, ue_mod_idP, frameP, enb_flagP, SRB_FLAG_YES, MBMS_flagP, rb_idP, muiP, confirmP, sdu_sizeP, sdu);
894 895 896 897 898 899
  } else {
    return RLC_OP_STATUS_INTERNAL_ERROR;
  }
}

//-----------------------------------------------------------------------------
900
void rrc_rlc_register_rrc (rrc_data_ind_cb_t rrc_data_indP, rrc_data_conf_cb_t rrc_data_confP) {
901 902 903 904 905
//-----------------------------------------------------------------------------
   rlc_rrc_data_ind  = rrc_data_indP;
   rlc_rrc_data_conf = rrc_data_confP;
}