From patchwork Wed Nov 2 22:11:53 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: macvlan: receive multicast with local address X-Patchwork-Submitter: stephen hemminger X-Patchwork-Id: 123353 X-Patchwork-Delegate: davem@davemloft.net Message-Id: <20111102151153.028e222f@nehalam.linuxnetplumber.net> To: David Miller , Arnd Bergmann Cc: netdev@vger.kernel.org Date: Wed, 2 Nov 2011 15:11:53 -0700 From: Stephen Hemminger List-Id: When implementing VRRP v2 using macvlan several problems were discovered. VRRP is weird in that all routers participating in a redundant group use the same virtual MAC address. Macvlan is a natural driver to use for this but it doesn't work. The problem is that packets with a macvlan device's source address are not received. The problem is actually a regression that date back almost 2 years now. The original problems started with: commit 618e1b7482f7a8a4c6c6e8ccbe140e4c331df4e9 Author: Arnd Bergmann Date: Thu Nov 26 06:07:10 2009 +0000 macvlan: implement bridge, VEPA and private mode This patches restores the original 2.6.32 behavior. Allowing multicast packets received with the VRRP source address to be received. Signed-off-by: Stephen Hemminger --- This should go to -net, and -stable (since it is a regression). P.s: The VEPA patch also introduced another regression, it changed the default mode from private to VEPA which also breaks application assumptions. But changing it back after 2 years also risks also breaking things. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html --- a/drivers/net/macvlan.c 2011-11-02 13:12:52.186069720 -0700 +++ b/drivers/net/macvlan.c 2011-11-02 14:50:54.476670346 -0700 @@ -192,6 +192,13 @@ static rx_handler_result_t macvlan_handl */ macvlan_broadcast(skb, port, src->dev, MACVLAN_MODE_VEPA); + else { + /* forward to original port. */ + vlan = src; + ret = macvlan_broadcast_one(skb, vlan, eth, 0); + goto out; + } + return RX_HANDLER_PASS; }