From patchwork Tue Dec 20 11:10:24 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gao feng X-Patchwork-Id: 132400 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 EBAA1B6FAC for ; Tue, 20 Dec 2011 22:09:47 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752102Ab1LTLJk (ORCPT ); Tue, 20 Dec 2011 06:09:40 -0500 Received: from cn.fujitsu.com ([222.73.24.84]:53793 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1751696Ab1LTLJi (ORCPT ); Tue, 20 Dec 2011 06:09:38 -0500 Received: from tang.cn.fujitsu.com (tang.cn.fujitsu.com [10.167.250.3]) by song.cn.fujitsu.com (Postfix) with ESMTP id ACF3D170080; Tue, 20 Dec 2011 19:09:31 +0800 (CST) Received: from mailserver.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id pBKB9T3S025749; Tue, 20 Dec 2011 19:09:30 +0800 Received: from Donkey.fnst.cn.fujitsu.com ([10.167.225.83]) by mailserver.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.1FP4) with ESMTP id 2011122019084945-121385 ; Tue, 20 Dec 2011 19:08:49 +0800 From: Gao feng To: netdev@vger.kernel.org Cc: davem@davemloft.net, Wang xingtong Subject: [PATCH V2] IPv6 : add multicast routing verify which net_device is lo Date: Tue, 20 Dec 2011 19:10:24 +0800 Message-Id: <1324379424-18055-1-git-send-email-gaofeng@cn.fujitsu.com> X-Mailer: git-send-email 1.7.6.1 In-Reply-To: <4EF059B3.1020705@cn.fujitsu.com> References: <4EF059B3.1020705@cn.fujitsu.com> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.1FP4|July 25, 2010) at 2011-12-20 19:08:49, Serialize by Router on mailserver/fnst(Release 8.5.1FP4|July 25, 2010) at 2011-12-20 19:08:51, Serialize complete at 2011-12-20 19:08:51 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In currently routing subsystem, when we lookup a multicast routing to send muticast packets to outside, rt6_device_match will return the rt6_info which it's match first. If we add a multicast route on loopback devices beforce the others interface, rt6_device_match will retrun the rt6_info which rt6i_dev->name is "lo". But, obviously, we can't send a muticast packet to outside using loopback devices. It case all multicast packets blocking. Commit 4af04aba93f47699e disabled kernel add multicast route on lo automatically. However, we can't surmise the routing-add order or interdict add multicast routing on loopback devices in user space. The bug still exist. So, i think, more stronger routing subsystem is necessary. Signed-off-by: Wang xingtong --- net/ipv6/route.c | 19 ++++++++++++++++--- 1 files changed, 16 insertions(+), 3 deletions(-) diff --git a/net/ipv6/route.c b/net/ipv6/route.c index b582a0a..d6663ca 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -334,9 +334,16 @@ static inline struct rt6_info *rt6_device_match(struct net *net, struct rt6_info *local = NULL; struct rt6_info *sprt; - if (!oif && ipv6_addr_any(saddr)) + if (!oif && ipv6_addr_any(saddr)){ + if (unlikely(rt->rt6i_dev->flags & IFF_LOOPBACK && + ipv6_addr_is_multicast(&rt->rt6i_dst.addr))){ + rt=rt->dst.rt6_next; + goto match; + } goto out; + } +match: for (sprt = rt; sprt; sprt = sprt->dst.rt6_next) { struct net_device *dev = sprt->rt6i_dev; @@ -355,9 +362,15 @@ static inline struct rt6_info *rt6_device_match(struct net *net, local = sprt; } } else { - if (ipv6_chk_addr(net, saddr, dev, - flags & RT6_LOOKUP_F_IFACE)) + if (ipv6_addr_any(saddr)){ + if (unlikely(rt->rt6i_dev->flags & IFF_LOOPBACK && + ipv6_addr_is_multicast(&rt->rt6i_dst.addr))) + continue; return sprt; + } + else if (ipv6_chk_addr(net, saddr, dev, + flags & RT6_LOOKUP_F_IFACE)) + return sprt; } }