Search squid archive

wccpv2.patch fails on squid-2.5.STABLE10

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I am trying to install squid-2.5.STABLE10 with wccpv2 support. I use
STABLE9 with wccpv2 and I decided to upgrade to STABLE10. I used
wccpv2.patch (don't remember where I got it, as it was a long time ago)
with STABLE9 and it worked just fine. The same patch failed with
STABLE10 (see patch.dump) and Makefile.in.rej is created (attached). I
thought this patch is outdated and decided to look for up2date patch, so
I found a patch located here:

http://devel.squid-cache.org/projects.html#visolve_wccpv2

I applied it without a problem but there is no --enable-wccpv2 in the
output of ./configure --help. So here I am lost. I have found on forums
that bootstrap.sh might help, but I get the following:

root@proxy:/usr/local/src/squid-2.5.STABLE10# ./bootstrap.sh
WARNING: Cannot find automake version 1.5
Trying automake (GNU automake) 1.4-p6
WARNING: Cannot find autoconf version 2.13
Trying autoconf (GNU Autoconf) 2.59
aclocal: configure.in: 27: macro `AM_PROG_CC_C_O' not found in library
aclocal failed
Autotool bootstrapping failed. You will need to investigate and correct
before you can develop on this source tree
root@proxy:/usr/local/src/squid-2.5.STABLE10#

The system is Debian sarge updated to latest stable. Has anyone
successfully pached STABLE 10 to support wccpv2?

Thanks in advance.

Best Regards,
--
George Chelidze

Attachment: Makefile.in.rej
Description: application/reject

root@proxy:/usr/local/src# patch -p0 < wccpv2.patch
patching file squid-2.5.STABLE10/acconfig.h
patching file squid-2.5.STABLE10/configure
Hunk #1 succeeded at 74 (offset 4 lines).
Hunk #2 succeeded at 2196 (offset 99 lines).
Hunk #3 succeeded at 2223 with fuzz 2 (offset 113 lines).
Hunk #4 succeeded at 9046 with fuzz 1 (offset 798 lines).
patching file squid-2.5.STABLE10/configure.in
Hunk #1 succeeded at 468 (offset -2 lines).
patching file squid-2.5.STABLE10/include/autoconf.h.in
patching file squid-2.5.STABLE10/src/Makefile.in
Hunk #1 succeeded at 134 (offset 2 lines).
Hunk #2 succeeded at 203 (offset 8 lines).
Hunk #3 succeeded at 305 (offset 9 lines).
Hunk #4 FAILED at 459.
Hunk #5 succeeded at 518 (offset 33 lines).
Hunk #6 succeeded at 594 (offset 34 lines).
Hunk #7 succeeded at 830 (offset 60 lines).
1 out of 7 hunks FAILED -- saving rejects to file squid-2.5.STABLE10/src/Makefile.in.rej
patching file squid-2.5.STABLE10/src/cf.data.pre
Hunk #1 succeeded at 3367 (offset 252 lines).
Hunk #2 succeeded at 3384 (offset 252 lines).
Hunk #3 succeeded at 3407 (offset 252 lines).
patching file squid-2.5.STABLE10/src/cf_gen_defines
patching file squid-2.5.STABLE10/src/main.c
Hunk #1 succeeded at 300 (offset 9 lines).
Hunk #2 succeeded at 329 (offset 9 lines).
Hunk #3 succeeded at 352 (offset 9 lines).
Hunk #4 succeeded at 393 (offset 19 lines).
Hunk #5 succeeded at 560 (offset 23 lines).
Hunk #6 succeeded at 986 (offset 23 lines).
patching file squid-2.5.STABLE10/src/protos.h
Hunk #1 succeeded at 561 (offset -9 lines).
patching file squid-2.5.STABLE10/src/structs.h
Hunk #1 succeeded at 462 (offset 18 lines).
patching file squid-2.5.STABLE10/src/wccpv2.c
root@proxy:/usr/local/src#

diff -Nur squid-2.5.STABLE10/acconfig.h squid-2.5.STABLE10_wccpv2/acconfig.h
--- squid-2.5.STABLE10/acconfig.h	Sun Apr 14 03:15:58 2002
+++ squid-2.5.STABLE10_wccpv2/acconfig.h	Fri Jun 14 14:22:45 2002
@@ -112,9 +112,14 @@
 #undef SQUID_SNMP
 
 /*
- * Define to enable WCCP
+ * Define to enable WCCPv1
  */
 #define USE_WCCP 1
+
+/*
+ * Define to enable WCCP V2
+ */
+#undef USE_WCCPv2
 
 /*
  * Squid frequently calls gettimeofday() for accurate timestamping.
diff -Nur squid-2.5.STABLE10/configure squid-2.5.STABLE10_wccpv2/configure
--- squid-2.5.STABLE10/configure	Wed May  1 02:54:04 2002
+++ squid-2.5.STABLE10_wccpv2/configure	Fri Jun 14 14:45:09 2002
@@ -70,7 +70,9 @@
 ac_help="$ac_help
   --enable-referer-log    Enable logging of Referer header"
 ac_help="$ac_help
-  --disable-wccp          Disable Web Cache Coordination Protocol"
+  --disable-wccp          Disable Web Cache Coordination V1 Protocol"
+ac_help="$ac_help
+  --enable-wccpv2         Enable Web Cache Coordination V2 Protocol" 
 ac_help="$ac_help
   --enable-kill-parent-hack
                           Kill parent on shutdown"
@@ -2095,7 +2097,7 @@
 if test "${enable_wccp+set}" = set; then
   enableval="$enable_wccp"
    if test "$enableval" = "no" ; then
-    echo "Web Cache Coordination Protocol disabled"
+    echo "Web Cache Coordination V1 Protocol disabled"
     cat >> confdefs.h <<\EOF
 #define USE_WCCP 0
 EOF
@@ -2108,7 +2110,36 @@
   fi

 fi
-
+
+if false; then
+  USE_WCCPv2_TRUE=
+  USE_WCCPv2_FALSE='#'
+else
+  USE_WCCPv2_TRUE='#'
+  USE_WCCPv2_FALSE=
+fi
+# Check whether --enable-wccpv2 or --disable-wccpv2 was given.
+if test "${enable_wccpv2+set}" = set; then
+  enableval="$enable_wccpv2"
+  if test "$enableval" = "yes"; then
+   echo "Web Cache Coordination V2 Protocol Enabled"
+   cat >> confdefs.h <<\EOF
+#define USE_WCCPv2 1
+EOF
+
+
+
+if true; then
+  USE_WCCPv2_TRUE=
+  USE_WCCPv2_FALSE='#'
+else
+  USE_WCCPv2_TRUE='#'
+  USE_WCCPv2_FALSE=
+fi
+  fi
+
+fi
+
 
 # Check whether --enable-kill-parent-hack or --disable-kill-parent-hack was given.
 if test "${enable_kill_parent_hack+set}" = set; then
@@ -8217,6 +8248,8 @@
 s%@OPT_PINGER_EXE@%$OPT_PINGER_EXE%g
 s%@USE_DELAY_POOLS_TRUE@%$USE_DELAY_POOLS_TRUE%g
 s%@USE_DELAY_POOLS_FALSE@%$USE_DELAY_POOLS_FALSE%g
+s%@USE_WCCPv2_TRUE@%$USE_WCCPv2_TRUE%g
+s%@USE_WCCPv2_FALSE@%$USE_WCCPv2_FALSE%g
 s%@USE_SNMP_TRUE@%$USE_SNMP_TRUE%g
 s%@USE_SNMP_FALSE@%$USE_SNMP_FALSE%g
 s%@SNMPLIB@%$SNMPLIB%g
diff -Nur squid-2.5.STABLE10/configure.in squid-2.5.STABLE10_wccpv2/configure.in
--- squid-2.5.STABLE10/configure.in	Wed May  1 02:54:04 2002
+++ squid-2.5.STABLE10_wccpv2/configure.in	Fri Jun 14 14:41:01 2002
@@ -470,15 +470,26 @@
   fi
 ])
 
-AC_ARG_ENABLE(wccp,  
-[  --disable-wccp          Disable Web Cache Coordination Protocol],
+AC_ARG_ENABLE(wccp,
+[  --disable-wccp          Disable Web Cache Coordination V1 Protocol],
 [ if test "$enableval" = "no" ; then
-    echo "Web Cache Coordination Protocol disabled"
+    echo "Web Cache Coordination V1 Protocol disabled"
     AC_DEFINE(USE_WCCP, 0)
   else
     AC_DEFINE(USE_WCCP, 1)
   fi
-])      
+])
+
+AM_CONDITIONAL(USE_WCCPv2, false)
+AC_ARG_ENABLE(wccpv2,
+[  --enable-wccpv2          Enable Web Cache Coordination V2 Protocol],
+[ if test "$enableval" = "yes" ; then
+    echo "Web Cache Coordination V2 Protocol enabled"
+    AC_DEFINE(USE_WCCPv2, 1)
+    AM_CONDITIONAL(USE_WCCPv2, true)
+  fi
+])
+
 
 AC_ARG_ENABLE(kill-parent-hack,
 [  --enable-kill-parent-hack
diff -Nur squid-2.5.STABLE10/include/autoconf.h.in squid-2.5.STABLE10_wccpv2/include/autoconf.h.in
--- squid-2.5.STABLE10/include/autoconf.h.in	Sun Apr 14 05:44:51 2002
+++ squid-2.5.STABLE10_wccpv2/include/autoconf.h.in	Fri Jun 14 14:47:16 2002
@@ -149,9 +149,14 @@
 #undef SQUID_SNMP
 
 /*
- * Define to enable WCCP
+ * Define to enable WCCP V1
  */
 #define USE_WCCP 1
+
+/*
+ * Define to enable WCCP V2
+ */
+#undef USE_WCCPv2
 
 /*
  * Define this to include code which lets you specify access control
diff -Nur squid-2.5.STABLE10/src/Makefile.in squid-2.5.STABLE10_wccpv2/src/Makefile.in
--- squid-2.5.STABLE10/src/Makefile.in	Mon Apr 15 01:32:03 2002
+++ squid-2.5.STABLE10_wccpv2/src/Makefile.in	Fri Jun 14 14:59:37 2002
@@ -132,6 +132,9 @@
 @USE_DELAY_POOLS_TRUE@DELAY_POOL_SOURCE = delay_pools.c
 @USE_DELAY_POOLS_FALSE@DELAY_POOL_SOURCE = 
 
+@USE_WCCPv2_TRUE@WCCPv2_SOURCE = wccpv2.c
+@USE_WCCPv2_FALSE@WCCPv2_SOURCE =
+
 @ENABLE_HTCP_TRUE@HTCPSOURCE = htcp.c
 
 @MAKE_LEAKFINDER_TRUE@LEAKFINDERSOURCE = leakfinder.c
@@ -192,6 +195,7 @@
 	unlinkd.c \
 	ssl_support.c \
 	ssl_support.h \
+	wccpv2.c \
 	win32.c
 
 
@@ -292,6 +296,7 @@
 	useragent.c \
 	wais.c \
 	wccp.c \
+        $(WCCPv2_SOURCE) \
 	whois.c \
 	$(WIN32SOURCE)
 
@@ -445,8 +450,10 @@
 @ENABLE_SSL_TRUE@am__objects_8 = ssl_support.$(OBJEXT)
 @ENABLE_UNLINKD_TRUE@am__objects_9 = unlinkd.$(OBJEXT)
 @ENABLE_UNLINKD_FALSE@am__objects_9 =
-@ENABLE_WIN32SPECIFIC_FALSE@am__objects_10 =
-@ENABLE_WIN32SPECIFIC_TRUE@am__objects_10 = win32.$(OBJEXT)
+@USE_WCCPv2_FALSE@am__objects_10 =
+@USE_WCCPv2_TRUE@am__objects_10 = wccpv2.$(OBJEXT)
+@ENABLE_WIN32SPECIFIC_FALSE@am__objects_11 =
+@ENABLE_WIN32SPECIFIC_TRUE@am__objects_11 = win32.$(OBJEXT)
 am_squid_OBJECTS = access_log.$(OBJEXT) acl.$(OBJEXT) asn.$(OBJEXT) \
 	authenticate.$(OBJEXT) cache_cf.$(OBJEXT) CacheDigest.$(OBJEXT) \
 	cache_manager.$(OBJEXT) carp.$(OBJEXT) cbdata.$(OBJEXT) \
@@ -478,7 +485,7 @@
 	store_swapmeta.$(OBJEXT) store_swapout.$(OBJEXT) \
 	tools.$(OBJEXT) $(am__objects_9) url.$(OBJEXT) urn.$(OBJEXT) \
 	useragent.$(OBJEXT) wais.$(OBJEXT) wccp.$(OBJEXT) \
-	whois.$(OBJEXT) $(am__objects_10)
+	$(am__objects_10) whois.$(OBJEXT) $(am__objects_11)
 nodist_squid_OBJECTS = repl_modules.$(OBJEXT) auth_modules.$(OBJEXT) \
 	store_modules.$(OBJEXT) globals.$(OBJEXT) \
 	string_arrays.$(OBJEXT)
@@ -553,7 +560,7 @@
 @AMDEP_TRUE@	$(DEPDIR)/unlinkd.Po $(DEPDIR)/url.Po \
 @AMDEP_TRUE@	$(DEPDIR)/urn.Po $(DEPDIR)/useragent.Po \
 @AMDEP_TRUE@	$(DEPDIR)/wais.Po $(DEPDIR)/wccp.Po \
-@AMDEP_TRUE@	$(DEPDIR)/whois.Po $(DEPDIR)/win32.Po
+@AMDEP_TRUE@	$(DEPDIR)/wccpv2.Po $(DEPDIR)/whois.Po $(DEPDIR)/win32.Po
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 CCLD = $(CC)
@@ -763,6 +770,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/useragent.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/wais.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/wccp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/wccpv2.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/whois.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/win32.Po@am__quote@
 
diff -Nur squid-2.5.STABLE10/src/cf.data.pre squid-2.5.STABLE10_wccpv2/src/cf.data.pre
--- squid-2.5.STABLE10/src/cf.data.pre	Sun Apr 21 19:40:44 2002
+++ squid-2.5.STABLE10_wccpv2/src/cf.data.pre	Fri Jun 14 14:51:56 2002
@@ -3115,6 +3115,12 @@
 LOC: Config.Wccp.router
 DEFAULT: 0.0.0.0
 IFDEF: USE_WCCP
+DOC_NONE
+NAME: wccp2_router
+TYPE: address
+LOC: Config.Wccp2.router
+DEFAULT: 0.0.0.0
+IFDEF: USE_WCCPv2
 DOC_START
 	Use this option to define your WCCP ``home'' router for
 	Squid.   Setting the 'wccp_router' to 0.0.0.0 (the default)
@@ -3126,6 +3132,12 @@
 LOC: Config.Wccp.version
 DEFAULT: 4
 IFDEF: USE_WCCP
+DOC_NONE
+NAME: wccp2_version
+TYPE: int
+LOC: Config.Wccp2.version
+DEFAULT: 4
+IFDEF: USE_WCCPv2
 DOC_START
 	According to some users, Cisco IOS 11.2 only supports WCCP
 	version 3.  If you're using that version of IOS, change
@@ -3143,6 +3155,18 @@
 LOC: Config.Wccp.outgoing
 DEFAULT: 255.255.255.255
 IFDEF: USE_WCCP
+DOC_NONE
+NAME: wccp2_incoming_address
+TYPE: address
+LOC: Config.Wccp2.incoming
+DEFAULT: 0.0.0.0
+IFDEF: USE_WCCPv2
+DOC_NONE
+NAME: wccp2_outgoing_address
+TYPE: address
+LOC: Config.Wccp2.outgoing
+DEFAULT: 255.255.255.255
+IFDEF: USE_WCCPv2
 DOC_START
         wccp_incoming_address   Use this option if you require WCCP
 				messages to be received on only one
diff -Nur squid-2.5.STABLE10/src/cf_gen_defines squid-2.5.STABLE10_wccpv2/src/cf_gen_defines
--- squid-2.5.STABLE10/src/cf_gen_defines	Mon Dec  3 13:31:53 2001
+++ squid-2.5.STABLE10_wccpv2/src/cf_gen_defines	Fri Jun 14 14:52:34 2002
@@ -18,6 +18,7 @@
 	define["USE_UNLINKD"]="--enable-unlinkd"
 	define["USE_USERAGENT_LOG"]="--enable-useragent-log"
 	define["USE_WCCP"]="--enable-wccp"
+        define["USE_WCCPv2"]="--enable-wccpv2"
 }
 /^IFDEF:/ {
 	if (define[$2] != "")
diff -Nur squid-2.5.STABLE10/src/main.c squid-2.5.STABLE10_wccpv2/src/main.c
--- squid-2.5.STABLE10/src/main.c	Tue Jan 15 22:21:13 2002
+++ squid-2.5.STABLE10_wccpv2/src/main.c	Fri Jun 14 14:50:14 2002
@@ -291,6 +291,9 @@
 #if USE_WCCP
     wccpConnectionOpen();
 #endif
+#if USE_WCCPv2
+    wccp2ConnectionOpen();
+#endif
     clientdbInit();
     icmpOpen();
     netdbInit();
@@ -317,6 +320,9 @@
 #if USE_WCCP
     wccpConnectionShutdown();
 #endif
+#if USE_WCCPv2
+    wccp2ConnectionShutdown();
+#endif
     asnFreeMemory();
 }
 
@@ -337,6 +343,9 @@
 #if USE_WCCP
     wccpConnectionClose();
 #endif
+#if USE_WCCPv2
+    wccp2ConnectionClose();
+#endif
 #if USE_DNSSERVERS
     dnsShutdown();
 #else
@@ -365,6 +374,9 @@
 #if USE_WCCP
     wccpInit();
 #endif
+#if USE_WCCPv2
+    wccp2Init();
+#endif
     serverConnectionsOpen();
     if (theOutIcpConnection >= 0) {
 	if (!Config2.Accel.on || Config.onoff.accel_with_proxy)
@@ -525,6 +537,9 @@
 #if USE_WCCP
     wccpInit();
 #endif
+#if USE_WCCPv2
+    wccp2Init();
+#endif
     serverConnectionsOpen();
     if (theOutIcpConnection >= 0) {
 	if (!Config2.Accel.on || Config.onoff.accel_with_proxy)
@@ -948,6 +963,9 @@
 #endif
 #if USE_WCCP
     wccpConnectionClose();
+#endif
+#if USE_WCCPv2
+    wccp2ConnectionClose();
 #endif
     releaseServerSockets();
     commCloseAllSockets();
diff -Nur squid-2.5.STABLE10/src/protos.h squid-2.5.STABLE10_wccpv2/src/protos.h
--- squid-2.5.STABLE10/src/protos.h	Mon Apr 22 02:55:10 2002
+++ squid-2.5.STABLE10_wccpv2/src/protos.h	Fri Jun 14 14:53:13 2002
@@ -570,6 +570,13 @@
 extern void wccpConnectionClose(void);
 #endif /* USE_WCCP */
 
+#if USE_WCCPv2
+extern void wccp2Init(void);
+extern void wccp2ConnectionOpen(void);
+extern void wccp2ConnectionShutdown(void);
+extern void wccp2ConnectionClose(void);
+#endif /* USE_WCCPv2 */
+
 extern void icpHandleIcpV3(int, struct sockaddr_in, char *, int);
 extern int icpCheckUdpHit(StoreEntry *, request_t * request);
 extern void icpConnectionsOpen(void);
diff -Nur squid-2.5.STABLE10/src/structs.h squid-2.5.STABLE10_wccpv2/src/structs.h
--- squid-2.5.STABLE10/src/structs.h	Sun Apr 28 17:48:53 2002
+++ squid-2.5.STABLE10_wccpv2/src/structs.h	Fri Jun 14 14:54:00 2002
@@ -444,6 +444,14 @@
 	int version;
     } Wccp;
 #endif
+#if USE_WCCPv2
+    struct {
+        struct in_addr router;
+        struct in_addr incoming;
+        struct in_addr outgoing;
+        int version;
+    } Wccp2;
+#endif
     char *as_whois_server;
     struct {
 	char *log;
diff -Nur squid-2.5.STABLE10/src/wccpv2.c squid-2.5.STABLE10_wccpv2/src/wccpv2.c
--- squid-2.5.STABLE10/src/wccpv2.c	Thu Jan  1 05:30:00 1970
+++ squid-2.5.STABLE10_wccpv2/src/wccpv2.c	Fri Jun 14 15:00:04 2002
@@ -0,0 +1,500 @@
+/*
+ * $Id$
+ *
+ * DEBUG: section 80     WCCP Support
+ * AUTHOR: Glenn Chisholm
+ *
+ * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/
+ * ----------------------------------------------------------
+ *
+ *  Squid is the result of efforts by numerous individuals from the
+ *  Internet community.  Development is led by Duane Wessels of the
+ *  National Laboratory for Applied Network Research and funded by the
+ *  National Science Foundation.  Squid is Copyrighted (C) 1998 by
+ *  Duane Wessels and the University of California San Diego.  Please
+ *  see the COPYRIGHT file for full details.  Squid incorporates
+ *  software developed and/or copyrighted by other sources.  Please see
+ *  the CREDITS file for full details.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+ *
+ */
+#include "squid.h"
+#include <netdb.h>
+
+#if USE_WCCPv2
+
+#define WCCP_PORT 2048
+#define WCCP_VERSION 4
+#define WCCP_REVISION 0
+#define WCCP_RESPONSE_SIZE 12448
+#define WCCP_ACTIVE_CACHES 32
+#define WCCP_HASH_SIZE 32
+#define WCCP_BUCKETS 256
+
+#define WCCP_HERE_I_AM 7
+#define WCCP_I_SEE_YOU 8
+#define WCCP_ASSIGN_BUCKET 9
+
+static int theInWccpConnection = -1;
+static int theOutWccpConnection = -1;
+static int change;
+static struct in_addr local_ip;
+
+static PF wccp2HandleUdp;
+static int wccp2LowestIP(void);
+static EVH wccp2HereIam;
+static EVH wccp2AssignBuckets;
+
+/* KDW WCCP V2 */
+#define WCCP2_HERE_I_AM		10
+#define WCCP2_I_SEE_YOU		11
+#define WCCP2_REDIRECT_ASSIGN		12
+#define WCCP2_REMOVAL_QUERY		13
+#define WCCP2_VERSION			0x200
+
+#define WCCP2_SECURITY_INFO		0
+#define WCCP2_NO_SECURITY		0
+#define WCCP2_MD5_SECURITY		1	/* Not Supported Yet */
+
+#define WCCP2_SERVICE_INFO		1
+#define WCCP2_SERVICE_STANDARD		0
+#define WCCP2_SERVICE_DYNAMIC		1	/* Not Supported Yet */
+#define WCCP2_SERVICE_ID_HTTP		0x00
+
+#define WCCP2_ROUTER_ID_INFO		2
+
+#define WCCP2_WC_ID_INFO		3
+
+#define WCCP2_RTR_VIEW_INFO		4
+
+#define WCCP2_WC_VIEW_INFO		5
+
+#define WCCP2_REDIRECT_ASSIGNMENT	6
+
+#define WCCP2_QUERY_INFO		7
+
+#define WCCP2_CAPABILTIY_INFO		8
+
+struct wccp2_here_i_am_t {
+	uint32_t type;
+	uint16_t version;
+	uint16_t length;
+  	uint16_t security_type;
+	uint16_t security_length;
+	uint32_t security_option;
+	uint16_t service_type;
+	uint16_t service_length;
+	uint8_t service;
+	uint8_t serviceid;
+	char service_filler[22];
+	uint16_t cache_identity_type;
+	uint16_t cache_identity_length;
+	struct in_addr cache_identity_addr;
+	char cache_identity_filler[40];
+	uint16_t cache_view_type;
+	uint16_t cache_view_length;
+	uint32_t cache_view_version;
+	uint32_t cache_view_num_routers;
+	struct in_addr cache_view_rtr1_addr;
+	uint32_t cache_view_rtr1_receive_id;
+	uint32_t cache_view_num_caches;
+	int id;
+};
+
+static struct wccp2_here_i_am_t wccp2_here_i_am;
+
+struct wccp2_i_see_you_t {
+	uint32_t type;
+	uint16_t version;
+	uint16_t length;
+	char data[WCCP_RESPONSE_SIZE];
+	int id;
+};
+
+static struct wccp2_i_see_you_t wccp2_i_see_you;
+
+struct wccp2_item_header_t {
+	uint16_t type;
+	uint16_t length;
+};
+
+static struct wccp2_item_header_t wccp2_item_header;
+
+struct wccp2_router_id_element_t {
+	uint16_t type;
+	uint16_t length;
+	struct in_addr router_addr;
+	uint32_t received_id;
+};
+
+static struct wccp2_router_id_element_t wccp2_router_id_element;
+
+struct wccp2_router_info_t {
+	uint16_t type;
+	uint16_t length;
+	uint32_t member_change;
+};
+
+static struct wccp2_router_info_t wccp2_router_info;
+
+struct wccp2_redirect_assign_t {
+	uint32_t type;
+	uint16_t version;
+	uint16_t length;
+  	uint16_t security_type;
+	uint16_t security_length;
+	uint32_t security_option;
+	uint16_t service_type;
+	uint16_t service_length;
+	uint8_t service;
+	uint8_t serviceid;
+	char service_filler[22];
+	uint16_t assignment_type;
+	uint16_t assignment_length;
+	struct in_addr assignment_key;
+	uint32_t assignment_key_change;
+	uint32_t assignment_num_routers;
+	struct in_addr assignment_router1_addr;
+	uint32_t assignment_router1_receive_id;
+	uint32_t assignment_router1_change_number;
+	uint32_t assignment_num_caches;
+	struct in_addr assignment_cache1_addr;
+	char buckets[WCCP_BUCKETS];
+};
+
+static struct wccp2_redirect_assign_t wccp2_redirect_assign;
+
+struct wccp2_assign_bucket_t {
+    int type;
+    int id;
+    int number;
+};
+
+static uint32_t wccp2_received_id;
+static struct in_addr wccp2_router_addr;
+
+
+/* END WCCP V2 */
+
+/*
+ * The functions used during startup:
+ * wccp2Init
+ * wccp2ConnectionOpen
+ * wccp2ConnectionShutdown
+ * wccp2ConnectionClose
+ */
+
+void
+wccp2Init(void)
+{
+    debug(80, 5) ("wccp2Init: Called\n");
+    if (eventFind(wccp2HereIam, NULL))
+	return;
+    change = 1;
+    wccp2_here_i_am.type = htonl(WCCP2_HERE_I_AM);
+    wccp2_here_i_am.version = htons(WCCP2_VERSION);
+    wccp2_here_i_am.length = htons(sizeof(wccp2_here_i_am)-8);
+    wccp2_here_i_am.security_type = htons(WCCP2_SECURITY_INFO);
+    wccp2_here_i_am.security_length = htons(sizeof(wccp2_here_i_am.security_option));
+    wccp2_here_i_am.security_option = htonl(WCCP2_NO_SECURITY);
+    wccp2_here_i_am.service_type = htons(WCCP2_SERVICE_INFO);
+    wccp2_here_i_am.service_length = htons(sizeof(wccp2_here_i_am.service) +
+                                     sizeof(wccp2_here_i_am.serviceid) +
+                                      sizeof(wccp2_here_i_am.service_filler));
+	wccp2_here_i_am.service = WCCP2_SERVICE_STANDARD;
+	wccp2_here_i_am.serviceid = WCCP2_SERVICE_ID_HTTP;
+	memset(&wccp2_here_i_am.service_filler, '\0', sizeof(wccp2_here_i_am.service_filler));
+	wccp2_here_i_am.cache_identity_type = htons(WCCP2_WC_ID_INFO);
+	wccp2_here_i_am.cache_identity_length = htons(sizeof(wccp2_here_i_am.cache_identity_addr) +
+                                       sizeof(wccp2_here_i_am.cache_identity_filler));
+	memset(&wccp2_here_i_am.cache_identity_filler, '\0', sizeof(wccp2_here_i_am.cache_identity_filler));
+	wccp2_here_i_am.cache_view_type = htons(WCCP2_WC_VIEW_INFO);
+	wccp2_here_i_am.cache_view_length = htons(sizeof(wccp2_here_i_am.cache_view_version) +
+                                   sizeof(wccp2_here_i_am.cache_view_num_routers)+
+                                   sizeof(wccp2_here_i_am.cache_view_num_caches) +
+                                   sizeof(wccp2_here_i_am.cache_view_rtr1_addr) +
+                                   sizeof(wccp2_here_i_am.cache_view_rtr1_receive_id));
+	wccp2_here_i_am.cache_view_version = htonl(1);
+	wccp2_here_i_am.cache_view_num_routers = htonl(1);
+	wccp2_here_i_am.cache_view_rtr1_addr = Config.Wccp2.router;
+	wccp2_here_i_am.cache_view_rtr1_receive_id = wccp2_router_id_element.received_id;
+	wccp2_here_i_am.cache_view_num_caches = htonl(0);
+
+
+    if (Config.Wccp2.router.s_addr != any_addr.s_addr)
+	if (!eventFind(wccp2HereIam, NULL))
+	    eventAdd("wccp2HereIam", wccp2HereIam, NULL, 10.0, 1);
+}
+
+void
+wccp2ConnectionOpen(void)
+{
+    u_short port = WCCP_PORT;
+    struct sockaddr_in router, local;
+    int local_len, router_len;
+    debug(80, 5) ("wccp2ConnectionOpen: Called\n");
+    if (Config.Wccp2.router.s_addr == any_addr.s_addr) {
+	debug(1, 1) ("WCCP Disabled.\n");
+	return;
+    }
+    theInWccpConnection = comm_open(SOCK_DGRAM,
+	0,
+	Config.Wccp2.incoming,
+	port,
+	COMM_NONBLOCKING,
+	"WCCP Socket");
+    if (theInWccpConnection < 0)
+	fatal("Cannot open WCCP Port");
+    commSetSelect(theInWccpConnection,
+	COMM_SELECT_READ,
+	wccp2HandleUdp,
+	NULL,
+	0);
+    debug(1, 1) ("Accepting WCCP v2 messages on port %d, FD %d.\n",
+	(int) port, theInWccpConnection);
+    if (Config.Wccp2.outgoing.s_addr != no_addr.s_addr) {
+	theOutWccpConnection = comm_open(SOCK_DGRAM,
+	    0,
+	    Config.Wccp2.outgoing,
+	    port,
+	    COMM_NONBLOCKING,
+	    "WCCP Socket");
+	if (theOutWccpConnection < 0)
+	    fatal("Cannot open Outgoing WCCP Port");
+	commSetSelect(theOutWccpConnection,
+	    COMM_SELECT_READ,
+    wccp2HandleUdp,
+	    NULL, 0);
+	debug(1, 1) ("Outgoing WCCP v2 messages on port %d, FD %d.\n",
+	    (int) port, theOutWccpConnection);
+	fd_note(theOutWccpConnection, "Outgoing WCCP socket");
+	fd_note(theInWccpConnection, "Incoming WCCP socket");
+    } else {
+	theOutWccpConnection = theInWccpConnection;
+    }
+    router_len = sizeof(router);
+    memset(&router, '\0', router_len);
+    router.sin_family = AF_INET;
+    router.sin_port = htons(port);
+    router.sin_addr = Config.Wccp2.router;
+    if (connect(theOutWccpConnection, (struct sockaddr *) &router, router_len))
+	fatal("Unable to connect WCCP out socket");
+    local_len = sizeof(local);
+    memset(&local, '\0', local_len);
+    if (getsockname(theOutWccpConnection, (struct sockaddr *) &local, &local_len))
+	fatal("Unable to getsockname on WCCP out socket");
+    local_ip.s_addr = local.sin_addr.s_addr;
+}
+
+void
+wccp2ConnectionShutdown(void)
+{
+    if (theInWccpConnection < 0)
+	return;
+    if (theInWccpConnection != theOutWccpConnection) {
+	debug(80, 1) ("FD %d Closing WCCP socket\n", theInWccpConnection);
+	comm_close(theInWccpConnection);
+    }
+    assert(theOutWccpConnection > -1);
+    commSetSelect(theOutWccpConnection, COMM_SELECT_READ, NULL, NULL, 0);
+}
+
+void
+wccp2ConnectionClose(void)
+{
+    wccp2ConnectionShutdown();
+    if (theOutWccpConnection > -1) {
+	debug(80, 1) ("FD %d Closing WCCP socket\n", theOutWccpConnection);
+	comm_close(theOutWccpConnection);
+    }
+}
+
+/*
+ * Functions for handling the requests.
+ */
+
+/*
+ * Accept the UDP packet
+ */
+static void
+wccp2HandleUdp(int sock, void *not_used)
+{
+    struct sockaddr_in from;
+    socklen_t from_len;
+    int len, offset;
+    uint32_t tmp;
+
+    debug(80, 6) ("wccp2HandleUdp: Called.\n");
+
+    commSetSelect(sock, COMM_SELECT_READ, wccp2HandleUdp, NULL, 0);
+    from_len = sizeof(struct sockaddr_in);
+    memset(&from, '\0', from_len);
+    memset(&wccp2_i_see_you, '\0', sizeof(wccp2_i_see_you));
+
+    statCounter.syscalls.sock.recvfroms++;
+
+    len = recvfrom(sock,
+	&wccp2_i_see_you,
+	WCCP_RESPONSE_SIZE,
+	0,
+	(struct sockaddr *) &from,
+	&from_len);
+
+    if (len < 0)
+	return;
+    if (Config.Wccp2.router.s_addr != from.sin_addr.s_addr)
+	return;
+    if (ntohs(wccp2_i_see_you.version) != WCCP2_VERSION)
+	return;
+    if (ntohl(wccp2_i_see_you.type) != WCCP2_I_SEE_YOU)
+	return;
+
+	debug(80, 1) ("Incoming WCCP v2 I_SEE_YOU length %d.\n",
+                 ntohs(wccp2_i_see_you.length));
+	memcpy(&wccp2_item_header, &wccp2_i_see_you.data[0], sizeof(wccp2_item_header));
+	if (ntohs(wccp2_item_header.type) != WCCP2_SECURITY_INFO) {
+		debug(80,1) ("WCCP2_I_SEE_YOU missing WCCP2_SECURITY_INFO\n");
+		return;
+	}
+
+	offset = ntohs(wccp2_item_header.length) + 4;
+    memcpy(&wccp2_item_header, &wccp2_i_see_you.data[offset], sizeof(wccp2_item_header));
+	if (ntohs(wccp2_item_header.type) != WCCP2_SERVICE_INFO) {
+		debug(80,1) ("WCCP2_I_SEE_YOU missing WCCP2_SERVICE_INFO offset %d\n", offset);
+		return;
+	}
+	offset += ntohs(wccp2_item_header.length) + 4; /* Skip WCCP2_SERVICE_INFO */
+	memcpy(&wccp2_item_header, &wccp2_i_see_you.data[offset], sizeof(wccp2_item_header));
+	if (ntohs(wccp2_item_header.type) != WCCP2_ROUTER_ID_INFO) {
+		debug(80,1) ("WCCP2_I_SEE_YOU missing WCCP2_ROUTER_ID_INFO\n");
+		return;
+	}
+	memcpy(&wccp2_router_id_element, &wccp2_i_see_you.data[offset], sizeof(wccp2_router_id_element));
+	debug(80, 1) ("Incoming WCCP2_I_SEE_YOU received id = %d.\n", ntohl(wccp2_router_id_element.received_id));
+
+	wccp2_router_addr = wccp2_router_id_element.router_addr;
+	wccp2_received_id = wccp2_router_id_element.received_id;
+
+    offset += ntohs(wccp2_router_id_element.length) + 4;
+    memcpy (&wccp2_router_info, &wccp2_i_see_you.data[offset], sizeof(wccp2_router_info));
+
+	debug(80, 1) ("Incoming WCCP2_I_SEE_YOU member change = %d tmp=%d.\n", change,ntohl(wccp2_router_info.member_change));
+    if (!change) {
+	change = ntohl(wccp2_router_info.member_change);
+	debug(80, 1) ("Incoming WCCP2_I_SEE_YOU member change = %d.\n", change);
+	return;
+    }
+    if (change != ntohl(wccp2_router_info.member_change)) {
+	change = ntohl(wccp2_router_info.member_change);
+	if (wccp2LowestIP())
+    if (!eventFind(wccp2AssignBuckets, NULL))
+		eventAdd("wccp2AssignBuckets", wccp2AssignBuckets, NULL, 25.0, 1);
+    }
+}
+
+static int
+wccp2LowestIP(void)
+{
+/* Force Election for now
+    int loop;
+    for (loop = 0; loop < ntohl(wccp2_i_see_you.number); loop++) {
+	if (wccp2_i_see_you.wccp2_cache_entry[loop].ip_addr.s_addr < local_ip.s_addr)
+	    return 0;
+    }
+*/
+    return 1;
+}
+
+static void
+wccp2HereIam(void *voidnotused)
+{
+    debug(80, 6) ("wccp2HereIam: Called\n");
+
+	wccp2_here_i_am.cache_identity_addr = local_ip;
+    wccp2_here_i_am.id = wccp2_i_see_you.id;
+	wccp2_here_i_am.cache_view_rtr1_receive_id = wccp2_received_id;
+	wccp2_here_i_am.cache_view_rtr1_addr = wccp2_router_addr;
+    send(theOutWccpConnection,
+	&wccp2_here_i_am,
+	sizeof(wccp2_here_i_am),
+	0);
+
+    if (!eventFind(wccp2HereIam, NULL))
+	eventAdd("wccp2HereIam", wccp2HereIam, NULL, 10.0, 1);
+}
+
+static void
+wccp2AssignBuckets(void *voidnotused)
+{
+    struct wccp2_assign_bucket_t wccp2_assign_bucket;
+    int buckets_per_cache;
+    int loop;
+    int number_caches;
+    int bucket = 0;
+    int *caches;
+    int offset;
+    char buckets[WCCP_BUCKETS];
+    char *buf;
+
+    debug(80, 6) ("wccp2AssignBuckets: Called\n");
+    debug(80, 1) ("WCCP2 Assigning Redirect\n");
+    memset(&wccp2_redirect_assign.buckets, '\0', sizeof(wccp2_redirect_assign.buckets));
+    memset(&wccp2_redirect_assign.buckets, 0xFF, WCCP_BUCKETS);
+	for (bucket = 0; bucket < WCCP_BUCKETS; bucket++) {
+		wccp2_redirect_assign.buckets[bucket] = 0;
+    }
+    wccp2_redirect_assign.type = htonl(WCCP2_REDIRECT_ASSIGN);
+    wccp2_redirect_assign.version = htons(WCCP2_VERSION);
+    wccp2_redirect_assign.length = htons(sizeof(wccp2_redirect_assign)-8);
+	wccp2_redirect_assign.security_type = htons(WCCP2_SECURITY_INFO);
+	wccp2_redirect_assign.security_length = htons(sizeof(wccp2_redirect_assign.security_option));
+	wccp2_redirect_assign.security_option = htonl(WCCP2_NO_SECURITY);
+	wccp2_redirect_assign.service_type = htons(WCCP2_SERVICE_INFO);
+	wccp2_redirect_assign.service_length = htons(sizeof(wccp2_redirect_assign.service) +
+                                      sizeof(wccp2_redirect_assign.serviceid) +
+                                      sizeof(wccp2_redirect_assign.service_filler));
+	wccp2_redirect_assign.service = WCCP2_SERVICE_STANDARD;
+	wccp2_redirect_assign.serviceid = WCCP2_SERVICE_ID_HTTP;
+	memset(&wccp2_redirect_assign.service_filler, '\0', sizeof(wccp2_redirect_assign.service_filler));
+	wccp2_redirect_assign.assignment_type = htons(WCCP2_REDIRECT_ASSIGNMENT);
+	wccp2_redirect_assign.assignment_length =
+        htons(sizeof(wccp2_redirect_assign.assignment_key) +
+              sizeof(wccp2_redirect_assign.assignment_key_change) +
+              sizeof(wccp2_redirect_assign.assignment_num_routers) +
+              sizeof(wccp2_redirect_assign.assignment_router1_addr) +
+              sizeof(wccp2_redirect_assign.assignment_router1_receive_id) +
+              sizeof(wccp2_redirect_assign.assignment_router1_change_number) +
+              sizeof(wccp2_redirect_assign.assignment_num_caches) +
+              sizeof(wccp2_redirect_assign.assignment_cache1_addr) +
+              sizeof(wccp2_redirect_assign.buckets));
+	wccp2_redirect_assign.assignment_key = wccp2_here_i_am.cache_identity_addr;
+	wccp2_redirect_assign.assignment_key_change = htonl(change);
+	wccp2_redirect_assign.assignment_num_routers = htonl(1);
+	wccp2_redirect_assign.assignment_router1_addr = wccp2_router_addr;
+	wccp2_redirect_assign.assignment_router1_receive_id = wccp2_received_id;
+	wccp2_redirect_assign.assignment_router1_change_number = htonl(change);
+	wccp2_redirect_assign.assignment_num_caches = htonl(1);
+	wccp2_redirect_assign.assignment_cache1_addr = wccp2_here_i_am.cache_identity_addr;
+
+    send(theOutWccpConnection,
+	&wccp2_redirect_assign,
+	sizeof(wccp2_redirect_assign),
+	0);
+    change = 0;
+}
+
+#endif /* USE_WCCPv2 */
+

[Index of Archives]     [Linux Audio Users]     [Samba]     [Big List of Linux Books]     [Linux USB]     [Yosemite News]

  Powered by Linux