aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/dissectors/packet-fpp.c60
1 files changed, 50 insertions, 10 deletions
diff --git a/epan/dissectors/packet-fpp.c b/epan/dissectors/packet-fpp.c
index b2fc2e5372..5252b8d107 100644
--- a/epan/dissectors/packet-fpp.c
+++ b/epan/dissectors/packet-fpp.c
@@ -374,7 +374,28 @@ drop_conversation(conversation_t *conv) {
static void
drop_fragments(packet_info *pinfo) {
tvbuff_t *tvbuf;
- tvbuf = fragment_delete(&fpp_reassembly_table, pinfo, pinfo->p2p_dir, NULL);
+ guint interface_id;
+ guint packet_direction;
+
+ switch (pinfo->p2p_dir) {
+ case P2P_DIR_RECV:
+ packet_direction = 0x1;
+ break;
+ case P2P_DIR_SENT:
+ packet_direction = 0x2;
+ break;
+ case P2P_DIR_UNKNOWN:
+ packet_direction = 0x0;
+ break;
+ }
+
+ if (pinfo->rec->presence_flags & WTAP_HAS_INTERFACE_ID)
+ interface_id = pinfo->rec->rec_header.packet_header.interface_id;
+ else
+ interface_id = 0;
+ interface_id = interface_id << 0x2;
+ tvbuf = fragment_delete(&fpp_reassembly_table, pinfo, interface_id | packet_direction, NULL);
+
if (tvbuf != NULL) {
tvb_free(tvbuf);
}
@@ -404,10 +425,29 @@ dissect_preemption(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32
gboolean save_fragmented;
conversation_t *conv;
fpp_ctx_t *ctx;
+ guint interface_id;
+ guint packet_direction;
+
+ switch (pinfo->p2p_dir) {
+ case P2P_DIR_RECV:
+ packet_direction = 0x1;
+ break;
+ case P2P_DIR_SENT:
+ packet_direction = 0x2;
+ break;
+ case P2P_DIR_UNKNOWN:
+ packet_direction = 0x0;
+ break;
+ }
- conv = find_conversation_by_id(pinfo->num, ENDPOINT_NONE, pinfo->p2p_dir, 0);
+ if (pinfo->rec->presence_flags & WTAP_HAS_INTERFACE_ID)
+ interface_id = pinfo->rec->rec_header.packet_header.interface_id;
+ else
+ interface_id = 0;
+ interface_id = interface_id << 0x2;
+ conv = find_conversation_by_id(pinfo->num, ENDPOINT_NONE, interface_id | packet_direction, 0);
if (!conv) {
- conv = conversation_new_by_id(pinfo->num, ENDPOINT_NONE, pinfo->p2p_dir, 0);
+ conv = conversation_new_by_id(pinfo->num, ENDPOINT_NONE, interface_id | packet_direction, 0);
}
/* Create a tree for the preamble. */
@@ -476,7 +516,7 @@ dissect_preemption(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32
}
fragment_add_check(&fpp_reassembly_table,
- tvb, preamble_length, pinfo, pinfo->p2p_dir, NULL,
+ tvb, preamble_length, pinfo, interface_id | packet_direction, NULL,
0, frag_size, TRUE);
set_address_tvb(&pinfo->dl_dst, AT_ETHER, 6, tvb, 8);
@@ -504,7 +544,7 @@ dissect_preemption(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32
if ((ctx) && (ctx->preemption) && (ctx->frame_cnt == smd1) && (frag_cnt_next(ctx->frag_cnt) == smd2)) {
fpp_pdata_t *fpp_pdata = wmem_new(wmem_file_scope(), fpp_pdata_t);
fpp_pdata->offset = ctx->size;
- p_add_proto_data(wmem_file_scope(), pinfo, proto_fpp, pinfo->p2p_dir, fpp_pdata);
+ p_add_proto_data(wmem_file_scope(), pinfo, proto_fpp, interface_id | packet_direction, fpp_pdata);
ctx->size += frag_size;
ctx->frag_cnt = smd2;
@@ -514,10 +554,10 @@ dissect_preemption(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32
}
}
- fpp_pdata_t *fpp_pdata = (fpp_pdata_t *)p_get_proto_data(wmem_file_scope(), pinfo, proto_fpp, pinfo->p2p_dir);
+ fpp_pdata_t *fpp_pdata = (fpp_pdata_t *)p_get_proto_data(wmem_file_scope(), pinfo, proto_fpp, interface_id | packet_direction);
if (fpp_pdata) {
fragment_add_check(&fpp_reassembly_table,
- tvb, preamble_length, pinfo, pinfo->p2p_dir, NULL,
+ tvb, preamble_length, pinfo, interface_id | packet_direction, NULL,
fpp_pdata->offset, frag_size, TRUE);
} else {
drop_fragments(pinfo);
@@ -535,18 +575,18 @@ dissect_preemption(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32
if ((ctx) && (ctx->preemption) && (ctx->frame_cnt == smd1) && (frag_cnt_next(ctx->frag_cnt) == smd2)) {
fpp_pdata_t *fpp_pdata = wmem_new(wmem_file_scope(), fpp_pdata_t);
fpp_pdata->offset = ctx->size;
- p_add_proto_data(wmem_file_scope(), pinfo, proto_fpp, pinfo->p2p_dir, fpp_pdata);
+ p_add_proto_data(wmem_file_scope(), pinfo, proto_fpp, interface_id | packet_direction, fpp_pdata);
}
drop_conversation(conv);
}
- fpp_pdata_t *fpp_pdata = (fpp_pdata_t *)p_get_proto_data(wmem_file_scope(), pinfo, proto_fpp, pinfo->p2p_dir);
+ fpp_pdata_t *fpp_pdata = (fpp_pdata_t *)p_get_proto_data(wmem_file_scope(), pinfo, proto_fpp, interface_id | packet_direction);
if (fpp_pdata) {
save_fragmented = pinfo->fragmented;
pinfo->fragmented = TRUE;
frag_data = fragment_add_check(&fpp_reassembly_table,
- tvb, preamble_length, pinfo, pinfo->p2p_dir, NULL,
+ tvb, preamble_length, pinfo, interface_id | packet_direction, NULL,
fpp_pdata->offset, frag_size, FALSE);
// Attempt reassembly.
new_tvb = process_reassembled_data(tvb, preamble_length, pinfo,