On 4/14/25 10:18, [email protected] wrote:
From: Chia-Yu Chang <[email protected]>

DUALPI2 AQM is a combination of the DUALQ Coupled-AQM with a PI2
base-AQM. The PI2 AQM is in turn both an extension and a simplification
of the PIE AQM. PI2 makes quite some PIE heuristics unnecessary, while
being able to control scalable congestion controls like TCP-Prague.
With PI2, both Reno/Cubic can be used in parallel with Prague,
maintaining window fairness. DUALQ provides latency separation between
low latency Prague flows and Reno/Cubic flows that need a bigger queue.

This patch adds support to tc to configure it through its netlink
interface.

Signed-off-by: Chia-Yu Chang <[email protected]>
Co-developed-by: Olga Albisser <[email protected]>
Signed-off-by: Olga Albisser <[email protected]>
Co-developed-by: Koen De Schepper <[email protected]>
Signed-off-by: Koen De Schepper <[email protected]>
Co-developed-by: Oliver Tilmans <[email protected]>
Signed-off-by: Oliver Tilmans <[email protected]>
Signed-off-by: Bob Briscoe <[email protected]>
Co-developed-by: Henrik Steen <[email protected]>
Signed-off-by: Henrik Steen <[email protected]>
---
  bash-completion/tc             |  11 +-
  include/uapi/linux/pkt_sched.h |  39 +++
  include/utils.h                |   2 +
  ip/iplink_can.c                |  14 -
  lib/utils.c                    |  30 ++
  man/man8/tc-dualpi2.8          | 249 ++++++++++++++++
  tc/Makefile                    |   1 +
  tc/q_dualpi2.c                 | 519 +++++++++++++++++++++++++++++++++
  8 files changed, 850 insertions(+), 15 deletions(-)
  create mode 100644 man/man8/tc-dualpi2.8
  create mode 100644 tc/q_dualpi2.c

Hi!

I compiled your patch and am seeing the following warnings:

q_dualpi2.c: In function 'dualpi2_parse_opt':
q_dualpi2.c:218:37: warning: pointer targets in passing argument 1 of 'get_u32' differ in signedness [-Wpointer-sign]
  218 |                         if (get_u32(&min_qlen_step, *argv, 10)) {
      |                                     ^~~~~~~~~~~~~~
      |                                     |
      |                                     int32_t * {aka int *}
In file included from q_dualpi2.c:39:
../include/utils.h:157:20: note: expected '__u32 *' {aka 'unsigned int *'} but argument is of type 'int32_t *' {aka 'int *'}
  157 | int get_u32(__u32 *val, const char *arg, int base);
      |             ~~~~~~~^~~
q_dualpi2.c: At top level:
q_dualpi2.c:516:27: warning: initialization of 'int (*)(const struct qdisc_util *, int, char **, struct nlmsghdr *, const char *)' from incompatible pointer type 'int (*)(struct qdisc_util *, int, char **, struct nlmsghdr *, const char *)' [-Wincompatible-pointer-types]
  516 |         .parse_qopt     = dualpi2_parse_opt,
      |                           ^~~~~~~~~~~~~~~~~
q_dualpi2.c:516:27: note: (near initialization for 'dualpi2_qdisc_util.parse_qopt') q_dualpi2.c:517:27: warning: initialization of 'int (*)(const struct qdisc_util *, FILE *, struct rtattr *)' from incompatible pointer type 'int (*)(struct qdisc_util *, FILE *, struct rtattr *)' [-Wincompatible-pointer-types]
  517 |         .print_qopt     = dualpi2_print_opt,
      |                           ^~~~~~~~~~~~~~~~~
q_dualpi2.c:517:27: note: (near initialization for 'dualpi2_qdisc_util.print_qopt') q_dualpi2.c:518:27: warning: initialization of 'int (*)(const struct qdisc_util *, FILE *, struct rtattr *)' from incompatible pointer type 'int (*)(struct qdisc_util *, FILE *, struct rtattr *)' [-Wincompatible-pointer-types]
  518 |         .print_xstats   = dualpi2_print_xstats,
      |                           ^~~~~~~~~~~~~~~~~~~~
q_dualpi2.c:518:27: note: (near initialization for 'dualpi2_qdisc_util.print_xstats')

cheers,
Victor

Reply via email to