pdcp.h 18.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 21

  Contact Information
gauthier's avatar
gauthier committed
22 23 24 25 26
  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.
27

gauthier's avatar
gauthier committed
28
 *******************************************************************************/
29 30

/*! \file pdcp.c
gauthier's avatar
gauthier committed
31
* \brief pdcp interface with RLC, RRC
32 33 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 66 67 68 69 70 71 72 73 74
* \author  Lionel GAUTHIER and Navid Nikaein
* \date 2009-2012
* \version 1.0
*/

#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
  #include "UTIL/MEM/mem_block.h"
  #include "UTIL/LISTS/list.h"
  #include "COMMON/mac_rrc_primitives.h"
#endif //NON_ACCESS_STRATUM
//-----------------------------------------------------------------------------
#include "COMMON/platform_constants.h"
75
#include "COMMON/platform_types.h"
76 77 78 79 80 81 82 83 84
#include "DRB-ToAddMod.h"
#include "DRB-ToAddModList.h"
#include "SRB-ToAddMod.h"
#include "SRB-ToAddModList.h"
#ifdef Rel10
#include "MBMS-SessionInfoList-r9.h"
#include "PMCH-InfoList-r9.h"
#endif

85

gauthier's avatar
gauthier committed
86 87
extern pthread_t       pdcp_thread;
extern pthread_attr_t  pdcp_thread_attr;
88
extern pthread_mutex_t pdcp_mutex;
gauthier's avatar
gauthier committed
89 90
extern pthread_cond_t  pdcp_cond;
extern int             pdcp_instance_cnt;
91

92
int init_pdcp_thread(void);
93 94
void cleanup_pdcp_thread(void);

95 96 97 98 99 100 101 102 103 104

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]);

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


116
typedef struct pdcp_t {
gauthier's avatar
gauthier committed
117
  boolean_t instanciated_instance;
gauthier's avatar
gauthier committed
118
  uint16_t       header_compression_profile;
119

120 121 122
  /* 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
123
  boolean_t is_ue;
124
  boolean_t is_srb;
125 126

  /* Configured security algorithms */
gauthier's avatar
gauthier committed
127 128
  uint8_t cipheringAlgorithm;
  uint8_t integrityProtAlgorithm;
129

130 131 132 133 134
  /* 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
135 136 137
  uint8_t *kUPenc;
  uint8_t *kRRCint;
  uint8_t *kRRCenc;
138

gauthier's avatar
gauthier committed
139
  uint8_t security_activated;
140

gauthier's avatar
gauthier committed
141
  rlc_mode_t rlc_mode;
gauthier's avatar
gauthier committed
142 143
  uint8_t status_report;
  uint8_t seq_num_size;
144

gauthier's avatar
gauthier committed
145
  logical_chan_id_t lcid;
146
  rb_id_t           rb_id;
147 148 149 150 151
  /*
   * Sequence number state variables
   *
   * TX and RX window
   */
gauthier's avatar
gauthier committed
152 153
  pdcp_sn_t next_pdcp_tx_sn;
  pdcp_sn_t next_pdcp_rx_sn;
154
  pdcp_sn_t next_pdcp_rx_sn_before_integrity;
155 156 157
  /*
   * TX and RX Hyper Frame Numbers
   */
gauthier's avatar
gauthier committed
158 159
  pdcp_hfn_t tx_hfn;
  pdcp_hfn_t rx_hfn;
160 161
  pdcp_hfn_offset_t rx_hfn_offset; // related to sn mismatch
  
162 163 164
  /*
   * SN of the last PDCP SDU delivered to upper layers
   */
gauthier's avatar
gauthier committed
165
  pdcp_sn_t  last_submitted_pdcp_rx_sn;
166 167 168 169 170 171

  /*
   * 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
172
  uint8_t missing_pdu_bitmap[512];
173 174 175 176 177
  /*
   * This is intentionally signed since we need a 'NULL' value
   * which is not also a valid sequence number
   */
  short int first_missing_pdu;
178 179 180 181 182
  /*
   * decipher using a different rx_hfn
   */
  
  
183 184
} pdcp_t;

gauthier's avatar
gauthier committed
185
#if defined(Rel10)
186
typedef struct pdcp_mbms_t {
gauthier's avatar
gauthier committed
187 188
  boolean_t instanciated_instance;
  rb_id_t   rb_id;
189
} pdcp_mbms_t;
gauthier's avatar
gauthier committed
190
#endif
191 192 193 194 195 196 197 198 199
/*
 * 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/
 */

200
/*! \fn boolean_t pdcp_data_req(module_id_t , module_id_t , frame_t , eNB_flag_t , srb_flag_t , rb_id_t , mui_t , confirm_t ,sdu_size_t , unsigned char* , pdcp_transmission_mode_t )
201
* \brief This functions handles data transfer requests coming either from RRC or from IP
gauthier's avatar
gauthier committed
202 203
* \param[in]  enb_mod_idP        Virtualized enb module identifier, Not used if eNB_flagP = 0.
* \param[in]  ue_mod_idP         Virtualized ue module identifier.
204 205 206
* \param[in] frame Frame number
* \param[in] Shows if relevant PDCP entity is part of an eNB or a UE
* \param[in] rab_id Radio Bearer ID
207
* \param[in] muiP
208 209 210
* \param[in] confirmP
* \param[in] sdu_buffer_size Size of incoming SDU in bytes
* \param[in] sdu_buffer Buffer carrying SDU
211
* \param[in] mode flag to indicate whether the userplane data belong to the control plane or data plane or transparent
212 213 214 215
* \return TRUE on success, FALSE otherwise
* \note None
* @ingroup _pdcp
*/
216 217 218 219 220 221 222 223 224 225 226 227 228 229
public_pdcp(boolean_t pdcp_data_req(
        const module_id_t eNB_id,
        const module_id_t UE_id,
        const frame_t frame,
        const eNB_flag_t eNB_flag,
        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));

/*! \fn boolean_t pdcp_data_ind(module_id_t, module_id_t, frame_t, eNB_flag_t, srb_flag_t, MBMS_flag_t, rb_id_t, sdu_size_t, mem_block_t*, boolean_t)
230
* \brief This functions handles data transfer indications coming from RLC
gauthier's avatar
gauthier committed
231 232
* \param[in]  enb_mod_idP        Virtualized enb module identifier, Not used if eNB_flagP = 0.
* \param[in]  ue_mod_idP         Virtualized ue module identifier.
233 234
* \param[in] frame Frame number
* \param[in] Shows if relevant PDCP entity is part of an eNB or a UE
235
* \param[in] Shows if rb is SRB
236 237 238 239 240 241 242 243 244
* \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
*/
245 246 247 248 249 250 251 252 253 254
public_pdcp(boolean_t pdcp_data_ind(
        const module_id_t eNB_id,
        const module_id_t UE_id,
        const frame_t frame,
        const eNB_flag_t eNB_flag,
        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));
255

gauthier's avatar
gauthier committed
256
/*! \fn void rrc_pdcp_config_req(module_id_t , module_id_t ,frame_t,eNB_flag_t,uint32_t,rb_id_t,uint8_t)
257
* \brief This functions initializes relevant PDCP entity
gauthier's avatar
gauthier committed
258 259 260 261 262 263 264
* \param[in]  enb_mod_idP        Virtualized enb module identifier, Not used if eNB_flagP = 0.
* \param[in]  ue_mod_idP         Virtualized ue module identifier.
* \param[in] frameP frame counter (TTI)
* \param[in] eNB_flagP flag indicating the node type
* \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
265 266 267
* \return none
* \note None
* @ingroup _pdcp
268
*/
269 270 271 272 273 274 275 276 277
public_pdcp(void rrc_pdcp_config_req (
        const module_id_t enb_idP,
        const module_id_t ue_idP,
        const frame_t     frameP,
        const eNB_flag_t  eNB_flagP,
        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
278 279

/*! \fn bool rrc_pdcp_config_asn1_req (module_id_t module_id, frame_t frame, eNB_flag_t eNB_flag, SRB_ToAddModList_t* srb2add_list, DRB_ToAddModList_t* drb2add_list, DRB_ToReleaseList_t*  drb2release_list)
280
* \brief  Function for RRC to configure a Radio Bearer.
gauthier's avatar
gauthier committed
281 282
* \param[in]  enb_mod_idP        Virtualized enb module identifier.
* \param[in]  ue_mod_idP         Virtualized ue module identifier.
283 284 285 286 287 288
* \param[in]  frame              Frame index.
* \param[in]  eNB_flag           Flag to indicate eNB (1) or UE (0)
* \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.
289 290 291 292
* \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
293 294
* \return     A status about the processing, OK or error code.
*/
295
public_pdcp(
296 297 298 299 300 301 302 303 304 305 306 307
boolean_t rrc_pdcp_config_asn1_req (
        const module_id_t          eNB_idP,
        const module_id_t          ue_idP,
        const frame_t              frameP,
        const eNB_flag_t           eNB_flagP,
        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
308
#ifdef Rel10
309
        ,PMCH_InfoList_r9_t  *pmch_InfoList_r9
310
#endif
311
                               ));
312

313
/*! \fn boolean_t pdcp_config_req_asn1 (module_id_t module_id, frame_t frame, eNB_flag_t eNB_flag, 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)
314
* \brief  Function for RRC to configure a Radio Bearer.
gauthier's avatar
gauthier committed
315 316 317
* \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.
318 319
* \param[in]  frame              Frame index.
* \param[in]  eNB_flag           Flag to indicate eNB (1) or UE (0)
320
* \param[in]  srb_flagP          Flag to indicate SRB (1) or DRB (0)
321 322 323 324 325 326
* \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
327 328 329
* \param[in]  kRRCenc            RRC encryption key
* \param[in]  kRRCint            RRC integrity key
* \param[in]  kUPenc             User-Plane encryption key
330 331
* \return     A status about the processing, OK or error code.
*/
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350
public_pdcp(boolean_t pdcp_config_req_asn1 (
        pdcp_t         *const pdcp_pP,
        const module_id_t      enb_idP,
        const module_id_t      ue_idP,
        const frame_t          frameP,
        const eNB_flag_t       eNB_flagP,
        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));
351 352 353 354 355 356 357 358 359 360
/*! \fn void rrc_pdcp_config_release(module_id_t, rb_id_t)
* \brief This functions is unused
* \param[in] module_id Module ID of relevant PDCP entity
* \param[in] rab_id Radio Bearer ID of relevant PDCP entity
* \return none
* \note None
* @ingroup _pdcp
*/
//public_pdcp(void rrc_pdcp_config_release (module_id_t, rb_id_t);)

gauthier's avatar
gauthier committed
361
/*! \fn void pdcp_run(frame_t, eNB_flag_t, module_id_t,module_id_t)
362 363 364
* \brief Runs PDCP entity to let it handle incoming/outgoing SDUs
* \param[in] frame Frame number
* \param[in] eNB_flag Indicates if this PDCP entity belongs to an eNB or to a UE
gauthier's avatar
gauthier committed
365 366
* \param[in]  enb_mod_idP        Virtualized enb module identifier, Not used if eNB_flagP = 0.
* \param[in]  ue_mod_idP         Virtualized ue module identifier.
367 368 369 370
* \return none
* \note None
* @ingroup _pdcp
*/
371 372 373 374 375
public_pdcp(void pdcp_run            (
        const frame_t frameP,
        const eNB_flag_t eNB_flagP,
        const module_id_t ue_mod_idP,
        const module_id_t enb_mod_idP);)
gauthier's avatar
gauthier committed
376 377 378 379 380
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);)
public_pdcp(int pdcp_netlink_init    (void);)
381 382 383 384

#define PDCP2NAS_FIFO 21
#define NAS2PDCP_FIFO 22

385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
protected_pdcp_fifo(int pdcp_fifo_flush_sdus                      (
        const frame_t frameP,
        const eNB_flag_t eNB_flagP,
        const module_id_t enb_idP,
        const module_id_t ue_mod_idP);)
protected_pdcp_fifo(int pdcp_fifo_read_input_sdus_remaining_bytes (
        const frame_t frameP,
        const eNB_flag_t eNB_flagP);)
protected_pdcp_fifo(int pdcp_fifo_read_input_sdus                 (
        const frame_t frameP,
        const eNB_flag_t eNB_flagP,
        const module_id_t ue_mod_idP,
        const module_id_t enb_mod_idP);)
protected_pdcp_fifo(void pdcp_fifo_read_input_sdus_from_otg       (
        const frame_t frameP,
        const eNB_flag_t eNB_flagP,
        const module_id_t ue_mod_idP,
        const module_id_t enb_mod_idP);)
403 404 405 406 407 408

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

/*
 * Following two types are utilized between NAS driver and PDCP
 */
409 410 411


typedef struct pdcp_data_req_header_s {
412
  rb_id_t             rb_id;
413
  sdu_size_t          data_size;
gauthier's avatar
gauthier committed
414
  signed int          inst;
gauthier's avatar
gauthier committed
415
  ip_traffic_type_t   traffic_type;
416
} pdcp_data_req_header_t;
417 418

typedef struct pdcp_data_ind_header_s {
419
  rb_id_t             rb_id;
420
  sdu_size_t          data_size;
gauthier's avatar
gauthier committed
421
  signed int          inst;
gauthier's avatar
gauthier committed
422
  ip_traffic_type_t   dummy_traffic_type;
423 424
} pdcp_data_ind_header_t;

425 426 427 428 429 430 431
struct pdcp_netlink_element_s {
    pdcp_data_req_header_t pdcp_read_header;

    /* Data part of the message */
    uint8_t *data;
};

432 433
#if 0
/*
434
 * Missing PDU information struct, a copy of this will be enqueued
435 436 437
 * into pdcp.missing_pdus for every missing PDU
 */
typedef struct pdcp_missing_pdu_info_t {
gauthier's avatar
gauthier committed
438
  pdcp_sn_t sequence_number;
439 440 441 442 443 444 445 446 447 448 449
} 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

450 451 452 453 454 455 456 457 458 459 460 461 462 463 464
/*
 * Reordering_Window: half of the PDCP SN space
 */ 
#define REORDERING_WINDOW_SN_5BIT 16
#define REORDERING_WINDOW_SN_7BIT 64
#define REORDERING_WINDOW_SN_12BIT 2048

/* 
 * SN size 
 */
#define PDCP_SN_5BIT  5
#define PDCP_SN_7BIT  7
#define PDCP_SN_12BIT 12
 

465
protected_pdcp(signed int             pdcp_2_nas_irq;)
466 467 468 469
public_pdcp(pdcp_stats_t              UE_pdcp_stats[NUMBER_OF_UE_MAX];)
public_pdcp(pdcp_stats_t              eNB_pdcp_stats[NUMBER_OF_eNB_MAX];)
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];)
470
public_pdcp(pdcp_t                 pdcp_array_srb_eNB[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][2];)
471
protected_pdcp(pdcp_t                 pdcp_array_drb_eNB[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][maxDRB];)
gauthier's avatar
gauthier committed
472 473 474 475
#if defined(Rel10)
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
476 477 478 479 480 481 482 483 484 485 486
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;)

#endif