SOURCES: squid_hit_miss_mark.patch - up for SQUID3

dzeus dzeus at pld-linux.org
Wed May 14 23:38:09 CEST 2008


Author: dzeus                        Date: Wed May 14 21:38:09 2008 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- up for SQUID3

---- Files affected:
SOURCES:
   squid_hit_miss_mark.patch (1.5 -> 1.6) 

---- Diffs:

================================================================
Index: SOURCES/squid_hit_miss_mark.patch
diff -u SOURCES/squid_hit_miss_mark.patch:1.5 SOURCES/squid_hit_miss_mark.patch:1.6
--- SOURCES/squid_hit_miss_mark.patch:1.5	Sun Mar 25 23:46:41 2007
+++ SOURCES/squid_hit_miss_mark.patch	Wed May 14 23:38:03 2008
@@ -1,216 +1,279 @@
-diff -Nru squid-2.6.STABLE12.orig/src/cf.data.pre squid-2.6.STABLE12/src/cf.data.pre
---- squid-2.6.STABLE12.orig/src/cf.data.pre	2007-03-21 19:43:48.000000000 +0200
-+++ squid-2.6.STABLE12/src/cf.data.pre	2007-03-21 19:44:08.000000000 +0200
-@@ -3193,6 +3193,64 @@
- 	to off when using this directive in such configurations.
+--- /configure.in	2008-04-29 02:52:30 +0000
++++ /configure.in	2008-05-03 23:37:00 +0000
+@@ -1733,6 +1733,16 @@
+   fi
+ ])
+ 
++AC_ARG_ENABLE(zph-qos,
++[  --enable-zph-qos        Enable ZPH QOS support],
++[ if test "$enableval" = "yes" ; then
++    echo "ZPH QOS enabled"
++    AC_DEFINE(USE_ZPH_QOS,1,
++    [ Define this to use Squid's ZPH (Zero Penalty Hit) QOS features.
++      When enabled, Squid will alter TOS field of HIT responses for better QOS on intermediate routing/shaping devices.])
++  fi
++])
++
+ AC_ARG_WITH(filedescriptors,
+ [  --with-filedescriptors=NUMBER
+                           Force squid to support NUMBER filedescriptors],
+
+--- /src/cf.data.pre	2008-05-02 11:12:10 +0000
++++ /src/cf.data.pre	2008-05-03 23:37:00 +0000
+@@ -1103,6 +1103,66 @@
+ 	making the request.
  DOC_END
  
 +NAME: zph_tos_local
 +TYPE: int
++IFDEF: USE_ZPH_QOS
 +DEFAULT: 0
 +LOC: Config.zph_tos_local
 +DOC_START
-+	Allows you to select a TOS/Diffserv value to mark local hits. Read above
-+	(tcp_outgoing_tos) for details/requirements about TOS.
-+	Default: 0 (disabled).
++       Allows you to select a TOS/Diffserv value to mark local hits. Read above
++       (tcp_outgoing_tos) for details/requirements about TOS.
++       Default: 0 (disabled).
 +DOC_END
 +
 +NAME: zph_tos_peer
 +TYPE: int
++IFDEF: USE_ZPH_QOS
 +DEFAULT: 0
 +LOC: Config.zph_tos_peer
 +DOC_START
-+	Allows you to select a TOS/Diffserv value to mark peer hits. Read above
-+	(tcp_outgoing_tos) for details/requirements about TOS.
-+	Default: 0 (disabled).
++       Allows you to select a TOS/Diffserv value to mark peer hits. Read above
++       (tcp_outgoing_tos) for details/requirements about TOS.
++       Default: 0 (disabled).
 +DOC_END
 +
 +NAME: zph_tos_parent
 +COMMENT: on|off
 +TYPE: onoff
-+LOC: Config.onoff.zph_tos_parent
++IFDEF: USE_ZPH_QOS
 +DEFAULT: on
++LOC: Config.onoff.zph_tos_parent
 +DOC_START
-+	Set this to off if you want only sibling hits to be marked.
-+	If set to on (default), parent hits are being marked too.
++       Set this to off if you want only sibling hits to be marked.
++       If set to on (default), parent hits are being marked too.
 +DOC_END
 +
 +NAME: zph_preserve_miss_tos
 +COMMENT: on|off
 +TYPE: onoff
-+LOC: Config.onoff.zph_preserve_miss_tos
++IFDEF: USE_ZPH_QOS
 +DEFAULT: on
++LOC: Config.onoff.zph_preserve_miss_tos
 +DOC_START
-+	If set to on (default), any HTTP response towards clients will
-+	have the TOS value of the response comming from the remote
-+	server masked with the value of zph_preserve_miss_tos_mask.
-+	For this to work correctly, you will need to patch your linux
-+	kernel with the TOS preserving ZPH patch.
-+	Has no effect under FreeBSD, works only under linux ZPH patched
-+	kernels.
++       If set to on (default), any HTTP response towards clients will
++       have the TOS value of the response comming from the remote
++       server masked with the value of zph_preserve_miss_tos_mask.
++       For this to work correctly, you will need to patch your linux
++       kernel with the TOS preserving ZPH patch.
++       The kernel patch can be downloaded from http://zph.bratcheda.org
 +DOC_END
 +
 +NAME: zph_preserve_miss_tos_mask
 +TYPE: int
++IFDEF: USE_ZPH_QOS
 +DEFAULT: 255
 +LOC: Config.zph_preserve_miss_tos_mask
 +DOC_START
-+	Allows you to mask certain bits in the TOS received from the
-+	remote server, before copying the value to the TOS send towards
-+	clients.
-+	See zph_preserve_miss_tos for details.
-+	
-+	Default: 255 (TOS from server is not changed).
++       Allows you to mask certain bits in the TOS received from the
++       remote server, before copying the value to the TOS send towards
++       clients.
++       Default: 255 (TOS from server is not changed).
 +DOC_END
 +
  NAME: tcp_outgoing_address
  TYPE: acl_address
  DEFAULT: none
-diff -Nru squid-2.6.STABLE12.orig/src/client_side.c squid-2.6.STABLE12/src/client_side.c
---- squid-2.6.STABLE12.orig/src/client_side.c	2007-03-21 19:43:48.000000000 +0200
-+++ squid-2.6.STABLE12/src/client_side.c	2007-03-21 19:44:08.000000000 +0200
-@@ -2621,6 +2621,55 @@
- 	return;
+
+--- /src/client_side_reply.cc	2008-03-30 14:29:57 +0000
++++ /src/client_side_reply.cc	2008-05-03 23:37:00 +0000
+@@ -48,6 +48,9 @@
+ #include "ESI.h"
+ #endif
+ #include "MemObject.h"
++#if USE_ZPH_QOS
++#include "fde.h"
++#endif
+ #include "ACLChecklist.h"
+ #include "ACL.h"
+ #if DELAY_POOLS
+@@ -1548,6 +1551,58 @@
+         /* guarantee nothing has been sent yet! */
+         assert(http->out.size == 0);
+         assert(http->out.offset == 0);
++#if USE_ZPH_QOS        
++        if (Config.zph_tos_local ||
++        	Config.zph_tos_peer ||
++	        Config.onoff.zph_preserve_miss_tos && Config.zph_preserve_miss_tos_mask)
++		{
++		   int need_change = 0;
++		   int hit = 0;
++		   int tos = 0;
++		   int tos_old = 0;
++		   int tos_len = sizeof(tos_old);
++		   int res;
++		               
++		   if (Config.zph_tos_local)
++		   {
++			   /* local hit */
++		       hit = 1;
++		       tos = Config.zph_tos_local;
++		   }
++		   else if (Config.zph_tos_peer && 
++			    	(http->request->hier.code==SIBLING_HIT ||
++			    	Config.onoff.zph_tos_parent&&http->request->hier.code==PARENT_HIT))
++		   {
++			  /* sibling or parent hit */
++		       hit = 1;
++		       tos = Config.zph_tos_peer;
++		   }
++		   
++		   if (http->request->flags.proxy_keepalive)
++		   {
++			   res = getsockopt(http->getConn()->fd, IPPROTO_IP, IP_TOS, &tos_old, (socklen_t*)&tos_len);
++		       if (res < 0)
++		       {
++		           debugs(33, 1, "ZPH: error in getsockopt(IP_TOS) on keepalived FD "<< http->getConn()->fd << " " << xstrerror());
++		       }
++		       else if (hit && tos_old != tos)
++		       {
++		    	   /* HIT: 1-st request, or previous was MISS,
++		    	    * or local/parent hit change.
++		    	    */
++		           need_change = 1;                    
++		       }
++		   }
++		   else if (hit)
++		   {
++			   /* no keepalive */
++		       need_change = 1;
++		   }
++		   if (need_change) {
++			   comm_set_tos(http->getConn()->fd,tos);
++		   }
++		}        
++#endif /* USE_ZPH_QOS */        
+         tempBuffer.offset = reqofs;
+         tempBuffer.length = getNextNode()->readBuffer.length;
+         tempBuffer.data = getNextNode()->readBuffer.data;
+@@ -1833,6 +1888,16 @@
+         body_buf = buf;
      }
-     assert(http->out.offset == 0);
-+	
-+	if ( Config.zph_tos_local || Config.zph_tos_peer ||
-+         (Config.onoff.zph_preserve_miss_tos && Config.zph_preserve_miss_tos_mask) )
+ 
++#if USE_ZPH_QOS    
++    if (reqofs==0 && !logTypeIsATcpHit(http->logType) &&
++       	Config.onoff.zph_preserve_miss_tos &&
++       	Config.zph_preserve_miss_tos_mask)
 +    {
-+       int need_change = 0;
-+       int hit = 0;
-+       int tos = 0;
-+       int tos_old = 0;
-+       int tos_len = sizeof(tos_old);
-+       int res;
-+                   
-+       if (Config.zph_tos_local && isTcpHit(http->log_type)) {     /* local hit */
-+           hit = 1;
-+           tos = Config.zph_tos_local;
-+       } else if (Config.zph_tos_peer &&
-+           (http->request->hier.code == SIBLING_HIT ||             /* sibling hit */
-+           (Config.onoff.zph_tos_parent &&
-+           http->request->hier.code == PARENT_HIT))) {             /* parent hit */
-+           hit = 1;
-+           tos = Config.zph_tos_peer;
-+       }
-+       if (http->request->flags.proxy_keepalive) {
-+           if (getsockopt(fd, IPPROTO_IP, IP_TOS, &tos_old, &tos_len) < 0) {
-+               debug(33, 1) ("ZPH: getsockopt(IP_TOS) on FD %d: %s\n", fd, xstrerror());
-+           } else if (hit && tos_old != tos) {     /* HIT: 1-st request, or previous was MISS, */
-+               need_change = 1;                    /* or local/parent hit change */
-+           } else if (!hit && (tos_old ||  /* MISS: previous was HIT */
-+                            Config.onoff.zph_preserve_miss_tos)) { /* TOS copying is on */
-+#if defined(_SQUID_LINUX_)			    
-+                   if ( Config.onoff.zph_preserve_miss_tos ) {
-+                     tos = (entry->mem_obj != NULL) ?
-+                           (entry->mem_obj->recvTOS & Config.zph_preserve_miss_tos_mask):0;
-+                   } else tos = 0;
-+#else
-+		    tos = 0;
-+#endif		   
-+               need_change = 1;
-+           } 
-+       } else if (hit) {                           /* no keepalive */
-+           need_change = 1;
-+       }
-+       if (need_change) {
-+           if (!hit) enter_suid(); /* Setting TOS bit6-7 is privilleged */
-+           res = setsockopt(fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
-+           if (!hit) leave_suid(); /* Setting bit5-7 is privilleged */
-+           if ( res < 0)
-+               debug(33, 1) ("ZPH: setsockopt(IP_TOS) on FD %d: %s\n", fd, xstrerror());
-+       }
++    	int tos = fd_table[fd].upstreamTOS & Config.zph_preserve_miss_tos_mask;
++    	comm_set_tos(fd,tos);
 +    }
-     rep = http->reply = clientBuildReply(http, buf, size);
-     if (!rep) {
- 	/* Forward as HTTP/0.9 body with no reply */
-diff -Nru squid-2.6.STABLE12.orig/src/http.c squid-2.6.STABLE12/src/http.c
---- squid-2.6.STABLE12.orig/src/http.c	2007-03-13 00:27:09.000000000 +0200
-+++ squid-2.6.STABLE12/src/http.c	2007-03-21 19:44:08.000000000 +0200
-@@ -1373,6 +1373,53 @@
-     peer *p = httpState->peer;
-     CWCB *sendHeaderDone;
-     int fd = httpState->fd;
++#endif    
++
+     /* We've got the final data to start pushing... */
+     flags.storelogiccomplete = 1;
+ 
+
+--- /src/fde.h	2007-08-13 23:20:50 +0000
++++ /src/fde.h	2008-05-03 23:37:00 +0000
+@@ -106,6 +106,9 @@
+         long handle;
+     } win32;
+ #endif
++#if USE_ZPH_QOS
++    unsigned char upstreamTOS;			/* see FwdState::dispatch()  */
++#endif
+ 
+ };
+ 
+
+--- /src/forward.cc	2008-04-12 15:16:27 +0000
++++ /src/forward.cc	2008-05-03 23:37:00 +0000
+@@ -964,6 +964,54 @@
+ 
+     netdbPingSite(request->host);
+ 
++#if USE_ZPH_QOS
++    /* Retrieves remote server TOS value, and stores it as part of the
++     * original client request FD object. It is later used to forward
++     * remote server's TOS in the response to the client in case of a MISS.
++     */
++    fde * clientFde = &fd_table[client_fd];
++    if (clientFde)
++    {
++    	int tos = 1;
++    	int tos_len = sizeof(tos);
++    	clientFde->upstreamTOS = 0;
++        if (setsockopt(server_fd,SOL_IP,IP_RECVTOS,&tos,tos_len)==0)
++        {
++           unsigned char buf[512];
++           int len = 512;
++           if (getsockopt(server_fd,SOL_IP,IP_PKTOPTIONS,buf,(socklen_t*)&len) == 0)
++           {
++               /* Parse the PKTOPTIONS structure to locate the TOS data message
++                * prepared in the kernel by the ZPH incoming TCP TOS preserving
++                * patch.
++                */
++        	   unsigned char * p = buf;
++               while (p-buf < len)
++               {
++                  struct cmsghdr *o = (struct cmsghdr*)p;
++                  if (o->cmsg_len<=0)
++                     break;
 +    
-+#if defined(_SQUID_LINUX_)    
-+/* ZPH patch starts here (M.Stavrev 25-05-2005)
-+ * Retrieve connection peer's TOS value (which its SYN_ACK TCP segment
-+ * was encapsulated into an IP packet)
-+ */
-+    int tos, tos_len;
-+    if ( entry && entry->mem_obj ) { // Is this check necessary ? Seems not, but
-+				 // have no time to investigate further.
-+	    entry->mem_obj->recvTOS = 0;
-+	    tos = 1;
-+	    tos_len = sizeof(tos);
-+	 	if ( setsockopt(fd,SOL_IP, IP_RECVTOS, &tos, tos_len) == 0 ) {
-+		    unsigned char buf[128];
-+		    int len = 128;
-+		    if (getsockopt(fd, SOL_IP, IP_PKTOPTIONS, buf, &len) == 0)
-+		    {
-+		    	/* Parse the PKTOPTIONS structure to locate the TOS data message
-+		    	 * prepared in the kernel by the ZPH incoming TCP TOS preserving
-+		    	 * patch. In 99,99% the TOS should be located at buf[12], but
-+		    	 * let's do it the right way.
-+		    	 */
-+		    	unsigned char * p = buf;
-+		    	while ( p-buf < len ) {
-+		    		struct cmsghdr * o = (struct cmsghdr*)p;
-+		    		if ( o->cmsg_len <= 0 || o->cmsg_len > 52 )
-+		    		   break;
-+		    		if ( o->cmsg_level == SOL_IP && o->cmsg_type == IP_TOS ) {
-+	    			   entry->mem_obj->recvTOS = (unsigned char)(*(int*)
-+			    	   						(p + sizeof(struct cmsghdr)));
-+				       debug(11, 5) ("ZPH: Incomming TOS=%d on FD %d\n",
-+				       			entry->mem_obj->recvTOS, fd );
-+			    	   break;
-+		    		}
-+		    		p += o->cmsg_len;
-+		    	}
-+		    } else {
-+		    	debug(11, 5) ("ZPH: getsockopt(IP_PKTOPTIONS) on FD %d: %s\n",
-+		    				 fd, xstrerror());
-+		    }
-+		} else {
-+	    	debug(11, 5) ("ZPH: setsockopt(IP_RECVTOS) on FD %d: %s\n",
-+	    					 fd, xstrerror());
-+		}
-+    }
-+/* ZPH patch ends here */    
++                  if (o->cmsg_level == SOL_IP && o->cmsg_type == IP_TOS)
++                  {
++                	  clientFde->upstreamTOS = (unsigned char)(*(int*)CMSG_DATA(o));
++                	  break;
++                  }
++                  p += CMSG_LEN(o->cmsg_len);
++               }
++           }
++           else
++           {
++               debugs(33, 1, "ZPH: error in getsockopt(IP_PKTOPTIONS) on FD "<<server_fd<<" "<<xstrerror());
++           }
++        }
++        else
++        {
++        	debugs(33, 1, "ZPH: error in setsockopt(IP_RECVTOS) on FD "<<server_fd<<" "<<xstrerror());
++        }
++    }    
++#endif
++
+     if (servers && (p = servers->_peer)) {
+         p->stats.fetches++;
+         request->peer_login = p->login;
+
+--- /src/structs.h	2008-05-02 11:12:10 +0000
++++ /src/structs.h	2008-05-03 23:37:00 +0000
+@@ -554,9 +554,11 @@
+         int httpd_suppress_version_string;
+         int global_internal_static;
+         int debug_override_X;
+-    }
+-
+-    onoff;
++#if USE_ZPH_QOS
++        int zph_tos_parent;
++        int zph_preserve_miss_tos;
 +#endif
++    } onoff;
  
-     debug(11, 5) ("httpSendRequest: FD %d: httpState %p.\n", fd, httpState);
+     class ACL *aclList;
  
-diff -Nru squid-2.6.STABLE12.orig/src/structs.h squid-2.6.STABLE12/src/structs.h
---- squid-2.6.STABLE12.orig/src/structs.h	2007-02-27 03:20:01.000000000 +0200
-+++ squid-2.6.STABLE12/src/structs.h	2007-03-21 19:44:08.000000000 +0200
-@@ -669,6 +669,8 @@
- 	int relaxed_header_parser;
- 	int accel_no_pmtu_disc;
- 	int global_internal_static;
-+	int zph_tos_parent;
-+	int zph_preserve_miss_tos;	
- 	int httpd_suppress_version_string;
- 	int via;
- 	int check_hostnames;
-@@ -793,6 +795,9 @@
+@@ -720,6 +722,11 @@
      int sleep_after_fork;	/* microseconds */
      time_t minimum_expiry_time;	/* seconds */
      external_acl *externalAclHelperList;
-+	int zph_tos_local;
-+   	int zph_tos_peer;
-+	int zph_preserve_miss_tos_mask;    
-     errormap *errorMapList;
++#if USE_ZPH_QOS
++    int zph_tos_local;
++    int zph_tos_peer;
++    int zph_preserve_miss_tos_mask; 
++#endif
  #if USE_SSL
-     struct {
-@@ -1724,6 +1729,9 @@
-     const char *vary_encoding;
-     StoreEntry *ims_entry;
-     time_t refresh_timestamp;
-+#if defined(_SQUID_LINUX_)    
-+    unsigned char recvTOS; /* ZPH patch - stores remote server's TOS */
-+#endif	
- };
  
- struct _StoreEntry {
+     struct
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/SOURCES/squid_hit_miss_mark.patch?r1=1.5&r2=1.6&f=u



More information about the pld-cvs-commit mailing list