From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pd0-f174.google.com (mail-pd0-f174.google.com [209.85.192.174]) by dpdk.org (Postfix) with ESMTP id 8A5DA5A0F for ; Tue, 19 May 2015 01:34:34 +0200 (CEST) Received: by pdbqa5 with SMTP id qa5so168780699pdb.0 for ; Mon, 18 May 2015 16:34:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=9Hu8ArXlBZuBmPf214sskUDnEAFt/HBG+Vvl2YG6JFU=; b=jwauZG8FcFfdKrbRqh6ZpXuFMrw37GTXiqSy4+3w3Z+QJ+T6DCJFmkQAjBDIcGqbeh 3eNe5d80h7K9IoWIFmq1Ho2rhDdU9u1YEon6FpGadJhBenH3F0/XSAZaDr7KdND0NAuG pMzgjLlAXy5vwvI8fczvdNLcFsiWbQ+ZccYyRiitSF3L5mJ7FizQekJZ04UlWUb+8231 tcxepEVkfZnTdc3kjydmpX6jv4JUvmWPCQfhEe3fgMOYI7JiST0uGBszdqXlHg4+y1eG qvjBsEG2cwfF37RdXaLXA/Qv178VbjP2gHscrOhm5xUayOXd6HzfzFdPypq0Qto2bb5/ /lzg== X-Received: by 10.70.100.230 with SMTP id fb6mr48471475pdb.29.1431992073815; Mon, 18 May 2015 16:34:33 -0700 (PDT) Received: from localhost.localdomain.com ([144.49.130.148]) by mx.google.com with ESMTPSA id bn7sm11160870pac.22.2015.05.18.16.34.32 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 May 2015 16:34:33 -0700 (PDT) From: Vijayakumar Muthuvel Manickam To: dev@dpdk.org Date: Mon, 18 May 2015 19:33:29 -0400 Message-Id: <1431992009-13573-1-git-send-email-mmvijay@gmail.com> X-Mailer: git-send-email 1.8.1.4 Subject: [dpdk-dev] [PATCH] kni: Add link status update X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 May 2015 23:34:35 -0000 Add an ioctl command in rte_kni module to enable DPDK applications to propagate link state changes to kni virtual interfaces. Signed-off-by: Vijayakumar Muthuvel Manickam --- .../linuxapp/eal/include/exec-env/rte_kni_common.h | 2 ++ lib/librte_eal/linuxapp/kni/kni_misc.c | 39 ++++++++++++++++++++++ lib/librte_kni/rte_kni.c | 18 ++++++++++ lib/librte_kni/rte_kni.h | 17 ++++++++++ 4 files changed, 76 insertions(+) diff --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 index 1e55c2d..b68001d 100644 --- 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 @@ -163,6 +163,7 @@ struct rte_kni_device_info { /* mbuf size */ unsigned mbuf_size; + uint8_t link_state; }; #define KNI_DEVICE "kni" @@ -170,5 +171,6 @@ struct rte_kni_device_info { #define RTE_KNI_IOCTL_TEST _IOWR(0, 1, int) #define RTE_KNI_IOCTL_CREATE _IOWR(0, 2, struct rte_kni_device_info) #define RTE_KNI_IOCTL_RELEASE _IOWR(0, 3, struct rte_kni_device_info) +#define RTE_KNI_IOCTL_LINK_UPDATE _IOWR(0, 4, struct rte_kni_device_info) #endif /* _RTE_KNI_COMMON_H_ */ diff --git a/lib/librte_eal/linuxapp/kni/kni_misc.c b/lib/librte_eal/linuxapp/kni/kni_misc.c index 1935d32..b1015cd 100644 --- a/lib/librte_eal/linuxapp/kni/kni_misc.c +++ b/lib/librte_eal/linuxapp/kni/kni_misc.c @@ -548,6 +548,42 @@ kni_ioctl_release(unsigned int ioctl_num, unsigned long ioctl_param) } static int +kni_ioctl_update_link_state(unsigned int ioctl_num, unsigned long ioctl_param) +{ + int ret = -EINVAL; + struct kni_dev *dev, *n; + struct rte_kni_device_info dev_info; + + if (_IOC_SIZE(ioctl_num) > sizeof(dev_info)) + return -EINVAL; + + ret = copy_from_user(&dev_info, (void *)ioctl_param, sizeof(dev_info)); + if (ret) { + KNI_ERR("copy_from_user in kni_ioctl_update_link_status"); + return -EIO; + } + + if (strlen(dev_info.name) == 0) + return ret; + + down_write(&kni_list_lock); + list_for_each_entry_safe(dev, n, &kni_list_head, list) { + if (strncmp(dev->name, dev_info.name, RTE_KNI_NAMESIZE) != 0) + continue; + + if (dev_info.link_state == 0) + netif_carrier_off(dev->net_dev); + else + netif_carrier_on(dev->net_dev); + ret = 0; + break; + } + up_write(&kni_list_lock); + + return ret; +} + +static int kni_ioctl(struct inode *inode, unsigned int ioctl_num, unsigned long ioctl_param) @@ -569,6 +605,9 @@ kni_ioctl(struct inode *inode, case _IOC_NR(RTE_KNI_IOCTL_RELEASE): ret = kni_ioctl_release(ioctl_num, ioctl_param); break; + case _IOC_NR(RTE_KNI_IOCTL_LINK_UPDATE): + ret = kni_ioctl_update_link_state(ioctl_num, ioctl_param); + break; default: KNI_DBG("IOCTL default \n"); break; diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c index 4e70fa0..b6eda8a 100644 --- a/lib/librte_kni/rte_kni.c +++ b/lib/librte_kni/rte_kni.c @@ -512,6 +512,24 @@ rte_kni_release(struct rte_kni *kni) } int +rte_kni_update_link_state(struct rte_kni *kni, uint8_t if_up) +{ + struct rte_kni_device_info dev_info; + + if (!kni || !kni->in_use) + return -1; + + snprintf(dev_info.name, sizeof(dev_info.name), "%s", kni->name); + dev_info.link_state = if_up; + if (ioctl(kni_fd, RTE_KNI_IOCTL_LINK_UPDATE, &dev_info) < 0) { + RTE_LOG(ERR, KNI, "Fail to update link state\n"); + return -1; + } + + return 0; +} + +int rte_kni_handle_request(struct rte_kni *kni) { unsigned ret; diff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h index 98edd72..a1bafd9 100644 --- a/lib/librte_kni/rte_kni.h +++ b/lib/librte_kni/rte_kni.h @@ -167,6 +167,23 @@ extern struct rte_kni *rte_kni_create(uint8_t port_id, extern int rte_kni_release(struct rte_kni *kni); /** + * Send link state changes to KNI interface in kernel space + * + * rte_kni_update_link_state is thread safe. + * + * @param kni + * The pointer to the context of an existent KNI interface. + * @param if_up + * interface link status + * + * @return + * - 0 indicates success. + * - negative value indicates failure. + */ + +extern int rte_kni_update_link_state(struct rte_kni *kni, uint8_t if_up); + +/** * It is used to handle the request mbufs sent from kernel space. * Then analyzes it and calls the specific actions for the specific requests. * Finally constructs the response mbuf and puts it back to the resp_q. -- 1.8.1.4