get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 114629,
    "url": "http://patches.dpdk.org/api/patches/114629/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20220804165839.1074817-7-cristian.dumitrescu@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": "<20220804165839.1074817-7-cristian.dumitrescu@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20220804165839.1074817-7-cristian.dumitrescu@intel.com",
    "date": "2022-08-04T16:58:24",
    "name": "[06/21] net/softnic: remove the legacy pipeline CLI commands",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "ac8f65c1e1814762bdfec11873126a47949a086f",
    "submitter": {
        "id": 19,
        "url": "http://patches.dpdk.org/api/people/19/?format=api",
        "name": "Cristian Dumitrescu",
        "email": "cristian.dumitrescu@intel.com"
    },
    "delegate": {
        "id": 3961,
        "url": "http://patches.dpdk.org/api/users/3961/?format=api",
        "username": "arybchenko",
        "first_name": "Andrew",
        "last_name": "Rybchenko",
        "email": "andrew.rybchenko@oktetlabs.ru"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20220804165839.1074817-7-cristian.dumitrescu@intel.com/mbox/",
    "series": [
        {
            "id": 24205,
            "url": "http://patches.dpdk.org/api/series/24205/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=24205",
            "date": "2022-08-04T16:58:18",
            "name": "net/softnic: replace the legacy pipeline with SWX pipeline",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/24205/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/114629/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/114629/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 42D0FA00C4;\n\tThu,  4 Aug 2022 18:59:34 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 91BC642C11;\n\tThu,  4 Aug 2022 18:59:00 +0200 (CEST)",
            "from mga14.intel.com (mga14.intel.com [192.55.52.115])\n by mails.dpdk.org (Postfix) with ESMTP id 8BB904067C\n for <dev@dpdk.org>; Thu,  4 Aug 2022 18:58:54 +0200 (CEST)",
            "from orsmga001.jf.intel.com ([10.7.209.18])\n by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 04 Aug 2022 09:58:53 -0700",
            "from silpixa00400573.ir.intel.com (HELO\n silpixa00400573.ger.corp.intel.com) ([10.237.223.157])\n by orsmga001.jf.intel.com with ESMTP; 04 Aug 2022 09:58:51 -0700"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1659632334; x=1691168334;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=yoQpkTC8iw6xIoVUr7HzjF30M1vhbnmYoG2egDsmI+Y=;\n b=iXZikqrjEGe7946IWDB3VPq+8Fhw2BlIfDF5laGVVLqmFSzDPWMW7dyM\n 4NMA/2tIsLLSg8JRf2Z6T3SFXGZOUv1L7mXCMZyd0iKQbOj1M2JR28++k\n ErkOGuEp0zAuIGj9/XXe36J7iStLjKWiHN7XSrGlleV9v5eWLIYxkJsNa\n Sa45ESujIm86qdgVXhW1YFNE2aJi0UlYw8WslTppdIxuhTciAQ9yRwbsz\n /qXsSTHcnFM6DUv2fJmhr0+9DnMQMrEYkWHw0yyfBJyWYsPx9QJ+gqilv\n qk72E420NB1VKxVI1YVJl2mqhxUcQQePP0U4jIJCGatsU5nMjEy6jtVnj g==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6400,9594,10429\"; a=\"290000107\"",
            "E=Sophos;i=\"5.93,216,1654585200\"; d=\"scan'208\";a=\"290000107\"",
            "E=Sophos;i=\"5.93,216,1654585200\"; d=\"scan'208\";a=\"636163133\""
        ],
        "X-ExtLoop1": "1",
        "From": "Cristian Dumitrescu <cristian.dumitrescu@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "jasvinder.singh@intel.com,\n\tyogesh.jangra@intel.com",
        "Subject": "[PATCH 06/21] net/softnic: remove the legacy pipeline CLI commands",
        "Date": "Thu,  4 Aug 2022 16:58:24 +0000",
        "Message-Id": "<20220804165839.1074817-7-cristian.dumitrescu@intel.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20220804165839.1074817-1-cristian.dumitrescu@intel.com>",
        "References": "<20220804165839.1074817-1-cristian.dumitrescu@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Remove the legacy pipeline CLI commands.\n\nSigned-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>\nSigned-off-by: Yogesh Jangra <yogesh.jangra@intel.com>\n---\n drivers/net/softnic/rte_eth_softnic_cli.c | 4527 ---------------------\n 1 file changed, 4527 deletions(-)",
    "diff": "diff --git a/drivers/net/softnic/rte_eth_softnic_cli.c b/drivers/net/softnic/rte_eth_softnic_cli.c\nindex 501ef08c4c..abe275ec83 100644\n--- a/drivers/net/softnic/rte_eth_softnic_cli.c\n+++ b/drivers/net/softnic/rte_eth_softnic_cli.c\n@@ -10,7 +10,6 @@\n #include <rte_common.h>\n #include <rte_cycles.h>\n #include <rte_string_fns.h>\n-#include <rte_cryptodev.h>\n \n #include \"rte_eth_softnic_internals.h\"\n #include \"parser.h\"\n@@ -186,4227 +185,6 @@ cmd_swq(struct pmd_internals *softnic,\n \t}\n }\n \n-/**\n- * port in action profile <profile_name>\n- *  [filter match | mismatch offset <key_offset> mask <key_mask> key <key_value> port <port_id>]\n- *  [balance offset <key_offset> mask <key_mask> port <port_id0> ... <port_id15>]\n- */\n-static void\n-cmd_port_in_action_profile(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct softnic_port_in_action_profile_params p;\n-\tstruct softnic_port_in_action_profile *ap;\n-\tchar *name;\n-\tuint32_t t0;\n-\n-\tmemset(&p, 0, sizeof(p));\n-\n-\tif (n_tokens < 5) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[1], \"in\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"in\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[2], \"action\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"action\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[3], \"profile\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"profile\");\n-\t\treturn;\n-\t}\n-\n-\tname = tokens[4];\n-\n-\tt0 = 5;\n-\n-\tif (t0 < n_tokens &&\n-\t\t(strcmp(tokens[t0], \"filter\") == 0)) {\n-\t\tuint32_t size;\n-\n-\t\tif (n_tokens < t0 + 10) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, \"port in action profile filter\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"match\") == 0) {\n-\t\t\tp.fltr.filter_on_match = 1;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"mismatch\") == 0) {\n-\t\t\tp.fltr.filter_on_match = 0;\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"match or mismatch\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 2], \"offset\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.fltr.key_offset,\n-\t\t\ttokens[t0 + 3]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"key_offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 4], \"mask\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"mask\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tsize = RTE_PORT_IN_ACTION_FLTR_KEY_SIZE;\n-\t\tif ((softnic_parse_hex_string(tokens[t0 + 5],\n-\t\t\tp.fltr.key_mask, &size) != 0) ||\n-\t\t\tsize != RTE_PORT_IN_ACTION_FLTR_KEY_SIZE) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"key_mask\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 6], \"key\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"key\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tsize = RTE_PORT_IN_ACTION_FLTR_KEY_SIZE;\n-\t\tif ((softnic_parse_hex_string(tokens[t0 + 7],\n-\t\t\tp.fltr.key, &size) != 0) ||\n-\t\t\tsize != RTE_PORT_IN_ACTION_FLTR_KEY_SIZE) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"key_value\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 8], \"port\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"port\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.fltr.port_id,\n-\t\t\ttokens[t0 + 9]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"port_id\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.action_mask |= 1LLU << RTE_PORT_IN_ACTION_FLTR;\n-\t\tt0 += 10;\n-\t} /* filter */\n-\n-\tif (t0 < n_tokens &&\n-\t\t(strcmp(tokens[t0], \"balance\") == 0)) {\n-\t\tuint32_t i;\n-\n-\t\tif (n_tokens < t0 + 22) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"port in action profile balance\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"offset\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.lb.key_offset,\n-\t\t\ttokens[t0 + 2]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"key_offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 3], \"mask\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"mask\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.lb.key_size = RTE_PORT_IN_ACTION_LB_KEY_SIZE_MAX;\n-\t\tif (softnic_parse_hex_string(tokens[t0 + 4],\n-\t\t\tp.lb.key_mask, &p.lb.key_size) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"key_mask\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 5], \"port\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"port\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tfor (i = 0; i < 16; i++)\n-\t\t\tif (softnic_parser_read_uint32(&p.lb.port_id[i],\n-\t\t\ttokens[t0 + 6 + i]) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"port_id\");\n-\t\t\t\treturn;\n-\t\t\t}\n-\n-\t\tp.action_mask |= 1LLU << RTE_PORT_IN_ACTION_LB;\n-\t\tt0 += 22;\n-\t} /* balance */\n-\n-\tif (t0 < n_tokens) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tap = softnic_port_in_action_profile_create(softnic, name, &p);\n-\tif (ap == NULL) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * table action profile <profile_name>\n- *  ipv4 | ipv6\n- *  offset <ip_offset>\n- *  fwd\n- *  [balance offset <key_offset> mask <key_mask> outoffset <out_offset>]\n- *  [meter srtcm | trtcm\n- *      tc <n_tc>\n- *      stats none | pkts | bytes | both]\n- *  [tm spp <n_subports_per_port> pps <n_pipes_per_subport>]\n- *  [encap ether | vlan | qinq | mpls | pppoe | qinq_pppoe |\n- *      vxlan offset <ether_offset> ipv4 | ipv6 vlan on | off]\n- *  [nat src | dst\n- *      proto udp | tcp]\n- *  [ttl drop | fwd\n- *      stats none | pkts]\n- *  [stats pkts | bytes | both]\n- *  [time]\n- *  [tag]\n- *  [decap]\n- *\n- */\n-static void\n-cmd_table_action_profile(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct softnic_table_action_profile_params p;\n-\tstruct softnic_table_action_profile *ap;\n-\tchar *name;\n-\tuint32_t t0;\n-\n-\tmemset(&p, 0, sizeof(p));\n-\n-\tif (n_tokens < 8) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[1], \"action\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"action\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[2], \"profile\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"profile\");\n-\t\treturn;\n-\t}\n-\n-\tname = tokens[3];\n-\n-\tif (strcmp(tokens[4], \"ipv4\") == 0) {\n-\t\tp.common.ip_version = 1;\n-\t} else if (strcmp(tokens[4], \"ipv6\") == 0) {\n-\t\tp.common.ip_version = 0;\n-\t} else {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"ipv4 or ipv6\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"offset\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"offset\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&p.common.ip_offset,\n-\t\ttokens[6]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"ip_offset\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[7], \"fwd\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"fwd\");\n-\t\treturn;\n-\t}\n-\n-\tp.action_mask |= 1LLU << RTE_TABLE_ACTION_FWD;\n-\n-\tt0 = 8;\n-\tif (t0 < n_tokens &&\n-\t\t(strcmp(tokens[t0], \"balance\") == 0)) {\n-\t\tif (n_tokens < t0 + 7) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, \"table action profile balance\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"offset\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.lb.key_offset,\n-\t\t\ttokens[t0 + 2]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"key_offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 3], \"mask\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"mask\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.lb.key_size = RTE_PORT_IN_ACTION_LB_KEY_SIZE_MAX;\n-\t\tif (softnic_parse_hex_string(tokens[t0 + 4],\n-\t\t\tp.lb.key_mask, &p.lb.key_size) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"key_mask\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 5], \"outoffset\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"outoffset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.lb.out_offset,\n-\t\t\ttokens[t0 + 6]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"out_offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.action_mask |= 1LLU << RTE_TABLE_ACTION_LB;\n-\t\tt0 += 7;\n-\t} /* balance */\n-\n-\tif (t0 < n_tokens &&\n-\t\t(strcmp(tokens[t0], \"meter\") == 0)) {\n-\t\tif (n_tokens < t0 + 6) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"table action profile meter\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"srtcm\") == 0) {\n-\t\t\tp.mtr.alg = RTE_TABLE_ACTION_METER_SRTCM;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"trtcm\") == 0) {\n-\t\t\tp.mtr.alg = RTE_TABLE_ACTION_METER_TRTCM;\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\"srtcm or trtcm\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 2], \"tc\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"tc\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.mtr.n_tc,\n-\t\t\ttokens[t0 + 3]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"n_tc\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 4], \"stats\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"stats\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 5], \"none\") == 0) {\n-\t\t\tp.mtr.n_packets_enabled = 0;\n-\t\t\tp.mtr.n_bytes_enabled = 0;\n-\t\t} else if (strcmp(tokens[t0 + 5], \"pkts\") == 0) {\n-\t\t\tp.mtr.n_packets_enabled = 1;\n-\t\t\tp.mtr.n_bytes_enabled = 0;\n-\t\t} else if (strcmp(tokens[t0 + 5], \"bytes\") == 0) {\n-\t\t\tp.mtr.n_packets_enabled = 0;\n-\t\t\tp.mtr.n_bytes_enabled = 1;\n-\t\t} else if (strcmp(tokens[t0 + 5], \"both\") == 0) {\n-\t\t\tp.mtr.n_packets_enabled = 1;\n-\t\t\tp.mtr.n_bytes_enabled = 1;\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\"none or pkts or bytes or both\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.action_mask |= 1LLU << RTE_TABLE_ACTION_MTR;\n-\t\tt0 += 6;\n-\t} /* meter */\n-\n-\tif (t0 < n_tokens &&\n-\t\t(strcmp(tokens[t0], \"tm\") == 0)) {\n-\t\tif (n_tokens < t0 + 5) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"table action profile tm\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"spp\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"spp\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.tm.n_subports_per_port,\n-\t\t\ttokens[t0 + 2]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"n_subports_per_port\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 3], \"pps\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"pps\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.tm.n_pipes_per_subport,\n-\t\t\ttokens[t0 + 4]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"n_pipes_per_subport\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.action_mask |= 1LLU << RTE_TABLE_ACTION_TM;\n-\t\tt0 += 5;\n-\t} /* tm */\n-\n-\tif (t0 < n_tokens &&\n-\t\t(strcmp(tokens[t0], \"encap\") == 0)) {\n-\t\tuint32_t n_extra_tokens = 0;\n-\n-\t\tif (n_tokens < t0 + 2) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"action profile encap\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"ether\") == 0) {\n-\t\t\tp.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_ETHER;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"vlan\") == 0) {\n-\t\t\tp.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_VLAN;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"qinq\") == 0) {\n-\t\t\tp.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_QINQ;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"mpls\") == 0) {\n-\t\t\tp.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_MPLS;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"pppoe\") == 0) {\n-\t\t\tp.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_PPPOE;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"vxlan\") == 0) {\n-\t\t\tif (n_tokens < t0 + 2 + 5) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\t\"action profile encap vxlan\");\n-\t\t\t\treturn;\n-\t\t\t}\n-\n-\t\t\tif (strcmp(tokens[t0 + 2], \"offset\") != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\t\"vxlan: offset\");\n-\t\t\t\treturn;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parser_read_uint32(&p.encap.vxlan.data_offset,\n-\t\t\t\ttokens[t0 + 2 + 1]) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\t\"vxlan: ether_offset\");\n-\t\t\t\treturn;\n-\t\t\t}\n-\n-\t\t\tif (strcmp(tokens[t0 + 2 + 2], \"ipv4\") == 0)\n-\t\t\t\tp.encap.vxlan.ip_version = 1;\n-\t\t\telse if (strcmp(tokens[t0 + 2 + 2], \"ipv6\") == 0)\n-\t\t\t\tp.encap.vxlan.ip_version = 0;\n-\t\t\telse {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\t\"vxlan: ipv4 or ipv6\");\n-\t\t\t\treturn;\n-\t\t\t}\n-\n-\t\t\tif (strcmp(tokens[t0 + 2 + 3], \"vlan\") != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\t\"vxlan: vlan\");\n-\t\t\t\treturn;\n-\t\t\t}\n-\n-\t\t\tif (strcmp(tokens[t0 + 2 + 4], \"on\") == 0)\n-\t\t\t\tp.encap.vxlan.vlan = 1;\n-\t\t\telse if (strcmp(tokens[t0 + 2 + 4], \"off\") == 0)\n-\t\t\t\tp.encap.vxlan.vlan = 0;\n-\t\t\telse {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\t\"vxlan: on or off\");\n-\t\t\t\treturn;\n-\t\t\t}\n-\n-\t\t\tp.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_VXLAN;\n-\t\t\tn_extra_tokens = 5;\n-\n-\t\t} else if (strcmp(tokens[t0 + 1], \"qinq_pppoe\") == 0) {\n-\t\t\tp.encap.encap_mask =\n-\t\t\t\t1LLU << RTE_TABLE_ACTION_ENCAP_QINQ_PPPOE;\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, \"encap\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.action_mask |= 1LLU << RTE_TABLE_ACTION_ENCAP;\n-\t\tt0 += 2 + n_extra_tokens;\n-\t} /* encap */\n-\n-\tif (t0 < n_tokens &&\n-\t\t(strcmp(tokens[t0], \"nat\") == 0)) {\n-\t\tif (n_tokens < t0 + 4) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"table action profile nat\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"src\") == 0) {\n-\t\t\tp.nat.source_nat = 1;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"dst\") == 0) {\n-\t\t\tp.nat.source_nat = 0;\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\"src or dst\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 2], \"proto\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"proto\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 3], \"tcp\") == 0) {\n-\t\t\tp.nat.proto = 0x06;\n-\t\t} else if (strcmp(tokens[t0 + 3], \"udp\") == 0) {\n-\t\t\tp.nat.proto = 0x11;\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\"tcp or udp\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.action_mask |= 1LLU << RTE_TABLE_ACTION_NAT;\n-\t\tt0 += 4;\n-\t} /* nat */\n-\n-\tif (t0 < n_tokens &&\n-\t\t(strcmp(tokens[t0], \"ttl\") == 0)) {\n-\t\tif (n_tokens < t0 + 4) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"table action profile ttl\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"drop\") == 0) {\n-\t\t\tp.ttl.drop = 1;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"fwd\") == 0) {\n-\t\t\tp.ttl.drop = 0;\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\"drop or fwd\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 2], \"stats\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"stats\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 3], \"none\") == 0) {\n-\t\t\tp.ttl.n_packets_enabled = 0;\n-\t\t} else if (strcmp(tokens[t0 + 3], \"pkts\") == 0) {\n-\t\t\tp.ttl.n_packets_enabled = 1;\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\"none or pkts\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.action_mask |= 1LLU << RTE_TABLE_ACTION_TTL;\n-\t\tt0 += 4;\n-\t} /* ttl */\n-\n-\tif (t0 < n_tokens &&\n-\t\t(strcmp(tokens[t0], \"stats\") == 0)) {\n-\t\tif (n_tokens < t0 + 2) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"table action profile stats\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"pkts\") == 0) {\n-\t\t\tp.stats.n_packets_enabled = 1;\n-\t\t\tp.stats.n_bytes_enabled = 0;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"bytes\") == 0) {\n-\t\t\tp.stats.n_packets_enabled = 0;\n-\t\t\tp.stats.n_bytes_enabled = 1;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"both\") == 0) {\n-\t\t\tp.stats.n_packets_enabled = 1;\n-\t\t\tp.stats.n_bytes_enabled = 1;\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size,\tMSG_ARG_NOT_FOUND,\n-\t\t\t\t\"pkts or bytes or both\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.action_mask |= 1LLU << RTE_TABLE_ACTION_STATS;\n-\t\tt0 += 2;\n-\t} /* stats */\n-\n-\tif (t0 < n_tokens &&\n-\t\t(strcmp(tokens[t0], \"time\") == 0)) {\n-\t\tp.action_mask |= 1LLU << RTE_TABLE_ACTION_TIME;\n-\t\tt0 += 1;\n-\t} /* time */\n-\n-\tif (t0 < n_tokens &&\n-\t\t(strcmp(tokens[t0], \"tag\") == 0)) {\n-\t\tp.action_mask |= 1LLU << RTE_TABLE_ACTION_TAG;\n-\t\tt0 += 1;\n-\t} /* tag */\n-\n-\tif (t0 < n_tokens &&\n-\t\t(strcmp(tokens[t0], \"decap\") == 0)) {\n-\t\tp.action_mask |= 1LLU << RTE_TABLE_ACTION_DECAP;\n-\t\tt0 += 1;\n-\t} /* decap */\n-\n-\tif (t0 < n_tokens) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tap = softnic_table_action_profile_create(softnic, name, &p);\n-\tif (ap == NULL) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name>\n- *  period <timer_period_ms>\n- *  offset_port_id <offset_port_id>\n- */\n-static void\n-cmd_pipeline(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct pipeline_params p;\n-\tchar *name;\n-\tstruct pipeline *pipeline;\n-\n-\tif (n_tokens != 6) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tname = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"period\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"period\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&p.timer_period_ms,\n-\t\ttokens[3]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"timer_period_ms\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[4], \"offset_port_id\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"offset_port_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&p.offset_port_id,\n-\t\ttokens[5]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"offset_port_id\");\n-\t\treturn;\n-\t}\n-\n-\tpipeline = softnic_pipeline_create(softnic, name, &p);\n-\tif (pipeline == NULL) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> port in\n- *  bsz <burst_size>\n- *  link <link_name> rxq <queue_id>\n- *  | swq <swq_name>\n- *  | source mempool <mempool_name> file <file_name> bpp <n_bytes_per_pkt>\n- *  [action <port_in_action_profile_name>]\n- *  [disabled]\n- */\n-static void\n-cmd_pipeline_port_in(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct softnic_port_in_params p;\n-\tchar *pipeline_name;\n-\tuint32_t t0;\n-\tint enabled, status;\n-\n-\tmemset(&p, 0, sizeof(p));\n-\n-\tif (n_tokens < 7) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"port\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"port\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[3], \"in\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"in\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[4], \"bsz\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"bsz\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&p.burst_size, tokens[5]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"burst_size\");\n-\t\treturn;\n-\t}\n-\n-\tt0 = 6;\n-\n-\tif (strcmp(tokens[t0], \"link\") == 0) {\n-\t\tif (n_tokens < t0 + 4) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"pipeline port in link\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.type = PORT_IN_RXQ;\n-\n-\t\tstrlcpy(p.dev_name, tokens[t0 + 1], sizeof(p.dev_name));\n-\n-\t\tif (strcmp(tokens[t0 + 2], \"rxq\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"rxq\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint16(&p.rxq.queue_id,\n-\t\t\ttokens[t0 + 3]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"queue_id\");\n-\t\t\treturn;\n-\t\t}\n-\t\tt0 += 4;\n-\t} else if (strcmp(tokens[t0], \"swq\") == 0) {\n-\t\tif (n_tokens < t0 + 2) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"pipeline port in swq\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.type = PORT_IN_SWQ;\n-\n-\t\tstrlcpy(p.dev_name, tokens[t0 + 1], sizeof(p.dev_name));\n-\n-\t\tt0 += 2;\n-\t} else if (strcmp(tokens[t0], \"source\") == 0) {\n-\t\tif (n_tokens < t0 + 6) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"pipeline port in source\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.type = PORT_IN_SOURCE;\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"mempool\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\"mempool\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.source.mempool_name = tokens[t0 + 2];\n-\n-\t\tif (strcmp(tokens[t0 + 3], \"file\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\"file\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.source.file_name = tokens[t0 + 4];\n-\n-\t\tif (strcmp(tokens[t0 + 5], \"bpp\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\"bpp\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.source.n_bytes_per_pkt,\n-\t\t\ttokens[t0 + 6]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"n_bytes_per_pkt\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tt0 += 7;\n-\t} else {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tif (n_tokens > t0 &&\n-\t\t(strcmp(tokens[t0], \"action\") == 0)) {\n-\t\tif (n_tokens < t0 + 2) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, \"action\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tstrlcpy(p.action_profile_name, tokens[t0 + 1],\n-\t\t\tsizeof(p.action_profile_name));\n-\n-\t\tt0 += 2;\n-\t}\n-\n-\tenabled = 1;\n-\tif (n_tokens > t0 &&\n-\t\t(strcmp(tokens[t0], \"disabled\") == 0)) {\n-\t\tenabled = 0;\n-\n-\t\tt0 += 1;\n-\t}\n-\n-\tif (n_tokens != t0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tstatus = softnic_pipeline_port_in_create(softnic,\n-\t\tpipeline_name,\n-\t\t&p,\n-\t\tenabled);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> port out\n- *  bsz <burst_size>\n- *  link <link_name> txq <txq_id>\n- *  | swq <swq_name>\n- *  | sink [file <file_name> pkts <max_n_pkts>]\n- */\n-static void\n-cmd_pipeline_port_out(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct softnic_port_out_params p;\n-\tchar *pipeline_name;\n-\tint status;\n-\n-\tmemset(&p, 0, sizeof(p));\n-\n-\tif (n_tokens < 7) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"port\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"port\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[3], \"out\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"out\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[4], \"bsz\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"bsz\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&p.burst_size, tokens[5]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"burst_size\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[6], \"link\") == 0) {\n-\t\tif (n_tokens != 10) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"pipeline port out link\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.type = PORT_OUT_TXQ;\n-\n-\t\tstrlcpy(p.dev_name, tokens[7], sizeof(p.dev_name));\n-\n-\t\tif (strcmp(tokens[8], \"txq\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"txq\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint16(&p.txq.queue_id,\n-\t\t\ttokens[9]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"queue_id\");\n-\t\t\treturn;\n-\t\t}\n-\t} else if (strcmp(tokens[6], \"swq\") == 0) {\n-\t\tif (n_tokens != 8) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"pipeline port out swq\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.type = PORT_OUT_SWQ;\n-\n-\t\tstrlcpy(p.dev_name, tokens[7], sizeof(p.dev_name));\n-\t} else if (strcmp(tokens[6], \"sink\") == 0) {\n-\t\tif ((n_tokens != 7) && (n_tokens != 11)) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"pipeline port out sink\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.type = PORT_OUT_SINK;\n-\n-\t\tif (n_tokens == 7) {\n-\t\t\tp.sink.file_name = NULL;\n-\t\t\tp.sink.max_n_pkts = 0;\n-\t\t} else {\n-\t\t\tif (strcmp(tokens[7], \"file\") != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\t\"file\");\n-\t\t\t\treturn;\n-\t\t\t}\n-\n-\t\t\tp.sink.file_name = tokens[8];\n-\n-\t\t\tif (strcmp(tokens[9], \"pkts\") != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"pkts\");\n-\t\t\t\treturn;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parser_read_uint32(&p.sink.max_n_pkts,\n-\t\t\t\ttokens[10]) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"max_n_pkts\");\n-\t\t\t\treturn;\n-\t\t\t}\n-\t\t}\n-\t} else {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tstatus = softnic_pipeline_port_out_create(softnic, pipeline_name, &p);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> table\n- *      match\n- *      acl\n- *          ipv4 | ipv6\n- *          offset <ip_header_offset>\n- *          size <n_rules>\n- *      | array\n- *          offset <key_offset>\n- *          size <n_keys>\n- *      | hash\n- *          ext | lru\n- *          key <key_size>\n- *          mask <key_mask>\n- *          offset <key_offset>\n- *          buckets <n_buckets>\n- *          size <n_keys>\n- *      | lpm\n- *          ipv4 | ipv6\n- *          offset <ip_header_offset>\n- *          size <n_rules>\n- *      | stub\n- *  [action <table_action_profile_name>]\n- */\n-static void\n-cmd_pipeline_table(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct softnic_table_params p;\n-\tchar *pipeline_name;\n-\tuint32_t t0;\n-\tint status;\n-\n-\tmemset(&p, 0, sizeof(p));\n-\n-\tif (n_tokens < 5) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"table\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"table\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[3], \"match\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"match\");\n-\t\treturn;\n-\t}\n-\n-\tt0 = 4;\n-\tif (strcmp(tokens[t0], \"acl\") == 0) {\n-\t\tif (n_tokens < t0 + 6) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"pipeline table acl\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.match_type = TABLE_ACL;\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"ipv4\") == 0) {\n-\t\t\tp.match.acl.ip_version = 1;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"ipv6\") == 0) {\n-\t\t\tp.match.acl.ip_version = 0;\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\"ipv4 or ipv6\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 2], \"offset\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.match.acl.ip_header_offset,\n-\t\t\ttokens[t0 + 3]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"ip_header_offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 4], \"size\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"size\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.match.acl.n_rules,\n-\t\t\ttokens[t0 + 5]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"n_rules\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tt0 += 6;\n-\t} else if (strcmp(tokens[t0], \"array\") == 0) {\n-\t\tif (n_tokens < t0 + 5) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"pipeline table array\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.match_type = TABLE_ARRAY;\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"offset\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.match.array.key_offset,\n-\t\t\ttokens[t0 + 2]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"key_offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 3], \"size\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"size\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.match.array.n_keys,\n-\t\t\ttokens[t0 + 4]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"n_keys\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tt0 += 5;\n-\t} else if (strcmp(tokens[t0], \"hash\") == 0) {\n-\t\tuint32_t key_mask_size = TABLE_RULE_MATCH_SIZE_MAX;\n-\n-\t\tif (n_tokens < t0 + 12) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"pipeline table hash\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.match_type = TABLE_HASH;\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"ext\") == 0) {\n-\t\t\tp.match.hash.extendable_bucket = 1;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"lru\") == 0) {\n-\t\t\tp.match.hash.extendable_bucket = 0;\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\"ext or lru\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 2], \"key\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"key\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif ((softnic_parser_read_uint32(&p.match.hash.key_size,\n-\t\t\ttokens[t0 + 3]) != 0) ||\n-\t\t\tp.match.hash.key_size == 0 ||\n-\t\t\tp.match.hash.key_size > TABLE_RULE_MATCH_SIZE_MAX) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"key_size\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 4], \"mask\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"mask\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif ((softnic_parse_hex_string(tokens[t0 + 5],\n-\t\t\tp.match.hash.key_mask, &key_mask_size) != 0) ||\n-\t\t\tkey_mask_size != p.match.hash.key_size) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"key_mask\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 6], \"offset\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.match.hash.key_offset,\n-\t\t\ttokens[t0 + 7]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"key_offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 8], \"buckets\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"buckets\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.match.hash.n_buckets,\n-\t\t\ttokens[t0 + 9]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"n_buckets\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 10], \"size\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"size\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.match.hash.n_keys,\n-\t\t\ttokens[t0 + 11]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"n_keys\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tt0 += 12;\n-\t} else if (strcmp(tokens[t0], \"lpm\") == 0) {\n-\t\tif (n_tokens < t0 + 6) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"pipeline table lpm\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.match_type = TABLE_LPM;\n-\n-\t\tif (strcmp(tokens[t0 + 1], \"ipv4\") == 0) {\n-\t\t\tp.match.lpm.key_size = 4;\n-\t\t} else if (strcmp(tokens[t0 + 1], \"ipv6\") == 0) {\n-\t\t\tp.match.lpm.key_size = 16;\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\"ipv4 or ipv6\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 2], \"offset\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.match.lpm.key_offset,\n-\t\t\ttokens[t0 + 3]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"key_offset\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[t0 + 4], \"size\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"size\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&p.match.lpm.n_rules,\n-\t\t\ttokens[t0 + 5]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"n_rules\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tt0 += 6;\n-\t} else if (strcmp(tokens[t0], \"stub\") == 0) {\n-\t\tp.match_type = TABLE_STUB;\n-\n-\t\tt0 += 1;\n-\t} else {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tif (n_tokens > t0 &&\n-\t\t(strcmp(tokens[t0], \"action\") == 0)) {\n-\t\tif (n_tokens < t0 + 2) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, \"action\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tstrlcpy(p.action_profile_name, tokens[t0 + 1],\n-\t\t\tsizeof(p.action_profile_name));\n-\n-\t\tt0 += 2;\n-\t}\n-\n-\tif (n_tokens > t0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tstatus = softnic_pipeline_table_create(softnic, pipeline_name, &p);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> port in <port_id> table <table_id>\n- */\n-static void\n-cmd_pipeline_port_in_table(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tchar *pipeline_name;\n-\tuint32_t port_id, table_id;\n-\tint status;\n-\n-\tif (n_tokens != 7) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"port\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"port\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[3], \"in\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"in\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&port_id, tokens[4]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"port_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"table\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"table\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&table_id, tokens[6]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"table_id\");\n-\t\treturn;\n-\t}\n-\n-\tstatus = softnic_pipeline_port_in_connect_to_table(softnic,\n-\t\tpipeline_name,\n-\t\tport_id,\n-\t\ttable_id);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> port in <port_id> stats read [clear]\n- */\n-\n-#define MSG_PIPELINE_PORT_IN_STATS                         \\\n-\t\"Pkts in: %\" PRIu64 \"\\n\"                           \\\n-\t\"Pkts dropped by AH: %\" PRIu64 \"\\n\"                \\\n-\t\"Pkts dropped by other: %\" PRIu64 \"\\n\"\n-\n-static void\n-cmd_pipeline_port_in_stats(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct rte_pipeline_port_in_stats stats;\n-\tchar *pipeline_name;\n-\tuint32_t port_id;\n-\tint clear, status;\n-\n-\tif (n_tokens != 7 &&\n-\t\tn_tokens != 8) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"port\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"port\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[3], \"in\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"in\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&port_id, tokens[4]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"port_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"stats\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"stats\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[6], \"read\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"read\");\n-\t\treturn;\n-\t}\n-\n-\tclear = 0;\n-\tif (n_tokens == 8) {\n-\t\tif (strcmp(tokens[7], \"clear\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"clear\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tclear = 1;\n-\t}\n-\n-\tstatus = softnic_pipeline_port_in_stats_read(softnic,\n-\t\tpipeline_name,\n-\t\tport_id,\n-\t\t&stats,\n-\t\tclear);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tsnprintf(out, out_size, MSG_PIPELINE_PORT_IN_STATS,\n-\t\tstats.stats.n_pkts_in,\n-\t\tstats.n_pkts_dropped_by_ah,\n-\t\tstats.stats.n_pkts_drop);\n-}\n-\n-/**\n- * pipeline <pipeline_name> port in <port_id> enable\n- */\n-static void\n-cmd_softnic_pipeline_port_in_enable(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tchar *pipeline_name;\n-\tuint32_t port_id;\n-\tint status;\n-\n-\tif (n_tokens != 6) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"port\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"port\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[3], \"in\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"in\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&port_id, tokens[4]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"port_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"enable\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"enable\");\n-\t\treturn;\n-\t}\n-\n-\tstatus = softnic_pipeline_port_in_enable(softnic, pipeline_name, port_id);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> port in <port_id> disable\n- */\n-static void\n-cmd_softnic_pipeline_port_in_disable(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tchar *pipeline_name;\n-\tuint32_t port_id;\n-\tint status;\n-\n-\tif (n_tokens != 6) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"port\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"port\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[3], \"in\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"in\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&port_id, tokens[4]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"port_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"disable\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"disable\");\n-\t\treturn;\n-\t}\n-\n-\tstatus = softnic_pipeline_port_in_disable(softnic, pipeline_name, port_id);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> port out <port_id> stats read [clear]\n- */\n-#define MSG_PIPELINE_PORT_OUT_STATS                        \\\n-\t\"Pkts in: %\" PRIu64 \"\\n\"                           \\\n-\t\"Pkts dropped by AH: %\" PRIu64 \"\\n\"                \\\n-\t\"Pkts dropped by other: %\" PRIu64 \"\\n\"\n-\n-static void\n-cmd_pipeline_port_out_stats(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct rte_pipeline_port_out_stats stats;\n-\tchar *pipeline_name;\n-\tuint32_t port_id;\n-\tint clear, status;\n-\n-\tif (n_tokens != 7 &&\n-\t\tn_tokens != 8) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"port\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"port\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[3], \"out\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"out\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&port_id, tokens[4]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"port_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"stats\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"stats\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[6], \"read\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"read\");\n-\t\treturn;\n-\t}\n-\n-\tclear = 0;\n-\tif (n_tokens == 8) {\n-\t\tif (strcmp(tokens[7], \"clear\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"clear\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tclear = 1;\n-\t}\n-\n-\tstatus = softnic_pipeline_port_out_stats_read(softnic,\n-\t\tpipeline_name,\n-\t\tport_id,\n-\t\t&stats,\n-\t\tclear);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tsnprintf(out, out_size, MSG_PIPELINE_PORT_OUT_STATS,\n-\t\tstats.stats.n_pkts_in,\n-\t\tstats.n_pkts_dropped_by_ah,\n-\t\tstats.stats.n_pkts_drop);\n-}\n-\n-/**\n- * pipeline <pipeline_name> table <table_id> stats read [clear]\n- */\n-#define MSG_PIPELINE_TABLE_STATS                                     \\\n-\t\"Pkts in: %\" PRIu64 \"\\n\"                                     \\\n-\t\"Pkts in with lookup miss: %\" PRIu64 \"\\n\"                    \\\n-\t\"Pkts in with lookup hit dropped by AH: %\" PRIu64 \"\\n\"       \\\n-\t\"Pkts in with lookup hit dropped by others: %\" PRIu64 \"\\n\"   \\\n-\t\"Pkts in with lookup miss dropped by AH: %\" PRIu64 \"\\n\"      \\\n-\t\"Pkts in with lookup miss dropped by others: %\" PRIu64 \"\\n\"\n-\n-static void\n-cmd_pipeline_table_stats(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct rte_pipeline_table_stats stats;\n-\tchar *pipeline_name;\n-\tuint32_t table_id;\n-\tint clear, status;\n-\n-\tif (n_tokens != 6 &&\n-\t\tn_tokens != 7) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"table\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"port\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&table_id, tokens[3]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"table_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[4], \"stats\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"stats\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"read\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"read\");\n-\t\treturn;\n-\t}\n-\n-\tclear = 0;\n-\tif (n_tokens == 7) {\n-\t\tif (strcmp(tokens[6], \"clear\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"clear\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tclear = 1;\n-\t}\n-\n-\tstatus = softnic_pipeline_table_stats_read(softnic,\n-\t\tpipeline_name,\n-\t\ttable_id,\n-\t\t&stats,\n-\t\tclear);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tsnprintf(out, out_size, MSG_PIPELINE_TABLE_STATS,\n-\t\tstats.stats.n_pkts_in,\n-\t\tstats.stats.n_pkts_lookup_miss,\n-\t\tstats.n_pkts_dropped_by_lkp_hit_ah,\n-\t\tstats.n_pkts_dropped_lkp_hit,\n-\t\tstats.n_pkts_dropped_by_lkp_miss_ah,\n-\t\tstats.n_pkts_dropped_lkp_miss);\n-}\n-\n-/**\n- * <match> ::=\n- *\n- * match\n- *    acl\n- *       priority <priority>\n- *       ipv4 | ipv6 <sa> <sa_depth> <da> <da_depth>\n- *       <sp0> <sp1> <dp0> <dp1> <proto>\n- *    | array <pos>\n- *    | hash\n- *       raw <key>\n- *       | ipv4_5tuple <sa> <da> <sp> <dp> <proto>\n- *       | ipv6_5tuple <sa> <da> <sp> <dp> <proto>\n- *       | ipv4_addr <addr>\n- *       | ipv6_addr <addr>\n- *       | qinq <svlan> <cvlan>\n- *    | lpm\n- *       ipv4 | ipv6 <addr> <depth>\n- */\n-struct pkt_key_qinq {\n-\tuint16_t ethertype_svlan;\n-\tuint16_t svlan;\n-\tuint16_t ethertype_cvlan;\n-\tuint16_t cvlan;\n-} __rte_packed;\n-\n-struct pkt_key_ipv4_5tuple {\n-\tuint8_t time_to_live;\n-\tuint8_t proto;\n-\tuint16_t hdr_checksum;\n-\tuint32_t sa;\n-\tuint32_t da;\n-\tuint16_t sp;\n-\tuint16_t dp;\n-} __rte_packed;\n-\n-struct pkt_key_ipv6_5tuple {\n-\tuint16_t payload_length;\n-\tuint8_t proto;\n-\tuint8_t hop_limit;\n-\tuint8_t sa[16];\n-\tuint8_t da[16];\n-\tuint16_t sp;\n-\tuint16_t dp;\n-} __rte_packed;\n-\n-struct pkt_key_ipv4_addr {\n-\tuint32_t addr;\n-} __rte_packed;\n-\n-struct pkt_key_ipv6_addr {\n-\tuint8_t addr[16];\n-} __rte_packed;\n-\n-static uint32_t\n-parse_match(char **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size,\n-\tstruct softnic_table_rule_match *m)\n-{\n-\tmemset(m, 0, sizeof(*m));\n-\n-\tif (n_tokens < 2)\n-\t\treturn 0;\n-\n-\tif (strcmp(tokens[0], \"match\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"match\");\n-\t\treturn 0;\n-\t}\n-\n-\tif (strcmp(tokens[1], \"acl\") == 0) {\n-\t\tif (n_tokens < 14) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tm->match_type = TABLE_ACL;\n-\n-\t\tif (strcmp(tokens[2], \"priority\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"priority\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&m->match.acl.priority,\n-\t\t\ttokens[3]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"priority\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[4], \"ipv4\") == 0) {\n-\t\t\tstruct in_addr saddr, daddr;\n-\n-\t\t\tm->match.acl.ip_version = 1;\n-\n-\t\t\tif (softnic_parse_ipv4_addr(tokens[5], &saddr) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"sa\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\t\t\tm->match.acl.ipv4.sa = rte_be_to_cpu_32(saddr.s_addr);\n-\n-\t\t\tif (softnic_parse_ipv4_addr(tokens[7], &daddr) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"da\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\t\t\tm->match.acl.ipv4.da = rte_be_to_cpu_32(daddr.s_addr);\n-\t\t} else if (strcmp(tokens[4], \"ipv6\") == 0) {\n-\t\t\tstruct in6_addr saddr, daddr;\n-\n-\t\t\tm->match.acl.ip_version = 0;\n-\n-\t\t\tif (softnic_parse_ipv6_addr(tokens[5], &saddr) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"sa\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\t\t\tmemcpy(m->match.acl.ipv6.sa, saddr.s6_addr, 16);\n-\n-\t\t\tif (softnic_parse_ipv6_addr(tokens[7], &daddr) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"da\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\t\t\tmemcpy(m->match.acl.ipv6.da, daddr.s6_addr, 16);\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND,\n-\t\t\t\t\"ipv4 or ipv6\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&m->match.acl.sa_depth,\n-\t\t\ttokens[6]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"sa_depth\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&m->match.acl.da_depth,\n-\t\t\ttokens[8]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"da_depth\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint16(&m->match.acl.sp0, tokens[9]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"sp0\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint16(&m->match.acl.sp1, tokens[10]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"sp1\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint16(&m->match.acl.dp0, tokens[11]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"dp0\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint16(&m->match.acl.dp1, tokens[12]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"dp1\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint8(&m->match.acl.proto, tokens[13]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"proto\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tm->match.acl.proto_mask = 0xff;\n-\n-\t\treturn 14;\n-\t} /* acl */\n-\n-\tif (strcmp(tokens[1], \"array\") == 0) {\n-\t\tif (n_tokens < 3) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tm->match_type = TABLE_ARRAY;\n-\n-\t\tif (softnic_parser_read_uint32(&m->match.array.pos, tokens[2]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"pos\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\treturn 3;\n-\t} /* array */\n-\n-\tif (strcmp(tokens[1], \"hash\") == 0) {\n-\t\tif (n_tokens < 3) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tm->match_type = TABLE_HASH;\n-\n-\t\tif (strcmp(tokens[2], \"raw\") == 0) {\n-\t\t\tuint32_t key_size = TABLE_RULE_MATCH_SIZE_MAX;\n-\n-\t\t\tif (n_tokens < 4) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\ttokens[0]);\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parse_hex_string(tokens[3],\n-\t\t\t\tm->match.hash.key, &key_size) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"key\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\treturn 4;\n-\t\t} /* hash raw */\n-\n-\t\tif (strcmp(tokens[2], \"ipv4_5tuple\") == 0) {\n-\t\t\tstruct pkt_key_ipv4_5tuple *ipv4 =\n-\t\t\t\t(struct pkt_key_ipv4_5tuple *)m->match.hash.key;\n-\t\t\tstruct in_addr saddr, daddr;\n-\t\t\tuint16_t sp, dp;\n-\t\t\tuint8_t proto;\n-\n-\t\t\tif (n_tokens < 8) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\ttokens[0]);\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parse_ipv4_addr(tokens[3], &saddr) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"sa\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parse_ipv4_addr(tokens[4], &daddr) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"da\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parser_read_uint16(&sp, tokens[5]) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"sp\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parser_read_uint16(&dp, tokens[6]) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"dp\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parser_read_uint8(&proto, tokens[7]) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\t\"proto\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tipv4->sa = saddr.s_addr;\n-\t\t\tipv4->da = daddr.s_addr;\n-\t\t\tipv4->sp = rte_cpu_to_be_16(sp);\n-\t\t\tipv4->dp = rte_cpu_to_be_16(dp);\n-\t\t\tipv4->proto = proto;\n-\n-\t\t\treturn 8;\n-\t\t} /* hash ipv4_5tuple */\n-\n-\t\tif (strcmp(tokens[2], \"ipv6_5tuple\") == 0) {\n-\t\t\tstruct pkt_key_ipv6_5tuple *ipv6 =\n-\t\t\t\t(struct pkt_key_ipv6_5tuple *)m->match.hash.key;\n-\t\t\tstruct in6_addr saddr, daddr;\n-\t\t\tuint16_t sp, dp;\n-\t\t\tuint8_t proto;\n-\n-\t\t\tif (n_tokens < 8) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\ttokens[0]);\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parse_ipv6_addr(tokens[3], &saddr) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"sa\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parse_ipv6_addr(tokens[4], &daddr) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"da\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parser_read_uint16(&sp, tokens[5]) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"sp\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parser_read_uint16(&dp, tokens[6]) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"dp\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parser_read_uint8(&proto, tokens[7]) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\t\"proto\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tmemcpy(ipv6->sa, saddr.s6_addr, 16);\n-\t\t\tmemcpy(ipv6->da, daddr.s6_addr, 16);\n-\t\t\tipv6->sp = rte_cpu_to_be_16(sp);\n-\t\t\tipv6->dp = rte_cpu_to_be_16(dp);\n-\t\t\tipv6->proto = proto;\n-\n-\t\t\treturn 8;\n-\t\t} /* hash ipv6_5tuple */\n-\n-\t\tif (strcmp(tokens[2], \"ipv4_addr\") == 0) {\n-\t\t\tstruct pkt_key_ipv4_addr *ipv4_addr =\n-\t\t\t\t(struct pkt_key_ipv4_addr *)m->match.hash.key;\n-\t\t\tstruct in_addr addr;\n-\n-\t\t\tif (n_tokens < 4) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\ttokens[0]);\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parse_ipv4_addr(tokens[3], &addr) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\t\"addr\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tipv4_addr->addr = addr.s_addr;\n-\n-\t\t\treturn 4;\n-\t\t} /* hash ipv4_addr */\n-\n-\t\tif (strcmp(tokens[2], \"ipv6_addr\") == 0) {\n-\t\t\tstruct pkt_key_ipv6_addr *ipv6_addr =\n-\t\t\t\t(struct pkt_key_ipv6_addr *)m->match.hash.key;\n-\t\t\tstruct in6_addr addr;\n-\n-\t\t\tif (n_tokens < 4) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\ttokens[0]);\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif (softnic_parse_ipv6_addr(tokens[3], &addr) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\t\"addr\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tmemcpy(ipv6_addr->addr, addr.s6_addr, 16);\n-\n-\t\t\treturn 4;\n-\t\t} /* hash ipv6_5tuple */\n-\n-\t\tif (strcmp(tokens[2], \"qinq\") == 0) {\n-\t\t\tstruct pkt_key_qinq *qinq =\n-\t\t\t\t(struct pkt_key_qinq *)m->match.hash.key;\n-\t\t\tuint16_t svlan, cvlan;\n-\n-\t\t\tif (n_tokens < 5) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\ttokens[0]);\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif ((softnic_parser_read_uint16(&svlan, tokens[3]) != 0) ||\n-\t\t\t\tsvlan > 0xFFF) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\t\"svlan\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tif ((softnic_parser_read_uint16(&cvlan, tokens[4]) != 0) ||\n-\t\t\t\tcvlan > 0xFFF) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\t\"cvlan\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tqinq->svlan = rte_cpu_to_be_16(svlan);\n-\t\t\tqinq->cvlan = rte_cpu_to_be_16(cvlan);\n-\n-\t\t\treturn 5;\n-\t\t} /* hash qinq */\n-\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn 0;\n-\t} /* hash */\n-\n-\tif (strcmp(tokens[1], \"lpm\") == 0) {\n-\t\tif (n_tokens < 5) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tm->match_type = TABLE_LPM;\n-\n-\t\tif (strcmp(tokens[2], \"ipv4\") == 0) {\n-\t\t\tstruct in_addr addr;\n-\n-\t\t\tm->match.lpm.ip_version = 1;\n-\n-\t\t\tif (softnic_parse_ipv4_addr(tokens[3], &addr) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\t\"addr\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tm->match.lpm.ipv4 = rte_be_to_cpu_32(addr.s_addr);\n-\t\t} else if (strcmp(tokens[2], \"ipv6\") == 0) {\n-\t\t\tstruct in6_addr addr;\n-\n-\t\t\tm->match.lpm.ip_version = 0;\n-\n-\t\t\tif (softnic_parse_ipv6_addr(tokens[3], &addr) != 0) {\n-\t\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\t\"addr\");\n-\t\t\t\treturn 0;\n-\t\t\t}\n-\n-\t\t\tmemcpy(m->match.lpm.ipv6, addr.s6_addr, 16);\n-\t\t} else {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\t\"ipv4 or ipv6\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint8(&m->match.lpm.depth, tokens[4]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"depth\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\treturn 5;\n-\t} /* lpm */\n-\n-\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\"acl or array or hash or lpm\");\n-\treturn 0;\n-}\n-\n-/**\n- * table_action ::=\n- *\n- * action\n- *    fwd\n- *       drop\n- *       | port <port_id>\n- *       | meta\n- *       | table <table_id>\n- *    [balance <out0> ... <out7>]\n- *    [meter\n- *       tc0 meter <meter_profile_id> policer g <pa> y <pa> r <pa>\n- *       [tc1 meter <meter_profile_id> policer g <pa> y <pa> r <pa>\n- *       tc2 meter <meter_profile_id> policer g <pa> y <pa> r <pa>\n- *       tc3 meter <meter_profile_id> policer g <pa> y <pa> r <pa>]]\n- *    [tm subport <subport_id> pipe <pipe_id>]\n- *    [encap\n- *       ether <da> <sa>\n- *       | vlan <da> <sa> <pcp> <dei> <vid>\n- *       | qinq <da> <sa> <pcp> <dei> <vid> <pcp> <dei> <vid>\n- *       | qinq_pppoe <da> <sa> <pcp> <dei> <vid> <pcp> <dei> <vid> <session_id>\n- *       | mpls unicast | multicast\n- *          <da> <sa>\n- *          label0 <label> <tc> <ttl>\n- *          [label1 <label> <tc> <ttl>\n- *          [label2 <label> <tc> <ttl>\n- *          [label3 <label> <tc> <ttl>]]]\n- *       | pppoe <da> <sa> <session_id>]\n- *       | vxlan ether <da> <sa>\n- *          [vlan <pcp> <dei> <vid>]\n- *          ipv4 <sa> <da> <dscp> <ttl>\n- *          | ipv6 <sa> <da> <flow_label> <dscp> <hop_limit>\n- *          udp <sp> <dp>\n- *          vxlan <vni>]\n- *    [nat ipv4 | ipv6 <addr> <port>]\n- *    [ttl dec | keep]\n- *    [stats]\n- *    [time]\n- *    [tag <tag>]\n- *    [decap <n>]\n- *    [sym_crypto\n- *       encrypt | decrypt\n- *       type\n- *       | cipher\n- *          cipher_algo <algo> cipher_key <key> cipher_iv <iv>\n- *       | cipher_auth\n- *          cipher_algo <algo> cipher_key <key> cipher_iv <iv>\n- *          auth_algo <algo> auth_key <key> digest_size <size>\n- *       | aead\n- *          aead_algo <algo> aead_key <key> aead_iv <iv> aead_aad <aad>\n- *          digest_size <size>\n- *       data_offset <data_offset>]\n- *\n- * where:\n- *    <pa> ::= g | y | r | drop\n- */\n-static uint32_t\n-parse_table_action_fwd(char **tokens,\n-\tuint32_t n_tokens,\n-\tstruct softnic_table_rule_action *a)\n-{\n-\tif (n_tokens == 0 ||\n-\t\t(strcmp(tokens[0], \"fwd\") != 0))\n-\t\treturn 0;\n-\n-\ttokens++;\n-\tn_tokens--;\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"drop\") == 0)) {\n-\t\ta->fwd.action = RTE_PIPELINE_ACTION_DROP;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_FWD;\n-\t\treturn 1 + 1;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"port\") == 0)) {\n-\t\tuint32_t id;\n-\n-\t\tif (n_tokens < 2 ||\n-\t\t\tsoftnic_parser_read_uint32(&id, tokens[1]))\n-\t\t\treturn 0;\n-\n-\t\ta->fwd.action = RTE_PIPELINE_ACTION_PORT;\n-\t\ta->fwd.id = id;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_FWD;\n-\t\treturn 1 + 2;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"meta\") == 0)) {\n-\t\ta->fwd.action = RTE_PIPELINE_ACTION_PORT_META;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_FWD;\n-\t\treturn 1 + 1;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"table\") == 0)) {\n-\t\tuint32_t id;\n-\n-\t\tif (n_tokens < 2 ||\n-\t\t\tsoftnic_parser_read_uint32(&id, tokens[1]))\n-\t\t\treturn 0;\n-\n-\t\ta->fwd.action = RTE_PIPELINE_ACTION_TABLE;\n-\t\ta->fwd.id = id;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_FWD;\n-\t\treturn 1 + 2;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static uint32_t\n-parse_table_action_balance(char **tokens,\n-\tuint32_t n_tokens,\n-\tstruct softnic_table_rule_action *a)\n-{\n-\tuint32_t i;\n-\n-\tif (n_tokens == 0 ||\n-\t\t(strcmp(tokens[0], \"balance\") != 0))\n-\t\treturn 0;\n-\n-\ttokens++;\n-\tn_tokens--;\n-\n-\tif (n_tokens < RTE_TABLE_ACTION_LB_TABLE_SIZE)\n-\t\treturn 0;\n-\n-\tfor (i = 0; i < RTE_TABLE_ACTION_LB_TABLE_SIZE; i++)\n-\t\tif (softnic_parser_read_uint32(&a->lb.out[i], tokens[i]) != 0)\n-\t\t\treturn 0;\n-\n-\ta->action_mask |= 1 << RTE_TABLE_ACTION_LB;\n-\treturn 1 + RTE_TABLE_ACTION_LB_TABLE_SIZE;\n-}\n-\n-static int\n-parse_policer_action(char *token, enum rte_table_action_policer *a)\n-{\n-\tif (strcmp(token, \"g\") == 0) {\n-\t\t*a = RTE_TABLE_ACTION_POLICER_COLOR_GREEN;\n-\t\treturn 0;\n-\t}\n-\n-\tif (strcmp(token, \"y\") == 0) {\n-\t\t*a = RTE_TABLE_ACTION_POLICER_COLOR_YELLOW;\n-\t\treturn 0;\n-\t}\n-\n-\tif (strcmp(token, \"r\") == 0) {\n-\t\t*a = RTE_TABLE_ACTION_POLICER_COLOR_RED;\n-\t\treturn 0;\n-\t}\n-\n-\tif (strcmp(token, \"drop\") == 0) {\n-\t\t*a = RTE_TABLE_ACTION_POLICER_DROP;\n-\t\treturn 0;\n-\t}\n-\n-\treturn -1;\n-}\n-\n-static uint32_t\n-parse_table_action_meter_tc(char **tokens,\n-\tuint32_t n_tokens,\n-\tstruct rte_table_action_mtr_tc_params *mtr)\n-{\n-\tif (n_tokens < 9 ||\n-\t\tstrcmp(tokens[0], \"meter\") ||\n-\t\tsoftnic_parser_read_uint32(&mtr->meter_profile_id, tokens[1]) ||\n-\t\tstrcmp(tokens[2], \"policer\") ||\n-\t\tstrcmp(tokens[3], \"g\") ||\n-\t\tparse_policer_action(tokens[4], &mtr->policer[RTE_COLOR_GREEN]) ||\n-\t\tstrcmp(tokens[5], \"y\") ||\n-\t\tparse_policer_action(tokens[6], &mtr->policer[RTE_COLOR_YELLOW]) ||\n-\t\tstrcmp(tokens[7], \"r\") ||\n-\t\tparse_policer_action(tokens[8], &mtr->policer[RTE_COLOR_RED]))\n-\t\treturn 0;\n-\n-\treturn 9;\n-}\n-\n-static uint32_t\n-parse_table_action_meter(char **tokens,\n-\tuint32_t n_tokens,\n-\tstruct softnic_table_rule_action *a)\n-{\n-\tif (n_tokens == 0 ||\n-\t\tstrcmp(tokens[0], \"meter\"))\n-\t\treturn 0;\n-\n-\ttokens++;\n-\tn_tokens--;\n-\n-\tif (n_tokens < 10 ||\n-\t\tstrcmp(tokens[0], \"tc0\") ||\n-\t\t(parse_table_action_meter_tc(tokens + 1,\n-\t\t\tn_tokens - 1,\n-\t\t\t&a->mtr.mtr[0]) == 0))\n-\t\treturn 0;\n-\n-\ttokens += 10;\n-\tn_tokens -= 10;\n-\n-\tif (n_tokens == 0 ||\n-\t\tstrcmp(tokens[0], \"tc1\")) {\n-\t\ta->mtr.tc_mask = 1;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_MTR;\n-\t\treturn 1 + 10;\n-\t}\n-\n-\tif (n_tokens < 30 ||\n-\t\t(parse_table_action_meter_tc(tokens + 1,\n-\t\t\tn_tokens - 1, &a->mtr.mtr[1]) == 0) ||\n-\t\tstrcmp(tokens[10], \"tc2\") ||\n-\t\t(parse_table_action_meter_tc(tokens + 11,\n-\t\t\tn_tokens - 11, &a->mtr.mtr[2]) == 0) ||\n-\t\tstrcmp(tokens[20], \"tc3\") ||\n-\t\t(parse_table_action_meter_tc(tokens + 21,\n-\t\t\tn_tokens - 21, &a->mtr.mtr[3]) == 0))\n-\t\treturn 0;\n-\n-\ta->mtr.tc_mask = 0xF;\n-\ta->action_mask |= 1 << RTE_TABLE_ACTION_MTR;\n-\treturn 1 + 10 + 3 * 10;\n-}\n-\n-static uint32_t\n-parse_table_action_tm(char **tokens,\n-\tuint32_t n_tokens,\n-\tstruct softnic_table_rule_action *a)\n-{\n-\tuint32_t subport_id, pipe_id;\n-\n-\tif (n_tokens < 5 ||\n-\t\tstrcmp(tokens[0], \"tm\") ||\n-\t\tstrcmp(tokens[1], \"subport\") ||\n-\t\tsoftnic_parser_read_uint32(&subport_id, tokens[2]) ||\n-\t\tstrcmp(tokens[3], \"pipe\") ||\n-\t\tsoftnic_parser_read_uint32(&pipe_id, tokens[4]))\n-\t\treturn 0;\n-\n-\ta->tm.subport_id = subport_id;\n-\ta->tm.pipe_id = pipe_id;\n-\ta->action_mask |= 1 << RTE_TABLE_ACTION_TM;\n-\treturn 5;\n-}\n-\n-static uint32_t\n-parse_table_action_encap(char **tokens,\n-\tuint32_t n_tokens,\n-\tstruct softnic_table_rule_action *a)\n-{\n-\tif (n_tokens == 0 ||\n-\t\tstrcmp(tokens[0], \"encap\"))\n-\t\treturn 0;\n-\n-\ttokens++;\n-\tn_tokens--;\n-\n-\t/* ether */\n-\tif (n_tokens && (strcmp(tokens[0], \"ether\") == 0)) {\n-\t\tif (n_tokens < 3 ||\n-\t\t\tsoftnic_parse_mac_addr(tokens[1], &a->encap.ether.ether.da) ||\n-\t\t\tsoftnic_parse_mac_addr(tokens[2], &a->encap.ether.ether.sa))\n-\t\t\treturn 0;\n-\n-\t\ta->encap.type = RTE_TABLE_ACTION_ENCAP_ETHER;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;\n-\t\treturn 1 + 3;\n-\t}\n-\n-\t/* vlan */\n-\tif (n_tokens && (strcmp(tokens[0], \"vlan\") == 0)) {\n-\t\tuint32_t pcp, dei, vid;\n-\n-\t\tif (n_tokens < 6 ||\n-\t\t\tsoftnic_parse_mac_addr(tokens[1], &a->encap.vlan.ether.da) ||\n-\t\t\tsoftnic_parse_mac_addr(tokens[2], &a->encap.vlan.ether.sa) ||\n-\t\t\tsoftnic_parser_read_uint32(&pcp, tokens[3]) ||\n-\t\t\tpcp > 0x7 ||\n-\t\t\tsoftnic_parser_read_uint32(&dei, tokens[4]) ||\n-\t\t\tdei > 0x1 ||\n-\t\t\tsoftnic_parser_read_uint32(&vid, tokens[5]) ||\n-\t\t\tvid > 0xFFF)\n-\t\t\treturn 0;\n-\n-\t\ta->encap.vlan.vlan.pcp = pcp & 0x7;\n-\t\ta->encap.vlan.vlan.dei = dei & 0x1;\n-\t\ta->encap.vlan.vlan.vid = vid & 0xFFF;\n-\t\ta->encap.type = RTE_TABLE_ACTION_ENCAP_VLAN;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;\n-\t\treturn 1 + 6;\n-\t}\n-\n-\t/* qinq */\n-\tif (n_tokens && (strcmp(tokens[0], \"qinq\") == 0)) {\n-\t\tuint32_t svlan_pcp, svlan_dei, svlan_vid;\n-\t\tuint32_t cvlan_pcp, cvlan_dei, cvlan_vid;\n-\n-\t\tif (n_tokens < 9 ||\n-\t\t\tsoftnic_parse_mac_addr(tokens[1], &a->encap.qinq.ether.da) ||\n-\t\t\tsoftnic_parse_mac_addr(tokens[2], &a->encap.qinq.ether.sa) ||\n-\t\t\tsoftnic_parser_read_uint32(&svlan_pcp, tokens[3]) ||\n-\t\t\tsvlan_pcp > 0x7 ||\n-\t\t\tsoftnic_parser_read_uint32(&svlan_dei, tokens[4]) ||\n-\t\t\tsvlan_dei > 0x1 ||\n-\t\t\tsoftnic_parser_read_uint32(&svlan_vid, tokens[5]) ||\n-\t\t\tsvlan_vid > 0xFFF ||\n-\t\t\tsoftnic_parser_read_uint32(&cvlan_pcp, tokens[6]) ||\n-\t\t\tcvlan_pcp > 0x7 ||\n-\t\t\tsoftnic_parser_read_uint32(&cvlan_dei, tokens[7]) ||\n-\t\t\tcvlan_dei > 0x1 ||\n-\t\t\tsoftnic_parser_read_uint32(&cvlan_vid, tokens[8]) ||\n-\t\t\tcvlan_vid > 0xFFF)\n-\t\t\treturn 0;\n-\n-\t\ta->encap.qinq.svlan.pcp = svlan_pcp & 0x7;\n-\t\ta->encap.qinq.svlan.dei = svlan_dei & 0x1;\n-\t\ta->encap.qinq.svlan.vid = svlan_vid & 0xFFF;\n-\t\ta->encap.qinq.cvlan.pcp = cvlan_pcp & 0x7;\n-\t\ta->encap.qinq.cvlan.dei = cvlan_dei & 0x1;\n-\t\ta->encap.qinq.cvlan.vid = cvlan_vid & 0xFFF;\n-\t\ta->encap.type = RTE_TABLE_ACTION_ENCAP_QINQ;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;\n-\t\treturn 1 + 9;\n-\t}\n-\n-\t/* qinq_pppoe */\n-\tif (n_tokens && (strcmp(tokens[0], \"qinq_pppoe\") == 0)) {\n-\t\tuint32_t svlan_pcp, svlan_dei, svlan_vid;\n-\t\tuint32_t cvlan_pcp, cvlan_dei, cvlan_vid;\n-\n-\t\tif (n_tokens < 10 ||\n-\t\t\tsoftnic_parse_mac_addr(tokens[1],\n-\t\t\t\t&a->encap.qinq_pppoe.ether.da) ||\n-\t\t\tsoftnic_parse_mac_addr(tokens[2],\n-\t\t\t\t&a->encap.qinq_pppoe.ether.sa) ||\n-\t\t\tsoftnic_parser_read_uint32(&svlan_pcp, tokens[3]) ||\n-\t\t\tsvlan_pcp > 0x7 ||\n-\t\t\tsoftnic_parser_read_uint32(&svlan_dei, tokens[4]) ||\n-\t\t\tsvlan_dei > 0x1 ||\n-\t\t\tsoftnic_parser_read_uint32(&svlan_vid, tokens[5]) ||\n-\t\t\tsvlan_vid > 0xFFF ||\n-\t\t\tsoftnic_parser_read_uint32(&cvlan_pcp, tokens[6]) ||\n-\t\t\tcvlan_pcp > 0x7 ||\n-\t\t\tsoftnic_parser_read_uint32(&cvlan_dei, tokens[7]) ||\n-\t\t\tcvlan_dei > 0x1 ||\n-\t\t\tsoftnic_parser_read_uint32(&cvlan_vid, tokens[8]) ||\n-\t\t\tcvlan_vid > 0xFFF ||\n-\t\t\tsoftnic_parser_read_uint16(&a->encap.qinq_pppoe.pppoe.session_id,\n-\t\t\t\ttokens[9]))\n-\t\t\treturn 0;\n-\n-\t\ta->encap.qinq_pppoe.svlan.pcp = svlan_pcp & 0x7;\n-\t\ta->encap.qinq_pppoe.svlan.dei = svlan_dei & 0x1;\n-\t\ta->encap.qinq_pppoe.svlan.vid = svlan_vid & 0xFFF;\n-\t\ta->encap.qinq_pppoe.cvlan.pcp = cvlan_pcp & 0x7;\n-\t\ta->encap.qinq_pppoe.cvlan.dei = cvlan_dei & 0x1;\n-\t\ta->encap.qinq_pppoe.cvlan.vid = cvlan_vid & 0xFFF;\n-\t\ta->encap.type = RTE_TABLE_ACTION_ENCAP_QINQ_PPPOE;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;\n-\t\treturn 1 + 10;\n-\t}\n-\n-\t/* mpls */\n-\tif (n_tokens && (strcmp(tokens[0], \"mpls\") == 0)) {\n-\t\tuint32_t label, tc, ttl;\n-\n-\t\tif (n_tokens < 8)\n-\t\t\treturn 0;\n-\n-\t\tif (strcmp(tokens[1], \"unicast\") == 0)\n-\t\t\ta->encap.mpls.unicast = 1;\n-\t\telse if (strcmp(tokens[1], \"multicast\") == 0)\n-\t\t\ta->encap.mpls.unicast = 0;\n-\t\telse\n-\t\t\treturn 0;\n-\n-\t\tif (softnic_parse_mac_addr(tokens[2], &a->encap.mpls.ether.da) ||\n-\t\t\tsoftnic_parse_mac_addr(tokens[3], &a->encap.mpls.ether.sa) ||\n-\t\t\tstrcmp(tokens[4], \"label0\") ||\n-\t\t\tsoftnic_parser_read_uint32(&label, tokens[5]) ||\n-\t\t\tlabel > 0xFFFFF ||\n-\t\t\tsoftnic_parser_read_uint32(&tc, tokens[6]) ||\n-\t\t\ttc > 0x7 ||\n-\t\t\tsoftnic_parser_read_uint32(&ttl, tokens[7]) ||\n-\t\t\tttl > 0x3F)\n-\t\t\treturn 0;\n-\n-\t\ta->encap.mpls.mpls[0].label = label;\n-\t\ta->encap.mpls.mpls[0].tc = tc;\n-\t\ta->encap.mpls.mpls[0].ttl = ttl;\n-\n-\t\ttokens += 8;\n-\t\tn_tokens -= 8;\n-\n-\t\tif (n_tokens == 0 ||\n-\t\t\tstrcmp(tokens[0], \"label1\")) {\n-\t\t\ta->encap.mpls.mpls_count = 1;\n-\t\t\ta->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;\n-\t\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;\n-\t\t\treturn 1 + 8;\n-\t\t}\n-\n-\t\tif (n_tokens < 4 ||\n-\t\t\tsoftnic_parser_read_uint32(&label, tokens[1]) ||\n-\t\t\tlabel > 0xFFFFF ||\n-\t\t\tsoftnic_parser_read_uint32(&tc, tokens[2]) ||\n-\t\t\ttc > 0x7 ||\n-\t\t\tsoftnic_parser_read_uint32(&ttl, tokens[3]) ||\n-\t\t\tttl > 0x3F)\n-\t\t\treturn 0;\n-\n-\t\ta->encap.mpls.mpls[1].label = label;\n-\t\ta->encap.mpls.mpls[1].tc = tc;\n-\t\ta->encap.mpls.mpls[1].ttl = ttl;\n-\n-\t\ttokens += 4;\n-\t\tn_tokens -= 4;\n-\n-\t\tif (n_tokens == 0 ||\n-\t\t\tstrcmp(tokens[0], \"label2\")) {\n-\t\t\ta->encap.mpls.mpls_count = 2;\n-\t\t\ta->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;\n-\t\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;\n-\t\t\treturn 1 + 8 + 4;\n-\t\t}\n-\n-\t\tif (n_tokens < 4 ||\n-\t\t\tsoftnic_parser_read_uint32(&label, tokens[1]) ||\n-\t\t\tlabel > 0xFFFFF ||\n-\t\t\tsoftnic_parser_read_uint32(&tc, tokens[2]) ||\n-\t\t\ttc > 0x7 ||\n-\t\t\tsoftnic_parser_read_uint32(&ttl, tokens[3]) ||\n-\t\t\tttl > 0x3F)\n-\t\t\treturn 0;\n-\n-\t\ta->encap.mpls.mpls[2].label = label;\n-\t\ta->encap.mpls.mpls[2].tc = tc;\n-\t\ta->encap.mpls.mpls[2].ttl = ttl;\n-\n-\t\ttokens += 4;\n-\t\tn_tokens -= 4;\n-\n-\t\tif (n_tokens == 0 ||\n-\t\t\tstrcmp(tokens[0], \"label3\")) {\n-\t\t\ta->encap.mpls.mpls_count = 3;\n-\t\t\ta->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;\n-\t\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;\n-\t\t\treturn 1 + 8 + 4 + 4;\n-\t\t}\n-\n-\t\tif (n_tokens < 4 ||\n-\t\t\tsoftnic_parser_read_uint32(&label, tokens[1]) ||\n-\t\t\tlabel > 0xFFFFF ||\n-\t\t\tsoftnic_parser_read_uint32(&tc, tokens[2]) ||\n-\t\t\ttc > 0x7 ||\n-\t\t\tsoftnic_parser_read_uint32(&ttl, tokens[3]) ||\n-\t\t\tttl > 0x3F)\n-\t\t\treturn 0;\n-\n-\t\ta->encap.mpls.mpls[3].label = label;\n-\t\ta->encap.mpls.mpls[3].tc = tc;\n-\t\ta->encap.mpls.mpls[3].ttl = ttl;\n-\n-\t\ta->encap.mpls.mpls_count = 4;\n-\t\ta->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;\n-\t\treturn 1 + 8 + 4 + 4 + 4;\n-\t}\n-\n-\t/* pppoe */\n-\tif (n_tokens && (strcmp(tokens[0], \"pppoe\") == 0)) {\n-\t\tif (n_tokens < 4 ||\n-\t\t\tsoftnic_parse_mac_addr(tokens[1], &a->encap.pppoe.ether.da) ||\n-\t\t\tsoftnic_parse_mac_addr(tokens[2], &a->encap.pppoe.ether.sa) ||\n-\t\t\tsoftnic_parser_read_uint16(&a->encap.pppoe.pppoe.session_id,\n-\t\t\t\ttokens[3]))\n-\t\t\treturn 0;\n-\n-\t\ta->encap.type = RTE_TABLE_ACTION_ENCAP_PPPOE;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;\n-\t\treturn 1 + 4;\n-\t}\n-\n-\t/* vxlan */\n-\tif (n_tokens && (strcmp(tokens[0], \"vxlan\") == 0)) {\n-\t\tuint32_t n = 0;\n-\n-\t\tn_tokens--;\n-\t\ttokens++;\n-\t\tn++;\n-\n-\t\t/* ether <da> <sa> */\n-\t\tif ((n_tokens < 3) ||\n-\t\t\tstrcmp(tokens[0], \"ether\") ||\n-\t\t\tsoftnic_parse_mac_addr(tokens[1], &a->encap.vxlan.ether.da) ||\n-\t\t\tsoftnic_parse_mac_addr(tokens[2], &a->encap.vxlan.ether.sa))\n-\t\t\treturn 0;\n-\n-\t\tn_tokens -= 3;\n-\t\ttokens += 3;\n-\t\tn += 3;\n-\n-\t\t/* [vlan <pcp> <dei> <vid>] */\n-\t\tif (strcmp(tokens[0], \"vlan\") == 0) {\n-\t\t\tuint32_t pcp, dei, vid;\n-\n-\t\t\tif ((n_tokens < 4) ||\n-\t\t\t\tsoftnic_parser_read_uint32(&pcp, tokens[1]) ||\n-\t\t\t\t(pcp > 7) ||\n-\t\t\t\tsoftnic_parser_read_uint32(&dei, tokens[2]) ||\n-\t\t\t\t(dei > 1) ||\n-\t\t\t\tsoftnic_parser_read_uint32(&vid, tokens[3]) ||\n-\t\t\t\t(vid > 0xFFF))\n-\t\t\t\treturn 0;\n-\n-\t\t\ta->encap.vxlan.vlan.pcp = pcp;\n-\t\t\ta->encap.vxlan.vlan.dei = dei;\n-\t\t\ta->encap.vxlan.vlan.vid = vid;\n-\n-\t\t\tn_tokens -= 4;\n-\t\t\ttokens += 4;\n-\t\t\tn += 4;\n-\t\t}\n-\n-\t\t/* ipv4 <sa> <da> <dscp> <ttl>\n-\t\t   | ipv6 <sa> <da> <flow_label> <dscp> <hop_limit> */\n-\t\tif (strcmp(tokens[0], \"ipv4\") == 0) {\n-\t\t\tstruct in_addr sa, da;\n-\t\t\tuint8_t dscp, ttl;\n-\n-\t\t\tif ((n_tokens < 5) ||\n-\t\t\t\tsoftnic_parse_ipv4_addr(tokens[1], &sa) ||\n-\t\t\t\tsoftnic_parse_ipv4_addr(tokens[2], &da) ||\n-\t\t\t\tsoftnic_parser_read_uint8(&dscp, tokens[3]) ||\n-\t\t\t\t(dscp > 64) ||\n-\t\t\t\tsoftnic_parser_read_uint8(&ttl, tokens[4]))\n-\t\t\t\treturn 0;\n-\n-\t\t\ta->encap.vxlan.ipv4.sa = rte_be_to_cpu_32(sa.s_addr);\n-\t\t\ta->encap.vxlan.ipv4.da = rte_be_to_cpu_32(da.s_addr);\n-\t\t\ta->encap.vxlan.ipv4.dscp = dscp;\n-\t\t\ta->encap.vxlan.ipv4.ttl = ttl;\n-\n-\t\t\tn_tokens -= 5;\n-\t\t\ttokens += 5;\n-\t\t\tn += 5;\n-\t\t} else if (strcmp(tokens[0], \"ipv6\") == 0) {\n-\t\t\tstruct in6_addr sa, da;\n-\t\t\tuint32_t flow_label;\n-\t\t\tuint8_t dscp, hop_limit;\n-\n-\t\t\tif ((n_tokens < 6) ||\n-\t\t\t\tsoftnic_parse_ipv6_addr(tokens[1], &sa) ||\n-\t\t\t\tsoftnic_parse_ipv6_addr(tokens[2], &da) ||\n-\t\t\t\tsoftnic_parser_read_uint32(&flow_label, tokens[3]) ||\n-\t\t\t\tsoftnic_parser_read_uint8(&dscp, tokens[4]) ||\n-\t\t\t\t(dscp > 64) ||\n-\t\t\t\tsoftnic_parser_read_uint8(&hop_limit, tokens[5]))\n-\t\t\t\treturn 0;\n-\n-\t\t\tmemcpy(a->encap.vxlan.ipv6.sa, sa.s6_addr, 16);\n-\t\t\tmemcpy(a->encap.vxlan.ipv6.da, da.s6_addr, 16);\n-\t\t\ta->encap.vxlan.ipv6.flow_label = flow_label;\n-\t\t\ta->encap.vxlan.ipv6.dscp = dscp;\n-\t\t\ta->encap.vxlan.ipv6.hop_limit = hop_limit;\n-\n-\t\t\tn_tokens -= 6;\n-\t\t\ttokens += 6;\n-\t\t\tn += 6;\n-\t\t} else\n-\t\t\treturn 0;\n-\n-\t\t/* udp <sp> <dp> */\n-\t\tif ((n_tokens < 3) ||\n-\t\t\tstrcmp(tokens[0], \"udp\") ||\n-\t\t\tsoftnic_parser_read_uint16(&a->encap.vxlan.udp.sp, tokens[1]) ||\n-\t\t\tsoftnic_parser_read_uint16(&a->encap.vxlan.udp.dp, tokens[2]))\n-\t\t\treturn 0;\n-\n-\t\tn_tokens -= 3;\n-\t\ttokens += 3;\n-\t\tn += 3;\n-\n-\t\t/* vxlan <vni> */\n-\t\tif ((n_tokens < 2) ||\n-\t\t\tstrcmp(tokens[0], \"vxlan\") ||\n-\t\t\tsoftnic_parser_read_uint32(&a->encap.vxlan.vxlan.vni, tokens[1]) ||\n-\t\t\t(a->encap.vxlan.vxlan.vni > 0xFFFFFF))\n-\t\t\treturn 0;\n-\n-\t\tn_tokens -= 2;\n-\t\ttokens += 2;\n-\t\tn += 2;\n-\n-\t\ta->encap.type = RTE_TABLE_ACTION_ENCAP_VXLAN;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;\n-\t\treturn 1 + n;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static uint32_t\n-parse_table_action_nat(char **tokens,\n-\tuint32_t n_tokens,\n-\tstruct softnic_table_rule_action *a)\n-{\n-\tif (n_tokens < 4 ||\n-\t\tstrcmp(tokens[0], \"nat\"))\n-\t\treturn 0;\n-\n-\tif (strcmp(tokens[1], \"ipv4\") == 0) {\n-\t\tstruct in_addr addr;\n-\t\tuint16_t port;\n-\n-\t\tif (softnic_parse_ipv4_addr(tokens[2], &addr) ||\n-\t\t\tsoftnic_parser_read_uint16(&port, tokens[3]))\n-\t\t\treturn 0;\n-\n-\t\ta->nat.ip_version = 1;\n-\t\ta->nat.addr.ipv4 = rte_be_to_cpu_32(addr.s_addr);\n-\t\ta->nat.port = port;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_NAT;\n-\t\treturn 4;\n-\t}\n-\n-\tif (strcmp(tokens[1], \"ipv6\") == 0) {\n-\t\tstruct in6_addr addr;\n-\t\tuint16_t port;\n-\n-\t\tif (softnic_parse_ipv6_addr(tokens[2], &addr) ||\n-\t\t\tsoftnic_parser_read_uint16(&port, tokens[3]))\n-\t\t\treturn 0;\n-\n-\t\ta->nat.ip_version = 0;\n-\t\tmemcpy(a->nat.addr.ipv6, addr.s6_addr, 16);\n-\t\ta->nat.port = port;\n-\t\ta->action_mask |= 1 << RTE_TABLE_ACTION_NAT;\n-\t\treturn 4;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static uint32_t\n-parse_table_action_ttl(char **tokens,\n-\tuint32_t n_tokens,\n-\tstruct softnic_table_rule_action *a)\n-{\n-\tif (n_tokens < 2 ||\n-\t\tstrcmp(tokens[0], \"ttl\"))\n-\t\treturn 0;\n-\n-\tif (strcmp(tokens[1], \"dec\") == 0)\n-\t\ta->ttl.decrement = 1;\n-\telse if (strcmp(tokens[1], \"keep\") == 0)\n-\t\ta->ttl.decrement = 0;\n-\telse\n-\t\treturn 0;\n-\n-\ta->action_mask |= 1 << RTE_TABLE_ACTION_TTL;\n-\treturn 2;\n-}\n-\n-static uint32_t\n-parse_table_action_stats(char **tokens,\n-\tuint32_t n_tokens,\n-\tstruct softnic_table_rule_action *a)\n-{\n-\tif (n_tokens < 1 ||\n-\t\tstrcmp(tokens[0], \"stats\"))\n-\t\treturn 0;\n-\n-\ta->stats.n_packets = 0;\n-\ta->stats.n_bytes = 0;\n-\ta->action_mask |= 1 << RTE_TABLE_ACTION_STATS;\n-\treturn 1;\n-}\n-\n-static uint32_t\n-parse_table_action_time(char **tokens,\n-\tuint32_t n_tokens,\n-\tstruct softnic_table_rule_action *a)\n-{\n-\tif (n_tokens < 1 ||\n-\t\tstrcmp(tokens[0], \"time\"))\n-\t\treturn 0;\n-\n-\ta->time.time = rte_rdtsc();\n-\ta->action_mask |= 1 << RTE_TABLE_ACTION_TIME;\n-\treturn 1;\n-}\n-\n-static void\n-parse_free_sym_crypto_param_data(struct rte_table_action_sym_crypto_params *p)\n-{\n-\tstruct rte_crypto_sym_xform *xform[2] = {NULL};\n-\tuint32_t i;\n-\n-\txform[0] = p->xform;\n-\tif (xform[0])\n-\t\txform[1] = xform[0]->next;\n-\n-\tfor (i = 0; i < 2; i++) {\n-\t\tif (xform[i] == NULL)\n-\t\t\tcontinue;\n-\n-\t\tswitch (xform[i]->type) {\n-\t\tcase RTE_CRYPTO_SYM_XFORM_CIPHER:\n-\t\t\tfree(p->cipher_auth.cipher_iv.val);\n-\t\t\tfree(p->cipher_auth.cipher_iv_update.val);\n-\t\t\tbreak;\n-\t\tcase RTE_CRYPTO_SYM_XFORM_AUTH:\n-\t\t\tif (p->cipher_auth.auth_iv.val)\n-\t\t\t\tfree(p->cipher_auth.cipher_iv.val);\n-\t\t\tif (p->cipher_auth.auth_iv_update.val)\n-\t\t\t\tfree(p->cipher_auth.cipher_iv_update.val);\n-\t\t\tbreak;\n-\t\tcase RTE_CRYPTO_SYM_XFORM_AEAD:\n-\t\t\tfree(p->aead.iv.val);\n-\t\t\tfree(p->aead.aad.val);\n-\t\t\tbreak;\n-\t\tdefault:\n-\t\t\tcontinue;\n-\t\t}\n-\t}\n-\n-}\n-\n-static struct rte_crypto_sym_xform *\n-parse_table_action_cipher(struct rte_table_action_sym_crypto_params *p,\n-\t\tuint8_t *key, uint32_t max_key_len, char **tokens,\n-\t\tuint32_t n_tokens, uint32_t encrypt, uint32_t *used_n_tokens)\n-{\n-\tstruct rte_crypto_sym_xform *xform_cipher;\n-\tint status;\n-\tsize_t len;\n-\n-\tif (n_tokens < 7 || strcmp(tokens[1], \"cipher_algo\") ||\n-\t\t\tstrcmp(tokens[3], \"cipher_key\") ||\n-\t\t\tstrcmp(tokens[5], \"cipher_iv\"))\n-\t\treturn NULL;\n-\n-\txform_cipher = calloc(1, sizeof(*xform_cipher));\n-\tif (xform_cipher == NULL)\n-\t\treturn NULL;\n-\n-\txform_cipher->type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n-\txform_cipher->cipher.op = encrypt ? RTE_CRYPTO_CIPHER_OP_ENCRYPT :\n-\t\t\tRTE_CRYPTO_CIPHER_OP_DECRYPT;\n-\n-\t/* cipher_algo */\n-\tstatus = rte_cryptodev_get_cipher_algo_enum(\n-\t\t\t&xform_cipher->cipher.algo, tokens[2]);\n-\tif (status < 0)\n-\t\tgoto error_exit;\n-\n-\t/* cipher_key */\n-\tlen = strlen(tokens[4]);\n-\tif (len / 2 > max_key_len) {\n-\t\tstatus = -ENOMEM;\n-\t\tgoto error_exit;\n-\t}\n-\n-\tstatus = softnic_parse_hex_string(tokens[4], key, (uint32_t *)&len);\n-\tif (status < 0)\n-\t\tgoto error_exit;\n-\n-\txform_cipher->cipher.key.data = key;\n-\txform_cipher->cipher.key.length = (uint16_t)len;\n-\n-\t/* cipher_iv */\n-\tlen = strlen(tokens[6]);\n-\n-\tp->cipher_auth.cipher_iv.val = calloc(1, len / 2 + 1);\n-\tif (p->cipher_auth.cipher_iv.val == NULL)\n-\t\tgoto error_exit;\n-\n-\tstatus = softnic_parse_hex_string(tokens[6],\n-\t\t\tp->cipher_auth.cipher_iv.val,\n-\t\t\t(uint32_t *)&len);\n-\tif (status < 0)\n-\t\tgoto error_exit;\n-\n-\txform_cipher->cipher.iv.length = (uint16_t)len;\n-\txform_cipher->cipher.iv.offset = RTE_TABLE_ACTION_SYM_CRYPTO_IV_OFFSET;\n-\tp->cipher_auth.cipher_iv.length = (uint32_t)len;\n-\t*used_n_tokens = 7;\n-\n-\treturn xform_cipher;\n-\n-error_exit:\n-\tif (p->cipher_auth.cipher_iv.val) {\n-\t\tfree(p->cipher_auth.cipher_iv.val);\n-\t\tp->cipher_auth.cipher_iv.val = NULL;\n-\t}\n-\n-\tfree(xform_cipher);\n-\n-\treturn NULL;\n-}\n-\n-static struct rte_crypto_sym_xform *\n-parse_table_action_cipher_auth(struct rte_table_action_sym_crypto_params *p,\n-\t\tuint8_t *key, uint32_t max_key_len, char **tokens,\n-\t\tuint32_t n_tokens, uint32_t encrypt, uint32_t *used_n_tokens)\n-{\n-\tstruct rte_crypto_sym_xform *xform_cipher;\n-\tstruct rte_crypto_sym_xform *xform_auth;\n-\tint status;\n-\tsize_t len;\n-\n-\tif (n_tokens < 13 ||\n-\t\t\tstrcmp(tokens[7], \"auth_algo\") ||\n-\t\t\tstrcmp(tokens[9], \"auth_key\") ||\n-\t\t\tstrcmp(tokens[11], \"digest_size\"))\n-\t\treturn NULL;\n-\n-\txform_auth = calloc(1, sizeof(*xform_auth));\n-\tif (xform_auth == NULL)\n-\t\treturn NULL;\n-\n-\txform_auth->type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\txform_auth->auth.op = encrypt ? RTE_CRYPTO_AUTH_OP_GENERATE :\n-\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY;\n-\n-\t/* auth_algo */\n-\tstatus = rte_cryptodev_get_auth_algo_enum(&xform_auth->auth.algo,\n-\t\t\ttokens[8]);\n-\tif (status < 0)\n-\t\tgoto error_exit;\n-\n-\t/* auth_key */\n-\tlen = strlen(tokens[10]);\n-\tif (len / 2 > max_key_len) {\n-\t\tstatus = -ENOMEM;\n-\t\tgoto error_exit;\n-\t}\n-\n-\tstatus = softnic_parse_hex_string(tokens[10], key, (uint32_t *)&len);\n-\tif (status < 0)\n-\t\tgoto error_exit;\n-\n-\txform_auth->auth.key.data = key;\n-\txform_auth->auth.key.length = (uint16_t)len;\n-\n-\tkey += xform_auth->auth.key.length;\n-\tmax_key_len -= xform_auth->auth.key.length;\n-\n-\tif (strcmp(tokens[11], \"digest_size\"))\n-\t\tgoto error_exit;\n-\n-\tstatus = softnic_parser_read_uint16(&xform_auth->auth.digest_length,\n-\t\t\ttokens[12]);\n-\tif (status < 0)\n-\t\tgoto error_exit;\n-\n-\txform_cipher = parse_table_action_cipher(p, key, max_key_len, tokens, 7,\n-\t\t\tencrypt, used_n_tokens);\n-\tif (xform_cipher == NULL)\n-\t\tgoto error_exit;\n-\n-\t*used_n_tokens += 6;\n-\n-\tif (encrypt) {\n-\t\txform_cipher->next = xform_auth;\n-\t\treturn xform_cipher;\n-\t} else {\n-\t\txform_auth->next = xform_cipher;\n-\t\treturn xform_auth;\n-\t}\n-\n-error_exit:\n-\tif (p->cipher_auth.auth_iv.val) {\n-\t\tfree(p->cipher_auth.auth_iv.val);\n-\t\tp->cipher_auth.auth_iv.val = 0;\n-\t}\n-\n-\tfree(xform_auth);\n-\n-\treturn NULL;\n-}\n-\n-static struct rte_crypto_sym_xform *\n-parse_table_action_aead(struct rte_table_action_sym_crypto_params *p,\n-\t\tuint8_t *key, uint32_t max_key_len, char **tokens,\n-\t\tuint32_t n_tokens, uint32_t encrypt, uint32_t *used_n_tokens)\n-{\n-\tstruct rte_crypto_sym_xform *xform_aead;\n-\tint status;\n-\tsize_t len;\n-\n-\tif (n_tokens < 11 || strcmp(tokens[1], \"aead_algo\") ||\n-\t\t\tstrcmp(tokens[3], \"aead_key\") ||\n-\t\t\tstrcmp(tokens[5], \"aead_iv\") ||\n-\t\t\tstrcmp(tokens[7], \"aead_aad\") ||\n-\t\t\tstrcmp(tokens[9], \"digest_size\"))\n-\t\treturn NULL;\n-\n-\txform_aead = calloc(1, sizeof(*xform_aead));\n-\tif (xform_aead == NULL)\n-\t\treturn NULL;\n-\n-\txform_aead->type = RTE_CRYPTO_SYM_XFORM_AEAD;\n-\txform_aead->aead.op = encrypt ? RTE_CRYPTO_AEAD_OP_ENCRYPT :\n-\t\t\tRTE_CRYPTO_AEAD_OP_DECRYPT;\n-\n-\t/* aead_algo */\n-\tstatus = rte_cryptodev_get_aead_algo_enum(&xform_aead->aead.algo,\n-\t\t\ttokens[2]);\n-\tif (status < 0)\n-\t\tgoto error_exit;\n-\n-\t/* aead_key */\n-\tlen = strlen(tokens[4]);\n-\tif (len / 2 > max_key_len) {\n-\t\tstatus = -ENOMEM;\n-\t\tgoto error_exit;\n-\t}\n-\n-\tstatus = softnic_parse_hex_string(tokens[4], key, (uint32_t *)&len);\n-\tif (status < 0)\n-\t\tgoto error_exit;\n-\n-\txform_aead->aead.key.data = key;\n-\txform_aead->aead.key.length = (uint16_t)len;\n-\n-\t/* aead_iv */\n-\tlen = strlen(tokens[6]);\n-\tp->aead.iv.val = calloc(1, len / 2 + 1);\n-\tif (p->aead.iv.val == NULL)\n-\t\tgoto error_exit;\n-\n-\tstatus = softnic_parse_hex_string(tokens[6], p->aead.iv.val,\n-\t\t\t(uint32_t *)&len);\n-\tif (status < 0)\n-\t\tgoto error_exit;\n-\n-\txform_aead->aead.iv.length = (uint16_t)len;\n-\txform_aead->aead.iv.offset = RTE_TABLE_ACTION_SYM_CRYPTO_IV_OFFSET;\n-\tp->aead.iv.length = (uint32_t)len;\n-\n-\t/* aead_aad */\n-\tlen = strlen(tokens[8]);\n-\tp->aead.aad.val = calloc(1, len / 2 + 1);\n-\tif (p->aead.aad.val == NULL)\n-\t\tgoto error_exit;\n-\n-\tstatus = softnic_parse_hex_string(tokens[8], p->aead.aad.val, (uint32_t *)&len);\n-\tif (status < 0)\n-\t\tgoto error_exit;\n-\n-\txform_aead->aead.aad_length = (uint16_t)len;\n-\tp->aead.aad.length = (uint32_t)len;\n-\n-\t/* digest_size */\n-\tstatus = softnic_parser_read_uint16(&xform_aead->aead.digest_length,\n-\t\t\ttokens[10]);\n-\tif (status < 0)\n-\t\tgoto error_exit;\n-\n-\t*used_n_tokens = 11;\n-\n-\treturn xform_aead;\n-\n-error_exit:\n-\tif (p->aead.iv.val) {\n-\t\tfree(p->aead.iv.val);\n-\t\tp->aead.iv.val = NULL;\n-\t}\n-\tif (p->aead.aad.val) {\n-\t\tfree(p->aead.aad.val);\n-\t\tp->aead.aad.val = NULL;\n-\t}\n-\n-\tfree(xform_aead);\n-\n-\treturn NULL;\n-}\n-\n-\n-static uint32_t\n-parse_table_action_sym_crypto(char **tokens,\n-\tuint32_t n_tokens,\n-\tstruct softnic_table_rule_action *a)\n-{\n-\tstruct rte_table_action_sym_crypto_params *p = &a->sym_crypto;\n-\tstruct rte_crypto_sym_xform *xform = NULL;\n-\tuint8_t *key = a->sym_crypto_key;\n-\tuint32_t max_key_len = SYM_CRYPTO_MAX_KEY_SIZE;\n-\tuint32_t used_n_tokens;\n-\tuint32_t encrypt;\n-\tint status;\n-\n-\tif ((n_tokens < 12) ||\n-\t\tstrcmp(tokens[0], \"sym_crypto\") ||\n-\t\tstrcmp(tokens[2], \"type\"))\n-\t\treturn 0;\n-\n-\tmemset(p, 0, sizeof(*p));\n-\n-\tif (strcmp(tokens[1], \"encrypt\") == 0)\n-\t\tencrypt = 1;\n-\telse\n-\t\tencrypt = 0;\n-\n-\tstatus = softnic_parser_read_uint32(&p->data_offset, tokens[n_tokens - 1]);\n-\tif (status < 0)\n-\t\treturn 0;\n-\n-\tif (strcmp(tokens[3], \"cipher\") == 0) {\n-\t\ttokens += 3;\n-\t\tn_tokens -= 3;\n-\n-\t\txform = parse_table_action_cipher(p, key, max_key_len, tokens,\n-\t\t\t\tn_tokens, encrypt, &used_n_tokens);\n-\t} else if (strcmp(tokens[3], \"cipher_auth\") == 0) {\n-\t\ttokens += 3;\n-\t\tn_tokens -= 3;\n-\n-\t\txform = parse_table_action_cipher_auth(p, key, max_key_len,\n-\t\t\t\ttokens, n_tokens, encrypt, &used_n_tokens);\n-\t} else if (strcmp(tokens[3], \"aead\") == 0) {\n-\t\ttokens += 3;\n-\t\tn_tokens -= 3;\n-\n-\t\txform = parse_table_action_aead(p, key, max_key_len, tokens,\n-\t\t\t\tn_tokens, encrypt, &used_n_tokens);\n-\t}\n-\n-\tif (xform == NULL)\n-\t\treturn 0;\n-\n-\tp->xform = xform;\n-\n-\tif (strcmp(tokens[used_n_tokens], \"data_offset\")) {\n-\t\tparse_free_sym_crypto_param_data(p);\n-\t\treturn 0;\n-\t}\n-\n-\ta->action_mask |= 1 << RTE_TABLE_ACTION_SYM_CRYPTO;\n-\n-\treturn used_n_tokens + 5;\n-}\n-\n-static uint32_t\n-parse_table_action_tag(char **tokens,\n-\tuint32_t n_tokens,\n-\tstruct softnic_table_rule_action *a)\n-{\n-\tif (n_tokens < 2 ||\n-\t\tstrcmp(tokens[0], \"tag\"))\n-\t\treturn 0;\n-\n-\tif (softnic_parser_read_uint32(&a->tag.tag, tokens[1]))\n-\t\treturn 0;\n-\n-\ta->action_mask |= 1 << RTE_TABLE_ACTION_TAG;\n-\treturn 2;\n-}\n-\n-static uint32_t\n-parse_table_action_decap(char **tokens,\n-\tuint32_t n_tokens,\n-\tstruct softnic_table_rule_action *a)\n-{\n-\tif (n_tokens < 2 ||\n-\t\tstrcmp(tokens[0], \"decap\"))\n-\t\treturn 0;\n-\n-\tif (softnic_parser_read_uint16(&a->decap.n, tokens[1]))\n-\t\treturn 0;\n-\n-\ta->action_mask |= 1 << RTE_TABLE_ACTION_DECAP;\n-\treturn 2;\n-}\n-\n-static uint32_t\n-parse_table_action(char **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size,\n-\tstruct softnic_table_rule_action *a)\n-{\n-\tuint32_t n_tokens0 = n_tokens;\n-\n-\tmemset(a, 0, sizeof(*a));\n-\n-\tif (n_tokens < 2 ||\n-\t\tstrcmp(tokens[0], \"action\"))\n-\t\treturn 0;\n-\n-\ttokens++;\n-\tn_tokens--;\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"fwd\") == 0)) {\n-\t\tuint32_t n;\n-\n-\t\tn = parse_table_action_fwd(tokens, n_tokens, a);\n-\t\tif (n == 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"action fwd\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\ttokens += n;\n-\t\tn_tokens -= n;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"balance\") == 0)) {\n-\t\tuint32_t n;\n-\n-\t\tn = parse_table_action_balance(tokens, n_tokens, a);\n-\t\tif (n == 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"action balance\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\ttokens += n;\n-\t\tn_tokens -= n;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"meter\") == 0)) {\n-\t\tuint32_t n;\n-\n-\t\tn = parse_table_action_meter(tokens, n_tokens, a);\n-\t\tif (n == 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"action meter\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\ttokens += n;\n-\t\tn_tokens -= n;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"tm\") == 0)) {\n-\t\tuint32_t n;\n-\n-\t\tn = parse_table_action_tm(tokens, n_tokens, a);\n-\t\tif (n == 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"action tm\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\ttokens += n;\n-\t\tn_tokens -= n;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"encap\") == 0)) {\n-\t\tuint32_t n;\n-\n-\t\tn = parse_table_action_encap(tokens, n_tokens, a);\n-\t\tif (n == 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"action encap\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\ttokens += n;\n-\t\tn_tokens -= n;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"nat\") == 0)) {\n-\t\tuint32_t n;\n-\n-\t\tn = parse_table_action_nat(tokens, n_tokens, a);\n-\t\tif (n == 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"action nat\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\ttokens += n;\n-\t\tn_tokens -= n;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"ttl\") == 0)) {\n-\t\tuint32_t n;\n-\n-\t\tn = parse_table_action_ttl(tokens, n_tokens, a);\n-\t\tif (n == 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"action ttl\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\ttokens += n;\n-\t\tn_tokens -= n;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"stats\") == 0)) {\n-\t\tuint32_t n;\n-\n-\t\tn = parse_table_action_stats(tokens, n_tokens, a);\n-\t\tif (n == 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"action stats\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\ttokens += n;\n-\t\tn_tokens -= n;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"time\") == 0)) {\n-\t\tuint32_t n;\n-\n-\t\tn = parse_table_action_time(tokens, n_tokens, a);\n-\t\tif (n == 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"action time\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\ttokens += n;\n-\t\tn_tokens -= n;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"tag\") == 0)) {\n-\t\tuint32_t n;\n-\n-\t\tn = parse_table_action_tag(tokens, n_tokens, a);\n-\t\tif (n == 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"action tag\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\ttokens += n;\n-\t\tn_tokens -= n;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"decap\") == 0)) {\n-\t\tuint32_t n;\n-\n-\t\tn = parse_table_action_decap(tokens, n_tokens, a);\n-\t\tif (n == 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"action decap\");\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\ttokens += n;\n-\t\tn_tokens -= n;\n-\t}\n-\n-\tif (n_tokens && (strcmp(tokens[0], \"sym_crypto\") == 0)) {\n-\t\tuint32_t n;\n-\n-\t\tn = parse_table_action_sym_crypto(tokens, n_tokens, a);\n-\t\tif (n == 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\t\"action sym_crypto\");\n-\t\t}\n-\n-\t\ttokens += n;\n-\t\tn_tokens -= n;\n-\t}\n-\n-\tif (n_tokens0 - n_tokens == 1) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"action\");\n-\t\treturn 0;\n-\t}\n-\n-\treturn n_tokens0 - n_tokens;\n-}\n-\n-/**\n- * pipeline <pipeline_name> table <table_id> rule add\n- *    match <match>\n- *    action <table_action>\n- */\n-static void\n-cmd_softnic_pipeline_table_rule_add(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct softnic_table_rule_match m;\n-\tstruct softnic_table_rule_action a;\n-\tchar *pipeline_name;\n-\tvoid *data;\n-\tuint32_t table_id, t0, n_tokens_parsed;\n-\tint status;\n-\n-\tif (n_tokens < 8) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"table\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"table\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&table_id, tokens[3]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"table_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[4], \"rule\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"rule\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"add\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"add\");\n-\t\treturn;\n-\t}\n-\n-\tt0 = 6;\n-\n-\t/* match */\n-\tn_tokens_parsed = parse_match(tokens + t0,\n-\t\tn_tokens - t0,\n-\t\tout,\n-\t\tout_size,\n-\t\t&m);\n-\tif (n_tokens_parsed == 0)\n-\t\treturn;\n-\tt0 += n_tokens_parsed;\n-\n-\t/* action */\n-\tn_tokens_parsed = parse_table_action(tokens + t0,\n-\t\tn_tokens - t0,\n-\t\tout,\n-\t\tout_size,\n-\t\t&a);\n-\tif (n_tokens_parsed == 0)\n-\t\treturn;\n-\tt0 += n_tokens_parsed;\n-\n-\tif (t0 != n_tokens) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tstatus = softnic_pipeline_table_rule_add(softnic,\n-\t\tpipeline_name,\n-\t\ttable_id,\n-\t\t&m,\n-\t\t&a,\n-\t\t&data);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> table <table_id> rule add\n- *    match\n- *       default\n- *    action\n- *       fwd\n- *          drop\n- *          | port <port_id>\n- *          | meta\n- *          | table <table_id>\n- */\n-static void\n-cmd_softnic_pipeline_table_rule_add_default(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct softnic_table_rule_action action;\n-\tvoid *data;\n-\tchar *pipeline_name;\n-\tuint32_t table_id;\n-\tint status;\n-\n-\tif (n_tokens != 11 &&\n-\t\tn_tokens != 12) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"table\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"table\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&table_id, tokens[3]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"table_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[4], \"rule\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"rule\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"add\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"add\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[6], \"match\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"match\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[7], \"default\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"default\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[8], \"action\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"action\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[9], \"fwd\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"fwd\");\n-\t\treturn;\n-\t}\n-\n-\taction.action_mask = 1 << RTE_TABLE_ACTION_FWD;\n-\n-\tif (strcmp(tokens[10], \"drop\") == 0) {\n-\t\tif (n_tokens != 11) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\taction.fwd.action = RTE_PIPELINE_ACTION_DROP;\n-\t} else if (strcmp(tokens[10], \"port\") == 0) {\n-\t\tuint32_t id;\n-\n-\t\tif (n_tokens != 12) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&id, tokens[11]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"port_id\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\taction.fwd.action = RTE_PIPELINE_ACTION_PORT;\n-\t\taction.fwd.id = id;\n-\t} else if (strcmp(tokens[10], \"meta\") == 0) {\n-\t\tif (n_tokens != 11) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\taction.fwd.action = RTE_PIPELINE_ACTION_PORT_META;\n-\t} else if (strcmp(tokens[10], \"table\") == 0) {\n-\t\tuint32_t id;\n-\n-\t\tif (n_tokens != 12) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint32(&id, tokens[11]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"table_id\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\taction.fwd.action = RTE_PIPELINE_ACTION_TABLE;\n-\t\taction.fwd.id = id;\n-\t} else {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID,\n-\t\t\t\"drop or port or meta or table\");\n-\t\treturn;\n-\t}\n-\n-\tstatus = softnic_pipeline_table_rule_add_default(softnic,\n-\t\tpipeline_name,\n-\t\ttable_id,\n-\t\t&action,\n-\t\t&data);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> table <table_id> rule add bulk <file_name> <n_rules>\n- *\n- * File <file_name>:\n- * - line format: match <match> action <action>\n- */\n-static int\n-cli_rule_file_process(const char *file_name,\n-\tsize_t line_len_max,\n-\tstruct softnic_table_rule_match *m,\n-\tstruct softnic_table_rule_action *a,\n-\tuint32_t *n_rules,\n-\tuint32_t *line_number,\n-\tchar *out,\n-\tsize_t out_size);\n-\n-static void\n-cmd_softnic_pipeline_table_rule_add_bulk(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct softnic_table_rule_match *match;\n-\tstruct softnic_table_rule_action *action;\n-\tvoid **data;\n-\tchar *pipeline_name, *file_name;\n-\tuint32_t table_id, n_rules, n_rules_parsed, line_number;\n-\tint status;\n-\n-\tif (n_tokens != 9) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"table\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"table\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&table_id, tokens[3]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"table_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[4], \"rule\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"rule\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"add\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"add\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[6], \"bulk\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"bulk\");\n-\t\treturn;\n-\t}\n-\n-\tfile_name = tokens[7];\n-\n-\tif ((softnic_parser_read_uint32(&n_rules, tokens[8]) != 0) ||\n-\t\tn_rules == 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"n_rules\");\n-\t\treturn;\n-\t}\n-\n-\t/* Memory allocation. */\n-\tmatch = calloc(n_rules, sizeof(struct softnic_table_rule_match));\n-\taction = calloc(n_rules, sizeof(struct softnic_table_rule_action));\n-\tdata = calloc(n_rules, sizeof(void *));\n-\tif (match == NULL ||\n-\t\taction == NULL ||\n-\t\tdata == NULL) {\n-\t\tsnprintf(out, out_size, MSG_OUT_OF_MEMORY);\n-\t\tfree(data);\n-\t\tfree(action);\n-\t\tfree(match);\n-\t\treturn;\n-\t}\n-\n-\t/* Load rule file */\n-\tn_rules_parsed = n_rules;\n-\tstatus = cli_rule_file_process(file_name,\n-\t\t1024,\n-\t\tmatch,\n-\t\taction,\n-\t\t&n_rules_parsed,\n-\t\t&line_number,\n-\t\tout,\n-\t\tout_size);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_FILE_ERR, file_name, line_number);\n-\t\tfree(data);\n-\t\tfree(action);\n-\t\tfree(match);\n-\t\treturn;\n-\t}\n-\tif (n_rules_parsed != n_rules) {\n-\t\tsnprintf(out, out_size, MSG_FILE_NOT_ENOUGH, file_name);\n-\t\tfree(data);\n-\t\tfree(action);\n-\t\tfree(match);\n-\t\treturn;\n-\t}\n-\n-\t/* Rule bulk add */\n-\tstatus = softnic_pipeline_table_rule_add_bulk(softnic,\n-\t\tpipeline_name,\n-\t\ttable_id,\n-\t\tmatch,\n-\t\taction,\n-\t\tdata,\n-\t\t&n_rules);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\tfree(data);\n-\t\tfree(action);\n-\t\tfree(match);\n-\t\treturn;\n-\t}\n-\n-\t/* Memory free */\n-\tfree(data);\n-\tfree(action);\n-\tfree(match);\n-}\n-\n-/**\n- * pipeline <pipeline_name> table <table_id> rule delete\n- *    match <match>\n- */\n-static void\n-cmd_softnic_pipeline_table_rule_delete(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct softnic_table_rule_match m;\n-\tchar *pipeline_name;\n-\tuint32_t table_id, n_tokens_parsed, t0;\n-\tint status;\n-\n-\tif (n_tokens < 8) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"table\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"table\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&table_id, tokens[3]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"table_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[4], \"rule\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"rule\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"delete\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"delete\");\n-\t\treturn;\n-\t}\n-\n-\tt0 = 6;\n-\n-\t/* match */\n-\tn_tokens_parsed = parse_match(tokens + t0,\n-\t\tn_tokens - t0,\n-\t\tout,\n-\t\tout_size,\n-\t\t&m);\n-\tif (n_tokens_parsed == 0)\n-\t\treturn;\n-\tt0 += n_tokens_parsed;\n-\n-\tif (n_tokens != t0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tstatus = softnic_pipeline_table_rule_delete(softnic,\n-\t\tpipeline_name,\n-\t\ttable_id,\n-\t\t&m);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> table <table_id> rule delete\n- *    match\n- *       default\n- */\n-static void\n-cmd_softnic_pipeline_table_rule_delete_default(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tchar *pipeline_name;\n-\tuint32_t table_id;\n-\tint status;\n-\n-\tif (n_tokens != 8) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"table\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"table\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&table_id, tokens[3]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"table_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[4], \"rule\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"rule\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"delete\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"delete\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[6], \"match\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"match\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[7], \"default\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"default\");\n-\t\treturn;\n-\t}\n-\n-\tstatus = softnic_pipeline_table_rule_delete_default(softnic,\n-\t\tpipeline_name,\n-\t\ttable_id);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> table <table_id> rule read stats [clear]\n- */\n-static void\n-cmd_softnic_pipeline_table_rule_stats_read(struct pmd_internals *softnic __rte_unused,\n-\tchar **tokens,\n-\tuint32_t n_tokens __rte_unused,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tsnprintf(out, out_size, MSG_CMD_UNIMPLEM, tokens[0]);\n-}\n-\n-/**\n- * pipeline <pipeline_name> table <table_id> meter profile <meter_profile_id>\n- *  add srtcm cir <cir> cbs <cbs> ebs <ebs>\n- *  | trtcm cir <cir> pir <pir> cbs <cbs> pbs <pbs>\n- */\n-static void\n-cmd_pipeline_table_meter_profile_add(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct rte_table_action_meter_profile p;\n-\tchar *pipeline_name;\n-\tuint32_t table_id, meter_profile_id;\n-\tint status;\n-\n-\tif (n_tokens < 9) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"table\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"port\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&table_id, tokens[3]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"table_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[4], \"meter\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"meter\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"profile\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"profile\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&meter_profile_id, tokens[6]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"meter_profile_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[7], \"add\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"add\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[8], \"srtcm\") == 0) {\n-\t\tif (n_tokens != 15) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH,\n-\t\t\t\ttokens[0]);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.alg = RTE_TABLE_ACTION_METER_SRTCM;\n-\n-\t\tif (strcmp(tokens[9], \"cir\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"cir\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint64(&p.srtcm.cir, tokens[10]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"cir\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[11], \"cbs\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"cbs\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint64(&p.srtcm.cbs, tokens[12]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"cbs\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[13], \"ebs\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"ebs\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint64(&p.srtcm.ebs, tokens[14]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"ebs\");\n-\t\t\treturn;\n-\t\t}\n-\t} else if (strcmp(tokens[8], \"trtcm\") == 0) {\n-\t\tif (n_tokens != 17) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tp.alg = RTE_TABLE_ACTION_METER_TRTCM;\n-\n-\t\tif (strcmp(tokens[9], \"cir\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"cir\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint64(&p.trtcm.cir, tokens[10]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"cir\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[11], \"pir\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"pir\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint64(&p.trtcm.pir, tokens[12]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"pir\");\n-\t\t\treturn;\n-\t\t}\n-\t\tif (strcmp(tokens[13], \"cbs\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"cbs\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint64(&p.trtcm.cbs, tokens[14]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"cbs\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[15], \"pbs\") != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"pbs\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (softnic_parser_read_uint64(&p.trtcm.pbs, tokens[16]) != 0) {\n-\t\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"pbs\");\n-\t\t\treturn;\n-\t\t}\n-\t} else {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tstatus = softnic_pipeline_table_mtr_profile_add(softnic,\n-\t\tpipeline_name,\n-\t\ttable_id,\n-\t\tmeter_profile_id,\n-\t\t&p);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> table <table_id>\n- *  meter profile <meter_profile_id> delete\n- */\n-static void\n-cmd_pipeline_table_meter_profile_delete(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tchar *pipeline_name;\n-\tuint32_t table_id, meter_profile_id;\n-\tint status;\n-\n-\tif (n_tokens != 8) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"table\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"port\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&table_id, tokens[3]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"table_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[4], \"meter\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"meter\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[5], \"profile\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"profile\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&meter_profile_id, tokens[6]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"meter_profile_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[7], \"delete\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"delete\");\n-\t\treturn;\n-\t}\n-\n-\tstatus = softnic_pipeline_table_mtr_profile_delete(softnic,\n-\t\tpipeline_name,\n-\t\ttable_id,\n-\t\tmeter_profile_id);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> table <table_id> rule read meter [clear]\n- */\n-static void\n-cmd_pipeline_table_rule_meter_read(struct pmd_internals *softnic __rte_unused,\n-\tchar **tokens,\n-\tuint32_t n_tokens __rte_unused,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tsnprintf(out, out_size, MSG_CMD_UNIMPLEM, tokens[0]);\n-}\n-\n-/**\n- * pipeline <pipeline_name> table <table_id> dscp <file_name>\n- *\n- * File <file_name>:\n- *  - exactly 64 lines\n- *  - line format: <tc_id> <tc_queue_id> <color>, with <color> as: g | y | r\n- */\n-static int\n-load_dscp_table(struct rte_table_action_dscp_table *dscp_table,\n-\tconst char *file_name,\n-\tuint32_t *line_number)\n-{\n-\tFILE *f = NULL;\n-\tuint32_t dscp, l;\n-\n-\t/* Check input arguments */\n-\tif (dscp_table == NULL ||\n-\t\tfile_name == NULL ||\n-\t\tline_number == NULL) {\n-\t\tif (line_number)\n-\t\t\t*line_number = 0;\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/* Open input file */\n-\tf = fopen(file_name, \"r\");\n-\tif (f == NULL) {\n-\t\t*line_number = 0;\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/* Read file */\n-\tfor (dscp = 0, l = 1; ; l++) {\n-\t\tchar line[64];\n-\t\tchar *tokens[3];\n-\t\tenum rte_color color;\n-\t\tuint32_t tc_id, tc_queue_id, n_tokens = RTE_DIM(tokens);\n-\n-\t\tif (fgets(line, sizeof(line), f) == NULL)\n-\t\t\tbreak;\n-\n-\t\tif (is_comment(line))\n-\t\t\tcontinue;\n-\n-\t\tif (softnic_parse_tokenize_string(line, tokens, &n_tokens)) {\n-\t\t\t*line_number = l;\n-\t\t\tfclose(f);\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\n-\t\tif (n_tokens == 0)\n-\t\t\tcontinue;\n-\n-\t\tif (dscp >= RTE_DIM(dscp_table->entry) ||\n-\t\t\tn_tokens != RTE_DIM(tokens) ||\n-\t\t\tsoftnic_parser_read_uint32(&tc_id, tokens[0]) ||\n-\t\t\ttc_id >= RTE_TABLE_ACTION_TC_MAX ||\n-\t\t\tsoftnic_parser_read_uint32(&tc_queue_id, tokens[1]) ||\n-\t\t\ttc_queue_id >= RTE_TABLE_ACTION_TC_QUEUE_MAX ||\n-\t\t\t(strlen(tokens[2]) != 1)) {\n-\t\t\t*line_number = l;\n-\t\t\tfclose(f);\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\n-\t\tswitch (tokens[2][0]) {\n-\t\tcase 'g':\n-\t\tcase 'G':\n-\t\t\tcolor = RTE_COLOR_GREEN;\n-\t\t\tbreak;\n-\n-\t\tcase 'y':\n-\t\tcase 'Y':\n-\t\t\tcolor = RTE_COLOR_YELLOW;\n-\t\t\tbreak;\n-\n-\t\tcase 'r':\n-\t\tcase 'R':\n-\t\t\tcolor = RTE_COLOR_RED;\n-\t\t\tbreak;\n-\n-\t\tdefault:\n-\t\t\t*line_number = l;\n-\t\t\tfclose(f);\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\n-\t\tdscp_table->entry[dscp].tc_id = tc_id;\n-\t\tdscp_table->entry[dscp].tc_queue_id = tc_queue_id;\n-\t\tdscp_table->entry[dscp].color = color;\n-\t\tdscp++;\n-\t}\n-\n-\t/* Close file */\n-\tfclose(f);\n-\treturn 0;\n-}\n-\n-static void\n-cmd_pipeline_table_dscp(struct pmd_internals *softnic,\n-\tchar **tokens,\n-\tuint32_t n_tokens,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tstruct rte_table_action_dscp_table dscp_table;\n-\tchar *pipeline_name, *file_name;\n-\tuint32_t table_id, line_number;\n-\tint status;\n-\n-\tif (n_tokens != 6) {\n-\t\tsnprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);\n-\t\treturn;\n-\t}\n-\n-\tpipeline_name = tokens[1];\n-\n-\tif (strcmp(tokens[2], \"table\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"port\");\n-\t\treturn;\n-\t}\n-\n-\tif (softnic_parser_read_uint32(&table_id, tokens[3]) != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_INVALID, \"table_id\");\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[4], \"dscp\") != 0) {\n-\t\tsnprintf(out, out_size, MSG_ARG_NOT_FOUND, \"dscp\");\n-\t\treturn;\n-\t}\n-\n-\tfile_name = tokens[5];\n-\n-\tstatus = load_dscp_table(&dscp_table, file_name, &line_number);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_FILE_ERR, file_name, line_number);\n-\t\treturn;\n-\t}\n-\n-\tstatus = softnic_pipeline_table_dscp_table_update(softnic,\n-\t\tpipeline_name,\n-\t\ttable_id,\n-\t\tUINT64_MAX,\n-\t\t&dscp_table);\n-\tif (status) {\n-\t\tsnprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);\n-\t\treturn;\n-\t}\n-}\n-\n-/**\n- * pipeline <pipeline_name> table <table_id> rule read ttl [clear]\n- */\n-static void\n-cmd_softnic_pipeline_table_rule_ttl_read(struct pmd_internals *softnic __rte_unused,\n-\tchar **tokens,\n-\tuint32_t n_tokens __rte_unused,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tsnprintf(out, out_size, MSG_CMD_UNIMPLEM, tokens[0]);\n-}\n-\n /**\n  * thread <thread_id> pipeline <pipeline_name> enable\n  */\n@@ -4529,202 +307,6 @@ softnic_cli_process(char *in, char *out, size_t out_size, void *arg)\n \t\treturn;\n \t}\n \n-\tif (strcmp(tokens[0], \"port\") == 0) {\n-\t\tcmd_port_in_action_profile(softnic, tokens, n_tokens, out, out_size);\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[0], \"table\") == 0) {\n-\t\tcmd_table_action_profile(softnic, tokens, n_tokens, out, out_size);\n-\t\treturn;\n-\t}\n-\n-\tif (strcmp(tokens[0], \"pipeline\") == 0) {\n-\t\tif (n_tokens >= 3 &&\n-\t\t\t(strcmp(tokens[2], \"period\") == 0)) {\n-\t\t\tcmd_pipeline(softnic, tokens, n_tokens, out, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 5 &&\n-\t\t\t(strcmp(tokens[2], \"port\") == 0) &&\n-\t\t\t(strcmp(tokens[3], \"in\") == 0) &&\n-\t\t\t(strcmp(tokens[4], \"bsz\") == 0)) {\n-\t\t\tcmd_pipeline_port_in(softnic, tokens, n_tokens, out, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 5 &&\n-\t\t\t(strcmp(tokens[2], \"port\") == 0) &&\n-\t\t\t(strcmp(tokens[3], \"out\") == 0) &&\n-\t\t\t(strcmp(tokens[4], \"bsz\") == 0)) {\n-\t\t\tcmd_pipeline_port_out(softnic, tokens, n_tokens, out, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 4 &&\n-\t\t\t(strcmp(tokens[2], \"table\") == 0) &&\n-\t\t\t(strcmp(tokens[3], \"match\") == 0)) {\n-\t\t\tcmd_pipeline_table(softnic, tokens, n_tokens, out, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 6 &&\n-\t\t\t(strcmp(tokens[2], \"port\") == 0) &&\n-\t\t\t(strcmp(tokens[3], \"in\") == 0) &&\n-\t\t\t(strcmp(tokens[5], \"table\") == 0)) {\n-\t\t\tcmd_pipeline_port_in_table(softnic, tokens, n_tokens,\n-\t\t\t\tout, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 6 &&\n-\t\t\t(strcmp(tokens[2], \"port\") == 0) &&\n-\t\t\t(strcmp(tokens[3], \"in\") == 0) &&\n-\t\t\t(strcmp(tokens[5], \"stats\") == 0)) {\n-\t\t\tcmd_pipeline_port_in_stats(softnic, tokens, n_tokens,\n-\t\t\t\tout, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 6 &&\n-\t\t\t(strcmp(tokens[2], \"port\") == 0) &&\n-\t\t\t(strcmp(tokens[3], \"in\") == 0) &&\n-\t\t\t(strcmp(tokens[5], \"enable\") == 0)) {\n-\t\t\tcmd_softnic_pipeline_port_in_enable(softnic, tokens, n_tokens,\n-\t\t\t\tout, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 6 &&\n-\t\t\t(strcmp(tokens[2], \"port\") == 0) &&\n-\t\t\t(strcmp(tokens[3], \"in\") == 0) &&\n-\t\t\t(strcmp(tokens[5], \"disable\") == 0)) {\n-\t\t\tcmd_softnic_pipeline_port_in_disable(softnic, tokens, n_tokens,\n-\t\t\t\tout, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 6 &&\n-\t\t\t(strcmp(tokens[2], \"port\") == 0) &&\n-\t\t\t(strcmp(tokens[3], \"out\") == 0) &&\n-\t\t\t(strcmp(tokens[5], \"stats\") == 0)) {\n-\t\t\tcmd_pipeline_port_out_stats(softnic, tokens, n_tokens,\n-\t\t\t\tout, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 5 &&\n-\t\t\t(strcmp(tokens[2], \"table\") == 0) &&\n-\t\t\t(strcmp(tokens[4], \"stats\") == 0)) {\n-\t\t\tcmd_pipeline_table_stats(softnic, tokens, n_tokens,\n-\t\t\t\tout, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 7 &&\n-\t\t\t(strcmp(tokens[2], \"table\") == 0) &&\n-\t\t\t(strcmp(tokens[4], \"rule\") == 0) &&\n-\t\t\t(strcmp(tokens[5], \"add\") == 0) &&\n-\t\t\t(strcmp(tokens[6], \"match\") == 0)) {\n-\t\t\tif (n_tokens >= 8 &&\n-\t\t\t\t(strcmp(tokens[7], \"default\") == 0)) {\n-\t\t\t\tcmd_softnic_pipeline_table_rule_add_default(softnic, tokens,\n-\t\t\t\t\tn_tokens, out, out_size);\n-\t\t\t\treturn;\n-\t\t\t}\n-\n-\t\t\tcmd_softnic_pipeline_table_rule_add(softnic, tokens, n_tokens,\n-\t\t\t\tout, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 7 &&\n-\t\t\t(strcmp(tokens[2], \"table\") == 0) &&\n-\t\t\t(strcmp(tokens[4], \"rule\") == 0) &&\n-\t\t\t(strcmp(tokens[5], \"add\") == 0) &&\n-\t\t\t(strcmp(tokens[6], \"bulk\") == 0)) {\n-\t\t\tcmd_softnic_pipeline_table_rule_add_bulk(softnic, tokens,\n-\t\t\t\tn_tokens, out, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 7 &&\n-\t\t\t(strcmp(tokens[2], \"table\") == 0) &&\n-\t\t\t(strcmp(tokens[4], \"rule\") == 0) &&\n-\t\t\t(strcmp(tokens[5], \"delete\") == 0) &&\n-\t\t\t(strcmp(tokens[6], \"match\") == 0)) {\n-\t\t\tif (n_tokens >= 8 &&\n-\t\t\t\t(strcmp(tokens[7], \"default\") == 0)) {\n-\t\t\t\tcmd_softnic_pipeline_table_rule_delete_default(softnic, tokens,\n-\t\t\t\t\tn_tokens, out, out_size);\n-\t\t\t\treturn;\n-\t\t\t\t}\n-\n-\t\t\tcmd_softnic_pipeline_table_rule_delete(softnic, tokens, n_tokens,\n-\t\t\t\tout, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 7 &&\n-\t\t\t(strcmp(tokens[2], \"table\") == 0) &&\n-\t\t\t(strcmp(tokens[4], \"rule\") == 0) &&\n-\t\t\t(strcmp(tokens[5], \"read\") == 0) &&\n-\t\t\t(strcmp(tokens[6], \"stats\") == 0)) {\n-\t\t\tcmd_softnic_pipeline_table_rule_stats_read(softnic, tokens, n_tokens,\n-\t\t\t\tout, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 8 &&\n-\t\t\t(strcmp(tokens[2], \"table\") == 0) &&\n-\t\t\t(strcmp(tokens[4], \"meter\") == 0) &&\n-\t\t\t(strcmp(tokens[5], \"profile\") == 0) &&\n-\t\t\t(strcmp(tokens[7], \"add\") == 0)) {\n-\t\t\tcmd_pipeline_table_meter_profile_add(softnic, tokens, n_tokens,\n-\t\t\t\tout, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 8 &&\n-\t\t\t(strcmp(tokens[2], \"table\") == 0) &&\n-\t\t\t(strcmp(tokens[4], \"meter\") == 0) &&\n-\t\t\t(strcmp(tokens[5], \"profile\") == 0) &&\n-\t\t\t(strcmp(tokens[7], \"delete\") == 0)) {\n-\t\t\tcmd_pipeline_table_meter_profile_delete(softnic, tokens,\n-\t\t\t\tn_tokens, out, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 7 &&\n-\t\t\t(strcmp(tokens[2], \"table\") == 0) &&\n-\t\t\t(strcmp(tokens[4], \"rule\") == 0) &&\n-\t\t\t(strcmp(tokens[5], \"read\") == 0) &&\n-\t\t\t(strcmp(tokens[6], \"meter\") == 0)) {\n-\t\t\tcmd_pipeline_table_rule_meter_read(softnic, tokens, n_tokens,\n-\t\t\t\tout, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 5 &&\n-\t\t\t(strcmp(tokens[2], \"table\") == 0) &&\n-\t\t\t(strcmp(tokens[4], \"dscp\") == 0)) {\n-\t\t\tcmd_pipeline_table_dscp(softnic, tokens, n_tokens,\n-\t\t\t\tout, out_size);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (n_tokens >= 7 &&\n-\t\t\t(strcmp(tokens[2], \"table\") == 0) &&\n-\t\t\t(strcmp(tokens[4], \"rule\") == 0) &&\n-\t\t\t(strcmp(tokens[5], \"read\") == 0) &&\n-\t\t\t(strcmp(tokens[6], \"ttl\") == 0)) {\n-\t\t\tcmd_softnic_pipeline_table_rule_ttl_read(softnic, tokens, n_tokens,\n-\t\t\t\tout, out_size);\n-\t\t\treturn;\n-\t\t}\n-\t}\n-\n \tif (strcmp(tokens[0], \"thread\") == 0) {\n \t\tif (n_tokens >= 5 &&\n \t\t\t(strcmp(tokens[4], \"enable\") == 0)) {\n@@ -4800,112 +382,3 @@ softnic_cli_script_process(struct pmd_internals *softnic,\n \tfree(msg_in);\n \treturn 0;\n }\n-\n-static int\n-cli_rule_file_process(const char *file_name,\n-\tsize_t line_len_max,\n-\tstruct softnic_table_rule_match *m,\n-\tstruct softnic_table_rule_action *a,\n-\tuint32_t *n_rules,\n-\tuint32_t *line_number,\n-\tchar *out,\n-\tsize_t out_size)\n-{\n-\tFILE *f = NULL;\n-\tchar *line = NULL;\n-\tuint32_t rule_id, line_id;\n-\tint status = 0;\n-\n-\t/* Check input arguments */\n-\tif (file_name == NULL ||\n-\t\t(strlen(file_name) == 0) ||\n-\t\tline_len_max == 0) {\n-\t\t*line_number = 0;\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/* Memory allocation */\n-\tline = malloc(line_len_max + 1);\n-\tif (line == NULL) {\n-\t\t*line_number = 0;\n-\t\treturn -ENOMEM;\n-\t}\n-\n-\t/* Open file */\n-\tf = fopen(file_name, \"r\");\n-\tif (f == NULL) {\n-\t\t*line_number = 0;\n-\t\tfree(line);\n-\t\treturn -EIO;\n-\t}\n-\n-\t/* Read file */\n-\tfor (line_id = 1, rule_id = 0; rule_id < *n_rules; line_id++) {\n-\t\tchar *tokens[CMD_MAX_TOKENS];\n-\t\tuint32_t n_tokens, n_tokens_parsed, t0;\n-\n-\t\t/* Read next line from file. */\n-\t\tif (fgets(line, line_len_max + 1, f) == NULL)\n-\t\t\tbreak;\n-\n-\t\t/* Comment. */\n-\t\tif (is_comment(line))\n-\t\t\tcontinue;\n-\n-\t\t/* Parse line. */\n-\t\tn_tokens = RTE_DIM(tokens);\n-\t\tstatus = softnic_parse_tokenize_string(line, tokens, &n_tokens);\n-\t\tif (status) {\n-\t\t\tstatus = -EINVAL;\n-\t\t\tbreak;\n-\t\t}\n-\n-\t\t/* Empty line. */\n-\t\tif (n_tokens == 0)\n-\t\t\tcontinue;\n-\t\tt0 = 0;\n-\n-\t\t/* Rule match. */\n-\t\tn_tokens_parsed = parse_match(tokens + t0,\n-\t\t\tn_tokens - t0,\n-\t\t\tout,\n-\t\t\tout_size,\n-\t\t\t&m[rule_id]);\n-\t\tif (n_tokens_parsed == 0) {\n-\t\t\tstatus = -EINVAL;\n-\t\t\tbreak;\n-\t\t}\n-\t\tt0 += n_tokens_parsed;\n-\n-\t\t/* Rule action. */\n-\t\tn_tokens_parsed = parse_table_action(tokens + t0,\n-\t\t\tn_tokens - t0,\n-\t\t\tout,\n-\t\t\tout_size,\n-\t\t\t&a[rule_id]);\n-\t\tif (n_tokens_parsed == 0) {\n-\t\t\tstatus = -EINVAL;\n-\t\t\tbreak;\n-\t\t}\n-\t\tt0 += n_tokens_parsed;\n-\n-\t\t/* Line completed. */\n-\t\tif (t0 < n_tokens) {\n-\t\t\tstatus = -EINVAL;\n-\t\t\tbreak;\n-\t\t}\n-\n-\t\t/* Increment rule count */\n-\t\trule_id++;\n-\t}\n-\n-\t/* Close file */\n-\tfclose(f);\n-\n-\t/* Memory free */\n-\tfree(line);\n-\n-\t*n_rules = rule_id;\n-\t*line_number = line_id;\n-\treturn status;\n-}\n",
    "prefixes": [
        "06/21"
    ]
}