Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

Merge branch 'mirred-batch-fixes'



Roman Mashak says:

====================
Fix batched event generation for mirred action

When adding or deleting a batch of entries, the kernel sends upto
TCA_ACT_MAX_PRIO entries in an event to user space. However it does not
consider that the action sizes may vary and require different skb sizes.

For example :

% cat tc-batch.sh
TC="sudo /mnt/iproute2.git/tc/tc"

$TC actions flush action mirred
for i in `seq 1 $1`;
do
   cmd="action mirred egress redirect dev lo index $i "
   args=$args$cmd
done
$TC actions add $args
%
% ./tc-batch.sh 32
Error: Failed to fill netlink attributes while adding TC action.
We have an error talking to the kernel
%

patch 1 adds callback in tc_action_ops of mirred action, which calculates
the action size, and passes size to tcf_add_notify()/tcf_del_notify().

patch 2 updates the TDC test suite with relevant test cases.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 362b87f5 5d15a8ec
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -426,6 +426,11 @@ static void tcf_mirred_put_dev(struct net_device *dev)
	dev_put(dev);
}

static size_t tcf_mirred_get_fill_size(const struct tc_action *act)
{
	return nla_total_size(sizeof(struct tc_mirred));
}

static struct tc_action_ops act_mirred_ops = {
	.kind		=	"mirred",
	.id		=	TCA_ID_MIRRED,
@@ -437,6 +442,7 @@ static struct tc_action_ops act_mirred_ops = {
	.init		=	tcf_mirred_init,
	.walk		=	tcf_mirred_walker,
	.lookup		=	tcf_mirred_search,
	.get_fill_size	=	tcf_mirred_get_fill_size,
	.size		=	sizeof(struct tcf_mirred),
	.get_dev	=	tcf_mirred_get_dev,
	.put_dev	=	tcf_mirred_put_dev,
+94 −0
Original line number Diff line number Diff line
@@ -459,5 +459,99 @@
        "teardown": [
            "$TC actions flush action mirred"
        ]
    },
    {
        "id": "4749",
        "name": "Add batch of 32 mirred redirect egress actions with cookie",
        "category": [
            "actions",
            "mirred"
        ],
        "setup": [
            [
                "$TC actions flush action mirred",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "bash -c \"for i in \\`seq 1 32\\`; do cmd=\\\"action mirred egress redirect dev lo index \\$i cookie aabbccddeeff112233445566778800a1 \\\"; args=\"\\$args\\$cmd\"; done && $TC actions add \\$args\"",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action mirred",
        "matchPattern": "^[ \t]+index [0-9]+ ref",
        "matchCount": "32",
        "teardown": [
            "$TC actions flush action mirred"
        ]
    },
    {
        "id": "5c69",
        "name": "Delete batch of 32 mirred redirect egress actions",
        "category": [
            "actions",
            "mirred"
        ],
        "setup": [
            [
                "$TC actions flush action mirred",
                0,
                1,
                255
            ],
            "bash -c \"for i in \\`seq 1 32\\`; do cmd=\\\"action mirred egress redirect dev lo index \\$i \\\"; args=\\\"\\$args\\$cmd\\\"; done && $TC actions add \\$args\""
        ],
        "cmdUnderTest": "bash -c \"for i in \\`seq 1 32\\`; do cmd=\\\"action mirred index \\$i \\\"; args=\"\\$args\\$cmd\"; done && $TC actions del \\$args\"",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action mirred",
        "matchPattern": "^[ \t]+index [0-9]+ ref",
        "matchCount": "0",
        "teardown": []
    },
    {
        "id": "d3c0",
        "name": "Add batch of 32 mirred mirror ingress actions with cookie",
        "category": [
            "actions",
            "mirred"
        ],
        "setup": [
            [
                "$TC actions flush action mirred",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "bash -c \"for i in \\`seq 1 32\\`; do cmd=\\\"action mirred ingress mirror dev lo index \\$i cookie aabbccddeeff112233445566778800a1 \\\"; args=\"\\$args\\$cmd\"; done && $TC actions add \\$args\"",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action mirred",
        "matchPattern": "^[ \t]+index [0-9]+ ref",
        "matchCount": "32",
        "teardown": [
            "$TC actions flush action mirred"
        ]
    },
    {
        "id": "e684",
        "name": "Delete batch of 32 mirred mirror ingress actions",
        "category": [
            "actions",
            "mirred"
        ],
        "setup": [
            [
                "$TC actions flush action mirred",
                0,
                1,
                255
            ],
            "bash -c \"for i in \\`seq 1 32\\`; do cmd=\\\"action mirred ingress mirror dev lo index \\$i \\\"; args=\\\"\\$args\\$cmd\\\"; done && $TC actions add \\$args\""
        ],
        "cmdUnderTest": "bash -c \"for i in \\`seq 1 32\\`; do cmd=\\\"action mirred index \\$i \\\"; args=\"\\$args\\$cmd\"; done && $TC actions del \\$args\"",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action mirred",
        "matchPattern": "^[ \t]+index [0-9]+ ref",
        "matchCount": "0",
        "teardown": []
    }
]