get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 7318,
    "url": "https://patches.dpdk.org/api/patches/7318/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1443621905-7872-5-git-send-email-tomaszx.kulasek@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": "<1443621905-7872-5-git-send-email-tomaszx.kulasek@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1443621905-7872-5-git-send-email-tomaszx.kulasek@intel.com",
    "date": "2015-09-30T14:05:00",
    "name": "[dpdk-dev,v5,4/9] null: virtual dynamic rss configuration",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "7d3ee7026fea1676d6201452a5d08895b15834b0",
    "submitter": {
        "id": 155,
        "url": "https://patches.dpdk.org/api/people/155/?format=api",
        "name": "Tomasz Kulasek",
        "email": "tomaszx.kulasek@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1443621905-7872-5-git-send-email-tomaszx.kulasek@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/7318/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/7318/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 82FA28DB2;\n\tWed, 30 Sep 2015 16:12:27 +0200 (CEST)",
            "from mga03.intel.com (mga03.intel.com [134.134.136.65])\n\tby dpdk.org (Postfix) with ESMTP id 842228DAA\n\tfor <dev@dpdk.org>; Wed, 30 Sep 2015 16:12:25 +0200 (CEST)",
            "from orsmga001.jf.intel.com ([10.7.209.18])\n\tby orsmga103.jf.intel.com with ESMTP; 30 Sep 2015 07:12:24 -0700",
            "from unknown (HELO Sent) ([10.217.248.94])\n\tby orsmga001.jf.intel.com with SMTP; 30 Sep 2015 07:12:22 -0700",
            "by Sent (sSMTP sendmail emulation); Wed, 30 Sep 2015 16:10:57 +0200"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.17,612,1437462000\"; d=\"scan'208\";a=\"780948542\"",
        "From": "Tomasz Kulasek <tomaszx.kulasek@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Wed, 30 Sep 2015 16:05:00 +0200",
        "Message-Id": "<1443621905-7872-5-git-send-email-tomaszx.kulasek@intel.com>",
        "X-Mailer": "git-send-email 2.1.4",
        "In-Reply-To": "<1443621905-7872-1-git-send-email-tomaszx.kulasek@intel.com>",
        "References": "<1436981189-3320-1-git-send-email-tomaszx.kulasek@intel.com>\n\t<1443621905-7872-1-git-send-email-tomaszx.kulasek@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v5 4/9] null: virtual dynamic rss configuration",
        "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 implementation allows to set and read RSS configuration for null\ndevice, and is used to validate right values propagation over the slaves,\nin test units for dynamic RSS configuration for bonding.\n\nv5 changes:\n - replaced memcpy with rte_memcpy\n\nSigned-off-by: Tomasz Kulasek <tomaszx.kulasek@intel.com>\n---\n drivers/net/null/rte_eth_null.c |  116 +++++++++++++++++++++++++++++++++++++++\n 1 file changed, 116 insertions(+)",
    "diff": "diff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c\nindex bf81b1b..b01f647 100644\n--- a/drivers/net/null/rte_eth_null.c\n+++ b/drivers/net/null/rte_eth_null.c\n@@ -37,6 +37,8 @@\n #include <rte_memcpy.h>\n #include <rte_dev.h>\n #include <rte_kvargs.h>\n+#include <rte_eth_null.h>\n+#include <rte_spinlock.h>\n \n #define ETH_NULL_PACKET_SIZE_ARG\t\"size\"\n #define ETH_NULL_PACKET_COPY_ARG\t\"copy\"\n@@ -73,6 +75,17 @@ struct pmd_internals {\n \n \tstruct null_queue rx_null_queues[RTE_MAX_QUEUES_PER_PORT];\n \tstruct null_queue tx_null_queues[RTE_MAX_QUEUES_PER_PORT];\n+\n+\t/** Bit mask of RSS offloads, the bit offset also means flow type */\n+\tuint64_t flow_type_rss_offloads;\n+\n+\trte_spinlock_t rss_lock;\n+\n+\tuint16_t reta_size;\n+\tstruct rte_eth_rss_reta_entry64 reta_conf[ETH_RSS_RETA_SIZE_128 /\n+\t\t\tRTE_RETA_GROUP_SIZE];\n+\n+\tuint8_t rss_key[40];                /**< 40-byte hash key. */\n };\n \n \n@@ -293,6 +306,8 @@ eth_dev_info(struct rte_eth_dev *dev,\n \tdev_info->max_tx_queues = RTE_DIM(internals->tx_null_queues);\n \tdev_info->min_rx_bufsize = 0;\n \tdev_info->pci_dev = NULL;\n+\tdev_info->reta_size = internals->reta_size;\n+\tdev_info->flow_type_rss_offloads = internals->flow_type_rss_offloads;\n }\n \n static void\n@@ -373,6 +388,91 @@ static int\n eth_link_update(struct rte_eth_dev *dev __rte_unused,\n \t\tint wait_to_complete __rte_unused) { return 0; }\n \n+static int\n+eth_rss_reta_update(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size)\n+{\n+\tint i, j;\n+\tstruct pmd_internals *internal = dev->data->dev_private;\n+\n+\tif (reta_size != internal->reta_size)\n+\t\treturn -EINVAL;\n+\n+\trte_spinlock_lock(&internal->rss_lock);\n+\n+\t/* Copy RETA table */\n+\tfor (i = 0; i < (internal->reta_size / RTE_RETA_GROUP_SIZE); i++) {\n+\t\tinternal->reta_conf[i].mask = reta_conf[i].mask;\n+\t\tfor (j = 0; j < RTE_RETA_GROUP_SIZE; j++)\n+\t\t\tif ((reta_conf[i].mask >> j) & 0x01)\n+\t\t\t\tinternal->reta_conf[i].reta[j] = reta_conf[i].reta[j];\n+\t}\n+\n+\trte_spinlock_unlock(&internal->rss_lock);\n+\n+\treturn 0;\n+}\n+\n+static int\n+eth_rss_reta_query(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size)\n+{\n+\tint i, j;\n+\tstruct pmd_internals *internal = dev->data->dev_private;\n+\n+\tif (reta_size != internal->reta_size)\n+\t\treturn -EINVAL;\n+\n+\trte_spinlock_lock(&internal->rss_lock);\n+\n+\t/* Copy RETA table */\n+\tfor (i = 0; i < (internal->reta_size / RTE_RETA_GROUP_SIZE); i++) {\n+\t\tfor (j = 0; j < RTE_RETA_GROUP_SIZE; j++)\n+\t\t\tif ((reta_conf[i].mask >> j) & 0x01)\n+\t\t\t\treta_conf[i].reta[j] = internal->reta_conf[i].reta[j];\n+\t}\n+\n+\trte_spinlock_unlock(&internal->rss_lock);\n+\n+\treturn 0;\n+}\n+\n+static int\n+eth_rss_hash_update(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_conf)\n+{\n+\tstruct pmd_internals *internal = dev->data->dev_private;\n+\n+\trte_spinlock_lock(&internal->rss_lock);\n+\n+\tif ((rss_conf->rss_hf & internal->flow_type_rss_offloads) != 0)\n+\t\tdev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf =\n+\t\t\t\trss_conf->rss_hf & internal->flow_type_rss_offloads;\n+\n+\tif (rss_conf->rss_key)\n+\t\trte_memcpy(internal->rss_key, rss_conf->rss_key, 40);\n+\n+\trte_spinlock_unlock(&internal->rss_lock);\n+\n+\treturn 0;\n+}\n+\n+static int\n+eth_rss_hash_conf_get(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_rss_conf *rss_conf)\n+{\n+\tstruct pmd_internals *internal = dev->data->dev_private;\n+\n+\trte_spinlock_lock(&internal->rss_lock);\n+\n+\trss_conf->rss_hf = dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf;\n+\tif (rss_conf->rss_key)\n+\t\trte_memcpy(rss_conf->rss_key, internal->rss_key, 40);\n+\n+\trte_spinlock_unlock(&internal->rss_lock);\n+\n+\treturn 0;\n+}\n+\n static const struct eth_dev_ops ops = {\n \t.dev_start = eth_dev_start,\n \t.dev_stop = eth_dev_stop,\n@@ -385,6 +485,10 @@ static const struct eth_dev_ops ops = {\n \t.link_update = eth_link_update,\n \t.stats_get = eth_stats_get,\n \t.stats_reset = eth_stats_reset,\n+\t.reta_update = eth_rss_reta_update,\n+\t.reta_query = eth_rss_reta_query,\n+\t.rss_hash_update = eth_rss_hash_update,\n+\t.rss_hash_conf_get = eth_rss_hash_conf_get\n };\n \n static int\n@@ -400,6 +504,13 @@ eth_dev_null_create(const char *name,\n \tstruct pmd_internals *internals = NULL;\n \tstruct rte_eth_dev *eth_dev = NULL;\n \n+\tstatic const uint8_t default_rss_key[40] = {\n+\t\t0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2, 0x41, 0x67, 0x25, 0x3D,\n+\t\t0x43, 0xA3, 0x8F, 0xB0, 0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4,\n+\t\t0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C, 0x6A, 0x42, 0xB7, 0x3B,\n+\t\t0xBE, 0xAC, 0x01, 0xFA\n+\t};\n+\n \tif (name == NULL)\n \t\treturn -EINVAL;\n \n@@ -441,6 +552,11 @@ eth_dev_null_create(const char *name,\n \tinternals->packet_copy = packet_copy;\n \tinternals->numa_node = numa_node;\n \n+\tinternals->flow_type_rss_offloads =  ETH_RSS_PROTO_MASK;\n+\tinternals->reta_size = RTE_DIM(internals->reta_conf) * RTE_RETA_GROUP_SIZE;\n+\n+\trte_memcpy(internals->rss_key, default_rss_key, 40);\n+\n \tpci_dev->numa_node = numa_node;\n \tpci_dev->driver = &rte_null_pmd.pci_drv;\n \n",
    "prefixes": [
        "dpdk-dev",
        "v5",
        "4/9"
    ]
}