From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0074.outbound.protection.outlook.com [104.47.1.74]) by dpdk.org (Postfix) with ESMTP id BB20E1B05; Tue, 27 Feb 2018 15:22:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=9RIlP4r/ezI2zLnPZabtVUrmx1xv0hKcnWFwZ4DWvHc=; b=WQ4igiH7lkRvJsE/5MlyFyrElQUQdu8SRQv5VdeoZBlg3y12CUazcAYZQzMvszyBWY8/Ijz5RI0FqMHa3R2JBbILIKsvYff9mWe1XysOjeUbDIR4aLRhvRyWsA1YOHlXghW+q6ED2HF6S5a2yUX1vOO1csy2OB8yns4sEpDgAvU= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=matan@mellanox.com; Received: from mellanox.com (37.142.13.130) by HE1PR0501MB2666.eurprd05.prod.outlook.com (2603:10a6:3:cb::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.527.15; Tue, 27 Feb 2018 14:22:30 +0000 From: Matan Azrad To: dev@dpdk.org Cc: stable@dpdk.org, stephen@networkplumber.org Date: Tue, 27 Feb 2018 14:22:03 +0000 Message-Id: <1519741323-9881-1-git-send-email-matan@mellanox.com> X-Mailer: git-send-email 1.9.5 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: VI1PR0102CA0024.eurprd01.prod.exchangelabs.com (2603:10a6:802::37) To HE1PR0501MB2666.eurprd05.prod.outlook.com (2603:10a6:3:cb::20) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 364107a3-2327-4e73-fe08-08d57ded898e X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(4627221)(201703031133081)(201702281549075)(48565401081)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:HE1PR0501MB2666; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0501MB2666; 3:Do9CxhL0qhkjLu5m9DT6Jd7MxW8pBb429tzTqchyxFu4IcLUq1XSnJB/tb6AD3+ahmZb3US+/dD65YXnM3tmaQrpcUuN4Z4baPVf8+RFt3p1r7FgNYlqNMf2lusUUcb9tY1Z9itq/37uXgtwziRI0mfVo1ELgXS0LLrFoxOV9oFKm973xblBWeNQeCJs47ak/04XZIKER+noM5gE2dr0zeHrh2X4Il4IkM6cxGzwckMNHM5jM+OhlWJcQvzpG5Ua; 25:KkM+7zmqglap4wgxk4FYxKSP36BPG+uX9zTSVmPmDnu27h22yqD0pidwv3YQB0OvFhcPAUvGhSybPU9P/HtpzdANVeqnk3C/6zH/zyKOeBoyeWZOLz/XfV+JRtHAZY0FBlzclfCaLfZXFeUY97li/20TXm1SAnufurraXv8jyrkBi8Hti1zWzsvhp04bh1VcTOgxcdmSNwm0qkFos433iaAXa0oIQd3Dr4cZcAvWu9egf/q277bzGe4athsM+JHueQlxg2KWQ1NbWwbHR09xKM0RrURW5qE8IPmJLEoWDdMRp0fKM9Huj0uDlQbI0tln7JEm0ZH4eQqxnNLHUX/54g==; 31:6C0CZO/5pVKYEe2Oc+c0MCrnGC4DhrYs8v0BQFKayIufTe83YTCS738sOWdS0A3n9V4KFLbXXmR/xf/RRfa0fWVEEflmmeuPn55C76zBhrvrJICkirtRZy7j5oihynyIZ30m9nsCJmYKWzp8S2hx38b9mFF+EywflSkmZYQjiBxqbtIaLo5pRdtTkQW2TSzwDvXtsg6wz9kDhUOgjHjtBcKqJCWKwXsE9Qqwh4IEO/w= X-MS-TrafficTypeDiagnostic: HE1PR0501MB2666: X-Microsoft-Exchange-Diagnostics: 1; HE1PR0501MB2666; 20:c9aKL3E4OiwzCTvkYXQWGTLtB1LGqtb8fcyDgvg1SA+Pop2bTSY6T30RzI8Xm9lFgRnsTh0q7/9b+wwkWlQZ1NsfrFAsCrDxyPDPnztyo0CJxTeugRUuRczsalmGvaLYgeLF5rIav+RIFSTrU1pe8KBDZWR+zf53/USYFURbuopUDmYuUllEsc7EbhBcaDhRpacBllQp6W4mZO4sSiX+FE3pJI2lpTXmkg0YTqaGZzzIOdBpvGOPgWbre+GsERvUaGGSAFh5j5O6KNlYi3vby81mVR8BDRdXp7cH1SX1Cromuza9izSSrgrbGtUJR/mSEuguiyigxsijFo2lMueN6AEAHtFGSs2aIA5f0aZjaA+JON4qAQYKjEjKIbEL8GtySbdTiHUljfOfF7+5FNzZ0RbJgKuxOrsPFmnie0K7MkAMd+Gm3ryVt7EY4gfKIZyr/ckLvmYQwxLW78vqFNsUWCeArMU8gaoH8ymXoFXAbEknVS64PUjUiMoGnimA1slB; 4:hEujO0qwx6AELj6xuA1KYqwTT9rhsUVro6PRCxYg3Ma+knaVAWBtdLp7uYHtb6UZJbRk2pqqiXwXYeVApfhpymS7E3FNr62DCvyZ7Va44UdltZyXDvbcldRm1KQsidjrr8qcGAv//FywETxbPjh8aRO3R3UNB3M50YyiKNeeCCDa5ovJC6SP7M6rQDXHQI5Wdn5JP+kUbsVN8jcmjn5LbAKfdBPMeUmbz9cKl8dZKqwFKQQkye1aty3PJ1FMnV6VMBVPkkMsVWLT5xGbxVIr9g== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040501)(2401047)(8121501046)(5005006)(3231220)(944501161)(3002001)(93006095)(93001095)(10201501046)(6055026)(6041288)(20161123558120)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123562045)(6072148)(201708071742011); SRVR:HE1PR0501MB2666; BCL:0; PCL:0; RULEID:; SRVR:HE1PR0501MB2666; X-Forefront-PRVS: 05961EBAFC X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(376002)(39860400002)(366004)(346002)(396003)(39380400002)(189003)(199004)(6116002)(53936002)(316002)(1857600001)(16526019)(3846002)(48376002)(386003)(6666003)(26005)(50466002)(16586007)(2351001)(6916009)(68736007)(21086003)(59450400001)(2361001)(86362001)(5660300001)(105586002)(106356001)(8676002)(186003)(4326008)(97736004)(50226002)(25786009)(36756003)(81166006)(55016002)(69596002)(2906002)(305945005)(7736002)(66066001)(8936002)(47776003)(81156014)(478600001)(33026002)(7696005)(51416003)(52116002); DIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR0501MB2666; H:mellanox.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR0501MB2666; 23:uplRu7RJzaau3rRXFGapoNU+AmxkxEr5uNA8y4v?= =?us-ascii?Q?tYdFZWutrnfZoNVAzuISxuw1Z5SliETt7AjLcEuiCBt0J1JapaDva+VfXyCa?= =?us-ascii?Q?dgT3zRS6vIWx4zgWKyrAy1YIm4/GsRx69pmCUaMJDQ/QN+ifP7LkmSZAKuxz?= =?us-ascii?Q?6D6AEfmRJV5wX9xjGeffXkU+PZ55p9G3cYmh+o7+DoBjd0abFW2ftIlnYiFl?= =?us-ascii?Q?Ct1BvPnjtGDvMKvU/4C8jm9ffdkPKerwM9xfdV/m32bm4++fAqtwQxofZmTn?= =?us-ascii?Q?bp6p8o9paIsk5gcjILp4hoZ+PglEiCBXfybJG/QWIhRWz0OmGyRiaIk4hnUM?= =?us-ascii?Q?NtWsUxPUAfx2fzTNk6LI2lJl+3tTzZef8UeLr27IWxVWgtOv92ZxIK2qdxkz?= =?us-ascii?Q?tEFSThc/aqF+oWOqVoTBVdMGbkRbxectw8WMCbgVgFc3QvVF6zrBrD8tc7BQ?= =?us-ascii?Q?EDya19I2aGaYs27JC9RJX1ph4CjvTN7CiSH2a8n5HkeHTBjO7ZLAvfnzjGbK?= =?us-ascii?Q?HRE0Zw7fS2xSGAn7jdWuhs4+p9vDS53fmLuWMYdLGAyxxTSEg5EiitqJBHz6?= =?us-ascii?Q?+rFNTBwcHyaJmcDR6xY2dHGjI6c+8F3wd9ZQ79Se8l7VCEaoU4bKpEyLVIzC?= =?us-ascii?Q?yEb9PUiwS6UQXzqH7vZUxXwjI7/fKFLejOW6frbaD/EmdmzEYjC2McsZ3tiq?= =?us-ascii?Q?P3nMt44QliDOInzTtQ47KnmKuCKBL0+KAg2hg6x+EOkKlAt0rjANmSEK1auI?= =?us-ascii?Q?bj/I5ha8C5BKOQyCkGK0d3mImgwMi4FTSxmdL8v7rSDA0pV/kCKm1P0z0RLz?= =?us-ascii?Q?2NqWSxntxWAQETDtPDM4s3buMKTj4RHCQT5ZAQpLQtKFZIr+VZ9W1PC3d99r?= =?us-ascii?Q?FE3VEm2FBG3T3yOQOJRz4/kBq2G/7MXmI9nNebGXUN9SK2uhTK5Wsg3f6B6Q?= =?us-ascii?Q?Maug4COusUXbJFgSJ+sItkHC/l+gSEAlCGlHogi9FKXDX08Yx2CSeMuhuT3Q?= =?us-ascii?Q?QbGGZ4JNHS/c5T+/3CuU5x6Lr7XfzIiaFsFRKUe8hEUOtVwPwvOtkHRDTKEv?= =?us-ascii?Q?0q5h7+21Ab3TfcTNuEpby/vqoH8MMZUI2XwUet6zIvhinPRQTX8BjBO5WM5R?= =?us-ascii?Q?lGE/3v4tpQ/KN2xTibRXvBqeg3XkLQIfWWfaqZO8m2/dazix0ot7tJ4Lhi/G?= =?us-ascii?Q?nsuux4q2jVo5xzm0=3D?= X-Microsoft-Exchange-Diagnostics: 1; HE1PR0501MB2666; 6:fLStV8SSIAkmX8UULq0GBYLuXBPLIUKMmwvUn8V06+WkayzZkjuFCIxROuOLbhadZUT3w6jsgyH3qzTpsfjPi3bsYYk9SZlXhhHpsXiu0Qp60Dk5c2rAtCaEVpCJpA1pJyrtrQYgs4Z0V0bXCOhG+sYCDKo+lcVh32/qhvKNnZaHG9czIzqoNbyxBHPhHbXkryhkB6p33TqRwuKHb+Ol6ayCJ7aOzQAk7P/Bmoi/4ITMcUz2uzwClfdd6IJsdPmXYVTG+V8OR9RlPTXdTddUhM+FpyZmdt/LfUF56dI2+NbqjpsHn1c5XpIwNzup7u94yY1F5bmuJcR5YR42CsCr+fpen87B51GZN1Q2Wp0ld+c=; 5:59edmZMYYwZ0DCdRSAaTHtIL+fhvSQy1yFerIstUOHMuLjn+BebwhkYk+1zcO1RYEqX7/o1z3jRhepi8O5M3rWn9Upf5ynf0BMVKDlgXvvMTzMLUXaYvQVZXXI2YAApZg+6cydg1bLwuZqmSiUhvRtbWDL+Yh4bDhXVWEWBTE04=; 24:WpdyZ9+NYlFQj4VG07ILRrN0S+2aJioGfx+CTkYcnrFETW1W+jbPcLHrOEOkyci2JS8NdjfnpemoPmdkn/o3RA2utt06mUxR2BvfAEhA4fM=; 7:xkgRXjgKlX20b5QSxVBZSm4+SfuBz0vFVvHAXcO14AGB+s5CcizOxv6APAhsqeHT2diYaXNqvJnI+arOn9tVi3B1Gq/DnBAVZoO2WXCsaslksoCFxjOGO9xwzo+UpmFjVg+IetCBrtgoaD6sh1vbGxdrhPXXQZa24anQ0gqAvzs50euqLmbnRuLjPZA2xyWC2f2AqJUamk0omUYL0dRo+jTyDz6Rssf2V4XhTyfHSAEe4WsLkm9qCLFSKJYG6Q4d SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Feb 2018 14:22:30.4020 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 364107a3-2327-4e73-fe08-08d57ded898e X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0501MB2666 Subject: [dpdk-stable] [PATCH] net/vdev_netvsc: fix routed devices probing X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Feb 2018 14:22:33 -0000 NetVSC netdevices which are already routed should not be probed because they are used for management purposes by the HyperV. The corrupted code got the routed devices from the system file /proc/net/route and wrongly parsed only the odd lines, so devices which their routes were in even lines, were considered as unrouted devices and were probed. Use linux netlink lib to detect the routed NetVSC devices instead of file parsing. Fixes: 31182fadfb21 ("net/vdev_netvsc: skip routed netvsc probing") Cc: stable@dpdk.org Cc: stephen@networkplumber.org Suggested-by: Stephen Hemminger Signed-off-by: Matan Azrad --- drivers/net/vdev_netvsc/vdev_netvsc.c | 109 +++++++++++++++++++++++++++------- 1 file changed, 86 insertions(+), 23 deletions(-) diff --git a/drivers/net/vdev_netvsc/vdev_netvsc.c b/drivers/net/vdev_netvsc/vdev_netvsc.c index cbf4d59..db0080a 100644 --- a/drivers/net/vdev_netvsc/vdev_netvsc.c +++ b/drivers/net/vdev_netvsc/vdev_netvsc.c @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include #include #include @@ -207,36 +209,96 @@ static LIST_HEAD(, vdev_netvsc_ctx) vdev_netvsc_ctx_list = * * @param[in] name * Network device name. + * @param[in] family + * Address family: AF_INET for IPv4 or AF_INET6 for IPv6. * * @return - * A nonzero value when interface has an route. In case of error, - * rte_errno is updated and 0 returned. + * 1 when interface has a route, negative errno value in case of error and + * 0 otherwise. */ static int -vdev_netvsc_has_route(const char *name) +vdev_netvsc_has_route(const struct if_nameindex *iface, + const unsigned char family) { - FILE *fp; + /* + * The implementation can be simpler by getifaddrs() function usage but + * it works for IPv6 only starting from glibc 2.3.3. + */ + char buf[4096]; + int len; int ret = 0; - char route[NETVSC_MAX_ROUTE_LINE_SIZE]; - char *netdev; - - fp = fopen("/proc/net/route", "r"); - if (!fp) { - rte_errno = errno; - return 0; + int res; + int sock; + struct nlmsghdr *retmsg = (struct nlmsghdr *)buf; + struct sockaddr_nl sa; + struct { + struct nlmsghdr nlhdr; + struct ifaddrmsg addrmsg; + } msg; + + if (!iface || (family != AF_INET && family != AF_INET6)) { + DRV_LOG(ERR, "%s", rte_strerror(EINVAL)); + return -EINVAL; } - while (fgets(route, NETVSC_MAX_ROUTE_LINE_SIZE, fp) != NULL) { - netdev = strtok(route, "\t"); - if (strcmp(netdev, name) == 0) { - ret = 1; - break; + sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); + if (sock == -1) { + DRV_LOG(ERR, "cannot open socket: %s", rte_strerror(errno)); + return -errno; + } + memset(&sa, 0, sizeof(sa)); + sa.nl_family = AF_NETLINK; + sa.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR; + res = bind(sock, (struct sockaddr *)&sa, sizeof(sa)); + if (res == -1) { + ret = -errno; + DRV_LOG(ERR, "cannot bind socket: %s", rte_strerror(errno)); + goto close; + } + memset(&msg, 0, sizeof(msg)); + msg.nlhdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)); + msg.nlhdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP; + msg.nlhdr.nlmsg_type = RTM_GETADDR; + msg.nlhdr.nlmsg_pid = getpid(); + msg.addrmsg.ifa_family = family; + msg.addrmsg.ifa_index = iface->if_index; + res = send(sock, &msg, msg.nlhdr.nlmsg_len, 0); + if (res == -1) { + ret = -errno; + DRV_LOG(ERR, "cannot send socket message: %s", + rte_strerror(errno)); + goto close; + } + memset(buf, 0, sizeof(buf)); + len = recv(sock, buf, sizeof(buf), 0); + if (len == -1) { + ret = -errno; + DRV_LOG(ERR, "cannot receive socket message: %s", + rte_strerror(errno)); + goto close; + } + while (NLMSG_OK(retmsg, (unsigned int)len)) { + struct ifaddrmsg *retaddr = + (struct ifaddrmsg *)NLMSG_DATA(retmsg); + + if (retaddr->ifa_family == family && + retaddr->ifa_index == iface->if_index) { + struct rtattr *retrta = IFA_RTA(retaddr); + int attlen = IFA_PAYLOAD(retmsg); + + while (RTA_OK(retrta, attlen)) { + if (retrta->rta_type == IFA_ADDRESS) { + ret = 1; + DRV_LOG(DEBUG, "interface %s has IP", + iface->if_name); + goto close; + } + retrta = RTA_NEXT(retrta, attlen); + } } - /* Move file pointer to the next line. */ - while (strchr(route, '\n') == NULL && - fgets(route, NETVSC_MAX_ROUTE_LINE_SIZE, fp) != NULL) - ; + retmsg = NLMSG_NEXT(retmsg, len); } - fclose(fp); +close: + close(sock); return ret; } @@ -505,10 +567,11 @@ static LIST_HEAD(, vdev_netvsc_ctx) vdev_netvsc_ctx_list = iface->if_name, iface->if_index); } /* Routed NetVSC should not be probed. */ - if (vdev_netvsc_has_route(iface->if_name)) { + if (vdev_netvsc_has_route(iface, AF_INET) || + vdev_netvsc_has_route(iface, AF_INET6)) { if (!specified || !force) return 0; - DRV_LOG(WARNING, "using routed NetVSC interface \"%s\"" + DRV_LOG(WARNING, "probably using routed NetVSC interface \"%s\"" " (index %u)", iface->if_name, iface->if_index); } /* Create interface context. */ -- 1.9.5