Commit ca5ab963 authored by David S. Miller's avatar David S. Miller

Merge branch 'selftests-classid'

Pedro Tammela says:

====================
selftests/tc-testing: add tests covering classid

Patches 1-3 add missing tests covering classid behaviour on tdc for cls_fw,
cls_route and cls_fw. This behaviour was recently fixed by valis[0].

Patch 4 comes from the development done in the previous patches as it turns out
cls_route never returns meaningful errors.

[0] https://lore.kernel.org/all/20230729123202.72406-1-jhs@mojatatu.com/

v2->v3: https://lore.kernel.org/all/20230825155148.659895-1-pctammela@mojatatu.com/
   - Added changes that were left in the working tree (Jakub)
   - Fixed two typos in commit message titles
   - Added Victor tags

v1->v2: https://lore.kernel.org/all/20230818163544.351104-1-pctammela@mojatatu.com/
   - Drop u32 updates
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents a4a09ac6 ef765c25
...@@ -375,9 +375,9 @@ static int route4_delete(struct tcf_proto *tp, void *arg, bool *last, ...@@ -375,9 +375,9 @@ static int route4_delete(struct tcf_proto *tp, void *arg, bool *last,
static const struct nla_policy route4_policy[TCA_ROUTE4_MAX + 1] = { static const struct nla_policy route4_policy[TCA_ROUTE4_MAX + 1] = {
[TCA_ROUTE4_CLASSID] = { .type = NLA_U32 }, [TCA_ROUTE4_CLASSID] = { .type = NLA_U32 },
[TCA_ROUTE4_TO] = { .type = NLA_U32 }, [TCA_ROUTE4_TO] = NLA_POLICY_MAX(NLA_U32, 0xFF),
[TCA_ROUTE4_FROM] = { .type = NLA_U32 }, [TCA_ROUTE4_FROM] = NLA_POLICY_MAX(NLA_U32, 0xFF),
[TCA_ROUTE4_IIF] = { .type = NLA_U32 }, [TCA_ROUTE4_IIF] = NLA_POLICY_MAX(NLA_U32, 0x7FFF),
}; };
static int route4_set_parms(struct net *net, struct tcf_proto *tp, static int route4_set_parms(struct net *net, struct tcf_proto *tp,
...@@ -397,33 +397,37 @@ static int route4_set_parms(struct net *net, struct tcf_proto *tp, ...@@ -397,33 +397,37 @@ static int route4_set_parms(struct net *net, struct tcf_proto *tp,
return err; return err;
if (tb[TCA_ROUTE4_TO]) { if (tb[TCA_ROUTE4_TO]) {
if (new && handle & 0x8000) if (new && handle & 0x8000) {
NL_SET_ERR_MSG(extack, "Invalid handle");
return -EINVAL; return -EINVAL;
}
to = nla_get_u32(tb[TCA_ROUTE4_TO]); to = nla_get_u32(tb[TCA_ROUTE4_TO]);
if (to > 0xFF)
return -EINVAL;
nhandle = to; nhandle = to;
} }
if (tb[TCA_ROUTE4_FROM] && tb[TCA_ROUTE4_IIF]) {
NL_SET_ERR_MSG_ATTR(extack, tb[TCA_ROUTE4_FROM],
"'from' and 'fromif' are mutually exclusive");
return -EINVAL;
}
if (tb[TCA_ROUTE4_FROM]) { if (tb[TCA_ROUTE4_FROM]) {
if (tb[TCA_ROUTE4_IIF])
return -EINVAL;
id = nla_get_u32(tb[TCA_ROUTE4_FROM]); id = nla_get_u32(tb[TCA_ROUTE4_FROM]);
if (id > 0xFF)
return -EINVAL;
nhandle |= id << 16; nhandle |= id << 16;
} else if (tb[TCA_ROUTE4_IIF]) { } else if (tb[TCA_ROUTE4_IIF]) {
id = nla_get_u32(tb[TCA_ROUTE4_IIF]); id = nla_get_u32(tb[TCA_ROUTE4_IIF]);
if (id > 0x7FFF)
return -EINVAL;
nhandle |= (id | 0x8000) << 16; nhandle |= (id | 0x8000) << 16;
} else } else
nhandle |= 0xFFFF << 16; nhandle |= 0xFFFF << 16;
if (handle && new) { if (handle && new) {
nhandle |= handle & 0x7F00; nhandle |= handle & 0x7F00;
if (nhandle != handle) if (nhandle != handle) {
NL_SET_ERR_MSG_FMT(extack,
"Handle mismatch constructed: %x (expected: %x)",
handle, nhandle);
return -EINVAL; return -EINVAL;
}
} }
if (!nhandle) { if (!nhandle) {
...@@ -478,7 +482,6 @@ static int route4_change(struct net *net, struct sk_buff *in_skb, ...@@ -478,7 +482,6 @@ static int route4_change(struct net *net, struct sk_buff *in_skb,
struct route4_filter __rcu **fp; struct route4_filter __rcu **fp;
struct route4_filter *fold, *f1, *pfp, *f = NULL; struct route4_filter *fold, *f1, *pfp, *f = NULL;
struct route4_bucket *b; struct route4_bucket *b;
struct nlattr *opt = tca[TCA_OPTIONS];
struct nlattr *tb[TCA_ROUTE4_MAX + 1]; struct nlattr *tb[TCA_ROUTE4_MAX + 1];
unsigned int h, th; unsigned int h, th;
int err; int err;
...@@ -489,10 +492,12 @@ static int route4_change(struct net *net, struct sk_buff *in_skb, ...@@ -489,10 +492,12 @@ static int route4_change(struct net *net, struct sk_buff *in_skb,
return -EINVAL; return -EINVAL;
} }
if (opt == NULL) if (NL_REQ_ATTR_CHECK(extack, NULL, tca, TCA_OPTIONS)) {
NL_SET_ERR_MSG_MOD(extack, "Missing options");
return -EINVAL; return -EINVAL;
}
err = nla_parse_nested_deprecated(tb, TCA_ROUTE4_MAX, opt, err = nla_parse_nested_deprecated(tb, TCA_ROUTE4_MAX, tca[TCA_OPTIONS],
route4_policy, NULL); route4_policy, NULL);
if (err < 0) if (err < 0)
return err; return err;
......
...@@ -1351,5 +1351,54 @@ ...@@ -1351,5 +1351,54 @@
"teardown": [ "teardown": [
"$TC qdisc del dev $DEV1 ingress" "$TC qdisc del dev $DEV1 ingress"
] ]
},
{
"id": "e470",
"name": "Try to delete class referenced by fw after a replace",
"category": [
"filter",
"fw"
],
"plugins": {
"requires": "nsPlugin"
},
"setup": [
"$TC qdisc add dev $DEV1 parent root handle 10: drr",
"$TC class add dev $DEV1 parent root classid 1 drr",
"$TC filter add dev $DEV1 parent 10: handle 1 prio 1 fw classid 10:1 action ok",
"$TC filter replace dev $DEV1 parent 10: handle 1 prio 1 fw classid 10:1 action drop"
],
"cmdUnderTest": "$TC class delete dev $DEV1 parent 10: classid 10:1",
"expExitCode": "2",
"verifyCmd": "$TC class show dev $DEV1",
"matchPattern": "class drr 10:1",
"matchCount": "1",
"teardown": [
"$TC qdisc del dev $DEV1 parent root drr"
]
},
{
"id": "ec1a",
"name": "Replace fw classid with nil",
"category": [
"filter",
"fw"
],
"plugins": {
"requires": "nsPlugin"
},
"setup": [
"$TC qdisc add dev $DEV1 parent root handle 10: drr",
"$TC class add dev $DEV1 parent root classid 1 drr",
"$TC filter add dev $DEV1 parent 10: handle 1 prio 1 fw classid 10:1 action ok"
],
"cmdUnderTest": "$TC filter replace dev $DEV1 parent 10: handle 1 prio 1 fw action drop",
"expExitCode": "0",
"verifyCmd": "$TC filter show dev $DEV1 parent 10:",
"matchPattern": "fw chain 0 handle 0x1",
"matchCount": "1",
"teardown": [
"$TC qdisc del dev $DEV1 parent root drr"
]
} }
] ]
...@@ -177,5 +177,30 @@ ...@@ -177,5 +177,30 @@
"teardown": [ "teardown": [
"$TC qdisc del dev $DEV1 ingress" "$TC qdisc del dev $DEV1 ingress"
] ]
},
{
"id": "b042",
"name": "Try to delete class referenced by route after a replace",
"category": [
"filter",
"route"
],
"plugins": {
"requires": "nsPlugin"
},
"setup": [
"$TC qdisc add dev $DEV1 parent root handle 10: drr",
"$TC class add dev $DEV1 parent root classid 1 drr",
"$TC filter add dev $DEV1 parent 10: prio 1 route from 10 classid 10:1 action ok",
"$TC filter replace dev $DEV1 parent 10: prio 1 route from 5 classid 10:1 action drop"
],
"cmdUnderTest": "$TC class delete dev $DEV1 parent 10: classid 10:1",
"expExitCode": "2",
"verifyCmd": "$TC class show dev $DEV1",
"matchPattern": "class drr 10:1",
"matchCount": "1",
"teardown": [
"$TC qdisc del dev $DEV1 parent root drr"
]
} }
] ]
...@@ -247,5 +247,30 @@ ...@@ -247,5 +247,30 @@
"teardown": [ "teardown": [
"$TC qdisc del dev $DEV1 ingress" "$TC qdisc del dev $DEV1 ingress"
] ]
},
{
"id": "0c37",
"name": "Try to delete class referenced by u32 after a replace",
"category": [
"filter",
"u32"
],
"plugins": {
"requires": "nsPlugin"
},
"setup": [
"$TC qdisc add dev $DEV1 parent root handle 10: drr",
"$TC class add dev $DEV1 parent root classid 1 drr",
"$TC filter add dev $DEV1 parent 10: prio 1 u32 match icmp type 1 0xff classid 10:1 action ok",
"$TC filter replace dev $DEV1 parent 10: prio 1 u32 match icmp type 1 0xff classid 10:1 action drop"
],
"cmdUnderTest": "$TC class delete dev $DEV1 parent 10: classid 10:1",
"expExitCode": "2",
"verifyCmd": "$TC class show dev $DEV1",
"matchPattern": "class drr 10:1",
"matchCount": "1",
"teardown": [
"$TC qdisc del dev $DEV1 parent root drr"
]
} }
] ]
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment