From: Hemant Agrawal <hemant.agrawal@nxp.com>
To: dev@dpdk.org
Cc: akhil.goyal@nxp.com, thierry.herbelot@6wind.com,
Hemant Agrawal <hemant.agrawal@nxp.com>
Subject: [dpdk-dev] [PATCH] crypto/dpaa_sec: enable compilation without security
Date: Fri, 18 Oct 2019 13:26:13 +0530 [thread overview]
Message-ID: <20191018075613.2784-3-hemant.agrawal@nxp.com> (raw)
In-Reply-To: <20191018075613.2784-1-hemant.agrawal@nxp.com>
This patch enables the dpaaX_sec compilation when SECURITY
is disabled.
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
drivers/crypto/Makefile | 4 ++--
drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c | 26 +++++++++++++++------
drivers/crypto/dpaa2_sec/dpaa2_sec_priv.h | 11 +++++++--
drivers/crypto/dpaa_sec/dpaa_sec.c | 25 ++++++++++++++------
drivers/crypto/dpaa_sec/dpaa_sec.h | 10 ++++++--
mk/rte.app.mk | 4 ++--
6 files changed, 58 insertions(+), 22 deletions(-)
diff --git a/drivers/crypto/Makefile b/drivers/crypto/Makefile
index 8b0085792..47a2a9e79 100644
--- a/drivers/crypto/Makefile
+++ b/drivers/crypto/Makefile
@@ -16,14 +16,14 @@ DIRS-$(CONFIG_RTE_LIBRTE_PMD_KASUMI) += kasumi
DIRS-$(CONFIG_RTE_LIBRTE_PMD_ZUC) += zuc
DIRS-$(CONFIG_RTE_LIBRTE_PMD_MVSAM_CRYPTO) += mvsam
DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO) += null
-ifeq ($(CONFIG_RTE_LIBRTE_SECURITY),y)
ifeq ($(CONFIG_RTE_EAL_VFIO)$(CONFIG_RTE_LIBRTE_FSLMC_BUS),yy)
DIRS-$(CONFIG_RTE_LIBRTE_PMD_DPAA2_SEC) += dpaa2_sec
endif # CONFIG_RTE_LIBRTE_FSLMC_BUS
ifeq ($(CONFIG_RTE_LIBRTE_DPAA_BUS),y)
DIRS-$(CONFIG_RTE_LIBRTE_PMD_DPAA_SEC) += dpaa_sec
-DIRS-$(CONFIG_RTE_LIBRTE_PMD_CAAM_JR) += caam_jr
endif # CONFIG_RTE_LIBRTE_PMD_DPAA_SEC
+ifeq ($(CONFIG_RTE_LIBRTE_SECURITY),y)
+DIRS-$(CONFIG_RTE_LIBRTE_PMD_CAAM_JR) += caam_jr
endif # CONFIG_RTE_LIBRTE_SECURITY
DIRS-$(CONFIG_RTE_LIBRTE_PMD_VIRTIO_CRYPTO) += virtio
DIRS-$(CONFIG_RTE_LIBRTE_PMD_NITROX) += nitrox
diff --git a/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c b/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c
index b33dbca8b..41dbbb7da 100644
--- a/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c
+++ b/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c
@@ -166,6 +166,7 @@ build_proto_compound_sg_fd(dpaa2_sec_session *sess,
ip_fle->length = in_len;
DPAA2_SET_FLE_FIN(sge);
+#ifdef RTE_LIBRTE_SECURITY
/* In case of PDCP, per packet HFN is stored in
* mbuf priv after sym_op.
*/
@@ -176,6 +177,7 @@ build_proto_compound_sg_fd(dpaa2_sec_session *sess,
DPAA2_SET_FLE_INTERNAL_JD(op_fle, hfn_ovd);
DPAA2_SET_FD_INTERNAL_JD(fd, hfn_ovd);
}
+#endif
DPAA2_SET_FD_LEN(fd, ip_fle->length);
return 0;
@@ -241,6 +243,7 @@ build_proto_compound_fd(dpaa2_sec_session *sess,
DPAA2_SET_FD_LEN(fd, ip_fle->length);
DPAA2_SET_FLE_FIN(ip_fle);
+#ifdef RTE_LIBRTE_SECURITY
/* In case of PDCP, per packet HFN is stored in
* mbuf priv after sym_op.
*/
@@ -251,7 +254,7 @@ build_proto_compound_fd(dpaa2_sec_session *sess,
DPAA2_SET_FLE_INTERNAL_JD(op_fle, hfn_ovd);
DPAA2_SET_FD_INTERNAL_JD(fd, hfn_ovd);
}
-
+#endif
return 0;
}
@@ -1358,9 +1361,11 @@ build_sec_fd(struct rte_crypto_op *op,
if (op->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
sess = (dpaa2_sec_session *)get_sym_session_private_data(
op->sym->session, cryptodev_driver_id);
+#ifdef RTE_LIBRTE_SECURITY
else if (op->sess_type == RTE_CRYPTO_OP_SECURITY_SESSION)
sess = (dpaa2_sec_session *)get_sec_session_private_data(
op->sym->sec_session);
+#endif
else
return -1;
@@ -1506,7 +1511,7 @@ sec_simple_fd_to_mbuf(const struct qbman_fd *fd)
struct rte_crypto_op *op;
uint16_t len = DPAA2_GET_FD_LEN(fd);
uint16_t diff = 0;
- dpaa2_sec_session *sess_priv;
+ dpaa2_sec_session *sess_priv __rte_unused;
struct rte_mbuf *mbuf = DPAA2_INLINE_MBUF_FROM_BUF(
DPAA2_IOVA_TO_VADDR(DPAA2_GET_FD_ADDR(fd)),
@@ -1519,13 +1524,14 @@ sec_simple_fd_to_mbuf(const struct qbman_fd *fd)
mbuf->buf_iova = op->sym->aead.digest.phys_addr;
op->sym->aead.digest.phys_addr = 0L;
+#ifdef RTE_LIBRTE_SECURITY
sess_priv = (dpaa2_sec_session *)get_sec_session_private_data(
op->sym->sec_session);
if (sess_priv->dir == DIR_ENC)
mbuf->data_off += SEC_FLC_DHR_OUTBOUND;
else
mbuf->data_off += SEC_FLC_DHR_INBOUND;
-
+#endif
return op;
}
@@ -1569,6 +1575,7 @@ sec_fd_to_mbuf(const struct qbman_fd *fd)
} else
dst = src;
+#ifdef RTE_LIBRTE_SECURITY
if (op->sess_type == RTE_CRYPTO_OP_SECURITY_SESSION) {
dpaa2_sec_session *sess = (dpaa2_sec_session *)
get_sec_session_private_data(op->sym->sec_session);
@@ -1583,7 +1590,7 @@ sec_fd_to_mbuf(const struct qbman_fd *fd)
dst->data_len = len;
}
}
-
+#endif
DPAA2_SEC_DP_DEBUG("mbuf %p BMAN buf addr %p,"
" fdaddr =%" PRIx64 " bpid =%d meta =%d off =%d, len =%d\n",
(void *)dst,
@@ -2500,6 +2507,7 @@ dpaa2_sec_set_session_parameters(struct rte_cryptodev *dev,
return ret;
}
+#ifdef RTE_LIBRTE_SECURITY
static int
dpaa2_sec_ipsec_aead_init(struct rte_crypto_aead_xform *aead_xform,
dpaa2_sec_session *session,
@@ -3172,7 +3180,7 @@ dpaa2_sec_security_session_destroy(void *dev __rte_unused,
}
return 0;
}
-
+#endif
static int
dpaa2_sec_sym_session_configure(struct rte_cryptodev *dev,
struct rte_crypto_sym_xform *xform,
@@ -3561,6 +3569,7 @@ static struct rte_cryptodev_ops crypto_ops = {
.sym_session_clear = dpaa2_sec_sym_session_clear,
};
+#ifdef RTE_LIBRTE_SECURITY
static const struct rte_security_capability *
dpaa2_sec_capabilities_get(void *device __rte_unused)
{
@@ -3575,6 +3584,7 @@ static const struct rte_security_ops dpaa2_sec_security_ops = {
.set_pkt_metadata = NULL,
.capabilities_get = dpaa2_sec_capabilities_get
};
+#endif
static int
dpaa2_sec_uninit(const struct rte_cryptodev *dev)
@@ -3597,7 +3607,9 @@ dpaa2_sec_dev_init(struct rte_cryptodev *cryptodev)
struct dpaa2_sec_dev_private *internals;
struct rte_device *dev = cryptodev->device;
struct rte_dpaa2_device *dpaa2_dev;
+#ifdef RTE_LIBRTE_SECURITY
struct rte_security_ctx *security_instance;
+#endif
struct fsl_mc_io *dpseci;
uint16_t token;
struct dpseci_attr attr;
@@ -3638,7 +3650,7 @@ dpaa2_sec_dev_init(struct rte_cryptodev *cryptodev)
DPAA2_SEC_DEBUG("Device already init by primary process");
return 0;
}
-
+#ifdef RTE_LIBRTE_SECURITY
/* Initialize security_ctx only for primary process*/
security_instance = rte_malloc("rte_security_instances_ops",
sizeof(struct rte_security_ctx), 0);
@@ -3648,7 +3660,7 @@ dpaa2_sec_dev_init(struct rte_cryptodev *cryptodev)
security_instance->ops = &dpaa2_sec_security_ops;
security_instance->sess_cnt = 0;
cryptodev->security_ctx = security_instance;
-
+#endif
/*Open the rte device via MC and save the handle for further use*/
dpseci = (struct fsl_mc_io *)rte_calloc(NULL, 1,
sizeof(struct fsl_mc_io), 0);
diff --git a/drivers/crypto/dpaa2_sec/dpaa2_sec_priv.h b/drivers/crypto/dpaa2_sec/dpaa2_sec_priv.h
index ca4fcfe9b..648bf8045 100644
--- a/drivers/crypto/dpaa2_sec/dpaa2_sec_priv.h
+++ b/drivers/crypto/dpaa2_sec/dpaa2_sec_priv.h
@@ -8,7 +8,9 @@
#ifndef _RTE_DPAA2_SEC_PMD_PRIVATE_H_
#define _RTE_DPAA2_SEC_PMD_PRIVATE_H_
+#ifdef RTE_LIBRTE_SECURITY
#include <rte_security_driver.h>
+#endif
#define CRYPTODEV_NAME_DPAA2_SEC_PMD crypto_dpaa2_sec
/**< NXP DPAA2 - SEC PMD device name */
@@ -139,6 +141,7 @@ struct dpaa2_sec_aead_ctxt {
uint8_t auth_cipher_text; /**< Authenticate/cipher ordering */
};
+#ifdef RTE_LIBRTE_SECURITY
/*
* The structure is to be filled by user for PDCP Protocol
*/
@@ -154,7 +157,7 @@ struct dpaa2_pdcp_ctxt {
uint32_t hfn; /*!< Hyper Frame Number */
uint32_t hfn_threshold; /*!< HFN Threashold for key renegotiation */
};
-
+#endif
typedef struct dpaa2_sec_session_entry {
void *ctxt;
uint8_t ctxt_type;
@@ -190,7 +193,9 @@ typedef struct dpaa2_sec_session_entry {
struct dpaa2_sec_aead_ctxt aead_ctxt;
} ext_params;
};
+#ifdef RTE_LIBRTE_SECURITY
struct dpaa2_pdcp_ctxt pdcp;
+#endif
};
} dpaa2_sec_session;
@@ -504,6 +509,8 @@ static const struct rte_cryptodev_capabilities dpaa2_sec_capabilities[] = {
RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
};
+#ifdef RTE_LIBRTE_SECURITY
+
static const struct rte_cryptodev_capabilities dpaa2_pdcp_capabilities[] = {
{ /* SNOW 3G (UIA2) */
.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
@@ -705,7 +712,7 @@ static const struct rte_security_capability dpaa2_sec_security_cap[] = {
.action = RTE_SECURITY_ACTION_TYPE_NONE
}
};
-
+#endif
/**
* Checksum
*
diff --git a/drivers/crypto/dpaa_sec/dpaa_sec.c b/drivers/crypto/dpaa_sec/dpaa_sec.c
index 7c37136fa..4adaadf5f 100644
--- a/drivers/crypto/dpaa_sec/dpaa_sec.c
+++ b/drivers/crypto/dpaa_sec/dpaa_sec.c
@@ -15,7 +15,9 @@
#include <rte_cryptodev_pmd.h>
#include <rte_crypto.h>
#include <rte_cryptodev.h>
+#ifdef RTE_LIBRTE_SECURITY
#include <rte_security_driver.h>
+#endif
#include <rte_cycles.h>
#include <rte_dev.h>
#include <rte_kvargs.h>
@@ -252,6 +254,7 @@ static inline int is_decode(dpaa_sec_session *ses)
return ses->dir == DIR_DEC;
}
+#ifdef RTE_LIBRTE_SECURITY
static int
dpaa_sec_prep_pdcp_cdb(dpaa_sec_session *ses)
{
@@ -355,7 +358,6 @@ dpaa_sec_prep_pdcp_cdb(dpaa_sec_session *ses)
ses->pdcp.hfn_threshold,
&cipherdata, p_authdata, 0);
}
-
return shared_desc_len;
}
@@ -432,7 +434,7 @@ dpaa_sec_prep_ipsec_cdb(dpaa_sec_session *ses)
}
return shared_desc_len;
}
-
+#endif
/* prepare command block of the session */
static int
dpaa_sec_prep_cdb(dpaa_sec_session *ses)
@@ -450,12 +452,14 @@ dpaa_sec_prep_cdb(dpaa_sec_session *ses)
memset(cdb, 0, sizeof(struct sec_cdb));
switch (ses->ctxt) {
+#ifdef RTE_LIBRTE_SECURITY
case DPAA_SEC_IPSEC:
shared_desc_len = dpaa_sec_prep_ipsec_cdb(ses);
break;
case DPAA_SEC_PDCP:
shared_desc_len = dpaa_sec_prep_pdcp_cdb(ses);
break;
+#endif
case DPAA_SEC_CIPHER:
alginfo_c.key = (size_t)ses->cipher_key.data;
alginfo_c.keylen = ses->cipher_key.length;
@@ -1753,11 +1757,13 @@ dpaa_sec_enqueue_burst(void *qp, struct rte_crypto_op **ops,
op->sym->session,
cryptodev_driver_id);
break;
+#ifdef RTE_LIBRTE_SECURITY
case RTE_CRYPTO_OP_SECURITY_SESSION:
ses = (dpaa_sec_session *)
get_sec_session_private_data(
op->sym->sec_session);
break;
+#endif
default:
DPAA_SEC_DP_ERR(
"sessionless crypto op not supported");
@@ -1877,6 +1883,7 @@ dpaa_sec_enqueue_burst(void *qp, struct rte_crypto_op **ops,
((auth_tail_len << 16) | auth_hdr_len);
}
+#ifdef RTE_LIBRTE_SECURITY
/* In case of PDCP, per packet HFN is stored in
* mbuf priv after sym_op.
*/
@@ -1889,7 +1896,7 @@ dpaa_sec_enqueue_burst(void *qp, struct rte_crypto_op **ops,
ses->pdcp.hfn_ovd_offset)),
ses->pdcp.hfn_ovd);
}
-
+#endif
}
send_pkts:
loop = 0;
@@ -2483,6 +2490,7 @@ dpaa_sec_sym_session_clear(struct rte_cryptodev *dev,
}
}
+#ifdef RTE_LIBRTE_SECURITY
static int
dpaa_sec_set_ipsec_session(__rte_unused struct rte_cryptodev *dev,
struct rte_security_session_conf *conf,
@@ -2906,7 +2914,7 @@ dpaa_sec_security_session_destroy(void *dev __rte_unused,
}
return 0;
}
-
+#endif
static int
dpaa_sec_dev_configure(struct rte_cryptodev *dev __rte_unused,
struct rte_cryptodev_config *config __rte_unused)
@@ -3152,6 +3160,7 @@ static struct rte_cryptodev_ops crypto_ops = {
.sym_session_clear = dpaa_sec_sym_session_clear
};
+#ifdef RTE_LIBRTE_SECURITY
static const struct rte_security_capability *
dpaa_sec_capabilities_get(void *device __rte_unused)
{
@@ -3166,7 +3175,7 @@ static const struct rte_security_ops dpaa_sec_security_ops = {
.set_pkt_metadata = NULL,
.capabilities_get = dpaa_sec_capabilities_get
};
-
+#endif
static int
dpaa_sec_uninit(struct rte_cryptodev *dev)
{
@@ -3190,7 +3199,9 @@ static int
dpaa_sec_dev_init(struct rte_cryptodev *cryptodev)
{
struct dpaa_sec_dev_private *internals;
+#ifdef RTE_LIBRTE_SECURITY
struct rte_security_ctx *security_instance;
+#endif
struct dpaa_sec_qp *qp;
uint32_t i, flags;
int ret;
@@ -3225,7 +3236,7 @@ dpaa_sec_dev_init(struct rte_cryptodev *cryptodev)
DPAA_SEC_WARN("Device already init by primary process");
return 0;
}
-
+#ifdef RTE_LIBRTE_SECURITY
/* Initialize security_ctx only for primary process*/
security_instance = rte_malloc("rte_security_instances_ops",
sizeof(struct rte_security_ctx), 0);
@@ -3235,7 +3246,7 @@ dpaa_sec_dev_init(struct rte_cryptodev *cryptodev)
security_instance->ops = &dpaa_sec_security_ops;
security_instance->sess_cnt = 0;
cryptodev->security_ctx = security_instance;
-
+#endif
rte_spinlock_init(&internals->lock);
for (i = 0; i < internals->max_nb_queue_pairs; i++) {
/* init qman fq for queue pair */
diff --git a/drivers/crypto/dpaa_sec/dpaa_sec.h b/drivers/crypto/dpaa_sec/dpaa_sec.h
index a661d5a56..85aa6f6a0 100644
--- a/drivers/crypto/dpaa_sec/dpaa_sec.h
+++ b/drivers/crypto/dpaa_sec/dpaa_sec.h
@@ -98,7 +98,7 @@ struct sec_cdb {
uint32_t sh_desc[DPAA_SEC_MAX_DESC_SIZE];
};
-
+#ifdef RTE_LIBRTE_SECURITY
/*!
* The structure is to be filled by user as a part of
* dpaa_sec_proto_ctxt for PDCP Protocol
@@ -115,14 +115,16 @@ struct sec_pdcp_ctxt {
uint32_t hfn; /*!< Hyper Frame Number */
uint32_t hfn_threshold; /*!< HFN Threashold for key renegotiation */
};
-
+#endif
typedef struct dpaa_sec_session_entry {
uint8_t dir; /*!< Operation Direction */
uint8_t ctxt; /*!< Session Context Type */
enum rte_crypto_cipher_algorithm cipher_alg; /*!< Cipher Algorithm*/
enum rte_crypto_auth_algorithm auth_alg; /*!< Authentication Algorithm*/
enum rte_crypto_aead_algorithm aead_alg; /*!< AEAD Algorithm*/
+#ifdef RTE_LIBRTE_SECURITY
enum rte_security_session_protocol proto_alg; /*!< Security Algorithm*/
+#endif
union {
struct {
uint8_t *data; /**< pointer to key data */
@@ -163,7 +165,9 @@ typedef struct dpaa_sec_session_entry {
uint8_t auth_cipher_text;
/**< Authenticate/cipher ordering */
};
+#ifdef RTE_LIBRTE_SECURITY
struct sec_pdcp_ctxt pdcp;
+#endif
};
struct dpaa_sec_qp *qp[MAX_DPAA_CORES];
struct qman_fq *inq[MAX_DPAA_CORES];
@@ -679,6 +683,7 @@ static const struct rte_cryptodev_capabilities dpaa_pdcp_capabilities[] = {
RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
};
+#ifdef RTE_LIBRTE_SECURITY
static const struct rte_security_capability dpaa_sec_security_cap[] = {
{ /* IPsec Lookaside Protocol offload ESP Transport Egress */
.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
@@ -722,6 +727,7 @@ static const struct rte_security_capability dpaa_sec_security_cap[] = {
.action = RTE_SECURITY_ACTION_TYPE_NONE
}
};
+#endif
/**
* Checksum
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index e79f16e28..063c4605b 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -275,14 +275,14 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_NITROX) += -lrte_pmd_nitrox
_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_OCTEONTX_CRYPTO) += -lrte_pmd_octeontx_crypto
_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_OCTEONTX2_CRYPTO) += -lrte_pmd_octeontx2_crypto
_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_CRYPTO_SCHEDULER) += -lrte_pmd_crypto_scheduler
-ifeq ($(CONFIG_RTE_LIBRTE_SECURITY),y)
ifeq ($(CONFIG_RTE_EAL_VFIO)$(CONFIG_RTE_LIBRTE_FSLMC_BUS),yy)
_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_DPAA2_SEC) += -lrte_pmd_dpaa2_sec
endif # CONFIG_RTE_LIBRTE_FSLMC_BUS
ifeq ($(CONFIG_RTE_LIBRTE_DPAA_BUS),y)
_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_DPAA_SEC) += -lrte_pmd_dpaa_sec
-_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_CAAM_JR) += -lrte_pmd_caam_jr
endif # CONFIG_RTE_LIBRTE_DPAA_BUS
+ifeq ($(CONFIG_RTE_LIBRTE_SECURITY),y)
+_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_CAAM_JR) += -lrte_pmd_caam_jr
endif # CONFIG_RTE_LIBRTE_SECURITY
_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_VIRTIO_CRYPTO) += -lrte_pmd_virtio_crypto
endif # CONFIG_RTE_LIBRTE_CRYPTODEV
--
2.17.1
next prev parent reply other threads:[~2019-10-18 7:59 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-18 7:56 [dpdk-dev] [PATCH] test/crypto: fix compilation issue without security Hemant Agrawal
2019-10-18 7:56 ` [dpdk-dev] [PATCH] app/proc-info: fix compilation with no security Hemant Agrawal
2019-10-18 8:09 ` Thierry Herbelot
2019-10-23 14:46 ` Akhil Goyal
2019-10-23 14:48 ` Akhil Goyal
2019-10-18 7:56 ` Hemant Agrawal [this message]
2019-10-18 8:11 ` [dpdk-dev] [PATCH] crypto/dpaa_sec: enable compilation without security Thierry Herbelot
2019-10-23 14:45 ` Akhil Goyal
2019-10-18 8:07 ` [dpdk-dev] [PATCH] test/crypto: fix compilation issue " Thierry Herbelot
2019-10-23 14:48 ` Akhil Goyal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191018075613.2784-3-hemant.agrawal@nxp.com \
--to=hemant.agrawal@nxp.com \
--cc=akhil.goyal@nxp.com \
--cc=dev@dpdk.org \
--cc=thierry.herbelot@6wind.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.