Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/880746/?format=api
{ "id": 880746, "url": "http://patchwork.ozlabs.org/api/patches/880746/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20180302184344.5744-9-vinicius.gomes@intel.com/", "project": { "id": 46, "url": "http://patchwork.ozlabs.org/api/projects/46/?format=api", "name": "Intel Wired Ethernet development", "link_name": "intel-wired-lan", "list_id": "intel-wired-lan.osuosl.org", "list_email": "intel-wired-lan@osuosl.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20180302184344.5744-9-vinicius.gomes@intel.com>", "list_archive_url": null, "date": "2018-03-02T18:43:44", "name": "[next-queue,v2,8/8] igb: Add support for adding offloaded clsflower filters", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "ebcf8a21d465e9956ba42918e1834a20bde54a5a", "submitter": { "id": 72272, "url": "http://patchwork.ozlabs.org/api/people/72272/?format=api", "name": "Vinicius Costa Gomes", "email": "vinicius.gomes@intel.com" }, "delegate": { "id": 68, "url": "http://patchwork.ozlabs.org/api/users/68/?format=api", "username": "jtkirshe", "first_name": "Jeff", "last_name": "Kirsher", "email": "jeffrey.t.kirsher@intel.com" }, "mbox": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20180302184344.5744-9-vinicius.gomes@intel.com/mbox/", "series": [ { "id": 31605, "url": "http://patchwork.ozlabs.org/api/series/31605/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/list/?series=31605", "date": "2018-03-02T18:43:37", "name": "igb: offloading of receive filters", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/31605/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/880746/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/880746/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<intel-wired-lan-bounces@osuosl.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "intel-wired-lan@lists.osuosl.org" ], "Delivered-To": [ "patchwork-incoming@bilbo.ozlabs.org", "intel-wired-lan@lists.osuosl.org" ], "Authentication-Results": [ "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=osuosl.org\n\t(client-ip=140.211.166.136; helo=silver.osuosl.org;\n\tenvelope-from=intel-wired-lan-bounces@osuosl.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org;\n\tdmarc=none (p=none dis=none) header.from=intel.com" ], "Received": [ "from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3ztJBL4Gncz9s8f\n\tfor <incoming@patchwork.ozlabs.org>;\n\tSat, 3 Mar 2018 05:44:42 +1100 (AEDT)", "from localhost (localhost [127.0.0.1])\n\tby silver.osuosl.org (Postfix) with ESMTP id E2F452E70B;\n\tFri, 2 Mar 2018 18:44:40 +0000 (UTC)", "from silver.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id TXiY2QZ94LO2; Fri, 2 Mar 2018 18:44:33 +0000 (UTC)", "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby silver.osuosl.org (Postfix) with ESMTP id 054632E795;\n\tFri, 2 Mar 2018 18:44:29 +0000 (UTC)", "from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n\tby ash.osuosl.org (Postfix) with ESMTP id 795591C062C\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 2 Mar 2018 18:44:26 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id 75B848907A\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 2 Mar 2018 18:44:26 +0000 (UTC)", "from whitealder.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id boNTPSS7iBJ0 for <intel-wired-lan@lists.osuosl.org>;\n\tFri, 2 Mar 2018 18:44:24 +0000 (UTC)", "from mga01.intel.com (mga01.intel.com [192.55.52.88])\n\tby whitealder.osuosl.org (Postfix) with ESMTPS id 9B0E689079\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tFri, 2 Mar 2018 18:44:24 +0000 (UTC)", "from fmsmga001.fm.intel.com ([10.253.24.23])\n\tby fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t02 Mar 2018 10:44:24 -0800", "from ellie.jf.intel.com (HELO localhost.localdomain)\n\t([10.24.13.29])\n\tby fmsmga001.fm.intel.com with ESMTP; 02 Mar 2018 10:44:24 -0800" ], "X-Virus-Scanned": [ "amavisd-new at osuosl.org", "amavisd-new at osuosl.org" ], "X-Greylist": "domain auto-whitelisted by SQLgrey-1.7.6", "X-Amp-Result": "SKIPPED(no attachment in message)", "X-Amp-File-Uploaded": "False", "X-ExtLoop1": "1", "X-IronPort-AV": "E=Sophos;i=\"5.47,413,1515484800\"; d=\"scan'208\";a=\"35044410\"", "From": "Vinicius Costa Gomes <vinicius.gomes@intel.com>", "To": "intel-wired-lan@lists.osuosl.org", "Date": "Fri, 2 Mar 2018 10:43:44 -0800", "Message-Id": "<20180302184344.5744-9-vinicius.gomes@intel.com>", "X-Mailer": "git-send-email 2.16.2", "In-Reply-To": "<20180302184344.5744-1-vinicius.gomes@intel.com>", "References": "<20180302184344.5744-1-vinicius.gomes@intel.com>", "Subject": "[Intel-wired-lan] [next-queue PATCH v2 8/8] igb: Add support for\n\tadding offloaded clsflower filters", "X-BeenThere": "intel-wired-lan@osuosl.org", "X-Mailman-Version": "2.1.24", "Precedence": "list", "List-Id": "Intel Wired Ethernet Linux Kernel Driver Development\n\t<intel-wired-lan.osuosl.org>", "List-Unsubscribe": "<https://lists.osuosl.org/mailman/options/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@osuosl.org?subject=unsubscribe>", "List-Archive": "<http://lists.osuosl.org/pipermail/intel-wired-lan/>", "List-Post": "<mailto:intel-wired-lan@osuosl.org>", "List-Help": "<mailto:intel-wired-lan-request@osuosl.org?subject=help>", "List-Subscribe": "<https://lists.osuosl.org/mailman/listinfo/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@osuosl.org?subject=subscribe>", "Cc": "netdev@vger.kernel.org, jesus.sanchez-palencia@intel.com", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Errors-To": "intel-wired-lan-bounces@osuosl.org", "Sender": "\"Intel-wired-lan\" <intel-wired-lan-bounces@osuosl.org>" }, "content": "This allows filters added by tc-flower and specifying MAC addresses,\nEthernet types, and the VLAN priority field, to be offloaded to the\ncontroller.\n\nThis reuses most of the infrastructure used by ethtool, ethtool can be\nused to read these filters, but modification and deletion can only be\ndone via tc-flower.\n\nSigned-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>\n---\n drivers/net/ethernet/intel/igb/igb.h | 2 +\n drivers/net/ethernet/intel/igb/igb_main.c | 176 +++++++++++++++++++++++++++++-\n 2 files changed, 176 insertions(+), 2 deletions(-)", "diff": "diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h\nindex 43ce6d64f693..0edd3a74d043 100644\n--- a/drivers/net/ethernet/intel/igb/igb.h\n+++ b/drivers/net/ethernet/intel/igb/igb.h\n@@ -463,6 +463,7 @@ struct igb_nfc_input {\n struct igb_nfc_filter {\n \tstruct hlist_node nfc_node;\n \tstruct igb_nfc_input filter;\n+\tunsigned long cookie;\n \tu16 etype_reg_index;\n \tu16 sw_idx;\n \tu16 action;\n@@ -601,6 +602,7 @@ struct igb_adapter {\n \n \t/* RX network flow classification support */\n \tstruct hlist_head nfc_filter_list;\n+\tstruct hlist_head cls_flower_list;\n \tunsigned int nfc_filter_count;\n \t/* lock for RX network flow classification filter */\n \tspinlock_t nfc_lock;\ndiff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c\nindex b5a6bd37bb16..cbd2048b9110 100644\n--- a/drivers/net/ethernet/intel/igb/igb_main.c\n+++ b/drivers/net/ethernet/intel/igb/igb_main.c\n@@ -2397,6 +2397,12 @@ static int igb_set_features(struct net_device *netdev,\n \t\t\thlist_del(&rule->nfc_node);\n \t\t\tkfree(rule);\n \t\t}\n+\t\thlist_for_each_entry_safe(rule, node2,\n+\t\t\t\t\t &adapter->cls_flower_list, nfc_node) {\n+\t\t\tigb_erase_filter(adapter, rule);\n+\t\t\thlist_del(&rule->nfc_node);\n+\t\t\tkfree(rule);\n+\t\t}\n \t\tspin_unlock(&adapter->nfc_lock);\n \t\tadapter->nfc_filter_count = 0;\n \t}\n@@ -2497,16 +2503,179 @@ static int igb_offload_cbs(struct igb_adapter *adapter,\n \treturn 0;\n }\n \n+#define ETHER_TYPE_FULL_MASK ((__force __be16)~0)\n+\n+static int igb_parse_cls_flower(struct igb_adapter *adapter,\n+\t\t\t\tstruct tc_cls_flower_offload *f,\n+\t\t\t\tint traffic_class,\n+\t\t\t\tstruct igb_nfc_filter *input)\n+{\n+\tif (f->dissector->used_keys &\n+\t ~(BIT(FLOW_DISSECTOR_KEY_BASIC) |\n+\t BIT(FLOW_DISSECTOR_KEY_CONTROL) |\n+\t BIT(FLOW_DISSECTOR_KEY_ETH_ADDRS) |\n+\t BIT(FLOW_DISSECTOR_KEY_VLAN))) {\n+\t\tdev_err(&adapter->pdev->dev, \"Unsupported key used: 0x%x\\n\",\n+\t\t\tf->dissector->used_keys);\n+\t\treturn -EOPNOTSUPP;\n+\t}\n+\n+\tif (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_ETH_ADDRS)) {\n+\t\tstruct flow_dissector_key_eth_addrs *key =\n+\t\t\tskb_flow_dissector_target(f->dissector,\n+\t\t\t\t\t\t FLOW_DISSECTOR_KEY_ETH_ADDRS,\n+\t\t\t\t\t\t f->key);\n+\n+\t\tstruct flow_dissector_key_eth_addrs *mask =\n+\t\t\tskb_flow_dissector_target(f->dissector,\n+\t\t\t\t\t\t FLOW_DISSECTOR_KEY_ETH_ADDRS,\n+\t\t\t\t\t\t f->mask);\n+\n+\t\tif (is_broadcast_ether_addr(mask->dst)) {\n+\t\t\tinput->filter.match_flags |=\n+\t\t\t\tIGB_FILTER_FLAG_DST_MAC_ADDR;\n+\t\t\tether_addr_copy(input->filter.dst_addr, key->dst);\n+\t\t}\n+\n+\t\tif (is_broadcast_ether_addr(mask->src)) {\n+\t\t\tinput->filter.match_flags |=\n+\t\t\t\tIGB_FILTER_FLAG_SRC_MAC_ADDR;\n+\t\t\tether_addr_copy(input->filter.src_addr, key->src);\n+\t\t}\n+\t}\n+\n+\tif (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_BASIC)) {\n+\t\tstruct flow_dissector_key_basic *key =\n+\t\t\tskb_flow_dissector_target(f->dissector,\n+\t\t\t\t\t\t FLOW_DISSECTOR_KEY_BASIC,\n+\t\t\t\t\t\t f->key);\n+\n+\t\tstruct flow_dissector_key_basic *mask =\n+\t\t\tskb_flow_dissector_target(f->dissector,\n+\t\t\t\t\t\t FLOW_DISSECTOR_KEY_BASIC,\n+\t\t\t\t\t\t f->mask);\n+\n+\t\tif (mask->n_proto == ETHER_TYPE_FULL_MASK) {\n+\t\t\tinput->filter.match_flags |=\n+\t\t\t\tIGB_FILTER_FLAG_ETHER_TYPE;\n+\t\t\tinput->filter.etype = key->n_proto;\n+\t\t}\n+\t}\n+\n+\tif (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_VLAN)) {\n+\t\tstruct flow_dissector_key_vlan *key =\n+\t\t\tskb_flow_dissector_target(f->dissector,\n+\t\t\t\t\t\t FLOW_DISSECTOR_KEY_VLAN,\n+\t\t\t\t\t\t f->key);\n+\t\tstruct flow_dissector_key_vlan *mask =\n+\t\t\tskb_flow_dissector_target(f->dissector,\n+\t\t\t\t\t\t FLOW_DISSECTOR_KEY_VLAN,\n+\t\t\t\t\t\t f->mask);\n+\n+\t\tif (mask->vlan_priority) {\n+\t\t\tinput->filter.match_flags |= IGB_FILTER_FLAG_VLAN_TCI;\n+\t\t\tinput->filter.vlan_tci = key->vlan_priority;\n+\t\t}\n+\t}\n+\n+\tinput->action = traffic_class;\n+\tinput->cookie = f->cookie;\n+\n+\treturn 0;\n+}\n+\n static int igb_configure_clsflower(struct igb_adapter *adapter,\n \t\t\t\t struct tc_cls_flower_offload *cls_flower)\n {\n-\treturn -EOPNOTSUPP;\n+\tstruct igb_nfc_filter *filter, *f;\n+\tint err, tc;\n+\n+\tif (!(adapter->netdev->hw_features & NETIF_F_NTUPLE))\n+\t\treturn -EOPNOTSUPP;\n+\n+\ttc = tc_classid_to_hwtc(adapter->netdev, cls_flower->classid);\n+\tif (tc < 0) {\n+\t\tdev_err(&adapter->pdev->dev, \"Invalid traffic class\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tfilter = kzalloc(sizeof(*filter), GFP_KERNEL);\n+\tif (!filter)\n+\t\treturn -ENOMEM;\n+\n+\terr = igb_parse_cls_flower(adapter, cls_flower, tc, filter);\n+\tif (err < 0) {\n+\t\tdev_err(&adapter->pdev->dev, \"Invalid cls_flower filter\\n\");\n+\t\tgoto err_parse;\n+\t}\n+\n+\tspin_lock(&adapter->nfc_lock);\n+\n+\thlist_for_each_entry(f, &adapter->nfc_filter_list, nfc_node) {\n+\t\tif (!memcmp(&f->filter, &filter->filter, sizeof(f->filter))) {\n+\t\t\terr = -EEXIST;\n+\t\t\tdev_err(&adapter->pdev->dev,\n+\t\t\t\t\"This filter is already set in ethtool\\n\");\n+\t\t\tgoto err_locked;\n+\t\t}\n+\t}\n+\n+\thlist_for_each_entry(f, &adapter->cls_flower_list, nfc_node) {\n+\t\tif (!memcmp(&f->filter, &filter->filter, sizeof(f->filter))) {\n+\t\t\terr = -EEXIST;\n+\t\t\tdev_err(&adapter->pdev->dev,\n+\t\t\t\t\"This filter is already set in cls_flower\\n\");\n+\t\t\tgoto err_locked;\n+\t\t}\n+\t}\n+\n+\terr = igb_add_filter(adapter, filter);\n+\tif (err < 0)\n+\t\tgoto err_locked;\n+\n+\thlist_add_head(&filter->nfc_node, &adapter->cls_flower_list);\n+\n+\tspin_unlock(&adapter->nfc_lock);\n+\n+\treturn 0;\n+\n+err_locked:\n+\tspin_unlock(&adapter->nfc_lock);\n+\n+err_parse:\n+\tkfree(filter);\n+\n+\treturn err;\n }\n \n static int igb_delete_clsflower(struct igb_adapter *adapter,\n \t\t\t\tstruct tc_cls_flower_offload *cls_flower)\n {\n-\treturn -EOPNOTSUPP;\n+\tstruct igb_nfc_filter *filter;\n+\tint err;\n+\n+\tspin_lock(&adapter->nfc_lock);\n+\n+\thlist_for_each_entry(filter, &adapter->cls_flower_list, nfc_node)\n+\t\tif (filter->cookie == cls_flower->cookie)\n+\t\t\tbreak;\n+\n+\tif (!filter) {\n+\t\terr = -ENOENT;\n+\t\tgoto out;\n+\t}\n+\n+\terr = igb_erase_filter(adapter, filter);\n+\tif (err < 0)\n+\t\tgoto out;\n+\n+\thlist_del(&filter->nfc_node);\n+\tkfree(filter);\n+\n+out:\n+\tspin_unlock(&adapter->nfc_lock);\n+\n+\treturn err;\n }\n \n static int igb_setup_tc_cls_flower(struct igb_adapter *adapter,\n@@ -9271,6 +9440,9 @@ static void igb_nfc_filter_exit(struct igb_adapter *adapter)\n \thlist_for_each_entry(rule, &adapter->nfc_filter_list, nfc_node)\n \t\tigb_erase_filter(adapter, rule);\n \n+\thlist_for_each_entry(rule, &adapter->cls_flower_list, nfc_node)\n+\t\tigb_erase_filter(adapter, rule);\n+\n \tspin_unlock(&adapter->nfc_lock);\n }\n \n", "prefixes": [ "next-queue", "v2", "8/8" ] }