From: Ivan Malov <ivan.malov@oktetlabs.ru>
To: dev@dpdk.org
Cc: Ori Kam <orika@nvidia.com>, Eli Britstein <elibr@nvidia.com>,
Ilya Maximets <i.maximets@ovn.org>,
Thomas Monjalon <thomas@monjalon.net>,
Stephen Hemminger <stephen@networkplumber.org>,
Jerin Jacob <jerinj@marvell.com>,
Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>,
Aman Singh <aman.deep.singh@intel.com>,
Yuying Zhang <yuying.zhang@intel.com>,
Ajit Khaparde <ajit.khaparde@broadcom.com>,
Somnath Kotur <somnath.kotur@broadcom.com>,
Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>,
Ferruh Yigit <ferruh.yigit@xilinx.com>
Subject: [PATCH 10/13] ethdev: remove deprecated flow item PF
Date: Fri, 12 Aug 2022 22:18:24 +0300 [thread overview]
Message-ID: <20220812191827.3187441-11-ivan.malov@oktetlabs.ru> (raw)
In-Reply-To: <20220812191827.3187441-1-ivan.malov@oktetlabs.ru>
Such deprecation was commenced in DPDK 21.11.
Since then, no parties have objected. Remove.
The patch breaks ABI.
Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
---
app/test-pmd/cmdline_flow.c | 9 ----
doc/guides/nics/features/bnxt.ini | 1 -
doc/guides/nics/features/cxgbe.ini | 1 -
doc/guides/nics/features/default.ini | 1 -
doc/guides/nics/features/sfc.ini | 1 -
doc/guides/nics/sfc_efx.rst | 2 -
doc/guides/prog_guide/rte_flow.rst | 34 -------------
.../prog_guide/switch_representation.rst | 14 ------
doc/guides/rel_notes/release_22_11.rst | 5 ++
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 2 -
drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c | 4 --
drivers/net/bnxt/tf_ulp/ulp_rte_parser.c | 25 ----------
drivers/net/bnxt/tf_ulp/ulp_rte_parser.h | 5 --
drivers/net/cxgbe/cxgbe_flow.c | 21 --------
drivers/net/sfc/sfc_mae.c | 48 -------------------
lib/ethdev/rte_flow.c | 1 -
lib/ethdev/rte_flow.h | 15 ------
17 files changed, 5 insertions(+), 184 deletions(-)
diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index 23889f7ab1..2722d5a48d 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -249,7 +249,6 @@ enum index {
ITEM_INVERT,
ITEM_ANY,
ITEM_ANY_NUM,
- ITEM_PF,
ITEM_VF,
ITEM_VF_ID,
ITEM_PHY_PORT,
@@ -1278,7 +1277,6 @@ static const enum index next_item[] = {
ITEM_VOID,
ITEM_INVERT,
ITEM_ANY,
- ITEM_PF,
ITEM_VF,
ITEM_PHY_PORT,
ITEM_PORT_ID,
@@ -3461,13 +3459,6 @@ static const struct token token_list[] = {
.next = NEXT(item_any, NEXT_ENTRY(COMMON_UNSIGNED), item_param),
.args = ARGS(ARGS_ENTRY(struct rte_flow_item_any, num)),
},
- [ITEM_PF] = {
- .name = "pf",
- .help = "match traffic from/to the physical function",
- .priv = PRIV_ITEM(PF, 0),
- .next = NEXT(NEXT_ENTRY(ITEM_NEXT)),
- .call = parse_vc,
- },
[ITEM_VF] = {
.name = "vf",
.help = "match traffic from/to a virtual function ID",
diff --git a/doc/guides/nics/features/bnxt.ini b/doc/guides/nics/features/bnxt.ini
index afb5414b49..259480d1df 100644
--- a/doc/guides/nics/features/bnxt.ini
+++ b/doc/guides/nics/features/bnxt.ini
@@ -63,7 +63,6 @@ ipv6 = Y
gre = Y
icmp = Y
icmp6 = Y
-pf = Y
phy_port = Y
port_id = Y
port_representor = Y
diff --git a/doc/guides/nics/features/cxgbe.ini b/doc/guides/nics/features/cxgbe.ini
index f674803ec4..d869f2100f 100644
--- a/doc/guides/nics/features/cxgbe.ini
+++ b/doc/guides/nics/features/cxgbe.ini
@@ -39,7 +39,6 @@ Usage doc = Y
eth = Y
ipv4 = Y
ipv6 = Y
-pf = Y
phy_port = Y
tcp = Y
udp = Y
diff --git a/doc/guides/nics/features/default.ini b/doc/guides/nics/features/default.ini
index d1db0c256a..aff236134e 100644
--- a/doc/guides/nics/features/default.ini
+++ b/doc/guides/nics/features/default.ini
@@ -121,7 +121,6 @@ meta =
mpls =
nsh =
nvgre =
-pf =
pfcp =
phy_port =
port_id =
diff --git a/doc/guides/nics/features/sfc.ini b/doc/guides/nics/features/sfc.ini
index 2e798b5ef5..355174d5c2 100644
--- a/doc/guides/nics/features/sfc.ini
+++ b/doc/guides/nics/features/sfc.ini
@@ -47,7 +47,6 @@ ipv4 = Y
ipv6 = Y
mark = P
nvgre = Y
-pf = Y
phy_port = Y
port_id = Y
port_representor = Y
diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst
index 39c6e23d5b..2dbc59e8f7 100644
--- a/doc/guides/nics/sfc_efx.rst
+++ b/doc/guides/nics/sfc_efx.rst
@@ -200,8 +200,6 @@ Supported pattern items (***transfer*** rules):
- PHY_PORT (cannot repeat; conflicts with other traffic source items)
-- PF (cannot repeat; conflicts with other traffic source items)
-
- VF (cannot repeat; conflicts with other traffic source items)
- ETH
diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index 588914b231..72f0c3d346 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -535,37 +535,6 @@ Usage example, matching non-TCPv4 packets only:
| 4 | END |
+-------+----------+
-Item: ``PF``
-^^^^^^^^^^^^
-
-This item is deprecated. Consider:
- - `Item: PORT_REPRESENTOR`_
- - `Item: REPRESENTED_PORT`_
-
-Matches traffic originating from (ingress) or going to (egress) the physical
-function of the current device.
-
-If supported, should work even if the physical function is not managed by
-the application and thus not associated with a DPDK port ID.
-
-- Can be combined with any number of `Item: VF`_ to match both PF and VF
- traffic.
-- ``spec``, ``last`` and ``mask`` must not be set.
-
-.. _table_rte_flow_item_pf:
-
-.. table:: PF
-
- +----------+-------+
- | Field | Value |
- +==========+=======+
- | ``spec`` | unset |
- +----------+-------+
- | ``last`` | unset |
- +----------+-------+
- | ``mask`` | unset |
- +----------+-------+
-
Item: ``VF``
^^^^^^^^^^^^
@@ -584,7 +553,6 @@ separate entities, should be addressed through their own DPDK port IDs.
- Can be specified multiple times to match traffic addressed to several VF
IDs.
-- Can be combined with a PF item to match both PF and VF traffic.
- Default ``mask`` matches any VF ID.
.. _table_rte_flow_item_vf:
@@ -2074,8 +2042,6 @@ This action is deprecated. Consider:
Directs matching traffic to the physical function (PF) of the current
device.
-See `Item: PF`_.
-
- No configurable properties.
.. _table_rte_flow_action_pf:
diff --git a/doc/guides/prog_guide/switch_representation.rst b/doc/guides/prog_guide/switch_representation.rst
index 3da30fc779..6fd7b98bdc 100644
--- a/doc/guides/prog_guide/switch_representation.rst
+++ b/doc/guides/prog_guide/switch_representation.rst
@@ -624,25 +624,11 @@ Same restrictions as `PORT_ID pattern item`_.
- Targets **A**, **B** or **C** in `traffic steering`_.
-PF Pattern Item
-^^^^^^^^^^^^^^^
-
-Matches traffic originating from (ingress) or going to (egress) the physical
-function of the current device.
-
-If supported, should work even if the physical function is not managed by
-the application and thus not associated with a DPDK port ID. Its behavior is
-otherwise similar to `PORT_ID pattern item`_ using PF port ID.
-
-- Matches **A** in `traffic steering`_.
-
PF Action
^^^^^^^^^
Directs matching traffic to the physical function of the current device.
-Same restrictions as `PF pattern item`_.
-
- Targets **A** in `traffic steering`_.
VF Pattern Item
diff --git a/doc/guides/rel_notes/release_22_11.rst b/doc/guides/rel_notes/release_22_11.rst
index c4ce32daed..b7469708af 100644
--- a/doc/guides/rel_notes/release_22_11.rst
+++ b/doc/guides/rel_notes/release_22_11.rst
@@ -76,6 +76,9 @@ Removed Items
Also, make sure to start the actual text at the margin.
=======================================================
+* ethdev: removed ``RTE_FLOW_ITEM_TYPE_PF``;
+ use ``RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT``.
+
API Changes
-----------
@@ -122,6 +125,8 @@ ABI Changes
Also, make sure to start the actual text at the margin.
=======================================================
+* ethdev: enum ``RTE_FLOW_ITEM`` was affected by deprecation procedure.
+
Known Issues
------------
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index c105200fe7..4446560369 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -3665,8 +3665,6 @@ This section lists supported pattern items and their attributes, if any.
- ``num {unsigned}``: number of layers covered.
-- ``pf``: match traffic from/to the physical function.
-
- ``vf``: match traffic from/to a virtual function ID.
- ``id {unsigned}``: VF ID.
diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c b/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c
index e9337ecd2c..17216426d8 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c
@@ -260,10 +260,6 @@ struct bnxt_ulp_rte_hdr_info ulp_hdr_info[] = {
.hdr_type = BNXT_ULP_HDR_TYPE_SUPPORTED,
.proto_hdr_func = ulp_rte_item_any_handler
},
- [RTE_FLOW_ITEM_TYPE_PF] = {
- .hdr_type = BNXT_ULP_HDR_TYPE_SUPPORTED,
- .proto_hdr_func = ulp_rte_pf_hdr_handler
- },
[RTE_FLOW_ITEM_TYPE_VF] = {
.hdr_type = BNXT_ULP_HDR_TYPE_SUPPORTED,
.proto_hdr_func = ulp_rte_vf_hdr_handler
diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c
index 9edf3e8799..6a1d235f77 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c
@@ -507,31 +507,6 @@ ulp_rte_parser_implicit_act_port_process(struct ulp_rte_parser_params *params)
return BNXT_TF_RC_SUCCESS;
}
-/* Function to handle the parsing of RTE Flow item PF Header. */
-int32_t
-ulp_rte_pf_hdr_handler(const struct rte_flow_item *item __rte_unused,
- struct ulp_rte_parser_params *params)
-{
- uint16_t port_id = 0;
- uint16_t svif_mask = 0xFFFF;
- uint32_t ifindex;
-
- /* Get the implicit port id */
- port_id = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_INCOMING_IF);
-
- /* perform the conversion from dpdk port to bnxt ifindex */
- if (ulp_port_db_dev_port_to_ulp_index(params->ulp_ctx,
- port_id,
- &ifindex)) {
- BNXT_TF_DBG(ERR, "ParseErr:Portid is not valid\n");
- return BNXT_TF_RC_ERROR;
- }
-
- /* Update the SVIF details */
- return ulp_rte_parser_svif_set(params, ifindex, svif_mask,
- BNXT_ULP_DIR_INVALID);
-}
-
/* Function to handle the parsing of RTE Flow item VF Header. */
int32_t
ulp_rte_vf_hdr_handler(const struct rte_flow_item *item,
diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h
index e4225d00f8..94918f6b4a 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h
+++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h
@@ -80,11 +80,6 @@ bnxt_ulp_rte_parser_act_parse(const struct rte_flow_action actions[],
void
bnxt_ulp_rte_parser_post_process(struct ulp_rte_parser_params *params);
-/* Function to handle the parsing of RTE Flow item PF Header. */
-int32_t
-ulp_rte_pf_hdr_handler(const struct rte_flow_item *item,
- struct ulp_rte_parser_params *params);
-
/* Function to handle the parsing of RTE Flow item VF Header. */
int32_t
ulp_rte_vf_hdr_handler(const struct rte_flow_item *item,
diff --git a/drivers/net/cxgbe/cxgbe_flow.c b/drivers/net/cxgbe/cxgbe_flow.c
index 6e460dfe2e..e4f9c152b5 100644
--- a/drivers/net/cxgbe/cxgbe_flow.c
+++ b/drivers/net/cxgbe/cxgbe_flow.c
@@ -288,22 +288,6 @@ ch_rte_parsetype_vlan(const void *dmask, const struct rte_flow_item *item,
return 0;
}
-static int
-ch_rte_parsetype_pf(const void *dmask __rte_unused,
- const struct rte_flow_item *item __rte_unused,
- struct ch_filter_specification *fs,
- struct rte_flow_error *e __rte_unused)
-{
- struct rte_flow *flow = (struct rte_flow *)fs->private;
- struct rte_eth_dev *dev = flow->dev;
- struct adapter *adap = ethdev2adap(dev);
-
- CXGBE_FILL_FS(1, 1, pfvf_vld);
-
- CXGBE_FILL_FS(adap->pf, 0x7, pf);
- return 0;
-}
-
static int
ch_rte_parsetype_vf(const void *dmask, const struct rte_flow_item *item,
struct ch_filter_specification *fs,
@@ -1022,11 +1006,6 @@ static struct chrte_fparse parseitem[] = {
.dmask = &rte_flow_item_tcp_mask,
},
- [RTE_FLOW_ITEM_TYPE_PF] = {
- .fptr = ch_rte_parsetype_pf,
- .dmask = NULL,
- },
-
[RTE_FLOW_ITEM_TYPE_VF] = {
.fptr = ch_rte_parsetype_vf,
.dmask = &(const struct rte_flow_item_vf){
diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c
index eb197fbdeb..e8da2d2a0d 100644
--- a/drivers/net/sfc/sfc_mae.c
+++ b/drivers/net/sfc/sfc_mae.c
@@ -1685,42 +1685,6 @@ sfc_mae_rule_parse_item_phy_port(const struct rte_flow_item *item,
return 0;
}
-static int
-sfc_mae_rule_parse_item_pf(const struct rte_flow_item *item,
- struct sfc_flow_parse_ctx *ctx,
- struct rte_flow_error *error)
-{
- struct sfc_mae_parse_ctx *ctx_mae = ctx->mae;
- const efx_nic_cfg_t *encp = efx_nic_cfg_get(ctx_mae->sa->nic);
- efx_mport_sel_t mport_v;
- int rc;
-
- if (ctx_mae->match_mport_set) {
- return rte_flow_error_set(error, ENOTSUP,
- RTE_FLOW_ERROR_TYPE_ITEM, item,
- "Can't handle multiple traffic source items");
- }
-
- rc = efx_mae_mport_by_pcie_function(encp->enc_pf, EFX_PCI_VF_INVALID,
- &mport_v);
- if (rc != 0) {
- return rte_flow_error_set(error, rc,
- RTE_FLOW_ERROR_TYPE_ITEM, item,
- "Failed to convert the PF ID");
- }
-
- rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec, &mport_v, NULL);
- if (rc != 0) {
- return rte_flow_error_set(error, rc,
- RTE_FLOW_ERROR_TYPE_ITEM, item,
- "Failed to set MPORT for the PF");
- }
-
- ctx_mae->match_mport_set = B_TRUE;
-
- return 0;
-}
-
static int
sfc_mae_rule_parse_item_vf(const struct rte_flow_item *item,
struct sfc_flow_parse_ctx *ctx,
@@ -2591,18 +2555,6 @@ static const struct sfc_flow_item sfc_flow_items[] = {
.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
.parse = sfc_mae_rule_parse_item_phy_port,
},
- {
- .type = RTE_FLOW_ITEM_TYPE_PF,
- .name = "PF",
- /*
- * In terms of RTE flow, this item is a META one,
- * and its position in the pattern is don't care.
- */
- .prev_layer = SFC_FLOW_ITEM_ANY_LAYER,
- .layer = SFC_FLOW_ITEM_ANY_LAYER,
- .ctx_type = SFC_FLOW_PARSE_CTX_MAE,
- .parse = sfc_mae_rule_parse_item_pf,
- },
{
.type = RTE_FLOW_ITEM_TYPE_VF,
.name = "VF",
diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c
index 501be9d602..6ece72bf36 100644
--- a/lib/ethdev/rte_flow.c
+++ b/lib/ethdev/rte_flow.c
@@ -97,7 +97,6 @@ static const struct rte_flow_desc_data rte_flow_desc_item[] = {
MK_FLOW_ITEM(VOID, 0),
MK_FLOW_ITEM(INVERT, 0),
MK_FLOW_ITEM(ANY, sizeof(struct rte_flow_item_any)),
- MK_FLOW_ITEM(PF, 0),
MK_FLOW_ITEM(VF, sizeof(struct rte_flow_item_vf)),
MK_FLOW_ITEM(PHY_PORT, sizeof(struct rte_flow_item_phy_port)),
MK_FLOW_ITEM(PORT_ID, sizeof(struct rte_flow_item_port_id)),
diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h
index bc68fd5631..97de98e232 100644
--- a/lib/ethdev/rte_flow.h
+++ b/lib/ethdev/rte_flow.h
@@ -188,20 +188,6 @@ enum rte_flow_item_type {
*/
RTE_FLOW_ITEM_TYPE_ANY,
- /**
- * @deprecated
- * @see RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR
- * @see RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT
- *
- * [META]
- *
- * Matches traffic originating from (ingress) or going to (egress)
- * the physical function of the current device.
- *
- * No associated specification structure.
- */
- RTE_FLOW_ITEM_TYPE_PF,
-
/**
* @deprecated
* @see RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR
@@ -732,7 +718,6 @@ static const struct rte_flow_item_any rte_flow_item_any_mask = {
*
* - Can be specified multiple times to match traffic addressed to several
* VF IDs.
- * - Can be combined with a PF item to match both PF and VF traffic.
*
* A zeroed mask can be used to match any VF ID.
*/
--
2.30.2
next prev parent reply other threads:[~2022-08-12 19:19 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-12 19:18 [PATCH 00/13] ethdev: proceed with flow subsystem rework Ivan Malov
2022-08-12 19:18 ` [PATCH 01/13] ethdev: strip experimental tag off Rx metadata negotiate API Ivan Malov
2022-08-12 19:18 ` [PATCH 02/13] ethdev: strip experimental tag off port ID items and actions Ivan Malov
2022-08-15 12:59 ` Ori Kam
2022-08-12 19:18 ` [PATCH 03/13] ethdev: remove experimental tag from flow transfer proxy API Ivan Malov
2022-08-15 12:58 ` Ori Kam
2022-08-12 19:18 ` [PATCH 04/13] net/dpaa2: support represented port flow action Ivan Malov
2022-08-12 19:18 ` [PATCH 05/13] net/cnxk: " Ivan Malov
2022-08-12 19:18 ` [PATCH 06/13] app/testpmd: add port steering targets to sample " Ivan Malov
2022-08-12 19:18 ` [PATCH 07/13] doc: revisit outdated flow rule examples in testpmd tutorial Ivan Malov
2022-08-12 19:18 ` [PATCH 08/13] doc: add new port items and actions to switch representation Ivan Malov
2022-08-12 19:18 ` [PATCH 09/13] doc: rework VF-related explanations in " Ivan Malov
2022-08-12 19:18 ` Ivan Malov [this message]
2022-08-22 5:32 ` [PATCH 10/13] ethdev: remove deprecated flow item PF Ori Kam
2022-08-12 19:18 ` [PATCH 11/13] ethdev: remove deprecated flow item VF Ivan Malov
2022-08-22 5:50 ` Ori Kam
2022-08-12 19:18 ` [PATCH 12/13] ethdev: remove deprecated flow item PHY PORT Ivan Malov
2022-08-22 5:33 ` Ori Kam
2022-09-27 7:08 ` Thomas Monjalon
2022-09-27 16:18 ` Ajit Khaparde
2022-08-12 19:18 ` [PATCH 13/13] ethdev: remove deprecated flow action " Ivan Malov
2022-08-22 5:33 ` Ori Kam
2022-09-27 8:32 ` [PATCH 00/13] ethdev: proceed with flow subsystem rework 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=20220812191827.3187441-11-ivan.malov@oktetlabs.ru \
--to=ivan.malov@oktetlabs.ru \
--cc=ajit.khaparde@broadcom.com \
--cc=aman.deep.singh@intel.com \
--cc=andrew.rybchenko@oktetlabs.ru \
--cc=dev@dpdk.org \
--cc=elibr@nvidia.com \
--cc=ferruh.yigit@xilinx.com \
--cc=i.maximets@ovn.org \
--cc=jerinj@marvell.com \
--cc=orika@nvidia.com \
--cc=rahul.lakkireddy@chelsio.com \
--cc=somnath.kotur@broadcom.com \
--cc=stephen@networkplumber.org \
--cc=thomas@monjalon.net \
--cc=yuying.zhang@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).