[MERGE] WCCPv2 Config Cleanup

From: Amos Jeffries <squid3_at_treenet.co.nz>
Date: Fri, 12 Sep 2008 20:39:45 +1200

WCCP config cleanups mk2

  - clean of the additional extras slipped in last time.
  - corrected according to Adrians updated info

Amos

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: squid3_at_treenet.co.nz-20080912081432-cqmqhoixi5do4utx
# target_branch: file:///src/squid/bzr/trunk/
# testament_sha1: a498a9a51a706bf7632ed8248d8ccf8f44f5684f
# timestamp: 2008-09-12 20:15:11 +1200
# base_revision_id: squid3_at_treenet.co.nz-20080910152127-\
# bmvbzbywqmjrun2v
#
# Begin patch
=== modified file 'src/cf.data.depend'
--- src/cf.data.depend 2008-04-03 05:31:29 +0000
+++ src/cf.data.depend 2008-09-12 08:14:32 +0000
@@ -47,6 +47,8 @@
 tristate
 uri_whitespace
 ushort
+wccp2_method
+wccp2_amethod
 wccp2_service
 wccp2_service_info
 wordlist

=== modified file 'src/cf.data.pre'
--- src/cf.data.pre 2008-09-03 13:22:55 +0000
+++ src/cf.data.pre 2008-09-12 01:14:37 +0000
@@ -3957,7 +3957,17 @@
 LOC: Config.Wccp.router
 DEFAULT: 0.0.0.0
 IFDEF: USE_WCCP
-DOC_NONE
+DOC_START
+ Use this option to define your WCCP ``home'' router for
+ Squid.
+
+ wccp_router supports a single WCCP(v1) router
+
+ wccp2_router supports multiple WCCPv2 routers
+
+ only one of the two may be used at the same time and defines
+ which version of WCCP to use.
+DOC_END
 
 NAME: wccp2_router
 TYPE: IPAddress_list
@@ -4005,33 +4015,33 @@
 DOC_END
 
 NAME: wccp2_forwarding_method
-TYPE: int
+TYPE: wccp2_method
 LOC: Config.Wccp2.forwarding_method
-DEFAULT: 1
+DEFAULT: gre
 IFDEF: USE_WCCPv2
 DOC_START
         WCCP2 allows the setting of forwarding methods between the
         router/switch and the cache. Valid values are as follows:
 
- 1 - GRE encapsulation (forward the packet in a GRE/WCCP tunnel)
- 2 - L2 redirect (forward the packet using Layer 2/MAC rewriting)
+ gre - GRE encapsulation (forward the packet in a GRE/WCCP tunnel)
+ l2 - L2 redirect (forward the packet using Layer 2/MAC rewriting)
 
         Currently (as of IOS 12.4) cisco routers only support GRE.
         Cisco switches only support the L2 redirect assignment method.
 DOC_END
 
 NAME: wccp2_return_method
-TYPE: int
+TYPE: wccp2_method
 LOC: Config.Wccp2.return_method
-DEFAULT: 1
+DEFAULT: gre
 IFDEF: USE_WCCPv2
 DOC_START
         WCCP2 allows the setting of return methods between the
         router/switch and the cache for packets that the cache
         decides not to handle. Valid values are as follows:
 
- 1 - GRE encapsulation (forward the packet in a GRE/WCCP tunnel)
- 2 - L2 redirect (forward the packet using Layer 2/MAC rewriting)
+ gre - GRE encapsulation (forward the packet in a GRE/WCCP tunnel)
+ l2 - L2 redirect (forward the packet using Layer 2/MAC rewriting)
 
         Currently (as of IOS 12.4) cisco routers only support GRE.
         Cisco switches only support the L2 redirect assignment.
@@ -4043,16 +4053,16 @@
 DOC_END
 
 NAME: wccp2_assignment_method
-TYPE: int
+TYPE: wccp2_amethod
 LOC: Config.Wccp2.assignment_method
-DEFAULT: 1
+DEFAULT: hash
 IFDEF: USE_WCCPv2
 DOC_START
         WCCP2 allows the setting of methods to assign the WCCP hash
         Valid values are as follows:
 
- 1 - Hash assignment
- 2 - Mask assignment
+ hash - Hash assignment
+ mask - Mask assignment
 
         As a general rule, cisco routers support the hash assignment method
         and cisco switches support the mask assignment method.

=== modified file 'src/protos.h'
--- src/protos.h 2008-09-03 04:40:31 +0000
+++ src/protos.h 2008-09-12 01:14:37 +0000
@@ -813,10 +813,16 @@
 SQUIDCEXTERN char *strtokFile(void);
 
 #if USE_WCCPv2
+
+SQUIDCEXTERN void parse_wccp2_method(int *v);
+SQUIDCEXTERN void free_wccp2_method(int *v);
+SQUIDCEXTERN void dump_wccp2_method(StoreEntry * e, const char *label, int v);
+SQUIDCEXTERN void parse_wccp2_amethod(int *v);
+SQUIDCEXTERN void free_wccp2_amethod(int *v);
+SQUIDCEXTERN void dump_wccp2_amethod(StoreEntry * e, const char *label, int v);
+
 SQUIDCEXTERN void parse_wccp2_service(void *v);
-
 SQUIDCEXTERN void free_wccp2_service(void *v);
-
 SQUIDCEXTERN void dump_wccp2_service(StoreEntry * e, const char *label, void *v);
 
 SQUIDCEXTERN int check_null_wccp2_service(void *v);

=== modified file 'src/wccp2.cc'
--- src/wccp2.cc 2008-08-13 03:24:57 +0000
+++ src/wccp2.cc 2008-09-12 08:14:32 +0000
@@ -109,14 +109,17 @@
 #define WCCP2_CAPABILITY_ASSIGNMENT_METHOD 0x02
 #define WCCP2_CAPABILITY_RETURN_METHOD 0x03
 
-#define WCCP2_FORWARDING_METHOD_GRE 0x00000001
-#define WCCP2_FORWARDING_METHOD_L2 0x00000002
-
-#define WCCP2_ASSIGNMENT_METHOD_HASH 0x00000001
-#define WCCP2_ASSIGNMENT_METHOD_MASK 0x00000002
-
-#define WCCP2_PACKET_RETURN_METHOD_GRE 0x00000001
-#define WCCP2_PACKET_RETURN_METHOD_L2 0x00000002
+#define WCCP2_METHOD_GRE 0x00000001
+#define WCCP2_METHOD_L2 0x00000002
+
+#define WCCP2_FORWARDING_METHOD_GRE WCCP2_METHOD_GRE
+#define WCCP2_FORWARDING_METHOD_L2 WCCP2_METHOD_L2
+
+#define WCCP2_ASSIGNMENT_METHOD_HASH 0x00000001
+#define WCCP2_ASSIGNMENT_METHOD_MASK 0x00000002
+
+#define WCCP2_PACKET_RETURN_METHOD_GRE WCCP2_METHOD_GRE
+#define WCCP2_PACKET_RETURN_METHOD_L2 WCCP2_METHOD_L2
 
 #define WCCP2_HASH_ASSIGNMENT 0x00
 #define WCCP2_MASK_ASSIGNMENT 0x01
@@ -1989,6 +1992,102 @@
  * Configuration option parsing code
  */
 
+/**
+ * Parse wccp2_return_method and wccp2_forwarding_method options
+ * they can be '1' aka 'gre' or '2' aka 'l2'
+ * repesenting the integer numeric of the same.
+ */
+void
+parse_wccp2_method(int *method)
+{
+ char *t;
+
+ /* Snarf the method */
+ if ((t = strtok(NULL, w_space)) == NULL) {
+ debugs(80, DBG_CRITICAL, "wccp2_*_method: missing setting.");
+ self_destruct();
+ }
+
+ /* update configuration if its valid */
+ if (strcmp(t, "gre") == 0 || strcmp(t, "1") == 0) {
+ *method = WCCP2_METHOD_GRE;
+ } else if (strcmp(t, "l2") == 0 || strcmp(t, "2") == 0) {
+ *method = WCCP2_METHOD_L2;
+ } else {
+ debugs(80, DBG_CRITICAL, "wccp2_*_method: unknown setting, got " << t );
+ self_destruct();
+ }
+}
+
+void
+dump_wccp2_method(StoreEntry * e, const char *label, int v)
+{
+ switch(v)
+ {
+ case WCCP2_METHOD_GRE:
+ storeAppendPrintf(e, "%s gre\n", label);
+ break;
+ case WCCP2_METHOD_L2:
+ storeAppendPrintf(e, "%s l2\n", label);
+ break;
+ default:
+ debugs(80, DBG_CRITICAL, "FATAL: WCCPv2 configured method (" << v << ") is not valid.");
+ self_destruct();
+ }
+}
+
+void
+free_wccp2_method(int *v)
+{ }
+
+/**
+ * Parse wccp2_assignment_method option
+ * they can be '1' aka 'hash' or '2' aka 'mask'
+ * repesenting the integer numeric of the same.
+ */
+void
+parse_wccp2_amethod(int *method)
+{
+ char *t;
+
+ /* Snarf the method */
+ if ((t = strtok(NULL, w_space)) == NULL) {
+ debugs(80, DBG_CRITICAL, "wccp2_assignment_method: missing setting.");
+ self_destruct();
+ }
+
+ /* update configuration if its valid */
+ if (strcmp(t, "hash") == 0 || strcmp(t, "1") == 0) {
+ *method = WCCP2_ASSIGNMENT_METHOD_HASH;
+ } else if (strcmp(t, "mask") == 0 || strcmp(t, "2") == 0) {
+ *method = WCCP2_ASSIGNMENT_METHOD_MASK;
+ } else {
+ debugs(80, DBG_CRITICAL, "wccp2_assignment_method: unknown setting, got " << t );
+ self_destruct();
+ }
+}
+
+void
+dump_wccp2_amethod(StoreEntry * e, const char *label, int v)
+{
+ switch(v)
+ {
+ case WCCP2_ASSIGNMENT_METHOD_HASH:
+ storeAppendPrintf(e, "%s hash\n", label);
+ break;
+ case WCCP2_ASSIGNMENT_METHOD_MASK:
+ storeAppendPrintf(e, "%s mask\n", label);
+ break;
+ default:
+ debugs(80, DBG_CRITICAL, "FATAL: WCCPv2 configured " << label << " (" << v << ") is not valid.");
+ self_destruct();
+ }
+}
+
+void
+free_wccp2_amethod(int *v)
+{ }
+
 /*
  * Format:
  *

# Begin bundle
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
Ox6t69L2D6GO7yWjxY5F6pEjyel/LNWj+yXE3auXoSA+51Yx5B1adsuDkF6uMESz5zStQMarDgEv
IchU4v4JXtUv91k0+/Zq01xtwE58ZCzocKzQ3Ji7SVERcSNUxkkn2yGqSbzBNUfXTnJkunPxzG9C
z3vQehjf4L1lMiK5EXBw8lLYg8kLY9+OSDS4KcTSBTJCgMfBOTY8Z1utDBrydyGxOCTMl3+JPiT1
CuC3q8oDwBeq8t7hP389otneapB5ZFCLrIlMlcEIMkATSDQ2sPzgzyH2EIlTM7EH9k+EhnGg9yPD
7liyxSfVIesd+C+iBByOCNttBbKeEDlVKtgsMx7fPdD7IKnWB22eM5wLqPQHGihR+4GZ8M0jW8Ry
D0kGgoYCJvKJeX5kewcI/SIfRki6EIlVk+u4IbEmcmn3Ql8jKurZDJJ9227HT6IaptFvimiXppJm
lKqkJTZJzvlW+gSbZ4t21Ml6bInMUTD5o7vCepJlJinbSkpm+RMxfCLsDR01FwCi5erB4EGmlvbl
rs4IIaw1m7rVLpdddmJ8UfeOEzmEP0O/2pfj6+UT7qJwMF2JXFzRsVQloJhJzHyVxWX5RSKCTntr
trZ3zzE1nd3Wd1b+cSuOzZRHx2pwqcX8k9yZpqst6h4hTDG5bGmNuUxTQtkLyi8EpF9BN3cGibj7
EMch54mnmk6YSbpNhaFe2W/YUn4bZLRDpUmOiH/VxS5NPWWLkuhKhjZFVVUnclvJ+/AiNJiTAiqk
4JttUu9kLJjs3ef52ipn6onMZPxmsWMIUooKVQoiv8CxDNykvQ+iQvciI+Hzfh4W+r0ER0+kdm4d
77CRhxLn2EvGjDZV1hykDZnXpS8mz68bjOEynGiqlLaQmyI4qUaco0I0qHKMHQ1JlqHykHPVftcV
beG+Efb/A/fPVJgmB3Usd7WJ/cKJ80+afWJ999K0ZoZ7oj1J3jtEsw2+N3KJ89VbsAwPiF4QcY4w
YOshDUu28wmRvqdDHlX09g+EniPeeE+NERt7qK3pSc6ulLrWU77LeiyWhPrTFkT3hmTKJWPvGdyz
iUULyWkVsPHVNZZPgakR5SX36BKfp0w8U9aYE8yVIXSUmTdx8B1C02f5cEvf1HemOcTj5HVnWnaJ
7Ppsnv5MFateUlrSibFpYlk/KSuMviWKkL9L7JtvTDxdLd9z9hdcZWX+aGSdDltyTIlJlbPhcSp8
uKfE/y2LOlor+iau3YmYWQ7UNYZJUw2pspCe2JiTMmO8TK9+1n93+6bfqp61irS1LLSyy0lFkpaK
WKWSpaUsUonBDWG6cPEq9MoTkN20f3jxsxTolmWv6NTF4T3hYKQXjU7b9A36CjJWaFIStBZAKrJA
RGZ3T8nklk0JlJPuEtIbU5vverNgqRim9ZM2tVPMlchNqXi0SbyRhE5buJM8YmS9MU57hTTGZuMD
4lbE30TalweYiLrQysZZ1tXEtQlk9UTgmmSWrgMiYteVpPyOCOWqOQ79ifns2flUtu0n2Q2iR1p0
TbPZXNvN40nFL5LM5y7otheL/67v3F0X/mOtaVPOs86lFvmnj3/ImzlM45yXaOfWhdhaQ8wk/cly
XnYPULn2axPgfQUL8/glrlF10lvi3V4ts8f4ycE91w/odh7R2/z/RnBO6bPZ2Fu9XLEvS7clLSfx
J/CeETBLxqHwGpa7ARMH2heuru40eJQ1CcyOIbQvNz5vIsin9hZFy4pH/Au5IpwoSBNhp14A
Received on Fri Sep 12 2008 - 08:40:08 MDT

This archive was generated by hypermail 2.2.0 : Sat Sep 13 2008 - 12:00:05 MDT