iplink_geneve: 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 <sbrivio@redhat.com>
Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
Stefano Brivio 2018-11-08 12:21:26 +01:00 committed by David Ahern
parent 3d98eba4fe
commit 64dbd03ea1
3 changed files with 52 additions and 0 deletions

View File

@ -564,10 +564,19 @@ enum {
IFLA_GENEVE_UDP_ZERO_CSUM6_RX,
IFLA_GENEVE_LABEL,
IFLA_GENEVE_TTL_INHERIT,
IFLA_GENEVE_DF,
__IFLA_GENEVE_MAX
};
#define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1)
enum ifla_geneve_df {
GENEVE_DF_UNSET = 0,
GENEVE_DF_SET,
GENEVE_DF_INHERIT,
__GENEVE_DF_END,
GENEVE_DF_MAX = __GENEVE_DF_END - 1,
};
/* PPP section */
enum {
IFLA_PPP_UNSPEC,

View File

@ -24,6 +24,7 @@ static void print_explain(FILE *f)
" remote ADDR\n"
" [ ttl TTL ]\n"
" [ tos TOS ]\n"
" [ df DF ]\n"
" [ flowlabel LABEL ]\n"
" [ dstport PORT ]\n"
" [ [no]external ]\n"
@ -35,6 +36,7 @@ static void print_explain(FILE *f)
" ADDR := IP_ADDRESS\n"
" TOS := { NUMBER | inherit }\n"
" TTL := { 1..255 | auto | inherit }\n"
" DF := { unset | set | inherit }\n"
" LABEL := 0-1048575\n"
);
}
@ -115,6 +117,22 @@ static int geneve_parse_opt(struct link_util *lu, int argc, char **argv,
tos = uval;
} else
tos = 1;
} else if (!matches(*argv, "df")) {
enum ifla_geneve_df df;
NEXT_ARG();
check_duparg(&attrs, IFLA_GENEVE_DF, "df", *argv);
if (strcmp(*argv, "unset") == 0)
df = GENEVE_DF_UNSET;
else if (strcmp(*argv, "set") == 0)
df = GENEVE_DF_SET;
else if (strcmp(*argv, "inherit") == 0)
df = GENEVE_DF_INHERIT;
else
invarg("DF must be 'unset', 'set' or 'inherit'",
*argv);
addattr8(n, 1024, IFLA_GENEVE_DF, df);
} else if (!matches(*argv, "label") ||
!matches(*argv, "flowlabel")) {
__u32 uval;
@ -287,6 +305,17 @@ static void geneve_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
print_string(PRINT_FP, NULL, "tos %s ", "inherit");
}
if (tb[IFLA_GENEVE_DF]) {
enum ifla_geneve_df df = rta_getattr_u8(tb[IFLA_GENEVE_DF]);
if (df == GENEVE_DF_UNSET)
print_string(PRINT_JSON, "df", "df %s ", "unset");
else if (df == GENEVE_DF_SET)
print_string(PRINT_ANY, "df", "df %s ", "set");
else if (df == GENEVE_DF_INHERIT)
print_string(PRINT_ANY, "df", "df %s ", "inherit");
}
if (tb[IFLA_GENEVE_LABEL]) {
__u32 label = rta_getattr_u32(tb[IFLA_GENEVE_LABEL]);

View File

@ -1180,6 +1180,8 @@ the following additional arguments are supported:
] [
.BI tos " TOS "
] [
.BI df " DF "
] [
.BI flowlabel " FLOWLABEL "
] [
.BI dstport " PORT"
@ -1212,6 +1214,18 @@ ttl. Default option is "0".
.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.