Ethereal-dev: Re: [ethereal-dev] WCCP 1.0 Decoder
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Jerry Talkington <jerryt@xxxxxxxxxx>
Date: Sat, 11 Dec 1999 17:11:37 -0800
* Guy Harris (gharris@xxxxxxxxxxxx) done spit this rhetoric:
> > + guint8 ip_offset;
> > +
> > + proto_tree_add_item_hidden(gre_tree, hf_gre_wccp, offset, sizeof(type), TRUE);
> > + offset += sizeof(type);
> > +
> > + ip_offset = pd[offset];
> > + if ((ip_offset & 0x45)) {
> > + /* we can assume that all wccp packets are streaming ip */
> > + } else {
> > + /* WCCP 1 and 2 both use the same type, but v2 has an extra 4 octet header */
> > + offset += sizeof(guint32);
> > + }
>
> That should perhaps be done by
>
> if ((pd[offset] & 0xF0) == 0x40) {
> /* it's WCCPv1 */
> } else {
> /* it's presumably WCCPv2 */
> }
>
> so that IP options don't cause it to misinterpret the packet as WCCP
> encapsulation for v2.
>
> Note also that "calc_len()" would have to be changed as well, to include
> the extra 4 octets - or perhaps the "calc_len()" code should be pulled
> up into "dissect_gre()" itself, above the first
> "proto_tree_add_item_format()" call.
Okay, here's an updated version.
--
Jerry Talkington
NetCache Escalation Engineer
Network Appliance, Inc.
"I believe the children are our future: nasty, brutish and short."
? packet-wccp.c
Index: Makefile.am
===================================================================
RCS file: /cvsroot/ethereal/Makefile.am,v
retrieving revision 1.131
diff -u -r1.131 Makefile.am
--- Makefile.am 1999/12/09 20:41:23 1.131
+++ Makefile.am 1999/12/12 01:04:47
@@ -146,6 +146,7 @@
packet-vines.h \
packet-vlan.c \
packet-vrrp.c \
+ packet-wccp.c\
packet-x25.c \
packet-yhoo.c \
packet-yhoo.h \
Index: packet-gre.c
===================================================================
RCS file: /cvsroot/ethereal/packet-gre.c,v
retrieving revision 1.11
diff -u -r1.11 packet-gre.c
--- packet-gre.c 1999/12/10 21:27:13 1.11
+++ packet-gre.c 1999/12/12 01:04:47
@@ -42,6 +42,7 @@
static gint ett_gre = -1;
static gint ett_gre_flags = -1;
+static guint32 hf_gre_proto = -1;
/* bit positions for flags in header */
#define GH_B_C 0x8000
@@ -57,20 +58,23 @@
#define GRE_PPP 0x880B
#define GRE_IP 0x0800
+#define GRE_WCCP 0x883e
-static int calc_len(guint16, int);
+/* static int calc_len(guint16, int); */
static void add_flags_and_ver(proto_tree *, guint16, int, int);
+static const value_string typevals[] = {
+ { GRE_PPP, "PPP" },
+ { GRE_IP, "IP" },
+ { GRE_WCCP, "WCCP"},
+ { 0, NULL }
+};
+
void
dissect_gre(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
guint16 flags_and_ver = pntohs(pd + offset);
guint16 type = pntohs(pd + offset + sizeof(flags_and_ver));
- static const value_string typevals[] = {
- { GRE_PPP, "PPP" },
- { GRE_IP, "IP" },
- { 0, NULL }
- };
guint16 sre_af;
guint8 sre_length;
@@ -83,25 +87,43 @@
}
if (IS_DATA_IN_FRAME(offset) && tree) {
- gboolean is_ppp;
+ gboolean is_ppp = FALSE;
+ gboolean is_wccp2 = FALSE;
proto_item * ti;
proto_tree * gre_tree;
+ guint len = 4;
is_ppp = (type == GRE_PPP);
+
+ if (flags_and_ver & GH_B_C || flags_and_ver & GH_B_R)
+ len += 4;
+ if (flags_and_ver & GH_B_K)
+ len += 4;
+ if (flags_and_ver & GH_B_S)
+ len += 4;
+ if(type == GRE_PPP && flags_and_ver & GH_P_A) {
+ len += 4;
+ } else if(type == GRE_WCCP) {
+ if( (pd[offset + sizeof(flags_and_ver) + sizeof(type)] & 0xF0) != 0x40 ) {
+ /* add the WCCPv2 routing info */
+ len += 4;
+ is_wccp2 = TRUE;
+ }
+ }
- ti = proto_tree_add_item_format(tree, proto_gre, offset,
- calc_len(flags_and_ver, type), NULL,
- "Generic Routing Encapsulation (%s)",
- val_to_str(type, typevals, "0x%04X - unknown"));
+ ti = proto_tree_add_item_format(tree, proto_gre, offset, len, NULL,
+ "Generic Routing Encapsulation (%s)", val_to_str(type, typevals, "0x%04X - unknown"));
gre_tree = proto_item_add_subtree(ti, ett_gre);
add_flags_and_ver(gre_tree, flags_and_ver, offset, is_ppp);
offset += sizeof(flags_and_ver);
- proto_tree_add_text(gre_tree, offset, sizeof(type),
- "Protocol Type: %s (%#04x)",
- val_to_str(type, typevals, "Unknown"), type);
- offset += sizeof(type);
+ proto_tree_add_item(gre_tree, hf_gre_proto, offset, sizeof(type), type);
+ offset += sizeof(type);
+ if(is_wccp2) {
+ proto_tree_add_text(gre_tree, offset, sizeof(guint32), "WCCPv2 Data");
+ offset += 4;
+ }
if (flags_and_ver & GH_B_C || flags_and_ver & GH_B_R) {
guint16 checksum = pntohs(pd + offset);
@@ -174,39 +196,19 @@
switch (type) {
case GRE_PPP:
- dissect_payload_ppp(pd, offset, fd, tree);
+ dissect_payload_ppp(pd, offset, fd, tree);
break;
case GRE_IP:
+ case GRE_WCCP:
dissect_ip(pd, offset, fd, tree);
break;
default:
dissect_data(pd, offset, fd, gre_tree);
+ break;
}
}
}
-static int
-calc_len(guint16 flags_and_ver, int type)
-{
- int len = 4;
-
- if (flags_and_ver & GH_B_C || flags_and_ver & GH_B_R)
- len += 4;
- if (flags_and_ver & GH_B_K)
- len += 4;
- if (flags_and_ver & GH_B_S)
- len += 4;
- switch (type) {
-
- case GRE_PPP:
- if (flags_and_ver & GH_P_A)
- len += 4;
- break;
- }
-
- return len;
-}
-
static void
add_flags_and_ver(proto_tree *tree, guint16 flags_and_ver, int offset, int is_ppp) {
@@ -258,16 +260,18 @@
void
proto_register_gre(void)
{
-/* static hf_register_info hf[] = {
- { &variable,
- { "Name", "gre.abbreviation", TYPE, VALS_POINTER }},
- };*/
+ static hf_register_info hf[] = {
+ { &hf_gre_proto,
+ { "Protocol Type", "gre.proto", FT_UINT16, BASE_HEX, VALS(typevals), 0x0,
+ "The protocol that is GRE encapsulated"}
+ },
+ };
static gint *ett[] = {
&ett_gre,
&ett_gre_flags,
};
proto_gre = proto_register_protocol("Generic Routing Encapsulation", "gre");
- /* proto_register_field_array(proto_gre, hf, array_length(hf));*/
+ proto_register_field_array(proto_gre, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
}
Index: packet-udp.c
===================================================================
RCS file: /cvsroot/ethereal/packet-udp.c,v
retrieving revision 1.42
diff -u -r1.42 packet-udp.c
--- packet-udp.c 1999/12/09 20:41:26 1.42
+++ packet-udp.c 1999/12/12 01:04:48
@@ -95,6 +95,7 @@
#define UDP_PORT_RX_LOW 7000
#define UDP_PORT_RX_HIGH 7009
#define UDP_PORT_RX_AFS_BACKUPS 7021
+#define UDP_PORT_WCCP 2048
struct hash_struct {
guint16 proto;
@@ -308,6 +309,8 @@
dissect_icp(pd,offset,fd,tree);
} else if ( PORT_IS(UDP_PORT_ICQ)) {
dissect_icq(pd,offset,fd,tree);
+ } else if (PORT_IS(UDP_PORT_WCCP) ) {
+ dissect_wccp(pd, offset, fd, tree);
} else {
/* OK, find a routine in the table, else use the default */
Index: packet.h
===================================================================
RCS file: /cvsroot/ethereal/packet.h,v
retrieving revision 1.159
diff -u -r1.159 packet.h
--- packet.h 1999/12/09 04:06:54 1.159
+++ packet.h 1999/12/12 01:04:48
@@ -406,6 +406,7 @@
void dissect_vines_spp(const u_char *, int, frame_data *, proto_tree *);
void dissect_vlan(const u_char *, int, frame_data *, proto_tree *);
void dissect_vrrp(const u_char *, int, frame_data *, proto_tree *);
+void dissect_wccp(const u_char *, int, frame_data *, proto_tree *);
void dissect_payload_ppp(const u_char *, int, frame_data *, proto_tree *);
void dissect_x25(const u_char *, int, frame_data *, proto_tree *);
void dissect_yhoo(const u_char *, int, frame_data *, proto_tree *);
- Follow-Ups:
- Re: [ethereal-dev] WCCP 1.0 Decoder
- From: Guy Harris
- Re: [ethereal-dev] WCCP 1.0 Decoder
- References:
- [ethereal-dev] WCCP 1.0 Decoder
- From: Jerry Talkington
- Re: [ethereal-dev] WCCP 1.0 Decoder
- From: Guy Harris
- [ethereal-dev] WCCP 1.0 Decoder
- Prev by Date: Re: [ethereal-dev] WCCP 1.0 Decoder
- Next by Date: Re: [ethereal-dev] building with ucd-snmp v4.01
- Previous by thread: Re: [ethereal-dev] WCCP 1.0 Decoder
- Next by thread: Re: [ethereal-dev] WCCP 1.0 Decoder
- Index(es):





