app/test: shorten execution time
[dpdk.git] / app / test / test_lpm6.c
index 8e21e75..9545982 100644 (file)
@@ -1,13 +1,13 @@
 /*-
  *   BSD LICENSE
- * 
- *   Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
+ *
+ *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
  *   All rights reserved.
- * 
+ *
  *   Redistribution and use in source and binary forms, with or without
  *   modification, are permitted provided that the following conditions
  *   are met:
- * 
+ *
  *     * Redistributions of source code must retain the above copyright
  *       notice, this list of conditions and the following disclaimer.
  *     * Redistributions in binary form must reproduce the above copyright
@@ -17,7 +17,7 @@
  *     * Neither the name of Intel Corporation nor the names of its
  *       contributors may be used to endorse or promote products derived
  *       from this software without specific prior written permission.
- * 
+ *
  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
+
 #include <stdio.h>
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
-#include <errno.h>
-#include <sys/queue.h>
-#include <cmdline_parse.h>
 
-#include <time.h>
-
-#include "test.h"
-
-#ifdef RTE_LIBRTE_LPM
-
-#include <rte_common.h>
-#include <rte_cycles.h>
 #include <rte_memory.h>
-#include <rte_random.h>
-#include <rte_branch_prediction.h>
-#include <rte_ip.h>
+#include <rte_lpm6.h>
 
-#include "rte_lpm6.h"
+#include "test.h"
 #include "test_lpm6_routes.h"
 
 #define TEST_LPM_ASSERT(cond) do {                                            \
@@ -91,7 +79,6 @@ static int32_t test24(void);
 static int32_t test25(void);
 static int32_t test26(void);
 static int32_t test27(void);
-static int32_t perf_test(void);
 
 rte_lpm6_test tests6[] = {
 /* Test Cases */
@@ -112,7 +99,7 @@ rte_lpm6_test tests6[] = {
        test14,
        test15,
        test16,
-       test17, 
+       test17,
        test18,
        test19,
        test20,
@@ -123,7 +110,6 @@ rte_lpm6_test tests6[] = {
        test25,
        test26,
        test27,
-       perf_test,
 };
 
 #define NUM_LPM6_TESTS                (sizeof(tests6)/sizeof(tests6[0]))
@@ -168,7 +154,7 @@ test0(void)
 {
        struct rte_lpm6 *lpm = NULL;
        struct rte_lpm6_config config;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -187,12 +173,12 @@ test0(void)
        config.max_rules = MAX_RULES;
        lpm = rte_lpm6_create(__func__, -2, &config);
        TEST_LPM_ASSERT(lpm == NULL);
-       
+
        /* rte_lpm6_create: number_tbl8s is bigger than the maximum */
        config.number_tbl8s = MAX_NUM_TBL8S + 1;
        lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config);
        TEST_LPM_ASSERT(lpm == NULL);
-       
+
        /* rte_lpm6_create: config = NULL */
        lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, NULL);
        TEST_LPM_ASSERT(lpm == NULL);
@@ -210,7 +196,7 @@ test1(void)
 {
        struct rte_lpm6 *lpm1 = NULL, *lpm2 = NULL, *lpm3 = NULL;
        struct rte_lpm6_config config;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -222,11 +208,11 @@ test1(void)
        /* rte_lpm6_create: lpm name == LPM2 */
        lpm2 = rte_lpm6_create("LPM2", SOCKET_ID_ANY, &config);
        TEST_LPM_ASSERT(lpm2 != NULL);
-       
+
        /* rte_lpm6_create: lpm name == LPM2 */
        lpm3 = rte_lpm6_create("LPM1", SOCKET_ID_ANY, &config);
-       TEST_LPM_ASSERT(lpm3 == lpm1);
-       
+       TEST_LPM_ASSERT(lpm3 == NULL);
+
        rte_lpm6_free(lpm1);
        rte_lpm6_free(lpm2);
 
@@ -234,7 +220,7 @@ test1(void)
 }
 
 /*
- * Create lpm table then delete lpm table 100 times
+ * Create lpm table then delete lpm table 20 times
  * Use a slightly different rules size each time
  */
 int32_t
@@ -243,12 +229,12 @@ test2(void)
        struct rte_lpm6 *lpm = NULL;
        struct rte_lpm6_config config;
        int32_t i;
-       
+
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
 
        /* rte_lpm6_free: Free NULL */
-       for (i = 0; i < 100; i++) {
+       for (i = 0; i < 20; i++) {
                config.max_rules = MAX_RULES - i;
                lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config);
                TEST_LPM_ASSERT(lpm != NULL);
@@ -271,11 +257,11 @@ test3(void)
 {
        struct rte_lpm6 *lpm = NULL;
        struct rte_lpm6_config config;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
-       
+
        lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config);
        TEST_LPM_ASSERT(lpm != NULL);
 
@@ -292,11 +278,11 @@ test4(void)
 {
        struct rte_lpm6 *lpm = NULL;
        struct rte_lpm6_config config;
-       
+
        uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
        uint8_t depth = 24, next_hop = 100;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -334,7 +320,7 @@ test5(void)
        uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
        uint8_t depth = 24;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -372,7 +358,7 @@ test6(void)
        uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
        uint8_t next_hop_return = 0;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -384,7 +370,7 @@ test6(void)
        /*Create vaild lpm to use in rest of test. */
        lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config);
        TEST_LPM_ASSERT(lpm != NULL);
-       
+
        /* rte_lpm6_lookup: ip = NULL */
        status = rte_lpm6_lookup(lpm, NULL, &next_hop_return);
        TEST_LPM_ASSERT(status < 0);
@@ -410,7 +396,7 @@ test7(void)
        uint8_t ip[10][16];
        int16_t next_hop_return[10];
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -422,7 +408,7 @@ test7(void)
        /*Create vaild lpm to use in rest of test. */
        lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config);
        TEST_LPM_ASSERT(lpm != NULL);
-       
+
        /* rte_lpm6_lookup: ip = NULL */
        status = rte_lpm6_lookup_bulk_func(lpm, NULL, next_hop_return, 10);
        TEST_LPM_ASSERT(status < 0);
@@ -448,7 +434,7 @@ test8(void)
        uint8_t ip[10][16];
        uint8_t depth[10];
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -460,7 +446,7 @@ test8(void)
        /*Create vaild lpm to use in rest of test. */
        lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config);
        TEST_LPM_ASSERT(lpm != NULL);
-       
+
        /* rte_lpm6_delete: ip = NULL */
        status = rte_lpm6_delete_bulk_func(lpm, NULL, depth, 10);
        TEST_LPM_ASSERT(status < 0);
@@ -488,7 +474,7 @@ test9(void)
        uint8_t depth = 16, next_hop_add = 100, next_hop_return = 0;
        int32_t status = 0;
        uint8_t i;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -498,16 +484,16 @@ test9(void)
 
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        for (i = 0; i < UINT8_MAX; i++) {
                ip[2] = i;
                status = rte_lpm6_lookup(lpm, ip, &next_hop_return);
                TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add));
        }
-       
+
        status = rte_lpm6_delete(lpm, ip, depth);
        TEST_LPM_ASSERT(status == 0);
-       
+
        for (i = 0; i < UINT8_MAX; i++) {
                ip[2] = i;
                status = rte_lpm6_lookup(lpm, ip, &next_hop_return);
@@ -532,14 +518,14 @@ test10(void)
        uint8_t depth, next_hop_add = 100;
        int32_t status = 0;
        int i;
-       
+
        config.max_rules = 127;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
 
        lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config);
        TEST_LPM_ASSERT(lpm != NULL);
-       
+
        for (i = 1; i < 128; i++) {
                depth = (uint8_t)i;
                status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
@@ -575,7 +561,7 @@ test11(void)
        uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
        uint8_t depth, next_hop_add = 100;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = 16;
        config.flags = 0;
@@ -586,33 +572,33 @@ test11(void)
        depth = 128;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        ip[0] = 1;
        depth = 25;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        status = rte_lpm6_delete(lpm, ip, depth);
        TEST_LPM_ASSERT(status == 0);
-       
+
        depth = 33;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        status = rte_lpm6_delete(lpm, ip, depth);
        TEST_LPM_ASSERT(status == 0);
-       
+
        depth = 41;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        status = rte_lpm6_delete(lpm, ip, depth);
        TEST_LPM_ASSERT(status == 0);
-       
+
        depth = 49;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == -ENOSPC);
-       
+
        depth = 41;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
@@ -635,7 +621,7 @@ test12(void)
        uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
        uint8_t depth, next_hop_add = 100;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = 16;
        config.flags = 0;
@@ -646,12 +632,12 @@ test12(void)
        depth = 128;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        ip[0] = 1;
        depth = 41;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        depth = 49;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == -ENOSPC);
@@ -673,7 +659,7 @@ test13(void)
        uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
        uint8_t depth, next_hop_add = 100;
        int32_t status = 0;
-       
+
        config.max_rules = 2;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -684,19 +670,19 @@ test13(void)
        depth = 1;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        depth = 2;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        depth = 3;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == -ENOSPC);
-       
+
        depth = 2;
        status = rte_lpm6_delete(lpm, ip, depth);
        TEST_LPM_ASSERT(status == 0);
-       
+
        depth = 3;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
@@ -707,7 +693,7 @@ test13(void)
 }
 
 /*
- * Add 2^16 routes with different first 16 bits and depth 25.
+ * Add 2^12 routes with different first 12 bits and depth 25.
  * Add one more route with the same depth and check that results in a failure.
  * After that delete the last rule and create the one that was attempted to be
  * created. This checks tbl8 exhaustion.
@@ -720,39 +706,33 @@ test14(void)
        uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
        uint8_t depth = 25, next_hop_add = 100;
        int32_t status = 0;
-       int i, j;
-       
+       int i;
+
        config.max_rules = MAX_RULES;
-       config.number_tbl8s = NUMBER_TBL8S;
+       config.number_tbl8s = 256;
        config.flags = 0;
 
        lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config);
        TEST_LPM_ASSERT(lpm != NULL);
-       
+
        for (i = 0; i < 256; i++) {
                ip[0] = (uint8_t)i;
-               for (j = 0; j < 256; j++) {
-                       ip[1] = (uint8_t)j;
-                       status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
-                       TEST_LPM_ASSERT(status == 0);
-               }
+               status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
+               TEST_LPM_ASSERT(status == 0);
        }
 
        ip[0] = 255;
-       ip[1] = 255;
-       ip[2] = 1;
+       ip[1] = 1;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == -ENOSPC);
 
        ip[0] = 255;
-       ip[1] = 255;
-       ip[2] = 0;      
+       ip[1] = 0;
        status = rte_lpm6_delete(lpm, ip, depth);
        TEST_LPM_ASSERT(status == 0);
 
        ip[0] = 255;
-       ip[1] = 255;
-       ip[2] = 1;
+       ip[1] = 1;
        status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
 
@@ -772,7 +752,7 @@ test15(void)
        uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
        uint8_t depth = 24, next_hop_add = 100, next_hop_return = 0;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -785,7 +765,7 @@ test15(void)
 
        status = rte_lpm6_lookup(lpm, ip, &next_hop_return);
        TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add));
-       
+
        status = rte_lpm6_delete(lpm, ip, depth);
        TEST_LPM_ASSERT(status == 0);
 
@@ -808,7 +788,7 @@ test16(void)
        uint8_t ip[] = {12,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0};
        uint8_t depth = 128, next_hop_add = 100, next_hop_return = 0;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -821,7 +801,7 @@ test16(void)
 
        status = rte_lpm6_lookup(lpm, ip, &next_hop_return);
        TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add));
-       
+
        status = rte_lpm6_delete(lpm, ip, depth);
        TEST_LPM_ASSERT(status == 0);
 
@@ -852,7 +832,7 @@ test17(void)
        uint8_t ip2[] = {128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
        uint8_t depth, next_hop_add, next_hop_return;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -861,7 +841,7 @@ test17(void)
        TEST_LPM_ASSERT(lpm != NULL);
 
        /* Loop with rte_lpm6_add. */
-       for (depth = 1; depth <= 128; depth++) {
+       for (depth = 1; depth <= 16; depth++) {
                /* Let the next_hop_add value = depth. Just for change. */
                next_hop_add = depth;
 
@@ -876,9 +856,9 @@ test17(void)
                TEST_LPM_ASSERT((status == 0) &&
                        (next_hop_return == next_hop_add));
        }
-       
+
        /* Loop with rte_lpm6_delete. */
-       for (depth = 128; depth >= 1; depth--) {
+       for (depth = 16; depth >= 1; depth--) {
                next_hop_add = (uint8_t) (depth - 1);
 
                status = rte_lpm6_delete(lpm, ip2, depth);
@@ -918,7 +898,7 @@ test18(void)
        uint8_t depth, depth_1, depth_2, next_hop_add, next_hop_add_1,
                next_hop_add_2, next_hop_return;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -936,7 +916,7 @@ test18(void)
 
        status = rte_lpm6_lookup(lpm, ip, &next_hop_return);
        TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add));
-       
+
        status = rte_lpm6_delete(lpm, ip, depth);
        TEST_LPM_ASSERT(status == 0);
 
@@ -964,7 +944,7 @@ test18(void)
 
        status = rte_lpm6_lookup(lpm, ip, &next_hop_return);
        TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add));
-       
+
        depth = 24;
 
        status = rte_lpm6_delete(lpm, ip, depth);
@@ -1009,7 +989,7 @@ test18(void)
 
        status = rte_lpm6_lookup(lpm, ip, &next_hop_return);
        TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add));
-       
+
        status = rte_lpm6_delete(lpm, ip, depth);
        TEST_LPM_ASSERT(status == 0);
 
@@ -1079,7 +1059,7 @@ test19(void)
        uint8_t ip[16];
        uint8_t depth, next_hop_add, next_hop_return;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -1171,7 +1151,7 @@ test19(void)
 
        rte_lpm6_delete_all(lpm);
 
-       /* 
+       /*
         * Add rule that updates the next hop in TBL24 & lookup
         * (& delete & lookup)
         */
@@ -1277,7 +1257,7 @@ test20(void)
        uint8_t ip[16];
        uint8_t depth, next_hop_add, next_hop_return;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -1345,7 +1325,7 @@ test21(void)
        uint8_t depth, next_hop_add;
        int16_t next_hop_return[4];
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -1359,23 +1339,23 @@ test21(void)
 
        status = rte_lpm6_add(lpm, ip_batch[0], depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        IPv6(ip_batch[1], 128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        depth = 48;
        next_hop_add = 101;
 
        status = rte_lpm6_add(lpm, ip_batch[1], depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        IPv6(ip_batch[2], 128, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        depth = 48;
        next_hop_add = 102;
 
        status = rte_lpm6_add(lpm, ip_batch[2], depth, next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        IPv6(ip_batch[3], 128, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-       
+
        status = rte_lpm6_lookup_bulk_func(lpm, ip_batch,
                        next_hop_return, 4);
        TEST_LPM_ASSERT(status == 0 && next_hop_return[0] == 100
@@ -1403,97 +1383,97 @@ test22(void)
        uint8_t depth[5], next_hop_add;
        int16_t next_hop_return[5];
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
 
        lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config);
        TEST_LPM_ASSERT(lpm != NULL);
-       
+
        /* Adds 5 rules and look them up */
-       
+
        IPv6(ip_batch[0], 128, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        depth[0] = 48;
        next_hop_add = 101;
 
        status = rte_lpm6_add(lpm, ip_batch[0], depth[0], next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        IPv6(ip_batch[1], 128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        depth[1] = 48;
        next_hop_add = 102;
 
        status = rte_lpm6_add(lpm, ip_batch[1], depth[1], next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        IPv6(ip_batch[2], 128, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        depth[2] = 48;
        next_hop_add = 103;
 
        status = rte_lpm6_add(lpm, ip_batch[2], depth[2], next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        IPv6(ip_batch[3], 128, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        depth[3] = 48;
        next_hop_add = 104;
 
        status = rte_lpm6_add(lpm, ip_batch[3], depth[3], next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        IPv6(ip_batch[4], 128, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        depth[4] = 48;
        next_hop_add = 105;
 
        status = rte_lpm6_add(lpm, ip_batch[4], depth[4], next_hop_add);
        TEST_LPM_ASSERT(status == 0);
-       
+
        status = rte_lpm6_lookup_bulk_func(lpm, ip_batch,
                        next_hop_return, 5);
        TEST_LPM_ASSERT(status == 0 && next_hop_return[0] == 101
                        && next_hop_return[1] == 102 && next_hop_return[2] == 103
                        && next_hop_return[3] == 104 && next_hop_return[4] == 105);
-                       
+
        /* Use the delete_bulk function to delete two of them. Lookup again */
-       
+
        status = rte_lpm6_delete_bulk_func(lpm, &ip_batch[0], depth, 2);
        TEST_LPM_ASSERT(status == 0);
-       
+
        status = rte_lpm6_lookup_bulk_func(lpm, ip_batch,
                        next_hop_return, 5);
        TEST_LPM_ASSERT(status == 0 && next_hop_return[0] == -1
                        && next_hop_return[1] == -1 && next_hop_return[2] == 103
                        && next_hop_return[3] == 104 && next_hop_return[4] == 105);
-                       
+
        /* Use the delete_bulk function to delete one more. Lookup again */
-       
+
        status = rte_lpm6_delete_bulk_func(lpm, &ip_batch[2], depth, 1);
        TEST_LPM_ASSERT(status == 0);
-       
+
        status = rte_lpm6_lookup_bulk_func(lpm, ip_batch,
                        next_hop_return, 5);
        TEST_LPM_ASSERT(status == 0 && next_hop_return[0] == -1
                        && next_hop_return[1] == -1 && next_hop_return[2] == -1
                        && next_hop_return[3] == 104 && next_hop_return[4] == 105);
-                       
+
        /* Use the delete_bulk function to delete two, one invalid. Lookup again */
-       
+
        IPv6(ip_batch[4], 128, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        status = rte_lpm6_delete_bulk_func(lpm, &ip_batch[3], depth, 2);
        TEST_LPM_ASSERT(status == 0);
-       
+
        IPv6(ip_batch[4], 128, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        status = rte_lpm6_lookup_bulk_func(lpm, ip_batch,
                        next_hop_return, 5);
        TEST_LPM_ASSERT(status == 0 && next_hop_return[0] == -1
                        && next_hop_return[1] == -1 && next_hop_return[2] == -1
                        && next_hop_return[3] == -1 && next_hop_return[4] == 105);
-                       
+
        /* Use the delete_bulk function to delete the remaining one. Lookup again */
-       
+
        status = rte_lpm6_delete_bulk_func(lpm, &ip_batch[4], depth, 1);
        TEST_LPM_ASSERT(status == 0);
-       
+
        status = rte_lpm6_lookup_bulk_func(lpm, ip_batch,
                        next_hop_return, 5);
        TEST_LPM_ASSERT(status == 0 && next_hop_return[0] == -1
@@ -1507,7 +1487,7 @@ test22(void)
 
 /*
  * Add an extended rule (i.e. depth greater than 24, lookup (hit), delete,
- * lookup (miss) in a for loop of 1000 times. This will check tbl8 extension
+ * lookup (miss) in a for loop of 30 times. This will check tbl8 extension
  * and contraction.
  */
 int32_t
@@ -1519,7 +1499,7 @@ test23(void)
        uint8_t ip[16];
        uint8_t depth, next_hop_add, next_hop_return;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -1531,7 +1511,7 @@ test23(void)
        depth = 128;
        next_hop_add = 100;
 
-       for (i = 0; i < 1000; i++) {
+       for (i = 0; i < 30; i++) {
                status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
                TEST_LPM_ASSERT(status == 0);
 
@@ -1563,7 +1543,7 @@ test24(void)
 {
        struct rte_lpm6 *lpm = NULL, *result = NULL;
        struct rte_lpm6_config config;
-       
+
        config.max_rules = 256 * 32;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -1603,7 +1583,7 @@ test25(void)
        uint32_t i;
        uint8_t depth, next_hop_add, next_hop_return, next_hop_expected;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -1618,11 +1598,11 @@ test25(void)
                status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
                TEST_LPM_ASSERT(status == 0);
        }
-       
+
        for (i = 0; i < 100000; i++) {
                memcpy(ip, large_ips_table[i].ip, 16);
                next_hop_expected = large_ips_table[i].next_hop;
-               
+
                status = rte_lpm6_lookup(lpm, ip, &next_hop_return);
                TEST_LPM_ASSERT((status == 0) &&
                                (next_hop_return == next_hop_expected));
@@ -1656,7 +1636,7 @@ test26(void)
        uint8_t next_hop_ip_20_25 = 111;
        uint8_t next_hop_return = 0;
        int32_t status = 0;
-       
+
        config.max_rules = MAX_RULES;
        config.number_tbl8s = NUMBER_TBL8S;
        config.flags = 0;
@@ -1741,7 +1721,7 @@ test27(void)
                next_hop_add = 128;
                status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
                TEST_LPM_ASSERT(status == 0);
-        
+
                depth = 112;
                next_hop_add = 112;
                status = rte_lpm6_add(lpm, ip, depth, next_hop_add);
@@ -1765,153 +1745,18 @@ test27(void)
 }
 
 /*
- * Lookup performance test
+ * Do all unit tests.
  */
-
-#define ITERATIONS (1 << 10)
-#define BATCH_SIZE 100000
-
-static void
-print_route_distribution(const struct rules_tbl_entry *table, uint32_t n)
-{
-       unsigned i, j;
-
-       printf("Route distribution per prefix width: \n");
-       printf("DEPTH    QUANTITY (PERCENT)\n");
-       printf("--------------------------- \n");
-
-       /* Count depths. */
-       for(i = 1; i <= 128; i++) {
-               unsigned depth_counter = 0;
-               double percent_hits;
-
-               for (j = 0; j < n; j++)
-                       if (table[j].depth == (uint8_t) i)
-                               depth_counter++;
-
-               percent_hits = ((double)depth_counter)/((double)n) * 100;
-               printf("%.2u%15u (%.2f)\n", i, depth_counter, percent_hits);
-       }
-       printf("\n");
-}
-
-int32_t
-perf_test(void)
-{
-       struct rte_lpm6 *lpm = NULL;
-       struct rte_lpm6_config config;
-       uint64_t begin, total_time;
-       unsigned i, j;
-       uint8_t next_hop_add = 0xAA, next_hop_return = 0;
-       int status = 0;
-       int64_t count = 0;
-       
-       config.max_rules = 1000000;
-       config.number_tbl8s = NUMBER_TBL8S;
-       config.flags = 0;
-
-       rte_srand(rte_rdtsc());
-
-       printf("No. routes = %u\n", (unsigned) NUM_ROUTE_ENTRIES);
-
-       print_route_distribution(large_route_table, (uint32_t) NUM_ROUTE_ENTRIES);
-
-       lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config);
-       TEST_LPM_ASSERT(lpm != NULL);
-
-       /* Measure add. */
-       begin = rte_rdtsc();
-
-       for (i = 0; i < NUM_ROUTE_ENTRIES; i++) {
-               if (rte_lpm6_add(lpm, large_route_table[i].ip,
-                               large_route_table[i].depth, next_hop_add) == 0)
-                       status++;
-       }
-       /* End Timer. */
-       total_time = rte_rdtsc() - begin;
-
-       printf("Unique added entries = %d\n", status);
-       printf("Average LPM Add: %g cycles\n",
-                       (double)total_time / NUM_ROUTE_ENTRIES);
-
-       /* Measure single Lookup */
-       total_time = 0;
-       count = 0;
-
-       for (i = 0; i < ITERATIONS; i ++) {
-               begin = rte_rdtsc();
-
-               for (j = 0; j < NUM_IPS_ENTRIES; j ++) {
-                       if (rte_lpm6_lookup(lpm, large_ips_table[j].ip,
-                                       &next_hop_return) != 0)
-                               count++;
-               }
-
-               total_time += rte_rdtsc() - begin;
-
-       }
-       printf("Average LPM Lookup: %.1f cycles (fails = %.1f%%)\n",
-                       (double)total_time / ((double)ITERATIONS * BATCH_SIZE),
-                       (count * 100.0) / (double)(ITERATIONS * BATCH_SIZE));
-                       
-       /* Measure bulk Lookup */
-       total_time = 0;
-       count = 0;
-       
-       uint8_t ip_batch[NUM_IPS_ENTRIES][16];
-       int16_t next_hops[NUM_IPS_ENTRIES];
-       
-       for (i = 0; i < NUM_IPS_ENTRIES; i++)
-               memcpy(ip_batch[i], large_ips_table[i].ip, 16);
-       
-       for (i = 0; i < ITERATIONS; i ++) {
-
-               /* Lookup per batch */
-               begin = rte_rdtsc();
-               rte_lpm6_lookup_bulk_func(lpm, ip_batch, next_hops, NUM_IPS_ENTRIES);
-               total_time += rte_rdtsc() - begin;
-               
-               for (j = 0; j < NUM_IPS_ENTRIES; j++)
-                       if (next_hops[j] < 0)
-                               count++;
-       }
-       printf("BULK LPM Lookup: %.1f cycles (fails = %.1f%%)\n",
-                       (double)total_time / ((double)ITERATIONS * BATCH_SIZE),
-                       (count * 100.0) / (double)(ITERATIONS * BATCH_SIZE));
-
-       /* Delete */
-       status = 0;
-       begin = rte_rdtsc();
-
-       for (i = 0; i < NUM_ROUTE_ENTRIES; i++) {
-               /* rte_lpm_delete(lpm, ip, depth) */
-               status += rte_lpm6_delete(lpm, large_route_table[i].ip,
-                               large_route_table[i].depth);
-       }
-
-       total_time += rte_rdtsc() - begin;
-
-       printf("Average LPM Delete: %g cycles\n",
-                       (double)total_time / NUM_ROUTE_ENTRIES);
-
-       rte_lpm6_delete_all(lpm);
-       rte_lpm6_free(lpm);
-
-       return PASS;
-}
-
-/*
- * Do all unit and performance tests.
- */
-int
+static int
 test_lpm6(void)
 {
        unsigned i;
        int status = -1, global_status = 0;
 
        for (i = 0; i < NUM_LPM6_TESTS; i++) {
+               printf("# test %02d\n", i);
                status = tests6[i]();
-                       
+
                if (status < 0) {
                        printf("ERROR: LPM Test %s: FAIL\n", RTE_STR(tests6[i]));
                        global_status = status;
@@ -1921,13 +1766,8 @@ test_lpm6(void)
        return global_status;
 }
 
-#else /* RTE_LIBRTE_LPM */
-
-int
-test_lpm6(void)
-{
-        printf("The LPM library is not included in this build\n");
-        return 0;
-}
-
-#endif /* RTE_LIBRTE_LPM */
+static struct test_command lpm6_cmd = {
+       .command = "lpm6_autotest",
+       .callback = test_lpm6,
+};
+REGISTER_TEST_COMMAND(lpm6_cmd);