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

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
...@@ -426,6 +426,11 @@ static void tcf_mirred_put_dev(struct net_device *dev) ...@@ -426,6 +426,11 @@ static void tcf_mirred_put_dev(struct net_device *dev)
dev_put(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 = { static struct tc_action_ops act_mirred_ops = {
.kind = "mirred", .kind = "mirred",
.id = TCA_ID_MIRRED, .id = TCA_ID_MIRRED,
...@@ -437,6 +442,7 @@ static struct tc_action_ops act_mirred_ops = { ...@@ -437,6 +442,7 @@ static struct tc_action_ops act_mirred_ops = {
.init = tcf_mirred_init, .init = tcf_mirred_init,
.walk = tcf_mirred_walker, .walk = tcf_mirred_walker,
.lookup = tcf_mirred_search, .lookup = tcf_mirred_search,
.get_fill_size = tcf_mirred_get_fill_size,
.size = sizeof(struct tcf_mirred), .size = sizeof(struct tcf_mirred),
.get_dev = tcf_mirred_get_dev, .get_dev = tcf_mirred_get_dev,
.put_dev = tcf_mirred_put_dev, .put_dev = tcf_mirred_put_dev,
......
...@@ -459,5 +459,99 @@ ...@@ -459,5 +459,99 @@
"teardown": [ "teardown": [
"$TC actions flush action mirred" "$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": []
} }
] ]
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