From: Stefano Brivio Date: Thu, 8 Nov 2018 11:21:25 +0000 (+0100) Subject: iplink_vxlan: Add DF configuration X-Git-Tag: v5.0.0~36^2~27 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=3d98eba4fe369460d13a53eab1b1792d7ffa6cf5;hp=3a7246dce4822b3e04dce3dc3246bcf299de8826;p=mirror_iproute2.git iplink_vxlan: Add DF configuration Allow to set the DF bit behaviour for outgoing IPv4 packets: it can be always on, inherited from the inner header, or, by default, always off, which is the current behaviour. v2: - Indicate in the man page what DF refers to, using RFC 791 wording (David Ahern) Signed-off-by: Stefano Brivio Signed-off-by: David Ahern --- diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index 52e95197..52512202 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h @@ -531,6 +531,7 @@ enum { IFLA_VXLAN_LABEL, IFLA_VXLAN_GPE, IFLA_VXLAN_TTL_INHERIT, + IFLA_VXLAN_DF, __IFLA_VXLAN_MAX }; #define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) @@ -540,6 +541,14 @@ struct ifla_vxlan_port_range { __be16 high; }; +enum ifla_vxlan_df { + VXLAN_DF_UNSET = 0, + VXLAN_DF_SET, + VXLAN_DF_INHERIT, + __VXLAN_DF_END, + VXLAN_DF_MAX = __VXLAN_DF_END - 1, +}; + /* GENEVE section */ enum { IFLA_GENEVE_UNSPEC, diff --git a/ip/iplink_vxlan.c b/ip/iplink_vxlan.c index 7fc0e2b4..86afbe13 100644 --- a/ip/iplink_vxlan.c +++ b/ip/iplink_vxlan.c @@ -31,6 +31,7 @@ static void print_explain(FILE *f) " [ local ADDR ]\n" " [ ttl TTL ]\n" " [ tos TOS ]\n" + " [ df DF ]\n" " [ flowlabel LABEL ]\n" " [ dev PHYS_DEV ]\n" " [ dstport PORT ]\n" @@ -52,6 +53,7 @@ static void print_explain(FILE *f) " ADDR := { IP_ADDRESS | any }\n" " TOS := { NUMBER | inherit }\n" " TTL := { 1..255 | auto | inherit }\n" + " DF := { unset | set | inherit }\n" " LABEL := 0-1048575\n" ); } @@ -170,6 +172,22 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv, } else tos = 1; addattr8(n, 1024, IFLA_VXLAN_TOS, tos); + } else if (!matches(*argv, "df")) { + enum ifla_vxlan_df df; + + NEXT_ARG(); + check_duparg(&attrs, IFLA_VXLAN_DF, "df", *argv); + if (strcmp(*argv, "unset") == 0) + df = VXLAN_DF_UNSET; + else if (strcmp(*argv, "set") == 0) + df = VXLAN_DF_SET; + else if (strcmp(*argv, "inherit") == 0) + df = VXLAN_DF_INHERIT; + else + invarg("DF must be 'unset', 'set' or 'inherit'", + *argv); + + addattr8(n, 1024, IFLA_VXLAN_DF, df); } else if (!matches(*argv, "label") || !matches(*argv, "flowlabel")) { __u32 uval; @@ -538,6 +556,17 @@ static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) print_string(PRINT_FP, NULL, "ttl %s ", "auto"); } + if (tb[IFLA_VXLAN_DF]) { + enum ifla_vxlan_df df = rta_getattr_u8(tb[IFLA_VXLAN_DF]); + + if (df == VXLAN_DF_UNSET) + print_string(PRINT_JSON, "df", "df %s ", "unset"); + else if (df == VXLAN_DF_SET) + print_string(PRINT_ANY, "df", "df %s ", "set"); + else if (df == VXLAN_DF_INHERIT) + print_string(PRINT_ANY, "df", "df %s ", "inherit"); + } + if (tb[IFLA_VXLAN_LABEL]) { __u32 label = rta_getattr_u32(tb[IFLA_VXLAN_LABEL]); diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in index 5132f514..a94cf4f1 100644 --- a/man/man8/ip-link.8.in +++ b/man/man8/ip-link.8.in @@ -496,6 +496,8 @@ the following additional arguments are supported: ] [ .BI tos " TOS " ] [ +.BI df " DF " +] [ .BI flowlabel " FLOWLABEL " ] [ .BI dstport " PORT " @@ -565,6 +567,18 @@ parameter. .BI tos " TOS" - specifies the TOS value to use in outgoing packets. +.sp +.BI df " DF" +- specifies the usage of the Don't Fragment flag (DF) bit in outgoing packets +with IPv4 headers. The value +.B inherit +causes the bit to be copied from the original IP header. The values +.B unset +and +.B set +cause the bit to be always unset or always set, respectively. By default, the +bit is not set. + .sp .BI flowlabel " FLOWLABEL" - specifies the flow label to use in outgoing packets.