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: [EMAIL PROTECTED]
# target_branch: file:///src/squid/bzr/trunk/
# testament_sha1: a498a9a51a706bf7632ed8248d8ccf8f44f5684f
# timestamp: 2008-09-12 20:15:11 +1200
# base_revision_id: [EMAIL PROTECTED]
#   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

Reply via email to