From: Stephen Hemminger <stephen@networkplumber.org>
To: dev@dpdk.org
Cc: Stephen Hemminger <stephen@networkplumber.org>,
Aman Singh <aman.deep.singh@intel.com>
Subject: [PATCH v2 05/22] app/testpmd: remove support for flow director
Date: Mon, 3 Aug 2026 09:51:51 -0700 [thread overview]
Message-ID: <20260803165304.289869-6-stephen@networkplumber.org> (raw)
In-Reply-To: <20260803165304.289869-1-stephen@networkplumber.org>
The legacy flow director API is deprecated and being removed.
Drop it from testpmd; the testpmd CLI is not a stable API.
Removed commands:
show port fdir (port_id|all)
clear port fdir (port_id|all)
Also drop the documentation for "port config pctype mapping" and
"port config input set" which no longer exist.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
app/test-pmd/cmdline.c | 21 +--
app/test-pmd/config.c | 163 --------------------
app/test-pmd/testpmd.h | 3 -
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 36 -----
4 files changed, 6 insertions(+), 217 deletions(-)
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 10ee7c5179..c142a8ec50 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -163,7 +163,7 @@ static void cmd_help_long_parsed(void *parsed_result,
"Display:\n"
"--------\n\n"
- "show port (info|stats|summary|xstats|fdir|dcb_tc) (port_id|all)\n"
+ "show port (info|stats|summary|xstats|dcb_tc) (port_id|all)\n"
" Display information for port_id, or all.\n\n"
"show port info (port_id) representor\n"
@@ -189,7 +189,7 @@ static void cmd_help_long_parsed(void *parsed_result,
"show port (port_id) rss-hash [key | algorithm]\n"
" Display the RSS hash functions, RSS hash key and RSS hash algorithms of port\n\n"
- "clear port (info|stats|xstats|fdir) (port_id|all)\n"
+ "clear port (info|stats|xstats) (port_id|all)\n"
" Clear information for port_id, or all.\n\n"
"show (rxq|txq) info (port_id) (queue_id)\n"
@@ -7514,11 +7514,6 @@ static void cmd_showportall_parsed(void *parsed_result,
else if (!strcmp(res->what, "xstats"))
RTE_ETH_FOREACH_DEV(i)
nic_xstats_display(i);
-#if defined(RTE_NET_I40E) || defined(RTE_NET_IXGBE)
- else if (!strcmp(res->what, "fdir"))
- RTE_ETH_FOREACH_DEV(i)
- fdir_get_infos(i);
-#endif
else if (!strcmp(res->what, "dcb_tc"))
RTE_ETH_FOREACH_DEV(i)
port_dcb_info_display(i);
@@ -7531,14 +7526,14 @@ static cmdline_parse_token_string_t cmd_showportall_port =
TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, port, "port");
static cmdline_parse_token_string_t cmd_showportall_what =
TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, what,
- "info#summary#stats#xstats#fdir#dcb_tc");
+ "info#summary#stats#xstats#dcb_tc");
static cmdline_parse_token_string_t cmd_showportall_all =
TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, all, "all");
static cmdline_parse_inst_t cmd_showportall = {
.f = cmd_showportall_parsed,
.data = NULL,
.help_str = "show|clear port "
- "info|summary|stats|xstats|fdir|dcb_tc all",
+ "info|summary|stats|xstats|dcb_tc all",
.tokens = {
(void *)&cmd_showportall_show,
(void *)&cmd_showportall_port,
@@ -7576,10 +7571,6 @@ static void cmd_showport_parsed(void *parsed_result,
nic_stats_display(res->portnum);
else if (!strcmp(res->what, "xstats"))
nic_xstats_display(res->portnum);
-#if defined(RTE_NET_I40E) || defined(RTE_NET_IXGBE)
- else if (!strcmp(res->what, "fdir"))
- fdir_get_infos(res->portnum);
-#endif
else if (!strcmp(res->what, "dcb_tc"))
port_dcb_info_display(res->portnum);
}
@@ -7591,7 +7582,7 @@ static cmdline_parse_token_string_t cmd_showport_port =
TOKEN_STRING_INITIALIZER(struct cmd_showport_result, port, "port");
static cmdline_parse_token_string_t cmd_showport_what =
TOKEN_STRING_INITIALIZER(struct cmd_showport_result, what,
- "info#summary#stats#xstats#fdir#dcb_tc");
+ "info#summary#stats#xstats#dcb_tc");
static cmdline_parse_token_num_t cmd_showport_portnum =
TOKEN_NUM_INITIALIZER(struct cmd_showport_result, portnum, RTE_UINT16);
@@ -7599,7 +7590,7 @@ static cmdline_parse_inst_t cmd_showport = {
.f = cmd_showport_parsed,
.data = NULL,
.help_str = "show|clear port "
- "info|summary|stats|xstats|fdir|dcb_tc "
+ "info|summary|stats|xstats|dcb_tc "
"<port_id>",
.tokens = {
(void *)&cmd_showport_show,
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index aa03eb99cc..582e7287be 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -7056,169 +7056,6 @@ flowtype_to_str(uint16_t flow_type)
return NULL;
}
-#if defined(RTE_NET_I40E) || defined(RTE_NET_IXGBE)
-
-static inline void
-print_fdir_flex_payload(struct rte_eth_fdir_flex_conf *flex_conf, uint32_t num)
-{
- struct rte_eth_flex_payload_cfg *cfg;
- uint32_t i, j;
-
- for (i = 0; i < flex_conf->nb_payloads; i++) {
- cfg = &flex_conf->flex_set[i];
- if (cfg->type == RTE_ETH_RAW_PAYLOAD)
- printf("\n RAW: ");
- else if (cfg->type == RTE_ETH_L2_PAYLOAD)
- printf("\n L2_PAYLOAD: ");
- else if (cfg->type == RTE_ETH_L3_PAYLOAD)
- printf("\n L3_PAYLOAD: ");
- else if (cfg->type == RTE_ETH_L4_PAYLOAD)
- printf("\n L4_PAYLOAD: ");
- else
- printf("\n UNKNOWN PAYLOAD(%u): ", cfg->type);
- for (j = 0; j < num; j++)
- printf(" %-5u", cfg->src_offset[j]);
- }
- printf("\n");
-}
-
-static inline void
-print_fdir_flex_mask(struct rte_eth_fdir_flex_conf *flex_conf, uint32_t num)
-{
- struct rte_eth_fdir_flex_mask *mask;
- uint32_t i, j;
- const char *p;
-
- for (i = 0; i < flex_conf->nb_flexmasks; i++) {
- mask = &flex_conf->flex_mask[i];
- p = flowtype_to_str(mask->flow_type);
- printf("\n %s:\t", p ? p : "unknown");
- for (j = 0; j < num; j++)
- printf(" %02x", mask->mask[j]);
- }
- printf("\n");
-}
-
-static inline void
-print_fdir_flow_type(uint32_t flow_types_mask)
-{
- int i;
- const char *p;
-
- for (i = RTE_ETH_FLOW_UNKNOWN; i < RTE_ETH_FLOW_MAX; i++) {
- if (!(flow_types_mask & (1 << i)))
- continue;
- p = flowtype_to_str(i);
- if (p)
- printf(" %s", p);
- else
- printf(" unknown");
- }
- printf("\n");
-}
-
-static int
-get_fdir_info(portid_t port_id, struct rte_eth_fdir_info *fdir_info,
- struct rte_eth_fdir_stats *fdir_stat)
-{
- int ret = -ENOTSUP;
-
-#ifdef RTE_NET_I40E
- if (ret == -ENOTSUP) {
- ret = rte_pmd_i40e_get_fdir_info(port_id, fdir_info);
- if (!ret)
- ret = rte_pmd_i40e_get_fdir_stats(port_id, fdir_stat);
- }
-#endif
-#ifdef RTE_NET_IXGBE
- if (ret == -ENOTSUP) {
- ret = rte_pmd_ixgbe_get_fdir_info(port_id, fdir_info);
- if (!ret)
- ret = rte_pmd_ixgbe_get_fdir_stats(port_id, fdir_stat);
- }
-#endif
- switch (ret) {
- case 0:
- break;
- case -ENOTSUP:
- fprintf(stderr, "\n FDIR is not supported on port %-2d\n",
- port_id);
- break;
- default:
- fprintf(stderr, "programming error: (%s)\n", strerror(-ret));
- break;
- }
- return ret;
-}
-
-void
-fdir_get_infos(portid_t port_id)
-{
- struct rte_eth_fdir_stats fdir_stat;
- struct rte_eth_fdir_info fdir_info;
-
- static const char *fdir_stats_border = "########################";
-
- if (port_id_is_invalid(port_id, ENABLED_WARN))
- return;
-
- memset(&fdir_info, 0, sizeof(fdir_info));
- memset(&fdir_stat, 0, sizeof(fdir_stat));
- if (get_fdir_info(port_id, &fdir_info, &fdir_stat))
- return;
-
- printf("\n %s FDIR infos for port %-2d %s\n",
- fdir_stats_border, port_id, fdir_stats_border);
- printf(" MODE: ");
- if (fdir_info.mode == RTE_FDIR_MODE_PERFECT)
- printf(" PERFECT\n");
- else if (fdir_info.mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN)
- printf(" PERFECT-MAC-VLAN\n");
- else if (fdir_info.mode == RTE_FDIR_MODE_PERFECT_TUNNEL)
- printf(" PERFECT-TUNNEL\n");
- else if (fdir_info.mode == RTE_FDIR_MODE_SIGNATURE)
- printf(" SIGNATURE\n");
- else
- printf(" DISABLE\n");
- if (fdir_info.mode != RTE_FDIR_MODE_PERFECT_MAC_VLAN
- && fdir_info.mode != RTE_FDIR_MODE_PERFECT_TUNNEL) {
- printf(" SUPPORTED FLOW TYPE: ");
- print_fdir_flow_type(fdir_info.flow_types_mask[0]);
- }
- printf(" FLEX PAYLOAD INFO:\n");
- printf(" max_len: %-10"PRIu32" payload_limit: %-10"PRIu32"\n"
- " payload_unit: %-10"PRIu32" payload_seg: %-10"PRIu32"\n"
- " bitmask_unit: %-10"PRIu32" bitmask_num: %-10"PRIu32"\n",
- fdir_info.max_flexpayload, fdir_info.flex_payload_limit,
- fdir_info.flex_payload_unit,
- fdir_info.max_flex_payload_segment_num,
- fdir_info.flex_bitmask_unit, fdir_info.max_flex_bitmask_num);
- if (fdir_info.flex_conf.nb_payloads > 0) {
- printf(" FLEX PAYLOAD SRC OFFSET:");
- print_fdir_flex_payload(&fdir_info.flex_conf, fdir_info.max_flexpayload);
- }
- if (fdir_info.flex_conf.nb_flexmasks > 0) {
- printf(" FLEX MASK CFG:");
- print_fdir_flex_mask(&fdir_info.flex_conf, fdir_info.max_flexpayload);
- }
- printf(" guarant_count: %-10"PRIu32" best_count: %"PRIu32"\n",
- fdir_stat.guarant_cnt, fdir_stat.best_cnt);
- printf(" guarant_space: %-10"PRIu32" best_space: %"PRIu32"\n",
- fdir_info.guarant_spc, fdir_info.best_spc);
- printf(" collision: %-10"PRIu32" free: %"PRIu32"\n"
- " maxhash: %-10"PRIu32" maxlen: %"PRIu32"\n"
- " add: %-10"PRIu64" remove: %"PRIu64"\n"
- " f_add: %-10"PRIu64" f_remove: %"PRIu64"\n",
- fdir_stat.collision, fdir_stat.free,
- fdir_stat.maxhash, fdir_stat.maxlen,
- fdir_stat.add, fdir_stat.remove,
- fdir_stat.f_add, fdir_stat.f_remove);
- printf(" %s############################%s\n",
- fdir_stats_border, fdir_stats_border);
-}
-
-#endif /* RTE_NET_I40E || RTE_NET_IXGBE */
-
void
set_vf_traffic(portid_t port_id, uint8_t is_rx, uint16_t vf, uint8_t on)
{
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 083171853c..f7c10ab6b8 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -1212,9 +1212,6 @@ int all_ports_stopped(void);
int port_is_stopped(portid_t port_id);
int port_is_started(portid_t port_id);
void pmd_test_exit(void);
-#if defined(RTE_NET_I40E) || defined(RTE_NET_IXGBE)
-void fdir_get_infos(portid_t port_id);
-#endif
void port_rss_reta_info(portid_t port_id,
struct rte_eth_rss_reta_entry64 *reta_conf,
uint16_t nb_entries);
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index e65376df54..f75a8d700c 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -2288,42 +2288,6 @@ Where the threshold type can be:
These threshold options are also available from the command-line.
-port config pctype mapping
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Reset pctype mapping table::
-
- testpmd> port config (port_id) pctype mapping reset
-
-Update hardware defined pctype to software defined flow type mapping table::
-
- testpmd> port config (port_id) pctype mapping update (pctype_id_0[,pctype_id_1]*) (flow_type_id)
-
-where:
-
-* ``pctype_id_x``: hardware pctype id as index of bit in bitmask value of the pctype mapping table.
-
-* ``flow_type_id``: software flow type id as the index of the pctype mapping table.
-
-port config input set
-~~~~~~~~~~~~~~~~~~~~~
-
-Config RSS/FDIR/FDIR flexible payload input set for some pctype::
-
- testpmd> port config (port_id) pctype (pctype_id) \
- (hash_inset|fdir_inset|fdir_flx_inset) \
- (get|set|clear) field (field_idx)
-
-Clear RSS/FDIR/FDIR flexible payload input set for some pctype::
-
- testpmd> port config (port_id) pctype (pctype_id) \
- (hash_inset|fdir_inset|fdir_flx_inset) clear all
-
-where:
-
-* ``pctype_id``: hardware packet classification types.
-* ``field_idx``: hardware field index.
-
port config udp_tunnel_port
~~~~~~~~~~~~~~~~~~~~~~~~~~~
--
2.53.0
next prev parent reply other threads:[~2026-08-03 16:53 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-03 16:51 [PATCH v2 00/22] ethdev: clean up legacy flow director Stephen Hemminger
2026-08-03 16:51 ` [PATCH v2 01/22] drivers/net: remove unused include in dpaa Stephen Hemminger
2026-08-03 16:51 ` [PATCH v2 02/22] ethdev: use DPDK byte order conversion Stephen Hemminger
2026-08-03 16:51 ` [PATCH v2 03/22] net/ixgbe: remove experimental FDIR API Stephen Hemminger
2026-08-03 16:51 ` [PATCH v2 04/22] net/i40e: " Stephen Hemminger
2026-08-03 16:51 ` Stephen Hemminger [this message]
2026-08-03 16:51 ` [PATCH v2 06/22] net/gve: include IP, UDP and TCP headers Stephen Hemminger
2026-08-03 18:04 ` Joshua Washington
2026-08-03 16:51 ` [PATCH v2 07/22] crypto/dpaa_sec: include UDP header Stephen Hemminger
2026-08-03 16:51 ` [PATCH v2 08/22] net/nfp: break implicit dependency on rte_eth_ctrl.h Stephen Hemminger
2026-08-03 16:51 ` [PATCH v2 09/22] net/mana: include used network headers Stephen Hemminger
2026-08-03 17:09 ` [EXTERNAL] " Long Li
2026-08-03 16:51 ` [PATCH v2 10/22] gro: include headers directly Stephen Hemminger
2026-08-03 16:51 ` [PATCH v2 11/22] app/test: " Stephen Hemminger
2026-08-03 16:51 ` [PATCH v2 12/22] node: get UDP header Stephen Hemminger
2026-08-03 16:51 ` [PATCH v2 13/22] net/rnp: include network headers Stephen Hemminger
2026-08-03 16:52 ` [PATCH v2 14/22] net/r8169: get " Stephen Hemminger
2026-08-03 16:52 ` [PATCH v2 15/22] net/ngbe: include network protocol headers Stephen Hemminger
2026-08-03 16:52 ` [PATCH v2 16/22] examples: include network headers Stephen Hemminger
2026-08-03 16:52 ` [PATCH v2 17/22] net/mlx5: include rte_flow as needed Stephen Hemminger
2026-08-03 16:52 ` [PATCH v2 18/22] net/sfc: include rte_flow Stephen Hemminger
2026-08-03 16:52 ` [PATCH v2 19/22] net/intel/common: include network headers Stephen Hemminger
2026-08-03 16:52 ` [PATCH v2 20/22] net/enetfec: add missing sys/types.h include Stephen Hemminger
2026-08-03 16:52 ` [PATCH v2 21/22] ethdev, drivers: isolate flow director Stephen Hemminger
2026-08-03 16:52 ` [PATCH v2 22/22] doc: add release note about rte_ethdev changes Stephen Hemminger
2026-08-04 15:44 ` [PATCH v3 00/23] ethdev: isolate legacy flow director Stephen Hemminger
2026-08-04 15:44 ` [PATCH v3 01/23] drivers/net: remove unused include in dpaa Stephen Hemminger
2026-08-04 15:44 ` [PATCH v3 02/23] ethdev: use DPDK byte order conversion Stephen Hemminger
2026-08-04 15:44 ` [PATCH v3 03/23] net/ixgbe: remove experimental FDIR API Stephen Hemminger
2026-08-04 15:44 ` [PATCH v3 04/23] net/i40e: " Stephen Hemminger
2026-08-04 15:44 ` [PATCH v3 05/23] app/testpmd: remove support for flow director Stephen Hemminger
2026-08-04 15:44 ` [PATCH v3 06/23] app/testpmd: move str_to_flowtype to i40e Stephen Hemminger
2026-08-04 15:44 ` [PATCH v3 07/23] app/test: include headers directly Stephen Hemminger
2026-08-04 15:53 ` Marat Khalili
2026-08-04 15:44 ` [PATCH v3 08/23] gro: " Stephen Hemminger
2026-08-04 15:44 ` [PATCH v3 09/23] crypto/dpaa_sec: include UDP header Stephen Hemminger
2026-08-04 15:44 ` [PATCH v3 10/23] net/gve: include UDP, SCTP and TCP headers Stephen Hemminger
2026-08-04 15:44 ` [PATCH v3 11/23] net/nfp: break implicit dependency on rte_eth_ctrl.h Stephen Hemminger
2026-08-04 15:45 ` [PATCH v3 12/23] net/mana: include used network headers Stephen Hemminger
2026-08-04 15:45 ` [PATCH v3 13/23] node: get UDP header Stephen Hemminger
2026-08-04 15:45 ` [PATCH v3 14/23] net/rnp: include network headers Stephen Hemminger
2026-08-04 15:45 ` [PATCH v3 15/23] net/r8169: get " Stephen Hemminger
2026-08-04 15:45 ` [PATCH v3 16/23] net/ngbe: include network protocol headers Stephen Hemminger
2026-08-04 15:45 ` [PATCH v3 17/23] examples: include network headers Stephen Hemminger
2026-08-04 15:45 ` [PATCH v3 18/23] net/mlx5: include rte_flow as needed Stephen Hemminger
2026-08-04 15:45 ` [PATCH v3 19/23] net/sfc: include rte_flow Stephen Hemminger
2026-08-04 15:45 ` [PATCH v3 20/23] net/intel/common: include network headers Stephen Hemminger
2026-08-04 15:45 ` [PATCH v3 21/23] net/enetfec: add missing sys/types.h include Stephen Hemminger
2026-08-04 15:45 ` [PATCH v3 22/23] ethdev, drivers: isolate flow director Stephen Hemminger
2026-08-04 15:45 ` [PATCH v3 23/23] doc: add release note about rte_ethdev changes Stephen Hemminger
2026-08-06 5:08 ` [PATCH v4 00/23] ethdev: refactor remaining uses of flow director Stephen Hemminger
2026-08-06 5:08 ` [PATCH v4 01/23] drivers/net: remove unused include in dpaa and dpaa2 Stephen Hemminger
2026-08-06 6:13 ` Hemant Agrawal
2026-08-06 5:08 ` [PATCH v4 02/23] ethdev: use DPDK byte order conversion Stephen Hemminger
2026-08-06 5:08 ` [PATCH v4 03/23] net/ixgbe: remove experimental FDIR API Stephen Hemminger
2026-08-06 5:08 ` [PATCH v4 04/23] net/i40e: " Stephen Hemminger
2026-08-06 5:08 ` [PATCH v4 05/23] app/testpmd: remove support for flow director Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 06/23] app/testpmd: move str_to_flowtype to i40e Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 07/23] app/test: include headers directly Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 08/23] gro: " Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 09/23] crypto/dpaa_sec: include UDP header Stephen Hemminger
2026-08-06 6:12 ` Hemant Agrawal
2026-08-06 5:09 ` [PATCH v4 10/23] net/gve: include UDP, SCTP and TCP headers Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 11/23] net/nfp: break implicit dependency on rte_eth_ctrl.h Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 12/23] net/mana: include used network headers Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 13/23] node: get UDP header Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 14/23] net/rnp: include network headers Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 15/23] net/r8169: get " Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 16/23] net/ngbe: include network protocol headers Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 17/23] examples: include network headers Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 18/23] net/mlx5: include rte_flow as needed Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 19/23] net/sfc: include rte_flow Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 20/23] net/intel/common: include network headers Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 21/23] net/enetfec: add missing sys/types.h include Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 22/23] ethdev, drivers: isolate flow director Stephen Hemminger
2026-08-06 5:09 ` [PATCH v4 23/23] doc: add release note about rte_ethdev changes Stephen Hemminger
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=20260803165304.289869-6-stephen@networkplumber.org \
--to=stephen@networkplumber.org \
--cc=aman.deep.singh@intel.com \
--cc=dev@dpdk.org \
/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