Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/43911/?format=api
http://patches.dpdk.org/api/patches/43911/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/0122a9eac9e37bcf293ae71506e4b0eb11fa4030.1535292771.git.rahul.lakkireddy@chelsio.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": "<0122a9eac9e37bcf293ae71506e4b0eb11fa4030.1535292771.git.rahul.lakkireddy@chelsio.com>", "list_archive_url": "https://inbox.dpdk.org/dev/0122a9eac9e37bcf293ae71506e4b0eb11fa4030.1535292771.git.rahul.lakkireddy@chelsio.com", "date": "2018-08-27T12:52:32", "name": "[4/4] net/cxgbe: add flow operations to match based on destination MAC address", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": true, "hash": "3f10ce3b387b054d7872aeb544886b07525134ad", "submitter": { "id": 241, "url": "http://patches.dpdk.org/api/people/241/?format=api", "name": "Rahul Lakkireddy", "email": "rahul.lakkireddy@chelsio.com" }, "delegate": { "id": 319, "url": "http://patches.dpdk.org/api/users/319/?format=api", "username": "fyigit", "first_name": "Ferruh", "last_name": "Yigit", "email": "ferruh.yigit@amd.com" }, "mbox": "http://patches.dpdk.org/project/dpdk/patch/0122a9eac9e37bcf293ae71506e4b0eb11fa4030.1535292771.git.rahul.lakkireddy@chelsio.com/mbox/", "series": [ { "id": 1068, "url": "http://patches.dpdk.org/api/series/1068/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=1068", "date": "2018-08-27T12:52:28", "name": "net/cxgbe: add destination MAC match and VLAN rewrite support for flow API", "version": 1, "mbox": "http://patches.dpdk.org/series/1068/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/43911/comments/", "check": "success", "checks": "http://patches.dpdk.org/api/patches/43911/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 [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 055EA5F17;\n\tMon, 27 Aug 2018 14:53:05 +0200 (CEST)", "from stargate.chelsio.com (stargate.chelsio.com [12.32.117.8])\n\tby dpdk.org (Postfix) with ESMTP id D52995F20\n\tfor <dev@dpdk.org>; Mon, 27 Aug 2018 14:53:02 +0200 (CEST)", "from localhost (scalar.blr.asicdesigners.com [10.193.185.94])\n\tby stargate.chelsio.com (8.13.8/8.13.8) with ESMTP id w7RCqxou027073; \n\tMon, 27 Aug 2018 05:53:00 -0700" ], "From": "Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>", "To": "dev@dpdk.org", "Cc": "shaguna@chelsio.com, indranil@chelsio.com, nirranjan@chelsio.com", "Date": "Mon, 27 Aug 2018 18:22:32 +0530", "Message-Id": "<0122a9eac9e37bcf293ae71506e4b0eb11fa4030.1535292771.git.rahul.lakkireddy@chelsio.com>", "X-Mailer": "git-send-email 2.5.3", "In-Reply-To": [ "<cover.1535292771.git.rahul.lakkireddy@chelsio.com>", "<cover.1535292771.git.rahul.lakkireddy@chelsio.com>" ], "References": [ "<cover.1535292771.git.rahul.lakkireddy@chelsio.com>", "<cover.1535292771.git.rahul.lakkireddy@chelsio.com>" ], "Subject": "[dpdk-dev] [PATCH 4/4] net/cxgbe: add flow operations to match\n\tbased on destination MAC address", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.15", "Precedence": "list", "List-Id": "DPDK patches and discussions <dev.dpdk.org>", "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>", "Errors-To": "dev-bounces@dpdk.org", "Sender": "\"dev\" <dev-bounces@dpdk.org>" }, "content": "From: Shagun Agrawal <shaguna@chelsio.com>\n\nAdd flow operations to match packets based on destination MAC address.\nAllocate and program hardware MPS table with the destination MAC\naddress to be matched against. The returned MPS index is then used while\noffloading flows to LETCAM (maskfull) and HASH (maskless) filter regions.\n\nAlso update existing mac_addr_set() to use the new MPS table API.\n\nSigned-off-by: Shagun Agrawal <shaguna@chelsio.com>\nSigned-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>\n---\n doc/guides/rel_notes/release_18_11.rst | 1 +\n drivers/net/cxgbe/base/common.h | 1 +\n drivers/net/cxgbe/base/t4_hw.c | 2 ++\n drivers/net/cxgbe/cxgbe_ethdev.c | 4 +--\n drivers/net/cxgbe/cxgbe_filter.c | 9 +++--\n drivers/net/cxgbe/cxgbe_filter.h | 1 +\n drivers/net/cxgbe/cxgbe_flow.c | 66 ++++++++++++++++++++++++++++++++--\n drivers/net/cxgbe/cxgbe_flow.h | 1 +\n drivers/net/cxgbe/cxgbe_main.c | 6 ++--\n 9 files changed, 80 insertions(+), 11 deletions(-)", "diff": "diff --git a/doc/guides/rel_notes/release_18_11.rst b/doc/guides/rel_notes/release_18_11.rst\nindex db99518f4..f7bef95e1 100644\n--- a/doc/guides/rel_notes/release_18_11.rst\n+++ b/doc/guides/rel_notes/release_18_11.rst\n@@ -58,6 +58,7 @@ New Features\n \n Flow API support has been enhanced for CXGBE Poll Mode Driver to offload:\n \n+ * Match items: destination MAC address.\n * Action items: push/pop/rewrite vlan header.\n \n \ndiff --git a/drivers/net/cxgbe/base/common.h b/drivers/net/cxgbe/base/common.h\nindex 9f5756850..d9f74d995 100644\n--- a/drivers/net/cxgbe/base/common.h\n+++ b/drivers/net/cxgbe/base/common.h\n@@ -157,6 +157,7 @@ struct tp_params {\n \tint port_shift;\n \tint protocol_shift;\n \tint ethertype_shift;\n+\tint macmatch_shift;\n \n \tu64 hash_filter_mask;\n };\ndiff --git a/drivers/net/cxgbe/base/t4_hw.c b/drivers/net/cxgbe/base/t4_hw.c\nindex d60894115..701e0b1fe 100644\n--- a/drivers/net/cxgbe/base/t4_hw.c\n+++ b/drivers/net/cxgbe/base/t4_hw.c\n@@ -5251,6 +5251,8 @@ int t4_init_tp_params(struct adapter *adap)\n \t\t\t\t\t\t\t F_PROTOCOL);\n \tadap->params.tp.ethertype_shift = t4_filter_field_shift(adap,\n \t\t\t\t\t\t\t\tF_ETHERTYPE);\n+\tadap->params.tp.macmatch_shift = t4_filter_field_shift(adap,\n+\t\t\t\t\t\t\t F_MACMATCH);\n \n \t/*\n \t * If TP_INGRESS_CONFIG.VNID == 0, then TP_VLAN_PRI_MAP.VNIC_ID\ndiff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c\nindex 4dcad7a23..f253c2023 100644\n--- a/drivers/net/cxgbe/cxgbe_ethdev.c\n+++ b/drivers/net/cxgbe/cxgbe_ethdev.c\n@@ -1075,11 +1075,9 @@ static int cxgbe_get_regs(struct rte_eth_dev *eth_dev,\n int cxgbe_mac_addr_set(struct rte_eth_dev *dev, struct ether_addr *addr)\n {\n \tstruct port_info *pi = (struct port_info *)(dev->data->dev_private);\n-\tstruct adapter *adapter = pi->adapter;\n \tint ret;\n \n-\tret = t4_change_mac(adapter, adapter->mbox, pi->viid,\n-\t\t\t pi->xact_addr_filt, (u8 *)addr, true, true);\n+\tret = cxgbe_mpstcam_modify(pi, (int)pi->xact_addr_filt, (u8 *)addr);\n \tif (ret < 0) {\n \t\tdev_err(adapter, \"failed to set mac addr; err = %d\\n\",\n \t\t\tret);\ndiff --git a/drivers/net/cxgbe/cxgbe_filter.c b/drivers/net/cxgbe/cxgbe_filter.c\nindex 4d3f3ebee..dcb1dd03e 100644\n--- a/drivers/net/cxgbe/cxgbe_filter.c\n+++ b/drivers/net/cxgbe/cxgbe_filter.c\n@@ -66,7 +66,8 @@ int validate_filter(struct adapter *adapter, struct ch_filter_specification *fs)\n #define U(_mask, _field) \\\n \t(!(fconf & (_mask)) && S(_field))\n \n-\tif (U(F_PORT, iport) || U(F_ETHERTYPE, ethtype) || U(F_PROTOCOL, proto))\n+\tif (U(F_PORT, iport) || U(F_ETHERTYPE, ethtype) ||\n+\t U(F_PROTOCOL, proto) || U(F_MACMATCH, macidx))\n \t\treturn -EOPNOTSUPP;\n \n #undef S\n@@ -268,6 +269,8 @@ static u64 hash_filter_ntuple(const struct filter_entry *f)\n \n \tif (tp->ethertype_shift >= 0 && f->fs.mask.ethtype)\n \t\tntuple |= (u64)(f->fs.val.ethtype) << tp->ethertype_shift;\n+\tif (tp->macmatch_shift >= 0 && f->fs.mask.macidx)\n+\t\tntuple |= (u64)(f->fs.val.macidx) << tp->macmatch_shift;\n \n \tif (ntuple != tp->hash_filter_mask)\n \t\treturn 0;\n@@ -744,7 +747,9 @@ int set_filter_wr(struct rte_eth_dev *dev, unsigned int fidx)\n \t\t\t V_FW_FILTER_WR_RX_RPL_IQ(adapter->sge.fw_evtq.abs_id\n \t\t\t\t\t\t ));\n \tfwr->maci_to_matchtypem =\n-\t\tcpu_to_be32(V_FW_FILTER_WR_PORT(f->fs.val.iport) |\n+\t\tcpu_to_be32(V_FW_FILTER_WR_MACI(f->fs.val.macidx) |\n+\t\t\t V_FW_FILTER_WR_MACIM(f->fs.mask.macidx) |\n+\t\t\t V_FW_FILTER_WR_PORT(f->fs.val.iport) |\n \t\t\t V_FW_FILTER_WR_PORTM(f->fs.mask.iport));\n \tfwr->ptcl = f->fs.val.proto;\n \tfwr->ptclm = f->fs.mask.proto;\ndiff --git a/drivers/net/cxgbe/cxgbe_filter.h b/drivers/net/cxgbe/cxgbe_filter.h\nindex c7d9366a6..83d647de6 100644\n--- a/drivers/net/cxgbe/cxgbe_filter.h\n+++ b/drivers/net/cxgbe/cxgbe_filter.h\n@@ -77,6 +77,7 @@ struct ch_filter_tuple {\n * Filter specification\n */\n struct ch_filter_specification {\n+\tvoid *private;\n \t/* Administrative fields for filter. */\n \tuint32_t hitcnts:1;\t/* count filter hits in TCB */\n \tuint32_t prio:1;\t/* filter has priority over active/server */\ndiff --git a/drivers/net/cxgbe/cxgbe_flow.c b/drivers/net/cxgbe/cxgbe_flow.c\nindex 89fc68cf0..add4f0f95 100644\n--- a/drivers/net/cxgbe/cxgbe_flow.c\n+++ b/drivers/net/cxgbe/cxgbe_flow.c\n@@ -95,6 +95,8 @@ cxgbe_fill_filter_region(struct adapter *adap,\n \t\tntuple_mask |= (u64)fs->mask.ethtype << tp->ethertype_shift;\n \tif (tp->port_shift >= 0)\n \t\tntuple_mask |= (u64)fs->mask.iport << tp->port_shift;\n+\tif (tp->macmatch_shift >= 0)\n+\t\tntuple_mask |= (u64)fs->mask.macidx << tp->macmatch_shift;\n \n \tif (ntuple_mask != hash_filter_mask)\n \t\treturn;\n@@ -102,6 +104,46 @@ cxgbe_fill_filter_region(struct adapter *adap,\n \tfs->cap = 1;\t/* use hash region */\n }\n \n+static int\n+ch_rte_parsetype_eth(const void *dmask, const struct rte_flow_item *item,\n+\t\t struct ch_filter_specification *fs,\n+\t\t struct rte_flow_error *e)\n+{\n+\tconst struct rte_flow_item_eth *spec = item->spec;\n+\tconst struct rte_flow_item_eth *umask = item->mask;\n+\tconst struct rte_flow_item_eth *mask;\n+\n+\t/* If user has not given any mask, then use chelsio supported mask. */\n+\tmask = umask ? umask : (const struct rte_flow_item_eth *)dmask;\n+\n+\t/* we don't support SRC_MAC filtering*/\n+\tif (!is_zero_ether_addr(&mask->src))\n+\t\treturn rte_flow_error_set(e, ENOTSUP, RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t\t item,\n+\t\t\t\t\t \"src mac filtering not supported\");\n+\n+\tif (!is_zero_ether_addr(&mask->dst)) {\n+\t\tconst u8 *addr = (const u8 *)&spec->dst.addr_bytes[0];\n+\t\tconst u8 *m = (const u8 *)&mask->dst.addr_bytes[0];\n+\t\tstruct rte_flow *flow = (struct rte_flow *)fs->private;\n+\t\tstruct port_info *pi = (struct port_info *)\n+\t\t\t\t\t(flow->dev->data->dev_private);\n+\t\tint idx;\n+\n+\t\tidx = cxgbe_mpstcam_alloc(pi, addr, m);\n+\t\tif (idx <= 0)\n+\t\t\treturn rte_flow_error_set(e, idx,\n+\t\t\t\t\t\t RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t\t\t NULL, \"unable to allocate mac\"\n+\t\t\t\t\t\t \" entry in h/w\");\n+\t\tCXGBE_FILL_FS(idx, 0x1ff, macidx);\n+\t}\n+\n+\tCXGBE_FILL_FS(be16_to_cpu(spec->type),\n+\t\t be16_to_cpu(mask->type), ethtype);\n+\treturn 0;\n+}\n+\n static int\n ch_rte_parsetype_port(const void *dmask, const struct rte_flow_item *item,\n \t\t struct ch_filter_specification *fs,\n@@ -440,7 +482,16 @@ cxgbe_rtef_parse_actions(struct rte_flow *flow,\n }\n \n struct chrte_fparse parseitem[] = {\n-\t\t[RTE_FLOW_ITEM_TYPE_PHY_PORT] = {\n+\t[RTE_FLOW_ITEM_TYPE_ETH] = {\n+\t\t.fptr = ch_rte_parsetype_eth,\n+\t\t.dmask = &(const struct rte_flow_item_eth){\n+\t\t\t.dst.addr_bytes = \"\\xff\\xff\\xff\\xff\\xff\\xff\",\n+\t\t\t.src.addr_bytes = \"\\x00\\x00\\x00\\x00\\x00\\x00\",\n+\t\t\t.type = 0xffff,\n+\t\t}\n+\t},\n+\n+\t[RTE_FLOW_ITEM_TYPE_PHY_PORT] = {\n \t\t.fptr = ch_rte_parsetype_port,\n \t\t.dmask = &(const struct rte_flow_item_phy_port){\n \t\t\t.index = 0x7,\n@@ -527,7 +578,6 @@ cxgbe_flow_parse(struct rte_flow *flow,\n \t\t struct rte_flow_error *e)\n {\n \tint ret;\n-\n \t/* parse user request into ch_filter_specification */\n \tret = cxgbe_rtef_parse_attr(flow, attr, e);\n \tif (ret)\n@@ -606,6 +656,7 @@ cxgbe_flow_create(struct rte_eth_dev *dev,\n \n \tflow->item_parser = parseitem;\n \tflow->dev = dev;\n+\tflow->fs.private = (void *)flow;\n \n \tif (cxgbe_flow_parse(flow, attr, item, action, e)) {\n \t\tt4_os_free(flow);\n@@ -660,6 +711,17 @@ static int __cxgbe_flow_destroy(struct rte_eth_dev *dev, struct rte_flow *flow)\n \t\treturn ctx.result;\n \t}\n \n+\tfs = &flow->fs;\n+\tif (fs->mask.macidx) {\n+\t\tstruct port_info *pi = (struct port_info *)\n+\t\t\t\t\t(dev->data->dev_private);\n+\t\tint ret;\n+\n+\t\tret = cxgbe_mpstcam_remove(pi, fs->val.macidx);\n+\t\tif (!ret)\n+\t\t\treturn ret;\n+\t}\n+\n \treturn 0;\n }\n \ndiff --git a/drivers/net/cxgbe/cxgbe_flow.h b/drivers/net/cxgbe/cxgbe_flow.h\nindex 0f7504745..718bf3d05 100644\n--- a/drivers/net/cxgbe/cxgbe_flow.h\n+++ b/drivers/net/cxgbe/cxgbe_flow.h\n@@ -7,6 +7,7 @@\n \n #include <rte_flow_driver.h>\n #include \"cxgbe_filter.h\"\n+#include \"mps_tcam.h\"\n #include \"cxgbe.h\"\n \n #define CXGBE_FLOW_POLL_US 10\ndiff --git a/drivers/net/cxgbe/cxgbe_main.c b/drivers/net/cxgbe/cxgbe_main.c\nindex 20d2de442..9c40f51b2 100644\n--- a/drivers/net/cxgbe/cxgbe_main.c\n+++ b/drivers/net/cxgbe/cxgbe_main.c\n@@ -1342,10 +1342,8 @@ int link_start(struct port_info *pi)\n \tret = t4_set_rxmode(adapter, adapter->mbox, pi->viid, mtu, -1, -1,\n \t\t\t -1, 1, true);\n \tif (ret == 0) {\n-\t\tret = t4_change_mac(adapter, adapter->mbox, pi->viid,\n-\t\t\t\t pi->xact_addr_filt,\n-\t\t\t\t (u8 *)&pi->eth_dev->data->mac_addrs[0],\n-\t\t\t\t true, true);\n+\t\tret = cxgbe_mpstcam_modify(pi, (int)pi->xact_addr_filt,\n+\t\t\t\t(u8 *)&pi->eth_dev->data->mac_addrs[0]);\n \t\tif (ret >= 0) {\n \t\t\tpi->xact_addr_filt = ret;\n \t\t\tret = 0;\n", "prefixes": [ "4/4" ] }{ "id": 43911, "url": "