Fix Bug 5919: "IE 89 Forwarding Status - Incorrect Decoding"

https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=5919

svn path=/trunk/; revision=37133
This commit is contained in:
Bill Meier 2011-05-13 21:47:09 +00:00
parent dac93d45dd
commit 716132e53a
1 changed files with 105 additions and 45 deletions

View File

@ -804,41 +804,57 @@ static const value_string v9_direction[] = {
{ 0, NULL }
};
#define FORWARDING_STATUS_UNKNOWN 0
#define FORWARDING_STATUS_FORWARD 1
#define FORWARDING_STATUS_DROP 2
#define FORWARDING_STATUS_CONSUME 3
static const value_string v9_forwarding_status[] = {
{ 0, "Unknown"}, /* Observed on IOS-XR 3.2 */
{ 1, "Forward"}, /* Observed on 7200 12.4(9)T */
{ 2, "Drop"}, /* Observed on 7200 12.4(9)T */
{ 3, "Consume"}, /* Observed on 7200 12.4(9)T */
{ FORWARDING_STATUS_UNKNOWN, "Unknown"}, /* Observed on IOS-XR 3.2 */
{ FORWARDING_STATUS_FORWARD, "Forward"}, /* Observed on 7200 12.4(9)T */
{ FORWARDING_STATUS_DROP, "Drop"}, /* Observed on 7200 12.4(9)T */
{ FORWARDING_STATUS_CONSUME, "Consume"}, /* Observed on 7200 12.4(9)T */
{ 0, NULL }
};
static const value_string v9_forwarding_status_code[] = {
{ 64, "Forwarded (Unknown)" },
{ 65, "Forwarded Fragmented" },
{ 66, "Forwarded not Fragmented" },
{ 128, "Dropped (Unknown)" },
{ 129, "Drop ACL Deny" },
{ 130, "Drop ACL drop" },
{ 131, "Drop Unroutable" },
{ 132, "Drop Adjacency" },
{ 133, "Drop Fragmentation & DF set" },
{ 134, "Drop Bad header checksum" },
{ 135, "Drop Bad total Length" },
{ 136, "Drop Bad Header Length" },
{ 137, "Drop bad TTL" },
{ 138, "Drop Policer" },
{ 139, "Drop WRED" },
{ 140, "Drop RPF" },
{ 141, "Drop For us" },
{ 142, "Drop Bad output interface" },
{ 143, "Drop Hardware" },
{ 192, "Consumed (Unknown)" },
{ 193, "Terminate Punt Adjacency" },
{ 194, "Terminate Incomplete Adjacency" },
{ 195, "Terminate For us" },
{ 0, NULL }
static const value_string v9_forwarding_status_unknown_code[] = {
{ 0, NULL }
};
static const value_string v9_forwarding_status_forward_code[] = {
{ 0, "Forwarded (Unknown)" },
{ 1, "Forwarded Fragmented" },
{ 2, "Forwarded not Fragmented" },
{ 0, NULL }
};
static const value_string v9_forwarding_status_drop_code[] = {
{ 0, "Dropped (Unknown)" },
{ 1, "Drop ACL Deny" },
{ 2, "Drop ACL drop" },
{ 3, "Drop Unroutable" },
{ 4, "Drop Adjacency" },
{ 5, "Drop Fragmentation & DF set" },
{ 6, "Drop Bad header checksum" },
{ 7, "Drop Bad total Length" },
{ 8, "Drop Bad Header Length" },
{ 9, "Drop bad TTL" },
{ 10, "Drop Policer" },
{ 11, "Drop WRED" },
{ 12, "Drop RPF" },
{ 13, "Drop For us" },
{ 14, "Drop Bad output interface" },
{ 15, "Drop Hardware" },
{ 0, NULL }
};
static const value_string v9_forwarding_status_consume_code[] = {
{ 0, "Consumed (Unknown)" },
{ 1, "Terminate Punt Adjacency" },
{ 2, "Terminate Incomplete Adjacency" },
{ 3, "Terminate For us" },
{ 0, NULL }
};
static value_string_ext v9_forwarding_status_code_ext = VALUE_STRING_EXT_INIT(v9_forwarding_status_code);
static const value_string v9_firewall_event[] = {
{ 0, "Default (ignore)"},
@ -1044,7 +1060,10 @@ static int hf_cflow_if_name = -1;
static int hf_cflow_if_descr = -1;
static int hf_cflow_sampler_name = -1;
static int hf_cflow_forwarding_status = -1;
static int hf_cflow_forwarding_code = -1;
static int hf_cflow_forwarding_status_unknown_code = -1;
static int hf_cflow_forwarding_status_forward_code = -1;
static int hf_cflow_forwarding_status_consume_code = -1;
static int hf_cflow_forwarding_status_drop_code = -1;
static int hf_cflow_nbar_appl_desc = -1;
static int hf_cflow_nbar_appl_id = -1;
static int hf_cflow_nbar_appl_name = -1;
@ -3070,27 +3089,53 @@ dissect_v9_v10_pdu_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *pdutree,
tvb, offset, length, ENC_BIG_ENDIAN);
break;
case 89: /* FORWARDING_STATUS */
case 89: {
/* FORWARDING_STATUS */
/* Forwarding status is encoded on 1 byte with
* the 2 left bits giving the status and the 6
* remaining bits giving the reason code. */
guint8 forwarding_status;
const value_string *x_vs;
int x_hf;
ti = proto_tree_add_text(pdutree, tvb, offset, length, "Forwarding Status");
fwdstattree = proto_item_add_subtree(ti, ett_fwdstat);
forwarding_status = tvb_get_guint8(tvb, offset)>>6;
switch(forwarding_status) {
case FORWARDING_STATUS_UNKNOWN:
x_vs = v9_forwarding_status_unknown_code;
x_hf = hf_cflow_forwarding_status_unknown_code;
break;
case FORWARDING_STATUS_FORWARD:
x_vs = v9_forwarding_status_forward_code;
x_hf = hf_cflow_forwarding_status_forward_code;
break;
case FORWARDING_STATUS_DROP:
x_vs = v9_forwarding_status_drop_code;
x_hf = hf_cflow_forwarding_status_drop_code;
break;
case FORWARDING_STATUS_CONSUME:
x_vs = v9_forwarding_status_consume_code;
x_hf = hf_cflow_forwarding_status_consume_code;
break;
}
proto_tree_add_item(fwdstattree, hf_cflow_forwarding_status,
tvb, offset, length, ENC_NA);
proto_tree_add_item(fwdstattree, hf_cflow_forwarding_code,
tvb, offset, length, ENC_NA);
tvb, offset, length, ENC_NA);
proto_tree_add_item(fwdstattree, x_hf,
tvb, offset, length, ENC_NA);
/* add status code to tree summary */
if (length==1) {
proto_item_append_text(ti, ": %s", val_to_str((tvb_get_guint8(tvb, offset)>>6),
v9_forwarding_status, "Unknown(%d)"));
proto_item_append_text(ti, ": %s", val_to_str_ext((tvb_get_guint8(tvb, offset)&0x3F),
&v9_forwarding_status_code_ext, "Unknown(%d)"));
proto_item_append_text(ti, ": %s", val_to_str_const(forwarding_status,
v9_forwarding_status, "(Unknown)"));
proto_item_append_text(ti, ": %s", val_to_str_const((tvb_get_guint8(tvb, offset)&0x3F),
x_vs, "(Unknown)"));
};
}
break;
case 90: /* mplsVpnRouteDistinguisher */
@ -5845,10 +5890,25 @@ proto_register_netflow(void)
FT_UINT8, BASE_DEC, VALS(v9_forwarding_status), 0xC0,
"Forwarding Status", HFILL}
},
{&hf_cflow_forwarding_code,
{"ForwdCode", "cflow.forwarding_code",
FT_UINT8, BASE_DEC|BASE_EXT_STRING, &v9_forwarding_status_code_ext, 0x3F,
"Forwarding Code", HFILL}
{&hf_cflow_forwarding_status_unknown_code,
{"ForwdCode", "cflow.forwarding_status_unknown_code",
FT_UINT8, BASE_DEC, VALS(v9_forwarding_status_unknown_code), 0x3F,
NULL, HFILL}
},
{&hf_cflow_forwarding_status_forward_code,
{"ForwdCode", "cflow.forwarding_status_foreward_code",
FT_UINT8, BASE_DEC, VALS(v9_forwarding_status_forward_code), 0x3F,
NULL, HFILL}
},
{&hf_cflow_forwarding_status_drop_code,
{"ForwdCode", "cflow.forwarding_status_drop_code",
FT_UINT8, BASE_DEC, VALS(v9_forwarding_status_drop_code), 0x3F,
NULL, HFILL}
},
{&hf_cflow_forwarding_status_consume_code,
{"ForwdCode", "cflow.forwarding_status_consume_code",
FT_UINT8, BASE_DEC, VALS(v9_forwarding_status_consume_code), 0x3F,
NULL, HFILL}
},
{&hf_cflow_nbar_appl_desc,
{"ApplicationDesc", "cflow.appl_desc",