From: Robert Marko Date: Fri, 13 Dec 2024 12:51:00 +0000 (+0100) Subject: ip: link: rmnet: add support for flag handling X-Git-Tag: v6.14.0~8^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1f0f9deb55fd679776464304c60147d99f38c58e;p=thirdparty%2Fiproute2.git ip: link: rmnet: add support for flag handling Extend the current rmnet support to allow enabling or disabling IFLA_RMNET_FLAGS via ip link as well as printing the current settings. Signed-off-by: Robert Marko Signed-off-by: David Ahern --- diff --git a/ip/iplink_rmnet.c b/ip/iplink_rmnet.c index 1d16440c..d7596b2b 100644 --- a/ip/iplink_rmnet.c +++ b/ip/iplink_rmnet.c @@ -16,6 +16,12 @@ static void print_explain(FILE *f) { fprintf(f, "Usage: ... rmnet mux_id MUXID\n" + " [ ingress-deaggregation { on | off } ]\n" + " [ ingress-commands { on | off } ]\n" + " [ ingress-mapv4-checksum { on | off } ]\n" + " [ egress-mapv4-checksum { on | off } ]\n" + " [ ingress-mapv5-checksum { on | off } ]\n" + " [ egress-mapv5-checksum { on | off } ]\n" "\n" "MUXID := 1-254\n" ); @@ -29,15 +35,95 @@ static void explain(void) static int rmnet_parse_opt(struct link_util *lu, int argc, char **argv, struct nlmsghdr *n) { + struct ifla_rmnet_flags flags = { 0 }; __u16 mux_id; + int ret; while (argc > 0) { - if (matches(*argv, "mux_id") == 0) { + if (strcmp(*argv, "mux_id") == 0) { NEXT_ARG(); if (get_u16(&mux_id, *argv, 0)) invarg("mux_id is invalid", *argv); addattr16(n, 1024, IFLA_RMNET_MUX_ID, mux_id); - } else if (matches(*argv, "help") == 0) { + } else if (strcmp(*argv, "ingress-deaggregation") == 0) { + bool deaggregation; + + NEXT_ARG(); + deaggregation = parse_on_off("ingress-deaggregation", *argv, &ret); + if (ret) + return ret; + + flags.mask |= RMNET_FLAGS_INGRESS_DEAGGREGATION; + if (deaggregation) + flags.flags |= RMNET_FLAGS_INGRESS_DEAGGREGATION; + else + flags.flags &= ~RMNET_FLAGS_INGRESS_DEAGGREGATION; + } else if (strcmp(*argv, "ingress-commands") == 0) { + bool commands; + + NEXT_ARG(); + commands = parse_on_off("ingress-commands", *argv, &ret); + if (ret) + return ret; + + flags.mask |= RMNET_FLAGS_INGRESS_MAP_COMMANDS; + if (commands) + flags.flags |= RMNET_FLAGS_INGRESS_MAP_COMMANDS; + else + flags.flags &= ~RMNET_FLAGS_INGRESS_MAP_COMMANDS; + } else if (strcmp(*argv, "ingress-mapv4-checksum") == 0) { + bool mapv4_checksum; + + NEXT_ARG(); + mapv4_checksum = parse_on_off("ingress-mapv4-checksum", *argv, &ret); + if (ret) + return ret; + + flags.mask |= RMNET_FLAGS_INGRESS_MAP_CKSUMV4; + if (mapv4_checksum) + flags.flags |= RMNET_FLAGS_INGRESS_MAP_CKSUMV4; + else + flags.flags &= ~RMNET_FLAGS_INGRESS_MAP_CKSUMV4; + } else if (strcmp(*argv, "egress-mapv4-checksum") == 0) { + bool mapv4_checksum; + + NEXT_ARG(); + mapv4_checksum = parse_on_off("egress-mapv4-checksum", *argv, &ret); + if (ret) + return ret; + + flags.mask |= RMNET_FLAGS_EGRESS_MAP_CKSUMV4; + if (mapv4_checksum) + flags.flags |= RMNET_FLAGS_EGRESS_MAP_CKSUMV4; + else + flags.flags &= ~RMNET_FLAGS_EGRESS_MAP_CKSUMV4; + } else if (strcmp(*argv, "ingress-mapv5-checksum") == 0) { + bool mapv5_checksum; + + NEXT_ARG(); + mapv5_checksum = parse_on_off("ingress-mapv5-checksum", *argv, &ret); + if (ret) + return ret; + + flags.mask |= RMNET_FLAGS_INGRESS_MAP_CKSUMV5; + if (mapv5_checksum) + flags.flags |= RMNET_FLAGS_INGRESS_MAP_CKSUMV5; + else + flags.flags &= ~RMNET_FLAGS_INGRESS_MAP_CKSUMV5; + } else if (strcmp(*argv, "egress-mapv5-checksum") == 0) { + bool mapv5_checksum; + + NEXT_ARG(); + mapv5_checksum = parse_on_off("egress-mapv5-checksum", *argv, &ret); + if (ret) + return ret; + + flags.mask |= RMNET_FLAGS_EGRESS_MAP_CKSUMV5; + if (mapv5_checksum) + flags.flags |= RMNET_FLAGS_EGRESS_MAP_CKSUMV5; + else + flags.flags &= ~RMNET_FLAGS_EGRESS_MAP_CKSUMV5; + } else if (strcmp(*argv, "help") == 0) { explain(); return -1; } else { @@ -48,11 +134,34 @@ static int rmnet_parse_opt(struct link_util *lu, int argc, char **argv, argc--, argv++; } + if (flags.mask) + addattr_l(n, 1024, IFLA_RMNET_FLAGS, &flags, sizeof(flags)); + return 0; } +static void rmnet_print_flags(FILE *fp, __u32 flags) +{ + open_json_array(PRINT_ANY, is_json_context() ? "flags" : "<"); +#define _PF(f) if (flags & RMNET_FLAGS_##f) { \ + flags &= ~RMNET_FLAGS_##f; \ + print_string(PRINT_ANY, NULL, flags ? "%s," : "%s", #f); \ + } + _PF(INGRESS_DEAGGREGATION); + _PF(INGRESS_MAP_COMMANDS); + _PF(INGRESS_MAP_CKSUMV4); + _PF(EGRESS_MAP_CKSUMV4); + _PF(INGRESS_MAP_CKSUMV5); + _PF(EGRESS_MAP_CKSUMV5); +#undef _PF + if (flags) + print_hex(PRINT_ANY, NULL, "%x", flags); + close_json_array(PRINT_ANY, "> "); +} static void rmnet_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) { + struct ifla_rmnet_flags *flags; + if (!tb) return; @@ -64,6 +173,13 @@ static void rmnet_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) "mux_id", "mux_id %u ", rta_getattr_u16(tb[IFLA_RMNET_MUX_ID])); + + if (tb[IFLA_RMNET_FLAGS]) { + if (RTA_PAYLOAD(tb[IFLA_RMNET_FLAGS]) < sizeof(*flags)) + return; + flags = RTA_DATA(tb[IFLA_RMNET_FLAGS]); + rmnet_print_flags(f, flags->flags); + } } static void rmnet_print_help(struct link_util *lu, int argc, char **argv,