Hello Simon.

On 5 May 2010 08:22, Simon Horman <ho...@verge.net.au> wrote:
> Getting OPS upstream is on my todo list. So if you have a patch
> then I'm very interested in it.

Apologies for the delay - attached is an updated version of the OPS
patch which applies against kernel 2.6.32.7.

It's basically Julian Anastasov's patches, with minor changes to fit
the new kernel. We've tested it locally, and have a customer testing
fairly high traffic levels through OPS.

Nick.

-- 
Nick Chalk.

Loadbalancer.org Ltd.
Phone: +44 (0)870 443 8779
http://www.loadbalancer.org/
diff -ur linux-2.6.32.7/include/linux/ip_vs.h linux-2.6.32.7-ops/include/linux/ip_vs.h
--- linux-2.6.32.7/include/linux/ip_vs.h	2010-01-28 23:06:20.000000000 +0000
+++ linux-2.6.32.7-ops/include/linux/ip_vs.h	2010-04-28 23:40:56.000000000 +0100
@@ -19,7 +19,7 @@
  */
 #define IP_VS_SVC_F_PERSISTENT	0x0001		/* persistent port */
 #define IP_VS_SVC_F_HASHED	0x0002		/* hashed entry */
-
+#define IP_VS_SVC_F_ONEPACKET	0x0004		/* one-packet scheduling */
 /*
  *      Destination Server Flags
  */
@@ -85,7 +85,7 @@
 #define IP_VS_CONN_F_SEQ_MASK	0x0600		/* in/out sequence mask */
 #define IP_VS_CONN_F_NO_CPORT	0x0800		/* no client port set yet */
 #define IP_VS_CONN_F_TEMPLATE	0x1000		/* template, not connection */
-
+#define IP_VS_CONN_F_ONE_PACKET	0x2000		/* forward only one packet */
 #define IP_VS_SCHEDNAME_MAXLEN	16
 #define IP_VS_IFNAME_MAXLEN	16
 
diff -ur linux-2.6.32.7/Makefile linux-2.6.32.7-ops/Makefile
--- linux-2.6.32.7/Makefile	2010-01-28 23:06:20.000000000 +0000
+++ linux-2.6.32.7-ops/Makefile	2010-04-28 23:47:39.000000000 +0100
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 32
-EXTRAVERSION = .7
+EXTRAVERSION = .7-ops
 NAME = Man-Eating Seals of Antiquity
 
 # *DOCUMENTATION*
diff -ur linux-2.6.32.7/net/netfilter/ipvs/ip_vs_conn.c linux-2.6.32.7-ops/net/netfilter/ipvs/ip_vs_conn.c
--- linux-2.6.32.7/net/netfilter/ipvs/ip_vs_conn.c	2010-01-28 23:06:20.000000000 +0000
+++ linux-2.6.32.7-ops/net/netfilter/ipvs/ip_vs_conn.c	2010-05-14 10:09:48.000000000 +0100
@@ -142,6 +142,9 @@
 	unsigned hash;
 	int ret;
 
+	if (cp->flags & IP_VS_CONN_F_ONE_PACKET)
+		return 0;
+
 	/* Hash by protocol, client address and port */
 	hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport);
 
@@ -339,8 +342,9 @@
  */
 void ip_vs_conn_put(struct ip_vs_conn *cp)
 {
-	/* reset it expire in its timeout */
-	mod_timer(&cp->timer, jiffies+cp->timeout);
+	unsigned long t = (cp->flags & IP_VS_CONN_F_ONE_PACKET) ?
+		0 : cp->timeout;
+	mod_timer(&cp->timer, jiffies+t);
 
 	__ip_vs_conn_put(cp);
 }
@@ -633,7 +637,7 @@
 	/*
 	 *	unhash it if it is hashed in the conn table
 	 */
-	if (!ip_vs_conn_unhash(cp))
+	if (!ip_vs_conn_unhash(cp) && !(cp->flags & IP_VS_CONN_F_ONE_PACKET))
 		goto expire_later;
 
 	/*
diff -ur linux-2.6.32.7/net/netfilter/ipvs/ip_vs_core.c linux-2.6.32.7-ops/net/netfilter/ipvs/ip_vs_core.c
--- linux-2.6.32.7/net/netfilter/ipvs/ip_vs_core.c	2010-01-28 23:06:20.000000000 +0000
+++ linux-2.6.32.7-ops/net/netfilter/ipvs/ip_vs_core.c	2010-05-14 10:11:17.000000000 +0100
@@ -189,7 +189,8 @@
 	struct ip_vs_iphdr iph;
 	struct ip_vs_dest *dest;
 	struct ip_vs_conn *ct;
-	__be16  dport;			/* destination port to forward */
+	__be16  dport;
+	__be16  flags;			/* destination port to forward */
 	union nf_inet_addr snet;	/* source network of the client,
 					   after masking */
 
@@ -336,6 +337,10 @@
 		dport = ports[1];
 	}
 
+	flags = (svc->flags & IP_VS_SVC_F_ONEPACKET
+		 && iph.protocol == IPPROTO_UDP)?
+		IP_VS_CONN_F_ONE_PACKET : 0;
+
 	/*
 	 *    Create a new connection according to the template
 	 */
@@ -343,7 +348,7 @@
 			    &iph.saddr, ports[0],
 			    &iph.daddr, ports[1],
 			    &dest->addr, dport,
-			    0,
+			    flags,
 			    dest);
 	if (cp == NULL) {
 		ip_vs_conn_put(ct);
@@ -373,7 +378,7 @@
 	struct ip_vs_conn *cp = NULL;
 	struct ip_vs_iphdr iph;
 	struct ip_vs_dest *dest;
-	__be16 _ports[2], *pptr;
+	__be16 _ports[2], *pptr, flags;
 
 	ip_vs_fill_iphdr(svc->af, skb_network_header(skb), &iph);
 	pptr = skb_header_pointer(skb, iph.len, sizeof(_ports), _ports);
@@ -403,6 +408,10 @@
 		return NULL;
 	}
 
+	flags = (svc->flags & IP_VS_SVC_F_ONEPACKET
+		 && iph.protocol == IPPROTO_UDP)?
+		IP_VS_CONN_F_ONE_PACKET : 0;
+
 	/*
 	 *    Create a connection entry.
 	 */
@@ -410,7 +419,7 @@
 			    &iph.saddr, pptr[0],
 			    &iph.daddr, pptr[1],
 			    &dest->addr, dest->port ? dest->port : pptr[1],
-			    0,
+			    flags,
 			    dest);
 	if (cp == NULL)
 		return NULL;
@@ -460,6 +469,9 @@
 	if (sysctl_ip_vs_cache_bypass && svc->fwmark && unicast) {
 		int ret, cs;
 		struct ip_vs_conn *cp;
+		__u16 flags = (svc->flags & IP_VS_SVC_F_ONEPACKET &&
+				iph.protocol == IPPROTO_UDP)?
+				IP_VS_CONN_F_ONE_PACKET : 0;
 		union nf_inet_addr daddr =  { .all = { 0, 0, 0, 0 } };
 
 		ip_vs_service_put(svc);
@@ -470,7 +482,7 @@
 				    &iph.saddr, pptr[0],
 				    &iph.daddr, pptr[1],
 				    &daddr, 0,
-				    IP_VS_CONN_F_BYPASS,
+				    IP_VS_CONN_F_BYPASS | flags,
 				    NULL);
 		if (cp == NULL)
 			return NF_DROP;
diff -ur linux-2.6.32.7/net/netfilter/ipvs/ip_vs_ctl.c linux-2.6.32.7-ops/net/netfilter/ipvs/ip_vs_ctl.c
--- linux-2.6.32.7/net/netfilter/ipvs/ip_vs_ctl.c	2010-01-28 23:06:20.000000000 +0000
+++ linux-2.6.32.7-ops/net/netfilter/ipvs/ip_vs_ctl.c	2010-04-28 23:40:56.000000000 +0100
@@ -1863,14 +1863,16 @@
 					   svc->scheduler->name);
 			else
 #endif
-				seq_printf(seq, "%s  %08X:%04X %s ",
+				seq_printf(seq, "%s  %08X:%04X %s %s ",
 					   ip_vs_proto_name(svc->protocol),
 					   ntohl(svc->addr.ip),
 					   ntohs(svc->port),
-					   svc->scheduler->name);
+					   svc->scheduler->name,
+				  	   (svc->flags & IP_VS_SVC_F_ONEPACKET)?"ops ":"");
 		} else {
-			seq_printf(seq, "FWM  %08X %s ",
-				   svc->fwmark, svc->scheduler->name);
+			seq_printf(seq, "FWM  %08X %s %s",
+				   svc->fwmark, svc->scheduler->name,
+				   (svc->flags & IP_VS_SVC_F_ONEPACKET)?"ops ":"");
 		}
 
 		if (svc->flags & IP_VS_SVC_F_PERSISTENT)
_______________________________________________
Please read the documentation before posting - it's available at:
http://www.linuxvirtualserver.org/

LinuxVirtualServer.org mailing list - lvs-users@LinuxVirtualServer.org
Send requests to lvs-users-requ...@linuxvirtualserver.org
or go to http://lists.graemef.net/mailman/listinfo/lvs-users

Reply via email to