diff options
author | Orgad Shaneh <orgad.shaneh@audiocodes.com> | 2020-02-11 10:15:46 +0200 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2020-02-11 18:01:42 +0000 |
commit | 055b4c59e4f4bbe724c09ce47d5a08eb92e89fc8 (patch) | |
tree | 79986a04b86c084ac1cee1198db25ab0a6eb542a /epan/dissectors/packet-tpncp.c | |
parent | 52559702a08c05a96bca108079d2a5c4a8111dfd (diff) |
TPNCP: Support IPv6 without modifying tpncp.dat
This reverts tpncp.dat changes in f307dcc1d4b043f7644abc430737ceacf624aafb
in order to maintain compatibility with previous versions of the dissector.
Also update the real value of address family for IPv6, and reset
address family after using it.
Change-Id: I87acf85a84a5ad41fea4a5658181badccebefcb8
Reviewed-on: https://code.wireshark.org/review/36074
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-tpncp.c')
-rw-r--r-- | epan/dissectors/packet-tpncp.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/epan/dissectors/packet-tpncp.c b/epan/dissectors/packet-tpncp.c index 0206ba7d8b..436235e295 100644 --- a/epan/dissectors/packet-tpncp.c +++ b/epan/dissectors/packet-tpncp.c @@ -114,7 +114,8 @@ static gboolean db_initialized = FALSE; enum AddressFamily { TPNCP_IPV4 = 2, - TPNCP_IPV6 = 28 + TPNCP_IPV6 = 10, + TPNCP_IPV6_PSOS = 28 }; static void @@ -187,13 +188,14 @@ dissect_tpncp_data(guint data_id, packet_info *pinfo, tvbuff_t *tvb, proto_tree break; case 128: if (current_tpncp_data_field_info->tpncp_data_field_is_ip_addr) { - if (address_family == TPNCP_IPV6) { + if (address_family == TPNCP_IPV6 || address_family == TPNCP_IPV6_PSOS) { proto_tree_add_item(ltree, current_tpncp_data_field_info->tpncp_ipv6_data_field_descr, tvb, *offset, 16, encoding); } else { proto_tree_add_item(ltree, current_tpncp_data_field_info->tpncp_data_field_descr, tvb, *offset, 4, encoding); } + address_family = TPNCP_IPV4; } (*offset) += 16; break; @@ -588,6 +590,8 @@ init_tpncp_data_fields_info(tpncp_data_field_info *data_fields_info, FILE *file) } else hf_size++; + tpncp_data_field_is_address_family = FALSE; + /* Register standard data. */ while (fgetline(tpncp_db_entry, MAX_TPNCP_DB_ENTRY_LEN, file)) { g_snprintf(entry_copy, MAX_TPNCP_DB_ENTRY_LEN, "%s", tpncp_db_entry); @@ -653,6 +657,21 @@ init_tpncp_data_fields_info(tpncp_data_field_info *data_fields_info, FILE *file) continue; } + if (tpncp_data_field_is_ip_addr) { + // ip address that comes after address family has 4 fields: ip_addr_0, ip_addr_1, 2 and 3 + // On these cases, ignore 1, 2 and 3 and enlarge the field size of 0 to 128 + char *seq = (char*)tpncp_data_field_name + strlen(tpncp_data_field_name) - 2; + if (seq > tpncp_data_field_name && *seq == '_') { + if (seq[1] >= '1' && seq[1] <= '3') + continue; + // relates to the *previous* field + if (tpncp_data_field_is_address_family) { + *seq = 0; + tpncp_data_field_size = 128; + } + } + } + tpncp_data_field_is_address_family = FALSE; if (current_data_id != data_id) { /* new data */ if (registered_struct_ids[data_id] == TRUE) { |