.IR VAL " | "
.BR add
.IR VAL " | "
+.BR decrement " | "
.BR preserve " } [ " retain
.IR RVAL " ]"
.B ex
Use extended pedit.
.I EXTENDED_LAYERED_OP
-and the add
+and the add/decrement
.I CMD_SPEC
are allowed only in this mode.
.TP
.IR EXTENDED_LAYERED_OP .
This operation is supported only for extended layered op.
.TP
+.BI decrement
+Decrease the addressed data by one.
+This operation is supported only for
+.BR ip " " ttl " and " ip6 " " hoplimit "."
+.TP
.B preserve
Keep the addressed data as is.
.TP
"\t\tATC:= at <atval> offmask <maskval> shift <shiftval>\n"
"\t\tNOTE: offval is byte offset, must be multiple of 4\n"
"\t\tNOTE: maskval is a 32 bit hex number\n \t\tNOTE: shiftval is a shift value\n"
- "\t\tCMD:= clear | invert | set <setval>| add <addval> | retain\n"
+ "\t\tCMD:= clear | invert | set <setval> | add <addval> | decrement | retain\n"
"\t<LAYERED>:= ip <ipdata> | ip6 <ip6data>\n"
" \t\t| udp <udpdata> | tcp <tcpdata> | icmp <icmpdata>\n"
"\tCONTROL:= reclassify | pipe | drop | continue | pass |\n"
if (matches(*argv, "add") == 0)
tkey->cmd = TCA_PEDIT_KEY_EX_CMD_ADD;
- if (!sel->extended && tkey->cmd) {
- fprintf(stderr,
- "Non extended mode. only 'set' command is supported\n");
- return -1;
- }
+ if (!sel->extended && tkey->cmd)
+ goto non_ext_only_set_cmd;
NEXT_ARG();
if (parse_val(&argc, &argv, val, type))
return -1;
+ } else if (matches(*argv, "decrement") == 0) {
+ if ((flags & PEDIT_ALLOW_DEC) == 0) {
+ fprintf(stderr,
+ "decrement command is not supported for this field\n");
+ return -1;
+ }
+
+ if (!sel->extended)
+ goto non_ext_only_set_cmd;
+
+ tkey->cmd = TCA_PEDIT_KEY_EX_CMD_ADD;
+ *v = retain; /* decrement by overflow */
} else if (matches(*argv, "preserve") == 0) {
retain = 0;
} else {
*argv_p = argv;
return res;
+non_ext_only_set_cmd:
+ fprintf(stderr,
+ "Non extended mode. only 'set' command is supported\n");
+ return -1;
}
static int parse_offset(int *argc_p, char ***argv_p, struct m_pedit_sel *sel,
if (strcmp(*argv, "ttl") == 0) {
NEXT_ARG();
tkey->off = 8;
- res = parse_cmd(&argc, &argv, 1, TU32, RU8, sel, tkey, 0);
+ res = parse_cmd(&argc, &argv, 1, TU32, RU8, sel, tkey, PEDIT_ALLOW_DEC);
goto done;
}
if (strcmp(*argv, "protocol") == 0) {
if (strcmp(*argv, "hoplimit") == 0) {
NEXT_ARG();
tkey->off = 7;
- res = parse_cmd(&argc, &argv, 1, TU32, RU8, sel, tkey, 0);
+ res = parse_cmd(&argc, &argv, 1, TU32, RU8, sel, tkey, PEDIT_ALLOW_DEC);
goto done;
}
if (strcmp(*argv, "traffic_class") == 0) {