get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 41897,
    "url": "http://patchwork.dpdk.org/api/patches/41897/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20180628225548.21885-1-dg@adax.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20180628225548.21885-1-dg@adax.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20180628225548.21885-1-dg@adax.com",
    "date": "2018-06-28T22:55:48",
    "name": "[10/10] kni: add API to set link status on kernel interface",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "6620a7ede3418ce098aa55e28940f0f11545a053",
    "submitter": {
        "id": 1040,
        "url": "http://patchwork.dpdk.org/api/people/1040/?format=api",
        "name": "Dan Gora",
        "email": "dg@adax.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20180628225548.21885-1-dg@adax.com/mbox/",
    "series": [
        {
            "id": 302,
            "url": "http://patchwork.dpdk.org/api/series/302/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=302",
            "date": "2018-06-28T22:55:48",
            "name": null,
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/302/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/41897/comments/",
    "check": "fail",
    "checks": "http://patchwork.dpdk.org/api/patches/41897/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 294301B3AF;\n\tFri, 29 Jun 2018 00:56:01 +0200 (CEST)",
            "from mail-oi0-f65.google.com (mail-oi0-f65.google.com\n\t[209.85.218.65]) by dpdk.org (Postfix) with ESMTP id C209A1B000\n\tfor <dev@dpdk.org>; Fri, 29 Jun 2018 00:55:59 +0200 (CEST)",
            "by mail-oi0-f65.google.com with SMTP id s198-v6so2880808oih.11\n\tfor <dev@dpdk.org>; Thu, 28 Jun 2018 15:55:59 -0700 (PDT)",
            "from linux.adax.com (172-11-198-60.lightspeed.sntcca.sbcglobal.net.\n\t[172.11.198.60]) by smtp.gmail.com with ESMTPSA id\n\tq93-v6sm1052935ota.58.2018.06.28.15.55.57\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tThu, 28 Jun 2018 15:55:58 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=sender:from:to:cc:subject:date:message-id;\n\tbh=cdEl1hq7skaMWXoPPo1VTqfPWn0cWRE6baagA8ej7DY=;\n\tb=Xfr6BZ+uW7I2b4DzkT7FsYNiX14w7tyZHtDFvOecfyec9HeRnCBCfvXQjWF4m2PEPo\n\tZX9tz3+8iN3BT1rdKJpms/2ohzRp6A9XBniEOCZwrtxofG7apRJdvYxTCH5Eu9qopKgs\n\tVqi0a7D6ty8fXpTpP6no0Xvwys2grhdoZ4fHKjNN5gBkM+IejibDfbyIuC1cHFucu81O\n\tILttMa02vuOASWvHbPtt5YWzOVM4q7UG4uar/kk1OHWfb9ebOQbuUk46R16dzINZ/VAM\n\tgSYmEqEvXqThmXZXbTnEtzMElFaXCDLq9GpfTFNjmGIMG/fDN9CzugYls5IrFzYS/DIi\n\t+Dhg==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:sender:from:to:cc:subject:date:message-id;\n\tbh=cdEl1hq7skaMWXoPPo1VTqfPWn0cWRE6baagA8ej7DY=;\n\tb=EwQ0nZlhAn8+Syx+gPsDlUFShsZVJaixGgWHri6Udh/qyoriV7WddOLPdrmZ+AZN2x\n\tqYqOFTfjoond4KYTaLnEaVF+EUBpz41IIrfNiv7vmUuM18hAMaAJ+3id1OP990AdgbIH\n\t4P74e0saANFGgwldzv2SdWph32mdqA2CJ0BW5E6gmrXkLHxVe0WC0xPU+jCeiAByG+Yc\n\tR8kGeHEbVJGf3RER/jHBumIFzKPsi2DrSMjaeAA/EYLznFJ+TzQwE42e4DZTkHBK1cqQ\n\t/N9oXsHKTJQp4/9+SOYM+7hfWnUEvfjkcHJQvD1p83dH1cWoTwM+y7JpDA5PHEOKF2kT\n\tE5+w==",
        "X-Gm-Message-State": "APt69E1A/P8xXIGQDZem7wwIT8S7mDehiWs5XdNXzVv1o8QdEewE0UIn\n\tHjfwBq9tOAO7WKGJ57velfo=",
        "X-Google-Smtp-Source": "AAOMgpcK4L/7tUrLKCx3q7PTmoz13ufzyqVliTWTMRNexsprOPP/A/TaAM38iZ5HQkn67KyYg1i5zQ==",
        "X-Received": "by 2002:aca:6749:: with SMTP id\n\tb9-v6mr2238476oiy.247.1530226558972; \n\tThu, 28 Jun 2018 15:55:58 -0700 (PDT)",
        "From": "Dan Gora <dg@adax.com>",
        "To": "Ferruh Yigit <ferruh.yigit@intel.com>",
        "Cc": "dev@dpdk.org,\n\tDan Gora <dg@adax.com>",
        "Date": "Thu, 28 Jun 2018 15:55:48 -0700",
        "Message-Id": "<20180628225548.21885-1-dg@adax.com>",
        "X-Mailer": "git-send-email 2.18.0.rc1.1.g6f333ff2f",
        "Subject": "[dpdk-dev] [PATCH 10/10] kni: add API to set link status on kernel\n\tinterface",
        "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": "Add a new API function to KNI, rte_kni_update_link() to allow DPDK\napplications to update the link state for the KNI network interfaces\nin the linux kernel.\n\nNote that the default carrier state is set to off when the interface\nis opened.\n\nSigned-off-by: Dan Gora <dg@adax.com>\n---\n kernel/linux/kni/kni_misc.c                   | 63 +++++++++++++++++++\n kernel/linux/kni/kni_net.c                    |  2 +\n .../eal/include/exec-env/rte_kni_common.h     | 19 ++++++\n lib/librte_kni/rte_kni.c                      | 37 ++++++++++-\n lib/librte_kni/rte_kni.h                      | 16 +++++\n 5 files changed, 136 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c\nindex 1c38cfa1a..b5784ad1b 100644\n--- a/kernel/linux/kni/kni_misc.c\n+++ b/kernel/linux/kni/kni_misc.c\n@@ -585,6 +585,66 @@ kni_ioctl_free(struct net *net, uint32_t ioctl_num,\n \treturn ret;\n }\n \n+static int\n+kni_ioctl_linkstat(struct net *net, uint32_t ioctl_num,\n+\t\tunsigned long ioctl_param)\n+{\n+\tstruct kni_net *knet = net_generic(net, kni_net_id);\n+\tint ret = -EINVAL;\n+\tstruct kni_dev *dev, *n;\n+\tstruct rte_kni_link_info link_info;\n+\tstruct net_device *netdev;\n+\tuint16_t link;\n+\n+\tif (_IOC_SIZE(ioctl_num) > sizeof(link_info))\n+\t\treturn -EINVAL;\n+\n+\tret = copy_from_user(&link_info, (void *)ioctl_param,\n+\t\t\t     sizeof(link_info));\n+\tif (ret) {\n+\t\tpr_err(\"copy_from_user in kni_ioctl_release\");\n+\t\treturn -EIO;\n+\t}\n+\n+\t/* Release the network device according to its name */\n+\tif (strlen(link_info.name) == 0)\n+\t\treturn ret;\n+\n+\tdown_read(&knet->kni_list_lock);\n+\tlist_for_each_entry_safe(dev, n, &knet->kni_list_head, list) {\n+\t\tif (strncmp(dev->name, link_info.name, RTE_KNI_NAMESIZE) != 0)\n+\t\t\tcontinue;\n+\n+\t\tnetdev = dev->net_dev;\n+\t\tif (netdev == NULL) {\n+\t\t\tup_read(&knet->kni_list_lock);\n+\t\t\treturn ret;\n+\t\t}\n+\n+\t\tlink = link_info.link_status;\n+\n+\t\tif (!netif_carrier_ok(netdev) && link) {\n+\t\t\tpr_info(\"%s NIC Link is Up %d Mbps %s.\\n\",\n+\t\t\t\tnetdev->name,\n+\t\t\t\tlink_info.link_speed,\n+\t\t\t\tlink_info.link_duplex ==\n+\t\t\t\t\tRTE_KNI_LINK_FULL_DUPLEX ?\n+\t\t\t\t\t\"Full Duplex\" : \"Half Duplex\");\n+\t\t\tnetif_carrier_on(netdev);\n+\t\t} else if (netif_carrier_ok(netdev) && !link) {\n+\t\t\tpr_info(\"%s NIC Link is Down.\\n\",\n+\t\t\t\tnetdev->name);\n+\t\t\tnetif_carrier_off(netdev);\n+\t\t}\n+\n+\t\tret = 0;\n+\t\tbreak;\n+\t}\n+\tup_read(&knet->kni_list_lock);\n+\n+\treturn ret;\n+}\n+\n static int\n kni_ioctl(struct inode *inode, uint32_t ioctl_num, unsigned long ioctl_param)\n {\n@@ -609,6 +669,9 @@ kni_ioctl(struct inode *inode, uint32_t ioctl_num, unsigned long ioctl_param)\n \tcase _IOC_NR(RTE_KNI_IOCTL_FREE):\n \t\tret = kni_ioctl_free(net, ioctl_num, ioctl_param);\n \t\tbreak;\n+\tcase _IOC_NR(RTE_KNI_IOCTL_LINKSTAT):\n+\t\tret = kni_ioctl_linkstat(net, ioctl_num, ioctl_param);\n+\t\tbreak;\n \tdefault:\n \t\tpr_debug(\"IOCTL default\\n\");\n \t\tbreak;\ndiff --git a/kernel/linux/kni/kni_net.c b/kernel/linux/kni/kni_net.c\nindex 0850be434..fea3ec7e7 100644\n--- a/kernel/linux/kni/kni_net.c\n+++ b/kernel/linux/kni/kni_net.c\n@@ -134,6 +134,7 @@ kni_net_open(struct net_device *dev)\n \tstruct kni_dev *kni = netdev_priv(dev);\n \n \tnetif_start_queue(dev);\n+\tnetif_carrier_off(dev);\n \n \tmemset(&req, 0, sizeof(req));\n \treq.req_id = RTE_KNI_REQ_CFG_NETWORK_IF;\n@@ -153,6 +154,7 @@ kni_net_release(struct net_device *dev)\n \tstruct kni_dev *kni = netdev_priv(dev);\n \n \tnetif_stop_queue(dev); /* can't transmit any more */\n+\tnetif_carrier_off(dev);\n \n \tmemset(&req, 0, sizeof(req));\n \treq.req_id = RTE_KNI_REQ_CFG_NETWORK_IF;\ndiff --git a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h\nindex 318a3f939..f617d8026 100644\n--- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h\n+++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h\n@@ -124,11 +124,30 @@ struct rte_kni_device_info {\n \tchar mac_addr[6];\n };\n \n+\n+struct rte_kni_link_info {\n+\tchar name[RTE_KNI_NAMESIZE];  /**< Network device name for KNI */\n+\tuint32_t link_speed;        /**< ETH_SPEED_NUM_ */\n+\n+#define RTE_KNI_LINK_HALF_DUPLEX 0 /**< Half-duplex connection. */\n+#define RTE_KNI_LINK_FULL_DUPLEX 1 /**< Full-duplex connection. */\n+\tuint16_t link_duplex  : 1;  /**< RTE_KNI_LINK_[HALF/FULL]_DUPLEX */\n+\n+#define RTE_KNI_LINK_FIXED       0 /**< No autonegotiation. */\n+#define RTE_KNI_LINK_AUTONEG     1 /**< Autonegotiated. */\n+\tuint16_t link_autoneg : 1;  /**< RTE_KNI_LINK_[AUTONEG/FIXED] */\n+\n+#define RTE_KNI_LINK_DOWN        0 /**< Link is down. */\n+#define RTE_KNI_LINK_UP          1 /**< Link is up. */\n+\tuint16_t link_status  : 1;  /**< RTE_KNI_LINK_[DOWN/UP] */\n+};\n+\n #define KNI_DEVICE \"kni\"\n \n #define RTE_KNI_IOCTL_TEST    _IOWR(0, 1, int)\n #define RTE_KNI_IOCTL_CREATE  _IOWR(0, 2, struct rte_kni_device_info)\n #define RTE_KNI_IOCTL_RELEASE _IOWR(0, 3, struct rte_kni_device_info)\n #define RTE_KNI_IOCTL_FREE    _IOWR(0, 4, struct rte_kni_device_info)\n+#define RTE_KNI_IOCTL_LINKSTAT _IOWR(0, 5, struct rte_kni_link_info)\n \n #endif /* _RTE_KNI_COMMON_H_ */\ndiff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c\nindex 6ef0859bf..aa3559306 100644\n--- a/lib/librte_kni/rte_kni.c\n+++ b/lib/librte_kni/rte_kni.c\n@@ -13,7 +13,6 @@\n \n #include <rte_spinlock.h>\n #include <rte_string_fns.h>\n-#include <rte_ethdev.h>\n #include <rte_malloc.h>\n #include <rte_log.h>\n #include <rte_kni.h>\n@@ -817,6 +816,42 @@ rte_kni_unregister_handlers(struct rte_kni *kni)\n \n \treturn 0;\n }\n+\n+int\n+rte_kni_update_link(struct rte_kni *kni, struct rte_eth_link *link)\n+{\n+\tstruct rte_kni_link_info link_info;\n+\n+\tif (kni == NULL || !kni->in_use || link == NULL)\n+\t\treturn -1;\n+\n+\tsnprintf(link_info.name, sizeof(link_info.name), \"%s\", kni->name);\n+\n+\tlink_info.link_speed = link->link_speed;\n+\tif (link->link_duplex == ETH_LINK_FULL_DUPLEX)\n+\t\tlink_info.link_duplex = RTE_KNI_LINK_FULL_DUPLEX;\n+\telse\n+\t\tlink_info.link_duplex = RTE_KNI_LINK_FULL_DUPLEX;\n+\n+\tif (link->link_autoneg == ETH_LINK_FIXED)\n+\t\tlink_info.link_autoneg = RTE_KNI_LINK_FIXED;\n+\telse\n+\t\tlink_info.link_autoneg = RTE_KNI_LINK_AUTONEG;\n+\n+\tif (link->link_status == ETH_LINK_UP)\n+\t\tlink_info.link_status = RTE_KNI_LINK_UP;\n+\telse\n+\t\tlink_info.link_status = RTE_KNI_LINK_DOWN;\n+\n+\tif (ioctl(kni_fd, RTE_KNI_IOCTL_LINKSTAT, &link_info) < 0) {\n+\t\tRTE_LOG(ERR, KNI,\n+\t\t\t\"Failed to update kni link info for dev '%s'.\\n\",\n+\t\t\tkni->name);\n+\t\treturn -1;\n+\t}\n+\treturn 0;\n+}\n+\n void\n rte_kni_close(void)\n {\ndiff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h\nindex 94516c38f..02d781a32 100644\n--- a/lib/librte_kni/rte_kni.h\n+++ b/lib/librte_kni/rte_kni.h\n@@ -21,6 +21,7 @@\n #include <rte_memory.h>\n #include <rte_mempool.h>\n #include <rte_ether.h>\n+#include <rte_ethdev.h>\n \n #include <exec-env/rte_kni_common.h>\n \n@@ -255,6 +256,21 @@ int rte_kni_register_handlers(struct rte_kni *kni, struct rte_kni_ops *ops);\n  */\n int rte_kni_unregister_handlers(struct rte_kni *kni);\n \n+/**\n+ *  Update link status info for KNI port.\n+ *\n+ *  Update the linkup/linkdown status of a KNI interface in the kernel.\n+ *\n+ *  @param kni\n+ *   pointer to struct rte_kni.\n+ *\n+ *  @return\n+ *   On success: 0\n+ *   On failure: -1\n+ */\n+int __rte_experimental\n+rte_kni_update_link(struct rte_kni *kni, struct rte_eth_link *link);\n+\n /**\n  *  Close KNI device.\n  */\n",
    "prefixes": [
        "10/10"
    ]
}