From patchwork Wed Mar 4 18:30:10 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Madhu Challa X-Patchwork-Id: 446376 X-Patchwork-Delegate: shemminger@vyatta.com 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 81CF4140146 for ; Thu, 5 Mar 2015 05:47:29 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759863AbbCDSr0 (ORCPT ); Wed, 4 Mar 2015 13:47:26 -0500 Received: from mail-pa0-f46.google.com ([209.85.220.46]:43837 "EHLO mail-pa0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758514AbbCDSrZ (ORCPT ); Wed, 4 Mar 2015 13:47:25 -0500 Received: by pablj1 with SMTP id lj1so26464171pab.10 for ; Wed, 04 Mar 2015 10:47:24 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=thtkskyxgASayUwSEC7J5uCtzbZk5x+jWb9TlfNlXUU=; b=fxnn5yc1XmAO/hfxPBur0vA//9YWuzCI7/VaNnDjHN5zsLQlWSkTCrHxnqdrdLpFgK 6ukWopWVrEGgQuKQEhbZuSzSBote1c088sE/I63DqSeIvMlj+zkpPOiw1KGjtkKJsJ7Z u81tfJPVL9sDGetvXYmdyz+G8+KRXEN8m6UJqqfxA9c1YJGh19Uq3YBamTsNKwkd1UxL nOB8ZevF1lyyJy7rxg+igLURUz6XConnnpmZlcioDKxe4jWs5FKku+pjJHSlgwzVyLjE ODnd9n7hH1HBkQrUvEQnuMpvuVANqhROpHnaWtaO7wgHGKQqUfE5kfKYPCGZUb1fCiqy O5sg== X-Gm-Message-State: ALoCoQl2otX/hkIF4h1JFf6//mvxqgdg7rpuuOHZ4VLVJ58d83R09Tp5xtbaOTZBRrlHR8GfCUVS X-Received: by 10.66.199.2 with SMTP id jg2mr8949501pac.55.1425494844592; Wed, 04 Mar 2015 10:47:24 -0800 (PST) Received: from localhost.localdomain ([173.36.240.158]) by mx.google.com with ESMTPSA id xh3sm4761590pab.25.2015.03.04.10.47.23 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 04 Mar 2015 10:47:24 -0800 (PST) From: Madhu Challa To: stephen@networkplumber.org, netdev@vger.kernel.org Cc: Madhu Challa Subject: [PATCH iproute2 net-next 2/2] Enable configuring multicast group join / leave at IP level. Date: Wed, 4 Mar 2015 10:30:10 -0800 Message-Id: <1425493810-2537-3-git-send-email-challa@noironetworks.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1425493810-2537-1-git-send-email-challa@noironetworks.com> References: <1425493810-2537-1-git-send-email-challa@noironetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Joining multicast group on ethernet level via "ip maddr" command would not work if we have an Ethernet switch that does igmp snooping since the switch would not replicate multicast packets on ports that did not have IGMP reports for the multicast addresses. Linux vxlan interfaces created via "ip link add vxlan" have the group option that enables then to do the required join. By extending ip address command with option "autojoin" we can get similar functionality for openvswitch vxlan interfaces as well as other tunneling mechanisms that need to receive multicast traffic. example: ip address add 224.1.1.10/24 dev eth5 autojoin ip address del 224.1.1.10/24 dev eth5 --- ip/ipaddress.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/ip/ipaddress.c b/ip/ipaddress.c index 99a6ab5..e582da0 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -85,7 +85,7 @@ static void usage(void) fprintf(stderr, " [-]tentative | [-]deprecated | [-]dadfailed | temporary |\n"); fprintf(stderr, " CONFFLAG-LIST ]\n"); fprintf(stderr, "CONFFLAG-LIST := [ CONFFLAG-LIST ] CONFFLAG\n"); - fprintf(stderr, "CONFFLAG := [ home | nodad | mngtmpaddr | noprefixroute ]\n"); + fprintf(stderr, "CONFFLAG := [ home | nodad | mngtmpaddr | noprefixroute | autojoin ]\n"); fprintf(stderr, "LIFETIME := [ valid_lft LFT ] [ preferred_lft LFT ]\n"); fprintf(stderr, "LFT := forever | SECONDS\n"); @@ -915,6 +915,10 @@ int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n, ifa_flags &= ~IFA_F_NOPREFIXROUTE; fprintf(fp, "noprefixroute "); } + if (ifa_flags & IFA_F_MCAUTOJOIN) { + ifa_flags &= ~IFA_F_MCAUTOJOIN; + fprintf(fp, "autojoin "); + } if (!(ifa_flags & IFA_F_PERMANENT)) { fprintf(fp, "dynamic "); } else @@ -1354,6 +1358,9 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action) } else if (strcmp(*argv, "noprefixroute") == 0) { filter.flags |= IFA_F_NOPREFIXROUTE; filter.flagmask |= IFA_F_NOPREFIXROUTE; + } else if (strcmp(*argv, "autojoin") == 0) { + filter.flags |= IFA_F_MCAUTOJOIN; + filter.flagmask |= IFA_F_MCAUTOJOIN; } else if (strcmp(*argv, "dadfailed") == 0) { filter.flags |= IFA_F_DADFAILED; filter.flagmask |= IFA_F_DADFAILED; @@ -1558,6 +1565,16 @@ static int default_scope(inet_prefix *lcl) return 0; } +static bool ipaddr_is_multicast(inet_prefix *a) +{ + if (a->family == AF_INET) + return IN_MULTICAST(ntohl(a->data[0])); + else if (a->family == AF_INET6) + return IN6_IS_ADDR_MULTICAST(a->data); + else + return false; +} + static int ipaddr_modify(int cmd, int flags, int argc, char **argv) { struct { @@ -1665,6 +1682,8 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv) ifa_flags |= IFA_F_MANAGETEMPADDR; } else if (strcmp(*argv, "noprefixroute") == 0) { ifa_flags |= IFA_F_NOPREFIXROUTE; + } else if (strcmp(*argv, "autojoin") == 0) { + ifa_flags |= IFA_F_MCAUTOJOIN; } else { if (strcmp(*argv, "local") == 0) { NEXT_ARG(); @@ -1755,6 +1774,11 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv) sizeof(cinfo)); } + if ((ifa_flags & IFA_F_MCAUTOJOIN) && !ipaddr_is_multicast(&lcl)) { + fprintf(stderr, "autojoin needs multicast address\n"); + return -1; + } + if (rtnl_talk(&rth, &req.n, 0, 0, NULL) < 0) return -2;