Commit 9e35552a authored by Vlad Buslov's avatar Vlad Buslov Committed by David S. Miller
Browse files

net: sched: flower: use correct ht function to prevent duplicates



Implementation of function rhashtable_insert_fast() check if its internal
helper function __rhashtable_insert_fast() returns non-NULL pointer and
seemingly return -EEXIST in such case. However, since
__rhashtable_insert_fast() is called with NULL key pointer, it never
actually checks for duplicates, which means that -EEXIST is never returned
to the user. Use rhashtable_lookup_insert_fast() hash table API instead. In
order to verify that it works as expected and prevent the problem from
happening in future, extend tc-tests with new test that verifies that no
new filters with existing key can be inserted to flower classifier.

Fixes: 1f17f774 ("net: sched: flower: insert filter to ht before offloading it to hw")
Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
Reviewed-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ecce39ec
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -1466,7 +1466,7 @@ static int fl_ht_insert_unique(struct cls_fl_filter *fnew,
	struct fl_flow_mask *mask = fnew->mask;
	struct fl_flow_mask *mask = fnew->mask;
	int err;
	int err;


	err = rhashtable_insert_fast(&mask->ht,
	err = rhashtable_lookup_insert_fast(&mask->ht,
					    &fnew->ht_node,
					    &fnew->ht_node,
					    mask->filter_ht_params);
					    mask->filter_ht_params);
	if (err) {
	if (err) {
+20 −0
Original line number Original line Diff line number Diff line
@@ -58,5 +58,25 @@
            "$TC qdisc del dev $DEV2 ingress",
            "$TC qdisc del dev $DEV2 ingress",
            "/bin/rm $BATCH_FILE"
            "/bin/rm $BATCH_FILE"
        ]
        ]
    },
    {
        "id": "4cbd",
        "name": "Try to add filter with duplicate key",
        "category": [
            "filter",
            "flower"
        ],
        "setup": [
            "$TC qdisc add dev $DEV2 ingress",
            "$TC filter add dev $DEV2 protocol ip prio 1 parent ffff: flower dst_mac e4:11:22:11:4a:51 src_mac e4:11:22:11:4a:50 ip_proto tcp src_ip 1.1.1.1 dst_ip 2.2.2.2 action drop"
        ],
        "cmdUnderTest": "$TC filter add dev $DEV2 protocol ip prio 1 parent ffff: flower dst_mac e4:11:22:11:4a:51 src_mac e4:11:22:11:4a:50 ip_proto tcp src_ip 1.1.1.1 dst_ip 2.2.2.2 action drop",
        "expExitCode": "2",
        "verifyCmd": "$TC -s filter show dev $DEV2 ingress",
        "matchPattern": "filter protocol ip pref 1 flower chain 0 handle",
        "matchCount": "1",
        "teardown": [
            "$TC qdisc del dev $DEV2 ingress"
        ]
    }
    }
]
]