get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 7771,
    "url": "https://patches.dpdk.org/api/patches/7771/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1445346087-2880-5-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-5-git-send-email-michalx.k.jastrzebski@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1445346087-2880-5-git-send-email-michalx.k.jastrzebski@intel.com",
    "date": "2015-10-20T13:01:26",
    "name": "[dpdk-dev,v4,4/5] ip_pipline: added cli commands for bulk add/delete to firewall pipeline",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "ff79f130949347af41492445173aea28d3f9cd15",
    "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-5-git-send-email-michalx.k.jastrzebski@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/7771/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/7771/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 005E18E9B;\n\tTue, 20 Oct 2015 15:04:40 +0200 (CEST)",
            "from mga11.intel.com (mga11.intel.com [192.55.52.93])\n\tby dpdk.org (Postfix) with ESMTP id 3804C8E9B\n\tfor <dev@dpdk.org>; Tue, 20 Oct 2015 15:04:38 +0200 (CEST)",
            "from orsmga002.jf.intel.com ([10.7.209.21])\n\tby fmsmga102.fm.intel.com with ESMTP; 20 Oct 2015 06:02:04 -0700",
            "from unknown (HELO Sent) ([10.217.248.25])\n\tby orsmga002.jf.intel.com with SMTP; 20 Oct 2015 06:02:02 -0700",
            "by Sent (sSMTP sendmail emulation); Tue, 20 Oct 2015 15:02:01 +0116"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.17,707,1437462000\"; d=\"scan'208\";a=\"830847251\"",
        "From": "Michal Jastrzebski <michalx.k.jastrzebski@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Tue, 20 Oct 2015 15:01:26 +0200",
        "Message-Id": "<1445346087-2880-5-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 4/5] ip_pipline: added cli commands for bulk\n\tadd/delete to firewall pipeline",
        "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\nAdded two new cli commands to firewall pipeline. Commands bulk add and\nbulk delete takes as argument a file with rules to add/delete. The file\nis parsed, and then rules are passed to backend functions which\nadd/delete records from pipeline tables.\n\nSigned-off-by: Maciej Gajdzica <maciejx.t.gajdzica@intel.com>\nAcked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>\n---\n examples/ip_pipeline/pipeline/pipeline_firewall.c  | 858 +++++++++++++++++++++\n examples/ip_pipeline/pipeline/pipeline_firewall.h  |  14 +\n .../ip_pipeline/pipeline/pipeline_firewall_be.c    | 157 ++++\n .../ip_pipeline/pipeline/pipeline_firewall_be.h    |  38 +\n 4 files changed, 1067 insertions(+)",
    "diff": "diff --git a/examples/ip_pipeline/pipeline/pipeline_firewall.c b/examples/ip_pipeline/pipeline/pipeline_firewall.c\nindex f6924ab..4137923 100644\n--- a/examples/ip_pipeline/pipeline/pipeline_firewall.c\n+++ b/examples/ip_pipeline/pipeline/pipeline_firewall.c\n@@ -51,6 +51,8 @@\n #include \"pipeline_common_fe.h\"\n #include \"pipeline_firewall.h\"\n \n+#define BUF_SIZE\t\t1024\n+\n struct app_pipeline_firewall_rule {\n \tstruct pipeline_firewall_key key;\n \tint32_t priority;\n@@ -73,6 +75,18 @@ struct app_pipeline_firewall {\n \tvoid *default_rule_entry_ptr;\n };\n \n+struct app_pipeline_add_bulk_params {\n+\tstruct pipeline_firewall_key *keys;\n+\tuint32_t n_keys;\n+\tuint32_t *priorities;\n+\tuint32_t *port_ids;\n+};\n+\n+struct app_pipeline_del_bulk_params {\n+\tstruct pipeline_firewall_key *keys;\n+\tuint32_t n_keys;\n+};\n+\n static void\n print_firewall_ipv4_rule(struct app_pipeline_firewall_rule *rule)\n {\n@@ -256,6 +270,358 @@ app_pipeline_firewall_key_check_and_normalize(struct pipeline_firewall_key *key)\n \t}\n }\n \n+static int\n+app_pipeline_add_bulk_parse_file(char *filename,\n+\t\tstruct app_pipeline_add_bulk_params *params)\n+{\n+\tFILE *f;\n+\tchar file_buf[BUF_SIZE];\n+\tuint32_t i;\n+\tint status = 0;\n+\n+\tf = fopen(filename, \"r\");\n+\tif (f == NULL)\n+\t\treturn -1;\n+\n+\tparams->n_keys = 0;\n+\twhile (fgets(file_buf, BUF_SIZE, f) != NULL)\n+\t\tparams->n_keys++;\n+\trewind(f);\n+\n+\tif (params->n_keys == 0) {\n+\t\tstatus = -1;\n+\t\tgoto end;\n+\t}\n+\n+\tparams->keys = rte_malloc(NULL,\n+\t\t\tparams->n_keys * sizeof(struct pipeline_firewall_key),\n+\t\t\tRTE_CACHE_LINE_SIZE);\n+\tif (params->keys == NULL) {\n+\t\tstatus = -1;\n+\t\tgoto end;\n+\t}\n+\n+\tparams->priorities = rte_malloc(NULL,\n+\t\t\tparams->n_keys * sizeof(uint32_t),\n+\t\t\tRTE_CACHE_LINE_SIZE);\n+\tif (params->priorities == NULL) {\n+\t\tstatus = -1;\n+\t\tgoto end;\n+\t}\n+\n+\tparams->port_ids = rte_malloc(NULL,\n+\t\t\tparams->n_keys * sizeof(uint32_t),\n+\t\t\tRTE_CACHE_LINE_SIZE);\n+\tif (params->port_ids == NULL) {\n+\t\tstatus = -1;\n+\t\tgoto end;\n+\t}\n+\n+\ti = 0;\n+\twhile (fgets(file_buf, BUF_SIZE, f) != NULL) {\n+\t\tchar *str;\n+\n+\t\tstr = strtok(file_buf, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->priorities[i] = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_ip = atoi(str)<<24;\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_ip |= atoi(str)<<16;\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_ip |= atoi(str)<<8;\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_ip |= atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_ip_mask = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_ip = atoi(str)<<24;\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_ip |= atoi(str)<<16;\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_ip |= atoi(str)<<8;\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_ip |= atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_ip_mask = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_port_from = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_port_to = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_port_from = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_port_to = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.proto = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\t/* Need to add 2 to str to skip leading 0x */\n+\t\tparams->keys[i].key.ipv4_5tuple.proto_mask = strtol(str+2, NULL, 16);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->port_ids[i] = atoi(str);\n+\t\tparams->keys[i].type = PIPELINE_FIREWALL_IPV4_5TUPLE;\n+\n+\t\ti++;\n+\t}\n+\n+end:\n+\tfclose(f);\n+\treturn status;\n+}\n+\n+static int\n+app_pipeline_del_bulk_parse_file(char *filename,\n+\t\tstruct app_pipeline_del_bulk_params *params)\n+{\n+\tFILE *f;\n+\tchar file_buf[BUF_SIZE];\n+\tuint32_t i;\n+\tint status = 0;\n+\n+\tf = fopen(filename, \"r\");\n+\tif (f == NULL)\n+\t\treturn -1;\n+\n+\tparams->n_keys = 0;\n+\twhile (fgets(file_buf, BUF_SIZE, f) != NULL)\n+\t\tparams->n_keys++;\n+\trewind(f);\n+\n+\tif (params->n_keys == 0) {\n+\t\tstatus = -1;\n+\t\tgoto end;\n+\t}\n+\n+\tparams->keys = rte_malloc(NULL,\n+\t\t\tparams->n_keys * sizeof(struct pipeline_firewall_key),\n+\t\t\tRTE_CACHE_LINE_SIZE);\n+\tif (params->keys == NULL) {\n+\t\tstatus = -1;\n+\t\tgoto end;\n+\t}\n+\n+\ti = 0;\n+\twhile (fgets(file_buf, BUF_SIZE, f) != NULL) {\n+\t\tchar *str;\n+\n+\t\tstr = strtok(file_buf, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_ip = atoi(str)<<24;\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_ip |= atoi(str)<<16;\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_ip |= atoi(str)<<8;\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_ip |= atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_ip_mask = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_ip = atoi(str)<<24;\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_ip |= atoi(str)<<16;\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_ip |= atoi(str)<<8;\n+\n+\t\tstr = strtok(NULL, \" .\");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_ip |= atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_ip_mask = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_port_from = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.src_port_to = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_port_from = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.dst_port_to = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\tparams->keys[i].key.ipv4_5tuple.proto = atoi(str);\n+\n+\t\tstr = strtok(NULL, \" \");\n+\t\tif (str == NULL) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t\t/* Need to add 2 to str to skip leading 0x */\n+\t\tparams->keys[i].key.ipv4_5tuple.proto_mask = strtol(str+2, NULL, 16);\n+\n+\t\tparams->keys[i].type = PIPELINE_FIREWALL_IPV4_5TUPLE;\n+\n+\t\ti++;\n+\t}\n+\n+\tfor (i = 0; i < params->n_keys; i++) {\n+\t\tif (app_pipeline_firewall_key_check_and_normalize(&params->keys[i]) != 0) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto end;\n+\t\t}\n+\t}\n+\n+end:\n+\tfclose(f);\n+\treturn status;\n+}\n+\n int\n app_pipeline_firewall_add_rule(struct app_params *app,\n \tuint32_t pipeline_id,\n@@ -407,6 +773,332 @@ app_pipeline_firewall_delete_rule(struct app_params *app,\n }\n \n int\n+app_pipeline_firewall_add_bulk(struct app_params *app,\n+\t\tuint32_t pipeline_id,\n+\t\tstruct pipeline_firewall_key *keys,\n+\t\tuint32_t n_keys,\n+\t\tuint32_t *priorities,\n+\t\tuint32_t *port_ids)\n+{\n+\tstruct app_pipeline_firewall *p;\n+\tstruct pipeline_firewall_add_bulk_msg_req *req;\n+\tstruct pipeline_firewall_add_bulk_msg_rsp *rsp;\n+\n+\tstruct app_pipeline_firewall_rule **rules;\n+\tint *new_rules;\n+\n+\tint *keys_found;\n+\tvoid **entries_ptr;\n+\n+\tuint32_t i;\n+\tint status = 0;\n+\n+\t/* Check input arguments */\n+\tif (app == NULL)\n+\t\treturn -1;\n+\n+\tp = app_pipeline_data_fe(app, pipeline_id);\n+\tif (p == NULL)\n+\t\treturn -1;\n+\n+\trules = rte_malloc(NULL,\n+\t\t\tn_keys * sizeof(struct app_pipeline_firewall_rule *),\n+\t\t\tRTE_CACHE_LINE_SIZE);\n+\tif (rules == NULL)\n+\t\treturn -1;\n+\n+\tnew_rules = rte_malloc(NULL,\n+\t\t\tn_keys * sizeof(int),\n+\t\t\tRTE_CACHE_LINE_SIZE);\n+\tif (new_rules == NULL) {\n+\t\trte_free(rules);\n+\t\treturn -1;\n+\t}\n+\n+\t/* check data integrity and add to rule list */\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tif (port_ids[i]  >= p->n_ports_out) {\n+\t\t\trte_free(rules);\n+\t\t\trte_free(new_rules);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tif (app_pipeline_firewall_key_check_and_normalize(&keys[i]) != 0) {\n+\t\t\trte_free(rules);\n+\t\t\trte_free(new_rules);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\trules[i] = app_pipeline_firewall_rule_find(p, &keys[i]);\n+\t\tnew_rules[i] = (rules[i] == NULL);\n+\t\tif (rules[i] == NULL) {\n+\t\t\trules[i] = rte_malloc(NULL, sizeof(rules[i]),\n+\t\t\t\t\tRTE_CACHE_LINE_SIZE);\n+\n+\t\t\tif (rules[i] == NULL) {\n+\t\t\t\tuint32_t j;\n+\n+\t\t\t\tfor (j = 0; j <= i; j++)\n+\t\t\t\t\tif (new_rules[j])\n+\t\t\t\t\t\trte_free(rules[j]);\n+\n+\t\t\t\trte_free(rules);\n+\t\t\t\trte_free(new_rules);\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\tkeys_found = rte_malloc(NULL,\n+\t\t\tn_keys * sizeof(int),\n+\t\t\tRTE_CACHE_LINE_SIZE);\n+\tif (keys_found == NULL) {\n+\t\tuint32_t j;\n+\n+\t\tfor (j = 0; j < n_keys; j++)\n+\t\t\tif (new_rules[j])\n+\t\t\t\trte_free(rules[j]);\n+\n+\t\trte_free(rules);\n+\t\trte_free(new_rules);\n+\t\treturn -1;\n+\t}\n+\n+\tentries_ptr = rte_malloc(NULL,\n+\t\t\tn_keys * sizeof(struct rte_pipeline_table_entry *),\n+\t\t\tRTE_CACHE_LINE_SIZE);\n+\tif (entries_ptr == NULL) {\n+\t\tuint32_t j;\n+\n+\t\tfor (j = 0; j < n_keys; j++)\n+\t\t\tif (new_rules[j])\n+\t\t\t\trte_free(rules[j]);\n+\n+\t\trte_free(rules);\n+\t\trte_free(new_rules);\n+\t\trte_free(keys_found);\n+\t\treturn -1;\n+\t}\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tentries_ptr[i] = rte_malloc(NULL,\n+\t\t\t\tsizeof(struct rte_pipeline_table_entry),\n+\t\t\t\tRTE_CACHE_LINE_SIZE);\n+\n+\t\tif (entries_ptr[i] == NULL) {\n+\t\t\tuint32_t j;\n+\n+\t\t\tfor (j = 0; j < n_keys; j++)\n+\t\t\t\tif (new_rules[j])\n+\t\t\t\t\trte_free(rules[j]);\n+\n+\t\t\tfor (j = 0; j <= i; j++)\n+\t\t\t\trte_free(entries_ptr[j]);\n+\n+\t\t\trte_free(rules);\n+\t\t\trte_free(new_rules);\n+\t\t\trte_free(keys_found);\n+\t\t\trte_free(entries_ptr);\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\t/* Allocate and write request */\n+\treq = app_msg_alloc(app);\n+\tif (req == NULL) {\n+\t\tuint32_t j;\n+\n+\t\tfor (j = 0; j < n_keys; j++)\n+\t\t\tif (new_rules[j])\n+\t\t\t\trte_free(rules[j]);\n+\n+\t\tfor (j = 0; j < n_keys; j++)\n+\t\t\trte_free(entries_ptr[j]);\n+\n+\t\trte_free(rules);\n+\t\trte_free(new_rules);\n+\t\trte_free(keys_found);\n+\t\trte_free(entries_ptr);\n+\t\treturn -1;\n+\t}\n+\n+\treq->type = PIPELINE_MSG_REQ_CUSTOM;\n+\treq->subtype = PIPELINE_FIREWALL_MSG_REQ_ADD_BULK;\n+\n+\treq->keys = keys;\n+\treq->n_keys = n_keys;\n+\treq->port_ids = port_ids;\n+\treq->priorities = priorities;\n+\treq->keys_found = keys_found;\n+\treq->entries_ptr = entries_ptr;\n+\n+\t/* Send request and wait for response */\n+\trsp = app_msg_send_recv(app, pipeline_id, req, MSG_TIMEOUT_DEFAULT);\n+\tif (rsp == NULL) {\n+\t\tuint32_t j;\n+\n+\t\tfor (j = 0; j < n_keys; j++)\n+\t\t\tif (new_rules[j])\n+\t\t\t\trte_free(rules[j]);\n+\n+\t\tfor (j = 0; j < n_keys; j++)\n+\t\t\trte_free(entries_ptr[j]);\n+\n+\t\trte_free(rules);\n+\t\trte_free(new_rules);\n+\t\trte_free(keys_found);\n+\t\trte_free(entries_ptr);\n+\t\treturn -1;\n+\t}\n+\n+\tif (rsp->status) {\n+\t\tfor (i = 0; i < n_keys; i++)\n+\t\t\tif (new_rules[i])\n+\t\t\t\trte_free(rules[i]);\n+\n+\t\tfor (i = 0; i < n_keys; i++)\n+\t\t\trte_free(entries_ptr[i]);\n+\n+\t\tstatus = -1;\n+\t\tgoto cleanup;\n+\t}\n+\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tif (entries_ptr[i] == NULL ||\n+\t\t\t((new_rules[i] == 0) && (keys_found[i] == 0)) ||\n+\t\t\t((new_rules[i] == 1) && (keys_found[i] == 1))) {\n+\t\t\tfor (i = 0; i < n_keys; i++)\n+\t\t\t\tif (new_rules[i])\n+\t\t\t\t\trte_free(rules[i]);\n+\n+\t\t\tfor (i = 0; i < n_keys; i++)\n+\t\t\t\trte_free(entries_ptr[i]);\n+\n+\t\t\tstatus = -1;\n+\t\t\tgoto cleanup;\n+\t\t}\n+\t}\n+\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tmemcpy(&rules[i]->key, &keys[i], sizeof(keys[i]));\n+\t\trules[i]->priority = priorities[i];\n+\t\trules[i]->port_id = port_ids[i];\n+\t\trules[i]->entry_ptr = entries_ptr[i];\n+\n+\t\t/* Commit rule */\n+\t\tif (new_rules[i]) {\n+\t\t\tTAILQ_INSERT_TAIL(&p->rules, rules[i], node);\n+\t\t\tp->n_rules++;\n+\t\t}\n+\n+\t\tprint_firewall_ipv4_rule(rules[i]);\n+\t}\n+\n+cleanup:\n+\tapp_msg_free(app, rsp);\n+\trte_free(rules);\n+\trte_free(new_rules);\n+\trte_free(keys_found);\n+\trte_free(entries_ptr);\n+\n+\treturn status;\n+}\n+\n+int\n+app_pipeline_firewall_delete_bulk(struct app_params *app,\n+\tuint32_t pipeline_id,\n+\tstruct pipeline_firewall_key *keys,\n+\tuint32_t n_keys)\n+{\n+\tstruct app_pipeline_firewall *p;\n+\tstruct pipeline_firewall_del_bulk_msg_req *req;\n+\tstruct pipeline_firewall_del_bulk_msg_rsp *rsp;\n+\n+\tstruct app_pipeline_firewall_rule **rules;\n+\tint *keys_found;\n+\n+\tuint32_t i;\n+\tint status = 0;\n+\n+\t/* Check input arguments */\n+\tif (app == NULL)\n+\t\treturn -1;\n+\n+\tp = app_pipeline_data_fe(app, pipeline_id);\n+\tif (p == NULL)\n+\t\treturn -1;\n+\n+\trules = rte_malloc(NULL,\n+\t\t\tn_keys * sizeof(struct app_pipeline_firewall_rule *),\n+\t\t\tRTE_CACHE_LINE_SIZE);\n+\tif (rules == NULL)\n+\t\treturn -1;\n+\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tif (app_pipeline_firewall_key_check_and_normalize(&keys[i]) != 0) {\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\trules[i] = app_pipeline_firewall_rule_find(p, &keys[i]);\n+\t}\n+\n+\tkeys_found = rte_malloc(NULL,\n+\t\t\tn_keys * sizeof(int),\n+\t\t\tRTE_CACHE_LINE_SIZE);\n+\tif (keys_found == NULL) {\n+\t\trte_free(rules);\n+\t\treturn -1;\n+\t}\n+\n+\t/* Allocate and write request */\n+\treq = app_msg_alloc(app);\n+\tif (req == NULL) {\n+\t\trte_free(rules);\n+\t\trte_free(keys_found);\n+\t\treturn -1;\n+\t}\n+\n+\treq->type = PIPELINE_MSG_REQ_CUSTOM;\n+\treq->subtype = PIPELINE_FIREWALL_MSG_REQ_DEL_BULK;\n+\n+\treq->keys = keys;\n+\treq->n_keys = n_keys;\n+\treq->keys_found = keys_found;\n+\n+\t/* Send request and wait for response */\n+\trsp = app_msg_send_recv(app, pipeline_id, req, MSG_TIMEOUT_DEFAULT);\n+\tif (rsp == NULL) {\n+\t\trte_free(rules);\n+\t\trte_free(keys_found);\n+\t\treturn -1;\n+\t}\n+\n+\tif (rsp->status) {\n+\t\tstatus = -1;\n+\t\tgoto cleanup;\n+\t}\n+\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tif (keys_found[i] == 0) {\n+\t\t\tstatus = -1;\n+\t\t\tgoto cleanup;\n+\t\t}\n+\t}\n+\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tTAILQ_REMOVE(&p->rules, rules[i], node);\n+\t\tp->n_rules--;\n+\t\trte_free(rules[i]);\n+\t}\n+\n+cleanup:\n+\tapp_msg_free(app, rsp);\n+\trte_free(rules);\n+\trte_free(keys_found);\n+\n+\treturn status;\n+}\n+\n+int\n app_pipeline_firewall_add_default_rule(struct app_params *app,\n \tuint32_t pipeline_id,\n \tuint32_t port_id)\n@@ -795,6 +1487,170 @@ cmdline_parse_inst_t cmd_firewall_del_ipv4 = {\n };\n \n /*\n+ * p firewall add bulk\n+ */\n+\n+struct cmd_firewall_add_bulk_result {\n+\tcmdline_fixed_string_t p_string;\n+\tuint32_t pipeline_id;\n+\tcmdline_fixed_string_t firewall_string;\n+\tcmdline_fixed_string_t add_string;\n+\tcmdline_fixed_string_t bulk_string;\n+\tcmdline_fixed_string_t file_path;\n+};\n+\n+static void\n+cmd_firewall_add_bulk_parsed(\n+\tvoid *parsed_result,\n+\t__attribute__((unused)) struct cmdline *cl,\n+\tvoid *data)\n+{\n+\tstruct cmd_firewall_add_bulk_result *params = parsed_result;\n+\tstruct app_params *app = data;\n+\tint status;\n+\n+\tstruct app_pipeline_add_bulk_params add_bulk_params;\n+\n+\tstatus = app_pipeline_add_bulk_parse_file(params->file_path, &add_bulk_params);\n+\tif (status != 0) {\n+\t\tprintf(\"Command failed\\n\");\n+\t\tgoto end;\n+\t}\n+\n+\tstatus = app_pipeline_firewall_add_bulk(app, params->pipeline_id, add_bulk_params.keys,\n+\t\t\tadd_bulk_params.n_keys, add_bulk_params.priorities, add_bulk_params.port_ids);\n+\tif (status != 0) {\n+\t\tprintf(\"Command failed\\n\");\n+\t\tgoto end;\n+\t}\n+\n+end:\n+\trte_free(add_bulk_params.keys);\n+\trte_free(add_bulk_params.priorities);\n+\trte_free(add_bulk_params.port_ids);\n+}\n+\n+cmdline_parse_token_string_t cmd_firewall_add_bulk_p_string =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_firewall_add_bulk_result, p_string,\n+\t\t\"p\");\n+\n+cmdline_parse_token_num_t cmd_firewall_add_bulk_pipeline_id =\n+\tTOKEN_NUM_INITIALIZER(struct cmd_firewall_add_bulk_result, pipeline_id,\n+\t\tUINT32);\n+\n+cmdline_parse_token_string_t cmd_firewall_add_bulk_firewall_string =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_firewall_add_bulk_result,\n+\t\tfirewall_string, \"firewall\");\n+\n+cmdline_parse_token_string_t cmd_firewall_add_bulk_add_string =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_firewall_add_bulk_result,\n+\t\tadd_string, \"add\");\n+\n+cmdline_parse_token_string_t cmd_firewall_add_bulk_bulk_string =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_firewall_add_bulk_result,\n+\t\tbulk_string, \"bulk\");\n+\n+cmdline_parse_token_string_t cmd_firewall_add_bulk_file_path_string =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_firewall_add_bulk_result,\n+\t\tfile_path, NULL);\n+\n+cmdline_parse_inst_t cmd_firewall_add_bulk = {\n+\t.f = cmd_firewall_add_bulk_parsed,\n+\t.data = NULL,\n+\t.help_str = \"Firewall rule add bulk\",\n+\t.tokens = {\n+\t\t(void *) &cmd_firewall_add_bulk_p_string,\n+\t\t(void *) &cmd_firewall_add_bulk_pipeline_id,\n+\t\t(void *) &cmd_firewall_add_bulk_firewall_string,\n+\t\t(void *) &cmd_firewall_add_bulk_add_string,\n+\t\t(void *) &cmd_firewall_add_bulk_bulk_string,\n+\t\t(void *) &cmd_firewall_add_bulk_file_path_string,\n+\t\tNULL,\n+\t},\n+};\n+\n+/*\n+ * p firewall del bulk\n+ */\n+\n+struct cmd_firewall_del_bulk_result {\n+\tcmdline_fixed_string_t p_string;\n+\tuint32_t pipeline_id;\n+\tcmdline_fixed_string_t firewall_string;\n+\tcmdline_fixed_string_t del_string;\n+\tcmdline_fixed_string_t bulk_string;\n+\tcmdline_fixed_string_t file_path;\n+};\n+\n+static void\n+cmd_firewall_del_bulk_parsed(\n+\tvoid *parsed_result,\n+\t__attribute__((unused)) struct cmdline *cl,\n+\tvoid *data)\n+{\n+\tstruct cmd_firewall_del_bulk_result *params = parsed_result;\n+\tstruct app_params *app = data;\n+\tint status;\n+\n+\tstruct app_pipeline_del_bulk_params del_bulk_params;\n+\n+\tstatus = app_pipeline_del_bulk_parse_file(params->file_path, &del_bulk_params);\n+\tif (status != 0) {\n+\t\tprintf(\"Command failed\\n\");\n+\t\tgoto end;\n+\t}\n+\n+\tstatus = app_pipeline_firewall_delete_bulk(app, params->pipeline_id,\n+\t\t\tdel_bulk_params.keys, del_bulk_params.n_keys);\n+\tif (status != 0) {\n+\t\tprintf(\"Command failed\\n\");\n+\t\tgoto end;\n+\t}\n+\n+end:\n+\trte_free(del_bulk_params.keys);\n+}\n+\n+cmdline_parse_token_string_t cmd_firewall_del_bulk_p_string =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_firewall_del_bulk_result, p_string,\n+\t\t\"p\");\n+\n+cmdline_parse_token_num_t cmd_firewall_del_bulk_pipeline_id =\n+\tTOKEN_NUM_INITIALIZER(struct cmd_firewall_del_bulk_result, pipeline_id,\n+\t\tUINT32);\n+\n+cmdline_parse_token_string_t cmd_firewall_del_bulk_firewall_string =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_firewall_del_bulk_result,\n+\t\tfirewall_string, \"firewall\");\n+\n+cmdline_parse_token_string_t cmd_firewall_del_bulk_add_string =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_firewall_del_bulk_result,\n+\t\tdel_string, \"del\");\n+\n+cmdline_parse_token_string_t cmd_firewall_del_bulk_bulk_string =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_firewall_del_bulk_result,\n+\t\tbulk_string, \"bulk\");\n+\n+cmdline_parse_token_string_t cmd_firewall_del_bulk_file_path_string =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_firewall_del_bulk_result,\n+\t\tfile_path, NULL);\n+\n+cmdline_parse_inst_t cmd_firewall_del_bulk = {\n+\t.f = cmd_firewall_del_bulk_parsed,\n+\t.data = NULL,\n+\t.help_str = \"Firewall rule del bulk\",\n+\t.tokens = {\n+\t\t(void *) &cmd_firewall_del_bulk_p_string,\n+\t\t(void *) &cmd_firewall_del_bulk_pipeline_id,\n+\t\t(void *) &cmd_firewall_del_bulk_firewall_string,\n+\t\t(void *) &cmd_firewall_del_bulk_add_string,\n+\t\t(void *) &cmd_firewall_del_bulk_bulk_string,\n+\t\t(void *) &cmd_firewall_del_bulk_file_path_string,\n+\t\tNULL,\n+\t},\n+};\n+\n+/*\n  * p firewall add default\n  */\n struct cmd_firewall_add_default_result {\n@@ -984,6 +1840,8 @@ cmdline_parse_inst_t cmd_firewall_ls = {\n static cmdline_parse_ctx_t pipeline_cmds[] = {\n \t(cmdline_parse_inst_t *) &cmd_firewall_add_ipv4,\n \t(cmdline_parse_inst_t *) &cmd_firewall_del_ipv4,\n+\t(cmdline_parse_inst_t *) &cmd_firewall_add_bulk,\n+\t(cmdline_parse_inst_t *) &cmd_firewall_del_bulk,\n \t(cmdline_parse_inst_t *) &cmd_firewall_add_default,\n \t(cmdline_parse_inst_t *) &cmd_firewall_del_default,\n \t(cmdline_parse_inst_t *) &cmd_firewall_ls,\ndiff --git a/examples/ip_pipeline/pipeline/pipeline_firewall.h b/examples/ip_pipeline/pipeline/pipeline_firewall.h\nindex 82e905d..ccc4e64 100644\n--- a/examples/ip_pipeline/pipeline/pipeline_firewall.h\n+++ b/examples/ip_pipeline/pipeline/pipeline_firewall.h\n@@ -50,6 +50,20 @@ app_pipeline_firewall_delete_rule(struct app_params *app,\n \tstruct pipeline_firewall_key *key);\n \n int\n+app_pipeline_firewall_add_bulk(struct app_params *app,\n+\t\tuint32_t pipeline_id,\n+\t\tstruct pipeline_firewall_key *keys,\n+\t\tuint32_t n_keys,\n+\t\tuint32_t *priorities,\n+\t\tuint32_t *port_ids);\n+\n+int\n+app_pipeline_firewall_delete_bulk(struct app_params *app,\n+\tuint32_t pipeline_id,\n+\tstruct pipeline_firewall_key *keys,\n+\tuint32_t n_keys);\n+\n+int\n app_pipeline_firewall_add_default_rule(struct app_params *app,\n \tuint32_t pipeline_id,\n \tuint32_t port_id);\ndiff --git a/examples/ip_pipeline/pipeline/pipeline_firewall_be.c b/examples/ip_pipeline/pipeline/pipeline_firewall_be.c\nindex b6f305f..1c376f7 100644\n--- a/examples/ip_pipeline/pipeline/pipeline_firewall_be.c\n+++ b/examples/ip_pipeline/pipeline/pipeline_firewall_be.c\n@@ -80,6 +80,12 @@ static void *\n pipeline_firewall_msg_req_del_handler(struct pipeline *p, void *msg);\n \n static void *\n+pipeline_firewall_msg_req_add_bulk_handler(struct pipeline *p, void *msg);\n+\n+static void *\n+pipeline_firewall_msg_req_del_bulk_handler(struct pipeline *p, void *msg);\n+\n+static void *\n pipeline_firewall_msg_req_add_default_handler(struct pipeline *p, void *msg);\n \n static void *\n@@ -90,6 +96,10 @@ static pipeline_msg_req_handler custom_handlers[] = {\n \t\tpipeline_firewall_msg_req_add_handler,\n \t[PIPELINE_FIREWALL_MSG_REQ_DEL] =\n \t\tpipeline_firewall_msg_req_del_handler,\n+\t[PIPELINE_FIREWALL_MSG_REQ_ADD_BULK] =\n+\t\tpipeline_firewall_msg_req_add_bulk_handler,\n+\t[PIPELINE_FIREWALL_MSG_REQ_DEL_BULK] =\n+\t\tpipeline_firewall_msg_req_del_bulk_handler,\n \t[PIPELINE_FIREWALL_MSG_REQ_ADD_DEFAULT] =\n \t\tpipeline_firewall_msg_req_add_default_handler,\n \t[PIPELINE_FIREWALL_MSG_REQ_DEL_DEFAULT] =\n@@ -698,6 +708,153 @@ pipeline_firewall_msg_req_del_handler(struct pipeline *p, void *msg)\n \treturn rsp;\n }\n \n+static void *\n+pipeline_firewall_msg_req_add_bulk_handler(struct pipeline *p, void *msg)\n+{\n+\tstruct pipeline_firewall_add_bulk_msg_req *req = msg;\n+\tstruct pipeline_firewall_add_bulk_msg_rsp *rsp = msg;\n+\n+\tstruct rte_table_acl_rule_add_params *params[req->n_keys];\n+\tstruct firewall_table_entry *entries[req->n_keys];\n+\n+\tuint32_t i, n_keys;\n+\n+\tn_keys = req->n_keys;\n+\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tentries[i] = rte_malloc(NULL,\n+\t\t\t\tsizeof(struct firewall_table_entry),\n+\t\t\t\tRTE_CACHE_LINE_SIZE);\n+\t\tif (entries[i] == NULL) {\n+\t\t\trsp->status = -1;\n+\t\t\treturn rsp;\n+\t\t}\n+\n+\t\tparams[i] = rte_malloc(NULL,\n+\t\t\t\tsizeof(struct rte_table_acl_rule_add_params),\n+\t\t\t\tRTE_CACHE_LINE_SIZE);\n+\t\tif (params[i] == NULL) {\n+\t\t\trsp->status = -1;\n+\t\t\treturn rsp;\n+\t\t}\n+\n+\t\tentries[i]->head.action = RTE_PIPELINE_ACTION_PORT;\n+\t\tentries[i]->head.port_id = p->port_out_id[req->port_ids[i]];\n+\n+\t\tswitch (req->keys[i].type) {\n+\t\tcase PIPELINE_FIREWALL_IPV4_5TUPLE:\n+\t\t\tparams[i]->priority = req->priorities[i];\n+\t\t\tparams[i]->field_value[0].value.u8 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.proto;\n+\t\t\tparams[i]->field_value[0].mask_range.u8 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.proto_mask;\n+\t\t\tparams[i]->field_value[1].value.u32 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.src_ip;\n+\t\t\tparams[i]->field_value[1].mask_range.u32 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.src_ip_mask;\n+\t\t\tparams[i]->field_value[2].value.u32 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.dst_ip;\n+\t\t\tparams[i]->field_value[2].mask_range.u32 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.dst_ip_mask;\n+\t\t\tparams[i]->field_value[3].value.u16 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.src_port_from;\n+\t\t\tparams[i]->field_value[3].mask_range.u16 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.src_port_to;\n+\t\t\tparams[i]->field_value[4].value.u16 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.dst_port_from;\n+\t\t\tparams[i]->field_value[4].mask_range.u16 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.dst_port_to;\n+\t\t\tbreak;\n+\n+\t\tdefault:\n+\t\t\trsp->status = -1; /* Error */\n+\n+\t\t\tfor (i = 0; i < n_keys; i++) {\n+\t\t\t\trte_free(entries[i]);\n+\t\t\t\trte_free(params[i]);\n+\t\t\t}\n+\n+\t\t\treturn rsp;\n+\t\t}\n+\t}\n+\n+\trsp->status = rte_pipeline_table_entry_add_bulk(p->p, p->table_id[0],\n+\t\t\t(void *)params, (struct rte_pipeline_table_entry **)entries,\n+\t\t\tn_keys, req->keys_found,\n+\t\t\t(struct rte_pipeline_table_entry **)req->entries_ptr);\n+\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\trte_free(entries[i]);\n+\t\trte_free(params[i]);\n+\t}\n+\n+\treturn rsp;\n+}\n+\n+static void *\n+pipeline_firewall_msg_req_del_bulk_handler(struct pipeline *p, void *msg)\n+{\n+\tstruct pipeline_firewall_del_bulk_msg_req *req = msg;\n+\tstruct pipeline_firewall_del_bulk_msg_rsp *rsp = msg;\n+\n+\tstruct rte_table_acl_rule_delete_params *params[req->n_keys];\n+\n+\tuint32_t i, n_keys;\n+\n+\tn_keys = req->n_keys;\n+\n+\tfor (i = 0; i < n_keys; i++) {\n+\t\tparams[i] = rte_malloc(NULL,\n+\t\t\t\tsizeof(struct rte_table_acl_rule_delete_params),\n+\t\t\t\tRTE_CACHE_LINE_SIZE);\n+\t\tif (params[i] == NULL) {\n+\t\t\trsp->status = -1;\n+\t\t\treturn rsp;\n+\t\t}\n+\n+\t\tswitch (req->keys[i].type) {\n+\t\tcase PIPELINE_FIREWALL_IPV4_5TUPLE:\n+\t\t\tparams[i]->field_value[0].value.u8 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.proto;\n+\t\t\tparams[i]->field_value[0].mask_range.u8 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.proto_mask;\n+\t\t\tparams[i]->field_value[1].value.u32 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.src_ip;\n+\t\t\tparams[i]->field_value[1].mask_range.u32 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.src_ip_mask;\n+\t\t\tparams[i]->field_value[2].value.u32 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.dst_ip;\n+\t\t\tparams[i]->field_value[2].mask_range.u32 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.dst_ip_mask;\n+\t\t\tparams[i]->field_value[3].value.u16 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.src_port_from;\n+\t\t\tparams[i]->field_value[3].mask_range.u16 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.src_port_to;\n+\t\t\tparams[i]->field_value[4].value.u16 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.dst_port_from;\n+\t\t\tparams[i]->field_value[4].mask_range.u16 =\n+\t\t\t\treq->keys[i].key.ipv4_5tuple.dst_port_to;\n+\t\t\tbreak;\n+\n+\t\tdefault:\n+\t\t\trsp->status = -1; /* Error */\n+\n+\t\t\tfor (i = 0; i < n_keys; i++)\n+\t\t\t\trte_free(params[i]);\n+\n+\t\t\treturn rsp;\n+\t\t}\n+\t}\n+\n+\trsp->status = rte_pipeline_table_entry_delete_bulk(p->p, p->table_id[0],\n+\t\t\t(void **)&params, n_keys, req->keys_found, NULL);\n+\n+\tfor (i = 0; i < n_keys; i++)\n+\t\trte_free(params[i]);\n+\n+\treturn rsp;\n+}\n+\n void *\n pipeline_firewall_msg_req_add_default_handler(struct pipeline *p, void *msg)\n {\ndiff --git a/examples/ip_pipeline/pipeline/pipeline_firewall_be.h b/examples/ip_pipeline/pipeline/pipeline_firewall_be.h\nindex 8e1fd69..f5b0522 100644\n--- a/examples/ip_pipeline/pipeline/pipeline_firewall_be.h\n+++ b/examples/ip_pipeline/pipeline/pipeline_firewall_be.h\n@@ -63,6 +63,8 @@ struct pipeline_firewall_key {\n enum pipeline_firewall_msg_req_type {\n \tPIPELINE_FIREWALL_MSG_REQ_ADD = 0,\n \tPIPELINE_FIREWALL_MSG_REQ_DEL,\n+\tPIPELINE_FIREWALL_MSG_REQ_ADD_BULK,\n+\tPIPELINE_FIREWALL_MSG_REQ_DEL_BULK,\n \tPIPELINE_FIREWALL_MSG_REQ_ADD_DEFAULT,\n \tPIPELINE_FIREWALL_MSG_REQ_DEL_DEFAULT,\n \tPIPELINE_FIREWALL_MSG_REQS\n@@ -106,6 +108,42 @@ struct pipeline_firewall_del_msg_rsp {\n };\n \n /*\n+ * MSG ADD BULK\n+ */\n+struct pipeline_firewall_add_bulk_msg_req {\n+\tenum pipeline_msg_req_type type;\n+\tenum pipeline_firewall_msg_req_type subtype;\n+\n+\tstruct pipeline_firewall_key *keys;\n+\tuint32_t n_keys;\n+\n+\tuint32_t *priorities;\n+\tuint32_t *port_ids;\n+\tint *keys_found;\n+\tvoid **entries_ptr;\n+};\n+struct pipeline_firewall_add_bulk_msg_rsp {\n+\tint status;\n+};\n+\n+/*\n+ * MSG DEL BULK\n+ */\n+struct pipeline_firewall_del_bulk_msg_req {\n+\tenum pipeline_msg_req_type type;\n+\tenum pipeline_firewall_msg_req_type subtype;\n+\n+\t/* key */\n+\tstruct pipeline_firewall_key *keys;\n+\tuint32_t n_keys;\n+\tint *keys_found;\n+};\n+\n+struct pipeline_firewall_del_bulk_msg_rsp {\n+\tint status;\n+};\n+\n+/*\n  * MSG ADD DEFAULT\n  */\n struct pipeline_firewall_add_default_msg_req {\n",
    "prefixes": [
        "dpdk-dev",
        "v4",
        "4/5"
    ]
}