pdcp.h 19.9 KB
Newer Older
1 2 3 4 5
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
Cedric Roux's avatar
Cedric Roux committed
6
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
7 8 9 10 11 12 13 14 15 16 17 18 19 20
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */
21

22
/*! \file LAYER2/PDCP_v10.1.0/pdcp.h
gauthier's avatar
gauthier committed
23
* \brief pdcp interface with RLC, RRC
24 25 26 27 28
* \author  Lionel GAUTHIER and Navid Nikaein
* \date 2009-2012
* \version 1.0
*/

29 30 31 32 33
/** @defgroup _pdcp PDCP 
* @ingroup _oai2
* @{
*/

34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
#ifndef __PDCP_H__
#    define __PDCP_H__
//-----------------------------------------------------------------------------
#    ifdef PDCP_C
#        define private_pdcp(x) x
#        define protected_pdcp(x) x
#        define public_pdcp(x) x
#    else
#        define private_pdcp(x)
#        define public_pdcp(x) extern x
#        ifdef PDCP_FIFO_C
#            define protected_pdcp(x) extern x
#        else
#            define protected_pdcp(x)
#        endif
#    endif

#    ifdef PDCP_FIFO_C
#        define private_pdcp_fifo(x) x
#        define protected_pdcp_fifo(x) x
#        define public_pdcp_fifo(x) x
#    else
#        define private_pdcp_fifo(x)
#        define public_pdcp_fifo(x) extern x
#        ifdef PDCP_C
#            define protected_pdcp_fifo(x) extern x
#        else
#            define protected_pdcp_fifo(x)
#        endif
#    endif
//-----------------------------------------------------------------------------
#ifndef NON_ACCESS_STRATUM
66 67
#include "UTIL/MEM/mem_block.h"
#include "UTIL/LISTS/list.h"
68 69
#endif //NON_ACCESS_STRATUM
//-----------------------------------------------------------------------------
70
#include "RRC/LITE/defs.h"
71
#include "COMMON/platform_constants.h"
72
#include "COMMON/platform_types.h"
73 74 75 76
#include "DRB-ToAddMod.h"
#include "DRB-ToAddModList.h"
#include "SRB-ToAddMod.h"
#include "SRB-ToAddModList.h"
Cedric Roux's avatar
Cedric Roux committed
77
#if defined(Rel10) || defined(Rel14)
78 79 80 81
#include "MBMS-SessionInfoList-r9.h"
#include "PMCH-InfoList-r9.h"
#endif

82

gauthier's avatar
gauthier committed
83 84
extern pthread_t       pdcp_thread;
extern pthread_attr_t  pdcp_thread_attr;
85
extern pthread_mutex_t pdcp_mutex;
gauthier's avatar
gauthier committed
86 87
extern pthread_cond_t  pdcp_cond;
extern int             pdcp_instance_cnt;
88

89 90 91 92 93
#define PROTOCOL_PDCP_CTXT_FMT PROTOCOL_CTXT_FMT"[%s %02u] "

#define PROTOCOL_PDCP_CTXT_ARGS(CTXT_Pp, pDCP_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp),\
          (pDCP_Pp->is_srb) ? "SRB" : "DRB",\
          pDCP_Pp->rb_id
94
int init_pdcp_thread(void);
95 96
void cleanup_pdcp_thread(void);

97 98 99 100 101 102 103 104 105 106

public_pdcp(unsigned int Pdcp_stats_tx[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]);
public_pdcp(unsigned int Pdcp_stats_tx_bytes[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]);
public_pdcp(unsigned int Pdcp_stats_tx_bytes_last[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]);
public_pdcp(unsigned int Pdcp_stats_tx_rate[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]);
public_pdcp(unsigned int Pdcp_stats_rx[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]);
public_pdcp(unsigned int Pdcp_stats_rx_bytes[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]);
public_pdcp(unsigned int Pdcp_stats_rx_bytes_last[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]);
public_pdcp(unsigned int Pdcp_stats_rx_rate[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]);

107
typedef struct pdcp_stats_s {
108 109 110
  time_stats_t pdcp_run;
  time_stats_t data_req;
  time_stats_t data_ind;
111
  time_stats_t apply_security; //
112
  time_stats_t validate_security;
113
  time_stats_t pdcp_ip;
114
  time_stats_t ip_pdcp; // separte thread
115
} pdcp_stats_t; // common to eNB and UE
116 117


118 119
typedef struct pdcp_s {
  //boolean_t     instanciated_instance;
gauthier's avatar
gauthier committed
120
  uint16_t       header_compression_profile;
121

122 123 124
  /* SR: added this flag to distinguish UE/eNB instance as pdcp_run for virtual
   * mode can receive data on NETLINK for eNB while eNB_flag = 0 and for UE when eNB_flag = 1
   */
gauthier's avatar
gauthier committed
125
  boolean_t is_ue;
126
  boolean_t is_srb;
127 128

  /* Configured security algorithms */
gauthier's avatar
gauthier committed
129 130
  uint8_t cipheringAlgorithm;
  uint8_t integrityProtAlgorithm;
131

132 133 134 135 136
  /* User-Plane encryption key
   * Control-Plane RRC encryption key
   * Control-Plane RRC integrity key
   * These keys are configured by RRC layer
   */
gauthier's avatar
gauthier committed
137 138 139
  uint8_t *kUPenc;
  uint8_t *kRRCint;
  uint8_t *kRRCenc;
140

gauthier's avatar
gauthier committed
141
  uint8_t security_activated;
142

gauthier's avatar
gauthier committed
143
  rlc_mode_t rlc_mode;
gauthier's avatar
gauthier committed
144 145
  uint8_t status_report;
  uint8_t seq_num_size;
146

gauthier's avatar
gauthier committed
147
  logical_chan_id_t lcid;
148
  rb_id_t           rb_id;
149 150 151 152 153
  /*
   * Sequence number state variables
   *
   * TX and RX window
   */
gauthier's avatar
gauthier committed
154 155
  pdcp_sn_t next_pdcp_tx_sn;
  pdcp_sn_t next_pdcp_rx_sn;
156
  pdcp_sn_t next_pdcp_rx_sn_before_integrity;
157 158 159
  /*
   * TX and RX Hyper Frame Numbers
   */
gauthier's avatar
gauthier committed
160 161
  pdcp_hfn_t tx_hfn;
  pdcp_hfn_t rx_hfn;
162
  pdcp_hfn_offset_t rx_hfn_offset; // related to sn mismatch
163

164 165 166
  /*
   * SN of the last PDCP SDU delivered to upper layers
   */
gauthier's avatar
gauthier committed
167
  pdcp_sn_t  last_submitted_pdcp_rx_sn;
168 169 170 171 172 173

  /*
   * Following array is used as a bitmap holding missing sequence
   * numbers to generate a PDCP Control PDU for PDCP status
   * report (see 6.2.6)
   */
gauthier's avatar
gauthier committed
174
  uint8_t missing_pdu_bitmap[512];
175 176 177 178 179
  /*
   * This is intentionally signed since we need a 'NULL' value
   * which is not also a valid sequence number
   */
  short int first_missing_pdu;
180 181 182
  /*
   * decipher using a different rx_hfn
   */
183 184


185 186
} pdcp_t;

Cedric Roux's avatar
Cedric Roux committed
187
#if defined(Rel10) || defined(Rel14)
188
typedef struct pdcp_mbms_s {
gauthier's avatar
gauthier committed
189 190
  boolean_t instanciated_instance;
  rb_id_t   rb_id;
191
} pdcp_mbms_t;
gauthier's avatar
gauthier committed
192
#endif
193 194 195 196 197 198 199 200 201
/*
 * Following symbolic constant alters the behaviour of PDCP
 * and makes it linked to PDCP test code under targets/TEST/PDCP/
 *
 * For the version at SVN repository this should be UNDEFINED!
 * XXX And later this should be configured through the Makefile
 * under targets/TEST/PDCP/
 */

202
/*! \fn boolean_t pdcp_data_req(const protocol_ctxt_t* const  , srb_flag_t , rb_id_t , mui_t , confirm_t ,sdu_size_t , unsigned char* , pdcp_transmission_mode_t )
203
* \brief This functions handles data transfer requests coming either from RRC or from IP
204 205
* \param[in] ctxt_pP        Running context.
* \param[in] rab_id         Radio Bearer ID
206
* \param[in] muiP
207 208
* \param[in] confirmP
* \param[in] sdu_buffer_size Size of incoming SDU in bytes
209 210
* \param[in] sdu_buffer      Buffer carrying SDU
* \param[in] mode            flag to indicate whether the userplane data belong to the control plane or data plane or transparent
211 212 213 214
* \return TRUE on success, FALSE otherwise
* \note None
* @ingroup _pdcp
*/
215
public_pdcp(boolean_t pdcp_data_req(
216
              protocol_ctxt_t*  ctxt_pP,
217 218 219 220 221 222 223
              const srb_flag_t srb_flagP,
              const rb_id_t rb_id,
              const mui_t muiP,
              const confirm_t confirmP, \
              const sdu_size_t sdu_buffer_size,
              unsigned char* const sdu_buffer,
              const pdcp_transmission_mode_t mode));
224

225
/*! \fn boolean_t pdcp_data_ind(const protocol_ctxt_t* const, srb_flag_t, MBMS_flag_t, rb_id_t, sdu_size_t, mem_block_t*, boolean_t)
226
* \brief This functions handles data transfer indications coming from RLC
227
* \param[in] ctxt_pP        Running context.
228
* \param[in] Shows if rb is SRB
229 230 231 232 233 234 235 236 237
* \param[in] Tells if MBMS traffic
* \param[in] rab_id Radio Bearer ID
* \param[in] sdu_buffer_size Size of incoming SDU in bytes
* \param[in] sdu_buffer Buffer carrying SDU
* \param[in] is_data_plane flag to indicate whether the userplane data belong to the control plane or data plane
* \return TRUE on success, FALSE otherwise
* \note None
* @ingroup _pdcp
*/
238
public_pdcp(boolean_t pdcp_data_ind(
239 240 241 242 243 244
              const protocol_ctxt_t* const  ctxt_pP,
              const srb_flag_t srb_flagP,
              const MBMS_flag_t MBMS_flagP,
              const rb_id_t rb_id,
              const sdu_size_t sdu_buffer_size,
              mem_block_t* const sdu_buffer));
245

246
/*! \fn void rrc_pdcp_config_req(const protocol_ctxt_t* const ,uint32_t,rb_id_t,uint8_t)
247
* \brief This functions initializes relevant PDCP entity
248
* \param[in] ctxt_pP        Running context.
gauthier's avatar
gauthier committed
249 250 251
* \param[in] actionP flag for action: add, remove , modify
* \param[in] rb_idP Radio Bearer ID of relevant PDCP entity
* \param[in] security_modeP Radio Bearer ID of relevant PDCP entity
252 253 254
* \return none
* \note None
* @ingroup _pdcp
255
*/
256
public_pdcp(void rrc_pdcp_config_req (
257 258 259 260 261
              const protocol_ctxt_t* const  ctxt_pP,
              const srb_flag_t  srb_flagP,
              const uint32_t    actionP,
              const rb_id_t     rb_idP,
              const uint8_t     security_modeP);)
gauthier's avatar
gauthier committed
262

263
/*! \fn bool rrc_pdcp_config_asn1_req (const protocol_ctxt_t* const , SRB_ToAddModList_t* srb2add_list, DRB_ToAddModList_t* drb2add_list, DRB_ToReleaseList_t*  drb2release_list)
264
* \brief  Function for RRC to configure a Radio Bearer.
265
* \param[in]  ctxt_pP           Running context.
266 267 268 269
* \param[in]  index             index of UE or eNB depending on the eNB_flag
* \param[in]  srb2add_list      SRB configuration list to be created.
* \param[in]  drb2add_list      DRB configuration list to be created.
* \param[in]  drb2release_list  DRB configuration list to be released.
270 271 272 273
* \param[in]  security_mode     Security algorithm to apply for integrity/ciphering
* \param[in]  kRRCenc           RRC encryption key
* \param[in]  kRRCint           RRC integrity key
* \param[in]  kUPenc            User-Plane encryption key
274
* \param[in]  defaultDRB        Default DRB ID
275 276
* \return     A status about the processing, OK or error code.
*/
277
public_pdcp(
278 279 280 281 282 283 284 285 286
  boolean_t rrc_pdcp_config_asn1_req (
    const protocol_ctxt_t* const  ctxt_pP,
    SRB_ToAddModList_t  *const srb2add_list,
    DRB_ToAddModList_t  *const drb2add_list,
    DRB_ToReleaseList_t *const drb2release_list,
    const uint8_t                   security_modeP,
    uint8_t                  *const kRRCenc,
    uint8_t                  *const kRRCint,
    uint8_t                  *const kUPenc
Cedric Roux's avatar
Cedric Roux committed
287
#if defined(Rel10) || defined(Rel14)
288
    ,PMCH_InfoList_r9_t  *pmch_InfoList_r9
289
#endif
290
    ,rb_id_t                 *const defaultDRB 
291
  ));
292

293
/*! \fn boolean_t pdcp_config_req_asn1 (const protocol_ctxt_t* const ctxt_pP, srb_flag_t srb_flagP, uint32_t  action, rb_id_t rb_id, uint8_t rb_sn, uint8_t rb_report, uint16_t header_compression_profile, uint8_t security_mode)
294
* \brief  Function for RRC to configure a Radio Bearer.
295
* \param[in]  ctxt_pP           Running context.
gauthier's avatar
gauthier committed
296 297 298
* \param[in]  pdcp_pP            Pointer on PDCP structure.
* \param[in]  enb_mod_idP        Virtualized enb module identifier, Not used if eNB_flagP = 0.
* \param[in]  ue_mod_idP         Virtualized ue module identifier.
299 300
* \param[in]  frame              Frame index.
* \param[in]  eNB_flag           Flag to indicate eNB (1) or UE (0)
301
* \param[in]  srb_flagP          Flag to indicate SRB (1) or DRB (0)
302 303 304 305 306 307
* \param[in]  action             add, remove, modify a RB
* \param[in]  rb_id              radio bearer id
* \param[in]  rb_sn              sequence number for this radio bearer
* \param[in]  drb_report         set a pdcp report for this drb
* \param[in]  header_compression set the rohc profile
* \param[in]  security_mode      set the integrity and ciphering algs
308 309 310
* \param[in]  kRRCenc            RRC encryption key
* \param[in]  kRRCint            RRC integrity key
* \param[in]  kUPenc             User-Plane encryption key
311 312
* \return     A status about the processing, OK or error code.
*/
313
public_pdcp(boolean_t pdcp_config_req_asn1 (
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328
              const protocol_ctxt_t* const  ctxt_pP,
              pdcp_t         *const pdcp_pP,
              const srb_flag_t       srb_flagP,
              const rlc_mode_t       rlc_mode,
              const uint32_t         action,
              const uint16_t         lc_id,
              const uint16_t         mch_id,
              const rb_id_t          rb_id,
              const uint8_t          rb_sn,
              const uint8_t          rb_report,
              const uint16_t         header_compression_profile,
              const uint8_t          security_mode,
              uint8_t         *const kRRCenc,
              uint8_t         *const kRRCint,
              uint8_t         *const kUPenc));
knopp's avatar
 
knopp committed
329 330


331
/*! \fn boolean_t pdcp_remove_UE(const protocol_ctxt_t* const  ctxt_pP)
332
* \brief  Function for RRC to configure a Radio Bearer clear all PDCP resources for a particular UE
333
* \param[in]  ctxt_pP           Running context.
knopp's avatar
 
knopp committed
334 335 336
* \return     A status about the processing, OK or error code.
*/
public_pdcp(boolean_t pdcp_remove_UE(
337
              const protocol_ctxt_t* const  ctxt_pP));
knopp's avatar
 
knopp committed
338

339
/*! \fn void rrc_pdcp_config_release( const protocol_ctxt_t* const, rb_id_t)
340
* \brief This functions is unused
341
* \param[in]  ctxt_pP           Running context.
342 343 344 345 346
* \param[in] rab_id Radio Bearer ID of relevant PDCP entity
* \return none
* \note None
* @ingroup _pdcp
*/
347
//public_pdcp(void rrc_pdcp_config_release ( const protocol_ctxt_t* const  ctxt_pP, rb_id_t);)
348

349
/*! \fn void pdcp_run(const protocol_ctxt_t* const  ctxt_pP)
350
* \brief Runs PDCP entity to let it handle incoming/outgoing SDUs
351
* \param[in]  ctxt_pP           Running context.
352 353 354 355
* \return none
* \note None
* @ingroup _pdcp
*/
356
public_pdcp(void pdcp_run            (
357
              const protocol_ctxt_t* const  ctxt_pP);)
gauthier's avatar
gauthier committed
358 359 360 361
public_pdcp(int pdcp_module_init     (void);)
public_pdcp(void pdcp_module_cleanup (void);)
public_pdcp(void pdcp_layer_init     (void);)
public_pdcp(void pdcp_layer_cleanup  (void);)
362
#if defined(PDCP_USE_NETLINK_QUEUES)
gauthier's avatar
gauthier committed
363
public_pdcp(int pdcp_netlink_init    (void);)
364

365 366 367
#endif
#define PDCP2NW_DRIVER_FIFO 21
#define NW_DRIVER2PDCP_FIFO 22
368

369
protected_pdcp_fifo(int pdcp_fifo_flush_sdus                      (
370
                      const protocol_ctxt_t* const  ctxt_pP);)
371
protected_pdcp_fifo(int pdcp_fifo_read_input_sdus_remaining_bytes (
372
                      const protocol_ctxt_t* const  ctxt_pP);)
373
protected_pdcp_fifo(int pdcp_fifo_read_input_sdus                 (
374
                      const protocol_ctxt_t* const  ctxt_pP);)
375
protected_pdcp_fifo(void pdcp_fifo_read_input_sdus_from_otg       (
376
                      const protocol_ctxt_t* const  ctxt_pP);)
377 378 379 380 381 382

//-----------------------------------------------------------------------------

/*
 * Following two types are utilized between NAS driver and PDCP
 */
383 384 385


typedef struct pdcp_data_req_header_s {
386
  rb_id_t             rb_id;
387
  sdu_size_t          data_size;
gauthier's avatar
gauthier committed
388
  signed int          inst;
gauthier's avatar
gauthier committed
389
  ip_traffic_type_t   traffic_type;
390
} pdcp_data_req_header_t;
391 392

typedef struct pdcp_data_ind_header_s {
393
  rb_id_t             rb_id;
394
  sdu_size_t          data_size;
gauthier's avatar
gauthier committed
395
  signed int          inst;
gauthier's avatar
gauthier committed
396
  ip_traffic_type_t   dummy_traffic_type;
397 398
} pdcp_data_ind_header_t;

399
struct pdcp_netlink_element_s {
400
  pdcp_data_req_header_t pdcp_read_header;
401

402 403
  /* Data part of the message */
  uint8_t *data;
404 405
};

406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453
//TTN for D2D (PC5S)
#ifdef Rel14
#define PDCP_SOCKET_PORT_NO 9999 //temporary value
int pdcp_pc5_sockfd;
struct sockaddr_in prose_app_addr;
struct sockaddr_in pdcp_sin;
int pdcp_pc5_socket_init();

typedef enum SL_PC5S_TYPES_e {
  SL_PC5S_INIT=1,
  SL_DIRECT_COMMUNICATION_REQUEST,
  SL_DIRECT_COMMUNICATION_ACCEPT,
  SL_DIRECT_COMMUNICATION_REJECT,
  SL_DIRECT_SECURITY_MODE_COMMAND,
  SL_DIRECT_SECURITY_MODE_COMPLETE
} SL_PC5S_TYPES_t;

typedef struct  {
   SL_PC5S_TYPES_t   msg_type;
   uint16_t  rb_id;
   int32_t   data_size;
   uint8_t   inst;
} __attribute__((__packed__)) pdcp_data_header_t;

//should be completed with other IEs (3GPP TS 24.334)
typedef struct {
   uint16_t sequenceNumber;
   uint8_t ipAddressConfig;
} __attribute__((__packed__)) PC5SDirectCommunicationRequest;

typedef struct {
   uint16_t sequenceNumber;
   uint8_t ipAddressConfig;
} __attribute__((__packed__)) PC5SDirectCommunicationAccept;

//example of PC5-S messages
typedef struct  {
   pdcp_data_header_t pdcp_data_header;
   union {
      PC5SDirectCommunicationRequest pc5s_direct_communication_req;
      PC5SDirectCommunicationAccept pc5s_direct_communication_accept;
      uint8_t status;
   } pc5sPrimitive;
} __attribute__((__packed__)) sidelink_pc5s_element;

#endif


454 455
#if 0
/*
456
 * Missing PDU information struct, a copy of this will be enqueued
457 458 459
 * into pdcp.missing_pdus for every missing PDU
 */
typedef struct pdcp_missing_pdu_info_t {
gauthier's avatar
gauthier committed
460
  pdcp_sn_t sequence_number;
461 462 463 464 465 466 467 468 469 470 471
} pdcp_missing_pdu_info_t;
#endif

/*
 * PDCP limit values
 */
#define PDCP_MAX_SDU_SIZE 8188 // octets, see 4.3.1 Services provided to upper layers
#define PDCP_MAX_SN_5BIT  31   // 2^5-1
#define PDCP_MAX_SN_7BIT  127  // 2^7-1
#define PDCP_MAX_SN_12BIT 4095 // 2^12-1

472 473
/*
 * Reordering_Window: half of the PDCP SN space
474
 */
475 476 477 478
#define REORDERING_WINDOW_SN_5BIT 16
#define REORDERING_WINDOW_SN_7BIT 64
#define REORDERING_WINDOW_SN_12BIT 2048

479 480
/*
 * SN size
481 482 483 484
 */
#define PDCP_SN_5BIT  5
#define PDCP_SN_7BIT  7
#define PDCP_SN_12BIT 12
485

486

487
protected_pdcp(signed int             pdcp_2_nas_irq;)
488 489
public_pdcp(pdcp_stats_t              UE_pdcp_stats[NUMBER_OF_UE_MAX];)
public_pdcp(pdcp_stats_t              eNB_pdcp_stats[NUMBER_OF_eNB_MAX];)
490 491 492 493 494 495 496
//protected_pdcp(pdcp_t                 pdcp_array_srb_ue[NUMBER_OF_UE_MAX][2];)
//protected_pdcp(pdcp_t                 pdcp_array_drb_ue[NUMBER_OF_UE_MAX][maxDRB];)
//public_pdcp(pdcp_t                    pdcp_array_srb_eNB[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][2];)
//protected_pdcp(pdcp_t                 pdcp_array_drb_eNB[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][maxDRB];)

// for UE code conly
protected_pdcp(rnti_t                 pdcp_UE_UE_module_id_to_rnti[NUMBER_OF_UE_MAX];)
497 498
protected_pdcp(rnti_t                 pdcp_eNB_UE_instance_to_rnti[NUMBER_OF_UE_MAX];) // for noS1 mode
protected_pdcp(unsigned int           pdcp_eNB_UE_instance_to_rnti_index;)
Cedric Roux's avatar
Cedric Roux committed
499
#if defined(Rel10) || defined(Rel14)
gauthier's avatar
gauthier committed
500 501 502
public_pdcp(pdcp_mbms_t               pdcp_mbms_array_ue[NUMBER_OF_UE_MAX][maxServiceCount][maxSessionPerPMCH];)   // some constants from openair2/RRC/LITE/MESSAGES/asn1_constants.h
public_pdcp(pdcp_mbms_t               pdcp_mbms_array_eNB[NUMBER_OF_eNB_MAX][maxServiceCount][maxSessionPerPMCH];) // some constants from openair2/RRC/LITE/MESSAGES/asn1_constants.h
#endif
503 504 505 506 507 508 509 510 511
protected_pdcp(sdu_size_t             pdcp_output_sdu_bytes_to_write;)
protected_pdcp(sdu_size_t             pdcp_output_header_bytes_to_write;)
protected_pdcp(list_t                 pdcp_sdu_list;)
protected_pdcp(int                    pdcp_sent_a_sdu;)
protected_pdcp(pdcp_data_req_header_t pdcp_input_header;)
protected_pdcp(unsigned char          pdcp_input_sdu_buffer[MAX_IP_PACKET_SIZE];)
protected_pdcp(sdu_size_t             pdcp_input_index_header;)
protected_pdcp(sdu_size_t             pdcp_input_sdu_size_read;)
protected_pdcp(sdu_size_t             pdcp_input_sdu_remaining_size_to_read;)
512

513 514 515 516 517
#define PDCP_COLL_KEY_VALUE(mODULE_iD, rNTI, iS_eNB, rB_iD, iS_sRB) \
   ((hash_key_t)mODULE_iD          | \
    (((hash_key_t)(rNTI))   << 8)  | \
    (((hash_key_t)(iS_eNB)) << 24) | \
    (((hash_key_t)(rB_iD))  << 25) | \
518 519 520 521 522 523 524 525 526 527 528 529 530
    (((hash_key_t)(iS_sRB)) << 33) | \
    (((hash_key_t)(0x55))   << 34))

// hash key to the same PDCP as indexed by PDCP_COLL_KEY_VALUE(... rB_iD, iS_sRB=0) where rB_iD
// is the default DRB ID. The hidden code 0x55 indicates the key is indexed by (rB_iD,is_sRB)
// whereas the hidden code 0xaa indicates the key is for default DRB only
#define PDCP_COLL_KEY_DEFAULT_DRB_VALUE(mODULE_iD, rNTI, iS_eNB) \
    ((hash_key_t)mODULE_iD          | \
     (((hash_key_t)(rNTI))   << 8)  | \
     (((hash_key_t)(iS_eNB)) << 24) | \
     (((hash_key_t)(0xff))   << 25) | \
     (((hash_key_t)(0x00))   << 33) | \
     (((hash_key_t)(0xaa))   << 34))
531 532 533 534 535 536 537 538 539 540 541 542

// service id max val is maxServiceCount = 16 (asn1_constants.h)

#define PDCP_COLL_KEY_MBMS_VALUE(mODULE_iD, rNTI, iS_eNB, sERVICE_ID, sESSION_ID) \
   ((hash_key_t)mODULE_iD              | \
    (((hash_key_t)(rNTI))       << 8)  | \
    (((hash_key_t)(iS_eNB))     << 24) | \
    (((hash_key_t)(sERVICE_ID)) << 32) | \
    (((hash_key_t)(sESSION_ID)) << 37) | \
    (((hash_key_t)(0x0000000000000001))  << 63))

public_pdcp(hash_table_t  *pdcp_coll_p;)
543 544

#endif
545
/*@}*/