From patchwork Wed Feb 14 08:55:17 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arkadi Sharshevsky X-Patchwork-Id: 873286 X-Patchwork-Delegate: shemminger@vyatta.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=Mellanox.com header.i=@Mellanox.com header.b="rvagHTF3"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zhCtr5G69z9t2x for ; Wed, 14 Feb 2018 19:56:20 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966589AbeBNI4S (ORCPT ); Wed, 14 Feb 2018 03:56:18 -0500 Received: from mail-db5eur01on0059.outbound.protection.outlook.com ([104.47.2.59]:51587 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S934695AbeBNIzq (ORCPT ); Wed, 14 Feb 2018 03:55:46 -0500 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=J4bZfD6De9bDROMMtsU2mBp8pj3cxzqCdah3f/1p/5E=; b=rvagHTF3xwDWambd6RRHadd8vHMR9SJDRFZBrO+KCDO1eAiN5vJ6LwWC5M9z3hOMyiw42Qtv+9DrdZIRrpOQfAG6/LVnh/iO/OiDfmgKD2vaLm3Wja5cGz9aGHRY/0hkrZfRBmsGaKd04eXmqrJ/ZckH65gScrZeLjyih5zTReI= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=arkadis@mellanox.com; Received: from dev-r-vrt-156.mtr.labs.mlnx (37.142.13.130) by VI1PR0501MB2461.eurprd05.prod.outlook.com (2603:10a6:800:68::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.485.10; Wed, 14 Feb 2018 08:55:41 +0000 From: Arkadi Sharshevsky To: netdev@vger.kernel.org Cc: davem@davemloft.net, stephen@networkplumber.org, dsa@cumulusnetworks.com, mlxsw@mellanox.com, Arkadi Sharshevsky Subject: [PATCH iproute2 2/7] devlink: mnlg: Add support for extended ack Date: Wed, 14 Feb 2018 10:55:17 +0200 Message-Id: <1518598522-27713-3-git-send-email-arkadis@mellanox.com> X-Mailer: git-send-email 2.4.11 In-Reply-To: <1518598522-27713-1-git-send-email-arkadis@mellanox.com> References: <1518598522-27713-1-git-send-email-arkadis@mellanox.com> MIME-Version: 1.0 X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: HE1PR0102CA0039.eurprd01.prod.exchangelabs.com (2603:10a6:7:7d::16) To VI1PR0501MB2461.eurprd05.prod.outlook.com (2603:10a6:800:68::12) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 5309788b-0c7d-48eb-4c25-08d57388ba95 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0501MB2461; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0501MB2461; 3:Z38T0Yhh196iH3EmRND93g/s64yujmfqSkFvXOq/hAeUqrKMc65Nz6X1DpWu/nASn13q7h1jJsrDleI1I/oGjGeayB/IBbePSxfhhgI18sVtsPPHHVrWMG4woglLsCu9EzxPYmJatjRmvVPUZdOv/AdSVo6pZuB60+J/vsYKmonxWqXXumpKTnHJpoUsfhw5r9ujaAtynpd/3qv84LK1s9rsNEXQnoJT72Cexg5hjYQWFXNj0zm/W+4IL91hWLfK; 25:elBJV2m6RSzxJf5xCOctCGHGiTvJy+2rxi4gvbxkUsuBSKVyc8V3XgWahhWjcIj0o+9e7Y9LgzQvm5tnRZKNkmuxeBNc2vdi+NlnCUk5QtaCcn3k4q4nQUJZRWkw8cGGkSjn1UtXl2rTeJ8lx0Q63jYZhZeh+fxtm4PE0JS1NrD8kinVZsgDZ06MIi54YEndVEVZKGNIlTsq1rL1+TeN6N7v5nfFTcQtLoaNOf9XejrRW7opsriEaw7m4UNFwc1PkmRCENvt1xtta2F4qGMOTQ6In8WoPanhEqVuk5cc+Zvm8lgoJEqsTAuL1aFlPuLn43Vy0EONgsaeSzAaHkWRuw==; 31:gzAy9OuSIPfi6cMR+shngzs8KIrvyzULe2Y691Lqx+g1wsxFMACFGsKS5AOEb5YIUdbyv88LUq424tp0wvVPI2n1o60F3cHHS1v+wd3V/11cLRkPJrhZO8u2aKSPR25SbSTHvoQsatIricH7xSmhQnexYD73H8bzrWfGHPRTTC7d39kRokOlEmmUKY3TfrxKr52GTUWS1fF+dBFIB/+Ls2CG/MCzZSblJh9K2TnUwko= X-MS-TrafficTypeDiagnostic: VI1PR0501MB2461: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0501MB2461; 20:v6YZpcAYbrzLmqvW2ZAJffM72RMdoBdTSEkmou7IVfJZmE/2aUNQ8KRrCwBhYS9/SfZcwtzSGreZoszF/TP3F928yhzxda7217rghzmwNL0FYuyzH4Oij/PgfCLd51plZIrw7NEKdt7ULF9dvqSWoJTlG4jZhj0CXznAjvTHshGLw3+PGIRihy9Z10txQfKKuuL4wqb2AuSrgrCzVo5MGfEwW0oppCHmV6KdHr6NLMIBZPJY2tSpasRNVQ1u+hwkyzeHm9hHbfQdFNyAkWmMF0XJLf6rUY2RCBjgWtf4CvIJkJa4vbaRY/pH8xtcKofaJR3qVtcM/s9OjrJn8oCqyRkt+gTtKaAUG63PKzxRlyCdGH7GXhT2a7sIH6tOU8hmZ93t21UmrCGMUqhT1klzyY4wIXY65A/6jPmzrJjJ5lJgwrEER/hJWO766XcChFNglcOLNKJ0Z27Gvq13StCBipFMBzsuaY9lfpX5XWxft+XWuigMu8Dg0nwtAv/FHuRs; 4:E7kqOBG0TOrwAlPEVYIcgdOom7RLmW67n43HKSETw4ZURiCRLDkXwg8WnhhOmL1m7IYMY1kwpYSUkjzdZ7oLUHonIU2R+fsg4Cdxr/muSpO4bBiC2tzDozrZFZ1qCOiWfS/7bn+pa343ag+NPaT5arvICFMP5RalzngNN0R/LjsU+YzawMBcgJKiUStvYI2WQ5u2W9eREHm2hn4rsFlzcekRmTEiRjIyNFYudpzqMYfM/pQJDkhpBpO3/afBVu4BkF8J32HEgckt3svOTxGetw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3231101)(944501161)(10201501046)(3002001)(93006095)(93001095)(6055026)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123560045)(20161123564045)(20161123562045)(6072148)(201708071742011); SRVR:VI1PR0501MB2461; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0501MB2461; X-Forefront-PRVS: 0583A86C08 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(39380400002)(39860400002)(366004)(396003)(376002)(189003)(199004)(50226002)(81156014)(2361001)(6116002)(6512007)(7736002)(26005)(86362001)(3846002)(81166006)(47776003)(305945005)(107886003)(316002)(6506007)(106356001)(8676002)(16586007)(53936002)(478600001)(386003)(5660300001)(76176011)(25786009)(48376002)(52116002)(4326008)(2950100002)(6916009)(97736004)(6666003)(8936002)(66066001)(2906002)(68736007)(2351001)(36756003)(105586002)(186003)(50466002)(16526019)(59450400001)(6486002)(51416003); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0501MB2461; H:dev-r-vrt-156.mtr.labs.mlnx; 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: 1; VI1PR0501MB2461; 23:FubuRxDNEM0i4C0etDglDNbJKwnDhepqp+Qq+RfLd/ggYadyLpprlCCenhZAXcBNk9UmqTDpRw/zMr/1tz+iFBPklj/zEgDX8rsEzTxpMqpIlLVDxafSbW5lHZVEDDQ4E8os4xHxdY7KWYCWN07HIzNq2DXb0/PjLgraS/WMnbTER2+0QCMd+7Nv7SejK1c5c1vdoycIE6ae6fGJGiAF4jI6ktVJqf7MiZKuwXhjKQILj4vPXHW5YL6u8RUmID7W0/8iygV+TkScW4uLDob65awSsc24xGUnrR8yeJICV8kbakFMW1tsB2nBcjOx9yL3w1vZfuApeZT4N2otkUVRBwc0t4V/neOtJW2vc1qydx9Rabp0umX8ua+wCpPD4SWjmG76DSW57yR4/s9drTccKb0ZsAkaCwduS5I7QRwIw9E0NvpFsIDuOp5CaOvgg3ygMjnqsosIrGOT+zlTEs4ZQskd8v8VE/1UNvBehV4zklVNShT8XZ4P6RR+VPD9TmHTEojN/FVGIPWJRaM6sUYJFPMusnOy+M9RwNmPcL3An3PDNJsGGKmTfXCiizcnbLC7hn8Fs1vWVe9BE6qLnVUoOEbgthsaJX/2JTSUvKp7j8+4HwxL9ztCaZk0q260gGSE9cvKZQ8ldC+i1gyc6SB/qyYjgH4azTfDeBcnb1jEtSSjrJunKLF0DbNZOz3rGjdVPSxRAoqAXHRiWThdhVpVEFpiaA7ahdyg4iEq1AgZkr+OBiudbHj+TtIlR8tXJ/2ga62LAzLMaxNsNcKB9EX3tN6B6TfJ8PWdTX1uE7rS7Q7OtuVSkI3E6FSRzX7abO9rKttZNlvMixGrOvn4X3moCJSok9y3SvNmfe9fbXRjyWzyPOowUN7LALVyntPU1Dkf2HMD/AFaJGsaEMbglDnyk8HGRN5thZZdkJuDj7x4PO80Jvz8DONf/BjQHxwyAb2r2bcOfDwEteBJYlMnN28ihsPsX2t+PuGkNJrOpJ51QmWWpbBh+sA7YYRu3RHQZH+kXcIhknEkHibDLRoEqiQWcAYqAV+O1M0oknw3V7QEnru5W7m0HrFROr9vwwTf5RZLRZbLGuCOhAs9uvj+FXDwLsix/JiZlGUkXWJYsHrFQEfuoO1801bFu7frdKnvFJ9ktK8suMN2nIDlVyXYTzaKbdXhXhb8EY3L90qD4PFjLNM= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0501MB2461; 6:cVbWd796wSvBYsDEtBVAjpMtKXCJLi0V674IkINUBLMbKoNTPYm+bYPRIa0I4m4kfOthxCWwxeGlK9E71T99EZIkXBc+XvlGhQTz+1sC0Ch/1kK1zZGgcWdbA/OmQZ64kkLBNSlkf4huHHXbwROMUn8fV3Di4FzqBUblbAZvgUya3eBW62L7PW6oKzd1CMdAbxvhnuSzoP//D7VDNm2+WUjyjq7fjsC/q4N8pSn4+uuMaaFom7f/J0EZk0oLvg4bYMVulxx4u/+7wl8kcJQttnph4N/sp533W3t2R2T7BUSztu2J7gbWsXJdISWI0uePaZhZazCxL9iMBXDKXlPOUQsQwRu3+MrrQ5fTjXQKx4I=; 5:8ZipEFwgcIFkNCRb9QQEK//R34ecotr+uDxoSHjRGqJKQ2TLxqFlBGz9eOvk9v4hFOrVZzsAM1K2z2jUhUziqiJHuJK/XdnJ2LpeIZSuWoVWMZXm0vq6B3v1dnZreMNxWQWfQh60YyHH12UibkNrW2FTLoAspGXyCHkFiaVkXEk=; 24:2PpwbVe11N1qElYSCnNxX5Ws7rnRILsrzwzKKAJGzXQQj8cgaEiW5yyJArD97j1ClWuLaqryjnE+j/4Cl1ZsksBMB/hGFATxpoUdhWSBu2g=; 7:a6V4x+7tICA17o/Mxwshw7CiBkZvxz4fUtUplYyAHWnggALbhJ7YP936pPYuMAkpmTVrlfdoX35sHLvZZZG5SBegbLf/F/h1mQZc80UuOpqnUKvF/ZuvwPlrqQJxp+GRF7Q5ePZTsaiMNP44LsE32oNXaOSqOf/4oHjQdr/nGHkyD/fZivfWbVS2MC4MuiEvNwxYC5FX+iJbHzfet/baKQf7nIXpf8LDGn+xt2mGZvMRu9vHeOiSgvBiOvFS3bRo SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Feb 2018 08:55:41.2448 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5309788b-0c7d-48eb-4c25-08d57388ba95 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0501MB2461 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add support for extended ack. Signed-off-by: Arkadi Sharshevsky Acked-by: Jiri Pirko --- devlink/mnlg.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++-- include/libnetlink.h | 1 + lib/libnetlink.c | 4 ++-- 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/devlink/mnlg.c b/devlink/mnlg.c index 9e27de2..37c5687 100644 --- a/devlink/mnlg.c +++ b/devlink/mnlg.c @@ -18,6 +18,8 @@ #include #include +#include "libnetlink.h" +#include "utils.h" #include "mnlg.h" struct mnlg_socket { @@ -60,6 +62,39 @@ int mnlg_socket_send(struct mnlg_socket *nlg, const struct nlmsghdr *nlh) return mnl_socket_sendto(nlg->nl, nlh, nlh->nlmsg_len); } +static int mnlg_cb_noop(const struct nlmsghdr *nlh, void *data) +{ + return MNL_CB_OK; +} + +static int mnlg_cb_error(const struct nlmsghdr *nlh, void *data) +{ + const struct nlmsgerr *err = mnl_nlmsg_get_payload(nlh); + + if (nl_dump_ext_ack(nlh, NULL)) + return MNL_CB_STOP; + + /* Netlink subsystems returns the errno value with different signess */ + if (err->error < 0) + errno = -err->error; + else + errno = err->error; + + return err->error == 0 ? MNL_CB_STOP : MNL_CB_ERROR; +} + +static int mnlg_cb_stop(const struct nlmsghdr *nlh, void *data) +{ + return MNL_CB_STOP; +} + +static mnl_cb_t mnlg_cb_array[NLMSG_MIN_TYPE] = { + [NLMSG_NOOP] = mnlg_cb_noop, + [NLMSG_ERROR] = mnlg_cb_error, + [NLMSG_DONE] = mnlg_cb_stop, + [NLMSG_OVERRUN] = mnlg_cb_noop, +}; + int mnlg_socket_recv_run(struct mnlg_socket *nlg, mnl_cb_t data_cb, void *data) { int err; @@ -69,8 +104,9 @@ int mnlg_socket_recv_run(struct mnlg_socket *nlg, mnl_cb_t data_cb, void *data) MNL_SOCKET_BUFFER_SIZE); if (err <= 0) break; - err = mnl_cb_run(nlg->buf, err, nlg->seq, nlg->portid, - data_cb, data); + err = mnl_cb_run2(nlg->buf, err, nlg->seq, nlg->portid, + data_cb, data, mnlg_cb_array, + ARRAY_SIZE(mnlg_cb_array)); } while (err > 0); return err; @@ -220,6 +256,7 @@ struct mnlg_socket *mnlg_socket_open(const char *family_name, uint8_t version) { struct mnlg_socket *nlg; struct nlmsghdr *nlh; + int one = 1; int err; nlg = malloc(sizeof(*nlg)); @@ -234,6 +271,16 @@ struct mnlg_socket *mnlg_socket_open(const char *family_name, uint8_t version) if (!nlg->nl) goto err_mnl_socket_open; + err = mnl_socket_setsockopt(nlg->nl, NETLINK_CAP_ACK, &one, + sizeof(one)); + if (err) + goto err_mnl_set_ack; + + err = mnl_socket_setsockopt(nlg->nl, NETLINK_EXT_ACK, &one, + sizeof(one)); + if (err) + goto err_mnl_set_ext_ack; + err = mnl_socket_bind(nlg->nl, 0, MNL_SOCKET_AUTOPID); if (err < 0) goto err_mnl_socket_bind; @@ -258,6 +305,8 @@ struct mnlg_socket *mnlg_socket_open(const char *family_name, uint8_t version) err_mnlg_socket_recv_run: err_mnlg_socket_send: err_mnl_socket_bind: +err_mnl_set_ext_ack: +err_mnl_set_ack: mnl_socket_close(nlg->nl); err_mnl_socket_open: free(nlg->buf); diff --git a/include/libnetlink.h b/include/libnetlink.h index d632219..9d9249e 100644 --- a/include/libnetlink.h +++ b/include/libnetlink.h @@ -109,6 +109,7 @@ int rtnl_send(struct rtnl_handle *rth, const void *buf, int) __attribute__((warn_unused_result)); int rtnl_send_check(struct rtnl_handle *rth, const void *buf, int) __attribute__((warn_unused_result)); +int nl_dump_ext_ack(const struct nlmsghdr *nlh, nl_ext_ack_fn_t errfn); int addattr(struct nlmsghdr *n, int maxlen, int type); int addattr8(struct nlmsghdr *n, int maxlen, int type, __u8 data); diff --git a/lib/libnetlink.c b/lib/libnetlink.c index 7ca47b2..8bb1c8d 100644 --- a/lib/libnetlink.c +++ b/lib/libnetlink.c @@ -65,7 +65,7 @@ static int err_attr_cb(const struct nlattr *attr, void *data) } /* dump netlink extended ack error message */ -static int nl_dump_ext_ack(const struct nlmsghdr *nlh, nl_ext_ack_fn_t errfn) +int nl_dump_ext_ack(const struct nlmsghdr *nlh, nl_ext_ack_fn_t errfn) { struct nlattr *tb[NLMSGERR_ATTR_MAX + 1] = {}; const struct nlmsgerr *err = mnl_nlmsg_get_payload(nlh); @@ -120,7 +120,7 @@ static int nl_dump_ext_ack(const struct nlmsghdr *nlh, nl_ext_ack_fn_t errfn) #warning "libmnl required for error support" /* No extended error ack without libmnl */ -static int nl_dump_ext_ack(const struct nlmsghdr *nlh, nl_ext_ack_fn_t errfn) +int nl_dump_ext_ack(const struct nlmsghdr *nlh, nl_ext_ack_fn_t errfn) { return 0; }