diff options
Diffstat (limited to 'epan/dissectors/asn1/t38/t38.cnf')
-rw-r--r-- | epan/dissectors/asn1/t38/t38.cnf | 73 |
1 files changed, 46 insertions, 27 deletions
diff --git a/epan/dissectors/asn1/t38/t38.cnf b/epan/dissectors/asn1/t38/t38.cnf index 1eed2c3b01..bd2ecd9e3b 100644 --- a/epan/dissectors/asn1/t38/t38.cnf +++ b/epan/dissectors/asn1/t38/t38.cnf @@ -28,7 +28,7 @@ UDPTLPacket #.FN_FTR Type-of-msg/t30-indicator if (primary_part){ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " t30ind: %s", - val_to_str(T30ind_value,t38_T30_indicator_vals,"<unknown>")); + val_to_str_const(T30ind_value,t38_T30_indicator_vals,"<unknown>")); } /* info for tap */ @@ -40,7 +40,7 @@ UDPTLPacket #.FN_FTR Type-of-msg/t30-data if (primary_part){ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " data:%s:", - val_to_str(Data_value,t38_T30_data_vals,"<unknown>")); + val_to_str_const(Data_value,t38_T30_data_vals,"<unknown>")); } @@ -60,14 +60,10 @@ VAL_PTR=&Data_Field_field_type_value #.FN_FTR Data-Field/_item/field-type if (primary_part){ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " %s", - val_to_str(Data_Field_field_type_value,t38_T_field_type_vals,"<unknown>")); + val_to_str_const(Data_Field_field_type_value,t38_T_field_type_vals,"<unknown>")); } - /* We only reassmeble packets in the Primary part and in the first two Items. */ - /* There maybe be t38 packets with more than two Items, but reassemble those packets is not easy */ - /* using the current ressaemble functions. */ - /* TODO: reassemble all the Items in one frame */ - if (primary_part && (Data_Field_item_num<2)) { + if (primary_part) { if (Data_Field_field_type_value == 2 || Data_Field_field_type_value == 4 || Data_Field_field_type_value == 7) {/* hdlc-fcs-OK or hdlc-fcs-OK-sig-end or t4-non-ecm-sig-end*/ fragment_head *frag_msg = NULL; tvbuff_t* new_tvb = NULL; @@ -77,11 +73,17 @@ VAL_PTR=&Data_Field_field_type_value /* if reass_start_seqnum=-1 it means we have received the end of the fragmente, without received any fragment data */ if (p_t38_packet_conv_info->reass_start_seqnum != -1) { + guint32 frag_seq_num; + if (seq_number == (guint32)p_t38_packet_conv_info->reass_start_seqnum) { + frag_seq_num = (guint32)p_t38_packet_conv_info->additional_hdlc_data_field_counter + Data_Field_item_num - p_t38_packet_conv_info->reass_start_data_field; + } else { + frag_seq_num = seq_number - (guint32)p_t38_packet_conv_info->reass_start_seqnum + (guint32)p_t38_packet_conv_info->additional_hdlc_data_field_counter + Data_Field_item_num; + } frag_msg = fragment_add_seq(&data_reassembly_table, /* reassembly table */ tvb, offset, actx->pinfo, p_t38_packet_conv_info->reass_ID, /* ID for fragments belonging together */ NULL, - seq_number + Data_Field_item_num - (guint32)p_t38_packet_conv_info->reass_start_seqnum + (guint32)p_t38_packet_conv_info->additional_hdlc_data_field_counter, /* fragment sequence number */ + frag_seq_num, /* fragment sequence number */ /*0,*/ 0, /* fragment length */ FALSE, /* More fragments */ @@ -100,14 +102,14 @@ VAL_PTR=&Data_Field_field_type_value } else { col_append_str(actx->pinfo->cinfo, COL_INFO, " (t4-data Reassembled: No packet lost)"); - g_snprintf(t38_info->desc_comment, MAX_T38_DESC, "No packet lost"); + snprintf(t38_info->desc_comment, MAX_T38_DESC, "No packet lost"); } if (p_t38_packet_conv_info->packet_lost) { - g_snprintf(t38_info->desc_comment, MAX_T38_DESC, " Pack lost: %d, Pack burst lost: %d", p_t38_packet_conv_info->packet_lost, p_t38_packet_conv_info->burst_lost); + snprintf(t38_info->desc_comment, MAX_T38_DESC, " Pack lost: %d, Pack burst lost: %d", p_t38_packet_conv_info->packet_lost, p_t38_packet_conv_info->burst_lost); } else { - g_snprintf(t38_info->desc_comment, MAX_T38_DESC, "No packet lost"); + snprintf(t38_info->desc_comment, MAX_T38_DESC, "No packet lost"); } process_reassembled_data(tvb, offset, actx->pinfo, @@ -129,9 +131,15 @@ VAL_PTR=&Data_Field_field_type_value if (new_tvb) call_dissector_with_data((t30_hdlc_handle) ? t30_hdlc_handle : data_handle, new_tvb, actx->pinfo, tree, t38_info); } } else { - proto_tree_add_expert_format(tree, actx->pinfo, &ei_t38_malformed, tvb, offset, tvb_reported_length_remaining(tvb, offset), - "[RECEIVED END OF FRAGMENT W/OUT ANY FRAGMENT DATA]"); - col_append_str(actx->pinfo->cinfo, COL_INFO, " [Malformed?]"); + /* If this is the same sequence number as the previous packet + * (i.e., a retransmission), we don't expect to have any + * fragment data (we reassembled it in the previous packet). + */ + if (p_t38_packet_conv && ((gint32) seq_number != p_t38_packet_conv_info->last_seqnum)) { + proto_tree_add_expert_format(tree, actx->pinfo, &ei_t38_malformed, tvb, offset, tvb_reported_length_remaining(tvb, offset), + "[RECEIVED END OF FRAGMENT W/OUT ANY FRAGMENT DATA]"); + col_append_str(actx->pinfo->cinfo, COL_INFO, " [Malformed?]"); + } actx->pinfo->fragmented = save_fragmented; } } @@ -142,6 +150,13 @@ VAL_PTR=&Data_Field_field_type_value p_t38_conv_info->reass_start_seqnum = -1; p_t38_conv_info->additional_hdlc_data_field_counter = 0; p_t38_conv_info->seqnum_prev_data_field = -1; + + if (p_t38_packet_conv_info->next == NULL) { + p_t38_packet_conv_info->next = wmem_new(wmem_file_scope(), t38_conv_info); + p_t38_packet_conv_info = p_t38_packet_conv_info->next; + memcpy(p_t38_packet_conv_info, p_t38_conv_info, sizeof(t38_conv_info)); + } + } t38_info->Data_Field_field_type_value = Data_Field_field_type_value; } @@ -166,11 +181,7 @@ VAL_PTR=&Data_Field_field_type_value } } - /* We only reassmeble packets in the Primary part and in the first two Items. */ - /* There maybe be t38 packets with more than two Items, but reassemble those packets is not easy */ - /* using the current ressaemble functions. */ - /* TODO: reassemble all the Items in one frame */ - if (primary_part && (Data_Field_item_num<2)) { + if (primary_part) { fragment_head *frag_msg = NULL; /* HDLC Data or t4-non-ecm-data */ @@ -180,30 +191,40 @@ VAL_PTR=&Data_Field_field_type_value actx->pinfo->fragmented = TRUE; /* if we have not reassembled this packet and it is the first fragment, reset the reassemble ID and the start seq number*/ - if (p_t38_packet_conv && p_t38_conv && (p_t38_packet_conv_info->reass_ID == 0)) { + if (p_t38_packet_conv && p_t38_conv && (p_t38_packet_conv_info->reass_start_seqnum == -1)) { /* we use the first fragment's frame_number as fragment ID because the protocol doesn't provide it */ + /* XXX: We'd be better off assigning our own IDs using a one-up + * counter, if it's possible for more than one reassembly to + * begin in the same frame. + */ p_t38_conv_info->reass_ID = actx->pinfo->num; p_t38_conv_info->reass_start_seqnum = seq_number; p_t38_conv_info->time_first_t4_data = nstime_to_sec(&actx->pinfo->rel_ts); p_t38_conv_info->additional_hdlc_data_field_counter = 0; p_t38_packet_conv_info->reass_ID = p_t38_conv_info->reass_ID; p_t38_packet_conv_info->reass_start_seqnum = p_t38_conv_info->reass_start_seqnum; + p_t38_packet_conv_info->reass_start_data_field = Data_Field_item_num; p_t38_packet_conv_info->seqnum_prev_data_field = p_t38_conv_info->seqnum_prev_data_field; p_t38_packet_conv_info->additional_hdlc_data_field_counter = p_t38_conv_info->additional_hdlc_data_field_counter; p_t38_packet_conv_info->time_first_t4_data = p_t38_conv_info->time_first_t4_data; } if (seq_number == (guint32)p_t38_packet_conv_info->seqnum_prev_data_field){ - p_t38_packet_conv_info->additional_hdlc_data_field_counter ++; if(p_t38_conv){ - p_t38_conv_info->additional_hdlc_data_field_counter = p_t38_packet_conv_info->additional_hdlc_data_field_counter; + p_t38_conv_info->additional_hdlc_data_field_counter++; } } + guint32 frag_seq_num; + if (seq_number == (guint32)p_t38_packet_conv_info->reass_start_seqnum) { + frag_seq_num = (guint32)p_t38_packet_conv_info->additional_hdlc_data_field_counter + Data_Field_item_num - (guint32)p_t38_packet_conv_info->reass_start_data_field; + } else { + frag_seq_num = seq_number - (guint32)p_t38_packet_conv_info->reass_start_seqnum + (guint32)p_t38_packet_conv_info->additional_hdlc_data_field_counter + Data_Field_item_num; + } frag_msg = fragment_add_seq(&data_reassembly_table, value_tvb, 0, actx->pinfo, p_t38_packet_conv_info->reass_ID, /* ID for fragments belonging together */ NULL, - seq_number - (guint32)p_t38_packet_conv_info->reass_start_seqnum + (guint32)p_t38_packet_conv_info->additional_hdlc_data_field_counter, /* fragment sequence number */ + frag_seq_num, /* fragment sequence number */ value_len, /* fragment length */ TRUE, /* More fragments */ 0); @@ -213,9 +234,7 @@ VAL_PTR=&Data_Field_field_type_value if (!frag_msg) { /* Not last packet of reassembled */ if (Data_Field_field_type_value == 0) { - col_append_fstr(actx->pinfo->cinfo, COL_INFO," (HDLC fragment %u)", - seq_number + (guint32)p_t38_packet_conv_info->additional_hdlc_data_field_counter - - (guint32)p_t38_packet_conv_info->reass_start_seqnum); + col_append_fstr(actx->pinfo->cinfo, COL_INFO," (HDLC fragment %u)", frag_seq_num); } else { col_append_fstr(actx->pinfo->cinfo, COL_INFO," (t4-data fragment %u)", seq_number - (guint32)p_t38_packet_conv_info->reass_start_seqnum); } |