diff --git a/ip/iptunnel.c b/ip/iptunnel.c index 0cf6cf8e..f8b91ba0 100644 --- a/ip/iptunnel.c +++ b/ip/iptunnel.c @@ -41,7 +41,7 @@ static void usage(void) fprintf(stderr, "\n"); fprintf(stderr, "Where: NAME := STRING\n"); fprintf(stderr, " ADDR := { IP_ADDRESS | any }\n"); - fprintf(stderr, " TOS := { NUMBER | inherit }\n"); + fprintf(stderr, " TOS := { STRING | 00..ff | inherit | inherit/STRING | inherit/00..ff }\n"); fprintf(stderr, " TTL := { 1..255 | inherit }\n"); fprintf(stderr, " KEY := { DOTTED_QUAD | NUMBER }\n"); exit(-1); @@ -188,14 +188,21 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) } else if (strcmp(*argv, "tos") == 0 || strcmp(*argv, "tclass") == 0 || matches(*argv, "dsfield") == 0) { + char *dsfield; __u32 uval; NEXT_ARG(); + dsfield = *argv; + strsep(&dsfield, "/"); if (strcmp(*argv, "inherit") != 0) { - if (rtnl_dsfield_a2n(&uval, *argv)) - invarg("bad TOS value", *argv); - p->iph.tos = uval; + dsfield = *argv; + p->iph.tos = 0; } else p->iph.tos = 1; + if (dsfield) { + if (rtnl_dsfield_a2n(&uval, dsfield)) + invarg("bad TOS value", *argv); + p->iph.tos |= uval; + } } else { if (strcmp(*argv, "name") == 0) { NEXT_ARG(); diff --git a/man/man8/ip-tunnel.8 b/man/man8/ip-tunnel.8 index 37ba542c..b408517c 100644 --- a/man/man8/ip-tunnel.8 +++ b/man/man8/ip-tunnel.8 @@ -47,7 +47,6 @@ ip-tunnel - tunnel configuration .RB "[ [" no "]" pmtudisc " ]" .RB "[ " dev .IR PHYS_DEV " ]" -.RB "[ " "dscp inherit" " ]" .ti -8 .IR MODE " := " @@ -58,8 +57,12 @@ ip-tunnel - tunnel configuration .BR any " }" .ti -8 -.IR TOS " := { " NUMBER " |" -.BR inherit " }" +.IR TOS " := { " STRING " | " 00 ".." ff " |" +.BR inherit " |" +.BI "inherit/" STRING +.R " |" +.BI "inherit/" 00 ".." ff +.R " }" .ti -8 .IR ELIM " := {" @@ -132,11 +135,21 @@ The default value for IPv6 tunnels is: .BI dsfield " T" .TP .BI tclass " T" -set a fixed TOS (or traffic class in IPv6) -.I T -on tunneled packets. -The default value is: -.BR "inherit" . +set the type of service (IPv4) or traffic class (IPv6) field on +tunneled packets, which can be specified as either a two-digit +hex value (e.g. c0) or a predefined string (e.g. internet). +The value +.B inherit +causes the field to be copied from the original IP header. The +values +.BI "inherit/" STRING +or +.BI "inherit/" 00 ".." ff +will set the field to +.I STRING +or +.IR 00 ".." ff +when tunneling non-IP packets. The default value is 00. .TP .BI dev " NAME" @@ -201,11 +214,6 @@ flag is equivalent to the combination .BR "iseq oseq" . .B It isn't work. Don't use it. -.TP -.BR "dscp inherit" -.RB ( " only IPv6 tunnels " ) -Inherit DS field between inner and outer header. - .TP .BI encaplim " ELIM" .RB ( " only IPv6 tunnels " )