rlc.c 32.1 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 18 19
    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/>.
20

gauthier's avatar
gauthier committed
21 22 23 24 25 26 27 28
  Contact Information
  OpenAirInterface Admin: openair_admin@eurecom.fr
  OpenAirInterface Tech : openair_tech@eurecom.fr
  OpenAirInterface Dev  : openair4g-devel@eurecom.fr

  Address      : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.

 *******************************************************************************/
gauthier's avatar
Licence  
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 43 44

#include "assertions.h"

45 46 47 48 49 50 51 52 53 54
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);
55

gauthier's avatar
gauthier committed
56
#define DEBUG_RLC_PDCP_INTERFACE
57

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

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

  if (dataP == NULL) {
    return;
  }


71 72 73 74 75


  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");
76 77 78
  for (octet_index = 0; octet_index < sizeP; octet_index++) {
    if ((octet_index % 16) == 0){
      if (octet_index != 0) {
79
        LOG_T(componentP, " |\n");
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
      }
      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
102
rlc_op_status_t rlc_stat_req     (
103 104 105 106 107 108
                  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,
109 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
                  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) {
//-----------------------------------------------------------------------------
137 138 139 140
    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
141 142

#ifdef OAI_EMU
gauthier's avatar
gauthier committed
143
    if (enb_flagP) {
144
        AssertFatal ((enb_module_idP >= oai_emulation.info.first_enb_local) && (oai_emulation.info.nb_enb_local > 0),
gauthier's avatar
gauthier committed
145
            "eNB module id is too low (%u/%d)!\n",
146
            enb_module_idP,
gauthier's avatar
gauthier committed
147
            oai_emulation.info.first_enb_local);
148
        AssertFatal ((enb_module_idP < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local)) && (oai_emulation.info.nb_enb_local > 0),
gauthier's avatar
gauthier committed
149
            "eNB module id is too high (%u/%d)!\n",
150
            enb_module_idP,
gauthier's avatar
gauthier committed
151
            oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local);
152
        AssertFatal (ue_module_idP  < NB_UE_INST,
gauthier's avatar
gauthier committed
153
            "UE module id is too high (%u/%d)!\n",
154
            ue_module_idP,
gauthier's avatar
gauthier committed
155 156
            oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
    } else {
157
        AssertFatal (ue_module_idP  < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local),
gauthier's avatar
gauthier committed
158
            "UE module id is too high (%u/%d)!\n",
159
            ue_module_idP,
gauthier's avatar
gauthier committed
160
            oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);
161
        AssertFatal (ue_module_idP  >= oai_emulation.info.first_ue_local,
gauthier's avatar
gauthier committed
162
            "UE module id is too low (%u/%d)!\n",
163
            ue_module_idP,
gauthier's avatar
gauthier committed
164 165
            oai_emulation.info.first_ue_local);
    }
gauthier's avatar
gauthier committed
166 167
#endif
    AssertFatal (rb_idP < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rb_idP, NB_RB_MAX);
168 169 170 171
    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
172 173
    }
    switch (rlc_mode) {
gauthier's avatar
gauthier committed
174
        case RLC_MODE_NONE:
gauthier's avatar
gauthier committed
175 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
            *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
205
        case RLC_MODE_AM:
206
            rlc_am_stat_req(&rlc_union_p->rlc.am,
gauthier's avatar
gauthier committed
207 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
                            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
237
       case RLC_MODE_UM:
gauthier's avatar
gauthier committed
238 239 240 241 242 243 244 245 246 247 248 249
           *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;
250
           rlc_um_stat_req (&rlc_union_p->rlc.um,
gauthier's avatar
gauthier committed
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
                              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
271
       case RLC_MODE_TM:
gauthier's avatar
gauthier committed
272 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
           *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;
    }
332
}
333

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

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

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

410 411 412
#ifdef Rel10
  if (MBMS_flagP == TRUE) {
      if (enb_flagP) {
413 414
            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];
415
      } else {
416 417
            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
418
      }
419
      key = RLC_COLL_KEY_MBMS_VALUE(enb_module_idP, ue_module_idP, enb_flagP, mbms_id_p->service_id, mbms_id_p->session_id);
420 421 422
  } else
#endif
  {
423 424 425 426 427 428 429 430 431
      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
432 433
  }

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

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

gauthier's avatar
gauthier committed
456
          case RLC_MODE_AM:
457
#ifdef DEBUG_RLC_DATA_REQ
gauthier's avatar
gauthier committed
458
              msg("RLC_MODE_AM\n");
459
#endif
460
              new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_am_data_req_alloc));
gauthier's avatar
gauthier committed
461

462
              if (new_sdu_p != NULL) {
gauthier's avatar
gauthier committed
463
                  // PROCESS OF COMPRESSION HERE:
464 465
                  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
466

467 468 469 470
                  ((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
471 472 473
                  free_mem_block(sdu_pP);
                  LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);

474
                  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",
475
                          frameP,
gauthier's avatar
gauthier committed
476
                          (enb_flagP) ? "eNB" : "UE",
477 478 479 480
                          (srb_flagP) ? "RRC" : "PDCP",
                          enb_module_idP,
                          ue_module_idP,
                          (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
481 482
                          rb_idP,
                          sdu_sizeP,
483 484 485
                          enb_module_idP,
                          ue_module_idP,
                          (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
486 487
                          rb_idP);
                  LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT);
488
                  rlc_am_data_req(&rlc_union_p->rlc.am, frameP, new_sdu_p);
gauthier's avatar
gauthier committed
489 490 491 492 493 494
                  return RLC_OP_STATUS_OK;
              } else {
                  return RLC_OP_STATUS_INTERNAL_ERROR;
              }
              break;

gauthier's avatar
gauthier committed
495
          case RLC_MODE_UM:
496
            new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_um_data_req_alloc));
gauthier's avatar
gauthier committed
497

498
              if (new_sdu_p != NULL) {
gauthier's avatar
gauthier committed
499
                  // PROCESS OF COMPRESSION HERE:
500 501
                  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
502

503 504
                  ((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
505 506 507
                  free_mem_block(sdu_pP);

                  LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);
508
                  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",
509
                          frameP,
gauthier's avatar
gauthier committed
510
                          (enb_flagP) ? "eNB" : "UE",
511 512 513 514
                          (srb_flagP) ? "RRC" : "PDCP",
                          enb_module_idP,
                          ue_module_idP,
                          (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
515 516
                          rb_idP,
                          sdu_sizeP,
517 518 519
                          enb_module_idP,
                          ue_module_idP,
                          (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
520 521
                          rb_idP);
                  LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT);
522
                  rlc_um_data_req(&rlc_union_p->rlc.um, frameP, new_sdu_p);
523

gauthier's avatar
gauthier committed
524 525 526 527 528 529 530
                  //free_mem_block(new_sdu);
                  return RLC_OP_STATUS_OK;
              } else {
                  return RLC_OP_STATUS_INTERNAL_ERROR;
              }
              break;

gauthier's avatar
gauthier committed
531
          case RLC_MODE_TM:
532
            new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_tm_data_req_alloc));
gauthier's avatar
gauthier committed
533

534
              if (new_sdu_p != NULL) {
gauthier's avatar
gauthier committed
535
                  // PROCESS OF COMPRESSION HERE:
536 537
                  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
538

539 540
                  ((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
541 542
                  free_mem_block(sdu_pP);
                  LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);
543
                  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",
544
                                 frameP,
gauthier's avatar
gauthier committed
545
                                 (enb_flagP) ? "eNB" : "UE",
546 547 548 549
                                 (srb_flagP) ? "RRC" : "PDCP",
                                 enb_module_idP,
                                 ue_module_idP,
                                 (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
550 551
                                 rb_idP,
                                 sdu_sizeP,
552 553 554
                                 enb_module_idP,
                                 ue_module_idP,
                                 (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
555 556
                                 rb_idP);
                  LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT);
557
                  rlc_tm_data_req(&rlc_union_p->rlc.tm, new_sdu_p);
gauthier's avatar
gauthier committed
558 559 560 561 562 563 564 565 566 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__);
                  return RLC_OP_STATUS_INTERNAL_ERROR;
              }
              break;

          default:
              free_mem_block(sdu_pP);
              return RLC_OP_STATUS_INTERNAL_ERROR;

      }
570

571
#ifdef Rel10
572
  } else { /* MBMS_flag != 0 */
573
	  //  LOG_I(RLC,"DUY rlc_data_req: mbms_rb_id in RLC instant is: %d\n", mbms_rb_id);
gauthier's avatar
gauthier committed
574
          if (sdu_pP != NULL) {
575 576
              if (sdu_sizeP > 0) {
                  LOG_I(RLC,"received a packet with size %d for MBMS \n", sdu_sizeP);
577 578
                  new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_um_data_req_alloc));
                  if (new_sdu_p != NULL) {
579
                      // PROCESS OF COMPRESSION HERE:
580 581 582 583
                      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
584
                      free_mem_block(sdu_pP);
585
                      LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);
586
                          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",
587
                            frameP,
588 589 590 591
                            (enb_flagP) ? "eNB" : "UE",
                            (srb_flagP) ? "RRC" : "PDCP",
                            enb_module_idP,
                            ue_module_idP,
gauthier's avatar
gauthier committed
592 593
                            rb_idP,
                            sdu_sizeP,
594 595
                            enb_module_idP,
                            ue_module_idP,
596
                            rb_idP);
597
                      LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT);
598
                      rlc_um_data_req(&rlc_union_p->rlc.um, frameP, new_sdu_p);
599 600 601 602 603 604 605 606 607 608 609 610

                      //free_mem_block(new_sdu);
                      return RLC_OP_STATUS_OK;
                  } else {
                      return RLC_OP_STATUS_BAD_PARAMETER;
                  }
              } else {
                  return RLC_OP_STATUS_BAD_PARAMETER;
              }
          } else {
              return RLC_OP_STATUS_BAD_PARAMETER;
          }
611 612 613
  }
#else
  } else {/* MBMS_flag != 0 */
gauthier's avatar
gauthier committed
614
    free_mem_block(sdu_pP);
615
    LOG_E(RLC, "MBMS_flag != 0 while Rel10 is not defined...\n");
616 617
    //handle_event(ERROR,"FILE %s FONCTION rlc_data_req() LINE %s : parameter module_id out of bounds :%d\n", __FILE__, __LINE__, module_idP);
    return RLC_OP_STATUS_BAD_PARAMETER;
618
  }
619
#endif
620 621 622
}

//-----------------------------------------------------------------------------
623 624 625 626 627 628 629 630 631 632
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) {
633
//-----------------------------------------------------------------------------
gauthier's avatar
gauthier committed
634 635


636
  LOG_D(RLC, "[FRAME %5u][%s][RLC][INST %u/%u][%s %u] Display of rlc_data_ind: size %u\n",
637
        frameP,
gauthier's avatar
gauthier committed
638
        (enb_flagP) ? "eNB" : "UE",
639 640 641
        enb_module_idP,
        ue_module_idP,
        (srb_flagP) ? "SRB" : "DRB",
gauthier's avatar
gauthier committed
642 643 644 645
        rb_idP,
        sdu_sizeP);

  rlc_util_print_hex_octets(RLC, (unsigned char*)sdu_pP->data, sdu_sizeP);
646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669

  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);
670 671
}
//-----------------------------------------------------------------------------
672 673 674 675 676 677 678 679
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) {
680
//-----------------------------------------------------------------------------
681 682

    if (srb_flagP) {
683 684
        if (rlc_rrc_data_conf != NULL) {
            LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);
685 686 687 688 689 690 691 692 693 694 695 696 697
            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);

698
            LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT);
699
            rlc_rrc_data_conf (enb_module_idP , ue_module_idP, enb_flagP, rb_idP , muiP, statusP);
700 701 702 703 704
        }
    }
}
//-----------------------------------------------------------------------------
int
705
rlc_module_init (void)
706 707
{
//-----------------------------------------------------------------------------
gauthier's avatar
gauthier committed
708 709 710
   int          k;
   module_id_t  module_id1;

711 712 713
   LOG_D(RLC, "MODULE INIT\n");
   rlc_rrc_data_ind  = NULL;
   rlc_rrc_data_conf = NULL;
gauthier's avatar
gauthier committed
714

715 716
   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
717 718

   for (module_id1=0; module_id1 < NUMBER_OF_UE_MAX; module_id1++) {
gauthier's avatar
gauthier committed
719
#if defined(Rel10)
720 721 722 723
      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;
      }
724 725 726
      for (k=0; k < NB_RB_MBMS_MAX; k++) {
          rlc_mbms_rbid2lcid_eNB[module_id1][k] = RLC_LC_UNALLOCATED;
      }
gauthier's avatar
gauthier committed
727
#endif
728
   }
gauthier's avatar
gauthier committed
729 730

   for (module_id1=0; module_id1 < NUMBER_OF_eNB_MAX; module_id1++) {
gauthier's avatar
gauthier committed
731
#if defined(Rel10)
732 733 734 735
      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;
      }
736 737 738
      for (k=0; k < NB_RB_MBMS_MAX; k++) {
          rlc_mbms_rbid2lcid_ue[module_id1][k] = RLC_LC_UNALLOCATED;
      }
gauthier's avatar
gauthier committed
739
#endif
gauthier's avatar
gauthier committed
740 741
   }

742 743 744 745 746 747
   pool_buffer_init();

   return(0);
}
//-----------------------------------------------------------------------------
void
748
rlc_module_cleanup (void)
749 750
//-----------------------------------------------------------------------------
{
751
    hashtable_destroy(rlc_coll_p);
752 753 754
}
//-----------------------------------------------------------------------------
void
755
rlc_layer_init (void)
756 757 758 759 760
{
//-----------------------------------------------------------------------------
}
//-----------------------------------------------------------------------------
void
761
rlc_layer_cleanup (void)
762 763 764 765
//-----------------------------------------------------------------------------
{
}