aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-lbtrm.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/packet-lbtrm.c')
-rw-r--r--epan/dissectors/packet-lbtrm.c116
1 files changed, 40 insertions, 76 deletions
diff --git a/epan/dissectors/packet-lbtrm.c b/epan/dissectors/packet-lbtrm.c
index a48d400ea9..f956147643 100644
--- a/epan/dissectors/packet-lbtrm.c
+++ b/epan/dissectors/packet-lbtrm.c
@@ -67,19 +67,12 @@ static lbtrm_transport_t * lbtrm_transport_unicast_find(const address * source_a
conversation_t * conv = NULL;
wmem_tree_t * session_tree = NULL;
- conv = find_conversation(0, source_address, &lbtrm_null_address, PT_UDP, source_port, 0, 0);
+ conv = find_conversation(frame, source_address, &lbtrm_null_address, PT_UDP, source_port, 0, 0);
if (conv != NULL)
{
- if (frame != 0)
+ if (frame > conv->last_frame)
{
- if (conv->setup_frame == 0)
- {
- conv->setup_frame = frame;
- }
- if (frame > conv->last_frame)
- {
- conv->last_frame = frame;
- }
+ conv->last_frame = frame;
}
session_tree = (wmem_tree_t *) conversation_get_proto_data(conv, proto_lbtrm);
if (session_tree != NULL)
@@ -90,16 +83,16 @@ static lbtrm_transport_t * lbtrm_transport_unicast_find(const address * source_a
return (transport);
}
-static void lbtrm_transport_unicast_add(const address * source_address, guint16 source_port, guint32 session_id, lbtrm_transport_t * transport)
+static void lbtrm_transport_unicast_add(const address * source_address, guint16 source_port, guint32 session_id, guint32 frame, lbtrm_transport_t * transport)
{
conversation_t * conv = NULL;
wmem_tree_t * session_tree = NULL;
lbtrm_transport_t * transport_entry = NULL;
- conv = find_conversation(0, source_address, &lbtrm_null_address, PT_UDP, source_port, 0, 0);
+ conv = find_conversation(frame, source_address, &lbtrm_null_address, PT_UDP, source_port, 0, 0);
if (conv == NULL)
{
- conv = conversation_new(0, source_address, &lbtrm_null_address, PT_UDP, source_port, 0, 0);
+ conv = conversation_new(frame, source_address, &lbtrm_null_address, PT_UDP, source_port, 0, 0);
}
session_tree = (wmem_tree_t *) conversation_get_proto_data(conv, proto_lbtrm);
if (session_tree == NULL)
@@ -123,16 +116,9 @@ static lbtrm_transport_t * lbtrm_transport_find(const address * source_address,
conv = find_conversation(frame, source_address, multicast_group, PT_UDP, source_port, dest_port, 0);
if (conv != NULL)
{
- if (frame != 0)
+ if (frame > conv->last_frame)
{
- if (conv->setup_frame == 0)
- {
- conv->setup_frame = frame;
- }
- if (frame > conv->last_frame)
- {
- conv->last_frame = frame;
- }
+ conv->last_frame = frame;
}
session_tree = (wmem_tree_t *) conversation_get_proto_data(conv, proto_lbtrm);
if (session_tree != NULL)
@@ -154,16 +140,9 @@ lbtrm_transport_t * lbtrm_transport_add(const address * source_address, guint16
{
conv = conversation_new(frame, source_address, multicast_group, PT_UDP, source_port, dest_port, 0);
}
- if (frame != 0)
+ if (frame > conv->last_frame)
{
- if (conv->setup_frame == 0)
- {
- conv->setup_frame = frame;
- }
- if (frame > conv->last_frame)
- {
- conv->last_frame = frame;
- }
+ conv->last_frame = frame;
}
session_tree = (wmem_tree_t *) conversation_get_proto_data(conv, proto_lbtrm);
if (session_tree == NULL)
@@ -194,7 +173,7 @@ lbtrm_transport_t * lbtrm_transport_add(const address * source_address, guint16
entry->data_high_sqn = 0;
entry->sm_high_sqn = 0;
wmem_tree_insert32(session_tree, session_id, (void *) entry);
- lbtrm_transport_unicast_add(source_address, source_port, session_id, entry);
+ lbtrm_transport_unicast_add(source_address, source_port, session_id, frame, entry);
return (entry);
}
@@ -366,15 +345,23 @@ static lbm_transport_frame_t * lbtrm_transport_frame_add(lbtrm_transport_t * tra
return (frame_entry);
}
-char * lbtrm_transport_source_string(const address * source_address, guint16 source_port, guint32 session_id, const address * multicast_group, guint16 dest_port)
+static char * lbtrm_transport_source_string_format(const address * source_address, guint16 source_port, guint32 session_id, const address * multicast_group, guint16 dest_port)
{
- return (wmem_strdup_printf(wmem_file_scope(), "LBTRM:%s:%" G_GUINT16_FORMAT ":%08x:%s:%" G_GUINT16_FORMAT, address_to_str(wmem_packet_scope(), source_address), source_port, session_id,
+ /* Returns a packet-scoped string. */
+ return (wmem_strdup_printf(wmem_packet_scope(), "LBTRM:%s:%" G_GUINT16_FORMAT ":%08x:%s:%" G_GUINT16_FORMAT, address_to_str(wmem_packet_scope(), source_address), source_port, session_id,
address_to_str(wmem_packet_scope(), multicast_group), dest_port));
}
+char * lbtrm_transport_source_string(const address * source_address, guint16 source_port, guint32 session_id, const address * multicast_group, guint16 dest_port)
+{
+ /* Returns a file-scoped string. */
+ return (wmem_strdup(wmem_file_scope(), lbtrm_transport_source_string_format(source_address, source_port, session_id, multicast_group, dest_port)));
+}
+
static char * lbtrm_transport_source_string_transport(lbtrm_transport_t * transport)
{
- return (lbtrm_transport_source_string(&(transport->source_address), transport->source_port, transport->session_id, &(transport->multicast_group), transport->dest_port));
+ /* Returns a packet-scoped string. */
+ return (lbtrm_transport_source_string_format(&(transport->source_address), transport->source_port, transport->session_id, &(transport->multicast_group), transport->dest_port));
}
/*----------------------------------------------------------------------------*/
@@ -927,10 +914,7 @@ static int dissect_lbtrm_ncf_list(tvbuff_t * tvb, int offset, packet_info * pinf
{
expert_add_info_format(pinfo, sep_ncf_item, &ei_lbtrm_analysis_ncf_ncf, "NCF 0x%08x %s", ncf, val_to_str(reason, lbtrm_ncf_reason, "Unknown (0x%02x)"));
}
- if (tap_info != NULL)
- {
- tap_info->sqns[idx] = ncf;
- }
+ tap_info->sqns[idx] = ncf;
len += 4;
}
return (len);
@@ -965,12 +949,9 @@ static int dissect_lbtrm_ncf(tvbuff_t * tvb, int offset, packet_info * pinfo, pr
{
expert_add_info_format(pinfo, reason_item, &ei_lbtrm_analysis_ncf, "NCF %s", val_to_str(LBTRM_NCF_HDR_REASON(reason), lbtrm_ncf_reason, "Unknown (0x%02x)"));
}
- if (tap_info != NULL)
- {
- tap_info->ncf_reason = LBTRM_NCF_HDR_REASON(reason);
- tap_info->num_sqns = num_ncfs;
- tap_info->sqns = wmem_alloc_array(wmem_file_scope(), guint32, num_ncfs);
- }
+ tap_info->ncf_reason = LBTRM_NCF_HDR_REASON(reason);
+ tap_info->num_sqns = num_ncfs;
+ tap_info->sqns = wmem_alloc_array(wmem_packet_scope(), guint32, num_ncfs);
len += dissect_lbtrm_ncf_list(tvb, offset + len, pinfo, ncf_tree, num_ncfs, LBTRM_NCF_HDR_REASON(reason), tap_info);
proto_item_set_len(ncf_item, len);
return (len);
@@ -1000,10 +981,7 @@ static int dissect_lbtrm_nak_list(tvbuff_t * tvb, int offset, packet_info * pinf
{
expert_add_info_format(pinfo, sep_nak_item, &ei_lbtrm_analysis_nak_nak, "NAK 0x%08x", nak);
}
- if (tap_info != NULL)
- {
- tap_info->sqns[idx] = nak;
- }
+ tap_info->sqns[idx] = nak;
len += 4;
}
return (len);
@@ -1026,11 +1004,8 @@ static int dissect_lbtrm_nak(tvbuff_t * tvb, int offset, packet_info * pinfo, pr
{
expert_add_info(pinfo, nak_item, &ei_lbtrm_analysis_nak);
}
- if (tap_info != NULL)
- {
- tap_info->num_sqns = num_naks;
- tap_info->sqns = wmem_alloc_array(wmem_file_scope(), guint32, num_naks);
- }
+ tap_info->num_sqns = num_naks;
+ tap_info->sqns = wmem_alloc_array(wmem_packet_scope(), guint32, num_naks);
len += dissect_lbtrm_nak_list(tvb, offset + len, pinfo, nak_tree, num_naks, tap_info);
proto_item_set_len(nak_item, len);
return (len);
@@ -1067,10 +1042,7 @@ static int dissect_lbtrm_sm(tvbuff_t * tvb, int offset, packet_info * pinfo, pro
{
*sequence = sqn;
}
- if (tap_info != NULL)
- {
- tap_info->sqn = sqn;
- }
+ tap_info->sqn = sqn;
return (L_LBTRM_SM_HDR_T);
}
@@ -1086,6 +1058,7 @@ static int dissect_lbtrm_data(tvbuff_t * tvb, int offset, packet_info * pinfo, p
proto_item * sqn_item = NULL;
guint8 flags;
guint32 sqn;
+ gboolean is_retransmission = FALSE;
data_item = proto_tree_add_item(tree, hf_lbtrm_data, tvb, offset, L_LBTRM_DATA_HDR_T, ENC_NA);
data_tree = proto_item_add_subtree(data_item, ett_lbtrm_data);
@@ -1104,26 +1077,17 @@ static int dissect_lbtrm_data(tvbuff_t * tvb, int offset, packet_info * pinfo, p
{
*sequence = sqn;
}
- if (retransmission != NULL)
- {
- *retransmission = FALSE;
- }
if ((flags & LBTRM_DATA_RETRANSMISSION_FLAG) != 0)
{
+ is_retransmission = TRUE;
expert_add_info_format(pinfo, sqn_item, &ei_lbtrm_analysis_rx, "RX 0x%08x", sqn);
- if (retransmission != NULL)
- {
- *retransmission = TRUE;
- }
- if (tap_info != NULL)
- {
- tap_info->retransmission = TRUE;
- }
}
- if (tap_info != NULL)
+ if (retransmission != NULL)
{
- tap_info->sqn = sqn;
+ *retransmission = is_retransmission;
}
+ tap_info->retransmission = is_retransmission;
+ tap_info->sqn = sqn;
return (L_LBTRM_DATA_HDR_T);
}
@@ -1261,12 +1225,12 @@ static int dissect_lbtrm(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree,
item = proto_tree_add_string(lbtrm_tree, hf_lbtrm_tag, tvb, 0, 0, tag_name);
PROTO_ITEM_SET_GENERATED(item);
}
+ tapinfo = wmem_new0(wmem_packet_scope(), lbm_lbtrm_tap_info_t);
if (transport != NULL)
{
- tapinfo = wmem_new0(wmem_file_scope(), lbm_lbtrm_tap_info_t);
tapinfo->transport = lbtrm_transport_source_string_transport(transport);
- tapinfo->type = packet_type;
}
+ tapinfo->type = packet_type;
hdr_item = proto_tree_add_item(lbtrm_tree, hf_lbtrm_hdr, tvb, O_LBTRM_HDR_T_VER_TYPE, L_LBTRM_HDR_T, ENC_NA);
hdr_tree = proto_item_add_subtree(hdr_item, ett_lbtrm_hdr);
@@ -1520,9 +1484,9 @@ static int dissect_lbtrm(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree,
{
total_dissected_len += dissect_lbtrm_data_contents(tvb, offset, pinfo, tree, tag_name, channel);
}
- if (tapinfo != NULL)
+ if (tapinfo->transport != NULL)
{
- tap_queue_packet(lbtrm_tap_handle, pinfo, (void *)tapinfo);
+ tap_queue_packet(lbtrm_tap_handle, pinfo, (void *) tapinfo);
}
return (total_dissected_len);
}