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

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
Loading
Loading
Loading
Loading
+21 −16
Original line number Diff line number Diff line
@@ -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] = {
	[TCA_ROUTE4_CLASSID]	= { .type = NLA_U32 },
	[TCA_ROUTE4_TO]		= { .type = NLA_U32 },
	[TCA_ROUTE4_FROM]	= { .type = NLA_U32 },
	[TCA_ROUTE4_IIF]	= { .type = NLA_U32 },
	[TCA_ROUTE4_TO]		= NLA_POLICY_MAX(NLA_U32, 0xFF),
	[TCA_ROUTE4_FROM]	= NLA_POLICY_MAX(NLA_U32, 0xFF),
	[TCA_ROUTE4_IIF]	= NLA_POLICY_MAX(NLA_U32, 0x7FFF),
};

static int route4_set_parms(struct net *net, struct tcf_proto *tp,
@@ -397,34 +397,38 @@ static int route4_set_parms(struct net *net, struct tcf_proto *tp,
		return err;

	if (tb[TCA_ROUTE4_TO]) {
		if (new && handle & 0x8000)
		if (new && handle & 0x8000) {
			NL_SET_ERR_MSG(extack, "Invalid handle");
			return -EINVAL;
		}
		to = nla_get_u32(tb[TCA_ROUTE4_TO]);
		if (to > 0xFF)
			return -EINVAL;
		nhandle = to;
	}

	if (tb[TCA_ROUTE4_FROM]) {
		if (tb[TCA_ROUTE4_IIF])
	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]) {
		id = nla_get_u32(tb[TCA_ROUTE4_FROM]);
		if (id > 0xFF)
			return -EINVAL;
		nhandle |= id << 16;
	} else if (tb[TCA_ROUTE4_IIF]) {
		id = nla_get_u32(tb[TCA_ROUTE4_IIF]);
		if (id > 0x7FFF)
			return -EINVAL;
		nhandle |= (id | 0x8000) << 16;
	} else
		nhandle |= 0xFFFF << 16;

	if (handle && new) {
		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;
		}
	}

	if (!nhandle) {
		NL_SET_ERR_MSG(extack, "Replacing with handle of 0 is invalid");
@@ -478,7 +482,6 @@ static int route4_change(struct net *net, struct sk_buff *in_skb,
	struct route4_filter __rcu **fp;
	struct route4_filter *fold, *f1, *pfp, *f = NULL;
	struct route4_bucket *b;
	struct nlattr *opt = tca[TCA_OPTIONS];
	struct nlattr *tb[TCA_ROUTE4_MAX + 1];
	unsigned int h, th;
	int err;
@@ -489,10 +492,12 @@ static int route4_change(struct net *net, struct sk_buff *in_skb,
		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;
	}

	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);
	if (err < 0)
		return err;
+49 −0
Original line number Diff line number Diff line
@@ -1351,5 +1351,54 @@
        "teardown": [
            "$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"
        ]
    }
]
+25 −0
Original line number Diff line number Diff line
@@ -177,5 +177,30 @@
        "teardown": [
            "$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"
        ]
    }
]
+25 −0
Original line number Diff line number Diff line
@@ -247,5 +247,30 @@
        "teardown": [
            "$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"
        ]
    }
]