From patchwork Thu Oct 6 03:59:10 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yinglin Sun X-Patchwork-Id: 117949 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 B735EB700E for ; Thu, 6 Oct 2011 14:59:45 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757908Ab1JFD7d (ORCPT ); Wed, 5 Oct 2011 23:59:33 -0400 Received: from mail-pz0-f42.google.com ([209.85.210.42]:37742 "EHLO mail-pz0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755887Ab1JFD7c (ORCPT ); Wed, 5 Oct 2011 23:59:32 -0400 Received: by pzk1 with SMTP id 1so5842972pzk.1 for ; Wed, 05 Oct 2011 20:59:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=sender:from:to:cc:subject:date:message-id:x-mailer; bh=SXuq8hi221GmpLqSC2Bd7oVcOh8nKsu7v8vLRl/m/QY=; b=eZuOidIEUebX7WB+pcTirqxDLzhAIv8s+W/7FSznYGmHpc1XX6c9QjO4mnjP2eYTIC ujb810yxQIfQPb5RvgnlgAxt416SDHUb/eOl8X5ltoSS9lF0IFiw+P3kRopSGmmCvuej 1OBcK2QjoywRnWi06kaWTKQm2sE6Q50KcZJ+Q= Received: by 10.68.31.4 with SMTP id w4mr2419691pbh.20.1317873571604; Wed, 05 Oct 2011 20:59:31 -0700 (PDT) Received: from localhost.localdomain (c-71-198-200-215.hsd1.ca.comcast.net. [71.198.200.215]) by mx.google.com with ESMTPS id ml4sm14713911pbc.0.2011.10.05.20.59.29 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 05 Oct 2011 20:59:30 -0700 (PDT) From: Yinglin Sun To: "David S. Miller" , Alexey Kuznetsov , James Morris , Hideaki YOSHIFUJI , Patrick McHardy Cc: netdev@vger.kernel.org, Yinglin Sun Subject: [PATCH] IPv6: DAD from bonding iface is treated as dup address from others Date: Wed, 5 Oct 2011 20:59:10 -0700 Message-Id: <1317873550-1677-1-git-send-email-Yinglin.Sun@emc.com> X-Mailer: git-send-email 1.7.4.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Steps to reproduce this issue: 1. create bond0 over eth0 and eth1, set the mode to balance-xor 2. add an IPv6 address to bond0 3. DAD packet is sent out from one slave and then is looped back from the other slave. Therefore, it is treated as a duplicate address and stays tentative afterwards: kern.info: Oct 5 11:50:18 testvm1 kernel: [ 129.224353] bond0: IPv6 duplicate address 1234::1 detected! Signed-off-by: Yinglin Sun --- net/ipv6/ndisc.c | 15 +++++++++++++-- 1 files changed, 13 insertions(+), 2 deletions(-) diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 9da6e02..c82f4c7 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -809,9 +809,10 @@ static void ndisc_recv_ns(struct sk_buff *skb) if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) { if (dad) { + const unsigned char *sadr; + sadr = skb_mac_header(skb); + if (dev->type == ARPHRD_IEEE802_TR) { - const unsigned char *sadr; - sadr = skb_mac_header(skb); if (((sadr[8] ^ dev->dev_addr[0]) & 0x7f) == 0 && sadr[9] == dev->dev_addr[1] && sadr[10] == dev->dev_addr[2] && @@ -821,6 +822,16 @@ static void ndisc_recv_ns(struct sk_buff *skb) /* looped-back to us */ goto out; } + } else if (dev->type == ARPHRD_ETHER) { + if (sadr[6] == dev->dev_addr[0] && + sadr[7] == dev->dev_addr[1] && + sadr[8] == dev->dev_addr[2] && + sadr[9] == dev->dev_addr[3] && + sadr[10] == dev->dev_addr[4] && + sadr[11] == dev->dev_addr[5]) { + /* looped-back to us */ + goto out; + } } /*