rlc.c 33.6 KB
Newer Older
1
/*******************************************************************************
gauthier's avatar
gauthier committed
2 3
    OpenAirInterface
    Copyright(c) 1999 - 2014 Eurecom
4

gauthier's avatar
gauthier committed
5 6 7 8
    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.
9 10


gauthier's avatar
gauthier committed
11 12 13 14
    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.
15

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

gauthier's avatar
gauthier committed
21 22 23 24 25
  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
gauthier's avatar
gauthier committed
27 28

 *******************************************************************************/
gauthier's avatar
gauthier committed
29 30 31 32 33 34 35
/*
                                rlc.c
                             -------------------
  AUTHOR  : Lionel GAUTHIER
  COMPANY : EURECOM
  EMAIL   : Lionel.Gauthier at eurecom dot fr
*/
36 37 38 39 40
#define RLC_C
#include "rlc.h"
#include "mem_block.h"
#include "../MAC/extern.h"
#include "UTIL/LOG/log.h"
gauthier's avatar
gauthier committed
41
#include "UTIL/OCG/OCG_vars.h"
42
#include "UTIL/LOG/vcd_signal_dumper.h"
43 44 45

#include "assertions.h"

46 47 48 49 50 51 52 53 54 55
extern boolean_t pdcp_data_ind(
    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 sdu_size_t sdu_buffer_sizeP,
    mem_block_t* const sdu_buffer_pP);
56

gauthier's avatar
gauthier committed
57
#define DEBUG_RLC_PDCP_INTERFACE
58

gauthier's avatar
gauthier committed
59
#define DEBUG_RLC_DATA_REQ 1
60 61

//-----------------------------------------------------------------------------
62
void rlc_util_print_hex_octets(comp_name_t componentP, unsigned char* dataP, const signed long sizeP)
63 64 65 66 67 68 69 70 71
//-----------------------------------------------------------------------------
{
  unsigned long octet_index = 0;

  if (dataP == NULL) {
    return;
  }


72 73 74 75 76


  LOG_T(componentP, "+-----+-------------------------------------------------+\n");
  LOG_T(componentP, "|     |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |\n");
  LOG_T(componentP, "+-----+-------------------------------------------------+\n");
77 78 79
  for (octet_index = 0; octet_index < sizeP; octet_index++) {
    if ((octet_index % 16) == 0){
      if (octet_index != 0) {
80
        LOG_T(componentP, " |\n");
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
      }
      LOG_T(componentP, " %04d |", octet_index);
    }
    /*
     * Print every single octet in hexadecimal form
     */
    LOG_T(componentP, " %02x", dataP[octet_index]);
    /*
     * Align newline and pipes according to the octets in groups of 2
     */
  }

  /*
   * Append enough spaces and put final pipe
   */
  unsigned char index;
  for (index = octet_index; index < 16; ++index)
    LOG_T(componentP, "   ");
  LOG_T(componentP, " |\n");
}

//-----------------------------------------------------------------------------
gauthier's avatar
gauthier committed
103
rlc_op_status_t rlc_stat_req     (
104 105 106 107 108 109
                  const module_id_t   enb_module_idP,
                  const module_id_t   ue_module_idP,
                  const frame_t       frameP,
                  const eNB_flag_t    enb_flagP,
                  const srb_flag_t    srb_flagP,
                  const rb_id_t       rb_idP,
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
                  unsigned int* stat_tx_pdcp_sdu,
                  unsigned int* stat_tx_pdcp_bytes,
                  unsigned int* stat_tx_pdcp_sdu_discarded,
                  unsigned int* stat_tx_pdcp_bytes_discarded,
                  unsigned int* stat_tx_data_pdu,
                  unsigned int* stat_tx_data_bytes,
                  unsigned int* stat_tx_retransmit_pdu_by_status,
                  unsigned int* stat_tx_retransmit_bytes_by_status,
                  unsigned int* stat_tx_retransmit_pdu,
                  unsigned int* stat_tx_retransmit_bytes,
                  unsigned int* stat_tx_control_pdu,
                  unsigned int* stat_tx_control_bytes,
                  unsigned int* stat_rx_pdcp_sdu,
                  unsigned int* stat_rx_pdcp_bytes,
                  unsigned int* stat_rx_data_pdus_duplicate,
                  unsigned int* stat_rx_data_bytes_duplicate,
                  unsigned int* stat_rx_data_pdu,
                  unsigned int* stat_rx_data_bytes,
                  unsigned int* stat_rx_data_pdu_dropped,
                  unsigned int* stat_rx_data_bytes_dropped,
                  unsigned int* stat_rx_data_pdu_out_of_window,
                  unsigned int* stat_rx_data_bytes_out_of_window,
                  unsigned int* stat_rx_control_pdu,
                  unsigned int* stat_rx_control_bytes,
                  unsigned int* stat_timer_reordering_timed_out,
                  unsigned int* stat_timer_poll_retransmit_timed_out,
                  unsigned int* stat_timer_status_prohibit_timed_out) {
//-----------------------------------------------------------------------------
138 139 140 141
    rlc_mode_t             rlc_mode        = RLC_MODE_NONE;
    rlc_union_t           *rlc_union_p     = NULL;
    hash_key_t             key             = HASHTABLE_QUESTIONABLE_KEY_VALUE;
    hashtable_rc_t         h_rc;
gauthier's avatar
gauthier committed
142 143

#ifdef OAI_EMU
144
    if (enb_flagP) {
145
        AssertFatal ((enb_module_idP >= oai_emulation.info.first_enb_local) && (oai_emulation.info.nb_enb_local > 0),
146
            "eNB module id is too low (%u/%d)!\n",
147
            enb_module_idP,
148
            oai_emulation.info.first_enb_local);
149
        AssertFatal ((enb_module_idP < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local)) && (oai_emulation.info.nb_enb_local > 0),
150
            "eNB module id is too high (%u/%d)!\n",
151
            enb_module_idP,
152
            oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local);
153
        AssertFatal (ue_module_idP  < NB_UE_INST,
154
            "UE module id is too high (%u/%d)!\n",
155
            ue_module_idP,
156 157
            oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
    } else {
158
        AssertFatal (ue_module_idP  < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local),
159
            "UE module id is too high (%u/%d)!\n",
160
            ue_module_idP,
161
            oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
162
        AssertFatal (ue_module_idP  >= oai_emulation.info.first_ue_local,
163
            "UE module id is too low (%u/%d)!\n",
164
            ue_module_idP,
165 166
            oai_emulation.info.first_ue_local);
    }
gauthier's avatar
gauthier committed
167 168
#endif
    AssertFatal (rb_idP < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rb_idP, NB_RB_MAX);
169 170 171 172
    key = RLC_COLL_KEY_VALUE(enb_module_idP, ue_module_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) {
        rlc_mode = rlc_union_p->mode;
gauthier's avatar
gauthier committed
173 174
    }
    switch (rlc_mode) {
gauthier's avatar
gauthier committed
175
        case RLC_MODE_NONE:
gauthier's avatar
gauthier committed
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
            *stat_tx_pdcp_sdu                     = 0;
            *stat_tx_pdcp_bytes                   = 0;
            *stat_tx_pdcp_sdu_discarded           = 0;
            *stat_tx_pdcp_bytes_discarded         = 0;
            *stat_tx_data_pdu                     = 0;
            *stat_tx_data_bytes                   = 0;
            *stat_tx_retransmit_pdu_by_status     = 0;
            *stat_tx_retransmit_bytes_by_status   = 0;
            *stat_tx_retransmit_pdu               = 0;
            *stat_tx_retransmit_bytes             = 0;
            *stat_tx_control_pdu                  = 0;
            *stat_tx_control_bytes                = 0;
            *stat_rx_pdcp_sdu                     = 0;
            *stat_rx_pdcp_bytes                   = 0;
            *stat_rx_data_pdus_duplicate          = 0;
            *stat_rx_data_bytes_duplicate         = 0;
            *stat_rx_data_pdu                     = 0;
            *stat_rx_data_bytes                   = 0;
            *stat_rx_data_pdu_dropped             = 0;
            *stat_rx_data_bytes_dropped           = 0;
            *stat_rx_data_pdu_out_of_window       = 0;
            *stat_rx_data_bytes_out_of_window     = 0;
            *stat_rx_control_pdu                  = 0;
            *stat_rx_control_bytes                = 0;
            *stat_timer_reordering_timed_out      = 0;
            *stat_timer_poll_retransmit_timed_out = 0;
            *stat_timer_status_prohibit_timed_out = 0;
            return RLC_OP_STATUS_BAD_PARAMETER;
            break;

gauthier's avatar
gauthier committed
206
        case RLC_MODE_AM:
207
            rlc_am_stat_req(&rlc_union_p->rlc.am,
gauthier's avatar
gauthier committed
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
                            stat_tx_pdcp_sdu,
                            stat_tx_pdcp_bytes,
                            stat_tx_pdcp_sdu_discarded,
                            stat_tx_pdcp_bytes_discarded,
                            stat_tx_data_pdu,
                            stat_tx_data_bytes,
                            stat_tx_retransmit_pdu_by_status,
                            stat_tx_retransmit_bytes_by_status,
                            stat_tx_retransmit_pdu,
                            stat_tx_retransmit_bytes,
                            stat_tx_control_pdu,
                            stat_tx_control_bytes,
                            stat_rx_pdcp_sdu,
                            stat_rx_pdcp_bytes,
                            stat_rx_data_pdus_duplicate,
                            stat_rx_data_bytes_duplicate,
                            stat_rx_data_pdu,
                            stat_rx_data_bytes,
                            stat_rx_data_pdu_dropped,
                            stat_rx_data_bytes_dropped,
                            stat_rx_data_pdu_out_of_window,
                            stat_rx_data_bytes_out_of_window,
                            stat_rx_control_pdu,
                            stat_rx_control_bytes,
                            stat_timer_reordering_timed_out,
                            stat_timer_poll_retransmit_timed_out,
                            stat_timer_status_prohibit_timed_out);
                            return RLC_OP_STATUS_OK;
           break;

gauthier's avatar
gauthier committed
238
       case RLC_MODE_UM:
gauthier's avatar
gauthier committed
239 240 241 242 243 244 245 246 247 248 249 250
           *stat_tx_retransmit_pdu_by_status     = 0;
           *stat_tx_retransmit_bytes_by_status   = 0;
           *stat_tx_retransmit_pdu               = 0;
           *stat_tx_retransmit_bytes             = 0;
           *stat_tx_control_pdu                  = 0;
           *stat_tx_control_bytes                = 0;
           *stat_rx_data_pdu_dropped             = 0;
           *stat_rx_data_bytes_dropped           = 0;
           *stat_rx_data_pdu_out_of_window       = 0;
           *stat_rx_data_bytes_out_of_window     = 0;
           *stat_timer_poll_retransmit_timed_out = 0;
           *stat_timer_status_prohibit_timed_out = 0;
251
           rlc_um_stat_req (&rlc_union_p->rlc.um,
gauthier's avatar
gauthier committed
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
                              stat_tx_pdcp_sdu,
                              stat_tx_pdcp_bytes,
                              stat_tx_pdcp_sdu_discarded,
                              stat_tx_pdcp_bytes_discarded,
                              stat_tx_data_pdu,
                              stat_tx_data_bytes,
                              stat_rx_pdcp_sdu,
                              stat_rx_pdcp_bytes,
                              stat_rx_data_pdus_duplicate,
                              stat_rx_data_bytes_duplicate,
                              stat_rx_data_pdu,
                              stat_rx_data_bytes,
                              stat_rx_data_pdu_dropped,
                              stat_rx_data_bytes_dropped,
                              stat_rx_data_pdu_out_of_window,
                              stat_rx_data_bytes_out_of_window,
                              stat_timer_reordering_timed_out);
           return RLC_OP_STATUS_OK;
           break;

gauthier's avatar
gauthier committed
272
       case RLC_MODE_TM:
gauthier's avatar
gauthier committed
273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
           *stat_tx_pdcp_sdu                     = 0;
           *stat_tx_pdcp_bytes                   = 0;
           *stat_tx_pdcp_sdu_discarded           = 0;
           *stat_tx_pdcp_bytes_discarded         = 0;
           *stat_tx_data_pdu                     = 0;
           *stat_tx_data_bytes                   = 0;
           *stat_tx_retransmit_pdu_by_status     = 0;
           *stat_tx_retransmit_bytes_by_status   = 0;
           *stat_tx_retransmit_pdu               = 0;
           *stat_tx_retransmit_bytes             = 0;
           *stat_tx_control_pdu                  = 0;
           *stat_tx_control_bytes                = 0;
           *stat_rx_pdcp_sdu                     = 0;
           *stat_rx_pdcp_bytes                   = 0;
           *stat_rx_data_pdus_duplicate          = 0;
           *stat_rx_data_bytes_duplicate         = 0;
           *stat_rx_data_pdu                     = 0;
           *stat_rx_data_bytes                   = 0;
           *stat_rx_data_pdu_dropped             = 0;
           *stat_rx_data_bytes_dropped           = 0;
           *stat_rx_data_pdu_out_of_window       = 0;
           *stat_rx_data_bytes_out_of_window     = 0;
           *stat_rx_control_pdu                  = 0;
           *stat_rx_control_bytes                = 0;
           *stat_timer_reordering_timed_out      = 0;
           *stat_timer_poll_retransmit_timed_out = 0;
           *stat_timer_status_prohibit_timed_out = 0;
           return RLC_OP_STATUS_BAD_PARAMETER;
           break;

       default:
           *stat_tx_pdcp_sdu                     = 0;
           *stat_tx_pdcp_bytes                   = 0;
           *stat_tx_pdcp_sdu_discarded           = 0;
           *stat_tx_pdcp_bytes_discarded         = 0;
           *stat_tx_data_pdu                     = 0;
           *stat_tx_data_bytes                   = 0;
           *stat_tx_retransmit_pdu_by_status     = 0;
           *stat_tx_retransmit_bytes_by_status   = 0;
           *stat_tx_retransmit_pdu               = 0;
           *stat_tx_retransmit_bytes             = 0;
           *stat_tx_control_pdu                  = 0;
           *stat_tx_control_bytes                = 0;
           *stat_rx_pdcp_sdu                     = 0;
           *stat_rx_pdcp_bytes                   = 0;
           *stat_rx_data_pdus_duplicate          = 0;
           *stat_rx_data_bytes_duplicate         = 0;
           *stat_rx_data_pdu                     = 0;
           *stat_rx_data_bytes                   = 0;
           *stat_rx_data_pdu_dropped             = 0;
           *stat_rx_data_bytes_dropped           = 0;
           *stat_rx_data_pdu_out_of_window       = 0;
           *stat_rx_data_bytes_out_of_window     = 0;
           *stat_rx_control_pdu                  = 0;
           *stat_rx_control_bytes                = 0;

           *stat_timer_poll_retransmit_timed_out = 0;
           *stat_timer_status_prohibit_timed_out = 0;
           return RLC_OP_STATUS_BAD_PARAMETER;
    }
333
}
334

335
//-----------------------------------------------------------------------------
336 337 338 339 340 341 342 343
rlc_op_status_t rlc_data_req     (const module_id_t  enb_module_idP,
                                  const module_id_t  ue_module_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 mui_t        muiP,
344 345
                                  confirm_t    confirmP,
                                  sdu_size_t   sdu_sizeP,
gauthier's avatar
gauthier committed
346
                                  mem_block_t *sdu_pP) {
347
//-----------------------------------------------------------------------------
348
  mem_block_t           *new_sdu_p    = NULL;
gauthier's avatar
gauthier committed
349
  rlc_mode_t             rlc_mode     = RLC_MODE_NONE;
350 351 352 353
  rlc_union_t           *rlc_union_p = NULL;
  hash_key_t             key         = HASHTABLE_QUESTIONABLE_KEY_VALUE;
  hashtable_rc_t         h_rc;

354
#ifdef Rel10
355 356
  rlc_mbms_id_t         *mbms_id_p  = NULL;
  logical_chan_id_t      log_ch_id  = 0;
357 358
#endif
#ifdef DEBUG_RLC_DATA_REQ
gauthier's avatar
gauthier committed
359
  LOG_D(RLC,"rlc_data_req: %s enb id  %u  ue id %u, rb_id %u (MAX %d), muip %d, confirmP %d, sud_sizeP %d, sdu_pP %p\n",
360
        (enb_flagP) ? "eNB" : "UE",
361 362
        enb_module_idP,
        ue_module_idP,
gauthier's avatar
gauthier committed
363 364 365 366 367 368
        rb_idP,
        NB_RAB_MAX,
        muiP,
        confirmP,
        sdu_sizeP,
        sdu_pP);
369
#endif
370 371
#ifdef Rel10
#else
gauthier's avatar
gauthier committed
372
  AssertFatal(MBMS_flagP == 0, "MBMS_flagP %u", MBMS_flagP);
373
#endif
gauthier's avatar
gauthier committed
374
#ifdef OAI_EMU
375
  if (enb_flagP) {
376
      AssertFatal ((enb_module_idP >= oai_emulation.info.first_enb_local) && (oai_emulation.info.nb_enb_local > 0),
377
          "eNB module id is too low (%u/%d)!\n",
378
          enb_module_idP,
379
          oai_emulation.info.first_enb_local);
380
      AssertFatal ((enb_module_idP < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local)) && (oai_emulation.info.nb_enb_local > 0),
381
          "eNB module id is too high (%u/%d)!\n",
382
          enb_module_idP,
383
          oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local);
384
      AssertFatal (ue_module_idP  < NB_UE_INST,
385
          "UE module id is too high (%u/%d)!\n",
386
          ue_module_idP,
387 388
          oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
  } else {
389
      AssertFatal (ue_module_idP  < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local),
390
          "UE module id is too high (%u/%d)!\n",
391
          ue_module_idP,
392
          oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
393
      AssertFatal (ue_module_idP  >= oai_emulation.info.first_ue_local,
394
          "UE module id is too low (%u/%d)!\n",
395
          ue_module_idP,
396 397
          oai_emulation.info.first_ue_local);
  }
gauthier's avatar
gauthier committed
398
#endif
399 400 401 402 403
  if (MBMS_flagP) {
      AssertFatal (rb_idP < NB_RB_MBMS_MAX, "RB id is too high (%u/%d)!\n", rb_idP, NB_RB_MBMS_MAX);
  } else {
      AssertFatal (rb_idP < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rb_idP, NB_RB_MAX);
  }
gauthier's avatar
gauthier committed
404
  DevAssert(sdu_pP != NULL);
405 406 407 408 409 410
  DevCheck(sdu_sizeP > 0, sdu_sizeP, 0, 0);

#ifndef Rel10
  DevCheck(MBMS_flagP == 0, MBMS_flagP, 0, 0);
#endif

411 412
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_IN);

413 414 415
#ifdef Rel10
  if (MBMS_flagP == TRUE) {
      if (enb_flagP) {
416 417
            log_ch_id = rlc_mbms_enb_get_lcid_by_rb_id(enb_module_idP,rb_idP);
            mbms_id_p = &rlc_mbms_lcid2service_session_id_eNB[enb_module_idP][log_ch_id];
418
      } else {
419 420
            log_ch_id = rlc_mbms_ue_get_lcid_by_rb_id(ue_module_idP,rb_idP);
            mbms_id_p = &rlc_mbms_lcid2service_session_id_ue[ue_module_idP][log_ch_id];
gauthier's avatar
gauthier committed
421
      }
422
      key = RLC_COLL_KEY_MBMS_VALUE(enb_module_idP, ue_module_idP, enb_flagP, mbms_id_p->service_id, mbms_id_p->session_id);
423 424 425
  } else
#endif
  {
426 427 428 429 430 431 432 433 434
      key = RLC_COLL_KEY_VALUE(enb_module_idP, ue_module_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) {
      rlc_mode = rlc_union_p->mode;
  } else {
      rlc_mode = RLC_MODE_NONE;
      AssertFatal (0 , "RLC not configured key %llu\n", key);
gauthier's avatar
gauthier committed
435 436
  }

437
  if (MBMS_flagP == 0) {
gauthier's avatar
gauthier committed
438
      LOG_D(RLC, "[FRAME %5u][%s][RLC][INST %u/%u][RB %u] Display of rlc_data_req:\n",
439
          frameP,
440
          (enb_flagP) ? "eNB" : "UE",
441 442
          enb_module_idP,
          ue_module_idP,
gauthier's avatar
gauthier committed
443 444
          rb_idP);
      rlc_util_print_hex_octets(RLC, (unsigned char*)sdu_pP->data, sdu_sizeP);
445 446

#ifdef DEBUG_RLC_DATA_REQ
gauthier's avatar
gauthier committed
447
      LOG_D(RLC,"RLC_TYPE : %d ",rlc_mode);
448
#endif
gauthier's avatar
gauthier committed
449
      switch (rlc_mode) {
gauthier's avatar
gauthier committed
450
          case RLC_MODE_NONE:
gauthier's avatar
gauthier committed
451
              free_mem_block(sdu_pP);
gauthier's avatar
gauthier committed
452
              LOG_E(RLC, "Received RLC_MODE_NONE as rlc_type for %s eNB id  %u, ue id %u, rb_id %u\n",
453
                    (enb_flagP) ? "eNB" : "UE",
454 455
                    enb_module_idP,
                    ue_module_idP,
gauthier's avatar
gauthier committed
456
                    rb_idP);
457
	      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT);
gauthier's avatar
gauthier committed
458
              return RLC_OP_STATUS_BAD_PARAMETER;
459

gauthier's avatar
gauthier committed
460
          case RLC_MODE_AM:
461
#ifdef DEBUG_RLC_DATA_REQ
gauthier's avatar
gauthier committed
462
              msg("RLC_MODE_AM\n");
463
#endif
464
              new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_am_data_req_alloc));
gauthier's avatar
gauthier committed
465

466
              if (new_sdu_p != NULL) {
gauthier's avatar
gauthier committed
467
                  // PROCESS OF COMPRESSION HERE:
468 469
                  memset (new_sdu_p->data, 0, sizeof (struct rlc_am_data_req_alloc));
                  memcpy (&new_sdu_p->data[sizeof (struct rlc_am_data_req_alloc)], &sdu_pP->data[0], sdu_sizeP);
gauthier's avatar
gauthier committed
470

471 472 473 474
                  ((struct rlc_am_data_req *) (new_sdu_p->data))->data_size = sdu_sizeP;
                  ((struct rlc_am_data_req *) (new_sdu_p->data))->conf = confirmP;
                  ((struct rlc_am_data_req *) (new_sdu_p->data))->mui  = muiP;
                  ((struct rlc_am_data_req *) (new_sdu_p->data))->data_offset = sizeof (struct rlc_am_data_req_alloc);
gauthier's avatar
gauthier committed
475 476 477
                  free_mem_block(sdu_pP);
                  LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);

478
                  LOG_D(RLC, "[FRAME %5u][%s][%s][INST %u/%u][%s %u][--- RLC_AM_DATA_REQ/%d Bytes --->][RLC_AM][INST %u/%u][%s %u]\n",
479
                          frameP,
480
                          (enb_flagP) ? "eNB" : "UE",
481 482 483 484
                          (srb_flagP) ? "RRC" : "PDCP",
                          enb_module_idP,
                          ue_module_idP,
                          (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
485 486
                          rb_idP,
                          sdu_sizeP,
487 488 489
                          enb_module_idP,
                          ue_module_idP,
                          (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
490 491
                          rb_idP);
                  LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT);
492
                  rlc_am_data_req(&rlc_union_p->rlc.am, frameP, new_sdu_p);
493
		  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT);
gauthier's avatar
gauthier committed
494 495
                  return RLC_OP_STATUS_OK;
              } else {
496
		vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT);
gauthier's avatar
gauthier committed
497 498 499 500
                  return RLC_OP_STATUS_INTERNAL_ERROR;
              }
              break;

gauthier's avatar
gauthier committed
501
          case RLC_MODE_UM:
502
            new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_um_data_req_alloc));
gauthier's avatar
gauthier committed
503

504
              if (new_sdu_p != NULL) {
gauthier's avatar
gauthier committed
505
                  // PROCESS OF COMPRESSION HERE:
506 507
                  memset (new_sdu_p->data, 0, sizeof (struct rlc_um_data_req_alloc));
                  memcpy (&new_sdu_p->data[sizeof (struct rlc_um_data_req_alloc)], &sdu_pP->data[0], sdu_sizeP);
gauthier's avatar
gauthier committed
508

509 510
                  ((struct rlc_um_data_req *) (new_sdu_p->data))->data_size = sdu_sizeP;
                  ((struct rlc_um_data_req *) (new_sdu_p->data))->data_offset = sizeof (struct rlc_um_data_req_alloc);
gauthier's avatar
gauthier committed
511 512
                  free_mem_block(sdu_pP);

513
                  //LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);
514
                  LOG_D(RLC, "[FRAME %5u][%s][%s][INST %u/%u][%s %u][--- RLC_UM_DATA_REQ/%d Bytes --->][RLC_UM][INST %u/%u][%s %u]\n",
515
                          frameP,
516
                          (enb_flagP) ? "eNB" : "UE",
517 518 519 520
                          (srb_flagP) ? "RRC" : "PDCP",
                          enb_module_idP,
                          ue_module_idP,
                          (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
521 522
                          rb_idP,
                          sdu_sizeP,
523 524 525
                          enb_module_idP,
                          ue_module_idP,
                          (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
526
                          rb_idP);
527
                  //LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT);
528
                  rlc_um_data_req(&rlc_union_p->rlc.um, frameP, new_sdu_p);
529

gauthier's avatar
gauthier committed
530
                  //free_mem_block(new_sdu);
531
		  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT);
gauthier's avatar
gauthier committed
532 533
                  return RLC_OP_STATUS_OK;
              } else {
534 535
		vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT);
		return RLC_OP_STATUS_INTERNAL_ERROR;
gauthier's avatar
gauthier committed
536 537 538
              }
              break;

gauthier's avatar
gauthier committed
539
          case RLC_MODE_TM:
540
            new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_tm_data_req_alloc));
gauthier's avatar
gauthier committed
541

542
              if (new_sdu_p != NULL) {
gauthier's avatar
gauthier committed
543
                  // PROCESS OF COMPRESSION HERE:
544 545
                  memset (new_sdu_p->data, 0, sizeof (struct rlc_tm_data_req_alloc));
                  memcpy (&new_sdu_p->data[sizeof (struct rlc_tm_data_req_alloc)], &sdu_pP->data[0], sdu_sizeP);
gauthier's avatar
gauthier committed
546

547 548
                  ((struct rlc_tm_data_req *) (new_sdu_p->data))->data_size = sdu_sizeP;
                  ((struct rlc_tm_data_req *) (new_sdu_p->data))->data_offset = sizeof (struct rlc_tm_data_req_alloc);
gauthier's avatar
gauthier committed
549 550
                  free_mem_block(sdu_pP);
                  LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);
551
                  LOG_D(RLC, "[FRAME %5u][%s][%s][INST %u/%u][%s %u][--- RLC_TM_DATA_REQ/%d Bytes --->][RLC_TM][INST %u/%u][%s %u]\n",
552
                                 frameP,
553
                                 (enb_flagP) ? "eNB" : "UE",
554 555 556 557
                                 (srb_flagP) ? "RRC" : "PDCP",
                                 enb_module_idP,
                                 ue_module_idP,
                                 (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
558 559
                                 rb_idP,
                                 sdu_sizeP,
560 561 562
                                 enb_module_idP,
                                 ue_module_idP,
                                 (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
563 564
                                 rb_idP);
                  LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT);
565
                  rlc_tm_data_req(&rlc_union_p->rlc.tm, new_sdu_p);
566
		  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT);
gauthier's avatar
gauthier committed
567 568 569
                  return RLC_OP_STATUS_OK;
              } else {
                  //handle_event(ERROR,"FILE %s FONCTION rlc_data_req() LINE %s : out of memory\n", __FILE__, __LINE__);
570 571
		vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT);
		return RLC_OP_STATUS_INTERNAL_ERROR;
gauthier's avatar
gauthier committed
572 573 574 575 576
              }
              break;

          default:
              free_mem_block(sdu_pP);
577
	      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT);
gauthier's avatar
gauthier committed
578 579 580
              return RLC_OP_STATUS_INTERNAL_ERROR;

      }
581

582
#ifdef Rel10
583
  } else { /* MBMS_flag != 0 */
584
	  //  LOG_I(RLC,"DUY rlc_data_req: mbms_rb_id in RLC instant is: %d\n", mbms_rb_id);
gauthier's avatar
gauthier committed
585
          if (sdu_pP != NULL) {
586 587
              if (sdu_sizeP > 0) {
                  LOG_I(RLC,"received a packet with size %d for MBMS \n", sdu_sizeP);
588 589
                  new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_um_data_req_alloc));
                  if (new_sdu_p != NULL) {
590
                      // PROCESS OF COMPRESSION HERE:
591 592 593 594
                      memset (new_sdu_p->data, 0, sizeof (struct rlc_um_data_req_alloc));
                      memcpy (&new_sdu_p->data[sizeof (struct rlc_um_data_req_alloc)], &sdu_pP->data[0], sdu_sizeP);
                      ((struct rlc_um_data_req *) (new_sdu_p->data))->data_size = sdu_sizeP;
                      ((struct rlc_um_data_req *) (new_sdu_p->data))->data_offset = sizeof (struct rlc_um_data_req_alloc);
gauthier's avatar
gauthier committed
595
                      free_mem_block(sdu_pP);
596
                      LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);
597
                          LOG_D(RLC, "[FRAME %5u][%s][%s][INST %u/%u][RB %u][--- RLC_UM_DATA_REQ/%d Bytes (MBMS) --->][RLC_UM][INST %u/%u][RB %u]\n",
598
                            frameP,
599 600 601 602
                            (enb_flagP) ? "eNB" : "UE",
                            (srb_flagP) ? "RRC" : "PDCP",
                            enb_module_idP,
                            ue_module_idP,
gauthier's avatar
gauthier committed
603 604
                            rb_idP,
                            sdu_sizeP,
605 606
                            enb_module_idP,
                            ue_module_idP,
607
                            rb_idP);
608
                      LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT);
609
                      rlc_um_data_req(&rlc_union_p->rlc.um, frameP, new_sdu_p);
610 611

                      //free_mem_block(new_sdu);
612
		      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT);
613 614
                      return RLC_OP_STATUS_OK;
                  } else {
615
		    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT);
616 617 618
                      return RLC_OP_STATUS_BAD_PARAMETER;
                  }
              } else {
619
		vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT);
620 621 622
                  return RLC_OP_STATUS_BAD_PARAMETER;
              }
          } else {
623
	    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT);
624 625
              return RLC_OP_STATUS_BAD_PARAMETER;
          }
626 627 628
  }
#else
  } else {/* MBMS_flag != 0 */
gauthier's avatar
gauthier committed
629
    free_mem_block(sdu_pP);
630
    LOG_E(RLC, "MBMS_flag != 0 while Rel10 is not defined...\n");
631
    //handle_event(ERROR,"FILE %s FONCTION rlc_data_req() LINE %s : parameter module_id out of bounds :%d\n", __FILE__, __LINE__, module_idP);
632
    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT);
633
    return RLC_OP_STATUS_BAD_PARAMETER;
634
  }
635
#endif
636 637 638
}

//-----------------------------------------------------------------------------
639 640 641 642 643 644 645 646 647 648
void rlc_data_ind     (
    const module_id_t enb_module_idP,
    const module_id_t ue_module_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 sdu_size_t  sdu_sizeP,
    mem_block_t      *sdu_pP) {
649
//-----------------------------------------------------------------------------
gauthier's avatar
gauthier committed
650 651


652
  LOG_D(RLC, "[FRAME %5u][%s][RLC][INST %u/%u][%s %u] Display of rlc_data_ind: size %u\n",
653
        frameP,
654
        (enb_flagP) ? "eNB" : "UE",
655 656 657
        enb_module_idP,
        ue_module_idP,
        (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
658 659 660 661
        rb_idP,
        sdu_sizeP);

  rlc_util_print_hex_octets(RLC, (unsigned char*)sdu_pP->data, sdu_sizeP);
662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685

  LOG_D(RLC, "[FRAME %5u][%s][RLC][INST %u/%u][%s %u][--- RLC_DATA_IND/%d Bytes --->][PDCP][INST %u/%u][%s %u]\n",
      frameP,
      (enb_flagP) ? "eNB" : "UE",
      enb_module_idP,
      ue_module_idP,
      (srb_flagP) ? "SRB" : "DRB",
      rb_idP,
      sdu_sizeP,
      enb_module_idP,
      ue_module_idP,
      (srb_flagP) ? "SRB" : "DRB",
      rb_idP);

  pdcp_data_ind (
      enb_module_idP,
      ue_module_idP,
      frameP,
      enb_flagP,
      srb_flagP,
      MBMS_flagP,
      rb_idP,
      sdu_sizeP,
      sdu_pP);
686 687
}
//-----------------------------------------------------------------------------
688 689 690 691 692 693 694 695
void rlc_data_conf     (const module_id_t     enb_module_idP,
                        const module_id_t     ue_module_idP,
                        const frame_t         frameP,
                        const eNB_flag_t      enb_flagP,
                        const srb_flag_t      srb_flagP,
                        const rb_id_t         rb_idP,
                        const mui_t           muiP,
                        const rlc_tx_status_t statusP) {
696
//-----------------------------------------------------------------------------
697 698

    if (srb_flagP) {
699 700
        if (rlc_rrc_data_conf != NULL) {
            LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);
701 702 703 704 705 706 707 708 709 710 711 712 713
            LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][INST %u/%u][%s %u][--- RLC_DATA_CONF /MUI %d --->][%s][INST %u/%u][][RLC_DATA_CONF/ MUI %d]\n",
                frameP,
                (enb_flagP) ? "eNB" : "UE",
                enb_module_idP,
                ue_module_idP,
                (srb_flagP) ? "SRB" : "DRB",
                rb_idP,
                muiP,
                (srb_flagP) ? "RRC" : "PDCP",
                enb_module_idP,
                ue_module_idP,
                muiP);

714
            LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT);
715
            rlc_rrc_data_conf (enb_module_idP , ue_module_idP, enb_flagP, rb_idP , muiP, statusP);
716 717 718 719 720
        }
    }
}
//-----------------------------------------------------------------------------
int
721
rlc_module_init (void)
722 723
{
//-----------------------------------------------------------------------------
gauthier's avatar
gauthier committed
724 725 726
   int          k;
   module_id_t  module_id1;

727 728 729
   LOG_D(RLC, "MODULE INIT\n");
   rlc_rrc_data_ind  = NULL;
   rlc_rrc_data_conf = NULL;
gauthier's avatar
gauthier committed
730

731 732
   rlc_coll_p = hashtable_create ((maxDRB + 2) * 16, NULL, rb_free_rlc_union);
   AssertFatal(rlc_coll_p != NULL, "UNRECOVERABLE error, RLC hashtable_create failed");
gauthier's avatar
gauthier committed
733 734

   for (module_id1=0; module_id1 < NUMBER_OF_UE_MAX; module_id1++) {
gauthier's avatar
gauthier committed
735
#if defined(Rel10)
736 737 738 739
      for (k=0; k < RLC_MAX_MBMS_LC; k++) {
          rlc_mbms_lcid2service_session_id_ue[module_id1][k].service_id = 0;
          rlc_mbms_lcid2service_session_id_ue[module_id1][k].session_id = 0;
      }
740 741 742
      for (k=0; k < NB_RB_MBMS_MAX; k++) {
          rlc_mbms_rbid2lcid_eNB[module_id1][k] = RLC_LC_UNALLOCATED;
      }
gauthier's avatar
gauthier committed
743
#endif
744
   }
gauthier's avatar
gauthier committed
745 746

   for (module_id1=0; module_id1 < NUMBER_OF_eNB_MAX; module_id1++) {
gauthier's avatar
gauthier committed
747
#if defined(Rel10)
748 749 750 751
      for (k=0; k < RLC_MAX_MBMS_LC; k++) {
          rlc_mbms_lcid2service_session_id_eNB[module_id1][k].service_id = 0;
          rlc_mbms_lcid2service_session_id_eNB[module_id1][k].session_id = 0;
      }
752 753 754
      for (k=0; k < NB_RB_MBMS_MAX; k++) {
          rlc_mbms_rbid2lcid_ue[module_id1][k] = RLC_LC_UNALLOCATED;
      }
gauthier's avatar
gauthier committed
755
#endif
gauthier's avatar
gauthier committed
756 757
   }

758 759 760 761 762 763
   pool_buffer_init();

   return(0);
}
//-----------------------------------------------------------------------------
void
764
rlc_module_cleanup (void)
765 766
//-----------------------------------------------------------------------------
{
767
    hashtable_destroy(rlc_coll_p);
768 769 770
}
//-----------------------------------------------------------------------------
void
771
rlc_layer_init (void)
772 773 774 775 776
{
//-----------------------------------------------------------------------------
}
//-----------------------------------------------------------------------------
void
777
rlc_layer_cleanup (void)
778 779 780 781
//-----------------------------------------------------------------------------
{
}