> diff --git a/doc/guides/prog_guide/pdcp_lib.rst
> b/doc/guides/prog_guide/pdcp_lib.rst
> new file mode 100644
> index 0000000000..abd874f2cc
> --- /dev/null
> +++ b/doc/guides/prog_guide/pdcp_lib.rst
> @@ -0,0 +1,246 @@
> +..  SPDX-License-Identifier: BSD-3-Clause
> +    Copyright(C) 2023 Marvell.
> +
> +PDCP Protocol Processing Library
> +================================
> +
> +DPDK provides a library for PDCP protocol processing. The library utilizes
> +other DPDK libraries such as cryptodev, reorder, etc., to provide the
> +application with a transparent and high performant PDCP protocol processing
> +library.
> +
> +The library abstracts complete PDCP protocol processing conforming to
> +``ETSI TS 138 323 V17.1.0 (2022-08)``.
> +https://www.etsi.org/deliver/etsi_ts/138300_138399/138323/17.01.00_60/ts_
> 138323v170100p.pdf
> +
> +PDCP would involve the following operations,
> +
> +1. Transfer of user plane data
> +2. Transfer of control plane data
> +3. Header compression
> +4. Uplink data compression
> +5. Ciphering and integrity protection
> +
> +.. _figure_pdcp_functional_overview:
> +
> +.. figure:: img/pdcp_functional_overview.*
> +
> +   PDCP functional overview new
> +
> +PDCP library would abstract the protocol offload features of the cryptodev 
> and
> +would provide a uniform interface and consistent API usage to work with
> +cryptodev irrespective of the protocol offload features supported.
> +
> +PDCP entity API
> +---------------
> +
> +PDCP library provides following control path APIs that is used to
> +configure various PDCP entities,
> +
> +1. ``rte_pdcp_entity_establish()``
> +2. ``rte_pdcp_entity_suspend()``
> +3. ``rte_pdcp_entity_release()``
> +
> +A PDCP entity would translate to one ``rte_cryptodev_sym_session`` or
> +``rte_security_session`` based on the config. The sessions would be created/
> +destroyed while corresponding PDCP entity operations are performed.

Please explain the difference between suspend and release here.

> +
> +PDCP PDU (Protocol Data Unit)
> +-----------------------------
> +
> +PDCP PDUs can be categorized as,
> +
> +1. Control PDU
> +2. Data PDU
> +
> +Control PDUs are used for signalling between entities on either end and can 
> be
> +one of the following,
> +
> +1. PDCP status report
> +2. ROHC feedback
> +3. EHC feedback
> +
> +Control PDUs are not ciphered or authenticated, and so such packets are not
> +submitted to cryptodev for processing.
> +
> +Data PDUs are regular packets submitted by upper layers for transmission to
> +other end. Such packets would need to be ciphered and authenticated based on
> +the entity configuration.
> +
Please move the PDCP PDU section above PDCP entity API section.
So that all APIs are together.


> +PDCP packet processing API for data PDU
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +PDCP processing is split into 2 parts. One before cryptodev processing
> +(``rte_pdcp_pkt_pre_process()``) and one after cryptodev processing
> +(``rte_pdcp_pkt_post_process()``). Since cryptodev dequeue can return crypto
> +operations belonging to multiple entities, ``rte_pdcp_pkt_crypto_group()``
> +is added to help grouping crypto operations belonging to same PDCP entity.
> +
> +Lib PDCP would allow application to use same API sequence while leveraging
> +protocol offload features enabled by ``rte_security`` library. Lib PDCP would
> +internally change the handles registered for ``pre_process`` and
> +``post_process`` based on features enabled in the entity.
> +
> +Lib PDCP would create the required sessions on the device provided in entity 
> to
> +minimize the application requirements. Also, the crypto_op allocation and 
> free
> +would also be done internally by lib PDCP to allow the library to create
> +crypto ops as required for the input packets. For example, when control PDUs
> are
> +received, no cryptodev enqueue-dequeue is expected for the same and lib
> PDCP
> +is expected to handle it differently.
> +
> +Sample API usage
> +----------------
> +
> +The ``rte_pdcp_entity_conf`` structure is used to pass the configuration
> +parameters for entity creation.
> +
> +.. literalinclude:: ../../../lib/pdcp/rte_pdcp.h
> +   :language: c
> +   :start-after: Structure rte_pdcp_entity_conf 8<
> +   :end-before: >8 End of structure rte_pdcp_entity_conf.
> +
> +.. code-block:: c
> +
> +     struct rte_mbuf **out_mb, *pkts[MAX_BURST_SIZE];
> +     struct rte_crypto_op *cop[MAX_BURST_SIZE];
> +     struct rte_pdcp_group grp[MAX_BURST_SIZE];
> +     struct rte_pdcp_entity *pdcp_entity;
> +     int nb_max_out_mb, ret, nb_grp;
> +     uint16_t nb_ops;
> +
> +     /* Create PDCP entity */
> +     pdcp_entity = rte_pdcp_entity_establish(&conf);
> +
> +     /**
> +      * Allocate buffer for holding mbufs returned during PDCP suspend,
> +      * release & post-process APIs.
> +      */
> +
> +     /* Max packets that can be cached in entity + burst size */
> +     nb_max_out_mb = pdcp_entity->max_pkt_cache + MAX_BURST_SIZE;
> +     out_mb = rte_malloc(NULL, nb_max_out_mb * sizeof(uintptr_t), 0);
> +     if (out_mb == NULL) {
> +             /* Handle error */
> +     }
> +
> +     while (1) {
> +             /* Receive packet and form mbuf */
> +
> +             /**
> +              * Prepare packets for crypto operation. Following operations
> +              * would be done,
> +              *
> +              * Transmitting entity/UL (only data PDUs):
> +              *  - Perform compression
> +              *  - Assign sequence number
> +              *  - Add PDCP header
> +              *  - Create & prepare crypto_op
> +              *  - Prepare IV for crypto operation (auth_gen, encrypt)
> +              *  - Save original PDCP SDU (during PDCP re-establishment,
> +              *    unconfirmed PDCP SDUs need to crypto processed again
> and
> +              *    transmitted/re-transmitted)
> +              *
> +              *  Receiving entity/DL:
> +              *  - Any control PDUs received would be processed and
> +              *    appropriate actions taken. If data PDU, continue.
> +              *  - Determine sequence number (based on HFN & per packet
> SN)
> +              *  - Prepare crypto_op
> +              *  - Prepare IV for crypto operation (decrypt, auth_verify)
> +              */
> +             nb_success = rte_pdcp_pkt_pre_process(pdcp_entity, pkts, cop,
> +                                                   nb_rx, &nb_err);
> +             if (nb_err != 0) {
> +                     /* Handle error packets */
> +             }
> +
> +             if ((rte_cryptodev_enqueue_burst(dev_id, qp_id, cop,
> nb_success)
> +                             != nb_success) {
> +                     /* Retry for enqueue failure packets */
> +             }
> +
> +             ...
> +
> +             nb_ops = rte_cryptodev_dequeue_burst(dev_id, qp_id, cop,
> +                                               MAX_BURST_SIZE);
> +             if (nb_ops == 0)
> +                     continue;
> +
> +             /**
> +              * Received a burst of completed crypto ops from cryptodev. It
> +              * may belong to various entities. Group similar ones together
> +              * for entity specific post-processing.
> +              */
> +
> +             /**
> +              * Groups similar entities together. Frees crypto op and based
> +              * on crypto_op status, set mbuf->ol_flags which would be
> +              * checked in rte_pdcp_pkt_post_process().
> +              */
> +             nb_grp = rte_pdcp_pkt_crypto_group(cop, pkts, grp, ret);
> +
> +             for (i = 0; i != nb_grp; i++) {
> +
> +                     /**
> +                      * Post process packets after crypto completion.
> +                      * Following operations would be done,
> +                      *
> +                      *  Transmitting entity/UL:
> +                      *  - Check crypto result
> +                      *
> +                      *  Receiving entity/DL:
> +                      *  - Check crypto operation status
> +                      *  - Check for duplication (if yes, drop duplicate)
> +                      *  - Perform decompression
> +                      *  - Trim PDCP header
> +                      *  - Hold packet (SDU) for in-order delivery (return
> +                      *    completed packets as and when sequence is
> +                      *    completed)
> +                      *  - If not in sequence, cache the packet and start
> +                      *    t-Reordering timer. When timer expires, the
> +                      *    packets need to delivered to upper layers (not
> +                      *    treated as error packets).
> +                      */
> +                     nb_success = rte_pdcp_pkt_post_process(grp[i].id.ptr,
> +                                                            grp[i].m, out_mb,
> +                                                            grp[i].cnt,
> +                                                            &nb_err);
> +                     if (nb_err != 0) {
> +                             /* Handle error packets */
> +                     }
> +
> +                     /* Perform additional operations */
> +
> +                     /**
> +                      * Transmitting entity/UL
> +                      * - If duplication is enabled, duplicate PDCP PDUs
> +                      * - When lower layers confirm reception of a PDCP
> PDU,
> +                      *   it should be communicated to PDCP layer so that
> +                      *   PDCP can drop the corresponding SDU
> +                      */
> +             }
> +     }
> +
> +
> +Supported features
> +------------------
> +
> +- 12 bit & 18 bit sequence numbers
> +- Uplink & downlink traffic
> +- HFN increment
> +- IV generation as required per algorithm
> +
> +Supported ciphering algorithms
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +- NULL
> +- AES-CTR
> +- SNOW3G-CIPHER
> +- ZUC-CIPHER
> +
> +Supported integrity protection algorithms
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +- NULL
> +- AES-CMAC
> +- SNOW3G-AUTH
> +- ZUC-AUTH
> --
Move Supported features and algos after PDCP PDU explanation.
Sample sequence should be in the end.

Reply via email to