8c608e6e82
Change-Id: Ie476c6f82f318188b41ed922b92c6fec119ea954 Reviewed-on: https://code.wireshark.org/review/244 Reviewed-by: Jeff Morriss <jeff.morriss.ws@gmail.com> Tested-by: Jeff Morriss <jeff.morriss.ws@gmail.com>
262 lines
12 KiB
INI
262 lines
12 KiB
INI
# t38.cnf
|
|
# T.38 conformation file
|
|
# 2007 Tomas Kukosa
|
|
|
|
#.EXPORTS ONLY_VALS WS_DLL
|
|
Type-of-msg/t30-indicator
|
|
Type-of-msg/t30-data
|
|
#.END
|
|
|
|
#.TYPE_RENAME
|
|
Type-of-msg/t30-indicator T30_indicator
|
|
Type-of-msg/t30-data T30_data
|
|
#.END
|
|
|
|
#.PDU_NEW
|
|
IFPPacket
|
|
UDPTLPacket
|
|
#.END
|
|
|
|
#.FN_PARS Type-of-msg VAL_PTR=&Type_of_msg_value
|
|
#.FN_FTR Type-of-msg
|
|
/* info for tap */
|
|
if (primary_part)
|
|
t38_info->type_msg = Type_of_msg_value;
|
|
#.END
|
|
|
|
#.FN_PARS Type-of-msg/t30-indicator VAL_PTR=&T30ind_value
|
|
#.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>"));
|
|
}
|
|
|
|
/* info for tap */
|
|
if (primary_part)
|
|
t38_info->t30ind_value = T30ind_value;
|
|
#.END
|
|
|
|
#.FN_PARS Type-of-msg/t30-data VAL_PTR=&Data_value
|
|
#.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>"));
|
|
}
|
|
|
|
|
|
/* info for tap */
|
|
if (primary_part)
|
|
t38_info->data_value = Data_value;
|
|
#.END
|
|
|
|
#.FN_FTR Data-Field/_item
|
|
if (primary_part) Data_Field_item_num++;
|
|
#.END
|
|
|
|
#.FN_PARS Data-Field/_item/field-type
|
|
EXT=(use_pre_corrigendum_asn1_specification)?FALSE:TRUE
|
|
EXT_NUM=(use_pre_corrigendum_asn1_specification)?0:4
|
|
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>"));
|
|
}
|
|
|
|
/* 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 (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;
|
|
gboolean save_fragmented = actx->pinfo->fragmented;
|
|
|
|
actx->pinfo->fragmented = TRUE;
|
|
|
|
/* 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) {
|
|
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 */
|
|
/*0,*/
|
|
0, /* fragment length */
|
|
FALSE, /* More fragments */
|
|
0);
|
|
if ( Data_Field_field_type_value == 7 ) {
|
|
/* if there was packet lost or other errors during the defrag then frag_msg is NULL. This could also means
|
|
* there are out of order packets (e.g, got the tail frame t4-non-ecm-sig-end before the last fragment),
|
|
* but we will assume there was packet lost instead, which is more usual. So, we are going to reassemble the packet
|
|
* and get some stat, like packet lost and burst number of packet lost
|
|
*/
|
|
if (!frag_msg) {
|
|
force_reassemble_seq(&data_reassembly_table, /* reassembly table */
|
|
actx->pinfo,
|
|
p_t38_packet_conv_info->reass_ID /* ID for fragments belonging together */
|
|
);
|
|
} 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");
|
|
}
|
|
|
|
|
|
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);
|
|
} else {
|
|
g_snprintf(t38_info->desc_comment, MAX_T38_DESC, "No packet lost");
|
|
}
|
|
|
|
process_reassembled_data(tvb, offset, actx->pinfo,
|
|
"Reassembled T38", frag_msg, &data_frag_items, NULL, tree);
|
|
|
|
/* Now reset fragmentation information in pinfo */
|
|
actx->pinfo->fragmented = save_fragmented;
|
|
|
|
t38_info->time_first_t4_data = p_t38_packet_conv_info->time_first_t4_data;
|
|
t38_info->frame_num_first_t4_data = p_t38_packet_conv_info->reass_ID; /* The reass_ID is the Frame number of the first t4 fragment */
|
|
|
|
} else {
|
|
new_tvb = process_reassembled_data(tvb, offset, actx->pinfo,
|
|
"Reassembled T38", frag_msg, &data_frag_items, NULL, tree);
|
|
|
|
/* Now reset fragmentation information in pinfo */
|
|
actx->pinfo->fragmented = save_fragmented;
|
|
|
|
if (new_tvb) call_dissector_with_data((t30_hdlc_handle) ? t30_hdlc_handle : data_handle, new_tvb, actx->pinfo, tree, t38_info);
|
|
}
|
|
} else {
|
|
if(tree){
|
|
proto_tree_add_text(tree, 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;
|
|
}
|
|
}
|
|
|
|
/* reset the reassemble ID and the start seq number if it is not HDLC data */
|
|
if ( p_t38_conv && ( ((Data_Field_field_type_value >0) && (Data_Field_field_type_value <6)) || (Data_Field_field_type_value == 7) ) ){
|
|
p_t38_conv_info->reass_ID = 0;
|
|
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;
|
|
}
|
|
t38_info->Data_Field_field_type_value = Data_Field_field_type_value;
|
|
}
|
|
#.END
|
|
|
|
#.FN_BODY Data-Field/_item/field-data VAL_PTR=&value_tvb
|
|
tvbuff_t *value_tvb = NULL;
|
|
guint32 value_len;
|
|
|
|
%(DEFAULT_BODY)s
|
|
value_len = tvb_length(value_tvb);
|
|
|
|
#.FN_FTR Data-Field/_item/field-data
|
|
if (primary_part){
|
|
if(value_len < 8){
|
|
col_append_fstr(actx->pinfo->cinfo, COL_INFO, "[%s]",
|
|
tvb_bytes_to_ep_str(value_tvb,0,value_len));
|
|
}
|
|
else {
|
|
col_append_fstr(actx->pinfo->cinfo, COL_INFO, "[%s...]",
|
|
tvb_bytes_to_ep_str(value_tvb,0,7));
|
|
}
|
|
}
|
|
|
|
/* 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)) {
|
|
fragment_head *frag_msg = NULL;
|
|
|
|
/* HDLC Data or t4-non-ecm-data */
|
|
if (Data_Field_field_type_value == 0 || Data_Field_field_type_value == 6) { /* 0=HDLC Data or 6=t4-non-ecm-data*/
|
|
gboolean save_fragmented = actx->pinfo->fragmented;
|
|
|
|
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)) {
|
|
/* we use the first fragment's frame_number as fragment ID because the protocol doesn't provide it */
|
|
p_t38_conv_info->reass_ID = actx->pinfo->fd->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->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;
|
|
}
|
|
}
|
|
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 */
|
|
value_len, /* fragment length */
|
|
TRUE, /* More fragments */
|
|
0);
|
|
p_t38_packet_conv_info->seqnum_prev_data_field = (gint32)seq_number;
|
|
process_reassembled_data(tvb, offset, actx->pinfo,
|
|
"Reassembled T38", frag_msg, &data_frag_items, NULL, tree);
|
|
|
|
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);
|
|
} else {
|
|
col_append_fstr(actx->pinfo->cinfo, COL_INFO," (t4-data fragment %u)", seq_number - (guint32)p_t38_packet_conv_info->reass_start_seqnum);
|
|
}
|
|
}
|
|
|
|
/* Now reset fragmentation information in pinfo */
|
|
actx->pinfo->fragmented = save_fragmented;
|
|
}
|
|
}
|
|
#.END
|
|
|
|
|
|
#.FN_HDR UDPTLPacket
|
|
/* Initialize to something else than data type */
|
|
Data_Field_field_type_value = 1;
|
|
#.END
|
|
|
|
#.FN_PARS UDPTLPacket/seq-number VAL_PTR=&seq_number
|
|
#.FN_FTR UDPTLPacket/seq-number
|
|
/* info for tap */
|
|
if (primary_part)
|
|
t38_info->seq_num = seq_number;
|
|
|
|
col_append_fstr(actx->pinfo->cinfo, COL_INFO, "Seq=%05u ",seq_number);
|
|
#.END
|
|
|
|
#.FN_HDR UDPTLPacket/primary-ifp-packet
|
|
primary_part = TRUE;
|
|
#.FN_FTR UDPTLPacket/primary-ifp-packet
|
|
/* if is a valid t38 packet, add to tap */
|
|
if (p_t38_packet_conv && (!actx->pinfo->flags.in_error_pkt) && ((gint32) seq_number != p_t38_packet_conv_info->last_seqnum))
|
|
tap_queue_packet(t38_tap, actx->pinfo, t38_info);
|
|
|
|
if (p_t38_conv) p_t38_conv_info->last_seqnum = (gint32) seq_number;
|
|
#.END
|
|
|
|
#.FN_HDR UDPTLPacket/error-recovery
|
|
primary_part = FALSE;
|
|
#.FN_FTR UDPTLPacket/error-recovery
|
|
primary_part = TRUE;
|
|
#.END
|