From patchwork Wed Jun 8 20:30:49 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Lance Richardson X-Patchwork-Id: 632486 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3rQ0Sm2WYCz9snm for ; Thu, 9 Jun 2016 06:31:04 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1422814AbcFHUbA (ORCPT ); Wed, 8 Jun 2016 16:31:00 -0400 Received: from mx3-phx2.redhat.com ([209.132.183.24]:60311 "EHLO mx3-phx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932233AbcFHUa7 convert rfc822-to-8bit (ORCPT ); Wed, 8 Jun 2016 16:30:59 -0400 Received: from zmail26.collab.prod.int.phx2.redhat.com (zmail26.collab.prod.int.phx2.redhat.com [10.5.83.33]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id u58KUo2A029391; Wed, 8 Jun 2016 16:30:50 -0400 Date: Wed, 8 Jun 2016 16:30:49 -0400 (EDT) From: Lance Richardson To: nicolas dichtel , Vincent Bernat Cc: "David S. Miller" , Vijay Pandurangan , Paolo Abeni , netdev@vger.kernel.org Message-ID: <694175272.49661350.1465417849878.JavaMail.zimbra@redhat.com> In-Reply-To: <574D56A0.3090606@6wind.com> References: <574C6095.9050804@6wind.com> <1464623917-11536-1-git-send-email-vincent@bernat.im> <87bn3n358j.fsf@zoro.exoscale.ch> <574C69DE.3050305@6wind.com> <574D56A0.3090606@6wind.com> Subject: Re: [net v3] veth: advertise peer link once both links are tied together MIME-Version: 1.0 X-Originating-IP: [10.36.5.251] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - GC51 (Linux)/8.0.6_GA_5922) Thread-Topic: veth: advertise peer link once both links are tied together Thread-Index: iqSW51Fi7UU2hbhsidHmV7QLzS/gIA== Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org ----- Original Message ----- > From: "Nicolas Dichtel" > To: "Vincent Bernat" > Cc: "David S. Miller" , "Vijay Pandurangan" , "Paolo Abeni" > , netdev@vger.kernel.org > Sent: Tuesday, May 31, 2016 5:17:20 AM > Subject: Re: [net v3] veth: advertise peer link once both links are tied together > > Le 31/05/2016 08:29, Vincent Bernat a écrit : > > ❦ 30 mai 2016 18:27 CEST, Nicolas Dichtel : > > > >>>> + > >>>> + rtmsg_ifinfo(RTM_NEWLINK, peer, IFF_SLAVE, GFP_KERNEL); > >>> > >>> Maybe ~0U would be better than hijacking IFF_SLAVE? > >> IFF_SLAVE is wrong. It's a flag here, that will be put in the ifi_change > >> field > >> not an attribute number. > > > > There are some use of IFF_SLAVE (in bonding/bond_main.c). But, I'll > > update the patch nonetheless. > Sorry, I read it too quickly, IFF_SLAVE is a flag, not an attribute. > But this field indicates to the userland which flags has changed and this > flag > does not change here ;-) > I've been pondering how to fix this very problem off-and-on for a few months now, without having arrived at any solution that was particularly satisfying. The main constraints I've been trying to meet are: - User-space should be informed of veth pairing for both peers. - RTM_NEWLINK messages should not refer to interfaces that haven't been announced to user-space via previous RTM_NEWLINK messages. - The first (and only the first) RTM_NEWLINK message for a given interface should have ifi_changes set to ~0U, subsequent RTM_NEWLINK messages should have ifi_changes set to reflect the flags that have changed. This is the closest I've come to a satisfactory solution, it does meet the above constraints but still seems a little unnatural to me: Sample output: # ip link add dev vm1 type veth peer name vm2 5: vm2@NONE: mtu 1500 qdisc noop state DOWN link/ether 36:a7:b4:dc:27:3b brd ff:ff:ff:ff:ff:ff 6: vm1@vm2: mtu 1500 qdisc noop state DOWN link/ether 72:78:30:f6:e6:3a brd ff:ff:ff:ff:ff:ff 5: vm2@vm1: mtu 1500 qdisc noop state DOWN link/ether 36:a7:b4:dc:27:3b brd ff:ff:ff:ff:ff:ff diff --git a/drivers/net/veth.c b/drivers/net/veth.c index f37a6e6..9151686 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -466,8 +466,16 @@ static int veth_newlink(struct net *src_net, struct net_device *dev, priv = netdev_priv(peer); rcu_assign_pointer(priv->peer, dev); + + err = rtnl_configure_link(dev, NULL); + if (err < 0) + goto err_configure_dev; + + rtmsg_ifinfo(RTM_NEWLINK, peer, 0, GFP_KERNEL); return 0; +err_configure_dev: + /* nothing to do */ err_register_dev: /* nothing to do */ err_configure_peer: diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index d69c464..28ee417 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -2165,6 +2165,7 @@ static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh) int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm) { unsigned int old_flags; + unsigned int gchanges; int err; old_flags = dev->flags; @@ -2174,9 +2175,13 @@ int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm) return err; } - dev->rtnl_link_state = RTNL_LINK_INITIALIZED; + if (dev->rtnl_link_state == RTNL_LINK_INITIALIZING) { + dev->rtnl_link_state = RTNL_LINK_INITIALIZED; + gchanges = ~0U; + } else + gchanges = dev->flags ^ old_flags; - __dev_notify_flags(dev, old_flags, ~0U); + __dev_notify_flags(dev, old_flags, gchanges); return 0; } EXPORT_SYMBOL(rtnl_configure_link);