tc/pedit: Support fields bigger than 32 bits
Make parse_val() accept fields up to 128 bits long, this should be enough for current use cases and involves a minimal change to code. Signed-off-by: Amir Vadai <amir@vadai.me>
This commit is contained in:
parent
8d193d9607
commit
fa4652ff3b
13
tc/m_pedit.c
13
tc/m_pedit.c
|
|
@ -256,7 +256,10 @@ int parse_val(int *argc_p, char ***argv_p, __u32 *val, int type)
|
||||||
int parse_cmd(int *argc_p, char ***argv_p, __u32 len, int type, __u32 retain,
|
int parse_cmd(int *argc_p, char ***argv_p, __u32 len, int type, __u32 retain,
|
||||||
struct m_pedit_sel *sel, struct m_pedit_key *tkey)
|
struct m_pedit_sel *sel, struct m_pedit_key *tkey)
|
||||||
{
|
{
|
||||||
__u32 mask = 0, val = 0;
|
__u32 mask[4] = { 0 };
|
||||||
|
__u32 val[4] = { 0 };
|
||||||
|
__u32 *m = &mask[0];
|
||||||
|
__u32 *v = &val[0];
|
||||||
__u32 o = 0xFF;
|
__u32 o = 0xFF;
|
||||||
int res = -1;
|
int res = -1;
|
||||||
int argc = *argc_p;
|
int argc = *argc_p;
|
||||||
|
|
@ -275,7 +278,7 @@ int parse_cmd(int *argc_p, char ***argv_p, __u32 len, int type, __u32 retain,
|
||||||
o = 0xFFFFFFFF;
|
o = 0xFFFFFFFF;
|
||||||
|
|
||||||
if (matches(*argv, "invert") == 0) {
|
if (matches(*argv, "invert") == 0) {
|
||||||
val = mask = o;
|
*v = *m = o;
|
||||||
} else if (matches(*argv, "set") == 0 ||
|
} else if (matches(*argv, "set") == 0 ||
|
||||||
matches(*argv, "add") == 0) {
|
matches(*argv, "add") == 0) {
|
||||||
if (matches(*argv, "add") == 0)
|
if (matches(*argv, "add") == 0)
|
||||||
|
|
@ -287,7 +290,7 @@ int parse_cmd(int *argc_p, char ***argv_p, __u32 len, int type, __u32 retain,
|
||||||
}
|
}
|
||||||
|
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
if (parse_val(&argc, &argv, &val, type))
|
if (parse_val(&argc, &argv, val, type))
|
||||||
return -1;
|
return -1;
|
||||||
} else if (matches(*argv, "preserve") == 0) {
|
} else if (matches(*argv, "preserve") == 0) {
|
||||||
retain = 0;
|
retain = 0;
|
||||||
|
|
@ -307,8 +310,8 @@ int parse_cmd(int *argc_p, char ***argv_p, __u32 len, int type, __u32 retain,
|
||||||
argv++;
|
argv++;
|
||||||
}
|
}
|
||||||
|
|
||||||
tkey->val = val;
|
tkey->val = *v;
|
||||||
tkey->mask = mask;
|
tkey->mask = *m;
|
||||||
|
|
||||||
if (type == TIPV4)
|
if (type == TIPV4)
|
||||||
tkey->val = ntohl(tkey->val);
|
tkey->val = ntohl(tkey->val);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue