get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/11286/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 11286,
    "url": "http://patches.dpdk.org/api/patches/11286/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1457527410-8428-1-git-send-email-michalx.k.jastrzebski@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1457527410-8428-1-git-send-email-michalx.k.jastrzebski@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1457527410-8428-1-git-send-email-michalx.k.jastrzebski@intel.com",
    "date": "2016-03-09T12:43:30",
    "name": "[dpdk-dev,v2] lpm: added a new rte_lpm_config structure for ipv4",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "e1736f840ff09b98c665a4ee544b2dfd14c10ecc",
    "submitter": {
        "id": 74,
        "url": "http://patches.dpdk.org/api/people/74/?format=api",
        "name": "Michal Jastrzebski",
        "email": "michalx.k.jastrzebski@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1457527410-8428-1-git-send-email-michalx.k.jastrzebski@intel.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/11286/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/11286/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id A59692BC9;\n\tWed,  9 Mar 2016 13:44:21 +0100 (CET)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n\tby dpdk.org (Postfix) with ESMTP id E13632BB4\n\tfor <dev@dpdk.org>; Wed,  9 Mar 2016 13:44:18 +0100 (CET)",
            "from orsmga002.jf.intel.com ([10.7.209.21])\n\tby orsmga102.jf.intel.com with ESMTP; 09 Mar 2016 04:44:18 -0800",
            "from unknown (HELO Sent) ([10.217.248.146])\n\tby orsmga002.jf.intel.com with SMTP; 09 Mar 2016 04:44:15 -0800",
            "by Sent (sSMTP sendmail emulation); Wed, 09 Mar 2016 13:43:33 +0100"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.24,311,1455004800\"; d=\"scan'208\";a=\"930115104\"",
        "From": "Michal Jastrzebski <michalx.k.jastrzebski@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Wed,  9 Mar 2016 13:43:30 +0100",
        "Message-Id": "<1457527410-8428-1-git-send-email-michalx.k.jastrzebski@intel.com>",
        "X-Mailer": "git-send-email 2.7.0",
        "In-Reply-To": "<1457470648-26415-1-git-send-email-michalx.kobylinski@intel.com>",
        "References": "<1457470648-26415-1-git-send-email-michalx.kobylinski@intel.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v2] lpm: added a new rte_lpm_config structure for\n\tipv4",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Michal Kobylinski <michalx.kobylinski@intel.com>\n\nThis patch depends on: lpm: extended ipv4 next_hop field (v4).  \n\nA new rte_lpm_config structure is used so LPM library will allocate\nexactly the amount of memory which is necessary to hold application’s\nrules.\n\nSigned-off-by: Michal Kobylinski <michalx.kobylinski@intel.com>\nAcked-by: David Hunt <david.hunt@intel.com>\n---\n app/test/test_func_reentrancy.c                 |   9 +-\n app/test/test_lpm.c                             | 145 ++++++++++++++++++++----\n app/test/test_mp_secondary.c                    |   7 +-\n app/test/test_table_combined.c                  |   2 +\n app/test/test_table_tables.c                    |   2 +\n doc/guides/rel_notes/release_16_04.rst          |   5 +\n examples/ip_fragmentation/main.c                |   7 +-\n examples/ip_reassembly/main.c                   |   7 +-\n examples/l3fwd-power/main.c                     |  10 +-\n examples/l3fwd-vf/main.c                        |  10 +-\n examples/l3fwd/l3fwd_lpm.c                      |   9 +-\n examples/load_balancer/init.c                   |   8 +-\n examples/performance-thread/l3fwd-thread/main.c |   8 +-\n lib/librte_lpm/rte_lpm.c                        |  51 ++++++---\n lib/librte_lpm/rte_lpm.h                        |  23 +++-\n lib/librte_table/rte_table_lpm.c                |  12 +-\n lib/librte_table/rte_table_lpm.h                |   6 +\n 17 files changed, 262 insertions(+), 59 deletions(-)",
    "diff": "diff --git a/app/test/test_func_reentrancy.c b/app/test/test_func_reentrancy.c\nindex dbecc52..5d09296 100644\n--- a/app/test/test_func_reentrancy.c\n+++ b/app/test/test_func_reentrancy.c\n@@ -359,6 +359,11 @@ lpm_create_free(__attribute__((unused)) void *arg)\n {\n \tunsigned lcore_self = rte_lcore_id();\n \tstruct rte_lpm *lpm;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = 4;\n+\tconfig.number_tbl8s = 256;\n+\tconfig.flags = 0;\n \tchar lpm_name[MAX_STRING_SIZE];\n \tint i;\n \n@@ -366,7 +371,7 @@ lpm_create_free(__attribute__((unused)) void *arg)\n \n \t/* create the same lpm simultaneously on all threads */\n \tfor (i = 0; i < MAX_ITER_TIMES; i++) {\n-\t\tlpm = rte_lpm_create(\"fr_test_once\",  SOCKET_ID_ANY, 4, 0);\n+\t\tlpm = rte_lpm_create(\"fr_test_once\",  SOCKET_ID_ANY, &config);\n \t\tif ((NULL == lpm) && (rte_lpm_find_existing(\"fr_test_once\") == NULL))\n \t\t\treturn -1;\n \t}\n@@ -374,7 +379,7 @@ lpm_create_free(__attribute__((unused)) void *arg)\n \t/* create mutiple fbk tables simultaneously */\n \tfor (i = 0; i < MAX_LPM_ITER_TIMES; i++) {\n \t\tsnprintf(lpm_name, sizeof(lpm_name), \"fr_test_%d_%d\", lcore_self, i);\n-\t\tlpm = rte_lpm_create(lpm_name, SOCKET_ID_ANY, 4, 0);\n+\t\tlpm = rte_lpm_create(lpm_name, SOCKET_ID_ANY, &config);\n \t\tif (NULL == lpm)\n \t\t\treturn -1;\n \ndiff --git a/app/test/test_lpm.c b/app/test/test_lpm.c\nindex f367553..aaf95ec 100644\n--- a/app/test/test_lpm.c\n+++ b/app/test/test_lpm.c\n@@ -105,6 +105,7 @@ rte_lpm_test tests[] = {\n #define NUM_LPM_TESTS (sizeof(tests)/sizeof(tests[0]))\n #define MAX_DEPTH 32\n #define MAX_RULES 256\n+#define NUMBER_TBL8S 256\n #define PASS 0\n \n /*\n@@ -115,18 +116,25 @@ int32_t\n test0(void)\n {\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \n \t/* rte_lpm_create: lpm name == NULL */\n-\tlpm = rte_lpm_create(NULL, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(NULL, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm == NULL);\n \n \t/* rte_lpm_create: max_rules = 0 */\n \t/* Note: __func__ inserts the function name, in this case \"test0\". */\n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, 0, 0);\n+\tconfig.max_rules = 0;\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm == NULL);\n \n \t/* socket_id < -1 is invalid */\n-\tlpm = rte_lpm_create(__func__, -2, MAX_RULES, 0);\n+\tconfig.max_rules = MAX_RULES;\n+\tlpm = rte_lpm_create(__func__, -2, &config);\n \tTEST_LPM_ASSERT(lpm == NULL);\n \n \treturn PASS;\n@@ -140,11 +148,16 @@ int32_t\n test1(void)\n {\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tint32_t i;\n \n \t/* rte_lpm_free: Free NULL */\n \tfor (i = 0; i < 100; i++) {\n-\t\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES - i, 0);\n+\t\tconfig.max_rules = MAX_RULES - i;\n+\t\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \t\tTEST_LPM_ASSERT(lpm != NULL);\n \n \t\trte_lpm_free(lpm);\n@@ -164,8 +177,13 @@ int32_t\n test2(void)\n {\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \trte_lpm_free(lpm);\n@@ -180,6 +198,11 @@ int32_t\n test3(void)\n {\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tuint32_t ip = IPv4(0, 0, 0, 0), next_hop = 100;\n \tuint8_t depth = 24;\n \tint32_t status = 0;\n@@ -189,7 +212,7 @@ test3(void)\n \tTEST_LPM_ASSERT(status < 0);\n \n \t/*Create vaild lpm to use in rest of test. */\n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \t/* rte_lpm_add: depth < 1 */\n@@ -213,6 +236,11 @@ int32_t\n test4(void)\n {\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tuint32_t ip = IPv4(0, 0, 0, 0);\n \tuint8_t depth = 24;\n \tint32_t status = 0;\n@@ -222,7 +250,7 @@ test4(void)\n \tTEST_LPM_ASSERT(status < 0);\n \n \t/*Create vaild lpm to use in rest of test. */\n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \t/* rte_lpm_delete: depth < 1 */\n@@ -247,6 +275,11 @@ test5(void)\n {\n #if defined(RTE_LIBRTE_LPM_DEBUG)\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tuint32_t ip = IPv4(0, 0, 0, 0), next_hop_return = 0;\n \tint32_t status = 0;\n \n@@ -255,7 +288,7 @@ test5(void)\n \tTEST_LPM_ASSERT(status < 0);\n \n \t/*Create vaild lpm to use in rest of test. */\n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \t/* rte_lpm_lookup: depth < 1 */\n@@ -276,11 +309,16 @@ int32_t\n test6(void)\n {\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tuint32_t ip = IPv4(0, 0, 0, 0), next_hop_add = 100, next_hop_return = 0;\n \tuint8_t depth = 24;\n \tint32_t status = 0;\n \n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \tstatus = rte_lpm_add(lpm, ip, depth, next_hop_add);\n@@ -310,11 +348,16 @@ test7(void)\n \t__m128i ipx4;\n \tuint32_t hop[4];\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tuint32_t ip = IPv4(0, 0, 0, 0), next_hop_add = 100, next_hop_return = 0;\n \tuint8_t depth = 32;\n \tint32_t status = 0;\n \n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \tstatus = rte_lpm_add(lpm, ip, depth, next_hop_add);\n@@ -356,12 +399,17 @@ test8(void)\n \t__m128i ipx4;\n \tuint32_t hop[4];\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tuint32_t ip1 = IPv4(127, 255, 255, 255), ip2 = IPv4(128, 0, 0, 0);\n \tuint32_t next_hop_add, next_hop_return;\n \tuint8_t depth;\n \tint32_t status = 0;\n \n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \t/* Loop with rte_lpm_add. */\n@@ -436,6 +484,11 @@ int32_t\n test9(void)\n {\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tuint32_t ip, ip_1, ip_2;\n \tuint8_t depth, depth_1, depth_2;\n \tuint32_t next_hop_add, next_hop_add_1, next_hop_add_2, next_hop_return;\n@@ -446,7 +499,7 @@ test9(void)\n \tdepth = 24;\n \tnext_hop_add = 100;\n \n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \tstatus = rte_lpm_add(lpm, ip, depth, next_hop_add);\n@@ -600,13 +653,18 @@ test10(void)\n {\n \n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tuint32_t ip, next_hop_add, next_hop_return;\n \tuint8_t depth;\n \tint32_t status = 0;\n \n \t/* Add rule that covers a TBL24 range previously invalid & lookup\n \t * (& delete & lookup) */\n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \tip = IPv4(128, 0, 0, 0);\n@@ -786,11 +844,16 @@ test11(void)\n {\n \n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tuint32_t ip, next_hop_add, next_hop_return;\n \tuint8_t depth;\n \tint32_t status = 0;\n \n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \tip = IPv4(128, 0, 0, 0);\n@@ -852,11 +915,16 @@ test12(void)\n \t__m128i ipx4;\n \tuint32_t hop[4];\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tuint32_t ip, i, next_hop_add, next_hop_return;\n \tuint8_t depth;\n \tint32_t status = 0;\n \n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \tip = IPv4(128, 0, 0, 0);\n@@ -902,11 +970,16 @@ int32_t\n test13(void)\n {\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tuint32_t ip, i, next_hop_add_1, next_hop_add_2, next_hop_return;\n \tuint8_t depth;\n \tint32_t status = 0;\n \n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \tip = IPv4(128, 0, 0, 0);\n@@ -964,12 +1037,17 @@ test14(void)\n \t * that we have enough storage for all rules at that depth*/\n \n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = 256 * 32;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tuint32_t ip, next_hop_add, next_hop_return;\n \tuint8_t depth;\n \tint32_t status = 0;\n \n \t/* Add enough space for 256 rules for every depth */\n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, 256 * 32, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \tdepth = 32;\n@@ -1011,9 +1089,14 @@ int32_t\n test15(void)\n {\n \tstruct rte_lpm *lpm = NULL, *result = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = 256 * 32;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \n \t/* Create lpm  */\n-\tlpm = rte_lpm_create(\"lpm_find_existing\", SOCKET_ID_ANY, 256 * 32, 0);\n+\tlpm = rte_lpm_create(\"lpm_find_existing\", SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \t/* Try to find existing lpm */\n@@ -1039,8 +1122,12 @@ int32_t\n test16(void)\n {\n \tuint32_t ip;\n-\tstruct rte_lpm *lpm = rte_lpm_create(__func__, SOCKET_ID_ANY,\n-\t\t\t256 * 32, 0);\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = 256 * 32;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n+\tstruct rte_lpm *lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \n \t/* ip loops through all possibilities for top 24 bits of address */\n \tfor (ip = 0; ip < 0xFFFFFF; ip++) {\n@@ -1050,10 +1137,10 @@ test16(void)\n \t\t\tbreak;\n \t}\n \n-\tif (ip != RTE_LPM_TBL8_NUM_GROUPS) {\n+\tif (ip != NUMBER_TBL8S) {\n \t\tprintf(\"Error, unexpected failure with filling tbl8 groups\\n\");\n \t\tprintf(\"Failed after %u additions, expected after %u\\n\",\n-\t\t\t\t(unsigned)ip, (unsigned)RTE_LPM_TBL8_NUM_GROUPS);\n+\t\t\t\t(unsigned)ip, (unsigned)NUMBER_TBL8S);\n \t}\n \n \trte_lpm_free(lpm);\n@@ -1071,6 +1158,11 @@ int32_t\n test17(void)\n {\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = MAX_RULES;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tconst uint32_t ip_10_32 = IPv4(10, 10, 10, 2);\n \tconst uint32_t ip_10_24 = IPv4(10, 10, 10, 0);\n \tconst uint32_t ip_20_25 = IPv4(10, 10, 20, 2);\n@@ -1083,7 +1175,7 @@ test17(void)\n \tuint32_t next_hop_return = 0;\n \tint32_t status = 0;\n \n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \tif ((status = rte_lpm_add(lpm, ip_10_32, d_ip_10_32,\n@@ -1172,6 +1264,11 @@ int32_t\n perf_test(void)\n {\n \tstruct rte_lpm *lpm = NULL;\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = 1000000;\n+\tconfig.number_tbl8s = NUMBER_TBL8S;\n+\tconfig.flags = 0;\n \tuint64_t begin, total_time, lpm_used_entries = 0;\n \tunsigned i, j;\n \tuint32_t next_hop_add = 0xAA, next_hop_return = 0;\n@@ -1185,7 +1282,7 @@ perf_test(void)\n \n \tprint_route_distribution(large_route_table, (uint32_t) NUM_ROUTE_ENTRIES);\n \n-\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, 1000000, 0);\n+\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n \tTEST_LPM_ASSERT(lpm != NULL);\n \n \t/* Measue add. */\ndiff --git a/app/test/test_mp_secondary.c b/app/test/test_mp_secondary.c\nindex 2f941b5..4dfe418 100644\n--- a/app/test/test_mp_secondary.c\n+++ b/app/test/test_mp_secondary.c\n@@ -232,7 +232,12 @@ run_object_creation_tests(void)\n \n #ifdef RTE_LIBRTE_LPM\n \trte_errno=0;\n-\tif ((rte_lpm_create(\"test_lpm\", size, rte_socket_id(), 0) != NULL) &&\n+\tstruct rte_lpm_config config;\n+\n+\tconfig.max_rules = rte_socket_id();\n+\tconfig.number_tbl8s = 256;\n+\tconfig.flags = 0;\n+\tif ((rte_lpm_create(\"test_lpm\", size, &config) != NULL) &&\n \t    (rte_lpm_find_existing(\"test_lpm\") == NULL)){\n \t\tprintf(\"Error: unexpected return value from rte_lpm_create()\\n\");\n \t\treturn -1;\ndiff --git a/app/test/test_table_combined.c b/app/test/test_table_combined.c\nindex 8bf4aeb..acb4f4d 100644\n--- a/app/test/test_table_combined.c\n+++ b/app/test/test_table_combined.c\n@@ -295,6 +295,8 @@ test_table_lpm_combined(void)\n \tstruct rte_table_lpm_params lpm_params = {\n \t\t.name = \"LPM\",\n \t\t.n_rules = 1 << 16,\n+\t\t.number_tbl8s = 1 << 8,\n+\t\t.flags = 0,\n \t\t.entry_unique_size = 8,\n \t\t.offset = APP_METADATA_OFFSET(0),\n \t};\ndiff --git a/app/test/test_table_tables.c b/app/test/test_table_tables.c\nindex b6364c4..cbbbfc1 100644\n--- a/app/test/test_table_tables.c\n+++ b/app/test/test_table_tables.c\n@@ -326,6 +326,8 @@ test_table_lpm(void)\n \tstruct rte_table_lpm_params lpm_params = {\n \t\t.name = \"LPM\",\n \t\t.n_rules = 1 << 24,\n+\t\t.number_tbl8s = 1 << 8,\n+\t\t.flags = 0,\n \t\t.entry_unique_size = entry_size,\n \t\t.offset = APP_METADATA_OFFSET(1)\n \t};\ndiff --git a/doc/guides/rel_notes/release_16_04.rst b/doc/guides/rel_notes/release_16_04.rst\nindex 6f62dd8..79474ce 100644\n--- a/doc/guides/rel_notes/release_16_04.rst\n+++ b/doc/guides/rel_notes/release_16_04.rst\n@@ -108,6 +108,11 @@ Libraries\n \n   Extended next_hop field from 8-bits to 24-bits for IPv4.\n \n+* **librte_lpm: Added a new rte_lpm_config structure for IPv4.**\n+\n+  A new rte_lpm_config structure is used so LPM library will allocate exactly\n+  the amount of memory which is necessary to hold application’s rules.\n+\n Examples\n ~~~~~~~~\n \ndiff --git a/examples/ip_fragmentation/main.c b/examples/ip_fragmentation/main.c\nindex 0302b2c..8021702 100644\n--- a/examples/ip_fragmentation/main.c\n+++ b/examples/ip_fragmentation/main.c\n@@ -721,6 +721,7 @@ init_mem(void)\n \tstruct rte_mempool *mp;\n \tstruct rte_lpm *lpm;\n \tstruct rte_lpm6 *lpm6;\n+\tstruct rte_lpm_config lpm_config;\n \tint socket;\n \tunsigned lcore_id;\n \n@@ -768,7 +769,11 @@ init_mem(void)\n \t\t\tRTE_LOG(INFO, IP_FRAG, \"Creating LPM table on socket %i\\n\", socket);\n \t\t\tsnprintf(buf, sizeof(buf), \"IP_FRAG_LPM_%i\", socket);\n \n-\t\t\tlpm = rte_lpm_create(buf, socket, LPM_MAX_RULES, 0);\n+\t\t\tlpm_config.max_rules = LPM_MAX_RULES;\n+\t\t\tlpm_config.number_tbl8s = 256;\n+\t\t\tlpm_config.flags = 0;\n+\n+\t\t\tlpm = rte_lpm_create(buf, socket, &lpm_config);\n \t\t\tif (lpm == NULL) {\n \t\t\t\tRTE_LOG(ERR, IP_FRAG, \"Cannot create LPM table\\n\");\n \t\t\t\treturn -1;\ndiff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c\nindex 6f48748..19ec46c 100644\n--- a/examples/ip_reassembly/main.c\n+++ b/examples/ip_reassembly/main.c\n@@ -927,6 +927,7 @@ init_mem(void)\n \tchar buf[PATH_MAX];\n \tstruct rte_lpm *lpm;\n \tstruct rte_lpm6 *lpm6;\n+\tstruct rte_lpm_config lpm_config;\n \tint socket;\n \tunsigned lcore_id;\n \n@@ -946,7 +947,11 @@ init_mem(void)\n \t\t\tRTE_LOG(INFO, IP_RSMBL, \"Creating LPM table on socket %i\\n\", socket);\n \t\t\tsnprintf(buf, sizeof(buf), \"IP_RSMBL_LPM_%i\", socket);\n \n-\t\t\tlpm = rte_lpm_create(buf, socket, LPM_MAX_RULES, 0);\n+\t\t\tlpm_config.max_rules = LPM_MAX_RULES;\n+\t\t\tlpm_config.number_tbl8s = 256;\n+\t\t\tlpm_config.flags = 0;\n+\n+\t\t\tlpm = rte_lpm_create(buf, socket, &lpm_config);\n \t\t\tif (lpm == NULL) {\n \t\t\t\tRTE_LOG(ERR, IP_RSMBL, \"Cannot create LPM table\\n\");\n \t\t\t\treturn -1;\ndiff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c\nindex a478583..f8a2f1b 100644\n--- a/examples/l3fwd-power/main.c\n+++ b/examples/l3fwd-power/main.c\n@@ -1430,9 +1430,15 @@ setup_lpm(int socketid)\n \tchar s[64];\n \n \t/* create the LPM table */\n+\tstruct rte_lpm_config lpm_ipv4_config;\n+\n+\tlpm_ipv4_config.max_rules = IPV4_L3FWD_LPM_MAX_RULES;\n+\tlpm_ipv4_config.number_tbl8s = 256;\n+\tlpm_ipv4_config.flags = 0;\n+\n \tsnprintf(s, sizeof(s), \"IPV4_L3FWD_LPM_%d\", socketid);\n-\tipv4_l3fwd_lookup_struct[socketid] = rte_lpm_create(s, socketid,\n-\t\t\t\tIPV4_L3FWD_LPM_MAX_RULES, 0);\n+\tipv4_l3fwd_lookup_struct[socketid] =\n+\t\t\trte_lpm_create(s, socketid, &lpm_ipv4_config);\n \tif (ipv4_l3fwd_lookup_struct[socketid] == NULL)\n \t\trte_exit(EXIT_FAILURE, \"Unable to create the l3fwd LPM table\"\n \t\t\t\t\" on socket %d\\n\", socketid);\ndiff --git a/examples/l3fwd-vf/main.c b/examples/l3fwd-vf/main.c\nindex 193c3ab..034c22a 100644\n--- a/examples/l3fwd-vf/main.c\n+++ b/examples/l3fwd-vf/main.c\n@@ -869,10 +869,16 @@ setup_lpm(int socketid)\n \tint ret;\n \tchar s[64];\n \n+\tstruct rte_lpm_config lpm_ipv4_config;\n+\n+\tlpm_ipv4_config.max_rules = L3FWD_LPM_MAX_RULES;\n+\tlpm_ipv4_config.number_tbl8s = 256;\n+\tlpm_ipv4_config.flags = 0;\n+\n \t/* create the LPM table */\n \tsnprintf(s, sizeof(s), \"L3FWD_LPM_%d\", socketid);\n-\tl3fwd_lookup_struct[socketid] = rte_lpm_create(s, socketid,\n-\t\t\t\tL3FWD_LPM_MAX_RULES, 0);\n+\tl3fwd_lookup_struct[socketid] =\n+\t\t\trte_lpm_create(s, socketid, &lpm_ipv4_config);\n \tif (l3fwd_lookup_struct[socketid] == NULL)\n \t\trte_exit(EXIT_FAILURE, \"Unable to create the l3fwd LPM table\"\n \t\t\t\t\" on socket %d\\n\", socketid);\ndiff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c\nindex e0ed3c4..a354797 100644\n--- a/examples/l3fwd/l3fwd_lpm.c\n+++ b/examples/l3fwd/l3fwd_lpm.c\n@@ -98,6 +98,7 @@ static struct ipv6_l3fwd_lpm_route ipv6_l3fwd_lpm_route_array[] = {\n \t(sizeof(ipv6_l3fwd_lpm_route_array) / sizeof(ipv6_l3fwd_lpm_route_array[0]))\n \n #define IPV4_L3FWD_LPM_MAX_RULES         1024\n+#define IPV4_L3FWD_LPM_NUMBER_TBL8S (1 << 8)\n #define IPV6_L3FWD_LPM_MAX_RULES         1024\n #define IPV6_L3FWD_LPM_NUMBER_TBL8S (1 << 16)\n \n@@ -203,14 +204,18 @@ void\n setup_lpm(const int socketid)\n {\n \tstruct rte_lpm6_config config;\n+\tstruct rte_lpm_config config_ipv4;\n \tunsigned i;\n \tint ret;\n \tchar s[64];\n \n \t/* create the LPM table */\n+\tconfig_ipv4.max_rules = IPV4_L3FWD_LPM_MAX_RULES;\n+\tconfig_ipv4.number_tbl8s = IPV4_L3FWD_LPM_NUMBER_TBL8S;\n+\tconfig_ipv4.flags = 0;\n \tsnprintf(s, sizeof(s), \"IPV4_L3FWD_LPM_%d\", socketid);\n-\tipv4_l3fwd_lpm_lookup_struct[socketid] = rte_lpm_create(s, socketid,\n-\t\t\t\tIPV4_L3FWD_LPM_MAX_RULES, 0);\n+\tipv4_l3fwd_lpm_lookup_struct[socketid] =\n+\t\t\trte_lpm_create(s, socketid, &config_ipv4);\n \tif (ipv4_l3fwd_lpm_lookup_struct[socketid] == NULL)\n \t\trte_exit(EXIT_FAILURE,\n \t\t\t\"Unable to create the l3fwd LPM table on socket %d\\n\",\ndiff --git a/examples/load_balancer/init.c b/examples/load_balancer/init.c\nindex 5a56078..a96d778 100644\n--- a/examples/load_balancer/init.c\n+++ b/examples/load_balancer/init.c\n@@ -160,13 +160,17 @@ app_init_lpm_tables(void)\n \t\t\tcontinue;\n \t\t}\n \n+\t\tstruct rte_lpm_config lpm_config;\n+\n+\t\tlpm_config.max_rules = APP_MAX_LPM_RULES;\n+\t\tlpm_config.number_tbl8s = 256;\n+\t\tlpm_config.flags = 0;\n \t\tsnprintf(name, sizeof(name), \"lpm_table_%u\", socket);\n \t\tprintf(\"Creating the LPM table for socket %u ...\\n\", socket);\n \t\tapp.lpm_tables[socket] = rte_lpm_create(\n \t\t\tname,\n \t\t\tsocket,\n-\t\t\tAPP_MAX_LPM_RULES,\n-\t\t\t0);\n+\t\t\t&lpm_config);\n \t\tif (app.lpm_tables[socket] == NULL) {\n \t\t\trte_panic(\"Unable to create LPM table on socket %u\\n\", socket);\n \t\t}\ndiff --git a/examples/performance-thread/l3fwd-thread/main.c b/examples/performance-thread/l3fwd-thread/main.c\nindex 59b7678..7bcca37 100644\n--- a/examples/performance-thread/l3fwd-thread/main.c\n+++ b/examples/performance-thread/l3fwd-thread/main.c\n@@ -3249,14 +3249,18 @@ static void\n setup_lpm(int socketid)\n {\n \tstruct rte_lpm6_config config;\n+\tstruct rte_lpm_config lpm_ipv4_config;\n \tunsigned i;\n \tint ret;\n \tchar s[64];\n \n \t/* create the LPM table */\n \tsnprintf(s, sizeof(s), \"IPV4_L3FWD_LPM_%d\", socketid);\n-\tipv4_l3fwd_lookup_struct[socketid] = rte_lpm_create(s, socketid,\n-\t\t\t\tIPV4_L3FWD_LPM_MAX_RULES, 0);\n+\tlpm_ipv4_config.max_rules = IPV4_L3FWD_LPM_MAX_RULES;\n+\tlpm_ipv4_config.number_tbl8s = 256;\n+\tlpm_ipv4_config.flags = 0;\n+\tipv4_l3fwd_lookup_struct[socketid] =\n+\t\t\trte_lpm_create(s, socketid, &lpm_ipv4_config);\n \tif (ipv4_l3fwd_lookup_struct[socketid] == NULL)\n \t\trte_exit(EXIT_FAILURE, \"Unable to create the l3fwd LPM table\"\n \t\t\t\t\" on socket %d\\n\", socketid);\ndiff --git a/lib/librte_lpm/rte_lpm.c b/lib/librte_lpm/rte_lpm.c\nindex ea4d234..ccaaa2a 100644\n--- a/lib/librte_lpm/rte_lpm.c\n+++ b/lib/librte_lpm/rte_lpm.c\n@@ -244,13 +244,13 @@ exit:\n VERSION_SYMBOL(rte_lpm_create, _v20, 2.0);\n \n struct rte_lpm *\n-rte_lpm_create_v1604(const char *name, int socket_id, int max_rules,\n-\t\t__rte_unused int flags)\n+rte_lpm_create_v1604(const char *name, int socket_id,\n+\t\tconst struct rte_lpm_config *config)\n {\n \tchar mem_name[RTE_LPM_NAMESIZE];\n \tstruct rte_lpm *lpm = NULL;\n \tstruct rte_tailq_entry *te;\n-\tuint32_t mem_size;\n+\tuint32_t mem_size, rules_size, tbl8s_size;\n \tstruct rte_lpm_list *lpm_list;\n \n \tlpm_list = RTE_TAILQ_CAST(rte_lpm_tailq.head, rte_lpm_list);\n@@ -258,7 +258,8 @@ rte_lpm_create_v1604(const char *name, int socket_id, int max_rules,\n \tRTE_BUILD_BUG_ON(sizeof(struct rte_lpm_tbl_entry) != 4);\n \n \t/* Check user arguments. */\n-\tif ((name == NULL) || (socket_id < -1) || (max_rules == 0)) {\n+\tif ((name == NULL) || (socket_id < -1) || (config->max_rules == 0)\n+\t\t\t|| config->number_tbl8s > RTE_LPM_MAX_TBL8_NUM_GROUPS) {\n \t\trte_errno = EINVAL;\n \t\treturn NULL;\n \t}\n@@ -266,7 +267,10 @@ rte_lpm_create_v1604(const char *name, int socket_id, int max_rules,\n \tsnprintf(mem_name, sizeof(mem_name), \"LPM_%s\", name);\n \n \t/* Determine the amount of memory to allocate. */\n-\tmem_size = sizeof(*lpm) + (sizeof(lpm->rules_tbl[0]) * max_rules);\n+\tmem_size = sizeof(*lpm);\n+\trules_size = sizeof(struct rte_lpm_rule) * config->max_rules;\n+\ttbl8s_size = (sizeof(struct rte_lpm_tbl_entry) *\n+\t\t\tRTE_LPM_TBL8_GROUP_NUM_ENTRIES * config->number_tbl8s);\n \n \trte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK);\n \n@@ -295,8 +299,29 @@ rte_lpm_create_v1604(const char *name, int socket_id, int max_rules,\n \t\tgoto exit;\n \t}\n \n+\tlpm->rules_tbl = (struct rte_lpm_rule *)rte_zmalloc_socket(NULL,\n+\t\t\t(size_t)rules_size, RTE_CACHE_LINE_SIZE, socket_id);\n+\n+\tif (lpm->rules_tbl == NULL) {\n+\t\tRTE_LOG(ERR, LPM, \"LPM memory allocation failed\\n\");\n+\t\trte_free(lpm);\n+\t\trte_free(te);\n+\t\tgoto exit;\n+\t}\n+\n+\tlpm->tbl8 = (struct rte_lpm_tbl_entry *)rte_zmalloc_socket(NULL,\n+\t\t\t(size_t)tbl8s_size, RTE_CACHE_LINE_SIZE, socket_id);\n+\n+\tif (lpm->tbl8 == NULL) {\n+\t\tRTE_LOG(ERR, LPM, \"LPM memory allocation failed\\n\");\n+\t\trte_free(lpm);\n+\t\trte_free(te);\n+\t\tgoto exit;\n+\t}\n+\n \t/* Save user arguments. */\n-\tlpm->max_rules = max_rules;\n+\tlpm->max_rules = config->max_rules;\n+\tlpm->number_tbl8s = config->number_tbl8s;\n \tsnprintf(lpm->name, sizeof(lpm->name), \"%s\", name);\n \n \tte->data = (void *) lpm;\n@@ -311,7 +336,7 @@ exit:\n BIND_DEFAULT_SYMBOL(rte_lpm_create, _v1604, 16.04);\n MAP_STATIC_SYMBOL(\n \tstruct rte_lpm *rte_lpm_create(const char *name, int socket_id,\n-\t\t\tint max_rules, int flags), rte_lpm_create_v1604);\n+\t\t\tconst struct rte_lpm_config *config), rte_lpm_create_v1604);\n \n /*\n  * Deallocates memory for given LPM table.\n@@ -665,14 +690,13 @@ tbl8_alloc_v20(struct rte_lpm_tbl_entry_v20 *tbl8)\n }\n \n static inline int32_t\n-tbl8_alloc_v1604(struct rte_lpm_tbl_entry *tbl8)\n+tbl8_alloc_v1604(struct rte_lpm_tbl_entry *tbl8, uint32_t number_tbl8s)\n {\n \tuint32_t group_idx; /* tbl8 group index. */\n \tstruct rte_lpm_tbl_entry *tbl8_entry;\n \n \t/* Scan through tbl8 to find a free (i.e. INVALID) tbl8 group. */\n-\tfor (group_idx = 0; group_idx < RTE_LPM_TBL8_NUM_GROUPS;\n-\t\t\tgroup_idx++) {\n+\tfor (group_idx = 0; group_idx < number_tbl8s; group_idx++) {\n \t\ttbl8_entry = &tbl8[group_idx * RTE_LPM_TBL8_GROUP_NUM_ENTRIES];\n \t\t/* If a free tbl8 group is found clean it and set as VALID. */\n \t\tif (!tbl8_entry->valid_group) {\n@@ -987,7 +1011,7 @@ add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,\n \n \tif (!lpm->tbl24[tbl24_index].valid) {\n \t\t/* Search for a free tbl8 group. */\n-\t\ttbl8_group_index = tbl8_alloc_v1604(lpm->tbl8);\n+\t\ttbl8_group_index = tbl8_alloc_v1604(lpm->tbl8, lpm->number_tbl8s);\n \n \t\t/* Check tbl8 allocation was successful. */\n \t\tif (tbl8_group_index < 0) {\n@@ -1024,7 +1048,7 @@ add_depth_big_v1604(struct rte_lpm *lpm, uint32_t ip_masked, uint8_t depth,\n \t} /* If valid entry but not extended calculate the index into Table8. */\n \telse if (lpm->tbl24[tbl24_index].valid_group == 0) {\n \t\t/* Search for free tbl8 group. */\n-\t\ttbl8_group_index = tbl8_alloc_v1604(lpm->tbl8);\n+\t\ttbl8_group_index = tbl8_alloc_v1604(lpm->tbl8, lpm->number_tbl8s);\n \n \t\tif (tbl8_group_index < 0) {\n \t\t\treturn tbl8_group_index;\n@@ -1882,7 +1906,8 @@ rte_lpm_delete_all_v1604(struct rte_lpm *lpm)\n \tmemset(lpm->tbl24, 0, sizeof(lpm->tbl24));\n \n \t/* Zero tbl8. */\n-\tmemset(lpm->tbl8, 0, sizeof(lpm->tbl8));\n+\tmemset(lpm->tbl8, 0, sizeof(lpm->tbl8[0])\n+\t\t\t* RTE_LPM_TBL8_GROUP_NUM_ENTRIES * lpm->number_tbl8s);\n \n \t/* Delete all rules form the rules table. */\n \tmemset(lpm->rules_tbl, 0, sizeof(lpm->rules_tbl[0]) * lpm->max_rules);\ndiff --git a/lib/librte_lpm/rte_lpm.h b/lib/librte_lpm/rte_lpm.h\nindex d759c8a..9aa122c 100644\n--- a/lib/librte_lpm/rte_lpm.h\n+++ b/lib/librte_lpm/rte_lpm.h\n@@ -66,6 +66,9 @@ extern \"C\" {\n /** @internal Number of entries in a tbl8 group. */\n #define RTE_LPM_TBL8_GROUP_NUM_ENTRIES  256\n \n+/** @internal Max number of tbl8 groups in the tbl8. */\n+#define RTE_LPM_MAX_TBL8_NUM_GROUPS         (1 << 24)\n+\n /** @internal Total number of tbl8 groups in the tbl8. */\n #define RTE_LPM_TBL8_NUM_GROUPS         256\n \n@@ -154,6 +157,13 @@ struct rte_lpm_tbl_entry {\n \n #endif\n \n+/** LPM configuration structure. */\n+struct rte_lpm_config {\n+\tuint32_t max_rules;      /**< Max number of rules. */\n+\tuint32_t number_tbl8s;   /**< Number of tbl8s to allocate. */\n+\tint flags;               /**< This field is currently unused. */\n+};\n+\n /** @internal Rule structure. */\n struct rte_lpm_rule_v20 {\n \tuint32_t ip; /**< Rule IP address. */\n@@ -191,15 +201,14 @@ struct rte_lpm {\n \t/* LPM metadata. */\n \tchar name[RTE_LPM_NAMESIZE];        /**< Name of the lpm. */\n \tuint32_t max_rules; /**< Max. balanced rules per lpm. */\n+\tuint32_t number_tbl8s; /**< Number of tbl8s. */\n \tstruct rte_lpm_rule_info rule_info[RTE_LPM_MAX_DEPTH]; /**< Rule info table. */\n \n \t/* LPM Tables. */\n \tstruct rte_lpm_tbl_entry tbl24[RTE_LPM_TBL24_NUM_ENTRIES]\n \t\t\t__rte_cache_aligned; /**< LPM tbl24 table. */\n-\tstruct rte_lpm_tbl_entry tbl8[RTE_LPM_TBL8_NUM_ENTRIES]\n-\t\t\t__rte_cache_aligned; /**< LPM tbl8 table. */\n-\tstruct rte_lpm_rule rules_tbl[0] \\\n-\t\t\t__rte_cache_aligned; /**< LPM rules. */\n+\tstruct rte_lpm_tbl_entry *tbl8; /**< LPM tbl8 table. */\n+\tstruct rte_lpm_rule *rules_tbl; /**< LPM rules. */\n };\n \n /**\n@@ -224,11 +233,13 @@ struct rte_lpm {\n  *    - ENOMEM - no appropriate memory area found in which to create memzone\n  */\n struct rte_lpm *\n-rte_lpm_create(const char *name, int socket_id, int max_rules, int flags);\n+rte_lpm_create(const char *name, int socket_id,\n+\t\tconst struct rte_lpm_config *config);\n struct rte_lpm_v20 *\n rte_lpm_create_v20(const char *name, int socket_id, int max_rules, int flags);\n struct rte_lpm *\n-rte_lpm_create_v1604(const char *name, int socket_id, int max_rules, int flags);\n+rte_lpm_create_v1604(const char *name, int socket_id,\n+\t\tconst struct rte_lpm_config *config);\n \n /**\n  * Find an existing LPM object and return a pointer to it.\ndiff --git a/lib/librte_table/rte_table_lpm.c b/lib/librte_table/rte_table_lpm.c\nindex 7b2ecb0..cdeb0f5 100644\n--- a/lib/librte_table/rte_table_lpm.c\n+++ b/lib/librte_table/rte_table_lpm.c\n@@ -82,6 +82,8 @@ rte_table_lpm_create(void *params, int socket_id, uint32_t entry_size)\n {\n \tstruct rte_table_lpm_params *p = (struct rte_table_lpm_params *) params;\n \tstruct rte_table_lpm *lpm;\n+\tstruct rte_lpm_config lpm_config;\n+\n \tuint32_t total_size, nht_size;\n \n \t/* Check input parameters */\n@@ -93,6 +95,10 @@ rte_table_lpm_create(void *params, int socket_id, uint32_t entry_size)\n \t\tRTE_LOG(ERR, TABLE, \"%s: Invalid n_rules\\n\", __func__);\n \t\treturn NULL;\n \t}\n+\tif (p->number_tbl8s == 0) {\n+\t\tRTE_LOG(ERR, TABLE, \"%s: Invalid number_tbl8s\\n\", __func__);\n+\t\treturn NULL;\n+\t}\n \tif (p->entry_unique_size == 0) {\n \t\tRTE_LOG(ERR, TABLE, \"%s: Invalid entry_unique_size\\n\",\n \t\t\t__func__);\n@@ -123,7 +129,11 @@ rte_table_lpm_create(void *params, int socket_id, uint32_t entry_size)\n \t}\n \n \t/* LPM low-level table creation */\n-\tlpm->lpm = rte_lpm_create(p->name, socket_id, p->n_rules, 0);\n+\tlpm_config.max_rules = p->n_rules;\n+\tlpm_config.number_tbl8s = p->number_tbl8s;\n+\tlpm_config.flags = p->flags;\n+\tlpm->lpm = rte_lpm_create(p->name, socket_id, &lpm_config);\n+\n \tif (lpm->lpm == NULL) {\n \t\trte_free(lpm);\n \t\tRTE_LOG(ERR, TABLE, \"Unable to create low-level LPM table\\n\");\ndiff --git a/lib/librte_table/rte_table_lpm.h b/lib/librte_table/rte_table_lpm.h\nindex 06e8410..f303323 100644\n--- a/lib/librte_table/rte_table_lpm.h\n+++ b/lib/librte_table/rte_table_lpm.h\n@@ -83,6 +83,12 @@ struct rte_table_lpm_params {\n \t/** Maximum number of LPM rules (i.e. IP routes) */\n \tuint32_t n_rules;\n \n+\t/**< Number of tbl8s to allocate. */\n+\tuint32_t number_tbl8s;\n+\n+\t/**< This field is currently unused. */\n+\tint flags;\n+\n \t/** Number of bytes at the start of the table entry that uniquely\n \tidentify the entry. Cannot be bigger than table entry size. */\n \tuint32_t entry_unique_size;\n",
    "prefixes": [
        "dpdk-dev",
        "v2"
    ]
}