* [dpdk-dev] [PATCH] app/acl: add script for automate testing @ 2021-05-18 11:26 Konstantin Ananyev 2021-07-24 13:21 ` Thomas Monjalon 2021-07-26 11:51 ` [dpdk-dev] [PATCH v2 0/2] app/acl: help to " Konstantin Ananyev 0 siblings, 2 replies; 6+ messages in thread From: Konstantin Ananyev @ 2021-05-18 11:26 UTC (permalink / raw) To: dev; +Cc: Konstantin Ananyev The purpose of this script is to help automate ACL library functional testing using test-acl app. Sample input files are also provided. Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com> --- app/test-acl/input/acl1v4_5_rule | 5 ++ app/test-acl/input/acl1v4_5_trace | 5 ++ app/test-acl/input/acl1v6_1_rule | 1 + app/test-acl/input/acl1v6_1_trace | 2 + app/test-acl/test-acl.sh | 92 +++++++++++++++++++++++++++++++ 5 files changed, 105 insertions(+) create mode 100644 app/test-acl/input/acl1v4_5_rule create mode 100644 app/test-acl/input/acl1v4_5_trace create mode 100644 app/test-acl/input/acl1v6_1_rule create mode 100644 app/test-acl/input/acl1v6_1_trace create mode 100644 app/test-acl/test-acl.sh diff --git a/app/test-acl/input/acl1v4_5_rule b/app/test-acl/input/acl1v4_5_rule new file mode 100644 index 0000000000..45301f3a3d --- /dev/null +++ b/app/test-acl/input/acl1v4_5_rule @@ -0,0 +1,5 @@ +@16.32.1.1/32 2.1.0.0/16 0 : 65535 0 : 65535 0/0 +@16.32.1.0/24 2.1.1.0/24 0 : 65535 0 : 65535 0/0 +@2.1.0.0/16 16.32.1.1/32 0 : 65535 0 : 65535 0/0 +@2.1.0.0/16 16.32.1.0/24 1000 : 2000 0 : 65535 0/0 +@2.1.1.0/24 16.32.1.0/24 0 : 65535 0 : 65535 0/0 diff --git a/app/test-acl/input/acl1v4_5_trace b/app/test-acl/input/acl1v4_5_trace new file mode 100644 index 0000000000..bfbcd31f88 --- /dev/null +++ b/app/test-acl/input/acl1v4_5_trace @@ -0,0 +1,5 @@ +0x10200101 0x02010304 100 100 6 0 +0x10200103 0x02010104 100 100 6 1 +0x02010304 0x10200101 100 100 6 2 +0x02010104 0x10200103 100 100 6 4 +0x02010104 0x10200101 100 100 6 2 diff --git a/app/test-acl/input/acl1v6_1_rule b/app/test-acl/input/acl1v6_1_rule new file mode 100644 index 0000000000..2ea9856b27 --- /dev/null +++ b/app/test-acl/input/acl1v6_1_rule @@ -0,0 +1 @@ +@9baa:cead:8000:0000:e300:00ff:fe04:c5a8/33 d1b5:2feb:0000:0000:6600:00ff:fed9:aeaa/33 0 : 65535 1526 : 1526 0x00/0x00 diff --git a/app/test-acl/input/acl1v6_1_trace b/app/test-acl/input/acl1v6_1_trace new file mode 100644 index 0000000000..6e86741edf --- /dev/null +++ b/app/test-acl/input/acl1v6_1_trace @@ -0,0 +1,2 @@ +9baa:cead:8000:0000:0000:0000:0000:0000 d1b5:2feb:0000:0000:0000:0000:0000:0000 37826 1526 6 0 +2eba:cc41:0000:0000:0000:0000:0000:0000 16ef:6cdb:0000:0000:0000:0000:0000:0000 25946 1525 0 4294967295 diff --git a/app/test-acl/test-acl.sh b/app/test-acl/test-acl.sh new file mode 100644 index 0000000000..348962c540 --- /dev/null +++ b/app/test-acl/test-acl.sh @@ -0,0 +1,92 @@ +#! /bin/bash +# SPDX-License-Identifier: BSD-3-Clause + +# Usage: +# /bin/bash <test-acl-binary> <dir-with-acl-rules-traces> <acl-alg> <burst-size> +# Expected file-naming conventions: +# - for rules: 'acl[0-9]v[4,6]_[0-9,a-z]+_rule' +# - for traces: 'acl[0-9]v[4,6]_[0-9,a-z]+_trace' +# Each rule file expects to have exactly one trace file. +# test-acl app follows classbench file format. +# Each line defines exactly one rule/trace. +# rules record format: +# '@'<src_ip_addr>'/'<masklen><space> \ +# <dst_ipv4_addr>'/'<masklen><space> \ +# <src_port_low><space>":"<src_port_high><space> \ +# <dst_port_low><space>":"<dst_port_high><space> \ +# <proto>'/'<mask> +# trace record format: +# <src_ip_addr><space><dst_ip_addr><space> \ +# <src_port><space<dst_port><space><proto>...<rule_id> +# +# As an example: +# /bin/bash app/test-acl/test-acl.sh build/app/dpdk-test-acl \ +# app/test-acl/input scalar 32 +# +# Refer to test-acl app for more information about rules/trace files format, +# available test-acl command-line options, etc. + +TACL_PATH=$1 +TACL_DIR=$2 +TACL_ALG=$3 +TACL_STEP=$4 + +if [[ ! -x ${TACL_PATH} ]]; then + echo "invalid TACL_PATH=${TACL_PATH}" + exit 127 +fi + +if [[ ! -d ${TACL_DIR} ]]; then + echo "invalid TACL_DIR=${TACL_DIR}" + exit 127 +fi + +V4F=`find ${TACL_DIR} -type f | egrep -e 'acl[0-9]v4_[0-9,a-z]+_rule$'` +V6F=`find ${TACL_DIR} -type f | egrep -e 'acl[0-9]v6_[0-9,a-z]+_rule$'` + +run_test() +{ + i=$1 + n=`basename ${i}` + + TRACEF=`echo ${i} | sed -e 's/_rule$/_trace/'` + if [[ ! -f ${TRACEF} ]]; then + echo "${TRACEF} not found" + echo "test ${n} FAILED" + exit 127 + fi + + OUTF=`mktemp ${n}_XXXXXX` + echo "start test ${n} with alg ${TACL_ALG}, burst-size ${TACL_STEP}" + ${TACL_PATH} -l 0 -n 4 --log-level="acl,debug" \ + --force-max-simd-bitwidth=0 --no-pci -- \ + ${XPRM} --tracenum=200000 --rulesf=${i} --tracef=${TRACEF} \ + --tracestep=${TACL_STEP} --alg=${TACL_ALG} \ + > ${OUTF} + grep 'result:' ${OUTF} | awk '{print $(NF);}' > ${OUTF}.out + sed -e '/^#/d' -e 's/[[:space:]]*$//g' ${TRACEF} | \ + awk '{print $(NF);}' > ${OUTF}.chk + diff -u ${OUTF}.chk ${OUTF}.out + st=$? + if [[ $st -ne 0 ]]; then + echo "test ${n} FAILED" + echo "output files:" + ls ${OUTF}* + cat ${OUTF}* + exit 127 + fi + rm -f ${OUTF}* + echo "test ${n} OK" +} + +for i in ${V4F}; do + run_test $i +done + +for i in ${V6F}; do + XPRM='--ipv6' + run_test $i + unset XPRM +done + +echo "All tests have ended successfully" -- 2.26.3 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [dpdk-dev] [PATCH] app/acl: add script for automate testing 2021-05-18 11:26 [dpdk-dev] [PATCH] app/acl: add script for automate testing Konstantin Ananyev @ 2021-07-24 13:21 ` Thomas Monjalon 2021-07-26 11:51 ` [dpdk-dev] [PATCH v2 0/2] app/acl: help to " Konstantin Ananyev 1 sibling, 0 replies; 6+ messages in thread From: Thomas Monjalon @ 2021-07-24 13:21 UTC (permalink / raw) To: Konstantin Ananyev; +Cc: dev 18/05/2021 13:26, Konstantin Ananyev: > The purpose of this script is to help automate ACL library functional > testing using test-acl app. > Sample input files are also provided. > > Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com> The input files make the script devtools/check-spdx-tag.sh failing. ^ permalink raw reply [flat|nested] 6+ messages in thread
* [dpdk-dev] [PATCH v2 0/2] app/acl: help to automate testing 2021-05-18 11:26 [dpdk-dev] [PATCH] app/acl: add script for automate testing Konstantin Ananyev 2021-07-24 13:21 ` Thomas Monjalon @ 2021-07-26 11:51 ` Konstantin Ananyev 2021-07-26 11:51 ` [dpdk-dev] [PATCH v2 1/2] app/acl: allow comment and empty lines Konstantin Ananyev ` (2 more replies) 1 sibling, 3 replies; 6+ messages in thread From: Konstantin Ananyev @ 2021-07-26 11:51 UTC (permalink / raw) To: dev; +Cc: Konstantin Ananyev The purpose of this series is to help automate ACL library functional testing using test-acl app. First patch adds into test-acl ability to skip comment/empty lines. Second patch adds script for automate testing. Sample input files are also provided. v2: - Added ability to skip comment/empty lines - Fixed check-spdx-tag.sh complains (Thomas) Konstantin Ananyev (2): app/acl: allow comment and empty lines app/acl: add script for automate testing app/test-acl/input/acl1v4_5_rule | 7 +++ app/test-acl/input/acl1v4_5_trace | 7 +++ app/test-acl/input/acl1v6_1_rule | 3 + app/test-acl/input/acl1v6_1_trace | 4 ++ app/test-acl/main.c | 51 ++++++++++++++--- app/test-acl/test-acl.sh | 94 +++++++++++++++++++++++++++++++ 6 files changed, 157 insertions(+), 9 deletions(-) create mode 100644 app/test-acl/input/acl1v4_5_rule create mode 100644 app/test-acl/input/acl1v4_5_trace create mode 100644 app/test-acl/input/acl1v6_1_rule create mode 100644 app/test-acl/input/acl1v6_1_trace create mode 100644 app/test-acl/test-acl.sh -- 2.26.3 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [dpdk-dev] [PATCH v2 1/2] app/acl: allow comment and empty lines 2021-07-26 11:51 ` [dpdk-dev] [PATCH v2 0/2] app/acl: help to " Konstantin Ananyev @ 2021-07-26 11:51 ` Konstantin Ananyev 2021-07-26 11:51 ` [dpdk-dev] [PATCH v2 2/2] app/acl: add script for automate testing Konstantin Ananyev 2021-07-30 16:31 ` [dpdk-dev] [PATCH v2 0/2] app/acl: help to " Thomas Monjalon 2 siblings, 0 replies; 6+ messages in thread From: Konstantin Ananyev @ 2021-07-26 11:51 UTC (permalink / raw) To: dev; +Cc: Konstantin Ananyev Allow comment (lines starting with '#') and empty lines in input (rules, traces) files. These lines will be just skipped and shouldn't affect the result anyhow. Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com> --- app/test-acl/main.c | 51 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/app/test-acl/main.c b/app/test-acl/main.c index 2cb2fe2579..c2de18770d 100644 --- a/app/test-acl/main.c +++ b/app/test-acl/main.c @@ -48,6 +48,8 @@ #define RULE_NUM 0x10000 +#define COMMENT_LEAD_CHAR '#' + enum { DUMP_NONE, DUMP_SEARCH, @@ -472,13 +474,28 @@ parse_cb_ipv6_trace(char *str, struct ipv6_5tuple *v) return 0; } +/* Bypass comment and empty lines */ +static int +skip_line(const char *buf) +{ + uint32_t i; + + for (i = 0; isspace(buf[i]) != 0; i++) + ; + + if (buf[i] == 0 || buf[i] == COMMENT_LEAD_CHAR) + return 1; + + return 0; +} + static void tracef_init(void) { static const char name[] = APP_NAME; FILE *f; size_t sz; - uint32_t n; + uint32_t i, k, n; struct ipv4_5tuple *v; struct ipv6_5tuple *w; @@ -497,27 +514,36 @@ tracef_init(void) v = config.traces; w = config.traces; - for (n = 0; n != config.nb_traces; n++) { + k = 0; + n = 0; + for (i = 0; n != config.nb_traces; i++) { if (fgets(line, sizeof(line), f) == NULL) break; + if (skip_line(line) != 0) { + k++; + continue; + } + + n = i - k; + if (config.ipv6) { if (parse_cb_ipv6_trace(line, w + n) != 0) rte_exit(EXIT_FAILURE, "%s: failed to parse ipv6 trace " "record at line %u\n", - config.trace_file, n + 1); + config.trace_file, i + 1); } else { if (parse_cb_ipv4_trace(line, v + n) != 0) rte_exit(EXIT_FAILURE, "%s: failed to parse ipv4 trace " "record at line %u\n", - config.trace_file, n + 1); + config.trace_file, i + 1); } } - config.used_traces = n; + config.used_traces = i - k; fclose(f); } @@ -727,20 +753,27 @@ static int add_cb_rules(FILE *f, struct rte_acl_ctx *ctx) { int rc; - uint32_t n; + uint32_t i, k, n; struct acl_rule v; parse_5tuple parser; memset(&v, 0, sizeof(v)); parser = (config.ipv6 != 0) ? parse_cb_ipv6_rule : parse_cb_ipv4_rule; - for (n = 1; fgets(line, sizeof(line), f) != NULL; n++) { + k = 0; + for (i = 1; fgets(line, sizeof(line), f) != NULL; i++) { + + if (skip_line(line) != 0) { + k++; + continue; + } + n = i - k; rc = parser(line, &v); if (rc != 0) { RTE_LOG(ERR, TESTACL, "line %u: parse_cb_ipv4vlan_rule" " failed, error code: %d (%s)\n", - n, rc, strerror(-rc)); + i, rc, strerror(-rc)); return rc; } @@ -753,7 +786,7 @@ add_cb_rules(FILE *f, struct rte_acl_ctx *ctx) if (rc != 0) { RTE_LOG(ERR, TESTACL, "line %u: failed to add rules " "into ACL context, error code: %d (%s)\n", - n, rc, strerror(-rc)); + i, rc, strerror(-rc)); return rc; } } -- 2.26.3 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [dpdk-dev] [PATCH v2 2/2] app/acl: add script for automate testing 2021-07-26 11:51 ` [dpdk-dev] [PATCH v2 0/2] app/acl: help to " Konstantin Ananyev 2021-07-26 11:51 ` [dpdk-dev] [PATCH v2 1/2] app/acl: allow comment and empty lines Konstantin Ananyev @ 2021-07-26 11:51 ` Konstantin Ananyev 2021-07-30 16:31 ` [dpdk-dev] [PATCH v2 0/2] app/acl: help to " Thomas Monjalon 2 siblings, 0 replies; 6+ messages in thread From: Konstantin Ananyev @ 2021-07-26 11:51 UTC (permalink / raw) To: dev; +Cc: Konstantin Ananyev The purpose of this script is to help automate ACL library functional testing using test-acl app. Sample input files are also provided. Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com> --- app/test-acl/input/acl1v4_5_rule | 7 +++ app/test-acl/input/acl1v4_5_trace | 7 +++ app/test-acl/input/acl1v6_1_rule | 3 + app/test-acl/input/acl1v6_1_trace | 4 ++ app/test-acl/test-acl.sh | 94 +++++++++++++++++++++++++++++++ 5 files changed, 115 insertions(+) create mode 100644 app/test-acl/input/acl1v4_5_rule create mode 100644 app/test-acl/input/acl1v4_5_trace create mode 100644 app/test-acl/input/acl1v6_1_rule create mode 100644 app/test-acl/input/acl1v6_1_trace create mode 100644 app/test-acl/test-acl.sh diff --git a/app/test-acl/input/acl1v4_5_rule b/app/test-acl/input/acl1v4_5_rule new file mode 100644 index 0000000000..ae5b7826c0 --- /dev/null +++ b/app/test-acl/input/acl1v4_5_rule @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: BSD-3-Clause + +@16.32.1.1/32 2.1.0.0/16 0 : 65535 0 : 65535 0/0 +@16.32.1.0/24 2.1.1.0/24 0 : 65535 0 : 65535 0/0 +@2.1.0.0/16 16.32.1.1/32 0 : 65535 0 : 65535 0/0 +@2.1.0.0/16 16.32.1.0/24 1000 : 2000 0 : 65535 0/0 +@2.1.1.0/24 16.32.1.0/24 0 : 65535 0 : 65535 0/0 diff --git a/app/test-acl/input/acl1v4_5_trace b/app/test-acl/input/acl1v4_5_trace new file mode 100644 index 0000000000..80a988c280 --- /dev/null +++ b/app/test-acl/input/acl1v4_5_trace @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: BSD-3-Clause + +0x10200101 0x02010304 100 100 6 0 +0x10200103 0x02010104 100 100 6 1 +0x02010304 0x10200101 100 100 6 2 +0x02010104 0x10200103 100 100 6 4 +0x02010104 0x10200101 100 100 6 2 diff --git a/app/test-acl/input/acl1v6_1_rule b/app/test-acl/input/acl1v6_1_rule new file mode 100644 index 0000000000..3e03124186 --- /dev/null +++ b/app/test-acl/input/acl1v6_1_rule @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: BSD-3-Clause + +@9baa:cead:8000:0000:e300:00ff:fe04:c5a8/33 d1b5:2feb:0000:0000:6600:00ff:fed9:aeaa/33 0 : 65535 1526 : 1526 0x00/0x00 diff --git a/app/test-acl/input/acl1v6_1_trace b/app/test-acl/input/acl1v6_1_trace new file mode 100644 index 0000000000..8551386b41 --- /dev/null +++ b/app/test-acl/input/acl1v6_1_trace @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: BSD-3-Clause + +9baa:cead:8000:0000:0000:0000:0000:0000 d1b5:2feb:0000:0000:0000:0000:0000:0000 37826 1526 6 0 +2eba:cc41:0000:0000:0000:0000:0000:0000 16ef:6cdb:0000:0000:0000:0000:0000:0000 25946 1525 0 4294967295 diff --git a/app/test-acl/test-acl.sh b/app/test-acl/test-acl.sh new file mode 100644 index 0000000000..c7bdc24113 --- /dev/null +++ b/app/test-acl/test-acl.sh @@ -0,0 +1,94 @@ +#! /bin/bash +# SPDX-License-Identifier: BSD-3-Clause + +# Usage: +# /bin/bash <test-acl-binary> <dir-with-acl-rules-traces> <acl-alg> <burst-size> +# Expected file-naming conventions: +# - for rules: 'acl[0-9]v[4,6]_[0-9,a-z]+_rule' +# - for traces: 'acl[0-9]v[4,6]_[0-9,a-z]+_trace' +# Each rule file expects to have exactly one trace file. +# test-acl app follows classbench file format. +# Each line defines exactly one rule/trace. +# rules record format: +# '@'<src_ip_addr>'/'<masklen><space> \ +# <dst_ipv4_addr>'/'<masklen><space> \ +# <src_port_low><space>":"<src_port_high><space> \ +# <dst_port_low><space>":"<dst_port_high><space> \ +# <proto>'/'<mask> +# trace record format: +# <src_ip_addr><space><dst_ip_addr><space> \ +# <src_port><space<dst_port><space><proto>...<rule_id> +# +# As an example: +# /bin/bash app/test-acl/test-acl.sh build/app/dpdk-test-acl \ +# app/test-acl/input scalar 32 +# +# Refer to test-acl app for more information about rules/trace files format, +# available test-acl command-line options, etc. + +TACL_PATH=$1 +TACL_DIR=$2 +TACL_ALG=$3 +TACL_STEP=$4 + +if [[ ! -x ${TACL_PATH} ]]; then + echo "invalid TACL_PATH=${TACL_PATH}" + exit 127 +fi + +if [[ ! -d ${TACL_DIR} ]]; then + echo "invalid TACL_DIR=${TACL_DIR}" + exit 127 +fi + +V4F=`find ${TACL_DIR} -type f | egrep -e 'acl[0-9]v4_[0-9,a-z]+_rule$'` +V6F=`find ${TACL_DIR} -type f | egrep -e 'acl[0-9]v6_[0-9,a-z]+_rule$'` + +run_test() +{ + i=$1 + n=`basename ${i}` + + TRACEF=`echo ${i} | sed -e 's/_rule$/_trace/'` + if [[ ! -f ${TRACEF} ]]; then + echo "${TRACEF} not found" + echo "test ${n} FAILED" + exit 127 + fi + + OUTF=`mktemp ${n}_XXXXXX` + echo "start test ${n} with alg ${TACL_ALG}, burst-size ${TACL_STEP}" + ${TACL_PATH} -l 0 -n 4 --log-level="acl,debug" \ + --force-max-simd-bitwidth=0 --no-pci -- \ + ${XPRM} --tracenum=200000 --rulesf=${i} --tracef=${TRACEF} \ + --tracestep=${TACL_STEP} --alg=${TACL_ALG} \ + > ${OUTF} + grep 'result:' ${OUTF} | awk '{print $(NF);}' > ${OUTF}.out + sed -e '/^[[:space:]]*#/d' \ + -e '/^[[:space:]]*$/d' \ + -e 's/[[:space:]]*$//g' ${TRACEF} | \ + awk '{print $(NF);}' > ${OUTF}.chk + diff -u ${OUTF}.chk ${OUTF}.out + st=$? + if [[ $st -ne 0 ]]; then + echo "test ${n} FAILED" + echo "output files:" + ls ${OUTF}* + cat ${OUTF}* + exit 127 + fi + rm -f ${OUTF}* + echo "test ${n} OK" +} + +for i in ${V4F}; do + run_test $i +done + +for i in ${V6F}; do + XPRM='--ipv6' + run_test $i + unset XPRM +done + +echo "All tests have ended successfully" -- 2.26.3 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [dpdk-dev] [PATCH v2 0/2] app/acl: help to automate testing 2021-07-26 11:51 ` [dpdk-dev] [PATCH v2 0/2] app/acl: help to " Konstantin Ananyev 2021-07-26 11:51 ` [dpdk-dev] [PATCH v2 1/2] app/acl: allow comment and empty lines Konstantin Ananyev 2021-07-26 11:51 ` [dpdk-dev] [PATCH v2 2/2] app/acl: add script for automate testing Konstantin Ananyev @ 2021-07-30 16:31 ` Thomas Monjalon 2 siblings, 0 replies; 6+ messages in thread From: Thomas Monjalon @ 2021-07-30 16:31 UTC (permalink / raw) To: Konstantin Ananyev; +Cc: dev 26/07/2021 13:51, Konstantin Ananyev: > The purpose of this series is to help automate ACL library functional > testing using test-acl app. > First patch adds into test-acl ability to skip comment/empty lines. > Second patch adds script for automate testing. > Sample input files are also provided. > > v2: > - Added ability to skip comment/empty lines > - Fixed check-spdx-tag.sh complains (Thomas) > > Konstantin Ananyev (2): > app/acl: allow comment and empty lines > app/acl: add script for automate testing Applied, thanks. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-07-30 16:31 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-05-18 11:26 [dpdk-dev] [PATCH] app/acl: add script for automate testing Konstantin Ananyev 2021-07-24 13:21 ` Thomas Monjalon 2021-07-26 11:51 ` [dpdk-dev] [PATCH v2 0/2] app/acl: help to " Konstantin Ananyev 2021-07-26 11:51 ` [dpdk-dev] [PATCH v2 1/2] app/acl: allow comment and empty lines Konstantin Ananyev 2021-07-26 11:51 ` [dpdk-dev] [PATCH v2 2/2] app/acl: add script for automate testing Konstantin Ananyev 2021-07-30 16:31 ` [dpdk-dev] [PATCH v2 0/2] app/acl: help to " Thomas Monjalon
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).