get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 1425,
    "url": "https://patches.dpdk.org/api/patches/1425/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1416530816-2159-16-git-send-email-jingjing.wu@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": "<1416530816-2159-16-git-send-email-jingjing.wu@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1416530816-2159-16-git-send-email-jingjing.wu@intel.com",
    "date": "2014-11-21T00:46:49",
    "name": "[dpdk-dev,v6,15/22] i40e: implement operations to get fdir info",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "910fed9378d1002dccd38899805fe0d4308234d0",
    "submitter": {
        "id": 47,
        "url": "https://patches.dpdk.org/api/people/47/?format=api",
        "name": "Jingjing Wu",
        "email": "jingjing.wu@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1416530816-2159-16-git-send-email-jingjing.wu@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/1425/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/1425/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 AD2777FCF;\n\tFri, 21 Nov 2014 01:37:27 +0100 (CET)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n\tby dpdk.org (Postfix) with ESMTP id 0C8E2800E\n\tfor <dev@dpdk.org>; Fri, 21 Nov 2014 01:37:22 +0100 (CET)",
            "from orsmga002.jf.intel.com ([10.7.209.21])\n\tby orsmga102.jf.intel.com with ESMTP; 20 Nov 2014 16:45:22 -0800",
            "from shvmail01.sh.intel.com ([10.239.29.42])\n\tby orsmga002.jf.intel.com with ESMTP; 20 Nov 2014 16:47:35 -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 sAL0lXpf004185;\n\tFri, 21 Nov 2014 08:47:33 +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 sAL0lVqA002300; Fri, 21 Nov 2014 08:47:33 +0800",
            "(from wujingji@localhost)\n\tby shecgisg004.sh.intel.com (8.13.6/8.13.6/Submit) id sAL0lVvR002296; \n\tFri, 21 Nov 2014 08:47:31 +0800"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.07,426,1413270000\"; d=\"scan'208\";a=\"640843677\"",
        "From": "Jingjing Wu <jingjing.wu@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Fri, 21 Nov 2014 08:46:49 +0800",
        "Message-Id": "<1416530816-2159-16-git-send-email-jingjing.wu@intel.com>",
        "X-Mailer": "git-send-email 1.7.4.1",
        "In-Reply-To": "<1416530816-2159-1-git-send-email-jingjing.wu@intel.com>",
        "References": "<1414654006-7472-1-git-send-email-jingjing.wu@intel.com>\n\t<1416530816-2159-1-git-send-email-jingjing.wu@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v6 15/22] i40e: implement operations to get fdir\n\tinfo",
        "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": "implement operation to get flow director information in i40e pmd driver, includes\n - mode\n - supported flow types\n - table space\n - flexible payload size and granularity\n - configured flexible payload and mask information\n\nSigned-off-by: jingjing.wu <jingjing.wu@intel.com>\n---\n lib/librte_pmd_i40e/i40e_ethdev.h |   1 +\n lib/librte_pmd_i40e/i40e_fdir.c   | 145 ++++++++++++++++++++++++++++++++++++++\n 2 files changed, 146 insertions(+)",
    "diff": "diff --git a/lib/librte_pmd_i40e/i40e_ethdev.h b/lib/librte_pmd_i40e/i40e_ethdev.h\nindex fbce86a..f3ef65f 100644\n--- a/lib/librte_pmd_i40e/i40e_ethdev.h\n+++ b/lib/librte_pmd_i40e/i40e_ethdev.h\n@@ -67,6 +67,7 @@ enum i40e_flxpld_layer_idx {\n #define I40E_MAX_FLXPLD_FIED        3  /* max number of flex payload fields */\n #define I40E_FDIR_BITMASK_NUM_WORD  2  /* max number of bitmask words */\n #define I40E_FDIR_MAX_FLEXWORD_NUM  8  /* max number of flexpayload words */\n+#define I40E_FDIR_MAX_FLEX_LEN      16 /* len in bytes of flex payload */\n \n /* i40e flags */\n #define I40E_FLAG_RSS                   (1ULL << 0)\ndiff --git a/lib/librte_pmd_i40e/i40e_fdir.c b/lib/librte_pmd_i40e/i40e_fdir.c\nindex 93aa8a1..2edb3a6 100644\n--- a/lib/librte_pmd_i40e/i40e_fdir.c\n+++ b/lib/librte_pmd_i40e/i40e_fdir.c\n@@ -80,8 +80,34 @@\n #define I40E_COUNTER_PF           2\n /* Statistic counter index for one pf */\n #define I40E_COUNTER_INDEX_FDIR(pf_id)   (0 + (pf_id) * I40E_COUNTER_PF)\n+#define I40E_MAX_FLX_SOURCE_OFF           480\n #define I40E_FLX_OFFSET_IN_FIELD_VECTOR   50\n \n+#define NONUSE_FLX_PIT_DEST_OFF 63\n+#define NONUSE_FLX_PIT_FSIZE    1\n+#define MK_FLX_PIT(src_offset, fsize, dst_offset) ( \\\n+\t(((src_offset) << I40E_PRTQF_FLX_PIT_SOURCE_OFF_SHIFT) & \\\n+\t\tI40E_PRTQF_FLX_PIT_SOURCE_OFF_MASK) | \\\n+\t(((fsize) << I40E_PRTQF_FLX_PIT_FSIZE_SHIFT) & \\\n+\t\t\tI40E_PRTQF_FLX_PIT_FSIZE_MASK) | \\\n+\t((((dst_offset) + I40E_FLX_OFFSET_IN_FIELD_VECTOR) << \\\n+\t\t\tI40E_PRTQF_FLX_PIT_DEST_OFF_SHIFT) & \\\n+\t\t\tI40E_PRTQF_FLX_PIT_DEST_OFF_MASK))\n+\n+#define I40E_FDIR_FLOW_TYPES ( \\\n+\t(1 << RTE_ETH_FLOW_TYPE_UDPV4) | \\\n+\t(1 << RTE_ETH_FLOW_TYPE_TCPV4) | \\\n+\t(1 << RTE_ETH_FLOW_TYPE_SCTPV4) | \\\n+\t(1 << RTE_ETH_FLOW_TYPE_IPV4_OTHER) | \\\n+\t(1 << RTE_ETH_FLOW_TYPE_FRAG_IPV4) | \\\n+\t(1 << RTE_ETH_FLOW_TYPE_UDPV6) | \\\n+\t(1 << RTE_ETH_FLOW_TYPE_TCPV6) | \\\n+\t(1 << RTE_ETH_FLOW_TYPE_SCTPV6) | \\\n+\t(1 << RTE_ETH_FLOW_TYPE_IPV6_OTHER) | \\\n+\t(1 << RTE_ETH_FLOW_TYPE_FRAG_IPV6))\n+\n+#define I40E_FLEX_WORD_MASK(off) (0x80 >> (off))\n+\n static int i40e_fdir_rx_queue_init(struct i40e_rx_queue *rxq);\n static int i40e_fdir_construct_pkt(struct i40e_pf *pf,\n \t\t\t\t     const struct rte_eth_fdir_input *fdir_input,\n@@ -94,6 +120,8 @@ static int i40e_fdir_filter_programming(struct i40e_pf *pf,\n \t\t\tconst struct rte_eth_fdir_filter *filter,\n \t\t\tbool add);\n static int i40e_fdir_flush(struct rte_eth_dev *dev);\n+static void i40e_fdir_info_get(struct rte_eth_dev *dev,\n+\t\t\t   struct rte_eth_fdir_info *fdir);\n \n static int\n i40e_fdir_rx_queue_init(struct i40e_rx_queue *rxq)\n@@ -861,6 +889,120 @@ i40e_fdir_flush(struct rte_eth_dev *dev)\n \treturn 0;\n }\n \n+static inline void\n+i40e_fdir_info_get_flex_set(struct i40e_pf *pf,\n+\t\t\tstruct rte_eth_flex_payload_cfg *flex_set,\n+\t\t\tuint16_t *num)\n+{\n+\tstruct i40e_fdir_flex_pit *flex_pit;\n+\tstruct rte_eth_flex_payload_cfg *ptr = flex_set;\n+\tuint16_t src, dst, size, j, k;\n+\tuint8_t i, layer_idx;\n+\n+\tfor (layer_idx = I40E_FLXPLD_L2_IDX;\n+\t     layer_idx <= I40E_FLXPLD_L4_IDX;\n+\t     layer_idx++) {\n+\t\tif (layer_idx == I40E_FLXPLD_L2_IDX)\n+\t\t\tptr->type = RTE_ETH_L2_PAYLOAD;\n+\t\telse if (layer_idx == I40E_FLXPLD_L3_IDX)\n+\t\t\tptr->type = RTE_ETH_L3_PAYLOAD;\n+\t\telse if (layer_idx == I40E_FLXPLD_L4_IDX)\n+\t\t\tptr->type = RTE_ETH_L4_PAYLOAD;\n+\n+\t\tfor (i = 0; i < I40E_MAX_FLXPLD_FIED; i++) {\n+\t\t\tflex_pit = &pf->fdir.flex_set[layer_idx *\n+\t\t\t\tI40E_MAX_FLXPLD_FIED + i];\n+\t\t\tif (flex_pit->size == 0)\n+\t\t\t\tcontinue;\n+\t\t\tsrc = flex_pit->src_offset * sizeof(uint16_t);\n+\t\t\tdst = flex_pit->dst_offset * sizeof(uint16_t);\n+\t\t\tsize = flex_pit->size * sizeof(uint16_t);\n+\t\t\tfor (j = src, k = dst; j < src + size; j++, k++)\n+\t\t\t\tptr->src_offset[k] = j;\n+\t\t}\n+\t\t(*num)++;\n+\t\tptr++;\n+\t}\n+}\n+\n+static inline void\n+i40e_fdir_info_get_flex_mask(struct i40e_pf *pf,\n+\t\t\tstruct rte_eth_fdir_flex_mask *flex_mask,\n+\t\t\tuint16_t *num)\n+{\n+\tstruct i40e_fdir_flex_mask *mask;\n+\tstruct rte_eth_fdir_flex_mask *ptr = flex_mask;\n+\tenum rte_eth_flow_type flow_type;\n+\tuint8_t i, j;\n+\tuint16_t off_bytes, mask_tmp;\n+\n+\tfor (i = I40E_FILTER_PCTYPE_NONF_IPV4_UDP;\n+\t     i <= I40E_FILTER_PCTYPE_FRAG_IPV6;\n+\t     i++) {\n+\t\tmask =  &pf->fdir.flex_mask[i];\n+\t\tif (!I40E_VALID_PCTYPE((enum i40e_filter_pctype)i))\n+\t\t\tcontinue;\n+\t\tflow_type = i40e_pctype_to_flowtype((enum i40e_filter_pctype)i);\n+\t\tfor (j = 0; j < I40E_FDIR_MAX_FLEXWORD_NUM; j++) {\n+\t\t\tif (mask->word_mask & I40E_FLEX_WORD_MASK(j)) {\n+\t\t\t\tptr->mask[j * sizeof(uint16_t)] = UINT8_MAX;\n+\t\t\t\tptr->mask[j * sizeof(uint16_t) + 1] = UINT8_MAX;\n+\t\t\t} else {\n+\t\t\t\tptr->mask[j * sizeof(uint16_t)] = 0x0;\n+\t\t\t\tptr->mask[j * sizeof(uint16_t) + 1] = 0x0;\n+\t\t\t}\n+\t\t}\n+\t\tfor (j = 0; j < I40E_FDIR_BITMASK_NUM_WORD; j++) {\n+\t\t\toff_bytes = mask->bitmask[j].offset * sizeof(uint16_t);\n+\t\t\tmask_tmp = ~mask->bitmask[j].mask;\n+\t\t\tptr->mask[off_bytes] &= I40E_HI_BYTE(mask_tmp);\n+\t\t\tptr->mask[off_bytes + 1] &= I40E_LO_BYTE(mask_tmp);\n+\t\t}\n+\t\tptr->flow_type = flow_type;\n+\t\tptr++;\n+\t\t(*num)++;\n+\t}\n+}\n+\n+/*\n+ * i40e_fdir_info_get - get information of Flow Director\n+ * @pf: ethernet device to get info from\n+ * @fdir: a pointer to a structure of type *rte_eth_fdir_info* to be filled with\n+ *    the flow director information.\n+ */\n+static void\n+i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)\n+{\n+\tstruct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);\n+\tstruct i40e_hw *hw = I40E_PF_TO_HW(pf);\n+\tuint16_t num_flex_set = 0;\n+\tuint16_t num_flex_mask = 0;\n+\n+\tfdir->mode = (pf->flags & I40E_FLAG_FDIR) ?\n+\t\t\tRTE_FDIR_MODE_PERFECT : RTE_FDIR_MODE_NONE;\n+\tfdir->guarant_spc =\n+\t\t(uint32_t)hw->func_caps.fd_filters_guaranteed;\n+\tfdir->best_spc =\n+\t\t(uint32_t)hw->func_caps.fd_filters_best_effort;\n+\tfdir->max_flexpayload = I40E_FDIR_MAX_FLEX_LEN;\n+\tfdir->flow_types_mask[0] = I40E_FDIR_FLOW_TYPES;\n+\tfdir->flex_payload_unit = sizeof(uint16_t);\n+\tfdir->flex_bitmask_unit = sizeof(uint16_t);\n+\tfdir->max_flex_payload_segment_num = I40E_MAX_FLXPLD_FIED;\n+\tfdir->flex_payload_limit = I40E_MAX_FLX_SOURCE_OFF;\n+\tfdir->max_flex_bitmask_num = I40E_FDIR_BITMASK_NUM_WORD;\n+\n+\ti40e_fdir_info_get_flex_set(pf,\n+\t\t\t\tfdir->flex_conf.flex_set,\n+\t\t\t\t&num_flex_set);\n+\ti40e_fdir_info_get_flex_mask(pf,\n+\t\t\t\tfdir->flex_conf.flex_mask,\n+\t\t\t\t&num_flex_mask);\n+\n+\tfdir->flex_conf.nb_payloads = num_flex_set;\n+\tfdir->flex_conf.nb_flexmasks = num_flex_mask;\n+}\n+\n /*\n  * i40e_fdir_ctrl_func - deal with all operations on flow director.\n  * @pf: board private structure\n@@ -898,6 +1040,9 @@ i40e_fdir_ctrl_func(struct rte_eth_dev *dev,\n \tcase RTE_ETH_FILTER_FLUSH:\n \t\tret = i40e_fdir_flush(dev);\n \t\tbreak;\n+\tcase RTE_ETH_FILTER_INFO:\n+\t\ti40e_fdir_info_get(dev, (struct rte_eth_fdir_info *)arg);\n+\t\tbreak;\n \tdefault:\n \t\tPMD_DRV_LOG(ERR, \"unknown operation %u.\", filter_op);\n \t\tret = -EINVAL;\n",
    "prefixes": [
        "dpdk-dev",
        "v6",
        "15/22"
    ]
}