{"id":830410,"url":"http://patchwork.ozlabs.org/api/1.2/patches/830410/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/patch/1508971954-3567-2-git-send-email-nikolay@cumulusnetworks.com/","project":{"id":7,"url":"http://patchwork.ozlabs.org/api/1.2/projects/7/?format=json","name":"Linux network development","link_name":"netdev","list_id":"netdev.vger.kernel.org","list_email":"netdev@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<1508971954-3567-2-git-send-email-nikolay@cumulusnetworks.com>","list_archive_url":null,"date":"2017-10-25T22:52:33","name":"[net-next,v4,1/2] bridge: netlink: make setlink/dellink notifications more accurate","commit_ref":null,"pull_url":null,"state":"changes-requested","archived":true,"hash":"efc9663135aa6dc1b5476b8582e5e0d4b0b472a4","submitter":{"id":66448,"url":"http://patchwork.ozlabs.org/api/1.2/people/66448/?format=json","name":"Nikolay Aleksandrov","email":"nikolay@cumulusnetworks.com"},"delegate":{"id":34,"url":"http://patchwork.ozlabs.org/api/1.2/users/34/?format=json","username":"davem","first_name":"David","last_name":"Miller","email":"davem@davemloft.net"},"mbox":"http://patchwork.ozlabs.org/project/netdev/patch/1508971954-3567-2-git-send-email-nikolay@cumulusnetworks.com/mbox/","series":[{"id":10239,"url":"http://patchwork.ozlabs.org/api/1.2/series/10239/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/list/?series=10239","date":"2017-10-25T22:52:32","name":"bridge: make setlink/dellink notifications more accurate","version":4,"mbox":"http://patchwork.ozlabs.org/series/10239/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/830410/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/830410/checks/","tags":{},"related":[],"headers":{"Return-Path":"<netdev-owner@vger.kernel.org>","X-Original-To":"patchwork-incoming@ozlabs.org","Delivered-To":"patchwork-incoming@ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=cumulusnetworks.com\n\theader.i=@cumulusnetworks.com header.b=\"TXd74mQs\"; \n\tdkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yMln21gWcz9t3Z\n\tfor <patchwork-incoming@ozlabs.org>;\n\tThu, 26 Oct 2017 09:53:58 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751901AbdJYWxy (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tWed, 25 Oct 2017 18:53:54 -0400","from mail-wr0-f193.google.com ([209.85.128.193]:43110 \"EHLO\n\tmail-wr0-f193.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751813AbdJYWxv (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Wed, 25 Oct 2017 18:53:51 -0400","by mail-wr0-f193.google.com with SMTP id w105so1482454wrc.0\n\tfor <netdev@vger.kernel.org>; Wed, 25 Oct 2017 15:53:51 -0700 (PDT)","from debil.mediahub-bg.com (46-10-142-144.ip.btc-net.bg.\n\t[46.10.142.144]) by smtp.gmail.com with ESMTPSA id\n\tk9sm4393483wrk.88.2017.10.25.15.53.48\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tWed, 25 Oct 2017 15:53:48 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=cumulusnetworks.com; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=XKM4wF5iEWYYSYAnc8VOfXtt3mTX16IulkudV0mOtQE=;\n\tb=TXd74mQs6WIi+9ClcC0GcTSAzp6tTklBnogTeWK/fncnmBr+0v4HY7fqqxOgH//b+h\n\tnXuKsdmyH1JrBkmMZnJX6XDUodTAza6C5f5+Ari1U0od5RccHrjO2WTLKUyg3ki5s6HH\n\tHo49QYRn2vO9pqvSo/UJPybFXHGOY12tyaKP8=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=XKM4wF5iEWYYSYAnc8VOfXtt3mTX16IulkudV0mOtQE=;\n\tb=lOxxTKtEtToA5b+5m0g4AEzHPXVxb+T4oSnNdcMSi9wguLIt8DIDZY+ICrf2R7h5c+\n\tzDieb2vVkqH5rcOuDHvc+RmnXmU5GlaCTLKGMbGGO7ZSBMIl9cpvq8Y5AdyPGxJ3eAK6\n\tuZC20x1BpimBnNZ/aZ4IyBo4Wnka9uwTiLLgoWflL7d7YndfsO3Lq0QIKdnKyoU9c7PH\n\tXRkrNdb1zKyqtHJS5z2qMNofkHBIpdoPDCK49ZyOYZ5a22OBilCZsN/S26gGZDQvzNos\n\tAEnSsfL8+r0RvCc//NDF567Gif84AcA5DyUUH//UqTEs3sWq22tR+YORJdKrdoFAHvPH\n\tCvCw==","X-Gm-Message-State":"AMCzsaUlbTmW4JZLoMj/E5uuJQMUPngm5SvPvewmwKEfGtFz1rOmVjlZ\n\tft93IeyVfdUs7duSG3JVcR4zMOQd","X-Google-Smtp-Source":"ABhQp+Qy44ud/+8Ze9mIyipDiOUkZagUeTI169IATG0Oa0P0qqlR1+7dyDDO07WIgv2ZeYGH32Y5Hw==","X-Received":"by 10.223.157.136 with SMTP id p8mr3788200wre.28.1508972030171; \n\tWed, 25 Oct 2017 15:53:50 -0700 (PDT)","From":"Nikolay Aleksandrov <nikolay@cumulusnetworks.com>","To":"netdev@vger.kernel.org","Cc":"dsa@cumulusnetworks.com, mrv@mojatatu.com, davem@davemloft.net,\n\tbridge@lists.linux-foundation.org, roopa@cumulusnetworks.com,\n\tstephen@networkplumber.org,\n\tNikolay Aleksandrov <nikolay@cumulusnetworks.com>","Subject":"[PATCH net-next v4 1/2] bridge: netlink: make setlink/dellink\n\tnotifications more accurate","Date":"Thu, 26 Oct 2017 01:52:33 +0300","Message-Id":"<1508971954-3567-2-git-send-email-nikolay@cumulusnetworks.com>","X-Mailer":"git-send-email 2.1.4","In-Reply-To":"<1508971954-3567-1-git-send-email-nikolay@cumulusnetworks.com>","References":"<f6c0da96-77f0-db19-7a9a-13b246d83d39@cumulusnetworks.com>\n\t<1508971954-3567-1-git-send-email-nikolay@cumulusnetworks.com>","Sender":"netdev-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<netdev.vger.kernel.org>","X-Mailing-List":"netdev@vger.kernel.org"},"content":"Before this patch we had cases that either sent notifications when there\nwere in fact no changes (e.g. non-existent vlan delete) or didn't send\nnotifications when there were changes (e.g. vlan add range with an error in\nthe middle, port flags change + vlan update error). This patch sends down\na boolean to the functions setlink/dellink use and if there is even a\nsingle configuration change (port flag, vlan add/del, port state) then\nwe always send a notification. This is all done to keep backwards\ncompatibility with the opportunistic vlan delete, where one could\nspecify a vlan range that has missing vlans inside and still everything\nin that range will be cleared, this is mostly used to clear the whole\nvlan config with a single call, i.e. range 1-4094.\n\nSigned-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>\n---\n net/bridge/br_netlink.c        | 44 +++++++++++++++++++++++++-----------------\n net/bridge/br_netlink_tunnel.c | 14 +++++++++-----\n net/bridge/br_private_tunnel.h |  3 ++-\n 3 files changed, 37 insertions(+), 24 deletions(-)","diff":"diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c\nindex fb61b6c79235..d0290ede9342 100644\n--- a/net/bridge/br_netlink.c\n+++ b/net/bridge/br_netlink.c\n@@ -506,7 +506,7 @@ int br_getlink(struct sk_buff *skb, u32 pid, u32 seq,\n }\n \n static int br_vlan_info(struct net_bridge *br, struct net_bridge_port *p,\n-\t\t\tint cmd, struct bridge_vlan_info *vinfo)\n+\t\t\tint cmd, struct bridge_vlan_info *vinfo, bool *changed)\n {\n \tint err = 0;\n \n@@ -517,21 +517,24 @@ static int br_vlan_info(struct net_bridge *br, struct net_bridge_port *p,\n \t\t\t * per-VLAN entry as well\n \t\t\t */\n \t\t\terr = nbp_vlan_add(p, vinfo->vid, vinfo->flags);\n-\t\t\tif (err)\n-\t\t\t\tbreak;\n \t\t} else {\n \t\t\tvinfo->flags |= BRIDGE_VLAN_INFO_BRENTRY;\n \t\t\terr = br_vlan_add(br, vinfo->vid, vinfo->flags);\n \t\t}\n+\t\tif (!err)\n+\t\t\t*changed = true;\n \t\tbreak;\n \n \tcase RTM_DELLINK:\n \t\tif (p) {\n-\t\t\tnbp_vlan_delete(p, vinfo->vid);\n-\t\t\tif (vinfo->flags & BRIDGE_VLAN_INFO_MASTER)\n-\t\t\t\tbr_vlan_delete(p->br, vinfo->vid);\n-\t\t} else {\n-\t\t\tbr_vlan_delete(br, vinfo->vid);\n+\t\t\tif (!nbp_vlan_delete(p, vinfo->vid))\n+\t\t\t\t*changed = true;\n+\n+\t\t\tif ((vinfo->flags & BRIDGE_VLAN_INFO_MASTER) &&\n+\t\t\t    !br_vlan_delete(p->br, vinfo->vid))\n+\t\t\t\t*changed = true;\n+\t\t} else if (!br_vlan_delete(br, vinfo->vid)) {\n+\t\t\t*changed = true;\n \t\t}\n \t\tbreak;\n \t}\n@@ -542,7 +545,8 @@ static int br_vlan_info(struct net_bridge *br, struct net_bridge_port *p,\n static int br_process_vlan_info(struct net_bridge *br,\n \t\t\t\tstruct net_bridge_port *p, int cmd,\n \t\t\t\tstruct bridge_vlan_info *vinfo_curr,\n-\t\t\t\tstruct bridge_vlan_info **vinfo_last)\n+\t\t\t\tstruct bridge_vlan_info **vinfo_last,\n+\t\t\t\tbool *changed)\n {\n \tif (!vinfo_curr->vid || vinfo_curr->vid >= VLAN_VID_MASK)\n \t\treturn -EINVAL;\n@@ -572,7 +576,7 @@ static int br_process_vlan_info(struct net_bridge *br,\n \t\t       sizeof(struct bridge_vlan_info));\n \t\tfor (v = (*vinfo_last)->vid; v <= vinfo_curr->vid; v++) {\n \t\t\ttmp_vinfo.vid = v;\n-\t\t\terr = br_vlan_info(br, p, cmd, &tmp_vinfo);\n+\t\t\terr = br_vlan_info(br, p, cmd, &tmp_vinfo, changed);\n \t\t\tif (err)\n \t\t\t\tbreak;\n \t\t}\n@@ -581,13 +585,13 @@ static int br_process_vlan_info(struct net_bridge *br,\n \t\treturn err;\n \t}\n \n-\treturn br_vlan_info(br, p, cmd, vinfo_curr);\n+\treturn br_vlan_info(br, p, cmd, vinfo_curr, changed);\n }\n \n static int br_afspec(struct net_bridge *br,\n \t\t     struct net_bridge_port *p,\n \t\t     struct nlattr *af_spec,\n-\t\t     int cmd)\n+\t\t     int cmd, bool *changed)\n {\n \tstruct bridge_vlan_info *vinfo_curr = NULL;\n \tstruct bridge_vlan_info *vinfo_last = NULL;\n@@ -607,7 +611,8 @@ static int br_afspec(struct net_bridge *br,\n \t\t\t\treturn err;\n \t\t\terr = br_process_vlan_tunnel_info(br, p, cmd,\n \t\t\t\t\t\t\t  &tinfo_curr,\n-\t\t\t\t\t\t\t  &tinfo_last);\n+\t\t\t\t\t\t\t  &tinfo_last,\n+\t\t\t\t\t\t\t  changed);\n \t\t\tif (err)\n \t\t\t\treturn err;\n \t\t\tbreak;\n@@ -616,7 +621,7 @@ static int br_afspec(struct net_bridge *br,\n \t\t\t\treturn -EINVAL;\n \t\t\tvinfo_curr = nla_data(attr);\n \t\t\terr = br_process_vlan_info(br, p, cmd, vinfo_curr,\n-\t\t\t\t\t\t   &vinfo_last);\n+\t\t\t\t\t\t   &vinfo_last, changed);\n \t\t\tif (err)\n \t\t\t\treturn err;\n \t\t\tbreak;\n@@ -804,6 +809,7 @@ int br_setlink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags)\n \tstruct nlattr *afspec;\n \tstruct net_bridge_port *p;\n \tstruct nlattr *tb[IFLA_BRPORT_MAX + 1];\n+\tbool changed = false;\n \tint err = 0;\n \n \tprotinfo = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_PROTINFO);\n@@ -839,14 +845,15 @@ int br_setlink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags)\n \t\t}\n \t\tif (err)\n \t\t\tgoto out;\n+\t\tchanged = true;\n \t}\n \n \tif (afspec) {\n \t\terr = br_afspec((struct net_bridge *)netdev_priv(dev), p,\n-\t\t\t\tafspec, RTM_SETLINK);\n+\t\t\t\tafspec, RTM_SETLINK, &changed);\n \t}\n \n-\tif (err == 0)\n+\tif (changed)\n \t\tbr_ifinfo_notify(RTM_NEWLINK, p);\n out:\n \treturn err;\n@@ -857,6 +864,7 @@ int br_dellink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags)\n {\n \tstruct nlattr *afspec;\n \tstruct net_bridge_port *p;\n+\tbool changed = false;\n \tint err = 0;\n \n \tafspec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC);\n@@ -869,8 +877,8 @@ int br_dellink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags)\n \t\treturn -EINVAL;\n \n \terr = br_afspec((struct net_bridge *)netdev_priv(dev), p,\n-\t\t\tafspec, RTM_DELLINK);\n-\tif (err == 0)\n+\t\t\tafspec, RTM_DELLINK, &changed);\n+\tif (changed)\n \t\t/* Send RTM_NEWLINK because userspace\n \t\t * expects RTM_NEWLINK for vlan dels\n \t\t */\ndiff --git a/net/bridge/br_netlink_tunnel.c b/net/bridge/br_netlink_tunnel.c\nindex 3712c7f0e00c..da8cb99fd259 100644\n--- a/net/bridge/br_netlink_tunnel.c\n+++ b/net/bridge/br_netlink_tunnel.c\n@@ -198,7 +198,7 @@ static const struct nla_policy vlan_tunnel_policy[IFLA_BRIDGE_VLAN_TUNNEL_MAX +\n };\n \n static int br_vlan_tunnel_info(struct net_bridge_port *p, int cmd,\n-\t\t\t       u16 vid, u32 tun_id)\n+\t\t\t       u16 vid, u32 tun_id, bool *changed)\n {\n \tint err = 0;\n \n@@ -208,9 +208,12 @@ static int br_vlan_tunnel_info(struct net_bridge_port *p, int cmd,\n \tswitch (cmd) {\n \tcase RTM_SETLINK:\n \t\terr = nbp_vlan_tunnel_info_add(p, vid, tun_id);\n+\t\tif (!err)\n+\t\t\t*changed = true;\n \t\tbreak;\n \tcase RTM_DELLINK:\n-\t\tnbp_vlan_tunnel_info_delete(p, vid);\n+\t\tif (!nbp_vlan_tunnel_info_delete(p, vid))\n+\t\t\t*changed = true;\n \t\tbreak;\n \t}\n \n@@ -254,7 +257,8 @@ int br_parse_vlan_tunnel_info(struct nlattr *attr,\n int br_process_vlan_tunnel_info(struct net_bridge *br,\n \t\t\t\tstruct net_bridge_port *p, int cmd,\n \t\t\t\tstruct vtunnel_info *tinfo_curr,\n-\t\t\t\tstruct vtunnel_info *tinfo_last)\n+\t\t\t\tstruct vtunnel_info *tinfo_last,\n+\t\t\t\tbool *changed)\n {\n \tint err;\n \n@@ -272,7 +276,7 @@ int br_process_vlan_tunnel_info(struct net_bridge *br,\n \t\t\treturn -EINVAL;\n \t\tt = tinfo_last->tunid;\n \t\tfor (v = tinfo_last->vid; v <= tinfo_curr->vid; v++) {\n-\t\t\terr = br_vlan_tunnel_info(p, cmd, v, t);\n+\t\t\terr = br_vlan_tunnel_info(p, cmd, v, t, changed);\n \t\t\tif (err)\n \t\t\t\treturn err;\n \t\t\tt++;\n@@ -283,7 +287,7 @@ int br_process_vlan_tunnel_info(struct net_bridge *br,\n \t\tif (tinfo_last->flags)\n \t\t\treturn -EINVAL;\n \t\terr = br_vlan_tunnel_info(p, cmd, tinfo_curr->vid,\n-\t\t\t\t\t  tinfo_curr->tunid);\n+\t\t\t\t\t  tinfo_curr->tunid, changed);\n \t\tif (err)\n \t\t\treturn err;\n \t\tmemset(tinfo_last, 0, sizeof(struct vtunnel_info));\ndiff --git a/net/bridge/br_private_tunnel.h b/net/bridge/br_private_tunnel.h\nindex 4a447a378ab3..a259471bfd78 100644\n--- a/net/bridge/br_private_tunnel.h\n+++ b/net/bridge/br_private_tunnel.h\n@@ -26,7 +26,8 @@ int br_process_vlan_tunnel_info(struct net_bridge *br,\n \t\t\t\tstruct net_bridge_port *p,\n \t\t\t\tint cmd,\n \t\t\t\tstruct vtunnel_info *tinfo_curr,\n-\t\t\t\tstruct vtunnel_info *tinfo_last);\n+\t\t\t\tstruct vtunnel_info *tinfo_last,\n+\t\t\t\tbool *changed);\n int br_get_vlan_tunnel_info_size(struct net_bridge_vlan_group *vg);\n int br_fill_vlan_tunnel_info(struct sk_buff *skb,\n \t\t\t     struct net_bridge_vlan_group *vg);\n","prefixes":["net-next","v4","1/2"]}