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 _______________________________________________ pld-cvs-commit mailing list [email protected] http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit
