From: Chaoyong He <chaoyong.he@corigine.com>
To: dev@dpdk.org
Cc: oss-drivers@corigine.com, Chaoyong He <chaoyong.he@corigine.com>,
Long Wu <long.wu@corigine.com>,
Peng Zhang <peng.zhang@corigine.com>
Subject: [PATCH 6/7] net/nfp: add trace point about flow rule pattern
Date: Wed, 19 Jun 2024 18:07:53 +0800 [thread overview]
Message-ID: <20240619100754.3480077-7-chaoyong.he@corigine.com> (raw)
In-Reply-To: <20240619100754.3480077-1-chaoyong.he@corigine.com>
Add 11 trace points of control message related with flow rule pattern.
Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
---
drivers/net/nfp/flower/nfp_flower_cmsg.c | 152 +++++++++++++++++
drivers/net/nfp/nfp_trace.c | 33 ++++
drivers/net/nfp/nfp_trace.h | 199 +++++++++++++++++++++++
3 files changed, 384 insertions(+)
diff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.c b/drivers/net/nfp/flower/nfp_flower_cmsg.c
index 9035a9df4f..3b492c94ce 100644
--- a/drivers/net/nfp/flower/nfp_flower_cmsg.c
+++ b/drivers/net/nfp/flower/nfp_flower_cmsg.c
@@ -189,12 +189,164 @@ nfp_flower_cmsg_port_mod(struct nfp_app_fw_flower *app_fw_flower,
return 0;
}
+static bool
+nfp_flower_trace_cmsg_flow_has_tunnel(uint8_t nfp_flow_key_layer,
+ uint32_t nfp_flow_key_layer2)
+{
+ if ((nfp_flow_key_layer & NFP_FLOWER_LAYER_VXLAN) != 0)
+ return true;
+
+ if ((nfp_flow_key_layer & NFP_FLOWER_LAYER_EXT_META) == 0)
+ return false;
+
+ if ((nfp_flow_key_layer2 & (NFP_FLOWER_LAYER2_GENEVE | NFP_FLOWER_LAYER2_GRE)) != 0)
+ return true;
+
+ return false;
+}
+
+static void
+nfp_flower_trace_cmsg_flow_pattern(char *cmsg,
+ char *end)
+{
+ char *start_p = cmsg;
+
+ if (cmsg >= end) {
+ PMD_DRV_LOG(ERR, "Cmsg flow pattern parameter error");
+ return;
+ }
+
+ struct nfp_flower_meta_tci *meta_tci = (struct nfp_flower_meta_tci *)cmsg;
+ uint8_t nfp_flow_key_layer = meta_tci->nfp_flow_key_layer;
+ uint32_t nfp_flow_key_layer2 = 0;
+
+ rte_pmd_nfp_trace_cmsg_flow_pattern_meta_tci(start_p);
+ start_p += sizeof(struct nfp_flower_meta_tci);
+ if (start_p >= end)
+ goto pattern_exit;
+
+ if ((nfp_flow_key_layer & NFP_FLOWER_LAYER_EXT_META) != 0) {
+ struct nfp_flower_ext_meta *ext_meta = (struct nfp_flower_ext_meta *)start_p;
+ nfp_flow_key_layer2 = rte_be_to_cpu_32(ext_meta->nfp_flow_key_layer2);
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ext_meta(start_p);
+ start_p += sizeof(struct nfp_flower_ext_meta);
+ if (start_p >= end)
+ goto pattern_exit;
+ }
+
+ rte_pmd_nfp_trace_cmsg_flow_pattern_in_port(start_p);
+ start_p += sizeof(struct nfp_flower_in_port);
+ if (start_p >= end)
+ goto pattern_exit;
+
+ /* L2 layer */
+ if ((nfp_flow_key_layer & NFP_FLOWER_LAYER_MAC) != 0) {
+ rte_pmd_nfp_trace_cmsg_flow_pattern_mac(start_p);
+ start_p += sizeof(struct nfp_flower_mac_mpls);
+ if (start_p >= end)
+ goto pattern_exit;
+ }
+
+ /* L4 layer comes first */
+ if ((nfp_flow_key_layer & NFP_FLOWER_LAYER_TP) != 0) {
+ rte_pmd_nfp_trace_cmsg_flow_pattern_tp(start_p);
+ start_p += sizeof(struct nfp_flower_tp_ports);
+ if (start_p >= end)
+ goto pattern_exit;
+ }
+
+ /* No tunnel, then L3 layer */
+ if (!nfp_flower_trace_cmsg_flow_has_tunnel(nfp_flow_key_layer, nfp_flow_key_layer2)) {
+ if ((nfp_flow_key_layer & NFP_FLOWER_LAYER_IPV4) != 0) {
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv4(start_p);
+ start_p += sizeof(struct nfp_flower_ipv4);
+ if (start_p != end)
+ PMD_DRV_LOG(ERR, "Cmsg flow pattern IPv4 length error");
+ } else {
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv6(start_p);
+ start_p += sizeof(struct nfp_flower_ipv6);
+ if (start_p != end)
+ PMD_DRV_LOG(ERR, "Cmsg flow pattern IPv6 length error");
+ }
+
+ return;
+ }
+
+ /* Tunnel layer */
+ if ((nfp_flow_key_layer2 & NFP_FLOWER_LAYER2_TUN_IPV6) != 0) {
+ if ((nfp_flow_key_layer2 & NFP_FLOWER_LAYER2_GRE) != 0) {
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv6_gre_tun(start_p);
+ start_p += sizeof(struct nfp_flower_ipv6_gre_tun);
+ if (start_p >= end)
+ goto pattern_exit;
+ } else {
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv6_udp_tun(start_p);
+ start_p += sizeof(struct nfp_flower_ipv6_udp_tun);
+ if (start_p >= end)
+ goto pattern_exit;
+ }
+ } else {
+ if ((nfp_flow_key_layer2 & NFP_FLOWER_LAYER2_GRE) != 0) {
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv4_gre_tun(start_p);
+ start_p += sizeof(struct nfp_flower_ipv4_gre_tun);
+ if (start_p >= end)
+ goto pattern_exit;
+ } else {
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv4_udp_tun(start_p);
+ start_p += sizeof(struct nfp_flower_ipv4_udp_tun);
+ if (start_p >= end)
+ goto pattern_exit;
+ }
+ }
+
+ /* Inner L2 layer */
+ if ((nfp_flow_key_layer & NFP_FLOWER_LAYER_MAC) != 0) {
+ rte_pmd_nfp_trace_cmsg_flow_pattern_mac(start_p);
+ start_p += sizeof(struct nfp_flower_mac_mpls);
+ if (start_p >= end)
+ goto pattern_exit;
+ }
+
+ /* Inner L4 layer comes first */
+ if ((nfp_flow_key_layer & NFP_FLOWER_LAYER_TP) != 0) {
+ rte_pmd_nfp_trace_cmsg_flow_pattern_tp(start_p);
+ start_p += sizeof(struct nfp_flower_tp_ports);
+ if (start_p >= end)
+ goto pattern_exit;
+ }
+
+ /* Inner L3 layer */
+ if ((nfp_flow_key_layer & NFP_FLOWER_LAYER_IPV4) != 0) {
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv4(start_p);
+ start_p += sizeof(struct nfp_flower_ipv4);
+ if (start_p != end) {
+ PMD_DRV_LOG(ERR, "Cmsg flow pattern IPv4 length error");
+ return;
+ }
+ } else {
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv6(start_p);
+ start_p += sizeof(struct nfp_flower_ipv6);
+ if (start_p != end) {
+ PMD_DRV_LOG(ERR, "Cmsg flow pattern IPv6 length error");
+ return;
+ }
+ }
+
+ return;
+
+pattern_exit:
+ if (start_p != end)
+ PMD_DRV_LOG(ERR, "Cmsg flow pattern overlap");
+}
+
static void
nfp_flower_trace_cmsg_flow(const char *msg,
struct nfp_fl_payload *payload)
{
rte_pmd_nfp_trace_cmsg_flow(msg);
rte_pmd_nfp_trace_cmsg_flow_meta(payload->meta);
+ nfp_flower_trace_cmsg_flow_pattern(payload->unmasked_data, payload->mask_data);
+ nfp_flower_trace_cmsg_flow_pattern(payload->mask_data, payload->action_data);
}
int
diff --git a/drivers/net/nfp/nfp_trace.c b/drivers/net/nfp/nfp_trace.c
index d49fb85259..61162f7563 100644
--- a/drivers/net/nfp/nfp_trace.c
+++ b/drivers/net/nfp/nfp_trace.c
@@ -40,5 +40,38 @@ RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_qos_rule,
RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_meta,
pmd.net.nfp.cmsg.flow.meta)
+RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_pattern_meta_tci,
+ pmd.net.nfp.cmsg.flow.pattern.meta_tci)
+
+RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_pattern_ext_meta,
+ pmd.net.nfp.cmsg.flow.pattern.ext_meta)
+
+RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_pattern_in_port,
+ pmd.net.nfp.cmsg.flow.pattern.in_port)
+
+RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_pattern_mac,
+ pmd.net.nfp.cmsg.flow.pattern.mac)
+
+RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_pattern_tp,
+ pmd.net.nfp.cmsg.flow.pattern.tp)
+
+RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_pattern_ipv4,
+ pmd.net.nfp.cmsg.flow.pattern.ipv4)
+
+RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_pattern_ipv6,
+ pmd.net.nfp.cmsg.flow.pattern.ipv6)
+
+RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_pattern_ipv4_gre_tun,
+ pmd.net.nfp.cmsg.flow.pattern.ipv4_gre_tun)
+
+RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_pattern_ipv4_udp_tun,
+ pmd.net.nfp.cmsg.flow.pattern.ipv4_udp_tun)
+
+RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_pattern_ipv6_gre_tun,
+ pmd.net.nfp.cmsg.flow.pattern.ipv6_gre_tun)
+
+RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_pattern_ipv6_udp_tun,
+ pmd.net.nfp.cmsg.flow.pattern.ipv6_udp_tun)
+
RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow,
pmd.net.nfp.cmsg.flow)
diff --git a/drivers/net/nfp/nfp_trace.h b/drivers/net/nfp/nfp_trace.h
index e0b8b0cee9..a5a7cc8faf 100644
--- a/drivers/net/nfp/nfp_trace.h
+++ b/drivers/net/nfp/nfp_trace.h
@@ -236,6 +236,205 @@ RTE_TRACE_POINT(
rte_trace_point_emit_u32(meta->shortcut);
)
+RTE_TRACE_POINT(
+ rte_pmd_nfp_trace_cmsg_flow_pattern_meta_tci,
+ RTE_TRACE_POINT_ARGS(void *cmsg),
+
+ struct nfp_flower_meta_tci *msg = cmsg;
+
+ uint8_t nfp_flow_key_layer = msg->nfp_flow_key_layer;
+ uint8_t mask_id = msg->mask_id;
+ uint16_t tci = rte_be_to_cpu_16(msg->tci);
+
+ rte_trace_point_emit_u8(nfp_flow_key_layer);
+ rte_trace_point_emit_u8(mask_id);
+ rte_trace_point_emit_u16(tci);
+)
+
+RTE_TRACE_POINT(
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ext_meta,
+ RTE_TRACE_POINT_ARGS(void *cmsg),
+
+ struct nfp_flower_ext_meta *msg = cmsg;
+
+ uint32_t nfp_flow_key_layer2 = rte_be_to_cpu_32(msg->nfp_flow_key_layer2);
+
+ rte_trace_point_emit_u32(nfp_flow_key_layer2);
+)
+
+RTE_TRACE_POINT(
+ rte_pmd_nfp_trace_cmsg_flow_pattern_in_port,
+ RTE_TRACE_POINT_ARGS(void *cmsg),
+
+ struct nfp_flower_in_port *msg = cmsg;
+
+ uint32_t in_port = rte_be_to_cpu_32(msg->in_port);
+
+ rte_trace_point_emit_u32(in_port);
+)
+
+RTE_TRACE_POINT(
+ rte_pmd_nfp_trace_cmsg_flow_pattern_mac,
+ RTE_TRACE_POINT_ARGS(void *cmsg),
+
+ struct nfp_flower_mac_mpls *msg = cmsg;
+
+ uint8_t mac_dst_len = RTE_ETHER_ADDR_LEN;
+ uint8_t mac_src_len = RTE_ETHER_ADDR_LEN;
+ uint8_t *mac_dst = &msg->mac_dst[0];
+ uint8_t *mac_src = &msg->mac_src[0];
+ uint32_t mpls_lse = rte_be_to_cpu_32(msg->mpls_lse);
+
+ rte_trace_point_emit_blob(mac_dst, mac_dst_len);
+ rte_trace_point_emit_blob(mac_src, mac_src_len);
+ rte_trace_point_emit_u32(mpls_lse);
+)
+
+RTE_TRACE_POINT(
+ rte_pmd_nfp_trace_cmsg_flow_pattern_tp,
+ RTE_TRACE_POINT_ARGS(void *cmsg),
+
+ struct nfp_flower_tp_ports *msg = cmsg;
+
+ uint16_t port_src = rte_be_to_cpu_16(msg->port_src);
+ uint16_t port_dst = rte_be_to_cpu_16(msg->port_dst);
+
+ rte_trace_point_emit_u16(port_src);
+ rte_trace_point_emit_u16(port_dst);
+)
+
+RTE_TRACE_POINT(
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv4,
+ RTE_TRACE_POINT_ARGS(void *cmsg),
+
+ struct nfp_flower_ipv4 *msg = cmsg;
+
+ uint8_t tos = msg->ip_ext.tos;
+ uint8_t proto = msg->ip_ext.proto;
+ uint8_t ttl = msg->ip_ext.ttl;
+ uint8_t flags = msg->ip_ext.flags;
+ uint32_t ipv4_src = rte_be_to_cpu_16(msg->ipv4_src);
+ uint32_t ipv4_dst = rte_be_to_cpu_16(msg->ipv4_dst);
+
+ rte_trace_point_emit_u8(tos);
+ rte_trace_point_emit_u8(proto);
+ rte_trace_point_emit_u8(ttl);
+ rte_trace_point_emit_u8(flags);
+ rte_trace_point_emit_u32(ipv4_src);
+ rte_trace_point_emit_u32(ipv4_dst);
+)
+
+RTE_TRACE_POINT(
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv6,
+ RTE_TRACE_POINT_ARGS(void *cmsg),
+
+ struct nfp_flower_ipv6 *msg = cmsg;
+
+ uint8_t tos = msg->ip_ext.tos;
+ uint8_t proto = msg->ip_ext.proto;
+ uint8_t ttl = msg->ip_ext.ttl;
+ uint8_t flags = msg->ip_ext.flags;
+ uint8_t ipv6_src_len = 16;
+ uint8_t *ipv6_src = &msg->ipv6_src[0];
+ uint8_t ipv6_dst_len = 16;
+ uint8_t *ipv6_dst = &msg->ipv6_dst[0];
+
+ rte_trace_point_emit_u8(tos);
+ rte_trace_point_emit_u8(proto);
+ rte_trace_point_emit_u8(ttl);
+ rte_trace_point_emit_u8(flags);
+ rte_trace_point_emit_blob(ipv6_src, ipv6_src_len);
+ rte_trace_point_emit_blob(ipv6_dst, ipv6_dst_len);
+)
+
+RTE_TRACE_POINT(
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv4_gre_tun,
+ RTE_TRACE_POINT_ARGS(void *cmsg),
+
+ struct nfp_flower_ipv4_gre_tun *msg = cmsg;
+
+ uint32_t src = rte_be_to_cpu_32(msg->ipv4.src);
+ uint32_t dst = rte_be_to_cpu_32(msg->ipv4.dst);
+ uint16_t tun_flags = rte_be_to_cpu_16(msg->tun_flags);
+ uint8_t tos = msg->ip_ext.tos;
+ uint8_t ttl = msg->ip_ext.ttl;
+ uint16_t ethertype = rte_be_to_cpu_16(msg->ethertype);
+ uint32_t tun_key = rte_be_to_cpu_32(msg->tun_key);
+
+ rte_trace_point_emit_u32(src);
+ rte_trace_point_emit_u32(dst);
+ rte_trace_point_emit_u16(tun_flags);
+ rte_trace_point_emit_u8(tos);
+ rte_trace_point_emit_u8(ttl);
+ rte_trace_point_emit_u16(ethertype);
+ rte_trace_point_emit_u32(tun_key);
+)
+
+RTE_TRACE_POINT(
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv4_udp_tun,
+ RTE_TRACE_POINT_ARGS(void *cmsg),
+
+ struct nfp_flower_ipv4_udp_tun *msg = cmsg;
+
+ uint32_t src = rte_be_to_cpu_32(msg->ipv4.src);
+ uint32_t dst = rte_be_to_cpu_32(msg->ipv4.dst);
+ uint8_t tos = msg->ip_ext.tos;
+ uint8_t ttl = msg->ip_ext.ttl;
+ uint32_t tun_id = rte_be_to_cpu_32(msg->tun_id);
+
+ rte_trace_point_emit_u32(src);
+ rte_trace_point_emit_u32(dst);
+ rte_trace_point_emit_u8(tos);
+ rte_trace_point_emit_u8(ttl);
+ rte_trace_point_emit_u32(tun_id);
+)
+
+RTE_TRACE_POINT(
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv6_gre_tun,
+ RTE_TRACE_POINT_ARGS(void *cmsg),
+
+ struct nfp_flower_ipv6_gre_tun *msg = cmsg;
+
+ uint8_t ipv6_src_len = 16;
+ uint8_t *ipv6_src = &msg->ipv6.ipv6_src[0];
+ uint8_t ipv6_dst_len = 16;
+ uint8_t *ipv6_dst = &msg->ipv6.ipv6_dst[0];
+ uint16_t tun_flags = rte_be_to_cpu_16(msg->tun_flags);
+ uint8_t tos = msg->ip_ext.tos;
+ uint8_t ttl = msg->ip_ext.ttl;
+ uint16_t ethertype = rte_be_to_cpu_16(msg->ethertype);
+ uint32_t tun_key = rte_be_to_cpu_32(msg->tun_key);
+
+ rte_trace_point_emit_blob(ipv6_src, ipv6_src_len);
+ rte_trace_point_emit_blob(ipv6_dst, ipv6_dst_len);
+ rte_trace_point_emit_u16(tun_flags);
+ rte_trace_point_emit_u8(tos);
+ rte_trace_point_emit_u8(ttl);
+ rte_trace_point_emit_u16(ethertype);
+ rte_trace_point_emit_u32(tun_key);
+)
+
+RTE_TRACE_POINT(
+ rte_pmd_nfp_trace_cmsg_flow_pattern_ipv6_udp_tun,
+ RTE_TRACE_POINT_ARGS(void *cmsg),
+
+ struct nfp_flower_ipv6_udp_tun *msg = cmsg;
+
+ uint8_t ipv6_src_len = 16;
+ uint8_t *ipv6_src = &msg->ipv6.ipv6_src[0];
+ uint8_t ipv6_dst_len = 16;
+ uint8_t *ipv6_dst = &msg->ipv6.ipv6_dst[0];
+ uint8_t tos = msg->ip_ext.tos;
+ uint8_t ttl = msg->ip_ext.ttl;
+ uint32_t tun_id = rte_be_to_cpu_32(msg->tun_id);
+
+ rte_trace_point_emit_blob(ipv6_src, ipv6_src_len);
+ rte_trace_point_emit_blob(ipv6_dst, ipv6_dst_len);
+ rte_trace_point_emit_u8(tos);
+ rte_trace_point_emit_u8(ttl);
+ rte_trace_point_emit_u32(tun_id);
+)
+
RTE_TRACE_POINT(
rte_pmd_nfp_trace_cmsg_flow,
RTE_TRACE_POINT_ARGS(const char *name),
--
2.39.1
next prev parent reply other threads:[~2024-06-19 10:08 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-19 10:07 [PATCH 0/7] add trace support for control message Chaoyong He
2024-06-19 10:07 ` [PATCH 1/7] net/nfp: add trace points about port Chaoyong He
2024-06-19 10:07 ` [PATCH 2/7] net/nfp: add trace point about tunnel Chaoyong He
2024-06-19 10:07 ` [PATCH 3/7] net/nfp: add trace point about Qos Chaoyong He
2024-06-19 10:07 ` [PATCH 4/7] net/nfp: refactor to prepare for add flow trace point Chaoyong He
2024-06-19 10:07 ` [PATCH 5/7] net/nfp: add trace point about flow rule Chaoyong He
2024-06-19 10:07 ` Chaoyong He [this message]
2024-06-19 10:07 ` [PATCH 7/7] net/nfp: add trace point about flow rule action Chaoyong He
2024-07-07 22:43 ` [PATCH 0/7] add trace support for control message Ferruh Yigit
2024-07-08 1:42 ` Chaoyong He
2024-07-08 2:45 ` [PATCH v2 " Chaoyong He
2024-07-08 2:45 ` [PATCH v2 1/7] net/nfp: add trace points about port Chaoyong He
2024-07-08 2:45 ` [PATCH v2 2/7] net/nfp: add trace point about tunnel Chaoyong He
2024-07-08 2:45 ` [PATCH v2 3/7] net/nfp: add trace point about Qos Chaoyong He
2024-07-08 2:45 ` [PATCH v2 4/7] net/nfp: refactor to prepare for add flow trace point Chaoyong He
2024-07-08 2:45 ` [PATCH v2 5/7] net/nfp: add trace point about flow rule Chaoyong He
2024-07-08 2:45 ` [PATCH v2 6/7] net/nfp: add trace point about flow rule pattern Chaoyong He
2024-07-08 2:45 ` [PATCH v2 7/7] net/nfp: add trace point about flow rule action Chaoyong He
2024-07-08 11:45 ` [PATCH v2 0/7] add trace support for control message Ferruh Yigit
2024-07-09 1:15 ` Chaoyong He
2024-07-09 3:16 ` Chaoyong He
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=20240619100754.3480077-7-chaoyong.he@corigine.com \
--to=chaoyong.he@corigine.com \
--cc=dev@dpdk.org \
--cc=long.wu@corigine.com \
--cc=oss-drivers@corigine.com \
--cc=peng.zhang@corigine.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).