diff options
author | Guy Harris <guy@alum.mit.edu> | 2016-01-16 16:51:46 -0800 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2016-01-17 00:52:14 +0000 |
commit | 25699b67580eb4ef4f1dde542e860a714390a607 (patch) | |
tree | 7d62c9f0e772c243a1c67aa879dcc940e0d81c70 /epan | |
parent | 330162378440b44b6faeaea20c868e70c48d228a (diff) |
Don't look at pinfo->pseudo_header.
On the off chance that UMTS FP traffic is being carried over a
pseudowire. :-)
Change-Id: I8db0fbe96545c08f4748bf9ec046e2dc4f2c2cc6
Reviewed-on: https://code.wireshark.org/review/13342
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-rlc.c | 140 | ||||
-rw-r--r-- | epan/dissectors/packet-rlc.h | 4 | ||||
-rw-r--r-- | epan/dissectors/packet-umts_fp.c | 160 | ||||
-rw-r--r-- | epan/dissectors/packet-umts_mac.c | 54 |
4 files changed, 205 insertions, 153 deletions
diff --git a/epan/dissectors/packet-rlc.c b/epan/dissectors/packet-rlc.c index 4042fb3df0..3dae5ca0ae 100644 --- a/epan/dissectors/packet-rlc.c +++ b/epan/dissectors/packet-rlc.c @@ -343,13 +343,11 @@ rlc_channel_equal(gconstpointer a, gconstpointer b) } static int -rlc_channel_assign(struct rlc_channel *ch, enum rlc_mode mode, packet_info *pinfo) +rlc_channel_assign(struct rlc_channel *ch, enum rlc_mode mode, packet_info *pinfo, struct atm_phdr *atm) { - struct atm_phdr *atm; rlc_info *rlcinf; fp_info *fpinf; - atm = &pinfo->pseudo_header->atm; fpinf = (fp_info *)p_get_proto_data(wmem_file_scope(), pinfo, proto_fp, 0); rlcinf = (rlc_info *)p_get_proto_data(wmem_file_scope(), pinfo, proto_rlc, 0); if (!fpinf || !rlcinf) return -1; @@ -374,13 +372,13 @@ rlc_channel_assign(struct rlc_channel *ch, enum rlc_mode mode, packet_info *pinf } static struct rlc_channel * -rlc_channel_create(enum rlc_mode mode, packet_info *pinfo) +rlc_channel_create(enum rlc_mode mode, packet_info *pinfo, struct atm_phdr *atm) { struct rlc_channel *ch; int rv; ch = (struct rlc_channel *)g_malloc0(sizeof(struct rlc_channel)); - rv = rlc_channel_assign(ch, mode, pinfo); + rv = rlc_channel_assign(ch, mode, pinfo, atm); if (rv != 0) { /* channel assignment failed */ @@ -457,14 +455,14 @@ rlc_sdu_frags_delete(gpointer data) static int rlc_frag_assign(struct rlc_frag *frag, enum rlc_mode mode, packet_info *pinfo, - guint16 seq, guint16 li) + guint16 seq, guint16 li, struct atm_phdr *atm) { frag->frame_num = pinfo->fd->num; frag->seq = seq; frag->li = li; frag->len = 0; frag->data = NULL; - rlc_channel_assign(&frag->ch, mode, pinfo); + rlc_channel_assign(&frag->ch, mode, pinfo, atm); return 0; } @@ -481,12 +479,13 @@ rlc_frag_assign_data(struct rlc_frag *frag, tvbuff_t *tvb, static struct rlc_frag * rlc_frag_create(tvbuff_t *tvb, enum rlc_mode mode, packet_info *pinfo, - guint16 offset, guint16 length, guint16 seq, guint16 li) + guint16 offset, guint16 length, guint16 seq, guint16 li, + struct atm_phdr *atm) { struct rlc_frag *frag; frag = (struct rlc_frag *)wmem_alloc0(wmem_file_scope(), sizeof(struct rlc_frag)); - rlc_frag_assign(frag, mode, pinfo, seq, li); + rlc_frag_assign(frag, mode, pinfo, seq, li, atm); rlc_frag_assign_data(frag, tvb, offset, length); return frag; @@ -880,7 +879,7 @@ printends(GList * list) #endif static struct rlc_frag ** -get_frags(packet_info * pinfo, struct rlc_channel * ch_lookup) +get_frags(packet_info * pinfo, struct rlc_channel * ch_lookup, struct atm_phdr *atm) { gpointer value = NULL; struct rlc_frag ** frags = NULL; @@ -889,7 +888,7 @@ get_frags(packet_info * pinfo, struct rlc_channel * ch_lookup) frags = (struct rlc_frag **)value; } else if (pinfo != NULL) { struct rlc_channel *ch; - ch = rlc_channel_create(ch_lookup->mode, pinfo); + ch = rlc_channel_create(ch_lookup->mode, pinfo, atm); frags = (struct rlc_frag **)wmem_alloc0(wmem_file_scope(), sizeof(struct rlc_frag *) * 4096); g_hash_table_insert(fragment_table, ch, frags); } else { @@ -898,7 +897,7 @@ get_frags(packet_info * pinfo, struct rlc_channel * ch_lookup) return frags; } static struct rlc_seqlist * -get_endlist(packet_info * pinfo, struct rlc_channel * ch_lookup) +get_endlist(packet_info * pinfo, struct rlc_channel * ch_lookup, struct atm_phdr *atm) { gpointer value = NULL; struct rlc_seqlist * endlist = NULL; @@ -909,7 +908,7 @@ get_endlist(packet_info * pinfo, struct rlc_channel * ch_lookup) struct rlc_channel * ch; endlist = wmem_new(wmem_file_scope(), struct rlc_seqlist); - ch = rlc_channel_create(ch_lookup->mode, pinfo); + ch = rlc_channel_create(ch_lookup->mode, pinfo, atm); endlist->fail_packet = 0; endlist->list = NULL; endlist->list = g_list_prepend(endlist->list, GINT_TO_POINTER(-1)); @@ -955,7 +954,8 @@ reassemble_sequence(struct rlc_frag ** frags, struct rlc_seqlist * endlist, /* Reset the specified channel's reassembly data, useful for when a sequence * resets on transport channel swap. */ void -rlc_reset_channel(enum rlc_mode mode, guint8 rbid, guint8 dir, guint32 urnti) +rlc_reset_channel(enum rlc_mode mode, guint8 rbid, guint8 dir, guint32 urnti, + struct atm_phdr *atm) { struct rlc_frag ** frags = NULL; struct rlc_seqlist * endlist = NULL; @@ -966,8 +966,8 @@ rlc_reset_channel(enum rlc_mode mode, guint8 rbid, guint8 dir, guint32 urnti) ch_lookup.rbid = rbid; ch_lookup.dir = dir; ch_lookup.urnti = urnti; - frags = get_frags(NULL, &ch_lookup); - endlist = get_endlist(NULL, &ch_lookup); + frags = get_frags(NULL, &ch_lookup, atm); + endlist = get_endlist(NULL, &ch_lookup, atm); DISSECTOR_ASSERT(frags && endlist); endlist->fail_packet = 0; @@ -985,7 +985,7 @@ rlc_reset_channel(enum rlc_mode mode, guint8 rbid, guint8 dir, guint32 urnti) static struct rlc_frag * add_fragment(enum rlc_mode mode, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint16 offset, guint16 seq, guint16 num_li, - guint16 len, gboolean final) + guint16 len, gboolean final, struct atm_phdr *atm) { struct rlc_channel ch_lookup; struct rlc_frag frag_lookup, *frag = NULL; @@ -996,10 +996,10 @@ add_fragment(enum rlc_mode mode, tvbuff_t *tvb, packet_info *pinfo, GList * element = NULL; int snmod; - if (rlc_channel_assign(&ch_lookup, mode, pinfo) == -1) { + if (rlc_channel_assign(&ch_lookup, mode, pinfo, atm) == -1) { return NULL; } - rlc_frag_assign(&frag_lookup, mode, pinfo, seq, num_li); + rlc_frag_assign(&frag_lookup, mode, pinfo, seq, num_li, atm); #if RLC_ADD_FRAGMENT_DEBUG_PRINT g_print("packet: %d, channel (%d %d %d) seq: %u, num_li: %u, offset: %u, \n", pinfo->fd->num, ch_lookup.dir, ch_lookup.rbid, ch_lookup.urnti, seq, num_li, offset); #endif @@ -1021,8 +1021,8 @@ add_fragment(enum rlc_mode mode, tvbuff_t *tvb, packet_info *pinfo, return frag; } - frags = get_frags(pinfo, &ch_lookup); - endlist = get_endlist(pinfo, &ch_lookup); + frags = get_frags(pinfo, &ch_lookup, atm); + endlist = get_endlist(pinfo, &ch_lookup, atm); /* If already done reassembly */ if (pinfo->fd->flags.visited) { @@ -1074,7 +1074,7 @@ add_fragment(enum rlc_mode mode, tvbuff_t *tvb, packet_info *pinfo, return NULL; } - frag = rlc_frag_create(tvb, mode, pinfo, offset, len, seq, num_li); + frag = rlc_frag_create(tvb, mode, pinfo, offset, len, seq, num_li, atm); /* If frags[seq] is not NULL then we must have data from several PDUs in the * same RLC packet (using Length Indicators) or something has gone terribly @@ -1190,13 +1190,14 @@ too far away from an unfinished sequence with start %u and without end.", pinfo- */ static tvbuff_t * get_reassembled_data(enum rlc_mode mode, tvbuff_t *tvb, packet_info *pinfo, - proto_tree *tree, guint16 seq, guint16 num_li) + proto_tree *tree, guint16 seq, guint16 num_li, + struct atm_phdr *atm) { gpointer orig_frag, orig_sdu; struct rlc_sdu *sdu; struct rlc_frag lookup, *frag; - rlc_frag_assign(&lookup, mode, pinfo, seq, num_li); + rlc_frag_assign(&lookup, mode, pinfo, seq, num_li, atm); if (!g_hash_table_lookup_extended(reassembled_table, &lookup, &orig_frag, &orig_sdu)) @@ -1234,19 +1235,19 @@ get_reassembled_data(enum rlc_mode mode, tvbuff_t *tvb, packet_info *pinfo, #define RLC_RETRANSMISSION_TIMEOUT 5 /* in seconds */ static gboolean rlc_is_duplicate(enum rlc_mode mode, packet_info *pinfo, guint16 seq, - guint32 *original) + guint32 *original, struct atm_phdr *atm) { GList *element; struct rlc_seqlist lookup, *list; struct rlc_seq seq_item, *seq_new; guint16 snmod; - rlc_channel_assign(&lookup.ch, mode, pinfo); + rlc_channel_assign(&lookup.ch, mode, pinfo, atm); list = (struct rlc_seqlist *)g_hash_table_lookup(sequence_table, &lookup.ch); if (!list) { /* we see this channel for the first time */ list = (struct rlc_seqlist *)wmem_alloc0(wmem_file_scope(), sizeof(*list)); - rlc_channel_assign(&list->ch, mode, pinfo); + rlc_channel_assign(&list->ch, mode, pinfo, atm); g_hash_table_insert(sequence_table, &list->ch, list); } seq_item.seq = seq; @@ -1609,7 +1610,8 @@ dissect_rlc_tm(enum rlc_channel_type channel, tvbuff_t *tvb, packet_info *pinfo, static void rlc_um_reassemble(tvbuff_t *tvb, guint8 offs, packet_info *pinfo, proto_tree *tree, proto_tree *top_level, enum rlc_channel_type channel, guint16 seq, - struct rlc_li *li, guint16 num_li, gboolean li_is_on_2_bytes) + struct rlc_li *li, guint16 num_li, gboolean li_is_on_2_bytes, + struct atm_phdr *atm) { guint8 i; gboolean dissected = FALSE; @@ -1628,8 +1630,8 @@ rlc_um_reassemble(tvbuff_t *tvb, guint8 offs, packet_info *pinfo, proto_tree *tr /* a new SDU starts here, mark this seq as the first PDU. */ struct rlc_channel ch_lookup; struct rlc_seqlist * endlist = NULL; - if( -1 != rlc_channel_assign(&ch_lookup, RLC_UM, pinfo ) ){ - endlist = get_endlist(pinfo, &ch_lookup); + if( -1 != rlc_channel_assign(&ch_lookup, RLC_UM, pinfo, atm ) ){ + endlist = get_endlist(pinfo, &ch_lookup, atm); endlist->list->data = GINT_TO_POINTER((gint)seq); endlist->fail_packet=0; } @@ -1644,8 +1646,8 @@ rlc_um_reassemble(tvbuff_t *tvb, guint8 offs, packet_info *pinfo, proto_tree *tr proto_tree_add_item(tree, hf_rlc_data, tvb, offs, length, ENC_NA); } if (global_rlc_perform_reassemby) { - add_fragment(RLC_UM, tvb, pinfo, li[i].tree, offs, seq, i, length, TRUE); - next_tvb = get_reassembled_data(RLC_UM, tvb, pinfo, tree, seq, i); + add_fragment(RLC_UM, tvb, pinfo, li[i].tree, offs, seq, i, length, TRUE, atm); + next_tvb = get_reassembled_data(RLC_UM, tvb, pinfo, tree, seq, i, atm); } offs += length; } @@ -1658,8 +1660,8 @@ rlc_um_reassemble(tvbuff_t *tvb, guint8 offs, packet_info *pinfo, proto_tree *tr proto_tree_add_item(tree, hf_rlc_data, tvb, offs, li[i].len, ENC_NA); } if (global_rlc_perform_reassemby) { - add_fragment(RLC_UM, tvb, pinfo, li[i].tree, offs, seq, i, li[i].len, TRUE); - next_tvb = get_reassembled_data(RLC_UM, tvb, pinfo, tree, seq, i); + add_fragment(RLC_UM, tvb, pinfo, li[i].tree, offs, seq, i, li[i].len, TRUE, atm); + next_tvb = get_reassembled_data(RLC_UM, tvb, pinfo, tree, seq, i, atm); } } if (next_tvb) { @@ -1677,7 +1679,7 @@ rlc_um_reassemble(tvbuff_t *tvb, guint8 offs, packet_info *pinfo, proto_tree *tr } if (global_rlc_perform_reassemby) { /* add remaining data as fragment */ - add_fragment(RLC_UM, tvb, pinfo, tree, offs, seq, i, tvb_captured_length_remaining(tvb, offs), FALSE); + add_fragment(RLC_UM, tvb, pinfo, tree, offs, seq, i, tvb_captured_length_remaining(tvb, offs), FALSE, atm); if (dissected == FALSE) col_set_str(pinfo->cinfo, COL_INFO, "[RLC UM Fragment]"); } @@ -1821,7 +1823,7 @@ rlc_decode_li(enum rlc_mode mode, tvbuff_t *tvb, packet_info *pinfo, proto_tree static void dissect_rlc_um(enum rlc_channel_type channel, tvbuff_t *tvb, packet_info *pinfo, - proto_tree *top_level, proto_tree *tree) + proto_tree *top_level, proto_tree *tree, struct atm_phdr *atm) { #define MAX_LI 16 struct rlc_li li[MAX_LI]; @@ -1900,12 +1902,12 @@ dissect_rlc_um(enum rlc_channel_type channel, tvbuff_t *tvb, packet_info *pinfo, /* do not detect duplicates or reassemble, if prefiltering is done */ if (pinfo->fd->num == 0) return; /* check for duplicates */ - if (rlc_is_duplicate(RLC_UM, pinfo, seq, &orig_num) == TRUE) { + if (rlc_is_duplicate(RLC_UM, pinfo, seq, &orig_num, atm) == TRUE) { col_add_fstr(pinfo->cinfo, COL_INFO, "[RLC UM Fragment] [Duplicate] SN=%u", seq); proto_tree_add_uint(tree, hf_rlc_duplicate_of, tvb, 0, 0, orig_num); return; } - rlc_um_reassemble(tvb, offs, pinfo, tree, top_level, channel, seq, li, num_li, li_is_on_2_bytes); + rlc_um_reassemble(tvb, offs, pinfo, tree, top_level, channel, seq, li, num_li, li_is_on_2_bytes, atm); } static void @@ -2138,7 +2140,8 @@ static void rlc_am_reassemble(tvbuff_t *tvb, guint8 offs, packet_info *pinfo, proto_tree *tree, proto_tree *top_level, enum rlc_channel_type channel, guint16 seq, gboolean poll_set, struct rlc_li *li, - guint16 num_li, gboolean final, gboolean li_is_on_2_bytes) + guint16 num_li, gboolean final, gboolean li_is_on_2_bytes, + struct atm_phdr *atm) { guint8 i; gboolean piggyback = FALSE, dissected = FALSE; @@ -2147,8 +2150,8 @@ rlc_am_reassemble(tvbuff_t *tvb, guint8 offs, packet_info *pinfo, struct rlc_channel ch_lookup; struct rlc_seqlist * endlist = NULL; if( 0 == seq ){ /* assuming that a new RRC Connection is established when 0==seq. */ - if( -1 != rlc_channel_assign(&ch_lookup, RLC_AM, pinfo ) ){ - endlist = get_endlist(pinfo, &ch_lookup); + if( -1 != rlc_channel_assign(&ch_lookup, RLC_AM, pinfo, atm ) ){ + endlist = get_endlist(pinfo, &ch_lookup, atm); endlist->list->data = GINT_TO_POINTER( -1); } } @@ -2166,7 +2169,7 @@ rlc_am_reassemble(tvbuff_t *tvb, guint8 offs, packet_info *pinfo, } if (i == 0) { /* Insert empty RLC frag so RLC doesn't miss this seq number. */ - add_fragment(RLC_AM, tvb, pinfo, li[i].tree, offs, seq, i, 0, TRUE); + add_fragment(RLC_AM, tvb, pinfo, li[i].tree, offs, seq, i, 0, TRUE, atm); } } offs += tvb_captured_length_remaining(tvb, offs); @@ -2175,8 +2178,8 @@ rlc_am_reassemble(tvbuff_t *tvb, guint8 offs, packet_info *pinfo, proto_tree_add_item(tree, hf_rlc_data, tvb, offs, li[i].len, ENC_NA); } if (global_rlc_perform_reassemby) { - add_fragment(RLC_AM, tvb, pinfo, li[i].tree, offs, seq, i, li[i].len, TRUE); - next_tvb = get_reassembled_data(RLC_AM, tvb, pinfo, tree, seq, i); + add_fragment(RLC_AM, tvb, pinfo, li[i].tree, offs, seq, i, li[i].len, TRUE, atm); + next_tvb = get_reassembled_data(RLC_AM, tvb, pinfo, tree, seq, i, atm); } } if (next_tvb) { @@ -2197,9 +2200,9 @@ rlc_am_reassemble(tvbuff_t *tvb, guint8 offs, packet_info *pinfo, } if (global_rlc_perform_reassemby) { add_fragment(RLC_AM, tvb, pinfo, tree, offs, seq, i, - tvb_captured_length_remaining(tvb,offs), final); + tvb_captured_length_remaining(tvb,offs), final, atm); if (final) { - next_tvb = get_reassembled_data(RLC_AM, tvb, pinfo, tree, seq, i); + next_tvb = get_reassembled_data(RLC_AM, tvb, pinfo, tree, seq, i, atm); } } } @@ -2220,7 +2223,7 @@ rlc_am_reassemble(tvbuff_t *tvb, guint8 offs, packet_info *pinfo, static void dissect_rlc_am(enum rlc_channel_type channel, tvbuff_t *tvb, packet_info *pinfo, - proto_tree *top_level, proto_tree *tree) + proto_tree *top_level, proto_tree *tree, struct atm_phdr *atm) { #define MAX_LI 16 struct rlc_li li[MAX_LI]; @@ -2320,7 +2323,7 @@ dissect_rlc_am(enum rlc_channel_type channel, tvbuff_t *tvb, packet_info *pinfo, /* do not detect duplicates or reassemble, if prefiltering is done */ if (pinfo->fd->num == 0) return; /* check for duplicates, but not if already visited */ - if (pinfo->fd->flags.visited == FALSE && rlc_is_duplicate(RLC_AM, pinfo, seq, &orig_num) == TRUE) { + if (pinfo->fd->flags.visited == FALSE && rlc_is_duplicate(RLC_AM, pinfo, seq, &orig_num, atm) == TRUE) { g_hash_table_insert(duplicate_table, GUINT_TO_POINTER(pinfo->fd->num), GUINT_TO_POINTER(orig_num)); return; } else if (pinfo->fd->flags.visited == TRUE && tree) { @@ -2333,7 +2336,7 @@ dissect_rlc_am(enum rlc_channel_type channel, tvbuff_t *tvb, packet_info *pinfo, } rlc_am_reassemble(tvb, offs, pinfo, tree, top_level, channel, seq, polling != 0, - li, num_li, ext == 2, li_is_on_2_bytes); + li, num_li, ext == 2, li_is_on_2_bytes, atm); } /* dissect entry functions */ @@ -2379,11 +2382,12 @@ dissect_rlc_bcch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data } static int -dissect_rlc_ccch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +dissect_rlc_ccch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { fp_info *fpi; proto_item *ti = NULL; proto_tree *subtree = NULL; + struct atm_phdr *atm = (struct atm_phdr *)data; col_set_str(pinfo->cinfo, COL_PROTOCOL, "RLC"); col_clear(pinfo->cinfo, COL_INFO); @@ -2403,18 +2407,18 @@ dissect_rlc_ccch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data } else { /* DL CCCH is always UM */ proto_item_append_text(ti, " UM (CCCH)"); - dissect_rlc_um(RLC_DL_CCCH, tvb, pinfo, tree, subtree); + dissect_rlc_um(RLC_DL_CCCH, tvb, pinfo, tree, subtree, atm); } return tvb_captured_length(tvb); } static int -dissect_rlc_ctch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void * data _U_) +dissect_rlc_ctch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { fp_info *fpi; proto_item *ti = NULL; proto_tree *subtree = NULL; - + struct atm_phdr *atm = (struct atm_phdr *)data; col_set_str(pinfo->cinfo, COL_PROTOCOL, "RLC"); col_clear(pinfo->cinfo, COL_INFO); @@ -2429,18 +2433,19 @@ dissect_rlc_ctch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void * dat /* CTCH is always UM */ proto_item_append_text(ti, " UM (CTCH)"); - dissect_rlc_um(RLC_DL_CTCH, tvb, pinfo, tree, subtree); + dissect_rlc_um(RLC_DL_CTCH, tvb, pinfo, tree, subtree, atm); return tvb_captured_length(tvb); } static int -dissect_rlc_dcch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +dissect_rlc_dcch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { proto_item *ti = NULL; proto_tree *subtree = NULL; fp_info *fpi; rlc_info *rlci; enum rlc_channel_type channel; + struct atm_phdr *atm = (struct atm_phdr *)data; col_set_str(pinfo->cinfo, COL_PROTOCOL, "RLC"); col_clear(pinfo->cinfo, COL_INFO); @@ -2463,23 +2468,24 @@ dissect_rlc_dcch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data switch (rlci->mode[fpi->cur_tb]) { case RLC_UM: proto_item_append_text(ti, " UM (DCCH)"); - dissect_rlc_um(channel, tvb, pinfo, tree, subtree); + dissect_rlc_um(channel, tvb, pinfo, tree, subtree, atm); break; case RLC_AM: proto_item_append_text(ti, " AM (DCCH)"); - dissect_rlc_am(channel, tvb, pinfo, tree, subtree); + dissect_rlc_am(channel, tvb, pinfo, tree, subtree, atm); break; } return tvb_captured_length(tvb); } static int -dissect_rlc_ps_dtch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +dissect_rlc_ps_dtch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { proto_item *ti = NULL; proto_tree *subtree = NULL; fp_info *fpi; rlc_info *rlci; + struct atm_phdr *atm = (struct atm_phdr *)data; col_set_str(pinfo->cinfo, COL_PROTOCOL, "RLC"); col_clear(pinfo->cinfo, COL_INFO); @@ -2500,11 +2506,11 @@ dissect_rlc_ps_dtch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* d switch (rlci->mode[fpi->cur_tb]) { case RLC_UM: proto_item_append_text(ti, " UM (PS DTCH)"); - dissect_rlc_um(RLC_PS_DTCH, tvb, pinfo, tree, subtree); + dissect_rlc_um(RLC_PS_DTCH, tvb, pinfo, tree, subtree, atm); break; case RLC_AM: proto_item_append_text(ti, " AM (PS DTCH)"); - dissect_rlc_am(RLC_PS_DTCH, tvb, pinfo, tree, subtree); + dissect_rlc_am(RLC_PS_DTCH, tvb, pinfo, tree, subtree, atm); break; case RLC_TM: proto_item_append_text(ti, " TM (PS DTCH)"); @@ -2515,12 +2521,13 @@ dissect_rlc_ps_dtch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* d } static int -dissect_rlc_dch_unknown(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +dissect_rlc_dch_unknown(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { proto_item *ti = NULL; proto_tree *subtree = NULL; fp_info *fpi; rlc_info *rlci; + struct atm_phdr *atm = (struct atm_phdr *)data; col_set_str(pinfo->cinfo, COL_PROTOCOL, "RLC"); col_clear(pinfo->cinfo, COL_INFO); @@ -2538,11 +2545,11 @@ dissect_rlc_dch_unknown(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi switch (rlci->mode[fpi->cur_tb]) { case RLC_UM: proto_item_append_text(ti, " UM (Unknown)"); - dissect_rlc_um(RLC_UNKNOWN_CH, tvb, pinfo, tree, subtree); + dissect_rlc_um(RLC_UNKNOWN_CH, tvb, pinfo, tree, subtree, atm); break; case RLC_AM: proto_item_append_text(ti, " AM (Unknown)"); - dissect_rlc_am(RLC_UNKNOWN_CH, tvb, pinfo, tree, subtree); + dissect_rlc_am(RLC_UNKNOWN_CH, tvb, pinfo, tree, subtree, atm); break; case RLC_TM: proto_item_append_text(ti, " TM (Unknown)"); @@ -2555,7 +2562,7 @@ dissect_rlc_dch_unknown(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi /* Heuristic dissector looks for supported framing protocol (see wiki page) */ static gboolean -dissect_rlc_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +dissect_rlc_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { gint offset = 0; fp_info *fpi; @@ -2569,6 +2576,7 @@ dissect_rlc_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data gboolean rlcModePresent = FALSE; proto_item *ti = NULL; proto_tree *subtree = NULL; + struct atm_phdr *atm = (struct atm_phdr *)data; /* Do this again on re-dissection to re-discover offset of actual PDU */ @@ -2680,10 +2688,10 @@ dissect_rlc_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data if (rlci->mode[fpi->cur_tb] == RLC_AM) { proto_item_append_text(ti, " AM"); - dissect_rlc_am(RLC_UNKNOWN_CH, rlc_tvb, pinfo, tree, subtree); + dissect_rlc_am(RLC_UNKNOWN_CH, rlc_tvb, pinfo, tree, subtree, atm); } else if (rlci->mode[fpi->cur_tb] == RLC_UM) { proto_item_append_text(ti, " UM"); - dissect_rlc_um(RLC_UNKNOWN_CH, rlc_tvb, pinfo, tree, subtree); + dissect_rlc_um(RLC_UNKNOWN_CH, rlc_tvb, pinfo, tree, subtree, atm); } else { proto_item_append_text(ti, " TM"); dissect_rlc_tm(RLC_UNKNOWN_CH, rlc_tvb, pinfo, tree, subtree); diff --git a/epan/dissectors/packet-rlc.h b/epan/dissectors/packet-rlc.h index f58c1ae52a..31820495a0 100644 --- a/epan/dissectors/packet-rlc.h +++ b/epan/dissectors/packet-rlc.h @@ -22,6 +22,8 @@ #ifndef PACKET_RLC_H #define PACKET_RLC_H +#include <wiretap/wtap.h> + /* Do not change enum order and append only to keep backward compatibility with UDP framing format */ enum rlc_mode { @@ -52,7 +54,7 @@ typedef struct rlc_info /* Reset the specified channel's reassembly data, useful for when a sequence * resets on transport channel swap. */ -void rlc_reset_channel(enum rlc_mode mode, guint8 rbid, guint8 dir, guint32 urnti); +void rlc_reset_channel(enum rlc_mode mode, guint8 rbid, guint8 dir, guint32 urnti, struct atm_phdr *atm); /* Tells other functions if this packet is ciphered or not */ gboolean rlc_is_ciphered(packet_info * pinfo); diff --git a/epan/dissectors/packet-umts_fp.c b/epan/dissectors/packet-umts_fp.c index f83a981806..ae3ff612fb 100644 --- a/epan/dissectors/packet-umts_fp.c +++ b/epan/dissectors/packet-umts_fp.c @@ -479,12 +479,15 @@ static const value_string common_control_frame_type_vals[] = { /* Dissect message parts */ static int dissect_tb_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, struct fp_info *p_fp_info, - dissector_handle_t *data_handle); + dissector_handle_t *data_handle, + void *data); static int dissect_macd_pdu_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, guint16 length, guint16 number_of_pdus, struct fp_info *p_fp_info); + int offset, guint16 length, guint16 number_of_pdus, struct fp_info *p_fp_info, + void *data); static int dissect_macd_pdu_data_type_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, guint16 length, guint16 number_of_pdus, struct fp_info * fpi); + int offset, guint16 length, guint16 number_of_pdus, struct fp_info * fpi, + void *data); static int dissect_crci_bits(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, fp_info *p_fp_info, int offset); @@ -522,15 +525,18 @@ static int dissect_common_dynamic_pusch_assignment(packet_info *pinfo, proto_tre /* Dissect common channel types */ static void dissect_rach_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info, + void *data); static void dissect_fach_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info, + void *data); static void dissect_dsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, struct fp_info *p_fp_info); static void dissect_usch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, struct fp_info *p_fp_info); static void dissect_pch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info, + void *data); static void dissect_cpch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, struct fp_info *p_fp_info); static void dissect_bch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, @@ -538,11 +544,15 @@ static void dissect_bch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tr static void dissect_iur_dsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, struct fp_info *p_fp_info); static void dissect_hsdsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info, + void *data); static void dissect_hsdsch_type_2_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info, + void *data); static void dissect_hsdsch_common_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info); + int offset, + struct fp_info *p_fp_info, + void *data); /* Dissect DCH control messages */ static int dissect_dch_timing_adjustment(proto_tree *tree, packet_info *pinfo, @@ -573,17 +583,22 @@ static void dissect_dch_control_frame(proto_tree *tree, packet_info *pinfo, tvbu /* Dissect a DCH channel */ static void dissect_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info, + void *data); /* Dissect dedicated channels */ static void dissect_e_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, struct fp_info *p_fp_info, - gboolean is_common, rlc_info *rlcinf); + gboolean is_common, rlc_info *rlcinf, + void *data); static void dissect_e_dch_t2_or_common_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, struct fp_info *p_fp_info, int number_of_subframes, - gboolean is_common, guint16 header_crc, proto_item * header_crc_pi); + gboolean is_common, + guint16 header_crc, + proto_item * header_crc_pi, + void *data); /* Main dissection function */ static int dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data); @@ -676,7 +691,7 @@ static gboolean verify_header_crc_edch(tvbuff_t * tvb, packet_info * pinfo, prot static int dissect_tb_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, struct fp_info *p_fp_info, - dissector_handle_t *data_handle) + dissector_handle_t *data_handle, void *data) { int chan, num_tbs = 0; int bit_offset = 0; @@ -764,7 +779,7 @@ dissect_tb_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /****************/ /* TODO: maybe this decision can be based only on info available in fp_info */ - call_dissector(*data_handle, next_tvb, pinfo, top_level_tree); + call_dissector_with_data(*data_handle, next_tvb, pinfo, top_level_tree, data); dissected = TRUE; } else { proto_tree_add_expert(tree, pinfo, &ei_fp_crci_no_subdissector, tvb, offset + bit_offset/8, @@ -807,7 +822,8 @@ dissect_tb_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, Length is in bits, and payload is offset by 4 bits of padding */ static int dissect_macd_pdu_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, guint16 length, guint16 number_of_pdus, struct fp_info *p_fp_info) + int offset, guint16 length, guint16 number_of_pdus, + struct fp_info *p_fp_info, void *data) { int pdu; int bit_offset = 0; @@ -847,7 +863,7 @@ dissect_macd_pdu_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, tvbuff_t *next_tvb; next_tvb = tvb_new_subset(tvb, offset + bit_offset/8, ((bit_offset % 8) + length + 7)/8, -1); - call_dissector(mac_fdd_hsdsch_handle, next_tvb, pinfo, top_level_tree); + call_dissector_with_data(mac_fdd_hsdsch_handle, next_tvb, pinfo, top_level_tree, data); dissected = TRUE; } @@ -880,7 +896,8 @@ dissect_macd_pdu_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, Length is in bytes, and payload is byte-aligned (no padding) */ static int dissect_macd_pdu_data_type_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, guint16 length, guint16 number_of_pdus, struct fp_info *fpi) + int offset, guint16 length, guint16 number_of_pdus, + struct fp_info *fpi, void *data) { int pdu; proto_item *pdus_ti = NULL; @@ -913,7 +930,7 @@ dissect_macd_pdu_data_type_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree fpi->cur_tb = pdu; /*Set proper pdu index for MAC and higher layers*/ - call_dissector(mac_fdd_hsdsch_handle, next_tvb, pinfo, top_level_tree); + call_dissector_with_data(mac_fdd_hsdsch_handle, next_tvb, pinfo, top_level_tree, data); dissected = TRUE; } @@ -1445,7 +1462,7 @@ dissect_common_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* Dissect a RACH channel */ static void dissect_rach_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info, void *data) { gboolean is_control_frame; guint16 header_crc = 0; @@ -1520,7 +1537,7 @@ dissect_rach_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, header_length = offset; /* TB data */ - offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, &mac_fdd_rach_handle); + offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, &mac_fdd_rach_handle, data); /* CRCIs */ offset = dissect_crci_bits(tvb, pinfo, tree, p_fp_info, offset); @@ -1700,7 +1717,7 @@ dissect_rach_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* Dissect a FACH channel */ static void dissect_fach_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info, void *data) { gboolean is_control_frame; guint16 header_crc = 0; @@ -1748,7 +1765,7 @@ dissect_fach_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, header_length = offset; /* TB data */ - offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, &mac_fdd_fach_handle); + offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, &mac_fdd_fach_handle, data); /* New IE flags (if it looks as though they are present) */ if ((p_fp_info->release == 7) && @@ -1848,7 +1865,7 @@ dissect_dsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } header_length = offset; /* TB data */ - offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, NULL); + offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, NULL, NULL); /* Spare Extension and Payload CRC */ dissect_spare_extension_and_crc(tvb, pinfo, tree, 1, offset, header_length); @@ -1903,7 +1920,7 @@ dissect_usch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, offset++; header_length = offset; /* TB data */ - offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, NULL); + offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, NULL, NULL); /* QE */ proto_tree_add_item(tree, hf_fp_quality_estimate, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -1940,7 +1957,7 @@ dissect_usch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* Dissect a PCH channel */ static void dissect_pch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info, void *data) { gboolean is_control_frame; guint16 pch_cfn; @@ -1999,7 +2016,7 @@ dissect_pch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } /* TB data */ - offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, &mac_fdd_pch_handle); + offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, &mac_fdd_pch_handle, data); if (preferences_header_checksum) { verify_header_crc(tvb, pinfo, header_crc_pi, header_crc, header_length); @@ -2053,7 +2070,7 @@ dissect_cpch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, offset++; header_length = offset; /* XXX this might be wrong */ /* TB data */ - offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, NULL); + offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, NULL, NULL); /* CRCIs */ offset = dissect_crci_bits(tvb, pinfo, tree, p_fp_info, offset); @@ -2456,7 +2473,7 @@ dissect_dch_control_frame(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, /* Dissect a DCH channel */ static void dissect_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info, void *data) { gboolean is_control_frame; guint8 cfn; @@ -2504,7 +2521,7 @@ dissect_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } header_length = offset; /* Dissect TB data */ - offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, &mac_fdd_dch_handle); + offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, &mac_fdd_dch_handle, data); /* QE (uplink only) */ if (p_fp_info->is_uplink) { @@ -2530,7 +2547,8 @@ dissect_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, static void dissect_e_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, struct fp_info *p_fp_info, - gboolean is_common, rlc_info *rlcinf) + gboolean is_common, rlc_info *rlcinf, + void *data) { gboolean is_control_frame; guint8 number_of_subframes; @@ -2622,7 +2640,9 @@ dissect_e_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* Remainder of T2 or common data frames differ here... */ if (p_fp_info->edch_type == 1) { dissect_e_dch_t2_or_common_channel_info(tvb, pinfo, tree, offset, p_fp_info, - number_of_subframes, is_common, header_crc, header_crc_pi); + number_of_subframes, + is_common, header_crc, + header_crc_pi, data); return; } @@ -2821,7 +2841,7 @@ dissect_e_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p_fp_info->cur_tb = macd_idx; /*Set the transport block index (NOTE: This and not subnum is used in MAC dissector!)*/ /* TODO: use maces_tree? */ - call_dissector(mac_fdd_edch_handle, next_tvb, pinfo, top_level_tree); + call_dissector_with_data(mac_fdd_edch_handle, next_tvb, pinfo, top_level_tree, data); dissected = TRUE; } else { @@ -2879,7 +2899,11 @@ dissect_e_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, static void dissect_e_dch_t2_or_common_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, struct fp_info *p_fp_info, - int number_of_subframes, gboolean is_common, guint16 header_crc, proto_item * header_crc_pi) + int number_of_subframes, + gboolean is_common, + guint16 header_crc, + proto_item * header_crc_pi, + void *data) { int n; int pdu_no; @@ -3047,7 +3071,7 @@ dissect_e_dch_t2_or_common_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto /* Call MAC for this PDU if configured to */ if (preferences_call_mac_dissectors) { p_add_proto_data(wmem_file_scope(), pinfo, proto_umts_mac, 0, mac_is_info); - call_dissector(mac_fdd_edch_type2_handle, tvb_new_subset_remaining(tvb, offset), pinfo, top_level_tree); + call_dissector_with_data(mac_fdd_edch_type2_handle, tvb_new_subset_remaining(tvb, offset), pinfo, top_level_tree, data); } else { /* Still show data if not decoding as MAC PDU */ @@ -3078,7 +3102,7 @@ dissect_e_dch_t2_or_common_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto /* described in R5 and R6, and frame type 1 in Release 7. */ static void dissect_hsdsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info, void *data) { gboolean is_control_frame; guint header_length = 0; @@ -3204,7 +3228,7 @@ dissect_hsdsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* MAC-d PDUs */ offset = dissect_macd_pdu_data(tvb, pinfo, tree, offset, pdu_length, - number_of_pdus, p_fp_info); + number_of_pdus, p_fp_info, data); col_append_fstr(pinfo->cinfo, COL_INFO, " %ux%u-bit PDUs User-Buffer-Size=%u", number_of_pdus, pdu_length, user_buffer_size); @@ -3272,7 +3296,8 @@ dissect_hsdsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* frame type 3 (IuR only?) */ static void dissect_hsdsch_type_2_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info, + void *data) { gboolean is_control_frame; guint16 header_crc = 0; @@ -3488,7 +3513,8 @@ dissect_hsdsch_type_2_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree /* Add PDU block header subtree */ offset = dissect_macd_pdu_data_type_2(tvb, pinfo, tree, offset, (guint16)pdu_length[n], - (guint16)no_of_pdus[n], p_fp_info); + (guint16)no_of_pdus[n], + p_fp_info, data); } if (preferences_header_checksum) { verify_header_crc(tvb, pinfo, header_crc_pi, header_crc, header_length); @@ -3512,7 +3538,9 @@ dissect_hsdsch_type_2_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree */ static void dissect_hsdsch_common_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct fp_info *p_fp_info) { + int offset, struct fp_info *p_fp_info, + void *data) +{ gboolean is_control_frame; guint16 header_crc = 0; proto_item * header_crc_pi = NULL; @@ -3702,7 +3730,7 @@ void dissect_hsdsch_common_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto * BCCH with transparent MAC layer. Therefore skip right to * rlc_bcch and hope for the best. */ next_tvb = tvb_new_subset_length(tvb, offset, (gint)pdu_length[n]); - call_dissector(rlc_bcch_handle, next_tvb, pinfo, top_level_tree); + call_dissector_with_data(rlc_bcch_handle, next_tvb, pinfo, top_level_tree, data); offset += (gint)pdu_length[n]; } else { /* Else go for CCCH UM, this seems to work. */ p_fp_info->hsdsch_entity = ehs; /* HSDSCH type 2 */ @@ -3714,10 +3742,6 @@ void dissect_hsdsch_common_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto macinf->macdflow_id[j] = p_fp_info->hsdsch_macflowd_id; macinf->ctmux[j] = FALSE; - - - - rlcinf->li_size[j] = RLC_LI_7BITS; rlcinf->ciphered[j] = FALSE; rlcinf->deciphered[j] = FALSE; @@ -3725,10 +3749,7 @@ void dissect_hsdsch_common_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto rlcinf->urnti[j] = p_fp_info->channel; /*We need to fake urnti*/ next_tvb = tvb_new_subset_length(tvb, offset, (gint)pdu_length[n]); - call_dissector(mac_fdd_hsdsch_handle, next_tvb, pinfo, top_level_tree); - - - + call_dissector_with_data(mac_fdd_hsdsch_handle, next_tvb, pinfo, top_level_tree, data); offset += (gint)pdu_length[n]; } @@ -4182,7 +4203,7 @@ fp_set_per_packet_inf_from_conv(umts_fp_conversation_info_t *p_conv_data, /*****************************/ /* Main dissection function. */ static int -dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +dissect_fp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { proto_tree *fp_tree; proto_item *ti; @@ -4358,14 +4379,17 @@ dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) case CHANNEL_RACH_TDD: case CHANNEL_RACH_TDD_128: case CHANNEL_RACH_FDD: - dissect_rach_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info); + dissect_rach_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info, + data); break; case CHANNEL_DCH: - dissect_dch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info); + dissect_dch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info, + data); break; case CHANNEL_FACH_FDD: case CHANNEL_FACH_TDD: - dissect_fach_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info); + dissect_fach_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info, + data); break; case CHANNEL_DSCH_FDD: case CHANNEL_DSCH_TDD: @@ -4376,7 +4400,8 @@ dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) dissect_usch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info); break; case CHANNEL_PCH: - dissect_pch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info); + dissect_pch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info, + data); break; case CHANNEL_CPCH: dissect_cpch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info); @@ -4398,21 +4423,21 @@ dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) case entity_not_specified: case hs: /* This is the pre-R7 default */ - dissect_hsdsch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info); + dissect_hsdsch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info, data); break; case ehs: - dissect_hsdsch_type_2_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info); + dissect_hsdsch_type_2_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info, data); break; default: /* Report Error */ - expert_add_info(pinfo, NULL, &ei_fp_hsdsch_entity_not_specified); + expert_add_info(pinfo, NULL, &ei_fp_hsdsch_entity_not_specified); break; } break; case CHANNEL_HSDSCH_COMMON: expert_add_info(pinfo, NULL, &ei_fp_hsdsch_common_experimental_support); /*if (FALSE)*/ - dissect_hsdsch_common_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info); + dissect_hsdsch_common_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info, data); break; case CHANNEL_HSDSCH_COMMON_T3: @@ -4432,7 +4457,8 @@ dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) case CHANNEL_EDCH: case CHANNEL_EDCH_COMMON: dissect_e_dch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info, - p_fp_info->channel == CHANNEL_EDCH_COMMON, rlcinf); + p_fp_info->channel == CHANNEL_EDCH_COMMON, + rlcinf, data); break; default: @@ -4442,6 +4468,18 @@ dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) return tvb_captured_length(tvb); } +static int +dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +{ + return dissect_fp_common(tvb, pinfo, tree, NULL); +} + +static int +dissect_fp_aal2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) +{ + return dissect_fp_common(tvb, pinfo, tree, data); +} + #ifdef UMTS_FP_USE_UAT UAT_VS_DEF(uat_umts_fp_ep_and_ch_records, protocol, uat_umts_fp_ep_and_ch_record_t, guint8, UMTS_FP_IPV4, "IPv4") UAT_CSTRING_CB_DEF(uat_umts_fp_ep_and_ch_records, srcIP, uat_umts_fp_ep_and_ch_record_t) @@ -5636,6 +5674,8 @@ void proto_register_fp(void) void proto_reg_handoff_fp(void) { + dissector_handle_t fp_aal2_handle; + rlc_bcch_handle = find_dissector("rlc.bcch"); mac_fdd_rach_handle = find_dissector("mac.fdd.rach"); mac_fdd_fach_handle = find_dissector("mac.fdd.fach"); @@ -5646,7 +5686,9 @@ void proto_reg_handoff_fp(void) mac_fdd_hsdsch_handle = find_dissector("mac.fdd.hsdsch"); heur_dissector_add("udp", heur_dissect_fp, "FP over UDP", "fp_udp", proto_fp, HEURISTIC_DISABLE); - dissector_add_uint("atm.aal2.type", TRAF_UMTS_FP, fp_handle); + + fp_aal2_handle = create_dissector_handle(dissect_fp_aal2, proto_fp); + dissector_add_uint("atm.aal2.type", TRAF_UMTS_FP, fp_aal2_handle); } /* diff --git a/epan/dissectors/packet-umts_mac.c b/epan/dissectors/packet-umts_mac.c index 51e4067f9b..8f21d3070b 100644 --- a/epan/dissectors/packet-umts_mac.c +++ b/epan/dissectors/packet-umts_mac.c @@ -259,7 +259,7 @@ static guint16 tree_add_common_dcch_dtch_fields(tvbuff_t *tvb, packet_info *pinf return bitoffs; } -static int dissect_mac_fdd_pch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +static int dissect_mac_fdd_pch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { proto_tree *pch_tree = NULL; proto_item *channel_type; @@ -275,11 +275,11 @@ static int dissect_mac_fdd_pch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr channel_type = proto_tree_add_uint(pch_tree, hf_mac_channel, tvb, 0, 0, MAC_PCCH); PROTO_ITEM_SET_GENERATED(channel_type); } - call_dissector(rlc_pcch_handle, tvb, pinfo, tree); + call_dissector_with_data(rlc_pcch_handle, tvb, pinfo, tree, data); return tvb_captured_length(tvb); } -static int dissect_mac_fdd_rach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +static int dissect_mac_fdd_rach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { guint8 tctf; guint8 chan; @@ -327,7 +327,7 @@ static int dissect_mac_fdd_rach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t PROTO_ITEM_SET_GENERATED(channel_type); next_tvb = tvb_new_octet_aligned(tvb, bitoffs, fpinf->chan_tf_size[chan] - bitoffs); add_new_data_source(pinfo, next_tvb, "Octet-Aligned CCCH Data"); - call_dissector(rlc_ccch_handle, next_tvb, pinfo, tree); + call_dissector_with_data(rlc_ccch_handle, next_tvb, pinfo, tree, data); break; case TCTF_DCCH_DTCH_RACH_FDD: /*Set RLC Mode/MAC content based on the L-CHID derived from the C/T flag*/ @@ -342,7 +342,7 @@ static int dissect_mac_fdd_rach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t PROTO_ITEM_SET_GENERATED(channel_type); next_tvb = tvb_new_octet_aligned(tvb, bitoffs, fpinf->chan_tf_size[chan] - bitoffs); add_new_data_source(pinfo, next_tvb, "Octet-Aligned DCCH Data"); - call_dissector(rlc_dcch_handle, next_tvb, pinfo, tree); + call_dissector_with_data(rlc_dcch_handle, next_tvb, pinfo, tree, data); break; case MAC_CONTENT_PS_DTCH: proto_item_append_text(ti, " (PS DTCH)"); @@ -350,7 +350,7 @@ static int dissect_mac_fdd_rach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t PROTO_ITEM_SET_GENERATED(channel_type); next_tvb = tvb_new_octet_aligned(tvb, bitoffs, fpinf->chan_tf_size[chan] - bitoffs); add_new_data_source(pinfo, next_tvb, "Octet-Aligned DTCH Data"); - call_dissector(rlc_ps_dtch_handle, next_tvb, pinfo, tree); + call_dissector_with_data(rlc_ps_dtch_handle, next_tvb, pinfo, tree, data); break; case MAC_CONTENT_CS_DTCH: proto_item_append_text(ti, " (CS DTCH)"); @@ -368,7 +368,7 @@ static int dissect_mac_fdd_rach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t return tvb_captured_length(tvb); } -static int dissect_mac_fdd_fach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +static int dissect_mac_fdd_fach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { guint8 hdr, tctf; guint16 bitoffs = 0; @@ -419,7 +419,7 @@ static int dissect_mac_fdd_fach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t PROTO_ITEM_SET_GENERATED(channel_type); /* CCCH over FACH is always octet aligned */ next_tvb = tvb_new_subset_remaining(tvb, 1); - call_dissector(rlc_ccch_handle, next_tvb, pinfo, tree); + call_dissector_with_data(rlc_ccch_handle, next_tvb, pinfo, tree, data); break; case TCTF_DCCH_DTCH_FACH_FDD: @@ -435,7 +435,7 @@ static int dissect_mac_fdd_fach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t PROTO_ITEM_SET_GENERATED(channel_type); next_tvb = tvb_new_octet_aligned(tvb, bitoffs, fpinf->chan_tf_size[chan] - bitoffs); add_new_data_source(pinfo, next_tvb, "Octet-Aligned DCCH Data"); - call_dissector(rlc_dcch_handle, next_tvb, pinfo, tree); + call_dissector_with_data(rlc_dcch_handle, next_tvb, pinfo, tree, data); break; case MAC_CONTENT_PS_DTCH: proto_item_append_text(ti, " (PS DTCH)"); @@ -443,7 +443,7 @@ static int dissect_mac_fdd_fach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t PROTO_ITEM_SET_GENERATED(channel_type); next_tvb = tvb_new_octet_aligned(tvb, bitoffs, fpinf->chan_tf_size[chan] - bitoffs); add_new_data_source(pinfo, next_tvb, "Octet-Aligned DCCH Data"); - call_dissector(rlc_ps_dtch_handle, next_tvb, pinfo, tree); + call_dissector_with_data(rlc_ps_dtch_handle, next_tvb, pinfo, tree, data); break; case MAC_CONTENT_CS_DTCH: proto_item_append_text(ti, " (CS DTCH)"); @@ -461,7 +461,7 @@ static int dissect_mac_fdd_fach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t PROTO_ITEM_SET_GENERATED(channel_type); /* CTCH over FACH is always octet aligned */ next_tvb = tvb_new_subset_remaining(tvb, 1); - call_dissector(rlc_ctch_handle, next_tvb, pinfo, tree); + call_dissector_with_data(rlc_ctch_handle, next_tvb, pinfo, tree, data); break; /* july 5: Added support for BCCH*/ case TCTF_BCCH_FACH_FDD: @@ -481,7 +481,7 @@ static int dissect_mac_fdd_fach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t } rrcinf->msgtype[fpinf->cur_tb] = RRC_MESSAGE_TYPE_BCCH_FACH; - call_dissector(rrc_handle, next_tvb, pinfo, tree); + call_dissector_with_data(rrc_handle, next_tvb, pinfo, tree, data); break; case TCTF_MSCH_FACH_FDD: @@ -497,7 +497,7 @@ static int dissect_mac_fdd_fach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t return tvb_captured_length(tvb); } -static int dissect_mac_fdd_dch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +static int dissect_mac_fdd_dch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { guint16 pos; guint8 bitoffs = 0; @@ -560,7 +560,7 @@ static int dissect_mac_fdd_dch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr /*Transport channel printout*/ channel_type = proto_tree_add_uint(dch_tree, hf_mac_trch_id, tvb, 0, 0, macinf->trchid[pos]); PROTO_ITEM_SET_GENERATED(channel_type); - call_dissector(rlc_dcch_handle, next_tvb, pinfo, tree); + call_dissector_with_data(rlc_dcch_handle, next_tvb, pinfo, tree, data); break; case MAC_CONTENT_PS_DTCH: proto_item_append_text(ti, " (PS DTCH)"); @@ -574,7 +574,7 @@ static int dissect_mac_fdd_dch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr channel_type = proto_tree_add_uint(dch_tree, hf_mac_channel, tvb, 0, 0, MAC_DTCH); PROTO_ITEM_SET_GENERATED(channel_type); - call_dissector(rlc_ps_dtch_handle, next_tvb, pinfo, tree); + call_dissector_with_data(rlc_ps_dtch_handle, next_tvb, pinfo, tree, data); break; case MAC_CONTENT_CS_DTCH: proto_item_append_text(ti, " (CS DTCH)"); @@ -921,16 +921,16 @@ static void ss_interpretation(tvbuff_t * tvb, proto_tree * tree, guint8 ss, guin } } -static void call_rlc(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, proto_item * ti, guint8 lchid) +static void call_rlc(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, proto_item * ti, guint8 lchid, void *data) { switch (lchId_type_table[lchid]) { case MAC_CONTENT_DCCH: proto_item_append_text(ti, " (DCCH)"); - call_dissector(rlc_dcch_handle, tvb, pinfo, tree); + call_dissector_with_data(rlc_dcch_handle, tvb, pinfo, tree, data); break; case MAC_CONTENT_PS_DTCH: proto_item_append_text(ti, " (PS DTCH)"); - call_dissector(rlc_ps_dtch_handle, tvb, pinfo, tree); + call_dissector_with_data(rlc_ps_dtch_handle, tvb, pinfo, tree, data); break; case MAC_CONTENT_CS_DTCH: proto_item_append_text(ti, " (CS DTCH)"); @@ -946,7 +946,7 @@ static void call_rlc(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, pro /* * Dissect a MAC-is PDU. */ -static int dissect_mac_fdd_edch_type2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +static int dissect_mac_fdd_edch_type2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { guint sdu_no, subframe_bytes = 0, offset = 0; guint8 ss; @@ -996,7 +996,7 @@ static int dissect_mac_fdd_edch_type2(tvbuff_t *tvb, packet_info *pinfo, proto_t asm_tvb = mac_is_add_fragment(tvb, pinfo, macis_sdu_tree, lchid, p_fp_info->com_context_id, offset, ss, tsn, sdu_no, mac_is_info->number_of_mac_is_sdus, sdulength); if (asm_tvb != NULL) { - call_rlc(asm_tvb, pinfo, tree, ti, lchid); + call_rlc(asm_tvb, pinfo, tree, ti, lchid, data); } offset += sdulength; @@ -1011,7 +1011,7 @@ static int dissect_mac_fdd_edch_type2(tvbuff_t *tvb, packet_info *pinfo, proto_t return tvb_captured_length(tvb); } -static int dissect_mac_fdd_edch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +static int dissect_mac_fdd_edch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { proto_tree *edch_tree = NULL; proto_item *channel_type; @@ -1047,7 +1047,7 @@ static int dissect_mac_fdd_edch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t PROTO_ITEM_SET_GENERATED(channel_type); - call_dissector(rlc_dcch_handle, tvb, pinfo, tree); + call_dissector_with_data(rlc_dcch_handle, tvb, pinfo, tree, data); break; case MAC_CONTENT_PS_DTCH: proto_item_append_text(ti, " (PS DTCH)"); @@ -1059,7 +1059,7 @@ static int dissect_mac_fdd_edch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t channel_type = proto_tree_add_uint(edch_tree, hf_mac_channel, tvb, 0, 0, MAC_DTCH); PROTO_ITEM_SET_GENERATED(channel_type); - call_dissector(rlc_ps_dtch_handle, tvb, pinfo, tree); + call_dissector_with_data(rlc_ps_dtch_handle, tvb, pinfo, tree, data); break; case MAC_CONTENT_CS_DTCH: proto_item_append_text(ti, " (CS DTCH)"); @@ -1141,7 +1141,7 @@ static void dissect_mac_fdd_hsdsch_common(tvbuff_t *tvb, packet_info *pinfo, pro * no re-alignment is necessary * If no C/T is present, the whole payload will be left-shifted by 4 bit */ -static int dissect_mac_fdd_hsdsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +static int dissect_mac_fdd_hsdsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { proto_tree *hsdsch_tree = NULL; proto_item *channel_type; @@ -1211,7 +1211,7 @@ static int dissect_mac_fdd_hsdsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree /*Set the MACd-Flow ID*/ channel_type = proto_tree_add_uint(hsdsch_tree, hf_mac_macdflowd_id, tvb, 0, 0, macinf->macdflow_id[pos]); PROTO_ITEM_SET_GENERATED(channel_type); - call_dissector(rlc_ccch_handle, next_tvb, pinfo, tree); + call_dissector_with_data(rlc_ccch_handle, next_tvb, pinfo, tree, data); break; case MAC_CONTENT_DCCH: proto_item_append_text(ti, " (DCCH)"); @@ -1236,7 +1236,7 @@ static int dissect_mac_fdd_hsdsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree /*Set the MACd-Flow ID*/ channel_type = proto_tree_add_uint(hsdsch_tree, hf_mac_macdflowd_id, tvb, 0, 0, macinf->macdflow_id[pos]); PROTO_ITEM_SET_GENERATED(channel_type); - call_dissector(rlc_dcch_handle, next_tvb, pinfo, tree); + call_dissector_with_data(rlc_dcch_handle, next_tvb, pinfo, tree, data); break; case MAC_CONTENT_PS_DTCH: proto_item_append_text(ti, " (PS DTCH)"); @@ -1261,7 +1261,7 @@ static int dissect_mac_fdd_hsdsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree channel_type = proto_tree_add_uint(hsdsch_tree, hf_mac_macdflowd_id, tvb, 0, 0, macinf->macdflow_id[pos]); PROTO_ITEM_SET_GENERATED(channel_type); - call_dissector(rlc_ps_dtch_handle, next_tvb, pinfo, tree); + call_dissector_with_data(rlc_ps_dtch_handle, next_tvb, pinfo, tree, data); break; case MAC_CONTENT_CS_DTCH: proto_item_append_text(ti, " (CS DTCH)"); |