aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/asn1/t38/t38.cnf
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/asn1/t38/t38.cnf')
-rw-r--r--epan/dissectors/asn1/t38/t38.cnf73
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);
}