test/acl: expand classify test coverage
authorKonstantin Ananyev <konstantin.ananyev@intel.com>
Tue, 6 Oct 2020 15:03:08 +0000 (16:03 +0100)
committerDavid Marchand <david.marchand@redhat.com>
Wed, 14 Oct 2020 12:23:00 +0000 (14:23 +0200)
Make classify test to run for all supported methods.

Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
app/test/test_acl.c

index 316bf4d..aea129e 100644 (file)
@@ -266,22 +266,20 @@ rte_acl_ipv4vlan_build(struct rte_acl_ctx *ctx,
 }
 
 /*
- * Test scalar and SSE ACL lookup.
+ * Test ACL lookup (selected alg).
  */
 static int
-test_classify_run(struct rte_acl_ctx *acx, struct ipv4_7tuple test_data[],
-       size_t dim)
+test_classify_alg(struct rte_acl_ctx *acx, struct ipv4_7tuple test_data[],
+       const uint8_t *data[], size_t dim, enum rte_acl_classify_alg alg)
 {
-       int ret, i;
-       uint32_t result, count;
+       int32_t ret;
+       uint32_t i, result, count;
        uint32_t results[dim * RTE_ACL_MAX_CATEGORIES];
-       const uint8_t *data[dim];
-       /* swap all bytes in the data to network order */
-       bswap_test_data(test_data, dim, 1);
 
-       /* store pointers to test data */
-       for (i = 0; i < (int) dim; i++)
-               data[i] = (uint8_t *)&test_data[i];
+       /* set given classify alg, skip test if alg is not supported */
+       ret = rte_acl_set_ctx_classify(acx, alg);
+       if (ret != 0)
+               return (ret == -ENOTSUP) ? 0 : ret;
 
        /**
         * these will run quite a few times, it's necessary to test code paths
@@ -291,12 +289,13 @@ test_classify_run(struct rte_acl_ctx *acx, struct ipv4_7tuple test_data[],
                ret = rte_acl_classify(acx, data, results,
                                count, RTE_ACL_MAX_CATEGORIES);
                if (ret != 0) {
-                       printf("Line %i: SSE classify failed!\n", __LINE__);
-                       goto err;
+                       printf("Line %i: classify(alg=%d) failed!\n",
+                               __LINE__, alg);
+                       return ret;
                }
 
                /* check if we allow everything we should allow */
-               for (i = 0; i < (int) count; i++) {
+               for (i = 0; i < count; i++) {
                        result =
                                results[i * RTE_ACL_MAX_CATEGORIES + ACL_ALLOW];
                        if (result != test_data[i].allow) {
@@ -304,63 +303,63 @@ test_classify_run(struct rte_acl_ctx *acx, struct ipv4_7tuple test_data[],
                                        "(expected %"PRIu32" got %"PRIu32")!\n",
                                        __LINE__, i, test_data[i].allow,
                                        result);
-                               ret = -EINVAL;
-                               goto err;
+                               return -EINVAL;
                        }
                }
 
                /* check if we deny everything we should deny */
-               for (i = 0; i < (int) count; i++) {
+               for (i = 0; i < count; i++) {
                        result = results[i * RTE_ACL_MAX_CATEGORIES + ACL_DENY];
                        if (result != test_data[i].deny) {
                                printf("Line %i: Error in deny results at %i "
                                        "(expected %"PRIu32" got %"PRIu32")!\n",
                                        __LINE__, i, test_data[i].deny,
                                        result);
-                               ret = -EINVAL;
-                               goto err;
+                               return -EINVAL;
                        }
                }
        }
 
-       /* make a quick check for scalar */
-       ret = rte_acl_classify_alg(acx, data, results,
-                       dim, RTE_ACL_MAX_CATEGORIES,
-                       RTE_ACL_CLASSIFY_SCALAR);
-       if (ret != 0) {
-               printf("Line %i: scalar classify failed!\n", __LINE__);
-               goto err;
-       }
+       /* restore default classify alg */
+       return rte_acl_set_ctx_classify(acx, RTE_ACL_CLASSIFY_DEFAULT);
+}
 
-       /* check if we allow everything we should allow */
-       for (i = 0; i < (int) dim; i++) {
-               result = results[i * RTE_ACL_MAX_CATEGORIES + ACL_ALLOW];
-               if (result != test_data[i].allow) {
-                       printf("Line %i: Error in allow results at %i "
-                                       "(expected %"PRIu32" got %"PRIu32")!\n",
-                                       __LINE__, i, test_data[i].allow,
-                                       result);
-                       ret = -EINVAL;
-                       goto err;
-               }
-       }
+/*
+ * Test ACL lookup (all possible methods).
+ */
+static int
+test_classify_run(struct rte_acl_ctx *acx, struct ipv4_7tuple test_data[],
+       size_t dim)
+{
+       int32_t ret;
+       uint32_t i;
+       const uint8_t *data[dim];
 
-       /* check if we deny everything we should deny */
-       for (i = 0; i < (int) dim; i++) {
-               result = results[i * RTE_ACL_MAX_CATEGORIES + ACL_DENY];
-               if (result != test_data[i].deny) {
-                       printf("Line %i: Error in deny results at %i "
-                                       "(expected %"PRIu32" got %"PRIu32")!\n",
-                                       __LINE__, i, test_data[i].deny,
-                                       result);
-                       ret = -EINVAL;
-                       goto err;
-               }
-       }
+       static const enum rte_acl_classify_alg alg[] = {
+               RTE_ACL_CLASSIFY_SCALAR,
+               RTE_ACL_CLASSIFY_SSE,
+               RTE_ACL_CLASSIFY_AVX2,
+               RTE_ACL_CLASSIFY_NEON,
+               RTE_ACL_CLASSIFY_ALTIVEC,
+       };
+
+       /* swap all bytes in the data to network order */
+       bswap_test_data(test_data, dim, 1);
+
+       /* store pointers to test data */
+       for (i = 0; i < dim; i++)
+               data[i] = (uint8_t *)&test_data[i];
 
        ret = 0;
+       for (i = 0; i != RTE_DIM(alg); i++) {
+               ret = test_classify_alg(acx, test_data, data, dim, alg[i]);
+               if (ret < 0) {
+                       printf("Line %i: %s() for alg=%d failed, errno=%d\n",
+                               __LINE__, __func__, alg[i], -ret);
+                       break;
+               }
+       }
 
-err:
        /* swap data back to cpu order so that next time tests don't fail */
        bswap_test_data(test_data, dim, 0);
        return ret;