cryptodev: fix ABI breakage

In 17.08, the crypto operation was restructured,
and some reserved bytes (5) were added  to have the mempool
pointer aligned to 64 bits, since the structure is expected
to be aligned to 64 bits, allowing future additions with no
ABI breakage needed.

In 18.05, a new 2-byte field was added, so the reserved bytes
were reduced to 3. However, this field was added after the first 3 bytes
of the structure, causing it to be placed in an offset of 4 bytes,
and therefore, forcing the mempool pointer to be placed after 16 bytes,
instead of a 8 bytes, causing unintentionally the ABI breakage.

This commit fixes the breakage, by swapping the reserved bytes
and the private_data_offset field, so the latter is aligned to 2 bytes
and the offset of the mempool pointer returns to its original offset,
8 bytes.

Fixes: 54c836846603 ("cryptodev: set private data for session-less mode")
Cc: stable@dpdk.org

Reported-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Acked-by: Abhinandan Gujjar <abhinandan.gujjar@intel.com>
This commit is contained in:
Pablo de Lara 2018-06-13 10:36:48 +01:00
parent 510d391ab9
commit ce5e6bf69e

View File

@ -73,26 +73,37 @@ enum rte_crypto_op_sess_type {
* rte_cryptodev_enqueue_burst() / rte_cryptodev_dequeue_burst() . * rte_cryptodev_enqueue_burst() / rte_cryptodev_dequeue_burst() .
*/ */
struct rte_crypto_op { struct rte_crypto_op {
uint8_t type; __extension__
/**< operation type */ union {
uint8_t status; uint64_t raw;
/**< __extension__
* operation status - this is reset to struct {
* RTE_CRYPTO_OP_STATUS_NOT_PROCESSED on allocation from mempool and uint8_t type;
* will be set to RTE_CRYPTO_OP_STATUS_SUCCESS after crypto operation /**< operation type */
* is successfully processed by a crypto PMD uint8_t status;
*/ /**<
uint8_t sess_type; * operation status - this is reset to
/**< operation session type */ * RTE_CRYPTO_OP_STATUS_NOT_PROCESSED on allocation
uint16_t private_data_offset; * from mempool and will be set to
/**< Offset to indicate start of private data (if any). The offset * RTE_CRYPTO_OP_STATUS_SUCCESS after crypto operation
* is counted from the start of the rte_crypto_op including IV. * is successfully processed by a crypto PMD
* The private data may be used by the application to store */
* information which should remain untouched in the library/driver uint8_t sess_type;
*/ /**< operation session type */
uint8_t reserved[3];
uint8_t reserved[3]; /**< Reserved bytes to fill 64 bits for
/**< Reserved bytes to fill 64 bits for future additions */ * future additions
*/
uint16_t private_data_offset;
/**< Offset to indicate start of private data (if any).
* The offset is counted from the start of the
* rte_crypto_op including IV.
* The private data may be used by the application
* to store information which should remain untouched
* in the library/driver
*/
};
};
struct rte_mempool *mempool; struct rte_mempool *mempool;
/**< crypto operation mempool which operation is allocated from */ /**< crypto operation mempool which operation is allocated from */