DPDK patches and discussions
 help / color / mirror / Atom feed
From: Hemant Agrawal <hemant.agrawal@nxp.com>
To: dev@dpdk.org
Cc: ferruh.yigit@amd.com, Jun Yang <jun.yang@nxp.com>
Subject: [PATCH v3 12/18] net/dpaa: enhance DPAA frame display
Date: Mon, 30 Sep 2024 15:59:40 +0530	[thread overview]
Message-ID: <20240930102946.3236998-13-hemant.agrawal@nxp.com> (raw)
In-Reply-To: <20240930102946.3236998-1-hemant.agrawal@nxp.com>

This patch enhances the received packet debugging capability.
This help displaying the full packet parsing output.

Signed-off-by: Jun Yang <jun.yang@nxp.com>
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 doc/guides/nics/dpaa.rst       |   5 ++
 drivers/net/dpaa/dpaa_ethdev.c |   9 +++
 drivers/net/dpaa/dpaa_rxtx.c   | 138 +++++++++++++++++++++++++++------
 drivers/net/dpaa/dpaa_rxtx.h   |   5 ++
 4 files changed, 133 insertions(+), 24 deletions(-)

diff --git a/doc/guides/nics/dpaa.rst b/doc/guides/nics/dpaa.rst
index ea86e6146c..edf7a7e350 100644
--- a/doc/guides/nics/dpaa.rst
+++ b/doc/guides/nics/dpaa.rst
@@ -227,6 +227,11 @@ state during application initialization:
   application want to use eventdev with DPAA device.
   Currently these queues are not used for LS1023/LS1043 platform by default.
 
+- ``DPAA_DISPLAY_FRAME_AND_PARSER_RESULT`` (default 0)
+
+  This defines the debug flag, whether to dump the detailed frame and packet
+  parsing result for the incoming packets.
+
 
 Driver compilation and testing
 ------------------------------
diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c
index a302b24be6..4ead890278 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -2056,6 +2056,9 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)
 	int8_t dev_vspids[DPAA_MAX_NUM_PCD_QUEUES];
 	int8_t vsp_id = -1;
 	struct rte_device *dev = eth_dev->device;
+#ifdef RTE_LIBRTE_DPAA_DEBUG_DRIVER
+	char *penv;
+#endif
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -2135,6 +2138,12 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)
 			td_tx_threshold = CGR_RX_PERFQ_THRESH;
 	}
 
+#ifdef RTE_LIBRTE_DPAA_DEBUG_DRIVER
+	penv = getenv("DPAA_DISPLAY_FRAME_AND_PARSER_RESULT");
+	if (penv)
+		dpaa_force_display_frame_set(atoi(penv));
+#endif
+
 	/* If congestion control is enabled globally*/
 	if (num_rx_fqs > 0 && td_threshold) {
 		dpaa_intf->cgr_rx = rte_zmalloc(NULL,
diff --git a/drivers/net/dpaa/dpaa_rxtx.c b/drivers/net/dpaa/dpaa_rxtx.c
index 99fc3f1b43..945c84ab10 100644
--- a/drivers/net/dpaa/dpaa_rxtx.c
+++ b/drivers/net/dpaa/dpaa_rxtx.c
@@ -47,6 +47,10 @@
 #include <dpaa_of.h>
 #include <netcfg.h>
 
+#ifdef RTE_LIBRTE_DPAA_DEBUG_DRIVER
+static int s_force_display_frm;
+#endif
+
 #define DPAA_MBUF_TO_CONTIG_FD(_mbuf, _fd, _bpid) \
 	do { \
 		(_fd)->opaque_addr = 0; \
@@ -58,37 +62,122 @@
 	} while (0)
 
 #ifdef RTE_LIBRTE_DPAA_DEBUG_DRIVER
+void
+dpaa_force_display_frame_set(int set)
+{
+	s_force_display_frm = set;
+}
+
 #define DISPLAY_PRINT printf
-static void dpaa_display_frame_info(const struct qm_fd *fd,
-			uint32_t fqid, bool rx)
+static void
+dpaa_display_frame_info(const struct qm_fd *fd,
+	uint32_t fqid, bool rx)
 {
-	int ii;
-	char *ptr;
+	int pos, offset = 0;
+	char *ptr, info[1024];
 	struct annotations_t *annot = rte_dpaa_mem_ptov(fd->addr);
 	uint8_t format;
+	const struct dpaa_eth_parse_results_t *psr;
 
-	if (!fd->status) {
-		/* Do not display correct packets.*/
+	if (!fd->status && !s_force_display_frm) {
+		/* Do not display correct packets unless force display.*/
 		return;
 	}
+	psr = &annot->parse;
 
-	format = (fd->opaque & DPAA_FD_FORMAT_MASK) >>
-				DPAA_FD_FORMAT_SHIFT;
-
-	DISPLAY_PRINT("fqid %d bpid %d addr 0x%lx, format %d\r\n",
-		      fqid, fd->bpid, (unsigned long)fd->addr, fd->format);
-	DISPLAY_PRINT("off %d, len %d stat 0x%x\r\n",
-		      fd->offset, fd->length20, fd->status);
+	format = (fd->opaque & DPAA_FD_FORMAT_MASK) >> DPAA_FD_FORMAT_SHIFT;
+	if (format == qm_fd_contig)
+		sprintf(info, "simple");
+	else if (format == qm_fd_sg)
+		sprintf(info, "sg");
+	else
+		sprintf(info, "unknown format(%d)", format);
+
+	DISPLAY_PRINT("%s: fqid=%08x, bpid=%d, phy addr=0x%lx ",
+		rx ? "RX" : "TX", fqid, fd->bpid, (unsigned long)fd->addr);
+	DISPLAY_PRINT("format=%s offset=%d, len=%d, stat=0x%x\r\n",
+		info, fd->offset, fd->length20, fd->status);
 	if (rx) {
-		ptr = (char *)&annot->parse;
-		DISPLAY_PRINT("RX parser result:\r\n");
-		for (ii = 0; ii < (int)sizeof(struct dpaa_eth_parse_results_t);
-			ii++) {
-			DISPLAY_PRINT("%02x ", ptr[ii]);
-			if (((ii + 1) % 16) == 0)
-				DISPLAY_PRINT("\n");
+		DISPLAY_PRINT("Display usual RX parser result:\r\n");
+		if (psr->eth_frame_type == 0)
+			offset += sprintf(&info[offset], "unicast");
+		else if (psr->eth_frame_type == 1)
+			offset += sprintf(&info[offset], "multicast");
+		else if (psr->eth_frame_type == 3)
+			offset += sprintf(&info[offset], "broadcast");
+		else
+			offset += sprintf(&info[offset], "unknown eth type(%d)",
+				psr->eth_frame_type);
+		if (psr->l2r_err) {
+			offset += sprintf(&info[offset], " L2 error(%d)",
+				psr->l2r_err);
+		} else {
+			offset += sprintf(&info[offset], " L2 non error");
 		}
-		DISPLAY_PRINT("\n");
+		DISPLAY_PRINT("L2: %s, %s, ethernet type:%s\r\n",
+			psr->ethernet ? "is ethernet" : "non ethernet",
+			psr->vlan ? "is vlan" : "non vlan", info);
+
+		offset = 0;
+		DISPLAY_PRINT("L3: %s/%s, %s/%s, %s, %s\r\n",
+			psr->first_ipv4 ? "first IPv4" : "non first IPv4",
+			psr->last_ipv4 ? "last IPv4" : "non last IPv4",
+			psr->first_ipv6 ? "first IPv6" : "non first IPv6",
+			psr->last_ipv6 ? "last IPv6" : "non last IPv6",
+			psr->gre ? "GRE" : "non GRE",
+			psr->l3_err ? "L3 has error" : "L3 non error");
+
+		if (psr->l4_type == DPAA_PR_L4_TCP_TYPE) {
+			offset += sprintf(&info[offset], "tcp");
+		} else if (psr->l4_type == DPAA_PR_L4_UDP_TYPE) {
+			offset += sprintf(&info[offset], "udp");
+		} else if (psr->l4_type == DPAA_PR_L4_IPSEC_TYPE) {
+			offset += sprintf(&info[offset], "IPSec ");
+			if (psr->esp_sum)
+				offset += sprintf(&info[offset], "ESP");
+			if (psr->ah)
+				offset += sprintf(&info[offset], "AH");
+		} else if (psr->l4_type == DPAA_PR_L4_SCTP_TYPE) {
+			offset += sprintf(&info[offset], "sctp");
+		} else if (psr->l4_type == DPAA_PR_L4_DCCP_TYPE) {
+			offset += sprintf(&info[offset], "dccp");
+		} else {
+			offset += sprintf(&info[offset], "unknown l4 type(%d)",
+				psr->l4_type);
+		}
+		DISPLAY_PRINT("L4: type:%s, L4 validation %s\r\n",
+			info, psr->l4cv ? "Performed" : "NOT performed");
+
+		offset = 0;
+		if (psr->ethernet) {
+			offset += sprintf(&info[offset],
+				"Eth offset=%d, ethtype offset=%d, ",
+				psr->eth_off, psr->etype_off);
+		}
+		if (psr->vlan) {
+			offset += sprintf(&info[offset], "vLAN offset=%d, ",
+				psr->vlan_off[0]);
+		}
+		if (psr->first_ipv4 || psr->first_ipv6) {
+			offset += sprintf(&info[offset], "first IP offset=%d, ",
+				psr->ip_off[0]);
+		}
+		if (psr->last_ipv4 || psr->last_ipv6) {
+			offset += sprintf(&info[offset], "last IP offset=%d, ",
+				psr->ip_off[1]);
+		}
+		if (psr->gre) {
+			offset += sprintf(&info[offset], "GRE offset=%d, ",
+				psr->gre_off);
+		}
+		if (psr->l4_type >= DPAA_PR_L4_TCP_TYPE) {
+			offset += sprintf(&info[offset], "L4 offset=%d, ",
+				psr->l4_off);
+		}
+		offset += sprintf(&info[offset], "Next HDR(0x%04x) offset=%d.",
+			rte_be_to_cpu_16(psr->nxthdr), psr->nxthdr_off);
+
+		DISPLAY_PRINT("%s\r\n", info);
 	}
 
 	if (unlikely(format == qm_fd_sg)) {
@@ -99,13 +188,14 @@ static void dpaa_display_frame_info(const struct qm_fd *fd,
 	DISPLAY_PRINT("Frame payload:\r\n");
 	ptr = (char *)annot;
 	ptr += fd->offset;
-	for (ii = 0; ii < fd->length20; ii++) {
-		DISPLAY_PRINT("%02x ", ptr[ii]);
-		if (((ii + 1) % 16) == 0)
+	for (pos = 0; pos < fd->length20; pos++) {
+		DISPLAY_PRINT("%02x ", ptr[pos]);
+		if (((pos + 1) % 16) == 0)
 			DISPLAY_PRINT("\n");
 	}
 	DISPLAY_PRINT("\n");
 }
+
 #else
 #define dpaa_display_frame_info(a, b, c)
 #endif
diff --git a/drivers/net/dpaa/dpaa_rxtx.h b/drivers/net/dpaa/dpaa_rxtx.h
index 215bdeaf7f..392926e286 100644
--- a/drivers/net/dpaa/dpaa_rxtx.h
+++ b/drivers/net/dpaa/dpaa_rxtx.h
@@ -274,4 +274,9 @@ void dpaa_rx_cb_prepare(struct qm_dqrr_entry *dq, void **bufs);
 
 void dpaa_rx_cb_no_prefetch(struct qman_fq **fq,
 		    struct qm_dqrr_entry **dqrr, void **bufs, int num_bufs);
+#ifdef RTE_LIBRTE_DPAA_DEBUG_DRIVER
+void
+dpaa_force_display_frame_set(int set);
+#endif
+
 #endif
-- 
2.25.1


  parent reply	other threads:[~2024-09-30 10:31 UTC|newest]

Thread overview: 106+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-01 10:52 [PATCH 00/17] NXP DPAA ETH driver enhancement and fixes Hemant Agrawal
2024-08-01 10:52 ` [PATCH 01/17] bus/dpaa: fix PFDRs leaks due to FQRNIs Hemant Agrawal
2024-08-01 10:52 ` [PATCH 02/17] net/dpaa: fix typecasting ch ID to u32 Hemant Agrawal
2024-08-07 15:37   ` Ferruh Yigit
2024-08-01 10:52 ` [PATCH 03/17] bus/dpaa: fix VSP for 1G fm1-mac9 and 10 Hemant Agrawal
2024-08-07 15:38   ` Ferruh Yigit
2024-08-23  7:33     ` Hemant Agrawal
2024-08-01 10:53 ` [PATCH 04/17] bus/dpaa: add port buffer manager stats Hemant Agrawal
2024-08-07 15:38   ` Ferruh Yigit
2024-08-23  7:33     ` Hemant Agrawal
2024-08-01 10:53 ` [PATCH 05/17] net/dpaa: support Tx confirmation to enable PTP Hemant Agrawal
2024-08-07 15:38   ` Ferruh Yigit
2024-08-23  7:34     ` Hemant Agrawal
2024-08-01 10:53 ` [PATCH 06/17] net/dpaa: add support to separate Tx conf queues Hemant Agrawal
2024-08-01 10:53 ` [PATCH 07/17] net/dpaa: share MAC FMC scheme and CC parse Hemant Agrawal
2024-08-07 15:39   ` Ferruh Yigit
2024-08-23  7:34     ` Hemant Agrawal
2024-08-01 10:53 ` [PATCH 08/17] net/dpaa: support Rx/Tx timestamp read Hemant Agrawal
2024-08-01 10:53 ` [PATCH 09/17] net/dpaa: support IEEE 1588 PTP Hemant Agrawal
2024-08-07 15:39   ` Ferruh Yigit
2024-08-23  7:36     ` Hemant Agrawal
2024-08-01 10:53 ` [PATCH 10/17] net/dpaa: implement detailed packet parsing Hemant Agrawal
2024-08-07 15:39   ` Ferruh Yigit
2024-08-23  7:34     ` Hemant Agrawal
2024-08-01 10:53 ` [PATCH 11/17] net/dpaa: enhance DPAA frame display Hemant Agrawal
2024-08-07 15:39   ` Ferruh Yigit
2024-08-23  7:36     ` Hemant Agrawal
2024-08-01 10:53 ` [PATCH 12/17] net/dpaa: support mempool debug Hemant Agrawal
2024-08-01 10:53 ` [PATCH 13/17] net/dpaa: add Tx rate limiting DPAA PMD API Hemant Agrawal
2024-08-07 15:40   ` Ferruh Yigit
2024-08-23  7:35     ` Hemant Agrawal
2024-08-01 10:53 ` [PATCH 14/17] bus/dpaa: add OH port mode for dpaa eth Hemant Agrawal
2024-08-07 15:40   ` Ferruh Yigit
2024-08-23  7:35     ` Hemant Agrawal
2024-08-01 10:53 ` [PATCH 15/17] bus/dpaa: add ONIC port mode for the DPAA eth Hemant Agrawal
2024-08-01 10:53 ` [PATCH 16/17] net/dpaa: improve the dpaa port cleanup Hemant Agrawal
2024-08-01 10:53 ` [PATCH 17/17] net/dpaa: improve dpaa errata A010022 handling Hemant Agrawal
2024-08-07 15:41   ` Ferruh Yigit
2024-08-23  7:35     ` Hemant Agrawal
2024-08-07 15:42 ` [PATCH 00/17] NXP DPAA ETH driver enhancement and fixes Ferruh Yigit
2024-08-08  8:51   ` Hemant Agrawal
2024-08-23  7:32 ` [PATCH v2 00/18] " Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 01/18] bus/dpaa: fix PFDRs leaks due to FQRNIs Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 02/18] net/dpaa: fix typecasting ch ID to u32 Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 03/18] bus/dpaa: fix VSP for 1G fm1-mac9 and 10 Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 04/18] bus/dpaa: fix the fman details status Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 05/18] bus/dpaa: add port buffer manager stats Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 06/18] net/dpaa: support Tx confirmation to enable PTP Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 07/18] net/dpaa: add support to separate Tx conf queues Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 08/18] net/dpaa: share MAC FMC scheme and CC parse Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 09/18] net/dpaa: support Rx/Tx timestamp read Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 10/18] net/dpaa: support IEEE 1588 PTP Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 11/18] net/dpaa: implement detailed packet parsing Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 12/18] net/dpaa: enhance DPAA frame display Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 13/18] net/dpaa: support mempool debug Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 14/18] net/dpaa: add Tx rate limiting DPAA PMD API Hemant Agrawal
2024-09-22  3:14     ` Ferruh Yigit
2024-09-22  4:40       ` Hemant Agrawal
2024-09-22 13:10         ` Ferruh Yigit
2024-09-22 13:27         ` Ferruh Yigit
2024-09-22 15:23           ` Ferruh Yigit
2024-08-23  7:32   ` [PATCH v2 15/18] bus/dpaa: add OH port mode for dpaa eth Hemant Agrawal
2024-09-22 15:24     ` Ferruh Yigit
2024-08-23  7:32   ` [PATCH v2 16/18] bus/dpaa: add ONIC port mode for the DPAA eth Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 17/18] net/dpaa: improve the dpaa port cleanup Hemant Agrawal
2024-08-23  7:32   ` [PATCH v2 18/18] net/dpaa: improve dpaa errata A010022 handling Hemant Agrawal
2024-09-22  3:12   ` [PATCH v2 00/18] NXP DPAA ETH driver enhancement and fixes Ferruh Yigit
2024-09-22  4:38     ` Hemant Agrawal
2024-09-30 10:29   ` [PATCH v3 " Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 01/18] bus/dpaa: fix PFDRs leaks due to FQRNIs Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 02/18] net/dpaa: fix typecasting ch ID to u32 Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 03/18] bus/dpaa: fix VSP for 1G fm1-mac9 and 10 Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 04/18] bus/dpaa: fix the fman details status Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 05/18] bus/dpaa: add port buffer manager stats Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 06/18] net/dpaa: support Tx confirmation to enable PTP Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 07/18] net/dpaa: add support to separate Tx conf queues Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 08/18] net/dpaa: share MAC FMC scheme and CC parse Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 09/18] net/dpaa: support Rx/Tx timestamp read Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 10/18] net/dpaa: support IEEE 1588 PTP Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 11/18] net/dpaa: implement detailed packet parsing Hemant Agrawal
2024-09-30 10:29     ` Hemant Agrawal [this message]
2024-09-30 10:29     ` [PATCH v3 13/18] net/dpaa: support mempool debug Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 14/18] bus/dpaa: add OH port mode for dpaa eth Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 15/18] bus/dpaa: add ONIC port mode for the DPAA eth Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 16/18] net/dpaa: improve the dpaa port cleanup Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 17/18] net/dpaa: improve dpaa errata A010022 handling Hemant Agrawal
2024-09-30 10:29     ` [PATCH v3 18/18] net/dpaa: fix reallocate_mbuf handling Hemant Agrawal
2024-09-30 12:15   ` [PATCH v4 00/18] NXP DPAA ETH driver enhancement and fixes Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 01/18] bus/dpaa: fix PFDRs leaks due to FQRNIs Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 02/18] net/dpaa: fix typecasting ch ID to u32 Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 03/18] bus/dpaa: fix VSP for 1G fm1-mac9 and 10 Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 04/18] bus/dpaa: fix the fman details status Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 05/18] bus/dpaa: add port buffer manager stats Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 06/18] net/dpaa: support Tx confirmation to enable PTP Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 07/18] net/dpaa: add support to separate Tx conf queues Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 08/18] net/dpaa: share MAC FMC scheme and CC parse Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 09/18] net/dpaa: support Rx/Tx timestamp read Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 10/18] net/dpaa: support IEEE 1588 PTP Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 11/18] net/dpaa: implement detailed packet parsing Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 12/18] net/dpaa: enhance DPAA frame display Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 13/18] net/dpaa: support mempool debug Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 14/18] bus/dpaa: add OH port mode for dpaa eth Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 15/18] bus/dpaa: add ONIC port mode for the DPAA eth Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 16/18] net/dpaa: improve the dpaa port cleanup Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 17/18] net/dpaa: improve dpaa errata A010022 handling Hemant Agrawal
2024-09-30 12:15     ` [PATCH v4 18/18] net/dpaa: fix reallocate_mbuf handling Hemant Agrawal

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=20240930102946.3236998-13-hemant.agrawal@nxp.com \
    --to=hemant.agrawal@nxp.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@amd.com \
    --cc=jun.yang@nxp.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).