* [PATCH 0/2] Fixes for iavf VLAN insertion offload
@ 2025-10-31 15:22 Ciara Loftus
2025-10-31 15:22 ` [PATCH 1/2] net/iavf: fix AVX-512 double VLAN (QinQ) insertion Ciara Loftus
2025-10-31 15:22 ` [PATCH 2/2] net/iavf: fix single VLAN insertion positioning Ciara Loftus
0 siblings, 2 replies; 3+ messages in thread
From: Ciara Loftus @ 2025-10-31 15:22 UTC (permalink / raw)
To: dev; +Cc: Ciara Loftus
The first patch fixes double VLAN offload in the AVX-512 path.
The second fixes single VLAN insertion offload across all paths.
Ciara Loftus (2):
net/iavf: fix AVX-512 double VLAN (QinQ) insertion
net/iavf: fix single VLAN insertion positioning
drivers/net/intel/iavf/iavf_rxtx.c | 50 +++++---------
drivers/net/intel/iavf/iavf_rxtx_vec_avx512.c | 68 ++++++++++---------
drivers/net/intel/iavf/iavf_rxtx_vec_common.h | 15 ++--
3 files changed, 60 insertions(+), 73 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] net/iavf: fix AVX-512 double VLAN (QinQ) insertion
2025-10-31 15:22 [PATCH 0/2] Fixes for iavf VLAN insertion offload Ciara Loftus
@ 2025-10-31 15:22 ` Ciara Loftus
2025-10-31 15:22 ` [PATCH 2/2] net/iavf: fix single VLAN insertion positioning Ciara Loftus
1 sibling, 0 replies; 3+ messages in thread
From: Ciara Loftus @ 2025-10-31 15:22 UTC (permalink / raw)
To: dev; +Cc: Ciara Loftus
QinQ insertion was enabled in the bulk transmit function but not the
single packet transmit function. Implement it in the single packet
function.
Also, fix an issue that would arise in the event an mbuf had both the
VLAN and QINQ offload flags set. In this case the L2TAG2 field would be
written to twice and could cause the tag to be corrupted. Reorder the
logic of populating the L2TAG2 field and ensure that the field is only
written to once.
Fixes: 3aa4efa36438 ("net/iavf: support VLAN insertion in AVX512 Tx")
Signed-off-by: Ciara Loftus <ciara.loftus@intel.com>
---
drivers/net/intel/iavf/iavf_rxtx_vec_avx512.c | 50 ++++++++++---------
drivers/net/intel/iavf/iavf_rxtx_vec_common.h | 10 ++--
2 files changed, 31 insertions(+), 29 deletions(-)
diff --git a/drivers/net/intel/iavf/iavf_rxtx_vec_avx512.c b/drivers/net/intel/iavf/iavf_rxtx_vec_avx512.c
index d40a858413..c800ae29e1 100644
--- a/drivers/net/intel/iavf/iavf_rxtx_vec_avx512.c
+++ b/drivers/net/intel/iavf/iavf_rxtx_vec_avx512.c
@@ -2077,7 +2077,13 @@ ctx_vtx1(volatile struct iavf_tx_desc *txdp, struct rte_mbuf *pkt,
if (((pkt->ol_flags & RTE_MBUF_F_TX_VLAN) || offload)) {
if (offload)
iavf_fill_ctx_desc_tunneling_avx512(&low_ctx_qw, pkt);
- if ((pkt->ol_flags & RTE_MBUF_F_TX_VLAN) ||
+ if (pkt->ol_flags & RTE_MBUF_F_TX_QINQ) {
+ uint64_t qinq_tag = vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2 ?
+ (uint64_t)pkt->vlan_tci_outer :
+ (uint64_t)pkt->vlan_tci;
+ high_ctx_qw |= IAVF_TX_CTX_DESC_IL2TAG2 << IAVF_TXD_CTX_QW1_CMD_SHIFT;
+ low_ctx_qw |= qinq_tag << IAVF_TXD_CTX_QW0_L2TAG2_PARAM;
+ } else if ((pkt->ol_flags & RTE_MBUF_F_TX_VLAN) &&
(vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2)) {
high_ctx_qw |= IAVF_TX_CTX_DESC_IL2TAG2 << IAVF_TXD_CTX_QW1_CMD_SHIFT;
low_ctx_qw |= (uint64_t)pkt->vlan_tci << IAVF_TXD_CTX_QW0_L2TAG2_PARAM;
@@ -2127,17 +2133,6 @@ ctx_vtx(volatile struct iavf_tx_desc *txdp,
((uint64_t)pkt[0]->data_len <<
IAVF_TXD_QW1_TX_BUF_SZ_SHIFT);
- if (pkt[1]->ol_flags & RTE_MBUF_F_TX_VLAN) {
- if (vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2) {
- hi_ctx_qw1 |=
- IAVF_TX_CTX_DESC_IL2TAG2 << IAVF_TXD_CTX_QW1_CMD_SHIFT;
- low_ctx_qw1 |=
- (uint64_t)pkt[1]->vlan_tci << IAVF_TXD_CTX_QW0_L2TAG2_PARAM;
- } else {
- hi_data_qw1 |=
- (uint64_t)pkt[1]->vlan_tci << IAVF_TXD_QW1_L2TAG1_SHIFT;
- }
- }
if (pkt[1]->ol_flags & RTE_MBUF_F_TX_QINQ) {
hi_ctx_qw1 |= IAVF_TX_CTX_DESC_IL2TAG2 << IAVF_TXD_CTX_QW1_CMD_SHIFT;
if (vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2) {
@@ -2153,22 +2148,21 @@ ctx_vtx(volatile struct iavf_tx_desc *txdp,
hi_data_qw1 |= (uint64_t)pkt[1]->vlan_tci <<
IAVF_TXD_QW1_L2TAG1_SHIFT;
}
- }
- if (IAVF_CHECK_TX_LLDP(pkt[1]))
- hi_ctx_qw1 |= IAVF_TX_CTX_DESC_SWTCH_UPLINK
- << IAVF_TXD_CTX_QW1_CMD_SHIFT;
-
- if (pkt[0]->ol_flags & RTE_MBUF_F_TX_VLAN) {
+ } else if (pkt[1]->ol_flags & RTE_MBUF_F_TX_VLAN) {
if (vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2) {
- hi_ctx_qw0 |=
+ hi_ctx_qw1 |=
IAVF_TX_CTX_DESC_IL2TAG2 << IAVF_TXD_CTX_QW1_CMD_SHIFT;
- low_ctx_qw0 |=
- (uint64_t)pkt[0]->vlan_tci << IAVF_TXD_CTX_QW0_L2TAG2_PARAM;
+ low_ctx_qw1 |=
+ (uint64_t)pkt[1]->vlan_tci << IAVF_TXD_CTX_QW0_L2TAG2_PARAM;
} else {
- hi_data_qw0 |=
- (uint64_t)pkt[0]->vlan_tci << IAVF_TXD_QW1_L2TAG1_SHIFT;
+ hi_data_qw1 |=
+ (uint64_t)pkt[1]->vlan_tci << IAVF_TXD_QW1_L2TAG1_SHIFT;
}
}
+ if (IAVF_CHECK_TX_LLDP(pkt[1]))
+ hi_ctx_qw1 |= IAVF_TX_CTX_DESC_SWTCH_UPLINK
+ << IAVF_TXD_CTX_QW1_CMD_SHIFT;
+
if (pkt[0]->ol_flags & RTE_MBUF_F_TX_QINQ) {
hi_ctx_qw0 |= IAVF_TX_CTX_DESC_IL2TAG2 << IAVF_TXD_CTX_QW1_CMD_SHIFT;
if (vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2) {
@@ -2184,6 +2178,16 @@ ctx_vtx(volatile struct iavf_tx_desc *txdp,
hi_data_qw0 |= (uint64_t)pkt[0]->vlan_tci <<
IAVF_TXD_QW1_L2TAG1_SHIFT;
}
+ } else if (pkt[0]->ol_flags & RTE_MBUF_F_TX_VLAN) {
+ if (vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2) {
+ hi_ctx_qw0 |=
+ IAVF_TX_CTX_DESC_IL2TAG2 << IAVF_TXD_CTX_QW1_CMD_SHIFT;
+ low_ctx_qw0 |=
+ (uint64_t)pkt[0]->vlan_tci << IAVF_TXD_CTX_QW0_L2TAG2_PARAM;
+ } else {
+ hi_data_qw0 |=
+ (uint64_t)pkt[0]->vlan_tci << IAVF_TXD_QW1_L2TAG1_SHIFT;
+ }
}
if (IAVF_CHECK_TX_LLDP(pkt[0]))
hi_ctx_qw0 |= IAVF_TX_CTX_DESC_SWTCH_UPLINK
diff --git a/drivers/net/intel/iavf/iavf_rxtx_vec_common.h b/drivers/net/intel/iavf/iavf_rxtx_vec_common.h
index f513777663..bf8faf3632 100644
--- a/drivers/net/intel/iavf/iavf_rxtx_vec_common.h
+++ b/drivers/net/intel/iavf/iavf_rxtx_vec_common.h
@@ -225,12 +225,6 @@ iavf_txd_enable_offload(__rte_unused struct rte_mbuf *tx_pkt,
#endif
#ifdef IAVF_TX_VLAN_QINQ_OFFLOAD
- if (ol_flags & RTE_MBUF_F_TX_VLAN && vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG1) {
- td_cmd |= IAVF_TX_DESC_CMD_IL2TAG1;
- *txd_hi |= ((uint64_t)tx_pkt->vlan_tci <<
- IAVF_TXD_QW1_L2TAG1_SHIFT);
- }
-
if (ol_flags & RTE_MBUF_F_TX_QINQ) {
td_cmd |= IAVF_TX_DESC_CMD_IL2TAG1;
if (vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG1)
@@ -239,6 +233,10 @@ iavf_txd_enable_offload(__rte_unused struct rte_mbuf *tx_pkt,
else
*txd_hi |= ((uint64_t)tx_pkt->vlan_tci_outer <<
IAVF_TXD_QW1_L2TAG1_SHIFT);
+ } else if (ol_flags & RTE_MBUF_F_TX_VLAN && vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG1) {
+ td_cmd |= IAVF_TX_DESC_CMD_IL2TAG1;
+ *txd_hi |= ((uint64_t)tx_pkt->vlan_tci <<
+ IAVF_TXD_QW1_L2TAG1_SHIFT);
}
#endif
--
2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 2/2] net/iavf: fix single VLAN insertion positioning
2025-10-31 15:22 [PATCH 0/2] Fixes for iavf VLAN insertion offload Ciara Loftus
2025-10-31 15:22 ` [PATCH 1/2] net/iavf: fix AVX-512 double VLAN (QinQ) insertion Ciara Loftus
@ 2025-10-31 15:22 ` Ciara Loftus
1 sibling, 0 replies; 3+ messages in thread
From: Ciara Loftus @ 2025-10-31 15:22 UTC (permalink / raw)
To: dev; +Cc: Ciara Loftus
Commit fdc37964c2bf ("net/iavf: support QinQ insertion offload in scalar
Tx") broke single VLAN insertion offload in cases where the v2 offload
capability and both inner and outer insertion were supported because it
caused inner VLAN tags to be inserted instead of outer.
When an iavf tx queue is being set up, if v2 offload capability is
supported, the driver queries the insertion capabilities and takes note
of where VLAN tags should be placed in the transmit and/or context
descriptors for insertion offload. In the offending commit, when both
inner and outer insertion was reported as supported, the flag
"vlan_flag" was changed to hold the location for inner VLAN tags.
However this caused inner VLAN tags to be inserted in the case of single
VLAN offload which is incorrect behaviour for this use case.
To fix this, revert the "vlan_flag" back to holding the location for
outer VLAN tags and update the datapath code accordingly.
Fixes: fdc37964c2bf ("net/iavf: support QinQ insertion offload in scalar Tx")
Signed-off-by: Ciara Loftus <ciara.loftus@intel.com>
---
drivers/net/intel/iavf/iavf_rxtx.c | 50 +++++++------------
drivers/net/intel/iavf/iavf_rxtx_vec_avx512.c | 24 ++++-----
drivers/net/intel/iavf/iavf_rxtx_vec_common.h | 5 +-
3 files changed, 32 insertions(+), 47 deletions(-)
diff --git a/drivers/net/intel/iavf/iavf_rxtx.c b/drivers/net/intel/iavf/iavf_rxtx.c
index a3ef13c791..66f718424a 100644
--- a/drivers/net/intel/iavf/iavf_rxtx.c
+++ b/drivers/net/intel/iavf/iavf_rxtx.c
@@ -799,32 +799,17 @@ iavf_dev_tx_queue_setup(struct rte_eth_dev *dev,
&adapter->vf.vlan_v2_caps.offloads.insertion_support;
uint32_t insertion_cap;
- if (insertion_support->outer == VIRTCHNL_VLAN_UNSUPPORTED ||
- insertion_support->inner == VIRTCHNL_VLAN_UNSUPPORTED) {
- /* Only one insertion is supported. */
- if (insertion_support->outer)
- insertion_cap = insertion_support->outer;
- else
- insertion_cap = insertion_support->inner;
-
- if (insertion_cap & VIRTCHNL_VLAN_TAG_LOCATION_L2TAG1) {
- txq->vlan_flag = IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG1;
- PMD_INIT_LOG(DEBUG, "VLAN insertion_cap: L2TAG1");
- } else if (insertion_cap & VIRTCHNL_VLAN_TAG_LOCATION_L2TAG2) {
- txq->vlan_flag = IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2;
- PMD_INIT_LOG(DEBUG, "VLAN insertion_cap: L2TAG2");
- }
- } else {
- /* Both outer and inner insertion supported. */
- if (insertion_support->inner & VIRTCHNL_VLAN_TAG_LOCATION_L2TAG1) {
- txq->vlan_flag = IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG1;
- PMD_INIT_LOG(DEBUG, "Inner VLAN insertion_cap: L2TAG1");
- PMD_INIT_LOG(DEBUG, "Outer VLAN insertion_cap: L2TAG2");
- } else {
- txq->vlan_flag = IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2;
- PMD_INIT_LOG(DEBUG, "Inner VLAN insertion_cap: L2TAG2");
- PMD_INIT_LOG(DEBUG, "Outer VLAN insertion_cap: L2TAG1");
- }
+ if (insertion_support->outer)
+ insertion_cap = insertion_support->outer;
+ else
+ insertion_cap = insertion_support->inner;
+
+ if (insertion_cap & VIRTCHNL_VLAN_TAG_LOCATION_L2TAG1) {
+ txq->vlan_flag = IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG1;
+ PMD_INIT_LOG(DEBUG, "VLAN insertion_cap: L2TAG1");
+ } else if (insertion_cap & VIRTCHNL_VLAN_TAG_LOCATION_L2TAG2) {
+ txq->vlan_flag = IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2;
+ PMD_INIT_LOG(DEBUG, "VLAN insertion_cap: L2TAG2");
}
} else {
txq->vlan_flag = IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG1;
@@ -2600,12 +2585,11 @@ iavf_fill_context_desc(volatile struct iavf_tx_context_desc *desc,
desc_qws->qw0 = rte_cpu_to_le_64(desc_qws->qw0);
desc_qws->qw1 = rte_cpu_to_le_64(desc_qws->qw1);
+ /* vlan_flag specifies VLAN tag location for VLAN, and outer tag location for QinQ. */
if (vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2)
+ desc->l2tag2 = m->ol_flags & RTE_MBUF_F_TX_QINQ ? m->vlan_tci_outer : m->vlan_tci;
+ else if (m->ol_flags & RTE_MBUF_F_TX_QINQ)
desc->l2tag2 = m->vlan_tci;
-
- if (m->ol_flags & RTE_MBUF_F_TX_QINQ)
- desc->l2tag2 = vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2 ? m->vlan_tci :
- m->vlan_tci_outer;
}
@@ -2660,11 +2644,11 @@ iavf_build_data_desc_cmd_offset_fields(volatile uint64_t *qw1,
l2tag1 |= m->vlan_tci;
}
- /* Descriptor based QinQ insertion */
+ /* Descriptor based QinQ insertion. vlan_flag specifies outer tag location. */
if (m->ol_flags & RTE_MBUF_F_TX_QINQ) {
command |= (uint64_t)IAVF_TX_DESC_CMD_IL2TAG1;
- l2tag1 = vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG1 ? m->vlan_tci :
- m->vlan_tci_outer;
+ l2tag1 = vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG1 ? m->vlan_tci_outer :
+ m->vlan_tci;
}
if ((m->ol_flags &
diff --git a/drivers/net/intel/iavf/iavf_rxtx_vec_avx512.c b/drivers/net/intel/iavf/iavf_rxtx_vec_avx512.c
index c800ae29e1..6f150cb1c1 100644
--- a/drivers/net/intel/iavf/iavf_rxtx_vec_avx512.c
+++ b/drivers/net/intel/iavf/iavf_rxtx_vec_avx512.c
@@ -2136,17 +2136,17 @@ ctx_vtx(volatile struct iavf_tx_desc *txdp,
if (pkt[1]->ol_flags & RTE_MBUF_F_TX_QINQ) {
hi_ctx_qw1 |= IAVF_TX_CTX_DESC_IL2TAG2 << IAVF_TXD_CTX_QW1_CMD_SHIFT;
if (vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2) {
- /* Inner tag at L2TAG2, outer tag at L2TAG1. */
- low_ctx_qw1 |= (uint64_t)pkt[1]->vlan_tci <<
- IAVF_TXD_CTX_QW0_L2TAG2_PARAM;
- hi_data_qw1 |= (uint64_t)pkt[1]->vlan_tci_outer <<
- IAVF_TXD_QW1_L2TAG1_SHIFT;
- } else {
/* Outer tag at L2TAG2, inner tag at L2TAG1. */
low_ctx_qw1 |= (uint64_t)pkt[1]->vlan_tci_outer <<
IAVF_TXD_CTX_QW0_L2TAG2_PARAM;
hi_data_qw1 |= (uint64_t)pkt[1]->vlan_tci <<
IAVF_TXD_QW1_L2TAG1_SHIFT;
+ } else {
+ /* Inner tag at L2TAG2, outer tag at L2TAG1. */
+ low_ctx_qw1 |= (uint64_t)pkt[1]->vlan_tci <<
+ IAVF_TXD_CTX_QW0_L2TAG2_PARAM;
+ hi_data_qw1 |= (uint64_t)pkt[1]->vlan_tci_outer <<
+ IAVF_TXD_QW1_L2TAG1_SHIFT;
}
} else if (pkt[1]->ol_flags & RTE_MBUF_F_TX_VLAN) {
if (vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2) {
@@ -2166,17 +2166,17 @@ ctx_vtx(volatile struct iavf_tx_desc *txdp,
if (pkt[0]->ol_flags & RTE_MBUF_F_TX_QINQ) {
hi_ctx_qw0 |= IAVF_TX_CTX_DESC_IL2TAG2 << IAVF_TXD_CTX_QW1_CMD_SHIFT;
if (vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2) {
- /* Inner tag at L2TAG2, outer tag at L2TAG1. */
- low_ctx_qw0 |= (uint64_t)pkt[0]->vlan_tci <<
- IAVF_TXD_CTX_QW0_L2TAG2_PARAM;
- hi_data_qw0 |= (uint64_t)pkt[0]->vlan_tci_outer <<
- IAVF_TXD_QW1_L2TAG1_SHIFT;
- } else {
/* Outer tag at L2TAG2, inner tag at L2TAG1. */
low_ctx_qw0 |= (uint64_t)pkt[0]->vlan_tci_outer <<
IAVF_TXD_CTX_QW0_L2TAG2_PARAM;
hi_data_qw0 |= (uint64_t)pkt[0]->vlan_tci <<
IAVF_TXD_QW1_L2TAG1_SHIFT;
+ } else {
+ /* Inner tag at L2TAG2, outer tag at L2TAG1. */
+ low_ctx_qw0 |= (uint64_t)pkt[0]->vlan_tci <<
+ IAVF_TXD_CTX_QW0_L2TAG2_PARAM;
+ hi_data_qw0 |= (uint64_t)pkt[0]->vlan_tci_outer <<
+ IAVF_TXD_QW1_L2TAG1_SHIFT;
}
} else if (pkt[0]->ol_flags & RTE_MBUF_F_TX_VLAN) {
if (vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2) {
diff --git a/drivers/net/intel/iavf/iavf_rxtx_vec_common.h b/drivers/net/intel/iavf/iavf_rxtx_vec_common.h
index bf8faf3632..86523a7d2b 100644
--- a/drivers/net/intel/iavf/iavf_rxtx_vec_common.h
+++ b/drivers/net/intel/iavf/iavf_rxtx_vec_common.h
@@ -227,11 +227,12 @@ iavf_txd_enable_offload(__rte_unused struct rte_mbuf *tx_pkt,
#ifdef IAVF_TX_VLAN_QINQ_OFFLOAD
if (ol_flags & RTE_MBUF_F_TX_QINQ) {
td_cmd |= IAVF_TX_DESC_CMD_IL2TAG1;
+ /* vlan_flag specifies outer tag location for QinQ. */
if (vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG1)
- *txd_hi |= ((uint64_t)tx_pkt->vlan_tci <<
+ *txd_hi |= ((uint64_t)tx_pkt->vlan_tci_outer <<
IAVF_TXD_QW1_L2TAG1_SHIFT);
else
- *txd_hi |= ((uint64_t)tx_pkt->vlan_tci_outer <<
+ *txd_hi |= ((uint64_t)tx_pkt->vlan_tci <<
IAVF_TXD_QW1_L2TAG1_SHIFT);
} else if (ol_flags & RTE_MBUF_F_TX_VLAN && vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG1) {
td_cmd |= IAVF_TX_DESC_CMD_IL2TAG1;
--
2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-10-31 15:23 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-10-31 15:22 [PATCH 0/2] Fixes for iavf VLAN insertion offload Ciara Loftus
2025-10-31 15:22 ` [PATCH 1/2] net/iavf: fix AVX-512 double VLAN (QinQ) insertion Ciara Loftus
2025-10-31 15:22 ` [PATCH 2/2] net/iavf: fix single VLAN insertion positioning Ciara Loftus
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).