All of lore.kernel.org
 help / color / mirror / Atom feed
* [v2 PATCH 4/4] IPVS: Backup, Change sending to Version 1 format
@ 2010-10-29 12:16 Hans Schillstrom
  2010-10-30  6:50 ` Simon Horman
  0 siblings, 1 reply; 4+ messages in thread
From: Hans Schillstrom @ 2010-10-29 12:16 UTC (permalink / raw)
  To: lvs-devel, horms, ja, wensong, daniel.lezcano; +Cc: Hans Schillstrom

Enable sending and removal of version 0 sending
Affected functions,

ip_vs_sync_buff_create()
ip_vs_sync_conn()

ip_vs_core.c removal of IPv4 check.

Signed-off-by: Hans Schillstrom <hans.schillstrom@ericsson.com>
---
 net/netfilter/ipvs/ip_vs_core.c |    5 +-
 net/netfilter/ipvs/ip_vs_sync.c |  139 +++++++++++++++++++++++++++++----------
 2 files changed, 107 insertions(+), 37 deletions(-)

diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c
index e2bb3cd..9c68045 100644
--- a/net/netfilter/ipvs/ip_vs_core.c
+++ b/net/netfilter/ipvs/ip_vs_core.c
@@ -1537,7 +1537,7 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af)
 	 * encorage the standby servers to update the connections timeout
 	 */
 	pkts = atomic_add_return(1, &cp->in_pkts);
-	if (af == AF_INET && (ip_vs_sync_state & IP_VS_STATE_MASTER) &&
+	if ((ip_vs_sync_state & IP_VS_STATE_MASTER) &&
 	    cp->protocol == IPPROTO_SCTP) {
 		if ((cp->state == IP_VS_SCTP_S_ESTABLISHED &&
 			(pkts % sysctl_ip_vs_sync_threshold[1]
@@ -1552,8 +1552,7 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af)
 	}
 
 	/* Keep this block last: TCP and others with pp->num_states <= 1 */
-	else if (af == AF_INET &&
-	    (ip_vs_sync_state & IP_VS_STATE_MASTER) &&
+	else if ((ip_vs_sync_state & IP_VS_STATE_MASTER) &&
 	    (((cp->protocol != IPPROTO_TCP ||
 	       cp->state == IP_VS_TCP_S_ESTABLISHED) &&
 	      (pkts % sysctl_ip_vs_sync_threshold[1]
diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c
index 5aa8e04..00f0fd3 100644
--- a/net/netfilter/ipvs/ip_vs_sync.c
+++ b/net/netfilter/ipvs/ip_vs_sync.c
@@ -247,9 +247,9 @@ struct ip_vs_sync_buff {
 	unsigned long           firstuse;
 
 	/* pointers for the message data */
-	struct ip_vs_sync_mesg  *mesg;
-	unsigned char           *head;
-	unsigned char           *end;
+	struct ip_vs_sync_mesg_v2 *mesg;
+	unsigned char             *head;
+	unsigned char             *end;
 };
 
 
@@ -300,6 +300,9 @@ static inline struct ip_vs_sync_buff *sb_dequeue(void)
 	return sb;
 }
 
+/*
+ * Create a new sync buffer for Version 1 proto.
+ */
 static inline struct ip_vs_sync_buff * ip_vs_sync_buff_create(void)
 {
 	struct ip_vs_sync_buff *sb;
@@ -311,11 +314,15 @@ static inline struct ip_vs_sync_buff * ip_vs_sync_buff_create(void)
 		kfree(sb);
 		return NULL;
 	}
-	sb->mesg->nr_conns = 0;
+	sb->mesg->reserverd = 0; /* old nr_conns i.e. must be zeo now */
+	sb->mesg->version = SYNC_PROTO_VER;
 	sb->mesg->syncid = ip_vs_master_syncid;
-	sb->mesg->size = 4;
-	sb->head = (unsigned char *)sb->mesg + 4;
+	sb->mesg->size = sizeof(struct ip_vs_sync_mesg_v2);
+	sb->mesg->nr_conns = 0;
+	sb->mesg->spare = 0;
+	sb->head = (unsigned char *)sb->mesg + sizeof(struct ip_vs_sync_mesg_v2);
 	sb->end = (unsigned char *)sb->mesg + sync_send_mesg_maxlen;
+
 	sb->firstuse = jiffies;
 	return sb;
 }
@@ -360,14 +367,51 @@ get_curr_sync_buff(unsigned long time)
 /*
  *      Add an ip_vs_conn information into the current sync_buff.
  *      Called by ip_vs_in.
+ *      Sending Version 1 messages
  */
 void ip_vs_sync_conn(struct ip_vs_conn *cp)
 {
-	struct ip_vs_sync_mesg *m;
-	struct ip_vs_sync_conn_v0 *s;
-	int len;
+	struct ip_vs_sync_mesg_v2 *m;
+	union ip_vs_sync_conn *s;
+	char *p;
+	int len, pe_name_len = 0;
+
+	/* Sanity checks */
+	if (cp->pe_data_len && (!cp->pe_data || !cp->dest)) {
+		IP_VS_ERR_RL("connection pe_data invalid\n");
+		return;
+	}
+	/* Add space for terminating \0 */
+	if (cp->pe_data_len && cp->dest->svc && cp->dest->svc->pe
+	     && cp->dest->svc->pe->name )
+		pe_name_len = strnlen(cp->dest->svc->pe->name,
+				      IP_VS_PENAME_MAXLEN) + 1;
 
 	spin_lock(&curr_sb_lock);
+#ifdef CONFIG_IP_VS_IPV6
+	/* Assumption,if not configured for IPv6 no packets should enter here */
+	if (cp->af == AF_INET6)
+		len = sizeof(struct ip_vs_sync_v6);
+	else
+#endif
+		len = sizeof(struct ip_vs_sync_v4);
+
+	if (cp->flags & IP_VS_CONN_F_SEQ_MASK)
+		len += sizeof(struct ip_vs_sync_conn_options) + 2;
+
+	/* 32 bit alignment */
+	if (cp->pe_data_len)
+		len += cp->pe_data_len + 2;	/* + Option field */
+	if(pe_name_len)
+		len += pe_name_len + 2;
+	len = (len+3) & 0xffc;		/* Final 32 bit alignment */
+
+	/* check if there is a space for this one */
+	if (curr_sb && (curr_sb->head+len > curr_sb->end) ) {
+		sb_queue_tail(curr_sb);
+		curr_sb = NULL;
+	}
+
 	if (!curr_sb) {
 		if (!(curr_sb=ip_vs_sync_buff_create())) {
 			spin_unlock(&curr_sb_lock);
@@ -376,36 +420,63 @@ void ip_vs_sync_conn(struct ip_vs_conn *cp)
 		}
 	}
 
-	len = (cp->flags & IP_VS_CONN_F_SEQ_MASK) ? FULL_CONN_SIZE :
-		SIMPLE_CONN_SIZE;
+
 	m = curr_sb->mesg;
-	s = (struct ip_vs_sync_conn_v0 *)curr_sb->head;
+	s = (union ip_vs_sync_conn *)curr_sb->head;
+	p = (char *)s;
 
+	/* Set message type */
+	s->v4.type = (cp->af == AF_INET6 ? STYPE_INET6 : 0 );
 	/* copy members */
-	s->protocol = cp->protocol;
-	s->cport = cp->cport;
-	s->vport = cp->vport;
-	s->dport = cp->dport;
-	s->caddr = cp->caddr.ip;
-	s->vaddr = cp->vaddr.ip;
-	s->daddr = cp->daddr.ip;
-	s->flags = htons(cp->flags & ~IP_VS_CONN_F_HASHED);
-	s->state = htons(cp->state);
-	if (cp->flags & IP_VS_CONN_F_SEQ_MASK) {
-		struct ip_vs_sync_conn_options *opt =
-			(struct ip_vs_sync_conn_options *)&s[1];
-		memcpy(opt, &cp->in_seq, sizeof(*opt));
-	}
-
+	s->v4.ver_size = htons(len & SVER_MASK);	/* Version=0 */
+	s->v4.flags = htonl(cp->flags & ~IP_VS_CONN_F_HASHED);
+	s->v4.state = htons(cp->state);
+	s->v4.protocol = cp->protocol;
+	s->v4.cport = cp->cport;
+	s->v4.vport = cp->vport;
+	s->v4.dport = cp->dport;
+	s->v4.fwmark = htonl(cp->fwmark);
+	s->v4.timeout = htonl(cp->timeout / HZ);
 	m->nr_conns++;
-	m->size += len;
-	curr_sb->head += len;
 
-	/* check if there is a space for next one */
-	if (curr_sb->head+FULL_CONN_SIZE > curr_sb->end) {
-		sb_queue_tail(curr_sb);
-		curr_sb = NULL;
+#ifdef CONFIG_IP_VS_IPV6
+	if (cp->af == AF_INET6 ) {
+		p += sizeof(struct ip_vs_sync_v6);
+		ipv6_addr_copy(&s->v6.caddr, &cp->caddr.in6);
+		ipv6_addr_copy(&s->v6.vaddr, &cp->vaddr.in6);
+		ipv6_addr_copy(&s->v6.daddr, &cp->daddr.in6);
+	} else
+#endif
+	{
+		p += sizeof(struct ip_vs_sync_v4);	/* options ptr */
+		s->v4.caddr = cp->caddr.ip;
+		s->v4.vaddr = cp->vaddr.ip;
+		s->v4.daddr = cp->daddr.ip;
+	}
+	if (cp->flags & IP_VS_CONN_F_SEQ_MASK) {
+		*(p++) = IPVS_OPT_SEQ_DATA;
+		*(p++) = sizeof(struct ip_vs_sync_conn_options);
+		memcpy(p, &cp->in_seq,
+			       sizeof(struct ip_vs_sync_conn_options));
+			p += sizeof(struct ip_vs_sync_conn_options);
 	}
+	/* Handle pe data */
+	if (cp->pe_data_len && cp->pe_data) {
+		*(p++) = IPVS_OPT_PE_DATA;
+		*(p++) = cp->pe_data_len;
+		memcpy(p, cp->pe_data,cp->pe_data_len);
+		p += cp->pe_data_len;
+		if (pe_name_len) {
+			/* Add PE_NAME */
+			*(p++) = IPVS_OPT_PE_NAME;
+			*(p++) = pe_name_len;
+			memcpy(p, cp->dest->svc->pe->name, pe_name_len);
+			p[pe_name_len-1] = 0; /* Make sure \0 is there */
+		}
+	}
+        m->size += len;
+        curr_sb->head += len;
+
 	spin_unlock(&curr_sb_lock);
 
 	/* synchronize its controller if it has */
@@ -1077,7 +1148,7 @@ ip_vs_send_async(struct socket *sock, const char *buffer, const size_t length)
 }
 
 static void
-ip_vs_send_sync_msg(struct socket *sock, struct ip_vs_sync_mesg *msg)
+ip_vs_send_sync_msg(struct socket *sock, struct ip_vs_sync_mesg_v2 *msg)
 {
 	int msize;
 
-- 
1.7.0.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [v2 PATCH 4/4] IPVS: Backup, Change sending to Version 1 format
  2010-10-29 12:16 [v2 PATCH 4/4] IPVS: Backup, Change sending to Version 1 format Hans Schillstrom
@ 2010-10-30  6:50 ` Simon Horman
  2010-10-30 11:53   ` Hans Schillstrom
  0 siblings, 1 reply; 4+ messages in thread
From: Simon Horman @ 2010-10-30  6:50 UTC (permalink / raw)
  To: Hans Schillstrom; +Cc: lvs-devel, ja, wensong, daniel.lezcano

On Fri, Oct 29, 2010 at 02:16:39PM +0200, Hans Schillstrom wrote:
> Enable sending and removal of version 0 sending
> Affected functions,
> 
> ip_vs_sync_buff_create()
> ip_vs_sync_conn()
> 
> ip_vs_core.c removal of IPv4 check.
> 
> Signed-off-by: Hans Schillstrom <hans.schillstrom@ericsson.com>

[ snip ]

> diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c
> index 5aa8e04..00f0fd3 100644
> --- a/net/netfilter/ipvs/ip_vs_sync.c
> +++ b/net/netfilter/ipvs/ip_vs_sync.c

[ snip ]

> @@ -376,36 +420,63 @@ void ip_vs_sync_conn(struct ip_vs_conn *cp)
>  		}
>  	}
>  
> -	len = (cp->flags & IP_VS_CONN_F_SEQ_MASK) ? FULL_CONN_SIZE :
> -		SIMPLE_CONN_SIZE;
> +
>  	m = curr_sb->mesg;
> -	s = (struct ip_vs_sync_conn_v0 *)curr_sb->head;
> +	s = (union ip_vs_sync_conn *)curr_sb->head;
> +	p = (char *)s;
>  
> +	/* Set message type */
> +	s->v4.type = (cp->af == AF_INET6 ? STYPE_INET6 : 0 );
>  	/* copy members */
> -	s->protocol = cp->protocol;
> -	s->cport = cp->cport;
> -	s->vport = cp->vport;
> -	s->dport = cp->dport;
> -	s->caddr = cp->caddr.ip;
> -	s->vaddr = cp->vaddr.ip;
> -	s->daddr = cp->daddr.ip;
> -	s->flags = htons(cp->flags & ~IP_VS_CONN_F_HASHED);
> -	s->state = htons(cp->state);
> -	if (cp->flags & IP_VS_CONN_F_SEQ_MASK) {
> -		struct ip_vs_sync_conn_options *opt =
> -			(struct ip_vs_sync_conn_options *)&s[1];
> -		memcpy(opt, &cp->in_seq, sizeof(*opt));
> -	}
> -
> +	s->v4.ver_size = htons(len & SVER_MASK);	/* Version=0 */
> +	s->v4.flags = htonl(cp->flags & ~IP_VS_CONN_F_HASHED);
> +	s->v4.state = htons(cp->state);
> +	s->v4.protocol = cp->protocol;
> +	s->v4.cport = cp->cport;
> +	s->v4.vport = cp->vport;
> +	s->v4.dport = cp->dport;
> +	s->v4.fwmark = htonl(cp->fwmark);
> +	s->v4.timeout = htonl(cp->timeout / HZ);
>  	m->nr_conns++;
> -	m->size += len;
> -	curr_sb->head += len;
>  
> -	/* check if there is a space for next one */
> -	if (curr_sb->head+FULL_CONN_SIZE > curr_sb->end) {
> -		sb_queue_tail(curr_sb);
> -		curr_sb = NULL;
> +#ifdef CONFIG_IP_VS_IPV6
> +	if (cp->af == AF_INET6 ) {
> +		p += sizeof(struct ip_vs_sync_v6);
> +		ipv6_addr_copy(&s->v6.caddr, &cp->caddr.in6);
> +		ipv6_addr_copy(&s->v6.vaddr, &cp->vaddr.in6);
> +		ipv6_addr_copy(&s->v6.daddr, &cp->daddr.in6);
> +	} else
> +#endif
> +	{
> +		p += sizeof(struct ip_vs_sync_v4);	/* options ptr */
> +		s->v4.caddr = cp->caddr.ip;
> +		s->v4.vaddr = cp->vaddr.ip;
> +		s->v4.daddr = cp->daddr.ip;
> +	}
> +	if (cp->flags & IP_VS_CONN_F_SEQ_MASK) {
> +		*(p++) = IPVS_OPT_SEQ_DATA;
> +		*(p++) = sizeof(struct ip_vs_sync_conn_options);
> +		memcpy(p, &cp->in_seq,
> +			       sizeof(struct ip_vs_sync_conn_options));
> +			p += sizeof(struct ip_vs_sync_conn_options);
>  	}
> +	/* Handle pe data */
> +	if (cp->pe_data_len && cp->pe_data) {

I don't think that its possible for pe_data_len to be non-zero
and pe_data be NULL and vice-versa.

> +		*(p++) = IPVS_OPT_PE_DATA;
> +		*(p++) = cp->pe_data_len;
> +		memcpy(p, cp->pe_data,cp->pe_data_len);
> +		p += cp->pe_data_len;
> +		if (pe_name_len) {
> +			/* Add PE_NAME */
> +			*(p++) = IPVS_OPT_PE_NAME;
> +			*(p++) = pe_name_len;
> +			memcpy(p, cp->dest->svc->pe->name, pe_name_len);
> +			p[pe_name_len-1] = 0; /* Make sure \0 is there */
> +		}
> +	}
> +        m->size += len;
> +        curr_sb->head += len;
> +
>  	spin_unlock(&curr_sb_lock);
>  
>  	/* synchronize its controller if it has */

[ snip ]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [v2 PATCH 4/4] IPVS: Backup, Change sending to Version 1 format
  2010-10-30  6:50 ` Simon Horman
@ 2010-10-30 11:53   ` Hans Schillstrom
  2010-10-31  1:09     ` Simon Horman
  0 siblings, 1 reply; 4+ messages in thread
From: Hans Schillstrom @ 2010-10-30 11:53 UTC (permalink / raw)
  To: Simon Horman; +Cc: Hans Schillstrom, lvs-devel, ja, wensong, daniel.lezcano


On Saturday, October 30, 2010 08:50:31 Simon Horman wrote:
> On Fri, Oct 29, 2010 at 02:16:39PM +0200, Hans Schillstrom wrote:
> > Enable sending and removal of version 0 sending
> > Affected functions,
> > 
> > ip_vs_sync_buff_create()
> > ip_vs_sync_conn()
> > 
> > ip_vs_core.c removal of IPv4 check.
> > 
> > Signed-off-by: Hans Schillstrom <hans.schillstrom@ericsson.com>
> 
> [ snip ]
> 
> > diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c
> > index 5aa8e04..00f0fd3 100644
> > --- a/net/netfilter/ipvs/ip_vs_sync.c
> > +++ b/net/netfilter/ipvs/ip_vs_sync.c
> 
> [ snip ]
> 
> > @@ -376,36 +420,63 @@ void ip_vs_sync_conn(struct ip_vs_conn *cp)
> >  		}
> >  	}
> >  
> > -	len = (cp->flags & IP_VS_CONN_F_SEQ_MASK) ? FULL_CONN_SIZE :
> > -		SIMPLE_CONN_SIZE;
> > +
> >  	m = curr_sb->mesg;
> > -	s = (struct ip_vs_sync_conn_v0 *)curr_sb->head;
> > +	s = (union ip_vs_sync_conn *)curr_sb->head;
> > +	p = (char *)s;
> >  
> > +	/* Set message type */
> > +	s->v4.type = (cp->af == AF_INET6 ? STYPE_INET6 : 0 );
> >  	/* copy members */
> > -	s->protocol = cp->protocol;
> > -	s->cport = cp->cport;
> > -	s->vport = cp->vport;
> > -	s->dport = cp->dport;
> > -	s->caddr = cp->caddr.ip;
> > -	s->vaddr = cp->vaddr.ip;
> > -	s->daddr = cp->daddr.ip;
> > -	s->flags = htons(cp->flags & ~IP_VS_CONN_F_HASHED);
> > -	s->state = htons(cp->state);
> > -	if (cp->flags & IP_VS_CONN_F_SEQ_MASK) {
> > -		struct ip_vs_sync_conn_options *opt =
> > -			(struct ip_vs_sync_conn_options *)&s[1];
> > -		memcpy(opt, &cp->in_seq, sizeof(*opt));
> > -	}
> > -
> > +	s->v4.ver_size = htons(len & SVER_MASK);	/* Version=0 */
> > +	s->v4.flags = htonl(cp->flags & ~IP_VS_CONN_F_HASHED);
> > +	s->v4.state = htons(cp->state);
> > +	s->v4.protocol = cp->protocol;
> > +	s->v4.cport = cp->cport;
> > +	s->v4.vport = cp->vport;
> > +	s->v4.dport = cp->dport;
> > +	s->v4.fwmark = htonl(cp->fwmark);
> > +	s->v4.timeout = htonl(cp->timeout / HZ);
> >  	m->nr_conns++;
> > -	m->size += len;
> > -	curr_sb->head += len;
> >  
> > -	/* check if there is a space for next one */
> > -	if (curr_sb->head+FULL_CONN_SIZE > curr_sb->end) {
> > -		sb_queue_tail(curr_sb);
> > -		curr_sb = NULL;
> > +#ifdef CONFIG_IP_VS_IPV6
> > +	if (cp->af == AF_INET6 ) {
> > +		p += sizeof(struct ip_vs_sync_v6);
> > +		ipv6_addr_copy(&s->v6.caddr, &cp->caddr.in6);
> > +		ipv6_addr_copy(&s->v6.vaddr, &cp->vaddr.in6);
> > +		ipv6_addr_copy(&s->v6.daddr, &cp->daddr.in6);
> > +	} else
> > +#endif
> > +	{
> > +		p += sizeof(struct ip_vs_sync_v4);	/* options ptr */
> > +		s->v4.caddr = cp->caddr.ip;
> > +		s->v4.vaddr = cp->vaddr.ip;
> > +		s->v4.daddr = cp->daddr.ip;
> > +	}
> > +	if (cp->flags & IP_VS_CONN_F_SEQ_MASK) {
> > +		*(p++) = IPVS_OPT_SEQ_DATA;
> > +		*(p++) = sizeof(struct ip_vs_sync_conn_options);
> > +		memcpy(p, &cp->in_seq,
> > +			       sizeof(struct ip_vs_sync_conn_options));
> > +			p += sizeof(struct ip_vs_sync_conn_options);
> >  	}
> > +	/* Handle pe data */
> > +	if (cp->pe_data_len && cp->pe_data) {
> 
> I don't think that its possible for pe_data_len to be non-zero
> and pe_data be NULL and vice-versa.

I prefer to avoid a NULL pointer exception :-) 
but if you are 100% sure that that I can remove the  "&& cp->pe_data", I do that


> 
> > +		*(p++) = IPVS_OPT_PE_DATA;
> > +		*(p++) = cp->pe_data_len;
> > +		memcpy(p, cp->pe_data,cp->pe_data_len);
> > +		p += cp->pe_data_len;
> > +		if (pe_name_len) {
> > +			/* Add PE_NAME */
> > +			*(p++) = IPVS_OPT_PE_NAME;
> > +			*(p++) = pe_name_len;
> > +			memcpy(p, cp->dest->svc->pe->name, pe_name_len);
> > +			p[pe_name_len-1] = 0; /* Make sure \0 is there */
> > +		}
> > +	}
> > +        m->size += len;
> > +        curr_sb->head += len;
> > +
> >  	spin_unlock(&curr_sb_lock);
> >  
> >  	/* synchronize its controller if it has */
> 
> [ snip ]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [v2 PATCH 4/4] IPVS: Backup, Change sending to Version 1 format
  2010-10-30 11:53   ` Hans Schillstrom
@ 2010-10-31  1:09     ` Simon Horman
  0 siblings, 0 replies; 4+ messages in thread
From: Simon Horman @ 2010-10-31  1:09 UTC (permalink / raw)
  To: Hans Schillstrom; +Cc: Hans Schillstrom, lvs-devel, ja, wensong, daniel.lezcano

On Sat, Oct 30, 2010 at 01:53:17PM +0200, Hans Schillstrom wrote:
> 
> On Saturday, October 30, 2010 08:50:31 Simon Horman wrote:
> > On Fri, Oct 29, 2010 at 02:16:39PM +0200, Hans Schillstrom wrote:
> > > Enable sending and removal of version 0 sending
> > > Affected functions,
> > > 
> > > ip_vs_sync_buff_create()
> > > ip_vs_sync_conn()
> > > 
> > > ip_vs_core.c removal of IPv4 check.
> > > 
> > > Signed-off-by: Hans Schillstrom <hans.schillstrom@ericsson.com>
> > 
> > [ snip ]
> > 
> > > diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c
> > > index 5aa8e04..00f0fd3 100644
> > > --- a/net/netfilter/ipvs/ip_vs_sync.c
> > > +++ b/net/netfilter/ipvs/ip_vs_sync.c
> > 
> > [ snip ]
> > 
> > > @@ -376,36 +420,63 @@ void ip_vs_sync_conn(struct ip_vs_conn *cp)
> > >  		}
> > >  	}
> > >  
> > > -	len = (cp->flags & IP_VS_CONN_F_SEQ_MASK) ? FULL_CONN_SIZE :
> > > -		SIMPLE_CONN_SIZE;
> > > +
> > >  	m = curr_sb->mesg;
> > > -	s = (struct ip_vs_sync_conn_v0 *)curr_sb->head;
> > > +	s = (union ip_vs_sync_conn *)curr_sb->head;
> > > +	p = (char *)s;
> > >  
> > > +	/* Set message type */
> > > +	s->v4.type = (cp->af == AF_INET6 ? STYPE_INET6 : 0 );
> > >  	/* copy members */
> > > -	s->protocol = cp->protocol;
> > > -	s->cport = cp->cport;
> > > -	s->vport = cp->vport;
> > > -	s->dport = cp->dport;
> > > -	s->caddr = cp->caddr.ip;
> > > -	s->vaddr = cp->vaddr.ip;
> > > -	s->daddr = cp->daddr.ip;
> > > -	s->flags = htons(cp->flags & ~IP_VS_CONN_F_HASHED);
> > > -	s->state = htons(cp->state);
> > > -	if (cp->flags & IP_VS_CONN_F_SEQ_MASK) {
> > > -		struct ip_vs_sync_conn_options *opt =
> > > -			(struct ip_vs_sync_conn_options *)&s[1];
> > > -		memcpy(opt, &cp->in_seq, sizeof(*opt));
> > > -	}
> > > -
> > > +	s->v4.ver_size = htons(len & SVER_MASK);	/* Version=0 */
> > > +	s->v4.flags = htonl(cp->flags & ~IP_VS_CONN_F_HASHED);
> > > +	s->v4.state = htons(cp->state);
> > > +	s->v4.protocol = cp->protocol;
> > > +	s->v4.cport = cp->cport;
> > > +	s->v4.vport = cp->vport;
> > > +	s->v4.dport = cp->dport;
> > > +	s->v4.fwmark = htonl(cp->fwmark);
> > > +	s->v4.timeout = htonl(cp->timeout / HZ);
> > >  	m->nr_conns++;
> > > -	m->size += len;
> > > -	curr_sb->head += len;
> > >  
> > > -	/* check if there is a space for next one */
> > > -	if (curr_sb->head+FULL_CONN_SIZE > curr_sb->end) {
> > > -		sb_queue_tail(curr_sb);
> > > -		curr_sb = NULL;
> > > +#ifdef CONFIG_IP_VS_IPV6
> > > +	if (cp->af == AF_INET6 ) {
> > > +		p += sizeof(struct ip_vs_sync_v6);
> > > +		ipv6_addr_copy(&s->v6.caddr, &cp->caddr.in6);
> > > +		ipv6_addr_copy(&s->v6.vaddr, &cp->vaddr.in6);
> > > +		ipv6_addr_copy(&s->v6.daddr, &cp->daddr.in6);
> > > +	} else
> > > +#endif
> > > +	{
> > > +		p += sizeof(struct ip_vs_sync_v4);	/* options ptr */
> > > +		s->v4.caddr = cp->caddr.ip;
> > > +		s->v4.vaddr = cp->vaddr.ip;
> > > +		s->v4.daddr = cp->daddr.ip;
> > > +	}
> > > +	if (cp->flags & IP_VS_CONN_F_SEQ_MASK) {
> > > +		*(p++) = IPVS_OPT_SEQ_DATA;
> > > +		*(p++) = sizeof(struct ip_vs_sync_conn_options);
> > > +		memcpy(p, &cp->in_seq,
> > > +			       sizeof(struct ip_vs_sync_conn_options));
> > > +			p += sizeof(struct ip_vs_sync_conn_options);
> > >  	}
> > > +	/* Handle pe data */
> > > +	if (cp->pe_data_len && cp->pe_data) {
> > 
> > I don't think that its possible for pe_data_len to be non-zero
> > and pe_data be NULL and vice-versa.
> 
> I prefer to avoid a NULL pointer exception :-) 
> but if you are 100% sure that that I can remove the  "&& cp->pe_data", I do that

I am 99.9% sure. You call :-)

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-10-31  1:09 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-10-29 12:16 [v2 PATCH 4/4] IPVS: Backup, Change sending to Version 1 format Hans Schillstrom
2010-10-30  6:50 ` Simon Horman
2010-10-30 11:53   ` Hans Schillstrom
2010-10-31  1:09     ` Simon Horman

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.