]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
tc/pedit: p_ip: introduce editing ttl header
authorAmir Vadai <amir@vadai.me>
Sun, 23 Apr 2017 12:53:52 +0000 (15:53 +0300)
committerStephen Hemminger <stephen@networkplumber.org>
Mon, 1 May 2017 16:22:16 +0000 (09:22 -0700)
Enable user to edit IP header ttl field.

For example, to forward any TCP packet and decrease its TTL by one:
$ tc filter add dev enp0s9 protocol ip parent ffff: \
    flower \
      ip_proto tcp \
    action pedit ex munge \
      ip ttl add 0xff pipe \
    action mirred egress \
      redirect dev veth0

Signed-off-by: Amir Vadai <amir@vadai.me>
man/man8/tc-pedit.8
tc/p_ip.c

index 6bba741956f1576a11c9a6b85e60532d63b12afa..c98d95cb0021eb196dcf7ef2c221ca3eff372e0f 100644 (file)
@@ -28,6 +28,8 @@ pedit - generic packet editor action
 .ti -8
 .IR EXTENDED_LAYERED_OP " := { "
 .BI ip " IPHDR_FIELD"
+|
+.BI ip " EX_IPHDR_FIELD"
 .RI } " CMD_SPEC"
 
 .ti -8
@@ -39,6 +41,10 @@ pedit - generic packet editor action
 .IR BEYOND_IPHDR_FIELD " := { "
 .BR dport " | " sport " | " icmp_type " | " icmp_code " }"
 
+.ti -8
+.IR EX_IPHDR_FIELD " := { "
+.BR ttl " }"
+
 .ti -8
 .IR CMD_SPEC " := {"
 .BR clear " | " invert " | " set
@@ -161,6 +167,17 @@ If it is not or the latter is bigger than the minimum of 20 bytes, this will do
 unexpected things. These fields are eight-bit values.
 .RE
 .TP
+.BI ip " EX_IPHDR_FIELD"
+Supported only when
+.I ex
+is used. The supported keywords for
+.I EX_IPHDR_FIELD
+are:
+.RS
+.TP
+.B ttl
+.RE
+.TP
 .B clear
 Clear the addressed data (i.e., set it to zero).
 .TP
index e56eb39317baa6c6b672eefdc268e4d2bde19398..22fe6505e427100f8a238e1e57e6d97444d0908d 100644 (file)
--- a/tc/p_ip.c
+++ b/tc/p_ip.c
@@ -66,6 +66,12 @@ parse_ip(int *argc_p, char ***argv_p,
                res = parse_cmd(&argc, &argv, 1, TU32, 0x0f, sel, tkey);
                goto done;
        }
+       if (strcmp(*argv, "ttl") == 0) {
+               NEXT_ARG();
+               tkey->off = 8;
+               res = parse_cmd(&argc, &argv, 1, TU32, RU8, sel, tkey);
+               goto done;
+       }
        if (strcmp(*argv, "protocol") == 0) {
                NEXT_ARG();
                tkey->off = 9;