aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-tpncp.c
diff options
context:
space:
mode:
authorOrgad Shaneh <orgad.shaneh@audiocodes.com>2020-02-11 10:15:46 +0200
committerAnders Broman <a.broman58@gmail.com>2020-02-11 18:01:42 +0000
commit055b4c59e4f4bbe724c09ce47d5a08eb92e89fc8 (patch)
tree79986a04b86c084ac1cee1198db25ab0a6eb542a /epan/dissectors/packet-tpncp.c
parent52559702a08c05a96bca108079d2a5c4a8111dfd (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.c23
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) {