get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 7768,
    "url": "https://patches.dpdk.org/api/patches/7768/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1445346087-2880-2-git-send-email-michalx.k.jastrzebski@intel.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<1445346087-2880-2-git-send-email-michalx.k.jastrzebski@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1445346087-2880-2-git-send-email-michalx.k.jastrzebski@intel.com",
    "date": "2015-10-20T13:01:23",
    "name": "[dpdk-dev,v4,1/5] table: added bulk add/delete functions for table",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "f6249cd9b8bde24a968f3c86763616021ffd447e",
    "submitter": {
        "id": 74,
        "url": "https://patches.dpdk.org/api/people/74/?format=api",
        "name": "Michal Jastrzebski",
        "email": "michalx.k.jastrzebski@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1445346087-2880-2-git-send-email-michalx.k.jastrzebski@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/7768/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/7768/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 4DE2C8E87;\n\tTue, 20 Oct 2015 15:04:22 +0200 (CEST)",
            "from mga11.intel.com (mga11.intel.com [192.55.52.93])\n\tby dpdk.org (Postfix) with ESMTP id C8AD88E86\n\tfor <dev@dpdk.org>; Tue, 20 Oct 2015 15:04:20 +0200 (CEST)",
            "from orsmga002.jf.intel.com ([10.7.209.21])\n\tby fmsmga102.fm.intel.com with ESMTP; 20 Oct 2015 06:01:53 -0700",
            "from unknown (HELO Sent) ([10.217.248.25])\n\tby orsmga002.jf.intel.com with SMTP; 20 Oct 2015 06:01:52 -0700",
            "by Sent (sSMTP sendmail emulation); Tue, 20 Oct 2015 15:01:50 +0116"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.17,707,1437462000\"; d=\"scan'208\";a=\"830846713\"",
        "From": "Michal Jastrzebski <michalx.k.jastrzebski@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Tue, 20 Oct 2015 15:01:23 +0200",
        "Message-Id": "<1445346087-2880-2-git-send-email-michalx.k.jastrzebski@intel.com>",
        "X-Mailer": "git-send-email 2.1.1",
        "In-Reply-To": "<1445346087-2880-1-git-send-email-michalx.k.jastrzebski@intel.com>",
        "References": "<1445346087-2880-1-git-send-email-michalx.k.jastrzebski@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v4 1/5] table: added bulk add/delete functions\n\tfor table",
        "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: Marcin Kerlin <marcinx.kerlin@intel.com>\n\nNew functions prototypes for bulk add/delete added to table API. New\nfunctions allows adding/deleting multiple records with single function\ncall. For now those functions are implemented only for ACL table. For\nother tables these function pointers are set to NULL.\n\nSigned-off-by: Maciej Gajdzica <maciejx.t.gajdzica@intel.com>\nAcked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>\n---\n lib/librte_table/rte_table.h            |  85 ++++++++-\n lib/librte_table/rte_table_acl.c        | 309 ++++++++++++++++++++++++++++++++\n lib/librte_table/rte_table_array.c      |   2 +\n lib/librte_table/rte_table_hash_ext.c   |   4 +\n lib/librte_table/rte_table_hash_key16.c |   4 +\n lib/librte_table/rte_table_hash_key32.c |   4 +\n lib/librte_table/rte_table_hash_key8.c  |   8 +\n lib/librte_table/rte_table_hash_lru.c   |   4 +\n lib/librte_table/rte_table_lpm.c        |   2 +\n lib/librte_table/rte_table_lpm_ipv6.c   |   2 +\n lib/librte_table/rte_table_stub.c       |   2 +\n 11 files changed, 420 insertions(+), 6 deletions(-)",
    "diff": "diff --git a/lib/librte_table/rte_table.h b/lib/librte_table/rte_table.h\nindex c13d40d..720514e 100644\n--- a/lib/librte_table/rte_table.h\n+++ b/lib/librte_table/rte_table.h\n@@ -154,6 +154,77 @@ typedef int (*rte_table_op_entry_delete)(\n \tvoid *entry);\n \n /**\n+ * Lookup table entry add bulk\n+ *\n+ * @param table\n+ *   Handle to lookup table instance\n+ * @param key\n+ *   Array containing lookup keys\n+ * @param entries\n+ *   Array containing data to be associated with each key. Every item in the\n+ *   array has to point to a valid memory buffer where the first entry_size\n+ *   bytes (table create parameter) are populated with the data.\n+ * @param n_keys\n+ *   Number of keys to add\n+ * @param key_found\n+ *   After successful invocation, key_found for every item in the array is set\n+ *   to a value different than 0 if the current key is already present in the\n+ *   table and to 0 if not. This pointer has to be set to a valid memory\n+ *   location before the table entry add function is called.\n+ * @param entries_ptr\n+ *   After successful invocation, array *entries_ptr stores the handle to the\n+ *   table entry containing the data associated with every key. This handle can\n+ *   be used to perform further read-write accesses to this entry. This handle\n+ *   is valid until the key is deleted from the table or the same key is\n+ *   re-added to the table, typically to associate it with different data. This\n+ *   pointer has to be set to a valid memory location before the function is\n+ *   called.\n+ * @return\n+ *   0 on success, error code otherwise\n+ */\n+typedef int (*rte_table_op_entry_add_bulk)(\n+\tvoid *table,\n+\tvoid **keys,\n+\tvoid **entries,\n+\tuint32_t n_keys,\n+\tint *key_found,\n+\tvoid **entries_ptr);\n+\n+/**\n+ * Lookup table entry delete bulk\n+ *\n+ * @param table\n+ *   Handle to lookup table instance\n+ * @param key\n+ *   Array containing lookup keys\n+ * @param n_keys\n+ *   Number of keys to delete\n+ * @param key_found\n+ *   After successful invocation, key_found for every item in the array is set\n+ *   to a value different than 0if the current key was present in the table\n+ *   before the delete operation was performed and to 0 if not. This pointer\n+ *   has to be set to a valid memory location before the table entry delete\n+ *   function is called.\n+ * @param entries\n+ *   If entries pointer is NULL, this pointer is ignored for every entry found.\n+ *   Else, after successful invocation, if specific key is found in the table\n+ *   (key_found is different than 0 for this item after function call is\n+ *   completed) and item of entry array points to a valid buffer (entry is set\n+ *   to a value different than NULL before the function is called), then the\n+ *   first entry_size bytes (table create parameter) in *entry store a copy of\n+ *   table entry that contained the data associated with the current key before\n+ *   the key was deleted.\n+ * @return\n+ *   0 on success, error code otherwise\n+ */\n+typedef int (*rte_table_op_entry_delete_bulk)(\n+\tvoid *table,\n+\tvoid **keys,\n+\tuint32_t n_keys,\n+\tint *key_found,\n+\tvoid **entries);\n+\n+/**\n  * Lookup table lookup\n  *\n  * @param table\n@@ -213,12 +284,14 @@ typedef int (*rte_table_op_stats_read)(\n \n /** Lookup table interface defining the lookup table operation */\n struct rte_table_ops {\n-\trte_table_op_create f_create;       /**< Create */\n-\trte_table_op_free f_free;           /**< Free */\n-\trte_table_op_entry_add f_add;       /**< Entry add */\n-\trte_table_op_entry_delete f_delete; /**< Entry delete */\n-\trte_table_op_lookup f_lookup;       /**< Lookup */\n-\trte_table_op_stats_read f_stats;\t/**< Stats */\n+\trte_table_op_create f_create;                 /**< Create */\n+\trte_table_op_free f_free;                     /**< Free */\n+\trte_table_op_entry_add f_add;                 /**< Entry add */\n+\trte_table_op_entry_delete f_delete;           /**< Entry delete */\n+\trte_table_op_entry_add_bulk f_add_bulk;       /**< Add entry bulk */\n+\trte_table_op_entry_delete_bulk f_delete_bulk; /**< Delete entry bulk */\n+\trte_table_op_lookup f_lookup;                 /**< Lookup */\n+\trte_table_op_stats_read f_stats;              /**< Stats */\n };\n \n #ifdef __cplusplus\ndiff --git a/lib/librte_table/rte_table_acl.c b/lib/librte_table/rte_table_acl.c\nindex f02de3e..c1eb848 100644\n--- a/lib/librte_table/rte_table_acl.c\n+++ b/lib/librte_table/rte_table_acl.c\n@@ -444,6 +444,313 @@ rte_table_acl_entry_delete(\n }\n \n static int\n+rte_table_acl_entry_add_bulk(\n+\tvoid *table,\n+\tvoid **keys,\n+\tvoid **entries,\n+\tuint32_t n_keys,\n+\tint *key_found,\n+\tvoid **entries_ptr)\n+{\n+\tstruct rte_table_acl *acl = (struct rte_table_acl *) table;\n+\tstruct rte_acl_ctx *ctx;\n+\tuint32_t rule_pos[n_keys];\n+\tuint32_t i;\n+\tint err = 0, build = 0;\n+\tint status;\n+\n+\t/* Check input parameters */\n+\tif (table == NULL) {\n+\t\tRTE_LOG(ERR, TABLE, \"%s: table parameter is NULL\\n\", __func__);\n+\t\treturn -EINVAL;\n+\t}\n+\tif (keys == NULL) {\n+\t\tRTE_LOG(ERR, TABLE, \"%s: keys parameter is NULL\\n\", __func__);\n+\t\treturn -EINVAL;\n+\t}\n+\tif (entries == NULL) {\n+\t\tRTE_LOG(ERR, TABLE, \"%s: entries parameter is NULL\\n\", __func__);\n+\t\treturn -EINVAL;\n+\t}\n+\tif (n_keys == 0) {\n+\t\tRTE_LOG(ERR, TABLE, \"%s: 0 rules to add\\n\", __func__);\n+\t\treturn -EINVAL;\n+\t}\n+\tif (key_found == NULL) {\n+\t\tRTE_LOG(ERR, TABLE, \"%s: key_found parameter is NULL\\n\",\n+\t\t\t__func__);\n+\t\treturn -EINVAL;\n+\t}\n+\tif (entries_ptr == NULL) {\n+\t\tRTE_LOG(ERR, TABLE, \"%s: entries_ptr parameter is NULL\\n\",\n+\t\t\t__func__);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* Check input parameters in arrays */\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tstruct rte_table_acl_rule_add_params *rule;\n+\n+\t\tif (keys[i] == NULL) {\n+\t\t\tRTE_LOG(ERR, TABLE, \"%s: keys[%\" PRIu32 \"] parameter is NULL\\n\",\n+\t\t\t\t\t__func__, i);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\n+\t\tif (entries[i] == NULL) {\n+\t\t\tRTE_LOG(ERR, TABLE, \"%s: entries[%\" PRIu32 \"] parameter is NULL\\n\",\n+\t\t\t\t\t__func__, i);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\n+\t\tif (entries_ptr[i] == NULL) {\n+\t\t\tRTE_LOG(ERR, TABLE, \"%s: entries_ptr[%\" PRIu32 \"] parameter is NULL\\n\",\n+\t\t\t\t\t__func__, i);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\n+\t\trule = (struct rte_table_acl_rule_add_params *) keys[i];\n+\t\tif (rule->priority > RTE_ACL_MAX_PRIORITY) {\n+\t\t\tRTE_LOG(ERR, TABLE, \"%s: Priority is too high\\n\", __func__);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t}\n+\n+\tmemset(rule_pos, 0, n_keys * sizeof(uint32_t));\n+\tmemset(key_found, 0, n_keys * sizeof(int));\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tstruct rte_table_acl_rule_add_params *rule =\n+\t\t\t\t(struct rte_table_acl_rule_add_params *) keys[i];\n+\t\tstruct rte_pipeline_acl_rule acl_rule;\n+\t\tstruct rte_acl_rule *rule_location;\n+\t\tuint32_t free_pos, free_pos_valid, j;\n+\n+\t\t/* Setup rule data structure */\n+\t\tmemset(&acl_rule, 0, sizeof(acl_rule));\n+\t\tacl_rule.data.category_mask = 1;\n+\t\tacl_rule.data.priority = RTE_ACL_MAX_PRIORITY - rule->priority;\n+\t\tacl_rule.data.userdata = 0; /* To be set up later */\n+\t\tmemcpy(&acl_rule.field[0],\n+\t\t\t&rule->field_value[0],\n+\t\t\tacl->cfg.num_fields * sizeof(struct rte_acl_field));\n+\n+\t\t/* Look to see if the rule exists already in the table */\n+\t\tfree_pos = 0;\n+\t\tfree_pos_valid = 0;\n+\t\tfor (j = 1; j < acl->n_rules; j++) {\n+\t\t\tif (acl->acl_rule_list[j] == NULL) {\n+\t\t\t\tif (free_pos_valid == 0) {\n+\t\t\t\t\tfree_pos = j;\n+\t\t\t\t\tfree_pos_valid = 1;\n+\t\t\t\t}\n+\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\n+\t\t\t/* Compare the key fields */\n+\t\t\tstatus = memcmp(&acl->acl_rule_list[j]->field[0],\n+\t\t\t\t&rule->field_value[0],\n+\t\t\t\tacl->cfg.num_fields * sizeof(struct rte_acl_field));\n+\n+\t\t\t/* Rule found: update data associated with the rule */\n+\t\t\tif (status == 0) {\n+\t\t\t\tkey_found[i] = 1;\n+\t\t\t\tentries_ptr[i] = &acl->memory[j * acl->entry_size];\n+\t\t\t\tmemcpy(entries_ptr[i], entries[i], acl->entry_size);\n+\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\n+\t\t/* Key already in the table */\n+\t\tif (key_found[i] != 0)\n+\t\t\tcontinue;\n+\n+\t\t/* Maximum number of rules reached */\n+\t\tif (free_pos_valid == 0) {\n+\t\t\terr = 1;\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\t/* Add the new rule to the rule set */\n+\t\tacl_rule.data.userdata = free_pos;\n+\t\trule_location = (struct rte_acl_rule *)\n+\t\t\t&acl->acl_rule_memory[free_pos * acl->acl_params.rule_size];\n+\t\tmemcpy(rule_location, &acl_rule, acl->acl_params.rule_size);\n+\t\tacl->acl_rule_list[free_pos] = rule_location;\n+\t\trule_pos[i] = free_pos;\n+\t\tbuild = 1;\n+\t}\n+\n+\tif (err != 0) {\n+\t\tfor (i = 0; i < n_keys; i++) {\n+\t\t\tif (rule_pos[i] == 0)\n+\t\t\t\tcontinue;\n+\n+\t\t\tacl->acl_rule_list[rule_pos[i]] = NULL;\n+\t\t}\n+\n+\t\treturn -ENOSPC;\n+\t}\n+\n+\tif (build == 0)\n+\t\treturn 0;\n+\n+\t/* Build low level ACL table */\n+\tacl->name_id ^= 1;\n+\tacl->acl_params.name = acl->name[acl->name_id];\n+\tstatus = rte_table_acl_build(acl, &ctx);\n+\tif (status != 0) {\n+\t\t/* Roll back changes */\n+\t\tfor (i = 0; i < n_keys; i++) {\n+\t\t\tif (rule_pos[i] == 0)\n+\t\t\t\tcontinue;\n+\n+\t\t\tacl->acl_rule_list[rule_pos[i]] = NULL;\n+\t\t}\n+\t\tacl->name_id ^= 1;\n+\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* Commit changes */\n+\tif (acl->ctx != NULL)\n+\t\trte_acl_free(acl->ctx);\n+\tacl->ctx = ctx;\n+\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tif (rule_pos[i] == 0)\n+\t\t\tcontinue;\n+\n+\t\tkey_found[i] = 0;\n+\t\tentries_ptr[i] = &acl->memory[rule_pos[i] * acl->entry_size];\n+\t\tmemcpy(entries_ptr[i], entries[i], acl->entry_size);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+rte_table_acl_entry_delete_bulk(\n+\tvoid *table,\n+\tvoid **keys,\n+\tuint32_t n_keys,\n+\tint *key_found,\n+\tvoid **entries)\n+{\n+\tstruct rte_table_acl *acl = (struct rte_table_acl *) table;\n+\tstruct rte_acl_rule *deleted_rules[n_keys];\n+\tuint32_t rule_pos[n_keys];\n+\tstruct rte_acl_ctx *ctx;\n+\tuint32_t i;\n+\tint status;\n+\tint build = 0;\n+\n+\t/* Check input parameters */\n+\tif (table == NULL) {\n+\t\tRTE_LOG(ERR, TABLE, \"%s: table parameter is NULL\\n\", __func__);\n+\t\treturn -EINVAL;\n+\t}\n+\tif (keys == NULL) {\n+\t\tRTE_LOG(ERR, TABLE, \"%s: key parameter is NULL\\n\", __func__);\n+\t\treturn -EINVAL;\n+\t}\n+\tif (n_keys == 0) {\n+\t\tRTE_LOG(ERR, TABLE, \"%s: 0 rules to delete\\n\", __func__);\n+\t\treturn -EINVAL;\n+\t}\n+\tif (key_found == NULL) {\n+\t\tRTE_LOG(ERR, TABLE, \"%s: key_found parameter is NULL\\n\",\n+\t\t\t__func__);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tif (keys[i] == NULL) {\n+\t\t\tRTE_LOG(ERR, TABLE, \"%s: keys[%\" PRIu32 \"] parameter is NULL\\n\",\n+\t\t\t\t\t__func__, i);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t}\n+\n+\tmemset(deleted_rules, 0, n_keys * sizeof(struct rte_acl_rule *));\n+\tmemset(rule_pos, 0, n_keys * sizeof(uint32_t));\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tstruct rte_table_acl_rule_delete_params *rule =\n+\t\t\t(struct rte_table_acl_rule_delete_params *) keys[i];\n+\t\tuint32_t pos_valid, j;\n+\n+\t\t/* Look for the rule in the table */\n+\t\tpos_valid = 0;\n+\t\tfor (j = 1; j < acl->n_rules; j++) {\n+\t\t\tif (acl->acl_rule_list[j] == NULL)\n+\t\t\t\tcontinue;\n+\n+\t\t\t/* Compare the key fields */\n+\t\t\tstatus = memcmp(&acl->acl_rule_list[j]->field[0],\n+\t\t\t\t\t&rule->field_value[0],\n+\t\t\t\t\tacl->cfg.num_fields * sizeof(struct rte_acl_field));\n+\n+\t\t\t/* Rule found: remove from table */\n+\t\t\tif (status == 0) {\n+\t\t\t\tpos_valid = 1;\n+\n+\t\t\t\tdeleted_rules[i] = acl->acl_rule_list[j];\n+\t\t\t\tacl->acl_rule_list[j] = NULL;\n+\t\t\t\trule_pos[i] = j;\n+\n+\t\t\t\tbuild = 1;\n+\t\t\t}\n+\t\t}\n+\n+\t\tif (pos_valid == 0) {\n+\t\t\tkey_found[i] = 0;\n+\t\t\tcontinue;\n+\t\t}\n+\t}\n+\n+\t/* Return if no changes to acl table */\n+\tif (build == 0) {\n+\t\treturn 0;\n+\t}\n+\n+\t/* Build low level ACL table */\n+\tacl->name_id ^= 1;\n+\tacl->acl_params.name = acl->name[acl->name_id];\n+\tstatus = rte_table_acl_build(acl, &ctx);\n+\tif (status != 0) {\n+\t\t/* Roll back changes */\n+\t\tfor (i = 0; i < n_keys; i++) {\n+\t\t\tif (rule_pos[i] == 0)\n+\t\t\t\tcontinue;\n+\n+\t\t\tacl->acl_rule_list[rule_pos[i]] = deleted_rules[i];\n+\t\t}\n+\n+\t\tacl->name_id ^= 1;\n+\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* Commit changes */\n+\tif (acl->ctx != NULL)\n+\t\trte_acl_free(acl->ctx);\n+\n+\tacl->ctx = ctx;\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tif (rule_pos[i] == 0)\n+\t\t\tcontinue;\n+\n+\t\tkey_found[i] = 1;\n+\t\tif (entries != NULL && entries[i] != NULL)\n+\t\t\tmemcpy(entries[i], &acl->memory[rule_pos[i] * acl->entry_size],\n+\t\t\t\t\tacl->entry_size);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n rte_table_acl_lookup(\n \tvoid *table,\n \tstruct rte_mbuf **pkts,\n@@ -521,6 +828,8 @@ struct rte_table_ops rte_table_acl_ops = {\n \t.f_free = rte_table_acl_free,\n \t.f_add = rte_table_acl_entry_add,\n \t.f_delete = rte_table_acl_entry_delete,\n+\t.f_add_bulk = rte_table_acl_entry_add_bulk,\n+\t.f_delete_bulk = rte_table_acl_entry_delete_bulk,\n \t.f_lookup = rte_table_acl_lookup,\n \t.f_stats = rte_table_acl_stats_read,\n };\ndiff --git a/lib/librte_table/rte_table_array.c b/lib/librte_table/rte_table_array.c\nindex 422f8c3..3bb68d1 100644\n--- a/lib/librte_table/rte_table_array.c\n+++ b/lib/librte_table/rte_table_array.c\n@@ -230,6 +230,8 @@ struct rte_table_ops rte_table_array_ops = {\n \t.f_free = rte_table_array_free,\n \t.f_add = rte_table_array_entry_add,\n \t.f_delete = NULL,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_array_lookup,\n \t.f_stats = rte_table_array_stats_read,\n };\ndiff --git a/lib/librte_table/rte_table_hash_ext.c b/lib/librte_table/rte_table_hash_ext.c\nindex 1fa15c8..ebe952b 100644\n--- a/lib/librte_table/rte_table_hash_ext.c\n+++ b/lib/librte_table/rte_table_hash_ext.c\n@@ -1139,6 +1139,8 @@ struct rte_table_ops rte_table_hash_ext_ops\t = {\n \t.f_free = rte_table_hash_ext_free,\n \t.f_add = rte_table_hash_ext_entry_add,\n \t.f_delete = rte_table_hash_ext_entry_delete,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_hash_ext_lookup,\n \t.f_stats = rte_table_hash_ext_stats_read,\n };\n@@ -1148,6 +1150,8 @@ struct rte_table_ops rte_table_hash_ext_dosig_ops  = {\n \t.f_free = rte_table_hash_ext_free,\n \t.f_add = rte_table_hash_ext_entry_add,\n \t.f_delete = rte_table_hash_ext_entry_delete,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_hash_ext_lookup_dosig,\n \t.f_stats = rte_table_hash_ext_stats_read,\n };\ndiff --git a/lib/librte_table/rte_table_hash_key16.c b/lib/librte_table/rte_table_hash_key16.c\nindex f6a3306..35b7f10 100644\n--- a/lib/librte_table/rte_table_hash_key16.c\n+++ b/lib/librte_table/rte_table_hash_key16.c\n@@ -1103,6 +1103,8 @@ struct rte_table_ops rte_table_hash_key16_lru_ops = {\n \t.f_free = rte_table_hash_free_key16_lru,\n \t.f_add = rte_table_hash_entry_add_key16_lru,\n \t.f_delete = rte_table_hash_entry_delete_key16_lru,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_hash_lookup_key16_lru,\n \t.f_stats = rte_table_hash_key16_stats_read,\n };\n@@ -1112,6 +1114,8 @@ struct rte_table_ops rte_table_hash_key16_ext_ops = {\n \t.f_free = rte_table_hash_free_key16_ext,\n \t.f_add = rte_table_hash_entry_add_key16_ext,\n \t.f_delete = rte_table_hash_entry_delete_key16_ext,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_hash_lookup_key16_ext,\n \t.f_stats = rte_table_hash_key16_stats_read,\n };\ndiff --git a/lib/librte_table/rte_table_hash_key32.c b/lib/librte_table/rte_table_hash_key32.c\nindex 5fe4161..b3ae73e 100644\n--- a/lib/librte_table/rte_table_hash_key32.c\n+++ b/lib/librte_table/rte_table_hash_key32.c\n@@ -1123,6 +1123,8 @@ struct rte_table_ops rte_table_hash_key32_lru_ops = {\n \t.f_free = rte_table_hash_free_key32_lru,\n \t.f_add = rte_table_hash_entry_add_key32_lru,\n \t.f_delete = rte_table_hash_entry_delete_key32_lru,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_hash_lookup_key32_lru,\n \t.f_stats = rte_table_hash_key32_stats_read,\n };\n@@ -1132,6 +1134,8 @@ struct rte_table_ops rte_table_hash_key32_ext_ops = {\n \t.f_free = rte_table_hash_free_key32_ext,\n \t.f_add = rte_table_hash_entry_add_key32_ext,\n \t.f_delete = rte_table_hash_entry_delete_key32_ext,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_hash_lookup_key32_ext,\n \t.f_stats = rte_table_hash_key32_stats_read,\n };\ndiff --git a/lib/librte_table/rte_table_hash_key8.c b/lib/librte_table/rte_table_hash_key8.c\nindex b351a49..379748e 100644\n--- a/lib/librte_table/rte_table_hash_key8.c\n+++ b/lib/librte_table/rte_table_hash_key8.c\n@@ -1394,6 +1394,8 @@ struct rte_table_ops rte_table_hash_key8_lru_ops = {\n \t.f_free = rte_table_hash_free_key8_lru,\n \t.f_add = rte_table_hash_entry_add_key8_lru,\n \t.f_delete = rte_table_hash_entry_delete_key8_lru,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_hash_lookup_key8_lru,\n \t.f_stats = rte_table_hash_key8_stats_read,\n };\n@@ -1403,6 +1405,8 @@ struct rte_table_ops rte_table_hash_key8_lru_dosig_ops = {\n \t.f_free = rte_table_hash_free_key8_lru,\n \t.f_add = rte_table_hash_entry_add_key8_lru,\n \t.f_delete = rte_table_hash_entry_delete_key8_lru,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_hash_lookup_key8_lru_dosig,\n \t.f_stats = rte_table_hash_key8_stats_read,\n };\n@@ -1412,6 +1416,8 @@ struct rte_table_ops rte_table_hash_key8_ext_ops = {\n \t.f_free = rte_table_hash_free_key8_ext,\n \t.f_add = rte_table_hash_entry_add_key8_ext,\n \t.f_delete = rte_table_hash_entry_delete_key8_ext,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_hash_lookup_key8_ext,\n \t.f_stats = rte_table_hash_key8_stats_read,\n };\n@@ -1421,6 +1427,8 @@ struct rte_table_ops rte_table_hash_key8_ext_dosig_ops = {\n \t.f_free = rte_table_hash_free_key8_ext,\n \t.f_add = rte_table_hash_entry_add_key8_ext,\n \t.f_delete = rte_table_hash_entry_delete_key8_ext,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_hash_lookup_key8_ext_dosig,\n \t.f_stats = rte_table_hash_key8_stats_read,\n };\ndiff --git a/lib/librte_table/rte_table_hash_lru.c b/lib/librte_table/rte_table_hash_lru.c\nindex 1640dc9..14e9072 100644\n--- a/lib/librte_table/rte_table_hash_lru.c\n+++ b/lib/librte_table/rte_table_hash_lru.c\n@@ -1082,6 +1082,8 @@ struct rte_table_ops rte_table_hash_lru_ops = {\n \t.f_free = rte_table_hash_lru_free,\n \t.f_add = rte_table_hash_lru_entry_add,\n \t.f_delete = rte_table_hash_lru_entry_delete,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_hash_lru_lookup,\n \t.f_stats = rte_table_hash_lru_stats_read,\n };\n@@ -1091,6 +1093,8 @@ struct rte_table_ops rte_table_hash_lru_dosig_ops = {\n \t.f_free = rte_table_hash_lru_free,\n \t.f_add = rte_table_hash_lru_entry_add,\n \t.f_delete = rte_table_hash_lru_entry_delete,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_hash_lru_lookup_dosig,\n \t.f_stats = rte_table_hash_lru_stats_read,\n };\ndiff --git a/lib/librte_table/rte_table_lpm.c b/lib/librte_table/rte_table_lpm.c\nindex 849d899..673f401 100644\n--- a/lib/librte_table/rte_table_lpm.c\n+++ b/lib/librte_table/rte_table_lpm.c\n@@ -377,6 +377,8 @@ struct rte_table_ops rte_table_lpm_ops = {\n \t.f_free = rte_table_lpm_free,\n \t.f_add = rte_table_lpm_entry_add,\n \t.f_delete = rte_table_lpm_entry_delete,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_lpm_lookup,\n \t.f_stats = rte_table_lpm_stats_read,\n };\ndiff --git a/lib/librte_table/rte_table_lpm_ipv6.c b/lib/librte_table/rte_table_lpm_ipv6.c\nindex e9bc6a7..836f4cf 100644\n--- a/lib/librte_table/rte_table_lpm_ipv6.c\n+++ b/lib/librte_table/rte_table_lpm_ipv6.c\n@@ -391,6 +391,8 @@ struct rte_table_ops rte_table_lpm_ipv6_ops = {\n \t.f_free = rte_table_lpm_ipv6_free,\n \t.f_add = rte_table_lpm_ipv6_entry_add,\n \t.f_delete = rte_table_lpm_ipv6_entry_delete,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_lpm_ipv6_lookup,\n \t.f_stats = rte_table_lpm_ipv6_stats_read,\n };\ndiff --git a/lib/librte_table/rte_table_stub.c b/lib/librte_table/rte_table_stub.c\nindex c1065ef..691d681 100644\n--- a/lib/librte_table/rte_table_stub.c\n+++ b/lib/librte_table/rte_table_stub.c\n@@ -114,6 +114,8 @@ struct rte_table_ops rte_table_stub_ops = {\n \t.f_free = NULL,\n \t.f_add = NULL,\n \t.f_delete = NULL,\n+\t.f_add_bulk = NULL,\n+\t.f_delete_bulk = NULL,\n \t.f_lookup = rte_table_stub_lookup,\n \t.f_stats = rte_table_stub_stats_read,\n };\n",
    "prefixes": [
        "dpdk-dev",
        "v4",
        "1/5"
    ]
}