Merge branch 'unify_tunnel_help' into next

Serhey Popovych  says:

====================

To show only relevant diffs of ip and ipv6 variants help message print
routines needs to be unified and improved.

Get rid of print_usage() and usage() wrappers: use single function to
output help message. As side effect we return -1 from parse function
instead of calling exit(2) in case of "... tunnel <help|garbage>" is
found.

Additionally we get pointer to @struct link_util and can directly access
->id information to prepare customized help message.

Split calls to fprintf() two group: one that contains format string with
specifiers (thus requiring parameters) and another one that does not.
This helps compiler to optimize calls to fprintf() with fputs() when no
format specifiers in string. Do not use fputs() directly to keep code
formatting nice.

After this series applied following diffs:

  # diff -urN ip/link_gre{,6}.c
  # diff -urN ip/link_vti{,6}.c
  # diff -urN ip/link_ip{,6}tnl.c

in scope of help print routines reduced to necessary minimum.

Tested minimally by compiling and executing "ip link help <kind>" and
"ip link add type help" commands. Looks correct.

See individual patch description for more information.

Reviews, commands and suggestions are welcome.

====================

Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
David Ahern 2018-02-09 08:04:39 -08:00
commit 8e7548462e
6 changed files with 169 additions and 193 deletions

View File

@ -23,34 +23,38 @@
#include "ip_common.h"
#include "tunnel.h"
static void print_usage(FILE *f)
static void gre_print_help(struct link_util *lu, int argc, char **argv, FILE *f)
{
fprintf(f,
"Usage: ... { gre | gretap | erspan } [ remote ADDR ]\n"
" [ local ADDR ]\n"
" [ [i|o]seq ]\n"
" [ [i|o]key KEY ]\n"
" [ [i|o]csum ]\n"
" [ ttl TTL ]\n"
" [ tos TOS ]\n"
" [ [no]pmtudisc ]\n"
" [ [no]ignore-df ]\n"
" [ dev PHYS_DEV ]\n"
" [ noencap ]\n"
" [ encap { fou | gue | none } ]\n"
" [ encap-sport PORT ]\n"
" [ encap-dport PORT ]\n"
" [ [no]encap-csum ]\n"
" [ [no]encap-csum6 ]\n"
" [ [no]encap-remcsum ]\n"
" [ external ]\n"
" [ fwmark MARK ]\n"
" [ erspan_ver version ]\n"
" [ erspan IDX ]\n"
" [ erspan_dir { ingress | egress } ]\n"
" [ erspan_hwid hwid ]\n"
" [ external ]\n"
"Usage: ... %-9s [ remote ADDR ]\n",
lu->id
);
fprintf(f,
" [ local ADDR ]\n"
" [ [i|o]seq ]\n"
" [ [i|o]key KEY ]\n"
" [ [i|o]csum ]\n"
" [ ttl TTL ]\n"
" [ tos TOS ]\n"
" [ [no]pmtudisc ]\n"
" [ [no]ignore-df ]\n"
" [ dev PHYS_DEV ]\n"
" [ fwmark MARK ]\n"
" [ external ]\n"
" [ noencap ]\n"
" [ encap { fou | gue | none } ]\n"
" [ encap-sport PORT ]\n"
" [ encap-dport PORT ]\n"
" [ [no]encap-csum ]\n"
" [ [no]encap-csum6 ]\n"
" [ [no]encap-remcsum ]\n"
" [ erspan_ver version ]\n"
" [ erspan IDX ]\n"
" [ erspan_dir { ingress | egress } ]\n"
" [ erspan_hwid hwid ]\n"
"\n"
);
fprintf(f,
"Where: ADDR := { IP_ADDRESS | any }\n"
" TOS := { NUMBER | inherit }\n"
" TTL := { 1..255 | inherit }\n"
@ -59,13 +63,6 @@ static void print_usage(FILE *f)
);
}
static void usage(void) __attribute__((noreturn));
static void usage(void)
{
print_usage(stderr);
exit(-1);
}
static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
struct nlmsghdr *n)
{
@ -336,8 +333,10 @@ get_failed:
NEXT_ARG();
if (get_u16(&erspan_hwid, *argv, 0))
invarg("invalid erspan hwid\n", *argv);
} else
usage();
} else {
gre_print_help(lu, argc, argv, stderr);
return -1;
}
argc--; argv++;
}
@ -517,12 +516,6 @@ static void gre_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
IFLA_GRE_ENCAP_DPORT);
}
static void gre_print_help(struct link_util *lu, int argc, char **argv,
FILE *f)
{
print_usage(f);
}
struct link_util gre_link_util = {
.id = "gre",
.maxattr = IFLA_GRE_MAX,

View File

@ -30,34 +30,39 @@
#define DEFAULT_TNL_HOP_LIMIT (64)
static void print_usage(FILE *f)
static void gre_print_help(struct link_util *lu, int argc, char **argv, FILE *f)
{
fprintf(f,
"Usage: ... { ip6gre | ip6gretap | ip6erspan} [ remote ADDR ]\n"
" [ local ADDR ]\n"
" [ [i|o]seq ]\n"
" [ [i|o]key KEY ]\n"
" [ [i|o]csum ]\n"
" [ hoplimit TTL ]\n"
" [ encaplimit ELIM ]\n"
" [ tclass TCLASS ]\n"
" [ flowlabel FLOWLABEL ]\n"
" [ dscp inherit ]\n"
" [ fwmark MARK ]\n"
" [ dev PHYS_DEV ]\n"
" [ noencap ]\n"
" [ encap { fou | gue | none } ]\n"
" [ encap-sport PORT ]\n"
" [ encap-dport PORT ]\n"
" [ [no]encap-csum ]\n"
" [ [no]encap-csum6 ]\n"
" [ [no]encap-remcsum ]\n"
" [ erspan_ver version ]\n"
" [ erspan IDX ]\n"
" [ erspan_dir { ingress | egress } ]\n"
" [ erspan_hwid hwid ]\n"
" [ external ]\n"
"Usage: ... %-9s [ remote ADDR ]\n",
lu->id
);
fprintf(f,
" [ local ADDR ]\n"
" [ [i|o]seq ]\n"
" [ [i|o]key KEY ]\n"
" [ [i|o]csum ]\n"
" [ hoplimit TTL ]\n"
" [ encaplimit ELIM ]\n"
" [ tclass TCLASS ]\n"
" [ flowlabel FLOWLABEL ]\n"
" [ dscp inherit ]\n"
" [ dev PHYS_DEV ]\n"
" [ fwmark MARK ]\n"
" [ external ]\n"
" [ noencap ]\n"
" [ encap { fou | gue | none } ]\n"
" [ encap-sport PORT ]\n"
" [ encap-dport PORT ]\n"
" [ [no]encap-csum ]\n"
" [ [no]encap-csum6 ]\n"
" [ [no]encap-remcsum ]\n"
" [ erspan_ver version ]\n"
" [ erspan IDX ]\n"
" [ erspan_dir { ingress | egress } ]\n"
" [ erspan_hwid hwid ]\n"
"\n"
);
fprintf(f,
"Where: ADDR := IPV6_ADDRESS\n"
" TTL := { 0..255 } (default=%d)\n"
" KEY := { DOTTED_QUAD | NUMBER }\n"
@ -69,13 +74,6 @@ static void print_usage(FILE *f)
);
}
static void usage(void) __attribute__((noreturn));
static void usage(void)
{
print_usage(stderr);
exit(-1);
}
static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
struct nlmsghdr *n)
{
@ -384,8 +382,10 @@ get_failed:
NEXT_ARG();
if (get_u16(&erspan_hwid, *argv, 0))
invarg("invalid erspan hwid\n", *argv);
} else
usage();
} else {
gre_print_help(lu, argc, argv, stderr);
return -1;
}
argc--; argv++;
}
@ -584,12 +584,6 @@ static void gre_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
IFLA_GRE_ENCAP_DPORT);
}
static void gre_print_help(struct link_util *lu, int argc, char **argv,
FILE *f)
{
print_usage(f);
}
struct link_util ip6gre_link_util = {
.id = "ip6gre",
.maxattr = IFLA_GRE_MAX,

View File

@ -29,20 +29,26 @@
#define DEFAULT_TNL_HOP_LIMIT (64)
static void print_usage(FILE *f)
static void ip6tunnel_print_help(struct link_util *lu, int argc, char **argv,
FILE *f)
{
const char *mode;
fprintf(f,
"Usage: ... %-6s [ remote ADDR ]\n",
lu->id
);
fprintf(f,
"Usage: ... ip6tnl [ mode { ip6ip6 | ipip6 | any } ]\n"
" [ remote ADDR ]\n"
" [ local ADDR ]\n"
" [ dev PHYS_DEV ]\n"
" [ encaplimit ELIM ]\n"
" [ hoplimit HLIM ]\n"
" [ tclass TCLASS ]\n"
" [ flowlabel FLOWLABEL ]\n"
" [ dscp inherit ]\n"
" [ fwmark MARK ]\n"
" [ [no]allow-localremote ]\n"
" [ dev PHYS_DEV ]\n"
" [ fwmark MARK ]\n"
" [ external ]\n"
" [ noencap ]\n"
" [ encap { fou | gue | none } ]\n"
" [ encap-sport PORT ]\n"
@ -50,8 +56,14 @@ static void print_usage(FILE *f)
" [ [no]encap-csum ]\n"
" [ [no]encap-csum6 ]\n"
" [ [no]encap-remcsum ]\n"
" [ external ]\n"
"\n"
);
mode = "{ ip6ip6 | ipip6 | any }";
fprintf(f,
" [ mode %s ]\n"
"\n",
mode
);
fprintf(f,
"Where: ADDR := IPV6_ADDRESS\n"
" ELIM := { none | 0..255 }(default=%d)\n"
" HLIM := 0..255 (default=%d)\n"
@ -62,13 +74,6 @@ static void print_usage(FILE *f)
);
}
static void usage(void) __attribute__((noreturn));
static void usage(void)
{
print_usage(stderr);
exit(-1);
}
static int ip6tunnel_parse_opt(struct link_util *lu, int argc, char **argv,
struct nlmsghdr *n)
{
@ -304,8 +309,10 @@ get_failed:
encapflags &= ~TUNNEL_ENCAP_FLAG_REMCSUM;
} else if (strcmp(*argv, "external") == 0) {
metadata = 1;
} else
usage();
} else {
ip6tunnel_print_help(lu, argc, argv, stderr);
return -1;
}
argc--, argv++;
}
@ -456,12 +463,6 @@ static void ip6tunnel_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb
IFLA_IPTUN_ENCAP_DPORT);
}
static void ip6tunnel_print_help(struct link_util *lu, int argc, char **argv,
FILE *f)
{
print_usage(f);
}
struct link_util ip6tnl_link_util = {
.id = "ip6tnl",
.maxattr = IFLA_IPTUN_MAX,

View File

@ -24,49 +24,51 @@
#include "ip_common.h"
#include "tunnel.h"
static void print_usage(FILE *f, int sit)
static void iptunnel_print_help(struct link_util *lu, int argc, char **argv,
FILE *f)
{
const char *type = sit ? "sit " : "ipip";
const char *mode;
fprintf(f,
"Usage: ... %s [ remote ADDR ]\n"
" [ local ADDR ]\n"
" [ ttl TTL ]\n"
" [ tos TOS ]\n"
" [ [no]pmtudisc ]\n"
" [ dev PHYS_DEV ]\n"
" [ 6rd-prefix ADDR ]\n"
" [ 6rd-relay_prefix ADDR ]\n"
" [ 6rd-reset ]\n"
" [ noencap ]\n"
" [ encap { fou | gue | none } ]\n"
" [ encap-sport PORT ]\n"
" [ encap-dport PORT ]\n"
" [ [no]encap-csum ]\n"
" [ [no]encap-csum6 ]\n"
" [ [no]encap-remcsum ]\n",
type
"Usage: ... %-6s [ remote ADDR ]\n",
lu->id
);
if (sit) {
fprintf(f, " [ mode { ip6ip | ipip | mplsip | any } ]\n");
fprintf(f, " [ isatap ]\n");
fprintf(f,
" [ local ADDR ]\n"
" [ ttl TTL ]\n"
" [ tos TOS ]\n"
" [ [no]pmtudisc ]\n"
" [ 6rd-prefix ADDR ]\n"
" [ 6rd-relay_prefix ADDR ]\n"
" [ 6rd-reset ]\n"
" [ dev PHYS_DEV ]\n"
" [ fwmark MARK ]\n"
" [ external ]\n"
" [ noencap ]\n"
" [ encap { fou | gue | none } ]\n"
" [ encap-sport PORT ]\n"
" [ encap-dport PORT ]\n"
" [ [no]encap-csum ]\n"
" [ [no]encap-csum6 ]\n"
" [ [no]encap-remcsum ]\n"
);
if (strcmp(lu->id, "sit") == 0) {
mode = "{ ip6ip | ipip | mplsip | any } ]\n"
" [ isatap";
} else {
fprintf(f, " [ mode { ipip | mplsip | any } ]\n");
mode = "{ ipip | mplsip | any }";
}
fprintf(f, " [ external ]\n");
fprintf(f, " [ fwmark MARK ]\n");
fprintf(f, "\n");
fprintf(f, "Where: ADDR := { IP_ADDRESS | any }\n");
fprintf(f, " TOS := { NUMBER | inherit }\n");
fprintf(f, " TTL := { 1..255 | inherit }\n");
fprintf(f, " MARK := { 0x0..0xffffffff }\n");
}
static void usage(int sit) __attribute__((noreturn));
static void usage(int sit)
{
print_usage(stderr, sit);
exit(-1);
fprintf(f,
" [ mode %s ]\n"
"\n",
mode
);
fprintf(f,
"Where: ADDR := { IP_ADDRESS | any }\n"
" TOS := { NUMBER | inherit }\n"
" TTL := { 1..255 | inherit }\n"
" MARK := { 0x0..0xffffffff }\n"
);
}
static int iptunnel_parse_opt(struct link_util *lu, int argc, char **argv,
@ -313,8 +315,10 @@ get_failed:
NEXT_ARG();
if (get_u32(&fwmark, *argv, 0))
invarg("invalid fwmark\n", *argv);
} else
usage(strcmp(lu->id, "sit") == 0);
} else {
iptunnel_print_help(lu, argc, argv, stderr);
return -1;
}
argc--, argv++;
}
@ -483,12 +487,6 @@ static void iptunnel_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[
IFLA_IPTUN_ENCAP_DPORT);
}
static void iptunnel_print_help(struct link_util *lu, int argc, char **argv,
FILE *f)
{
print_usage(f, strcmp(lu->id, "sit") == 0);
}
struct link_util ipip_link_util = {
.id = "ipip",
.maxattr = IFLA_IPTUN_MAX,

View File

@ -23,27 +23,25 @@
#include "ip_common.h"
#include "tunnel.h"
static void print_usage(FILE *f)
static void vti_print_help(struct link_util *lu, int argc, char **argv, FILE *f)
{
fprintf(f,
"Usage: ... vti [ remote ADDR ]\n"
" [ local ADDR ]\n"
" [ [i|o]key KEY ]\n"
" [ dev PHYS_DEV ]\n"
" [ fwmark MARK ]\n"
"\n"
"Where: ADDR := { IP_ADDRESS }\n"
" KEY := { DOTTED_QUAD | NUMBER }\n"
" MARK := { 0x0..0xffffffff }\n"
"Usage: ... %-4s [ remote ADDR ]\n",
lu->id
);
fprintf(f,
" [ local ADDR ]\n"
" [ [i|o]key KEY ]\n"
" [ dev PHYS_DEV ]\n"
" [ fwmark MARK ]\n"
"\n"
);
fprintf(f,
"Where: ADDR := { IP%s_ADDRESS }\n"
" KEY := { DOTTED_QUAD | NUMBER }\n"
" MARK := { 0x0..0xffffffff }\n",
""
);
}
static void usage(void) __attribute__((noreturn));
static void usage(void)
{
print_usage(stderr);
exit(-1);
}
static int vti_parse_opt(struct link_util *lu, int argc, char **argv,
@ -147,8 +145,10 @@ get_failed:
NEXT_ARG();
if (get_u32(&fwmark, *argv, 0))
invarg("invalid fwmark\n", *argv);
} else
usage();
} else {
vti_print_help(lu, argc, argv, stderr);
return -1;
}
argc--; argv++;
}
@ -208,12 +208,6 @@ static void vti_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
}
}
static void vti_print_help(struct link_util *lu, int argc, char **argv,
FILE *f)
{
print_usage(f);
}
struct link_util vti_link_util = {
.id = "vti",
.maxattr = IFLA_VTI_MAX,

View File

@ -24,26 +24,26 @@
#include "ip_common.h"
#include "tunnel.h"
static void print_usage(FILE *f)
static void vti6_print_help(struct link_util *lu, int argc, char **argv,
FILE *f)
{
fprintf(f,
"Usage: ... vti6 [ remote ADDR ]\n"
"Usage: ... %-4s [ remote ADDR ]\n",
lu->id
);
fprintf(f,
" [ local ADDR ]\n"
" [ [i|o]key KEY ]\n"
" [ dev PHYS_DEV ]\n"
" [ fwmark MARK ]\n"
"\n"
"Where: ADDR := { IPV6_ADDRESS }\n"
" KEY := { DOTTED_QUAD | NUMBER }\n"
" MARK := { 0x0..0xffffffff }\n"
);
}
static void usage(void) __attribute__((noreturn));
static void usage(void)
{
print_usage(stderr);
exit(-1);
fprintf(f,
"Where: ADDR := { IP%s_ADDRESS }\n"
" KEY := { DOTTED_QUAD | NUMBER }\n"
" MARK := { 0x0..0xffffffff }\n",
"V6"
);
}
static int vti6_parse_opt(struct link_util *lu, int argc, char **argv,
@ -153,8 +153,10 @@ get_failed:
NEXT_ARG();
if (get_u32(&fwmark, *argv, 0))
invarg("invalid fwmark\n", *argv);
} else
usage();
} else {
vti6_print_help(lu, argc, argv, stderr);
return -1;
}
argc--; argv++;
}
@ -214,12 +216,6 @@ static void vti6_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
}
}
static void vti6_print_help(struct link_util *lu, int argc, char **argv,
FILE *f)
{
print_usage(f);
}
struct link_util vti6_link_util = {
.id = "vti6",
.maxattr = IFLA_VTI_MAX,