Message ID | 1411994363-8451-19-git-send-email-pablo@netfilter.org |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
On 09/29/2014 04:39 PM, Pablo Neira Ayuso wrote: > From: Alex Gartrell <agartrell@fb.com> > The synchronization protocol is not compatible with heterogeneous pools, so > we need to verify that we're not turning both on at the same time. > Signed-off-by: Alex Gartrell <agartrell@fb.com> > Acked-by: Julian Anastasov <ja@ssi.bg> > Signed-off-by: Simon Horman <horms@verge.net.au> > --- > include/net/ip_vs.h | 4 ++++ > net/netfilter/ipvs/ip_vs_ctl.c | 15 +++++++++++++++ > 2 files changed, 19 insertions(+) > diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h > index 7600dbe..576d7f0 100644 > --- a/include/net/ip_vs.h > +++ b/include/net/ip_vs.h > @@ -990,6 +990,10 @@ struct netns_ipvs { > char backup_mcast_ifn[IP_VS_IFNAME_MAXLEN]; > /* net name space ptr */ > struct net *net; /* Needed by timer routines */ > + /* Number of heterogeneous destinations, needed because > + * heterogeneous are not supported when synchronization is > + * enabled */ Multi-line comment style in the networking code is: /* bla * bla */ > diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c > index 6bd2cc6..462760e 100644 > --- a/net/netfilter/ipvs/ip_vs_ctl.c > +++ b/net/netfilter/ipvs/ip_vs_ctl.c [...] > @@ -3256,6 +3265,12 @@ static int ip_vs_genl_new_daemon(struct net *net, struct nlattr **attrs) > attrs[IPVS_DAEMON_ATTR_SYNC_ID])) > return -EINVAL; > > + /* The synchronization protocol is incompatible with mixed family > + * services > + */ Here you got it right. :-) > + if (net_ipvs(net)->mixed_address_family_dests > 0) > + return -EINVAL; > + WBR, Sergei -- 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
On Mon, Sep 29, 2014 at 08:17:26PM +0400, Sergei Shtylyov wrote: > On 09/29/2014 04:39 PM, Pablo Neira Ayuso wrote: > > >From: Alex Gartrell <agartrell@fb.com> > > >The synchronization protocol is not compatible with heterogeneous pools, so > >we need to verify that we're not turning both on at the same time. > > >Signed-off-by: Alex Gartrell <agartrell@fb.com> > >Acked-by: Julian Anastasov <ja@ssi.bg> > >Signed-off-by: Simon Horman <horms@verge.net.au> > >--- > > include/net/ip_vs.h | 4 ++++ > > net/netfilter/ipvs/ip_vs_ctl.c | 15 +++++++++++++++ > > 2 files changed, 19 insertions(+) > > >diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h > >index 7600dbe..576d7f0 100644 > >--- a/include/net/ip_vs.h > >+++ b/include/net/ip_vs.h > >@@ -990,6 +990,10 @@ struct netns_ipvs { > > char backup_mcast_ifn[IP_VS_IFNAME_MAXLEN]; > > /* net name space ptr */ > > struct net *net; /* Needed by timer routines */ > >+ /* Number of heterogeneous destinations, needed because > >+ * heterogeneous are not supported when synchronization is > >+ * enabled */ > > Multi-line comment style in the networking code is: > > /* bla > * bla > */ Thanks, I have sent a cleanup patch. -- 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
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h index 7600dbe..576d7f0 100644 --- a/include/net/ip_vs.h +++ b/include/net/ip_vs.h @@ -990,6 +990,10 @@ struct netns_ipvs { char backup_mcast_ifn[IP_VS_IFNAME_MAXLEN]; /* net name space ptr */ struct net *net; /* Needed by timer routines */ + /* Number of heterogeneous destinations, needed because + * heterogeneous are not supported when synchronization is + * enabled */ + unsigned int mixed_address_family_dests; }; #define DEFAULT_SYNC_THRESHOLD 3 diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index 6bd2cc6..462760e 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c @@ -779,6 +779,12 @@ __ip_vs_update_dest(struct ip_vs_service *svc, struct ip_vs_dest *dest, struct ip_vs_scheduler *sched; int conn_flags; + /* We cannot modify an address and change the address family */ + BUG_ON(!add && udest->af != dest->af); + + if (add && udest->af != svc->af) + ipvs->mixed_address_family_dests++; + /* set the weight and the flags */ atomic_set(&dest->weight, udest->weight); conn_flags = udest->conn_flags & IP_VS_CONN_F_DEST_MASK; @@ -1061,6 +1067,9 @@ static void __ip_vs_unlink_dest(struct ip_vs_service *svc, list_del_rcu(&dest->n_list); svc->num_dests--; + if (dest->af != svc->af) + net_ipvs(svc->net)->mixed_address_family_dests--; + if (svcupd) { struct ip_vs_scheduler *sched; @@ -3256,6 +3265,12 @@ static int ip_vs_genl_new_daemon(struct net *net, struct nlattr **attrs) attrs[IPVS_DAEMON_ATTR_SYNC_ID])) return -EINVAL; + /* The synchronization protocol is incompatible with mixed family + * services + */ + if (net_ipvs(net)->mixed_address_family_dests > 0) + return -EINVAL; + return start_sync_thread(net, nla_get_u32(attrs[IPVS_DAEMON_ATTR_STATE]), nla_data(attrs[IPVS_DAEMON_ATTR_MCAST_IFN]),