Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2222/?format=api
https://patches.dpdk.org/api/patches/2222/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/patch/1420681358-24809-1-git-send-email-zhida.zang@intel.com/", "project": { "id": 1, "url": "https://patches.dpdk.org/api/projects/1/?format=api", "name": "DPDK", "link_name": "dpdk", "list_id": "dev.dpdk.org", "list_email": "dev@dpdk.org", "web_url": "http://core.dpdk.org", "scm_url": "git://dpdk.org/dpdk", "webscm_url": "http://git.dpdk.org/dpdk", "list_archive_url": "https://inbox.dpdk.org/dev", "list_archive_url_format": "https://inbox.dpdk.org/dev/{}", "commit_url_format": "" }, "msgid": "<1420681358-24809-1-git-send-email-zhida.zang@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dev/1420681358-24809-1-git-send-email-zhida.zang@intel.com", "date": "2015-01-08T01:42:38", "name": "[dpdk-dev] ixgbe/igb: integrate syn filter to new API", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "1f96219bda8f37b4e380faba15cab47504059721", "submitter": { "id": 81, "url": "https://patches.dpdk.org/api/people/81/?format=api", "name": "zzang", "email": "zhida.zang@intel.com" }, "delegate": null, "mbox": "https://patches.dpdk.org/project/dpdk/patch/1420681358-24809-1-git-send-email-zhida.zang@intel.com/mbox/", "series": [], "comments": "https://patches.dpdk.org/api/patches/2222/comments/", "check": "pending", "checks": "https://patches.dpdk.org/api/patches/2222/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<dev-bounces@dpdk.org>", "X-Original-To": "patchwork@dpdk.org", "Delivered-To": "patchwork@dpdk.org", "Received": [ "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 595775A08;\n\tThu, 8 Jan 2015 02:43:41 +0100 (CET)", "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n\tby dpdk.org (Postfix) with ESMTP id 3B96058DD\n\tfor <dev@dpdk.org>; Thu, 8 Jan 2015 02:43:39 +0100 (CET)", "from orsmga002.jf.intel.com ([10.7.209.21])\n\tby orsmga102.jf.intel.com with ESMTP; 07 Jan 2015 17:41:10 -0800", "from shvmail01.sh.intel.com ([10.239.29.42])\n\tby orsmga002.jf.intel.com with ESMTP; 07 Jan 2015 17:43:37 -0800", "from shecgisg004.sh.intel.com (shecgisg004.sh.intel.com\n\t[10.239.29.89])\n\tby shvmail01.sh.intel.com with ESMTP id t081hZNJ017234;\n\tThu, 8 Jan 2015 09:43:35 +0800", "from shecgisg004.sh.intel.com (localhost [127.0.0.1])\n\tby shecgisg004.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP\n\tid t081hX8k024846; Thu, 8 Jan 2015 09:43:35 +0800", "(from zzang@localhost)\n\tby shecgisg004.sh.intel.com (8.13.6/8.13.6/Submit) id t081hWuO024841; \n\tThu, 8 Jan 2015 09:43:32 +0800" ], "X-ExtLoop1": "1", "X-IronPort-AV": "E=Sophos;i=\"5.07,718,1413270000\"; d=\"scan'208\";a=\"666159043\"", "From": "zhida zang <zhida.zang@intel.com>", "To": "dev@dpdk.org", "Date": "Thu, 8 Jan 2015 09:42:38 +0800", "Message-Id": "<1420681358-24809-1-git-send-email-zhida.zang@intel.com>", "X-Mailer": "git-send-email 1.7.4.1", "Subject": "[dpdk-dev] [PATCH] ixgbe/igb: integrate syn filter to new API", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.15", "Precedence": "list", "List-Id": "patches and discussions about DPDK <dev.dpdk.org>", "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>", "List-Archive": "<http://dpdk.org/ml/archives/dev/>", "List-Post": "<mailto:dev@dpdk.org>", "List-Help": "<mailto:dev-request@dpdk.org?subject=help>", "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>", "Errors-To": "dev-bounces@dpdk.org", "Sender": "\"dev\" <dev-bounces@dpdk.org>" }, "content": "This patch integrates syn filter to new API in ixgbe/igb driver.\n\nchanges:\nixgbe: remove old functions that deal with syn filter\nixgbe: add new functions that deal with syn filter (fit for filter_ctrl API)\ne1000: remove old functions that deal with syn filter\ne1000: add new functions that deal with syn filter (fit for filter_ctrl API)\ntestpmd: change the entry for syn filter in cmdline\ntestpmd: change function call to get syn filter in config\n\nSigned-off-by: Zhida Zang <zhida.zang@intel.com>\n---\n app/test-pmd/cmdline.c | 179 ++++++++++++++++++++---------------\n app/test-pmd/config.c | 10 +-\n lib/librte_ether/rte_eth_ctrl.h | 12 +++\n lib/librte_pmd_e1000/igb_ethdev.c | 176 ++++++++++++++++++++--------------\n lib/librte_pmd_ixgbe/ixgbe_ethdev.c | 182 ++++++++++++++++++++----------------\n 5 files changed, 331 insertions(+), 228 deletions(-)", "diff": "diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c\nindex 4c3fc76..820b3a6 100644\n--- a/app/test-pmd/cmdline.c\n+++ b/app/test-pmd/cmdline.c\n@@ -665,13 +665,13 @@ static void cmd_help_long_parsed(void *parsed_result,\n \t\t\t\"get_5tuple_filter (port_id) index (idx)\\n\"\n \t\t\t\" get info of a 5tuple filter.\\n\\n\"\n \n-\t\t\t\"add_syn_filter (port_id) priority (high|low) queue (queue_id)\"\n+\t\t\t\"syn_filter add (port_id) priority (high|low) queue (queue_id)\"\n \t\t\t\" add syn filter.\\n\\n\"\n \n-\t\t\t\"remove_syn_filter (port_id)\"\n+\t\t\t\"syn_filter del (port_id)\"\n \t\t\t\" remove syn filter.\\n\\n\"\n \n-\t\t\t\"get_syn_filter (port_id) \"\n+\t\t\t\"syn_filter get (port_id) \"\n \t\t\t\" get syn filter info.\\n\\n\"\n \n \t\t\t\"add_flex_filter (port_id) len (len_value) bytes (bytes_string) mask (mask_value)\"\n@@ -7044,101 +7044,130 @@ cmdline_parse_inst_t cmd_get_ethertype_filter = {\n \t},\n };\n \n-/* *** set SYN filter *** */\n-struct cmd_set_syn_filter_result {\n+/* *** Add/Del/Get syn filter *** */\n+struct cmd_syn_filter_result {\n \tcmdline_fixed_string_t filter;\n+\tcmdline_fixed_string_t ops;\n \tuint8_t port_id;\n \tcmdline_fixed_string_t priority;\n \tcmdline_fixed_string_t high;\n \tcmdline_fixed_string_t queue;\n-\tuint16_t queue_id;\n+\tuint16_t queue_id;\n };\n \n-static void\n-cmd_set_syn_filter_parsed(void *parsed_result,\n-\t\t\t__attribute__((unused)) struct cmdline *cl,\n-\t\t\t__attribute__((unused)) void *data)\n-{\n-\tint ret = 0;\n-\tstruct cmd_set_syn_filter_result *res = parsed_result;\n-\tstruct rte_syn_filter filter;\n-\n-\tif (!strcmp(res->filter, \"add_syn_filter\")) {\n-\t\tif (!strcmp(res->high, \"high\"))\n-\t\t\tfilter.hig_pri = 1;\n-\t\telse\n-\t\t\tfilter.hig_pri = 0;\n-\t\tret = rte_eth_dev_add_syn_filter(res->port_id,\n-\t\t\t\t&filter, res->queue_id);\n-\t} else if (!strcmp(res->filter, \"remove_syn_filter\"))\n-\t\tret = rte_eth_dev_remove_syn_filter(res->port_id);\n-\telse if (!strcmp(res->filter, \"get_syn_filter\"))\n-\t\tget_syn_filter(res->port_id);\n-\tif (ret < 0)\n-\t\tprintf(\"syn filter setting error: (%s)\\n\", strerror(-ret));\n-\n-}\n-cmdline_parse_token_num_t cmd_syn_filter_portid =\n-\tTOKEN_NUM_INITIALIZER(struct cmd_set_syn_filter_result,\n-\t\t\t\tport_id, UINT8);\n+cmdline_parse_token_string_t cmd_syn_filter_filter =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result,\n+\tfilter, \"syn_filter\");\n+cmdline_parse_token_string_t cmd_syn_filter_add =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result,\n+\tops, \"add\");\n+cmdline_parse_token_string_t cmd_syn_filter_del =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result,\n+\tops, \"del\");\n+cmdline_parse_token_string_t cmd_syn_filter_get =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result,\n+\tops, \"get\");\n+cmdline_parse_token_num_t cmd_syn_filter_port_id =\n+\tTOKEN_NUM_INITIALIZER(struct cmd_syn_filter_result,\n+\tport_id, UINT8);\n cmdline_parse_token_string_t cmd_syn_filter_priority =\n-\tTOKEN_STRING_INITIALIZER(struct cmd_set_syn_filter_result,\n+\tTOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result,\n \t\t\t\tpriority, \"priority\");\n cmdline_parse_token_string_t cmd_syn_filter_high =\n-\tTOKEN_STRING_INITIALIZER(struct cmd_set_syn_filter_result,\n+\tTOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result,\n \t\t\t\thigh, \"high#low\");\n cmdline_parse_token_string_t cmd_syn_filter_queue =\n-\tTOKEN_STRING_INITIALIZER(struct cmd_set_syn_filter_result,\n+\tTOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result,\n \t\t\t\tqueue, \"queue\");\n cmdline_parse_token_num_t cmd_syn_filter_queue_id =\n-\tTOKEN_NUM_INITIALIZER(struct cmd_set_syn_filter_result,\n+\tTOKEN_NUM_INITIALIZER(struct cmd_syn_filter_result,\n \t\t\t\tqueue_id, UINT16);\n-cmdline_parse_token_string_t cmd_syn_filter_add_filter =\n-\tTOKEN_STRING_INITIALIZER(struct cmd_set_syn_filter_result,\n-\t\t\t\tfilter, \"add_syn_filter\");\n-cmdline_parse_token_string_t cmd_syn_filter_remove_filter =\n-\tTOKEN_STRING_INITIALIZER(struct cmd_set_syn_filter_result,\n-\t\t\t\tfilter, \"remove_syn_filter\");\n+static void\n+cmd_syn_filter_parsed(void *parsed_result, struct cmdline *cl,\n+\t\t\t\tvoid *data);\n+\n cmdline_parse_inst_t cmd_add_syn_filter = {\n-\t\t.f = cmd_set_syn_filter_parsed,\n-\t\t.data = NULL,\n-\t\t.help_str = \"add syn filter\",\n-\t\t.tokens = {\n-\t\t\t(void *)&cmd_syn_filter_add_filter,\n-\t\t\t(void *)&cmd_syn_filter_portid,\n-\t\t\t(void *)&cmd_syn_filter_priority,\n-\t\t\t(void *)&cmd_syn_filter_high,\n-\t\t\t(void *)&cmd_syn_filter_queue,\n-\t\t\t(void *)&cmd_syn_filter_queue_id,\n-\t\t\tNULL,\n-\t\t},\n+\t.f = cmd_syn_filter_parsed,\n+\t.data = (void *)&cmd_add_syn_filter,\n+\t.help_str = \"add syn filter\",\n+\t.tokens = {\n+\t\t(void *)&cmd_syn_filter_filter,\n+\t\t(void *)&cmd_syn_filter_add,\n+\t\t(void *)&cmd_syn_filter_port_id,\n+\t\t(void *)&cmd_syn_filter_priority,\n+\t\t(void *)&cmd_syn_filter_high,\n+\t\t(void *)&cmd_syn_filter_queue,\n+\t\t(void *)&cmd_syn_filter_queue_id,\n+\t\tNULL,\n+\t},\n };\n cmdline_parse_inst_t cmd_remove_syn_filter = {\n-\t\t.f = cmd_set_syn_filter_parsed,\n-\t\t.data = NULL,\n-\t\t.help_str = \"remove syn filter\",\n-\t\t.tokens = {\n-\t\t\t(void *)&cmd_syn_filter_remove_filter,\n-\t\t\t(void *)&cmd_syn_filter_portid,\n-\t\t\tNULL,\n-\t\t},\n+\t.f = cmd_syn_filter_parsed,\n+\t.data = (void *)&cmd_remove_syn_filter,\n+\t.help_str = \"remove syn filter\",\n+\t.tokens = {\n+\t\t(void *)&cmd_syn_filter_filter,\n+\t\t(void *)&cmd_syn_filter_del,\n+\t\t(void *)&cmd_syn_filter_port_id,\n+\t\tNULL,\n+\t},\n };\n \n-cmdline_parse_token_string_t cmd_syn_filter_get_filter =\n-\tTOKEN_STRING_INITIALIZER(struct cmd_set_syn_filter_result,\n-\t\t\t\tfilter, \"get_syn_filter\");\n-\n cmdline_parse_inst_t cmd_get_syn_filter = {\n-\t\t.f = cmd_set_syn_filter_parsed,\n-\t\t.data = NULL,\n-\t\t.help_str = \"get syn filter\",\n-\t\t.tokens = {\n-\t\t\t(void *)&cmd_syn_filter_get_filter,\n-\t\t\t(void *)&cmd_syn_filter_portid,\n-\t\t\tNULL,\n-\t\t},\n+\t.f = cmd_syn_filter_parsed,\n+\t.data = (void *)&cmd_get_syn_filter,\n+\t.help_str = \"get syn filter\",\n+\t.tokens = {\n+\t\t(void *)&cmd_syn_filter_filter,\n+\t\t(void *)&cmd_syn_filter_get,\n+\t\t(void *)&cmd_syn_filter_port_id,\n+\t\tNULL,\n+\t},\n };\n \n+static void\n+cmd_syn_filter_parsed(void *parsed_result,\n+\t\t\t__attribute__((unused)) struct cmdline *cl,\n+\t\t\t__attribute__((unused)) void *data)\n+{\n+\tstruct cmd_syn_filter_result *res = parsed_result;\n+\tstruct rte_eth_syn_filter syn_filter;\n+\tint ret = 0;\n+\n+\tret = rte_eth_dev_filter_supported(res->port_id,\n+\t\t\t\t\tRTE_ETH_FILTER_SYN);\n+\tif (ret < 0) {\n+\t\tprintf(\"syn filter is not supported on port %u.\\n\",\n+\t\t\t\tres->port_id);\n+\t\treturn;\n+\t}\n+\n+\tmemset(&syn_filter, 0, sizeof(syn_filter));\n+\n+\tif (!strcmp(res->ops, \"add\")) {\n+\t\tif (!strcmp(res->high, \"high\"))\n+\t\t\tsyn_filter.hig_pri = 1;\n+\t\telse\n+\t\t\tsyn_filter.hig_pri = 0;\n+\n+\t\tsyn_filter.queue = res->queue_id;\n+\t\tret = rte_eth_dev_filter_ctrl(res->port_id,\n+\t\t\t\t\t\tRTE_ETH_FILTER_SYN,\n+\t\t\t\t\t\tRTE_ETH_FILTER_ADD,\n+\t\t\t\t\t\t&syn_filter);\n+\t} else if (!strcmp(res->ops, \"del\"))\n+\t\tret = rte_eth_dev_filter_ctrl(res->port_id,\n+\t\t\t\t\t\tRTE_ETH_FILTER_SYN,\n+\t\t\t\t\t\tRTE_ETH_FILTER_DELETE,\n+\t\t\t\t\t\t&syn_filter);\n+\telse\n+\t\tget_syn_filter(res->port_id);\n+\n+\tif (ret < 0)\n+\t\tprintf(\"syn filter programming error: (%s)\\n\",\n+\t\t\t\tstrerror(-ret));\n+}\n+\n /* *** ADD/REMOVE A 2tuple FILTER *** */\n struct cmd_2tuple_filter_result {\n \tcmdline_fixed_string_t filter;\ndiff --git a/app/test-pmd/config.c b/app/test-pmd/config.c\nindex b102b72..10278b3 100644\n--- a/app/test-pmd/config.c\n+++ b/app/test-pmd/config.c\n@@ -2020,12 +2020,14 @@ get_ethertype_filter(uint8_t port_id, uint16_t index)\n void\n get_syn_filter(uint8_t port_id)\n {\n-\tstruct rte_syn_filter filter;\n+\tstruct rte_eth_syn_filter filter;\n \tint ret = 0;\n-\tuint16_t rx_queue;\n \n \tmemset(&filter, 0, sizeof(filter));\n-\tret = rte_eth_dev_get_syn_filter(port_id, &filter, &rx_queue);\n+\tret = rte_eth_dev_filter_ctrl(port_id,\n+\t\t\tRTE_ETH_FILTER_SYN,\n+\t\t\tRTE_ETH_FILTER_GET,\n+\t\t\t&filter);\n \n \tif (ret < 0) {\n \t\tif (ret == (-ENOENT))\n@@ -2036,7 +2038,7 @@ get_syn_filter(uint8_t port_id)\n \t}\n \tprintf(\"syn filter: priority: %s, queue: %d\\n\",\n \t\tfilter.hig_pri ? \"high\" : \"low\",\n-\t\trx_queue);\n+\t\tfilter.queue);\n }\n void\n get_2tuple_filter(uint8_t port_id, uint16_t index)\ndiff --git a/lib/librte_ether/rte_eth_ctrl.h b/lib/librte_ether/rte_eth_ctrl.h\nindex 8dd384d..14dc323 100644\n--- a/lib/librte_ether/rte_eth_ctrl.h\n+++ b/lib/librte_ether/rte_eth_ctrl.h\n@@ -53,6 +53,7 @@ enum rte_filter_type {\n \tRTE_ETH_FILTER_NONE = 0,\n \tRTE_ETH_FILTER_MACVLAN,\n \tRTE_ETH_FILTER_TUNNEL,\n+\tRTE_ETH_FILTER_SYN,\n \tRTE_ETH_FILTER_MAX\n };\n \n@@ -96,6 +97,17 @@ struct rte_eth_mac_filter {\n };\n \n /**\n+ * A structure used to define the sync filter entry\n+ * to support RTE_ETH_FILTER_SYN with RTE_ETH_FILTER_ADD,\n+ * RTE_ETH_FILTER_DELETE and RTE_ETH_FILTER_GET operations.\n+ */\n+struct rte_eth_syn_filter {\n+\tuint8_t hig_pri;\t/**< 1 means higher pri than 2tuple,5tuple,\n+\t\t\t\tand flex filter, 0 means lower pri.*/\n+\tuint16_t queue;\t\t/**< Queue assigned to when match*/\n+};\n+\n+/**\n * Tunneled type.\n */\n enum rte_eth_tunnel_type {\ndiff --git a/lib/librte_pmd_e1000/igb_ethdev.c b/lib/librte_pmd_e1000/igb_ethdev.c\nindex c13ea05..caf0cdc 100644\n--- a/lib/librte_pmd_e1000/igb_ethdev.c\n+++ b/lib/librte_pmd_e1000/igb_ethdev.c\n@@ -140,11 +140,18 @@ static int eth_igb_rss_reta_update(struct rte_eth_dev *dev,\n static int eth_igb_rss_reta_query(struct rte_eth_dev *dev,\n \t\tstruct rte_eth_rss_reta *reta_conf);\n \n-static int eth_igb_add_syn_filter(struct rte_eth_dev *dev,\n-\t\t\tstruct rte_syn_filter *filter, uint16_t rx_queue);\n-static int eth_igb_remove_syn_filter(struct rte_eth_dev *dev);\n-static int eth_igb_get_syn_filter(struct rte_eth_dev *dev,\n-\t\t\tstruct rte_syn_filter *filter, uint16_t *rx_queue);\n+static int eth_igb_syn_filter_set(struct rte_eth_dev *dev,\n+\t\t\tstruct rte_eth_syn_filter *filter,\n+\t\t\tbool add);\n+static int eth_igb_syn_filter_get(struct rte_eth_dev *dev,\n+\t\t\tstruct rte_eth_syn_filter *filter);\n+static int eth_igb_syn_filter_handle(struct rte_eth_dev *dev,\n+\t\t\tenum rte_filter_op filter_op,\n+\t\t\tvoid *arg);\n+static int eth_igb_dev_filter_ctrl(struct rte_eth_dev *dev,\n+\t\t\tenum rte_filter_type filter_type,\n+\t\t\tenum rte_filter_op filter_op,\n+\t\t\tvoid *arg);\n static int eth_igb_add_ethertype_filter(struct rte_eth_dev *dev,\n \t\t\tuint16_t index,\n \t\t\tstruct rte_ethertype_filter *filter, uint16_t rx_queue);\n@@ -252,9 +259,6 @@ static struct eth_dev_ops eth_igb_ops = {\n \t.reta_query = eth_igb_rss_reta_query,\n \t.rss_hash_update = eth_igb_rss_hash_update,\n \t.rss_hash_conf_get = eth_igb_rss_hash_conf_get,\n-\t.add_syn_filter = eth_igb_add_syn_filter,\n-\t.remove_syn_filter = eth_igb_remove_syn_filter,\n-\t.get_syn_filter = eth_igb_get_syn_filter,\n \t.add_ethertype_filter = eth_igb_add_ethertype_filter,\n \t.remove_ethertype_filter = eth_igb_remove_ethertype_filter,\n \t.get_ethertype_filter = eth_igb_get_ethertype_filter,\n@@ -267,6 +271,7 @@ static struct eth_dev_ops eth_igb_ops = {\n \t.add_5tuple_filter = eth_igb_add_5tuple_filter,\n \t.remove_5tuple_filter = eth_igb_remove_5tuple_filter,\n \t.get_5tuple_filter = eth_igb_get_5tuple_filter,\n+\t.filter_ctrl = eth_igb_dev_filter_ctrl,\n };\n \n /*\n@@ -2340,100 +2345,129 @@ eth_igb_rss_reta_query(struct rte_eth_dev *dev,\n \t\treturn -ENOSYS;\\\n } while (0)\n \n-/*\n- * add the syn filter\n- *\n- * @param\n- * dev: Pointer to struct rte_eth_dev.\n- * filter: ponter to the filter that will be added.\n- * rx_queue: the queue id the filter assigned to.\n- *\n- * @return\n- * - On success, zero.\n- * - On failure, a negative value.\n- */\n static int\n-eth_igb_add_syn_filter(struct rte_eth_dev *dev,\n-\t\t\tstruct rte_syn_filter *filter, uint16_t rx_queue)\n+eth_igb_syn_filter_set(struct rte_eth_dev *dev,\n+\t\t\tstruct rte_eth_syn_filter *filter,\n+\t\t\tbool add)\n {\n \tstruct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \tuint32_t synqf, rfctl;\n \n-\tMAC_TYPE_FILTER_SUP(hw->mac.type);\n-\n-\tif (rx_queue >= IGB_MAX_RX_QUEUE_NUM)\n+\tif (filter->queue >= IGB_MAX_RX_QUEUE_NUM)\n \t\treturn -EINVAL;\n \n \tsynqf = E1000_READ_REG(hw, E1000_SYNQF(0));\n-\tif (synqf & E1000_SYN_FILTER_ENABLE)\n-\t\treturn -EINVAL;\n \n-\tsynqf = (uint32_t)(((rx_queue << E1000_SYN_FILTER_QUEUE_SHIFT) &\n-\t\tE1000_SYN_FILTER_QUEUE) | E1000_SYN_FILTER_ENABLE);\n-\n-\trfctl = E1000_READ_REG(hw, E1000_RFCTL);\n-\tif (filter->hig_pri)\n-\t\trfctl |= E1000_RFCTL_SYNQFP;\n-\telse\n-\t\trfctl &= ~E1000_RFCTL_SYNQFP;\n+\tif (add) {\n+\t\tif (synqf & E1000_SYN_FILTER_ENABLE)\n+\t\t\treturn -EINVAL;\n \n-\tE1000_WRITE_REG(hw, E1000_SYNQF(0), synqf);\n-\tE1000_WRITE_REG(hw, E1000_RFCTL, rfctl);\n-\treturn 0;\n-}\n+\t\tsynqf = (uint32_t)(((filter->queue <<\n+\t\t\tE1000_SYN_FILTER_QUEUE_SHIFT) & E1000_SYN_FILTER_QUEUE)\n+\t\t\t| E1000_SYN_FILTER_ENABLE);\n \n-/*\n- * remove the syn filter\n- *\n- * @param\n- * dev: Pointer to struct rte_eth_dev.\n- *\n- * @return\n- * - On success, zero.\n- * - On failure, a negative value.\n- */\n-static int\n-eth_igb_remove_syn_filter(struct rte_eth_dev *dev)\n-{\n-\tstruct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\t\trfctl = E1000_READ_REG(hw, E1000_RFCTL);\n+\t\tif (filter->hig_pri)\n+\t\t\trfctl |= E1000_RFCTL_SYNQFP;\n+\t\telse\n+\t\t\trfctl &= ~E1000_RFCTL_SYNQFP;\n \n-\tMAC_TYPE_FILTER_SUP(hw->mac.type);\n+\t\tE1000_WRITE_REG(hw, E1000_RFCTL, rfctl);\n+\t} else\n+\t\tsynqf = 0;\n \n-\tE1000_WRITE_REG(hw, E1000_SYNQF(0), 0);\n+\tE1000_WRITE_REG(hw, E1000_SYNQF(0), synqf);\n+\tE1000_WRITE_FLUSH(hw);\n \treturn 0;\n }\n \n-/*\n- * get the syn filter's info\n- *\n- * @param\n- * dev: Pointer to struct rte_eth_dev.\n- * filter: ponter to the filter that returns.\n- * *rx_queue: pointer to the queue id the filter assigned to.\n- *\n- * @return\n- * - On success, zero.\n- * - On failure, a negative value.\n- */\n static int\n-eth_igb_get_syn_filter(struct rte_eth_dev *dev,\n-\t\t\tstruct rte_syn_filter *filter, uint16_t *rx_queue)\n+eth_igb_syn_filter_get(struct rte_eth_dev *dev,\n+\t\t\tstruct rte_eth_syn_filter *filter)\n {\n \tstruct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \tuint32_t synqf, rfctl;\n \n-\tMAC_TYPE_FILTER_SUP(hw->mac.type);\n \tsynqf = E1000_READ_REG(hw, E1000_SYNQF(0));\n \tif (synqf & E1000_SYN_FILTER_ENABLE) {\n \t\trfctl = E1000_READ_REG(hw, E1000_RFCTL);\n \t\tfilter->hig_pri = (rfctl & E1000_RFCTL_SYNQFP) ? 1 : 0;\n-\t\t*rx_queue = (uint8_t)((synqf & E1000_SYN_FILTER_QUEUE) >>\n+\t\tfilter->queue = (uint8_t)((synqf & E1000_SYN_FILTER_QUEUE) >>\n \t\t\t\tE1000_SYN_FILTER_QUEUE_SHIFT);\n \t\treturn 0;\n \t}\n+\n \treturn -ENOENT;\n }\n \n+static int\n+eth_igb_syn_filter_handle(struct rte_eth_dev *dev,\n+\t\t\tenum rte_filter_op filter_op,\n+\t\t\tvoid *arg)\n+{\n+\tstruct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tint ret = 0;\n+\n+\tMAC_TYPE_FILTER_SUP(hw->mac.type);\n+\n+\tif (filter_op == RTE_ETH_FILTER_NOP)\n+\t\treturn ret;\n+\n+\tif (arg == NULL) {\n+\t\tPMD_DRV_LOG(ERR, \"arg shouldn't be NULL for operation %u\",\n+\t\t\t filter_op);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tswitch (filter_op) {\n+\tcase RTE_ETH_FILTER_ADD:\n+\t\tret = eth_igb_syn_filter_set(dev,\n+\t\t\t\t(struct rte_eth_syn_filter *)arg,\n+\t\t\t\tTRUE);\n+\t\tbreak;\n+\tcase RTE_ETH_FILTER_DELETE:\n+\t\tret = eth_igb_syn_filter_set(dev,\n+\t\t\t\t(struct rte_eth_syn_filter *)arg,\n+\t\t\t\tFALSE);\n+\t\tbreak;\n+\tcase RTE_ETH_FILTER_GET:\n+\t\tret = eth_igb_syn_filter_get(dev,\n+\t\t\t\t(struct rte_eth_syn_filter *)arg);\n+\t\tbreak;\n+\tdefault:\n+\t\tPMD_DRV_LOG(ERR, \"unsupported operation %u\\n\", filter_op);\n+\t\tret = -ENOSYS;\n+\t\tbreak;\n+\t}\n+\n+\treturn ret;\n+}\n+\n+static int\n+eth_igb_dev_filter_ctrl(struct rte_eth_dev *dev,\n+\t\t\tenum rte_filter_type filter_type,\n+\t\t\tenum rte_filter_op filter_op,\n+\t\t\tvoid *arg)\n+{\n+\tint ret = 0;\n+\n+\tif (dev == NULL)\n+\t\treturn -EINVAL;\n+\n+\tswitch (filter_type) {\n+\tcase RTE_ETH_FILTER_SYN:\n+\t\tret = eth_igb_syn_filter_handle(dev, filter_op, arg);\n+\t\tbreak;\n+\tdefault:\n+\t\tPMD_DRV_LOG(WARNING, \"Filter type (%d) not supported\",\n+\t\t\t\t\t\t\tfilter_type);\n+\t\tret = -EINVAL;\n+\t\tbreak;\n+\t}\n+\n+\treturn ret;\n+}\n+\n /*\n * add an ethertype filter\n *\ndiff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c\nindex 2eb609c..0fb80f9 100644\n--- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c\n+++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c\n@@ -216,11 +216,18 @@ static void ixgbevf_add_mac_addr(struct rte_eth_dev *dev,\n \t\t\t\t struct ether_addr *mac_addr,\n \t\t\t\t uint32_t index, uint32_t pool);\n static void ixgbevf_remove_mac_addr(struct rte_eth_dev *dev, uint32_t index);\n-static int ixgbe_add_syn_filter(struct rte_eth_dev *dev,\n-\t\t\tstruct rte_syn_filter *filter, uint16_t rx_queue);\n-static int ixgbe_remove_syn_filter(struct rte_eth_dev *dev);\n-static int ixgbe_get_syn_filter(struct rte_eth_dev *dev,\n-\t\t\tstruct rte_syn_filter *filter, uint16_t *rx_queue);\n+static int ixgbe_syn_filter_set(struct rte_eth_dev *dev,\n+\t\t\tstruct rte_eth_syn_filter *filter,\n+\t\t\tbool add);\n+static int ixgbe_syn_filter_get(struct rte_eth_dev *dev,\n+\t\t\tstruct rte_eth_syn_filter *filter);\n+static int ixgbe_syn_filter_handle(struct rte_eth_dev *dev,\n+\t\t\tenum rte_filter_op filter_op,\n+\t\t\tvoid *arg);\n+static int ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev,\n+\t\t\tenum rte_filter_type filter_type,\n+\t\t\tenum rte_filter_op filter_op,\n+\t\t\tvoid *arg);\n static int ixgbe_add_ethertype_filter(struct rte_eth_dev *dev, uint16_t index,\n \t\t\tstruct rte_ethertype_filter *filter, uint16_t rx_queue);\n static int ixgbe_remove_ethertype_filter(struct rte_eth_dev *dev,\n@@ -367,15 +374,13 @@ static struct eth_dev_ops ixgbe_eth_dev_ops = {\n #endif /* RTE_NIC_BYPASS */\n \t.rss_hash_update = ixgbe_dev_rss_hash_update,\n \t.rss_hash_conf_get = ixgbe_dev_rss_hash_conf_get,\n-\t.add_syn_filter\t = ixgbe_add_syn_filter,\n-\t.remove_syn_filter = ixgbe_remove_syn_filter,\n-\t.get_syn_filter = ixgbe_get_syn_filter,\n \t.add_ethertype_filter = ixgbe_add_ethertype_filter,\n \t.remove_ethertype_filter = ixgbe_remove_ethertype_filter,\n \t.get_ethertype_filter = ixgbe_get_ethertype_filter,\n \t.add_5tuple_filter = ixgbe_add_5tuple_filter,\n \t.remove_5tuple_filter = ixgbe_remove_5tuple_filter,\n \t.get_5tuple_filter = ixgbe_get_5tuple_filter,\n+\t.filter_ctrl = ixgbe_dev_filter_ctrl,\n };\n \n /*\n@@ -3581,105 +3586,126 @@ ixgbevf_remove_mac_addr(struct rte_eth_dev *dev, uint32_t index)\n \t}\n }\n \n-/*\n- * add syn filter\n- *\n- * @param\n- * dev: Pointer to struct rte_eth_dev.\n- * filter: ponter to the filter that will be added.\n- * rx_queue: the queue id the filter assigned to.\n- *\n- * @return\n- * - On success, zero.\n- * - On failure, a negative value.\n- */\n+#define MAC_TYPE_FILTER_SUP(type) do {\\\n+\tif ((type) != ixgbe_mac_82599EB && (type) != ixgbe_mac_X540 &&\\\n+\t\t(type) != ixgbe_mac_X550)\\\n+\t\treturn -ENOSYS;\\\n+} while (0)\n+\n static int\n-ixgbe_add_syn_filter(struct rte_eth_dev *dev,\n-\t\t\tstruct rte_syn_filter *filter, uint16_t rx_queue)\n+ixgbe_syn_filter_set(struct rte_eth_dev *dev,\n+\t\t\tstruct rte_eth_syn_filter *filter,\n+\t\t\tbool add)\n {\n \tstruct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \tuint32_t synqf;\n \n-\tif (hw->mac.type != ixgbe_mac_82599EB)\n-\t\treturn -ENOSYS;\n-\n-\tif (rx_queue >= IXGBE_MAX_RX_QUEUE_NUM)\n+\tif (filter->queue >= IXGBE_MAX_RX_QUEUE_NUM)\n \t\treturn -EINVAL;\n \n \tsynqf = IXGBE_READ_REG(hw, IXGBE_SYNQF);\n \n-\tif (synqf & IXGBE_SYN_FILTER_ENABLE)\n-\t\treturn -EINVAL;\n-\n-\tsynqf = (uint32_t)(((rx_queue << IXGBE_SYN_FILTER_QUEUE_SHIFT) &\n-\t\tIXGBE_SYN_FILTER_QUEUE) | IXGBE_SYN_FILTER_ENABLE);\n+\tif (add) {\n+\t\tif (synqf & IXGBE_SYN_FILTER_ENABLE)\n+\t\t\treturn -EINVAL;\n+\t\tsynqf = (uint32_t)(((filter->queue <<\n+\t\t\tIXGBE_SYN_FILTER_QUEUE_SHIFT) & IXGBE_SYN_FILTER_QUEUE)\n+\t\t\t| IXGBE_SYN_FILTER_ENABLE);\n \n-\tif (filter->hig_pri)\n-\t\tsynqf |= IXGBE_SYN_FILTER_SYNQFP;\n-\telse\n-\t\tsynqf &= ~IXGBE_SYN_FILTER_SYNQFP;\n+\t\tif (filter->hig_pri)\n+\t\t\tsynqf |= IXGBE_SYN_FILTER_SYNQFP;\n+\t\telse\n+\t\t\tsynqf &= ~IXGBE_SYN_FILTER_SYNQFP;\n+\t} else\n+\t\tsynqf &= ~(IXGBE_SYN_FILTER_QUEUE | IXGBE_SYN_FILTER_ENABLE);\n \n \tIXGBE_WRITE_REG(hw, IXGBE_SYNQF, synqf);\n+\tIXGBE_WRITE_FLUSH(hw);\n \treturn 0;\n }\n \n-/*\n- * remove syn filter\n- *\n- * @param\n- * dev: Pointer to struct rte_eth_dev.\n- *\n- * @return\n- * - On success, zero.\n- * - On failure, a negative value.\n- */\n static int\n-ixgbe_remove_syn_filter(struct rte_eth_dev *dev)\n+ixgbe_syn_filter_get(struct rte_eth_dev *dev,\n+\t\t\tstruct rte_eth_syn_filter *filter)\n {\n \tstruct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n-\tuint32_t synqf;\n+\tuint32_t synqf = IXGBE_READ_REG(hw, IXGBE_SYNQF);\n \n-\tif (hw->mac.type != ixgbe_mac_82599EB)\n-\t\treturn -ENOSYS;\n+\tif (synqf & IXGBE_SYN_FILTER_ENABLE) {\n+\t\tfilter->hig_pri = (synqf & IXGBE_SYN_FILTER_SYNQFP) ? 1 : 0;\n+\t\tfilter->queue = (uint16_t)((synqf & IXGBE_SYN_FILTER_QUEUE)\n+\t\t\t\t\t\t>> 1);\n+\t\treturn 0;\n+\t}\n+\treturn -ENOENT;\n+}\n \n-\tsynqf = IXGBE_READ_REG(hw, IXGBE_SYNQF);\n+static int\n+ixgbe_syn_filter_handle(struct rte_eth_dev *dev,\n+\t\t\tenum rte_filter_op filter_op,\n+\t\t\tvoid *arg)\n+{\n+\tstruct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n+\tint ret = 0;\n \n-\tsynqf &= ~(IXGBE_SYN_FILTER_QUEUE | IXGBE_SYN_FILTER_ENABLE);\n+\tMAC_TYPE_FILTER_SUP(hw->mac.type);\n \n-\tIXGBE_WRITE_REG(hw, IXGBE_SYNQF, synqf);\n-\treturn 0;\n+\tif (filter_op == RTE_ETH_FILTER_NOP)\n+\t\treturn ret;\n+\n+\tif (arg == NULL) {\n+\t\tPMD_DRV_LOG(ERR, \"arg shouldn't be NULL for operation %u\",\n+\t\t\t filter_op);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tswitch (filter_op) {\n+\tcase RTE_ETH_FILTER_ADD:\n+\t\tret = ixgbe_syn_filter_set(dev,\n+\t\t\t\t(struct rte_eth_syn_filter *)arg,\n+\t\t\t\tTRUE);\n+\t\tbreak;\n+\tcase RTE_ETH_FILTER_DELETE:\n+\t\tret = ixgbe_syn_filter_set(dev,\n+\t\t\t\t(struct rte_eth_syn_filter *)arg,\n+\t\t\t\tFALSE);\n+\t\tbreak;\n+\tcase RTE_ETH_FILTER_GET:\n+\t\tret = ixgbe_syn_filter_get(dev,\n+\t\t\t\t(struct rte_eth_syn_filter *)arg);\n+\t\tbreak;\n+\tdefault:\n+\t\tPMD_DRV_LOG(ERR, \"unsupported operation %u\\n\", filter_op);\n+\t\tret = -ENOSYS;\n+\t\tbreak;\n+\t}\n+\n+\treturn ret;\n }\n \n-/*\n- * get the syn filter's info\n- *\n- * @param\n- * dev: Pointer to struct rte_eth_dev.\n- * filter: ponter to the filter that returns.\n- * *rx_queue: pointer to the queue id the filter assigned to.\n- *\n- * @return\n- * - On success, zero.\n- * - On failure, a negative value.\n- */\n static int\n-ixgbe_get_syn_filter(struct rte_eth_dev *dev,\n-\t\t\tstruct rte_syn_filter *filter, uint16_t *rx_queue)\n-\n+ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev,\n+\t\t\tenum rte_filter_type filter_type,\n+\t\t\tenum rte_filter_op filter_op,\n+\t\t\tvoid *arg)\n {\n-\tstruct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n-\tuint32_t synqf;\n+\tint ret = 0;\n \n-\tif (hw->mac.type != ixgbe_mac_82599EB)\n-\t\treturn -ENOSYS;\n+\tif (dev == NULL)\n+\t\treturn -EINVAL;\n \n-\tsynqf = IXGBE_READ_REG(hw, IXGBE_SYNQF);\n-\tif (synqf & IXGBE_SYN_FILTER_ENABLE) {\n-\t\tfilter->hig_pri = (synqf & IXGBE_SYN_FILTER_SYNQFP) ? 1 : 0;\n-\t\t*rx_queue = (uint16_t)((synqf & IXGBE_SYN_FILTER_QUEUE) >> 1);\n-\t\treturn 0;\n+\tswitch (filter_type) {\n+\tcase RTE_ETH_FILTER_SYN:\n+\t\tret = ixgbe_syn_filter_handle(dev, filter_op, arg);\n+\t\tbreak;\n+\tdefault:\n+\t\tPMD_DRV_LOG(WARNING, \"Filter type (%d) not supported\",\n+\t\t\t\t\t\t\tfilter_type);\n+\t\tret = -EINVAL;\n+\t\tbreak;\n \t}\n-\treturn -ENOENT;\n+\n+\treturn ret;\n }\n \n /*\n", "prefixes": [ "dpdk-dev" ] }{ "id": 2222, "url": "