Revert "MPLS: relax pw_eth_heuristic and improve 1st nibble logic"

This reverts commit 01ddd93a72.

Change-Id: I90f19fec52d3f1edc63fd00e614173a0154503d4
Reviewed-on: https://code.wireshark.org/review/19820
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Anders Broman 2017-01-28 10:29:52 +00:00
parent 1bfa581529
commit a949d7887c
2 changed files with 24 additions and 51 deletions

View File

@ -479,51 +479,29 @@ dissect_mpls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_
}
/*
* No, there isn't, so use a mix of the 1st nibble logic (see BCP 4928,
* RFC 4385 and 5586) + heuristic.
* No, there isn't, so use the 1st nibble logic (see BCP 4928,
* RFC 4385 and 5586).
*/
switch(first_nibble) {
case 4:
{
/*
* This could be from an Ethernet pseudo-wire without a
* control word, with the MAC address's first nibble being 4
* or an IPv4 packet (or something else).
*/
guint iplen = tvb_get_ntohs(next_tvb, 2);
guint reported_len = tvb_reported_length(next_tvb);
if (iplen >= (reported_len - 4) && iplen <= reported_len) {
/* the supposed IP total len is equal to the reported len plus
the possible padding, we have a good indication this is IP */
call_dissector(dissector_ip, next_tvb, pinfo, tree);
/* IP dissector may reduce the length of the tvb.
We need to do the same, so that ethernet trailer is detected. */
set_actual_length(tvb, offset + tvb_reported_length(next_tvb));
break;
}
/* last resort */
call_dissector(dissector_pw_eth_heuristic, next_tvb, pinfo, tree);
}
/*
* XXX - this could be from an Ethernet pseudo-wire without a
* control word, with the MAC address's first nibble being 4.
*/
call_dissector(dissector_ip, next_tvb, pinfo, tree);
/* IP dissector may reduce the length of the tvb.
We need to do the same, so that ethernet trailer is detected. */
set_actual_length(tvb, offset+tvb_reported_length(next_tvb));
break;
case 6:
{
/*
* This could be from an Ethernet pseudo-wire without a
* control word, with the MAC address's first nibble being 6
* or an IPv6 packet (or something else).
*/
guint ip6len = tvb_get_guint16(next_tvb, offset + 4, ENC_BIG_ENDIAN);
guint reported_len = tvb_reported_length(next_tvb);
if (ip6len >= (reported_len - 4) && ip6len <= reported_len) {
call_dissector(dissector_ipv6, next_tvb, pinfo, tree);
/* IPv6 dissector may reduce the length of the tvb.
We need to do the same, so that ethernet trailer is detected. */
set_actual_length(tvb, offset + tvb_reported_length(next_tvb));
break;
}
/* last resort */
call_dissector(dissector_pw_eth_heuristic, next_tvb, pinfo, tree);
}
/*
* XXX - this could be from an Ethernet pseudo-wire without a
* control word, with the MAC address's first nibble being 6.
*/
call_dissector(dissector_ipv6, next_tvb, pinfo, tree);
/* IPv6 dissector may reduce the length of the tvb.
We need to do the same, so that ethernet trailer is detected. */
set_actual_length(tvb, offset+tvb_reported_length(next_tvb));
break;
case 1:
/*

View File

@ -108,32 +108,27 @@ dissect_pw_eth_nocw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* d
}
/*
* FF: this function returns 2 if the first 12 bytes in tvb looks like
* two valid ethernet addresses, 1 if either one of them contains a
* registered OUI and 0 otherwise.
* FF: this function returns TRUE if the first 12 bytes in tvb looks like
* two valid ethernet addresses. FALSE otherwise.
*/
static int
static gboolean
looks_like_plain_eth(tvbuff_t *tvb _U_)
{
const gchar *manuf_name_da;
const gchar *manuf_name_sa;
if (tvb_reported_length_remaining(tvb, 0) < 14) {
return 0;
return FALSE;
}
manuf_name_da = tvb_get_manuf_name_if_known(tvb, 0);
manuf_name_sa = tvb_get_manuf_name_if_known(tvb, 6);
if (manuf_name_da && manuf_name_sa) {
return 2;
return TRUE;
}
if (manuf_name_da || manuf_name_sa) {
return 1;
}
return 0;
return FALSE;
}
static int