DPDK patches and discussions
 help / color / mirror / Atom feed
From: Stephen Hemminger <stephen@networkplumber.org>
To: dev@dpdk.org
Cc: Stephen Hemminger <stephen@networkplumber.org>,
	Gagandeep Singh <g.singh@nxp.com>,
	Hemant Agrawal <hemant.agrawal@nxp.com>,
	Ankur Dwivedi <adwivedi@marvell.com>,
	Anoob Joseph <anoobj@marvell.com>,
	Tejasree Kondoj <ktejasree@marvell.com>,
	Kai Ji <kai.ji@intel.com>,
	Pablo de Lara <pablo.de.lara.guarch@intel.com>
Subject: [PATCH v4 04/11] drivers/crypto: use rte_pktmbuf_mtod_offset
Date: Fri,  7 Jul 2023 13:39:01 -0700	[thread overview]
Message-ID: <20230707203908.64371-5-stephen@networkplumber.org> (raw)
In-Reply-To: <20230707203908.64371-1-stephen@networkplumber.org>

Replace explicit packet offset computations with rte_pktmbuf_mtod_offset().

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 drivers/crypto/caam_jr/caam_jr.c             |  8 ++++----
 drivers/crypto/cnxk/cn9k_cryptodev_ops.c     |  2 +-
 drivers/crypto/cnxk/cnxk_se.h                |  5 ++---
 drivers/crypto/ipsec_mb/pmd_kasumi.c         | 19 +++++++++++--------
 drivers/crypto/ipsec_mb/pmd_snow3g.c         |  4 ++--
 drivers/crypto/ipsec_mb/pmd_zuc.c            | 18 ++++++++++--------
 drivers/crypto/qat/dev/qat_crypto_pmd_gens.h |  9 +++++----
 drivers/crypto/qat/qat_sym.h                 |  9 +++++----
 8 files changed, 40 insertions(+), 34 deletions(-)

diff --git a/drivers/crypto/caam_jr/caam_jr.c b/drivers/crypto/caam_jr/caam_jr.c
index b55258689b49..9c96fd21a48d 100644
--- a/drivers/crypto/caam_jr/caam_jr.c
+++ b/drivers/crypto/caam_jr/caam_jr.c
@@ -631,15 +631,15 @@ hw_poll_job_ring(struct sec_job_ring_t *job_ring,
 
 			if (ctx->op->sym->m_dst) {
 				/*TODO check for ip header or other*/
-				ip4_hdr = (struct ip *)
-				rte_pktmbuf_mtod(ctx->op->sym->m_dst, char*);
+				ip4_hdr = rte_pktmbuf_mtod(ctx->op->sym->m_dst,
+							   struct ip *);
 				ctx->op->sym->m_dst->pkt_len =
 					rte_be_to_cpu_16(ip4_hdr->ip_len);
 				ctx->op->sym->m_dst->data_len =
 					rte_be_to_cpu_16(ip4_hdr->ip_len);
 			} else {
-				ip4_hdr = (struct ip *)
-				rte_pktmbuf_mtod(ctx->op->sym->m_src, char*);
+				ip4_hdr = rte_pktmbuf_mtod(ctx->op->sym->m_src,
+							   struct ip *);
 				ctx->op->sym->m_src->pkt_len =
 					rte_be_to_cpu_16(ip4_hdr->ip_len);
 				ctx->op->sym->m_src->data_len =
diff --git a/drivers/crypto/cnxk/cn9k_cryptodev_ops.c b/drivers/crypto/cnxk/cn9k_cryptodev_ops.c
index 34d40b07d4c6..8b91d11b79cc 100644
--- a/drivers/crypto/cnxk/cn9k_cryptodev_ops.c
+++ b/drivers/crypto/cnxk/cn9k_cryptodev_ops.c
@@ -520,7 +520,7 @@ cn9k_cpt_sec_post_process(struct rte_crypto_op *cop,
 
 	if (infl_req->op_flags & CPT_OP_FLAGS_IPSEC_DIR_INBOUND) {
 
-		hdr = (struct roc_ie_on_inb_hdr *)rte_pktmbuf_mtod(m, char *);
+		hdr = rte_pktmbuf_mtod(m, struct roc_ie_on_inb_hdr *);
 
 		if (likely(m->next == NULL)) {
 			ip = PLT_PTR_ADD(hdr, ROC_IE_ON_INB_RPTR_HDR);
diff --git a/drivers/crypto/cnxk/cnxk_se.h b/drivers/crypto/cnxk/cnxk_se.h
index 75c1dce231bf..1392af5833d1 100644
--- a/drivers/crypto/cnxk/cnxk_se.h
+++ b/drivers/crypto/cnxk/cnxk_se.h
@@ -2724,7 +2724,7 @@ fill_fc_params(struct rte_crypto_op *cop, struct cnxk_se_sess *sess,
 		m = cpt_m_dst_get(cpt_op, m_src, m_dst);
 
 		/* Digest immediately following data is best case */
-		if (unlikely(rte_pktmbuf_mtod(m, uint8_t *) + mc_hash_off !=
+		if (unlikely(rte_pktmbuf_mtod_offset(m, uint8_t *, mc_hash_off) !=
 			     (uint8_t *)sym_op->aead.digest.data)) {
 			flags |= ROC_SE_VALID_MAC_BUF;
 			fc_params.mac_buf.size = sess->mac_len;
@@ -2759,8 +2759,7 @@ fill_fc_params(struct rte_crypto_op *cop, struct cnxk_se_sess *sess,
 
 			/* hmac immediately following data is best case */
 			if (!(op_minor & ROC_SE_FC_MINOR_OP_HMAC_FIRST) &&
-			    (unlikely(rte_pktmbuf_mtod(m, uint8_t *) +
-					      mc_hash_off !=
+			    (unlikely(rte_pktmbuf_mtod_offset(m, uint8_t *, mc_hash_off) !=
 				      (uint8_t *)sym_op->auth.digest.data))) {
 				flags |= ROC_SE_VALID_MAC_BUF;
 				fc_params.mac_buf.size = sess->mac_len;
diff --git a/drivers/crypto/ipsec_mb/pmd_kasumi.c b/drivers/crypto/ipsec_mb/pmd_kasumi.c
index 5db9c523cd9a..70536ec3dc2a 100644
--- a/drivers/crypto/ipsec_mb/pmd_kasumi.c
+++ b/drivers/crypto/ipsec_mb/pmd_kasumi.c
@@ -83,13 +83,16 @@ process_kasumi_cipher_op(struct ipsec_mb_qp *qp, struct rte_crypto_op **ops,
 	uint32_t num_bytes[num_ops];
 
 	for (i = 0; i < num_ops; i++) {
-		src[i] = rte_pktmbuf_mtod(ops[i]->sym->m_src, uint8_t *)
-			 + (ops[i]->sym->cipher.data.offset >> 3);
+		src[i] = rte_pktmbuf_mtod_offset(ops[i]->sym->m_src,
+						 uint8_t *,
+						 (ops[i]->sym->cipher.data.offset >> 3));
 		dst[i] = ops[i]->sym->m_dst
-			     ? rte_pktmbuf_mtod(ops[i]->sym->m_dst, uint8_t *)
-				   + (ops[i]->sym->cipher.data.offset >> 3)
-			     : rte_pktmbuf_mtod(ops[i]->sym->m_src, uint8_t *)
-				   + (ops[i]->sym->cipher.data.offset >> 3);
+			     ? rte_pktmbuf_mtod_offset(ops[i]->sym->m_dst,
+						       uint8_t *,
+						       (ops[i]->sym->cipher.data.offset >> 3))
+			     : rte_pktmbuf_mtod_offset(ops[i]->sym->m_src,
+						       uint8_t *,
+						       (ops[i]->sym->cipher.data.offset >> 3));
 		iv_ptr = rte_crypto_op_ctod_offset(ops[i], uint8_t *,
 						    session->cipher_iv_offset);
 		iv[i] = *((uint64_t *)(iv_ptr));
@@ -155,8 +158,8 @@ process_kasumi_hash_op(struct ipsec_mb_qp *qp, struct rte_crypto_op **ops,
 
 		length_in_bits = ops[i]->sym->auth.data.length;
 
-		src = rte_pktmbuf_mtod(ops[i]->sym->m_src, uint8_t *)
-		      + (ops[i]->sym->auth.data.offset >> 3);
+		src = rte_pktmbuf_mtod_offset(ops[i]->sym->m_src, uint8_t *,
+					      (ops[i]->sym->auth.data.offset >> 3));
 		/* Direction from next bit after end of message */
 		num_bytes = length_in_bits >> 3;
 
diff --git a/drivers/crypto/ipsec_mb/pmd_snow3g.c b/drivers/crypto/ipsec_mb/pmd_snow3g.c
index e64df1a462e3..a96779f05942 100644
--- a/drivers/crypto/ipsec_mb/pmd_snow3g.c
+++ b/drivers/crypto/ipsec_mb/pmd_snow3g.c
@@ -248,8 +248,8 @@ process_snow3g_hash_op(struct ipsec_mb_qp *qp, struct rte_crypto_op **ops,
 
 		length_in_bits = ops[i]->sym->auth.data.length;
 
-		src = rte_pktmbuf_mtod(ops[i]->sym->m_src, uint8_t *) +
-				(ops[i]->sym->auth.data.offset >> 3);
+		src = rte_pktmbuf_mtod_offset(ops[i]->sym->m_src, uint8_t *,
+					      (ops[i]->sym->auth.data.offset >> 3));
 		iv = rte_crypto_op_ctod_offset(ops[i], uint8_t *,
 				session->auth_iv_offset);
 
diff --git a/drivers/crypto/ipsec_mb/pmd_zuc.c b/drivers/crypto/ipsec_mb/pmd_zuc.c
index 92fd9d180894..44781be1d107 100644
--- a/drivers/crypto/ipsec_mb/pmd_zuc.c
+++ b/drivers/crypto/ipsec_mb/pmd_zuc.c
@@ -107,13 +107,14 @@ process_zuc_cipher_op(struct ipsec_mb_qp *qp, struct rte_crypto_op **ops,
 		}
 #endif
 
-		src[i] = rte_pktmbuf_mtod(ops[i]->sym->m_src, uint8_t *) +
-				(ops[i]->sym->cipher.data.offset >> 3);
+		src[i] = rte_pktmbuf_mtod_offset(ops[i]->sym->m_src,
+						 uint8_t *,
+						 (ops[i]->sym->cipher.data.offset >> 3));
 		dst[i] = ops[i]->sym->m_dst ?
-			rte_pktmbuf_mtod(ops[i]->sym->m_dst, uint8_t *) +
-				(ops[i]->sym->cipher.data.offset >> 3) :
-			rte_pktmbuf_mtod(ops[i]->sym->m_src, uint8_t *) +
-				(ops[i]->sym->cipher.data.offset >> 3);
+			rte_pktmbuf_mtod_offset(ops[i]->sym->m_dst, uint8_t *,
+						(ops[i]->sym->cipher.data.offset >> 3)) :
+			rte_pktmbuf_mtod_offset(ops[i]->sym->m_src, uint8_t *,
+						(ops[i]->sym->cipher.data.offset >> 3));
 		iv[i] = rte_crypto_op_ctod_offset(ops[i], uint8_t *,
 				sess->cipher_iv_offset);
 		num_bytes[i] = ops[i]->sym->cipher.data.length >> 3;
@@ -159,8 +160,9 @@ process_zuc_hash_op(struct ipsec_mb_qp *qp, struct rte_crypto_op **ops,
 
 		length_in_bits[i] = ops[i]->sym->auth.data.length;
 
-		src[i] = rte_pktmbuf_mtod(ops[i]->sym->m_src, uint8_t *) +
-				(ops[i]->sym->auth.data.offset >> 3);
+		src[i] = rte_pktmbuf_mtod_offset(ops[i]->sym->m_src,
+						 uint8_t *,
+						 (ops[i]->sym->auth.data.offset >> 3));
 		iv[i] = rte_crypto_op_ctod_offset(ops[i], uint8_t *,
 				sess->auth_iv_offset);
 
diff --git a/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h b/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
index 1bafeb4a53e8..3e0dfea94c87 100644
--- a/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
+++ b/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
@@ -56,14 +56,15 @@ qat_bpicipher_preprocess(struct qat_sym_session *ctx,
 		uint8_t *last_block, *dst, *iv;
 		uint32_t last_block_offset = sym_op->cipher.data.offset +
 				sym_op->cipher.data.length - last_block_len;
-		last_block = (uint8_t *) rte_pktmbuf_mtod_offset(sym_op->m_src,
-				uint8_t *, last_block_offset);
+		last_block = rte_pktmbuf_mtod_offset(sym_op->m_src, uint8_t *,
+						     last_block_offset);
 
 		if (unlikely((sym_op->m_dst != NULL)
 				&& (sym_op->m_dst != sym_op->m_src)))
 			/* out-of-place operation (OOP) */
-			dst = (uint8_t *) rte_pktmbuf_mtod_offset(sym_op->m_dst,
-						uint8_t *, last_block_offset);
+			dst = rte_pktmbuf_mtod_offset(sym_op->m_dst,
+						      uint8_t *,
+						      last_block_offset);
 		else
 			dst = last_block;
 
diff --git a/drivers/crypto/qat/qat_sym.h b/drivers/crypto/qat/qat_sym.h
index 193281cd9135..d7ceb13b29cd 100644
--- a/drivers/crypto/qat/qat_sym.h
+++ b/drivers/crypto/qat/qat_sym.h
@@ -192,13 +192,14 @@ qat_bpicipher_postprocess(struct qat_sym_session *ctx,
 
 		last_block_offset = sym_op->cipher.data.offset +
 				sym_op->cipher.data.length - last_block_len;
-		last_block = (uint8_t *) rte_pktmbuf_mtod_offset(sym_op->m_src,
-				uint8_t *, last_block_offset);
+		last_block = rte_pktmbuf_mtod_offset(sym_op->m_src, uint8_t *,
+						     last_block_offset);
 
 		if (unlikely(sym_op->m_dst != NULL))
 			/* out-of-place operation (OOP) */
-			dst = (uint8_t *) rte_pktmbuf_mtod_offset(sym_op->m_dst,
-						uint8_t *, last_block_offset);
+			dst = rte_pktmbuf_mtod_offset(sym_op->m_dst,
+						      uint8_t *,
+						      last_block_offset);
 		else
 			dst = last_block;
 
-- 
2.39.2


  parent reply	other threads:[~2023-07-07 20:39 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-05 17:47 [PATCH 00/14] rte_pktmbuf_mtod_offset usage Stephen Hemminger
2023-05-05 17:48 ` [PATCH 01/14] gro: use rte_pktmbuf_mtod_offset Stephen Hemminger
2023-05-05 17:48 ` [PATCH 02/14] gso: " Stephen Hemminger
2023-05-05 17:48 ` [PATCH 03/14] testpmd: " Stephen Hemminger
2023-05-05 17:48 ` [PATCH 04/14] test: cryptodev " Stephen Hemminger
2023-05-05 17:48 ` [PATCH 05/14] examples: " Stephen Hemminger
2023-05-05 17:48 ` [PATCH 06/14] net/tap: " Stephen Hemminger
2023-05-05 17:48 ` [PATCH 07/14] net/nfp: " Stephen Hemminger
2023-05-05 17:48 ` [PATCH 08/14] crypto/ipsec_mb: " Stephen Hemminger
2023-05-05 17:48 ` [PATCH 09/14] crypto/qat: " Stephen Hemminger
2023-05-05 17:48 ` [PATCH 10/14] crypto/cnxk: use rte_ptkmbuf_mtod_offset Stephen Hemminger
2023-05-05 17:48 ` [PATCH 11/14] common/cpt: use rte_pktmbuf_mtod_offset Stephen Hemminger
2023-05-05 17:48 ` [PATCH 12/14] crypto/caam_jr: " Stephen Hemminger
2023-05-09 11:43   ` Hemant Agrawal
2023-05-05 17:48 ` [PATCH 13/14] net/mlx4: " Stephen Hemminger
2023-05-05 17:48 ` [PATCH 14/14] baseband/fpga_5gnr: use rte_pktmbu_mtod_offset Stephen Hemminger
2023-05-06 16:03 ` [PATCH v2 00/14] rte_pktmbuf_mtod_offset usage Stephen Hemminger
2023-05-06 16:03   ` [PATCH v2 01/14] gro: use rte_pktmbuf_mtod_offset Stephen Hemminger
2023-05-06 16:03   ` [PATCH v2 02/14] gso: " Stephen Hemminger
2023-05-06 16:03   ` [PATCH v2 03/14] testpmd: " Stephen Hemminger
2023-05-06 16:03   ` [PATCH v2 04/14] test: cryptodev " Stephen Hemminger
2023-05-06 16:03   ` [PATCH v2 05/14] examples: " Stephen Hemminger
2023-05-06 16:03   ` [PATCH v2 06/14] net/tap: " Stephen Hemminger
2023-05-06 16:03   ` [PATCH v2 07/14] net/nfp: " Stephen Hemminger
2023-05-09 13:35     ` Niklas Söderlund
2023-05-06 16:03   ` [PATCH v2 08/14] crypto/ipsec_mb: " Stephen Hemminger
2023-05-29 12:47     ` De Lara Guarch, Pablo
2023-05-06 16:03   ` [PATCH v2 09/14] crypto/qat: " Stephen Hemminger
2023-05-06 16:03   ` [PATCH v2 10/14] crypto/cnxk: use rte_ptkmbuf_mtod_offset Stephen Hemminger
2023-05-06 16:04   ` [PATCH v2 11/14] common/cpt: use rte_pktmbuf_mtod_offset Stephen Hemminger
2023-05-06 16:04   ` [PATCH v2 12/14] crypto/caam_jr: " Stephen Hemminger
2023-05-06 16:04   ` [PATCH v2 13/14] net/mlx4: " Stephen Hemminger
2023-05-06 16:04   ` [PATCH v2 14/14] baseband/fpga_5gnr: use rte_pktmbu_mtod_offset Stephen Hemminger
2023-07-06 17:59 ` [PATCH v3 00/14] Use rte_pktmbuf_mtod_offset() where possible Stephen Hemminger
2023-07-06 17:59   ` [PATCH v3 01/14] gro: use rte_pktmbuf_mtod_offset Stephen Hemminger
2023-07-06 17:59   ` [PATCH v3 02/14] gso: " Stephen Hemminger
2023-07-06 17:59   ` [PATCH v3 03/14] testpmd: " Stephen Hemminger
2023-07-06 17:59   ` [PATCH v3 04/14] test: cryptodev " Stephen Hemminger
2023-07-07 12:46     ` Ferruh Yigit
2023-07-07 20:32       ` Stephen Hemminger
2023-07-06 17:59   ` [PATCH v3 05/14] examples: " Stephen Hemminger
2023-07-06 17:59   ` [PATCH v3 06/14] net/tap: " Stephen Hemminger
2023-07-06 17:59   ` [PATCH v3 07/14] net/nfp: " Stephen Hemminger
2023-07-06 17:59   ` [PATCH v3 08/14] crypto/ipsec_mb: " Stephen Hemminger
2023-07-06 17:59   ` [PATCH v3 09/14] crypto/qat: " Stephen Hemminger
2023-07-06 17:59   ` [PATCH v3 10/14] crypto/cnxk: use rte_ptkmbuf_mtod_offset Stephen Hemminger
2023-07-06 17:59   ` [PATCH v3 11/14] common/cpt: use rte_pktmbuf_mtod_offset Stephen Hemminger
2023-07-06 17:59   ` [PATCH v3 12/14] crypto/caam_jr: " Stephen Hemminger
2023-07-06 17:59   ` [PATCH v3 13/14] net/mlx4: " Stephen Hemminger
2023-07-07 12:46     ` Ferruh Yigit
2023-07-06 17:59   ` [PATCH v3 14/14] baseband/fpga_5gnr: use rte_pktmbu_mtod_offset Stephen Hemminger
2023-07-07 12:47   ` [PATCH v3 00/14] Use rte_pktmbuf_mtod_offset() where possible Ferruh Yigit
2023-07-07 20:38 ` [PATCH v4 00/11] Use rte_pktmbuf_mtod_offset Stephen Hemminger
2023-07-07 20:38   ` [PATCH v4 01/11] gro: use rte_pktmbuf_mtod_offset Stephen Hemminger
2023-07-07 20:38   ` [PATCH v4 02/11] gso: " Stephen Hemminger
2023-07-07 20:39   ` [PATCH v4 03/11] test: " Stephen Hemminger
2023-07-07 20:39   ` Stephen Hemminger [this message]
2023-07-07 20:39   ` [PATCH v4 05/11] net/nfp: " Stephen Hemminger
2023-07-07 20:39   ` [PATCH v4 06/11] net/tap: use rte_pktmbuf_motd_offset Stephen Hemminger
2023-07-07 20:39   ` [PATCH v4 07/11] baseband/fpga: use rte_pktmbuf_offset Stephen Hemminger
2023-07-07 20:39   ` [PATCH v4 08/11] cpt: use rte_pktmbuf_mtod_offset Stephen Hemminger
2023-07-07 20:39   ` [PATCH v4 09/11] testpmd: " Stephen Hemminger
2023-07-07 20:39   ` [PATCH v4 10/11] examples/ptpclient: " Stephen Hemminger
2023-07-07 20:39   ` [PATCH v4 11/11] examples/l2fwd-crypto: " Stephen Hemminger
2023-07-08  1:57 ` [PATCH v5 00/11] use rte_pktmbuf_mto_offset Stephen Hemminger
2023-07-08  1:57   ` [PATCH v5 01/11] gro: use rte_pktmbuf_mtod_offset Stephen Hemminger
2023-07-08  1:57   ` [PATCH v5 02/11] gso: " Stephen Hemminger
2023-07-08  1:57   ` [PATCH v5 03/11] test/crypto_dev: " Stephen Hemminger
2023-07-08  1:57   ` [PATCH v5 04/11] drivers/crypto: " Stephen Hemminger
2023-07-11  5:34     ` [EXT] " Anoob Joseph
2023-07-12 14:56     ` Hemant Agrawal
2023-07-08  1:57   ` [PATCH v5 05/11] net/nfp: " Stephen Hemminger
2023-07-10 12:19     ` Niklas Söderlund
2024-01-24 13:44       ` Thomas Monjalon
2023-07-08  1:57   ` [PATCH v5 06/11] net/tap: use rte_pktmbuf_motd_offset Stephen Hemminger
2024-01-24 13:47     ` Thomas Monjalon
2023-07-08  1:57   ` [PATCH v5 07/11] baseband/fpga: use rte_pktmbuf_offset Stephen Hemminger
2023-07-08  1:57   ` [PATCH v5 08/11] cpt: use rte_pktmbuf_mtod_offset Stephen Hemminger
2023-07-11  5:35     ` [EXT] " Anoob Joseph
2023-07-08  1:57   ` [PATCH v5 09/11] testpmd: " Stephen Hemminger
2023-07-08  1:57   ` [PATCH v5 10/11] examples/ptpclient: " Stephen Hemminger
2023-07-08  1:57   ` [PATCH v5 11/11] examples/l2fwd-crypto: " Stephen Hemminger
2023-07-09  3:54   ` [PATCH v5 00/11] use rte_pktmbuf_mto_offset fengchengwen
2024-01-24 14:55     ` Thomas Monjalon

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=20230707203908.64371-5-stephen@networkplumber.org \
    --to=stephen@networkplumber.org \
    --cc=adwivedi@marvell.com \
    --cc=anoobj@marvell.com \
    --cc=dev@dpdk.org \
    --cc=g.singh@nxp.com \
    --cc=hemant.agrawal@nxp.com \
    --cc=kai.ji@intel.com \
    --cc=ktejasree@marvell.com \
    --cc=pablo.de.lara.guarch@intel.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).