From patchwork Wed Jun 15 21:42:41 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Armitage X-Patchwork-Id: 636089 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 3rVKll49mLz9t0T for ; Thu, 16 Jun 2016 07:44:03 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933151AbcFOVnZ (ORCPT ); Wed, 15 Jun 2016 17:43:25 -0400 Received: from host-92-27-6-192.static.as13285.net ([92.27.6.192]:50968 "EHLO nabal.armitage.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933012AbcFOVnT (ORCPT ); Wed, 15 Jun 2016 17:43:19 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by nabal.armitage.org.uk (Postfix) with ESMTP id 20651E0BA8; Wed, 15 Jun 2016 22:43:06 +0100 (BST) X-Virus-Scanned: amavisd-new at armitage.org.uk Received: from nabal.armitage.org.uk ([127.0.0.1]) by localhost (nabal.armitage.org.uk [127.0.0.1]) (amavisd-new, port 10024) with LMTP id ATa-fLPw_vii; Wed, 15 Jun 2016 22:42:54 +0100 (BST) Received: from samson1.armitage.org.uk (samson1.armitage.org.uk [172.21.53.210]) by nabal.armitage.org.uk (Postfix) with ESMTP id 7CD72E01A1; Wed, 15 Jun 2016 22:42:54 +0100 (BST) From: Quentin Armitage To: Wensong Zhang , Simon Horman , Julian Anastasov , Pablo Neira Ayuso , Patrick McHardy , Jozsef Kadlecsik , "David S. Miller" , netdev@vger.kernel.org, lvs-devel@vger.kernel.org, netfilter-devel@vger.kernel.org, coreteam@netfilter.org, linux-kernel@vger.kernel.org Cc: Quentin Armitage Subject: [PATCH v3 1/4] ipvs: Enable setting IPv6 multicast address for ipvs Date: Wed, 15 Jun 2016 22:42:41 +0100 Message-Id: <1466026964-14114-2-git-send-email-quentin@armitage.org.uk> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1466026964-14114-1-git-send-email-quentin@armitage.org.uk> References: <1465914262-30112-1-git-send-email-quentin@armitage.org.uk> <1466026964-14114-1-git-send-email-quentin@armitage.org.uk> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org When using HEAD from https://git.kernel.org/cgit/utils/kernel/ipvsadm/ipvsadm.git/, the command: ipvsadm --start-daemon backup --mcast-interface eth0.60 \ --mcast-group ff02::1:81 fails with the error message: Argument list too long whereas both: ipvsadm --start-daemon master --mcast-interface eth0.60 \ --mcast-group ff02::1:81 and: ipvsadm --start-daemon backup --mcast-interface eth0.60 \ --mcast-group 224.0.0.81 are successful. The error message "Argument list too long" isn't helpful. The error occurs because an IPv6 address is given in backup mode. The error is in make_receive_sock() in net/netfilter/ipvs/ip_vs_sync.c, since it fails to set the interface on the address or the socket before calling inet6_bind() (via sock->ops->bind), where the test 'if (!sk->sk_bound_dev_if)' failed. Setting sock->sk->sk_bound_dev_if on the socket before calling inet6_bind() resolves the issue. Fixes: d33288172e72 ("ipvs: add more mcast parameters for the sync daemon") Signed-off-by: Quentin Armitage --- net/netfilter/ipvs/ip_vs_sync.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c index 803001a..1b07578 100644 --- a/net/netfilter/ipvs/ip_vs_sync.c +++ b/net/netfilter/ipvs/ip_vs_sync.c @@ -1545,7 +1545,8 @@ error: /* * Set up receiving multicast socket over UDP */ -static struct socket *make_receive_sock(struct netns_ipvs *ipvs, int id) +static struct socket *make_receive_sock(struct netns_ipvs *ipvs, int id, + int ifindex) { /* multicast addr */ union ipvs_sockaddr mcast_addr; @@ -1566,6 +1567,7 @@ static struct socket *make_receive_sock(struct netns_ipvs *ipvs, int id) set_sock_size(sock->sk, 0, result); get_mcast_sockaddr(&mcast_addr, &salen, &ipvs->bcfg, id); + sock->sk->sk_bound_dev_if = ifindex; result = sock->ops->bind(sock, (struct sockaddr *)&mcast_addr, salen); if (result < 0) { pr_err("Error binding to the multicast addr\n"); @@ -1868,7 +1870,7 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c, if (state == IP_VS_STATE_MASTER) sock = make_send_sock(ipvs, id); else - sock = make_receive_sock(ipvs, id); + sock = make_receive_sock(ipvs, id, dev->ifindex); if (IS_ERR(sock)) { result = PTR_ERR(sock); goto outtinfo;