Mark all the items for TCAP statistics as generated

svn path=/trunk/; revision=21524
This commit is contained in:
Jeff Morriss 2007-04-23 10:45:00 +00:00
parent c84eda3a80
commit 20a3a52951
3 changed files with 218 additions and 204 deletions

View File

@ -47,8 +47,8 @@
/* Initialize the protocol and registered fields */
int proto_tcap = -1;
static int hf_tcap_tag = -1;
static int hf_tcap_length = -1;
static int hf_tcap_tag = -1;
static int hf_tcap_length = -1;
static int hf_tcap_data = -1;
static int hf_tcap_tid = -1;
@ -183,18 +183,19 @@ dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
gp_tcapsrt_info=tcapsrt_razinfo();
tcap_subdissector_used=FALSE;
gp_tcap_context=NULL;
dissect_tcap_TCMessage(FALSE, tvb, 0, pinfo, tree, -1);
dissect_tcap_TCMessage(FALSE, tvb, 0, pinfo, tree, -1);
if (gtcap_HandleSRT &&
!tcap_subdissector_used ) {
if (gtcap_DisplaySRT && tree) {
stat_item = proto_tree_add_text(tree, tvb, 0, 0, "Stat");
PROTO_ITEM_SET_GENERATED(stat_item);
stat_tree = proto_item_add_subtree(stat_item, ett_tcap_stat);
}
p_tcap_context=tcapsrt_call_matching(tvb, pinfo, stat_tree, gp_tcapsrt_info);
tcap_private.context=p_tcap_context;
/* If the current message is TCAP only,
/* If the current message is TCAP only,
save the Application contexte name for the next messages */
if ( p_tcap_context &&
cur_oid &&
@ -202,13 +203,13 @@ dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
/* Save the application context and the sub dissector */
ber_oid_dissector_table = find_dissector_table("ber.oid");
strncpy(p_tcap_context->oid,cur_oid, LENGTH_OID);
if ( (subdissector_handle
if ( (subdissector_handle
= dissector_get_string_handle(ber_oid_dissector_table, cur_oid)) ) {
p_tcap_context->subdissector_handle=subdissector_handle;
p_tcap_context->oid_present=TRUE;
}
}
}
if (gtcap_HandleSRT &&
p_tcap_context &&
p_tcap_context->callback) {
@ -222,14 +223,14 @@ dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
void
proto_reg_handoff_tcap(void)
{
static gboolean prefs_initialized = FALSE;
if (! prefs_initialized) {
sccp_ssn_table = find_dissector_table("sccp.ssn");
prefs_initialized = TRUE;
}
data_handle = find_dissector("data");
#include "packet-tcap-dis-tab.c"
}
@ -261,7 +262,7 @@ proto_register_tcap(void)
{ "Transaction Id", "tcap.tid",
FT_BYTES, BASE_HEX, NULL, 0,
"", HFILL }
},
},
/* Tcap Service Response Time */
{ &hf_tcapsrt_SessionId,
{ "Session Id",
@ -293,7 +294,7 @@ proto_register_tcap(void)
FT_UINT32, BASE_DEC, NULL, 0x0,
"", HFILL }
},
#include "packet-tcap-hfarr.c"
#include "packet-tcap-hfarr.c"
};
/* Setup protocol subtree array */
@ -356,7 +357,7 @@ proto_register_tcap(void)
"Persistent stats for SRT",
"Statistics for Response Time",
&gtcap_PersistentSRT);
prefs_register_uint_preference(tcap_module, "repetitiontimeout",
"Repetition timeout",
"Maximal delay for message repetion",
@ -366,7 +367,7 @@ proto_register_tcap(void)
"lost timeout",
"Maximal delay for message lost",
10, &gtcap_LostTimeout);
ansi_sub_dissectors = g_hash_table_new(g_direct_hash,g_direct_equal);
itu_sub_dissectors = g_hash_table_new(g_direct_hash,g_direct_equal);
@ -399,7 +400,7 @@ static void init_tcap(void) {
range_foreach(ssn_range, range_delete_callback);
g_free(ssn_range);
}
ssn_range = range_copy(global_ssn_range);
range_foreach(ssn_range, range_add_callback);
tcapsrt_init_routine();
@ -417,11 +418,11 @@ dissect_tcap_param(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offs
gint32 tag;
guint32 len;
gboolean ind_field;
while (tvb_reported_length_remaining(tvb, offset) > 0)
{
saved_offset = offset;
offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
tag_offset = offset;
offset = get_ber_length(tree, tvb, offset, &len, &ind_field);
@ -441,9 +442,9 @@ dissect_tcap_param(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offs
tag_offset, len_offset-tag_offset, len);
if (len-(2*ind_field)) /*should always be positive unless we get an empty contructor pointless? */
{
next_tvb = tvb_new_subset(tvb, offset, len-(2*ind_field), len-(2*ind_field));
next_tvb = tvb_new_subset(tvb, offset, len-(2*ind_field), len-(2*ind_field));
dissect_tcap_param(pinfo, subtree,next_tvb,0);
}
}
if (ind_field)
proto_tree_add_text(subtree, tvb, offset+len-2, 2, "CONSTRUCTOR EOC");
offset += len;
@ -462,7 +463,7 @@ dissect_tcap_param(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offs
saved_offset+1, 1, len);
if (len) /* check for NULLS */
{
next_tvb = tvb_new_subset(tvb, offset, len, len);
next_tvb = tvb_new_subset(tvb, offset, len, len);
dissect_ber_octet_string(TRUE, pinfo, tree, next_tvb, 0, hf_tcap_data,
NULL);
}
@ -473,7 +474,7 @@ dissect_tcap_param(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offs
}
static void raz_tcap_private(struct tcap_private_t * p_tcap_private)
{
{
memset(p_tcap_private,0,sizeof(struct tcap_private_t) );
}
@ -493,7 +494,7 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
gint ind_field;
proto_tree * stat_tree=NULL;
proto_item * stat_item=NULL;
/*
/*
* ok lets look at the oid and ssn and try and find a dissector, otherwise lets decode it.
*/
ber_oid_dissector_table = find_dissector_table("ber.oid");
@ -504,10 +505,10 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
next_tvb = tvb_new_subset(tvb, s_offset, len+(offset-s_offset), len+(offset-s_offset));
if (!next_tvb)
return offset+len;
dissect_ber_choice(pinfo, tree, next_tvb, 0,
Component_choice, hf_index, ett_tcap_Component,NULL);
/*
* Handle The TCAP Service Response Time
@ -517,6 +518,7 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
/* Create TCAP context and tree for display */
if (gtcap_DisplaySRT && tree) {
stat_item = proto_tree_add_text(tcap_stat_tree, tvb, offset, -1, "Stat");
PROTO_ITEM_SET_GENERATED(stat_item);
stat_tree = proto_item_add_subtree(stat_item, ett_tcap_stat);
}
p_tcap_context=tcapsrt_call_matching(tvb, pinfo, stat_tree, gp_tcapsrt_info);
@ -539,7 +541,7 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
/* ACN, changed, Fallback to lower version */
/* and update the subdissector (purely formal) */
strncpy(p_tcap_context->oid,cur_oid, LENGTH_OID);
if ( (subdissector_handle
if ( (subdissector_handle
= dissector_get_string_handle(ber_oid_dissector_table, cur_oid)) ) {
p_tcap_context->subdissector_handle=subdissector_handle;
}
@ -547,7 +549,7 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
} else {
/* We do not have the OID in the TCAP context, so store it */
strncpy(p_tcap_context->oid,cur_oid, LENGTH_OID);
if ( (subdissector_handle
if ( (subdissector_handle
= dissector_get_string_handle(ber_oid_dissector_table, cur_oid)) ) {
p_tcap_context->subdissector_handle=subdissector_handle;
p_tcap_context->oid_present=TRUE;
@ -561,8 +563,8 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
}
} /* no OID */
} /* no TCAP context */
if ( p_tcap_context
if ( p_tcap_context
&& p_tcap_context->oid_present) {
/* Take the subdissector from the context */
subdissector_handle=p_tcap_context->subdissector_handle;
@ -580,17 +582,17 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
* If we do not currently know the subdissector, we have to find it
* - first, according to the OID
* - then according to the SSN
* - and at least, take the default Data handler
* - and at least, take the default Data handler
*/
if (ber_oid_dissector_table && cur_oid) {
/* Search if we can find the sub protocol according to the A.C.N */
if ( (subdissector_handle
if ( (subdissector_handle
= dissector_get_string_handle(ber_oid_dissector_table, cur_oid)) ) {
/* found */
is_subdissector=TRUE;
} else {
/* Search if we can found the sub protocol according to the SSN table */
if ( (subdissector_handle
if ( (subdissector_handle
= get_itu_tcap_subdissector(pinfo->match_port))) {
/* Found according to SSN */
is_subdissector=TRUE;
@ -613,11 +615,11 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
} else {
/* We have it already */
}
/* Call the sub dissector if present, and not already called */
if (is_subdissector)
call_dissector(subdissector_handle, next_tvb, pinfo, tcap_top_tree);
return offset+len;
}
@ -632,7 +634,7 @@ dissect_tcap_TheExternUserInfo(gboolean implicit_tag _U_, tvbuff_t *tvb, int off
guint32 len, start_offset;
gint ind_field;
/*
/*
* ok lets look at the oid and ssn and try and find a dissector, otherwise lets decode it.
*/
ber_oid_dissector_table = find_dissector_table("ber.oid");
@ -640,12 +642,12 @@ dissect_tcap_TheExternUserInfo(gboolean implicit_tag _U_, tvbuff_t *tvb, int off
offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
offset = get_ber_length(tree, tvb, offset, &len, &ind_field);
next_tvb = tvb_new_subset(tvb, start_offset, len +(offset - start_offset), len+(offset - start_offset));
next_tvb = tvb_new_subset(tvb, start_offset, len +(offset - start_offset), len+(offset - start_offset));
if (!next_tvb)
return offset+len;
if (ber_oid_dissector_table && tcapext_oid){
if(!dissector_try_string(ber_oid_dissector_table, tcapext_oid, next_tvb, pinfo, tcap_top_tree))
if(!dissector_try_string(ber_oid_dissector_table, tcapext_oid, next_tvb, pinfo, tcap_top_tree))
{
}
}
@ -666,7 +668,7 @@ void call_tcap_dissector(dissector_handle_t handle, tvbuff_t* tvb, packet_info*
requested_subdissector_handle = NULL;
RETHROW;
} ENDTRY;
requested_subdissector_handle = NULL;
}

View File

@ -55,8 +55,8 @@
/* Initialize the protocol and registered fields */
int proto_tcap = -1;
static int hf_tcap_tag = -1;
static int hf_tcap_length = -1;
static int hf_tcap_tag = -1;
static int hf_tcap_length = -1;
static int hf_tcap_data = -1;
static int hf_tcap_tid = -1;
@ -2405,18 +2405,19 @@ dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
gp_tcapsrt_info=tcapsrt_razinfo();
tcap_subdissector_used=FALSE;
gp_tcap_context=NULL;
dissect_tcap_TCMessage(FALSE, tvb, 0, pinfo, tree, -1);
dissect_tcap_TCMessage(FALSE, tvb, 0, pinfo, tree, -1);
if (gtcap_HandleSRT &&
!tcap_subdissector_used ) {
if (gtcap_DisplaySRT && tree) {
stat_item = proto_tree_add_text(tree, tvb, 0, 0, "Stat");
PROTO_ITEM_SET_GENERATED(stat_item);
stat_tree = proto_item_add_subtree(stat_item, ett_tcap_stat);
}
p_tcap_context=tcapsrt_call_matching(tvb, pinfo, stat_tree, gp_tcapsrt_info);
tcap_private.context=p_tcap_context;
/* If the current message is TCAP only,
/* If the current message is TCAP only,
save the Application contexte name for the next messages */
if ( p_tcap_context &&
cur_oid &&
@ -2424,13 +2425,13 @@ dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
/* Save the application context and the sub dissector */
ber_oid_dissector_table = find_dissector_table("ber.oid");
strncpy(p_tcap_context->oid,cur_oid, LENGTH_OID);
if ( (subdissector_handle
if ( (subdissector_handle
= dissector_get_string_handle(ber_oid_dissector_table, cur_oid)) ) {
p_tcap_context->subdissector_handle=subdissector_handle;
p_tcap_context->oid_present=TRUE;
}
}
}
if (gtcap_HandleSRT &&
p_tcap_context &&
p_tcap_context->callback) {
@ -2444,14 +2445,14 @@ dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
void
proto_reg_handoff_tcap(void)
{
static gboolean prefs_initialized = FALSE;
if (! prefs_initialized) {
sccp_ssn_table = find_dissector_table("sccp.ssn");
prefs_initialized = TRUE;
}
data_handle = find_dissector("data");
/*--- Included file: packet-tcap-dis-tab.c ---*/
@ -2461,7 +2462,7 @@ proto_reg_handoff_tcap(void)
/*--- End of included file: packet-tcap-dis-tab.c ---*/
#line 235 "packet-tcap-template.c"
#line 236 "packet-tcap-template.c"
}
static void init_tcap(void);
@ -2491,7 +2492,7 @@ proto_register_tcap(void)
{ "Transaction Id", "tcap.tid",
FT_BYTES, BASE_HEX, NULL, 0,
"", HFILL }
},
},
/* Tcap Service Response Time */
{ &hf_tcapsrt_SessionId,
{ "Session Id",
@ -3024,7 +3025,7 @@ proto_register_tcap(void)
"", HFILL }},
/*--- End of included file: packet-tcap-hfarr.c ---*/
#line 297 "packet-tcap-template.c"
#line 298 "packet-tcap-template.c"
};
/* Setup protocol subtree array */
@ -3089,7 +3090,7 @@ proto_register_tcap(void)
&ett_tcap_ErrorCode,
/*--- End of included file: packet-tcap-ettarr.c ---*/
#line 307 "packet-tcap-template.c"
#line 308 "packet-tcap-template.c"
};
/*static enum_val_t tcap_options[] = {
@ -3142,7 +3143,7 @@ proto_register_tcap(void)
"Persistent stats for SRT",
"Statistics for Response Time",
&gtcap_PersistentSRT);
prefs_register_uint_preference(tcap_module, "repetitiontimeout",
"Repetition timeout",
"Maximal delay for message repetion",
@ -3152,7 +3153,7 @@ proto_register_tcap(void)
"lost timeout",
"Maximal delay for message lost",
10, &gtcap_LostTimeout);
ansi_sub_dissectors = g_hash_table_new(g_direct_hash,g_direct_equal);
itu_sub_dissectors = g_hash_table_new(g_direct_hash,g_direct_equal);
@ -3185,7 +3186,7 @@ static void init_tcap(void) {
range_foreach(ssn_range, range_delete_callback);
g_free(ssn_range);
}
ssn_range = range_copy(global_ssn_range);
range_foreach(ssn_range, range_add_callback);
tcapsrt_init_routine();
@ -3203,11 +3204,11 @@ dissect_tcap_param(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offs
gint32 tag;
guint32 len;
gboolean ind_field;
while (tvb_reported_length_remaining(tvb, offset) > 0)
{
saved_offset = offset;
offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
tag_offset = offset;
offset = get_ber_length(tree, tvb, offset, &len, &ind_field);
@ -3227,9 +3228,9 @@ dissect_tcap_param(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offs
tag_offset, len_offset-tag_offset, len);
if (len-(2*ind_field)) /*should always be positive unless we get an empty contructor pointless? */
{
next_tvb = tvb_new_subset(tvb, offset, len-(2*ind_field), len-(2*ind_field));
next_tvb = tvb_new_subset(tvb, offset, len-(2*ind_field), len-(2*ind_field));
dissect_tcap_param(pinfo, subtree,next_tvb,0);
}
}
if (ind_field)
proto_tree_add_text(subtree, tvb, offset+len-2, 2, "CONSTRUCTOR EOC");
offset += len;
@ -3248,7 +3249,7 @@ dissect_tcap_param(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offs
saved_offset+1, 1, len);
if (len) /* check for NULLS */
{
next_tvb = tvb_new_subset(tvb, offset, len, len);
next_tvb = tvb_new_subset(tvb, offset, len, len);
dissect_ber_octet_string(TRUE, pinfo, tree, next_tvb, 0, hf_tcap_data,
NULL);
}
@ -3259,7 +3260,7 @@ dissect_tcap_param(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offs
}
static void raz_tcap_private(struct tcap_private_t * p_tcap_private)
{
{
memset(p_tcap_private,0,sizeof(struct tcap_private_t) );
}
@ -3279,7 +3280,7 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
gint ind_field;
proto_tree * stat_tree=NULL;
proto_item * stat_item=NULL;
/*
/*
* ok lets look at the oid and ssn and try and find a dissector, otherwise lets decode it.
*/
ber_oid_dissector_table = find_dissector_table("ber.oid");
@ -3290,10 +3291,10 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
next_tvb = tvb_new_subset(tvb, s_offset, len+(offset-s_offset), len+(offset-s_offset));
if (!next_tvb)
return offset+len;
dissect_ber_choice(pinfo, tree, next_tvb, 0,
Component_choice, hf_index, ett_tcap_Component,NULL);
/*
* Handle The TCAP Service Response Time
@ -3303,6 +3304,7 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
/* Create TCAP context and tree for display */
if (gtcap_DisplaySRT && tree) {
stat_item = proto_tree_add_text(tcap_stat_tree, tvb, offset, -1, "Stat");
PROTO_ITEM_SET_GENERATED(stat_item);
stat_tree = proto_item_add_subtree(stat_item, ett_tcap_stat);
}
p_tcap_context=tcapsrt_call_matching(tvb, pinfo, stat_tree, gp_tcapsrt_info);
@ -3325,7 +3327,7 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
/* ACN, changed, Fallback to lower version */
/* and update the subdissector (purely formal) */
strncpy(p_tcap_context->oid,cur_oid, LENGTH_OID);
if ( (subdissector_handle
if ( (subdissector_handle
= dissector_get_string_handle(ber_oid_dissector_table, cur_oid)) ) {
p_tcap_context->subdissector_handle=subdissector_handle;
}
@ -3333,7 +3335,7 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
} else {
/* We do not have the OID in the TCAP context, so store it */
strncpy(p_tcap_context->oid,cur_oid, LENGTH_OID);
if ( (subdissector_handle
if ( (subdissector_handle
= dissector_get_string_handle(ber_oid_dissector_table, cur_oid)) ) {
p_tcap_context->subdissector_handle=subdissector_handle;
p_tcap_context->oid_present=TRUE;
@ -3347,8 +3349,8 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
}
} /* no OID */
} /* no TCAP context */
if ( p_tcap_context
if ( p_tcap_context
&& p_tcap_context->oid_present) {
/* Take the subdissector from the context */
subdissector_handle=p_tcap_context->subdissector_handle;
@ -3366,17 +3368,17 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
* If we do not currently know the subdissector, we have to find it
* - first, according to the OID
* - then according to the SSN
* - and at least, take the default Data handler
* - and at least, take the default Data handler
*/
if (ber_oid_dissector_table && cur_oid) {
/* Search if we can find the sub protocol according to the A.C.N */
if ( (subdissector_handle
if ( (subdissector_handle
= dissector_get_string_handle(ber_oid_dissector_table, cur_oid)) ) {
/* found */
is_subdissector=TRUE;
} else {
/* Search if we can found the sub protocol according to the SSN table */
if ( (subdissector_handle
if ( (subdissector_handle
= get_itu_tcap_subdissector(pinfo->match_port))) {
/* Found according to SSN */
is_subdissector=TRUE;
@ -3399,11 +3401,11 @@ dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
} else {
/* We have it already */
}
/* Call the sub dissector if present, and not already called */
if (is_subdissector)
call_dissector(subdissector_handle, next_tvb, pinfo, tcap_top_tree);
return offset+len;
}
@ -3418,7 +3420,7 @@ dissect_tcap_TheExternUserInfo(gboolean implicit_tag _U_, tvbuff_t *tvb, int off
guint32 len, start_offset;
gint ind_field;
/*
/*
* ok lets look at the oid and ssn and try and find a dissector, otherwise lets decode it.
*/
ber_oid_dissector_table = find_dissector_table("ber.oid");
@ -3426,12 +3428,12 @@ dissect_tcap_TheExternUserInfo(gboolean implicit_tag _U_, tvbuff_t *tvb, int off
offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
offset = get_ber_length(tree, tvb, offset, &len, &ind_field);
next_tvb = tvb_new_subset(tvb, start_offset, len +(offset - start_offset), len+(offset - start_offset));
next_tvb = tvb_new_subset(tvb, start_offset, len +(offset - start_offset), len+(offset - start_offset));
if (!next_tvb)
return offset+len;
if (ber_oid_dissector_table && tcapext_oid){
if(!dissector_try_string(ber_oid_dissector_table, tcapext_oid, next_tvb, pinfo, tcap_top_tree))
if(!dissector_try_string(ber_oid_dissector_table, tcapext_oid, next_tvb, pinfo, tcap_top_tree))
{
}
}
@ -3452,7 +3454,7 @@ void call_tcap_dissector(dissector_handle_t handle, tvbuff_t* tvb, packet_info*
requested_subdissector_handle = NULL;
RETHROW;
} ENDTRY;
requested_subdissector_handle = NULL;
}

View File

@ -136,7 +136,7 @@ static void
dbg(unsigned level, char* fmt, ...)
{
va_list ap;
if (level > debug_level) return;
va_start(ap,fmt);
vfprintf(stderr, fmt, ap);
@ -149,7 +149,7 @@ tcaphash_context_equal(gconstpointer k1, gconstpointer k2)
{
const struct tcaphash_context_key_t *key1 = (const struct tcaphash_context_key_t *) k1;
const struct tcaphash_context_key_t *key2 = (const struct tcaphash_context_key_t *) k2;
return (key1->session_id == key2->session_id);
}
@ -169,14 +169,14 @@ tcaphash_begin_equal(gconstpointer k1, gconstpointer k2)
const struct tcaphash_begin_info_key_t *key2 = (const struct tcaphash_begin_info_key_t *) k2;
if (key1->hashKey == key2->hashKey) {
if ( ( (key1->opc_hash == key2->opc_hash) &&
(key1->dpc_hash == key2->dpc_hash) &&
(key1->tid == key2->tid) )
(key1->tid == key2->tid) )
||
( (key1->opc_hash == key2->dpc_hash) &&
(key1->dpc_hash == key2->opc_hash) &&
(key1->tid == key2->tid) )
(key1->tid == key2->tid) )
)
return TRUE;
}
@ -207,7 +207,7 @@ tcaphash_cont_equal(gconstpointer k1, gconstpointer k2)
(key1->src_tid == key2->src_tid) &&
(key1->dst_tid == key2->dst_tid) ) {
return TRUE;
}
}
else if ( (key1->opc_hash == key2->dpc_hash) &&
(key1->dpc_hash == key2->opc_hash) &&
(key1->src_tid == key2->dst_tid) &&
@ -238,11 +238,11 @@ tcaphash_end_equal(gconstpointer k1, gconstpointer k2)
if (key1->hashKey == key2->hashKey) {
if ( ( (key1->opc_hash == key2->opc_hash) &&
(key1->dpc_hash == key2->dpc_hash) &&
(key1->tid == key2->tid) )
(key1->tid == key2->tid) )
||
( (key1->opc_hash == key2->dpc_hash) &&
(key1->dpc_hash == key2->opc_hash) &&
(key1->tid == key2->tid) ) )
(key1->tid == key2->tid) ) )
return TRUE;
}
return FALSE;
@ -258,8 +258,8 @@ tcaphash_end_calchash(gconstpointer k)
return hashkey;
}
/*
* Update a record with the data of the Request
/*
* Update a record with the data of the Request
*/
static void
update_tcaphash_begincall(struct tcaphash_begincall_t *p_tcaphash_begincall,
@ -271,9 +271,9 @@ update_tcaphash_begincall(struct tcaphash_begincall_t *p_tcaphash_begincall,
p_tcaphash_begincall->context->begin_time = pinfo->fd->abs_ts;
}
/*
/*
* Append a new dialogue, using the same Key, to the chained list
* The time is stored too
* The time is stored too
*/
static struct tcaphash_begincall_t *
append_tcaphash_begincall(struct tcaphash_begincall_t *prev_begincall,
@ -281,7 +281,7 @@ append_tcaphash_begincall(struct tcaphash_begincall_t *prev_begincall,
packet_info *pinfo)
{
struct tcaphash_begincall_t *p_new_tcaphash_begincall = NULL;
/* Append the transaction to the list, when the same key is found
This should append when the tcap-transaction Id is reused */
@ -290,7 +290,7 @@ append_tcaphash_begincall(struct tcaphash_begincall_t *prev_begincall,
p_tcaphash_context->begincall=p_new_tcaphash_begincall;
p_new_tcaphash_begincall->beginkey=prev_begincall->beginkey;
p_new_tcaphash_begincall->context->first_frame = pinfo->fd->num;
p_new_tcaphash_begincall->next_begincall=NULL;
p_new_tcaphash_begincall->next_begincall=NULL;
p_new_tcaphash_begincall->previous_begincall=prev_begincall;
p_new_tcaphash_begincall->father=FALSE;
@ -313,15 +313,15 @@ append_tcaphash_contcall(struct tcaphash_contcall_t *prev_contcall,
struct tcaphash_context_t *p_tcaphash_context)
{
struct tcaphash_contcall_t *p_new_tcaphash_contcall = NULL;
/* Append the transaction to the list, when the same key is found
This should append when the tcap-transaction Id is reused */
p_new_tcaphash_contcall = se_alloc0(sizeof(struct tcaphash_contcall_t));
p_new_tcaphash_contcall->context=p_tcaphash_context;
p_tcaphash_context->contcall=p_new_tcaphash_contcall;
p_new_tcaphash_contcall->contkey=prev_contcall->contkey;
p_new_tcaphash_contcall->next_contcall=NULL;
p_new_tcaphash_contcall->next_contcall=NULL;
p_new_tcaphash_contcall->previous_contcall=prev_contcall;
p_new_tcaphash_contcall->father=FALSE;
@ -339,7 +339,7 @@ append_tcaphash_endcall(struct tcaphash_endcall_t *prev_endcall,
struct tcaphash_context_t *p_tcaphash_context)
{
struct tcaphash_endcall_t *p_new_tcaphash_endcall = NULL;
/* Append the transaction to the list, when the same key is found
This should append when the tcap-transaction Id is reused */
@ -347,7 +347,7 @@ append_tcaphash_endcall(struct tcaphash_endcall_t *prev_endcall,
p_new_tcaphash_endcall->context=p_tcaphash_context;
p_tcaphash_context->endcall=p_new_tcaphash_endcall;
p_new_tcaphash_endcall->endkey=prev_endcall->endkey;
p_new_tcaphash_endcall->next_endcall=NULL;
p_new_tcaphash_endcall->next_endcall=NULL;
p_new_tcaphash_endcall->previous_endcall=prev_endcall;
p_new_tcaphash_endcall->father=FALSE;
@ -360,8 +360,8 @@ append_tcaphash_endcall(struct tcaphash_endcall_t *prev_endcall,
}
/*
* Find the dialog by Key and Time
/*
* Find the dialog by Key and Time
*/
static struct tcaphash_begincall_t *
find_tcaphash_begin(struct tcaphash_begin_info_key_t *p_tcaphash_begin_key,
@ -369,7 +369,7 @@ find_tcaphash_begin(struct tcaphash_begin_info_key_t *p_tcaphash_begin_key,
{
struct tcaphash_begincall_t *p_tcaphash_begincall = NULL;
p_tcaphash_begincall = (struct tcaphash_begincall_t *)g_hash_table_lookup(tcaphash_begin, p_tcaphash_begin_key);
if(p_tcaphash_begincall) {
do {
if ( p_tcaphash_begincall->context ) {
@ -379,7 +379,7 @@ find_tcaphash_begin(struct tcaphash_begin_info_key_t *p_tcaphash_begin_key,
( !isBegin &&
pinfo->fd->num >= p_tcaphash_begincall->context->first_frame &&
( p_tcaphash_begincall->context->last_frame?pinfo->fd->num <= p_tcaphash_begincall->context->last_frame:1 )
)
)
) {
/* We have a dialogue, with this key, opened before this request */
#ifdef DEBUG_TCAPSRT
@ -401,7 +401,7 @@ find_tcaphash_begin(struct tcaphash_begin_info_key_t *p_tcaphash_begin_key,
} else {
#ifdef DEBUG_TCAPSRT
dbg(23,"Not in Bhash ");
#endif
#endif
}
return NULL;
}
@ -414,7 +414,7 @@ find_tcaphash_cont(struct tcaphash_cont_info_key_t *p_tcaphash_cont_key,
{
struct tcaphash_contcall_t *p_tcaphash_contcall = NULL;
p_tcaphash_contcall = (struct tcaphash_contcall_t *)g_hash_table_lookup(tcaphash_cont, p_tcaphash_cont_key);
if(p_tcaphash_contcall) {
do {
if ( p_tcaphash_contcall->context &&
@ -423,7 +423,7 @@ find_tcaphash_cont(struct tcaphash_cont_info_key_t *p_tcaphash_cont_key,
/* We have a dialogue, with this key, opened before this request */
#ifdef DEBUG_TCAPSRT
dbg(10,"C%d ", p_tcaphash_contcall->context->session_id);
#endif
#endif
return p_tcaphash_contcall;
break;
} else {
@ -444,7 +444,7 @@ find_tcaphash_cont(struct tcaphash_cont_info_key_t *p_tcaphash_cont_key,
#ifdef DEBUG_TCAPSRT
dbg(23,"Not in Chash ");
#endif
}
}
return NULL;
}
@ -454,23 +454,23 @@ find_tcaphash_end(struct tcaphash_end_info_key_t *p_tcaphash_end_key,
{
struct tcaphash_endcall_t *p_tcaphash_endcall = NULL;
p_tcaphash_endcall = (struct tcaphash_endcall_t *)g_hash_table_lookup(tcaphash_end, p_tcaphash_end_key);
if(p_tcaphash_endcall) {
do {
if ( p_tcaphash_endcall->context ) {
if ( ( isEnd &&
(p_tcaphash_endcall->context->last_frame?pinfo->fd->num == p_tcaphash_endcall->context->last_frame:1)
(p_tcaphash_endcall->context->last_frame?pinfo->fd->num == p_tcaphash_endcall->context->last_frame:1)
)
||
( !isEnd &&
pinfo->fd->num >= p_tcaphash_endcall->context->first_frame &&
(p_tcaphash_endcall->context->last_frame?pinfo->fd->num <= p_tcaphash_endcall->context->last_frame:1)
(p_tcaphash_endcall->context->last_frame?pinfo->fd->num <= p_tcaphash_endcall->context->last_frame:1)
)
) {
/* We have a dialogue, with this key, opened before this request */
#ifdef DEBUG_TCAPSRT
dbg(10,"E%d ", p_tcaphash_endcall->context->session_id);
#endif
#endif
return p_tcaphash_endcall;
break;
} else {
@ -492,12 +492,12 @@ find_tcaphash_end(struct tcaphash_end_info_key_t *p_tcaphash_end_key,
#ifdef DEBUG_TCAPSRT
dbg(23,"Not in Ehash ");
#endif
}
}
return NULL;
}
/*
* New record to create, to identify a new transaction
* New record to create, to identify a new transaction
*/
static struct tcaphash_context_t *
new_tcaphash_context(struct tcaphash_context_key_t *p_tcaphash_context_key,
@ -505,8 +505,8 @@ new_tcaphash_context(struct tcaphash_context_key_t *p_tcaphash_context_key,
{
struct tcaphash_context_key_t *p_new_tcaphash_context_key;
struct tcaphash_context_t *p_new_tcaphash_context = NULL;
/* Register the transaction in the hash table
/* Register the transaction in the hash table
with the tcap transaction Id as Main Key
Once created, this entry will be updated later */
@ -526,7 +526,7 @@ new_tcaphash_context(struct tcaphash_context_key_t *p_tcaphash_context_key,
}
/*
* New record to create, to identify a new transaction
* New record to create, to identify a new transaction
*/
static struct tcaphash_begincall_t *
new_tcaphash_begin(struct tcaphash_begin_info_key_t *p_tcaphash_begin_key,
@ -534,8 +534,8 @@ new_tcaphash_begin(struct tcaphash_begin_info_key_t *p_tcaphash_begin_key,
{
struct tcaphash_begin_info_key_t *p_new_tcaphash_begin_key;
struct tcaphash_begincall_t *p_new_tcaphash_begincall = NULL;
/* Register the transaction in the hash table
/* Register the transaction in the hash table
with the tcap transaction Id as Main Key
Once created, this entry will be updated later */
@ -564,7 +564,7 @@ new_tcaphash_begin(struct tcaphash_begin_info_key_t *p_tcaphash_begin_key,
/*
* New record to create, to identify a new transaction
* New record to create, to identify a new transaction
*/
static struct tcaphash_contcall_t *
new_tcaphash_cont(struct tcaphash_cont_info_key_t *p_tcaphash_cont_key,
@ -572,8 +572,8 @@ new_tcaphash_cont(struct tcaphash_cont_info_key_t *p_tcaphash_cont_key,
{
struct tcaphash_cont_info_key_t *p_new_tcaphash_cont_key;
struct tcaphash_contcall_t *p_new_tcaphash_contcall = NULL;
/* Register the transaction in the hash table
/* Register the transaction in the hash table
with the tcap transaction Id as Main Key
Once created, this entry will be updated later */
@ -583,9 +583,9 @@ new_tcaphash_cont(struct tcaphash_cont_info_key_t *p_tcaphash_cont_key,
p_new_tcaphash_cont_key->dst_tid = p_tcaphash_cont_key->dst_tid;
p_new_tcaphash_cont_key->opc_hash = p_tcaphash_cont_key->opc_hash;
p_new_tcaphash_cont_key->dpc_hash = p_tcaphash_cont_key->dpc_hash;
p_new_tcaphash_contcall = se_alloc0(sizeof(struct tcaphash_contcall_t));
p_new_tcaphash_contcall->contkey=p_new_tcaphash_cont_key;
p_new_tcaphash_contcall->contkey=p_new_tcaphash_cont_key;
p_new_tcaphash_contcall->context=p_tcaphash_context;
p_tcaphash_context->contcall=p_new_tcaphash_contcall;
p_new_tcaphash_contcall->father=TRUE;
@ -602,7 +602,7 @@ new_tcaphash_cont(struct tcaphash_cont_info_key_t *p_tcaphash_cont_key,
/*
* New record to create, to identify a new transaction
* New record to create, to identify a new transaction
*/
static struct tcaphash_endcall_t *
new_tcaphash_end(struct tcaphash_end_info_key_t *p_tcaphash_end_key,
@ -610,8 +610,8 @@ new_tcaphash_end(struct tcaphash_end_info_key_t *p_tcaphash_end_key,
{
struct tcaphash_end_info_key_t *p_new_tcaphash_end_key;
struct tcaphash_endcall_t *p_new_tcaphash_endcall = NULL;
/* Register the transaction in the hash table
/* Register the transaction in the hash table
with the tcap transaction Id as Main Key
Once created, this entry will be updated later */
@ -624,11 +624,11 @@ new_tcaphash_end(struct tcaphash_end_info_key_t *p_tcaphash_end_key,
p_new_tcaphash_endcall = se_alloc0(sizeof(struct tcaphash_endcall_t));
p_new_tcaphash_endcall->endkey=p_new_tcaphash_end_key;
p_new_tcaphash_endcall->context=p_tcaphash_context;
p_tcaphash_context->endcall=p_new_tcaphash_endcall;
p_tcaphash_context->endcall=p_new_tcaphash_endcall;
p_new_tcaphash_endcall->father=TRUE;
p_new_tcaphash_endcall->next_endcall=NULL;
p_new_tcaphash_endcall->previous_endcall=NULL;
#ifdef DEBUG_TCAPSRT
dbg(10,"E%d ", p_new_tcaphash_endcall->context->session_id);
#endif
@ -639,7 +639,7 @@ new_tcaphash_end(struct tcaphash_end_info_key_t *p_tcaphash_end_key,
static struct tcaphash_contcall_t *
static struct tcaphash_contcall_t *
create_tcaphash_cont(struct tcaphash_cont_info_key_t *p_tcaphash_cont_key,
struct tcaphash_context_t *p_tcaphash_context)
{
@ -648,7 +648,7 @@ create_tcaphash_cont(struct tcaphash_cont_info_key_t *p_tcaphash_cont_key,
p_tcaphash_contcall1 = (struct tcaphash_contcall_t *)
g_hash_table_lookup(tcaphash_cont, p_tcaphash_cont_key);
if (p_tcaphash_contcall1) {
/* Walk through list of transaction with identical keys */
/* go the the end to insert new record */
@ -668,16 +668,16 @@ create_tcaphash_cont(struct tcaphash_cont_info_key_t *p_tcaphash_cont_key,
}
static struct tcaphash_endcall_t *
static struct tcaphash_endcall_t *
create_tcaphash_end(struct tcaphash_end_info_key_t *p_tcaphash_end_key,
struct tcaphash_context_t *p_tcaphash_context)
{
struct tcaphash_endcall_t *p_tcaphash_endcall1 = NULL;
struct tcaphash_endcall_t *p_tcaphash_endcall = NULL;
p_tcaphash_endcall1 = (struct tcaphash_endcall_t *)
g_hash_table_lookup(tcaphash_end, p_tcaphash_end_key);
if (p_tcaphash_endcall1) {
/* Walk through list of transaction with identical keys */
/* go the the end to insert new record */
@ -718,7 +718,7 @@ tcapsrt_init_routine(void)
dbg(16,"Destroy hash_begin ");
#endif
g_hash_table_destroy(tcaphash_begin);
}
}
if (tcaphash_cont != NULL) {
#ifdef DEBUG_TCAPSRT
@ -752,7 +752,7 @@ tcapsrt_init_routine(void)
/*
* Service Responsee Time analyze
* Called just after dissector call
* Called just after dissector call
*/
struct tcaphash_context_t *
tcapsrt_call_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
@ -761,7 +761,7 @@ tcapsrt_call_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
struct tcaphash_context_t *tcap_context=NULL;
switch (p_tcapsrt_info->ope) {
case TC_BEGIN: /*InitialDP*/
#ifdef DEBUG_TCAPSRT
dbg(1,"TC_BEGIN ");
@ -772,24 +772,24 @@ tcapsrt_call_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
case TC_CONT:
#ifdef DEBUG_TCAPSRT
dbg(1,"TC_CONT ");
#endif
#endif
tcap_context=tcaphash_cont_matching(tvb, pinfo, tree, p_tcapsrt_info);
break;
case TC_ABORT:
#ifdef DEBUG_TCAPSRT
dbg(1,"TC_ABORT ");
#endif
#endif
tcap_context=tcaphash_end_matching(tvb, pinfo, tree, p_tcapsrt_info);
break;
case TC_END:
#ifdef DEBUG_TCAPSRT
dbg(1,"TC_END ");
#endif
tcap_context=tcaphash_end_matching(tvb, pinfo, tree, p_tcapsrt_info);
break;
default:
#ifdef DEBUG_TCAPSRT
dbg(1,"Unknow %d ", p_tcapsrt_info->ope);
@ -804,12 +804,12 @@ tcapsrt_call_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
/*
/*
* Create the record identifiying the TCAP transaction
* When the identifier for the transaction is reused, check
* When the identifier for the transaction is reused, check
* the following criteria before to append a new record:
* - a timeout corresponding to a message retransmission is detected,
* - a message hast been lost
* - a timeout corresponding to a message retransmission is detected,
* - a message hast been lost
* - or the previous transaction has been be closed
*/
static struct tcaphash_context_t *
@ -817,11 +817,11 @@ tcaphash_begin_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
struct tcapsrt_info_t *p_tcapsrt_info)
{
struct tcaphash_context_t *p_tcaphash_context=NULL;
struct tcaphash_context_key_t tcaphash_context_key;
struct tcaphash_context_key_t tcaphash_context_key;
struct tcaphash_begincall_t *p_tcaphash_begincall, *p_new_tcaphash_begincall;
struct tcaphash_begin_info_key_t tcaphash_begin_key;
proto_item *ti;
proto_item *pi;
/* prepare the key data */
tcaphash_begin_key.tid = p_tcapsrt_info->src_tid;
tcaphash_begin_key.opc_hash = mtp3_pc_hash( ((address *)(&pinfo->src))->data);
@ -840,7 +840,7 @@ tcaphash_begin_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
if (p_tcaphash_begincall) {
/* Walk through list of transaction with identical keys */
do {
do {
/* Check if the request with this reqSeqNum has been seen, with the same Message Type */
if (pinfo->fd->num == p_tcaphash_begincall->context->first_frame) {
/* We have seen this request before -> do nothing */
@ -856,18 +856,18 @@ tcaphash_begin_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
/* if last request has been responded (response number in known)
and this request appears after last response (has bigger frame number)
and last request occured after the timeout for repetition,
or
or
if last request hasn't been responded (so number unknown)
and this request appears after last request (has bigger frame number)
and this request occured after the timeout for message lost */
if ( ( p_tcaphash_begincall->context->last_frame != 0
&& pinfo->fd->num > p_tcaphash_begincall->context->first_frame
&& pinfo->fd->num > p_tcaphash_begincall->context->first_frame
&& (guint) pinfo->fd->abs_ts.secs > (guint)(p_tcaphash_begincall->context->begin_time.secs + gtcap_RepetitionTimeout)
) ||
( p_tcaphash_begincall->context->last_frame == 0
&& pinfo->fd->num > p_tcaphash_begincall->context->first_frame
&& (guint)pinfo->fd->abs_ts.secs > (guint)(p_tcaphash_begincall->context->begin_time.secs + gtcap_LostTimeout)
)
&& (guint)pinfo->fd->abs_ts.secs > (guint)(p_tcaphash_begincall->context->begin_time.secs + gtcap_LostTimeout)
)
)
{
/* we decide that we have a new request */
@ -875,46 +875,48 @@ tcaphash_begin_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
#ifdef DEBUG_TCAPSRT
dbg(12,"(timeout) Append key %lx ",tcaphash_begin_key.hashKey);
dbg(12,"Frame %u rsp %u ",pinfo->fd->num,p_tcaphash_begincall->context->last_frame );
#endif
#endif
tcaphash_context_key.session_id = tcapsrt_global_SessionId++;
p_tcaphash_context = new_tcaphash_context(&tcaphash_context_key, pinfo);
p_tcaphash_context = new_tcaphash_context(&tcaphash_context_key, pinfo);
p_new_tcaphash_begincall = append_tcaphash_begincall(p_tcaphash_begincall,
p_tcaphash_context,
pinfo);
#ifdef DEBUG_TCAPSRT
dbg(12,"Update key %lx ",tcaphash_begin_key.hashKey);
#endif
update_tcaphash_begincall(p_new_tcaphash_begincall, pinfo);
p_tcaphash_begincall=p_new_tcaphash_begincall;
} else {
/* If the Tid is reused for a closed Transaction */
/* Or if we received an InitialDP for a non closed Transaction */
if ( p_tcaphash_begincall->context->closed) {
#ifdef DEBUG_TCAPSRT
dbg(12,"(closed) Append key %lu ",tcaphash_begin_key.hashKey);
dbg(12,"Frame %u rsp %u ",pinfo->fd->num,p_tcaphash_begincall->context->last_frame );
#endif
#endif
tcaphash_context_key.session_id = tcapsrt_global_SessionId++;
p_tcaphash_context = new_tcaphash_context(&tcaphash_context_key, pinfo);
p_tcaphash_context = new_tcaphash_context(&tcaphash_context_key, pinfo);
p_new_tcaphash_begincall = append_tcaphash_begincall(p_tcaphash_begincall,
p_tcaphash_context,
pinfo);
#ifdef DEBUG_TCAPSRT
dbg(12,"Update key %lu ",tcaphash_begin_key.hashKey);
#endif
update_tcaphash_begincall(p_new_tcaphash_begincall, pinfo);
p_tcaphash_begincall=p_new_tcaphash_begincall;
} else {
/* No, so it's a duplicate request.Mark it as such. */
#ifdef DEBUG_TCAPSRT
dbg(21,"Display_duplicate ");
#endif
if (gtcap_DisplaySRT)
proto_tree_add_uint_hidden(tree, hf_tcapsrt_Duplicate, tvb, 0,0, p_tcapsrt_info->src_tid);
if (gtcap_DisplaySRT) {
pi = proto_tree_add_uint_hidden(tree, hf_tcapsrt_Duplicate, tvb, 0,0, p_tcapsrt_info->src_tid);
PROTO_ITEM_SET_GENERATED(pi);
}
p_tcaphash_context=p_tcaphash_begincall->context;
} /* test with Timeout */
} /* closed */
@ -928,37 +930,40 @@ tcaphash_begin_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
} else { /* p_tcaphash_begincall has not been found */
#ifdef DEBUG_TCAPSRT
dbg(10,"New key %lx ",tcaphash_begin_key.hashKey);
#endif
#endif
tcaphash_context_key.session_id = tcapsrt_global_SessionId++;
p_tcaphash_context = new_tcaphash_context(&tcaphash_context_key, pinfo);
p_tcaphash_context = new_tcaphash_context(&tcaphash_context_key, pinfo);
p_tcaphash_begincall = new_tcaphash_begin(&tcaphash_begin_key, p_tcaphash_context);
#ifdef DEBUG_TCAPSRT
dbg(11,"Update key %lx ",tcaphash_begin_key.hashKey);
dbg(11,"Frame reqlink #%u ", pinfo->fd->num);
#endif
update_tcaphash_begincall(p_tcaphash_begincall, pinfo);
}
/* display tcap session, if available */
if ( gtcap_DisplaySRT &&
p_tcaphash_context &&
p_tcaphash_context->session_id)
proto_tree_add_uint(tree, hf_tcapsrt_SessionId, tvb, 0,0, p_tcaphash_context->session_id);
p_tcaphash_context->session_id) {
pi = proto_tree_add_uint(tree, hf_tcapsrt_SessionId, tvb, 0,0, p_tcaphash_context->session_id);
PROTO_ITEM_SET_GENERATED(pi);
}
/* add link to response frame, if available */
if( gtcap_DisplaySRT &&
p_tcaphash_begincall->context->last_frame != 0){
#ifdef DEBUG_TCAPSRT
dbg(20,"Display_frameRsplink %d ",p_tcaphash_begincall->context->last_frame);
#endif
ti = proto_tree_add_uint_format(tree, hf_tcapsrt_BeginSession, tvb, 0, 0,
pi = proto_tree_add_uint_format(tree, hf_tcapsrt_BeginSession, tvb, 0, 0,
p_tcaphash_begincall->context->last_frame,
"End of session in frame %u",
p_tcaphash_begincall->context->last_frame);
PROTO_ITEM_SET_GENERATED(ti);
}
PROTO_ITEM_SET_GENERATED(pi);
}
return p_tcaphash_context;
}
@ -974,10 +979,11 @@ tcaphash_cont_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
struct tcaphash_context_t *p_tcaphash_context=NULL;
struct tcaphash_contcall_t *p_tcaphash_contcall;
struct tcaphash_cont_info_key_t tcaphash_cont_key;
proto_item *pi;
#ifdef DEBUG_TCAPSRT
dbg(10,"\n Hcont #%u ", pinfo->fd->num);
#endif
#endif
/* look only for matching request, if matching conversation is available. */
tcaphash_cont_key.src_tid = p_tcapsrt_info->src_tid;
@ -988,7 +994,7 @@ tcaphash_cont_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
#ifdef DEBUG_TCAPSRT
dbg(11,"Ckey %lx ", tcaphash_cont_key.hashKey);
dbg(51,"PC %s %s ",address_to_str(&pinfo->src), address_to_str(&pinfo->dst));
dbg(51,"PC %s %s ",address_to_str(&pinfo->src), address_to_str(&pinfo->dst));
dbg(51,"Tid %lx %lx ",tcaphash_cont_key.src_tid, tcaphash_cont_key.dst_tid);
#endif
p_tcaphash_contcall = find_tcaphash_cont(&tcaphash_cont_key, pinfo);
@ -1014,7 +1020,7 @@ tcaphash_cont_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
#ifdef DEBUG_TCAPSRT
dbg(11,"Bkey %lx ", tcaphash_begin_key.hashKey);
dbg(51,"PC %s %s ",address_to_str(&pinfo->src), address_to_str(&pinfo->dst));
dbg(51,"PC %s %s ",address_to_str(&pinfo->src), address_to_str(&pinfo->dst));
dbg(51,"Tid %lx ",tcaphash_begin_key.tid);
#endif
p_tcaphash_begincall = find_tcaphash_begin(&tcaphash_begin_key, pinfo,FALSE);
@ -1022,7 +1028,7 @@ tcaphash_cont_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
!p_tcaphash_begincall->context->contcall ) {
#ifdef DEBUG_TCAPSRT
dbg(12,"BFound ");
#endif
#endif
p_tcaphash_context=p_tcaphash_begincall->context;
p_tcaphash_context->responded=TRUE;
@ -1031,7 +1037,7 @@ tcaphash_cont_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
#endif
p_tcaphash_contcall = create_tcaphash_cont(&tcaphash_cont_key,
p_tcaphash_begincall->context);
#ifdef DEBUG_TCAPSRT
dbg(11,"Update Ckey %lx ",tcaphash_begin_key.hashKey);
dbg(11,"Frame reqlink #%u ", pinfo->fd->num);
@ -1046,7 +1052,7 @@ tcaphash_cont_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
#endif
p_tcaphash_endcall = create_tcaphash_end(&tcaphash_end_key,
p_tcaphash_begincall->context);
#ifdef DEBUG_TCAPSRT
dbg(11,"Update Ekey %lx ",tcaphash_end_key.hashKey);
dbg(11,"Frame reqlink #%u ", pinfo->fd->num);
@ -1054,15 +1060,17 @@ tcaphash_cont_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
} else { /* Begin not found */
#ifdef DEBUG_TCAPSRT
dbg(12,"BnotFound ");
#endif
#endif
} /* begin found */
} /* cont found */
/* display tcap session, if available */
if (gtcap_DisplaySRT &&
p_tcaphash_context &&
p_tcaphash_context->session_id)
proto_tree_add_uint(tree, hf_tcapsrt_SessionId, tvb, 0,0, p_tcaphash_context->session_id);
p_tcaphash_context->session_id) {
pi = proto_tree_add_uint(tree, hf_tcapsrt_SessionId, tvb, 0,0, p_tcaphash_context->session_id);
PROTO_ITEM_SET_GENERATED(pi);
}
return p_tcaphash_context;
}
@ -1075,15 +1083,15 @@ tcaphash_cont_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
static struct tcaphash_context_t *
tcaphash_end_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
struct tcapsrt_info_t *p_tcapsrt_info)
{
{
struct tcaphash_context_t *p_tcaphash_context=NULL;
struct tcaphash_end_info_key_t tcaphash_end_key;
struct tcaphash_endcall_t *p_tcaphash_endcall=NULL;
struct tcaphash_begin_info_key_t tcaphash_begin_key;
struct tcaphash_begincall_t *p_tcaphash_begincall=NULL;
proto_item *ti;
struct tcaphash_begincall_t *p_tcaphash_begincall=NULL;
proto_item *pi;
nstime_t delta;
@ -1098,71 +1106,73 @@ tcaphash_end_matching(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
#ifdef DEBUG_TCAPSRT
dbg(11,"Ekey %lx ",tcaphash_end_key.hashKey);
dbg(11,"PC %s %s ",address_to_str(&pinfo->src), address_to_str(&pinfo->dst));
dbg(11,"PC %s %s ",address_to_str(&pinfo->src), address_to_str(&pinfo->dst));
dbg(51,"Tid %lx ",tcaphash_end_key.tid);
#endif
p_tcaphash_endcall = find_tcaphash_end(&tcaphash_end_key, pinfo,TRUE);
if(!p_tcaphash_endcall) {
#ifdef DEBUG_TCAPSRT
dbg(12,"EnotFound ");
#endif
dbg(12,"EnotFound ");
#endif
tcaphash_begin_key.tid = p_tcapsrt_info->dst_tid;
tcaphash_begin_key.opc_hash=mtp3_pc_hash( ((address*)(&pinfo->src))->data);
tcaphash_begin_key.dpc_hash=mtp3_pc_hash( ((address*)(&pinfo->dst))->data);
tcaphash_begin_key.hashKey=tcaphash_begin_calchash(&tcaphash_begin_key);
#ifdef DEBUG_TCAPSRT
dbg(11,"Bkey %lx ", tcaphash_begin_key.hashKey);
dbg(51,"PC %s %s ",address_to_str(&pinfo->src), address_to_str(&pinfo->dst));
dbg(51,"PC %s %s ",address_to_str(&pinfo->src), address_to_str(&pinfo->dst));
dbg(51,"Tid %lx ",tcaphash_begin_key.tid);
#endif
p_tcaphash_begincall = find_tcaphash_begin(&tcaphash_begin_key, pinfo,FALSE);
}
if (p_tcaphash_endcall) {
/* Use the TC_BEGIN Destination reference */
p_tcaphash_context=p_tcaphash_endcall->context;
} else if (p_tcaphash_begincall) {
/* Use the TC_BEGIN Source reference */
/* Use the TC_BEGIN Source reference */
p_tcaphash_context=p_tcaphash_begincall->context;
}
if (p_tcaphash_context) {
#ifdef DEBUG_TCAPSRT
dbg(12,"Found, req=%d ",p_tcaphash_context->first_frame);
#endif
if (gtcap_DisplaySRT)
proto_tree_add_uint(tree, hf_tcapsrt_SessionId, tvb, 0,0, p_tcaphash_context->session_id);
if (gtcap_DisplaySRT) {
pi = proto_tree_add_uint(tree, hf_tcapsrt_SessionId, tvb, 0,0, p_tcaphash_context->session_id);
PROTO_ITEM_SET_GENERATED(pi);
}
#ifdef DEBUG_TCAPSRT
dbg(20,"Display framereqlink %d ",p_tcaphash_context->first_frame);
#endif
/* Indicate the frame to which this is a reply. */
if (gtcap_DisplaySRT) {
ti = proto_tree_add_uint_format(tree, hf_tcapsrt_EndSession, tvb, 0, 0,
pi = proto_tree_add_uint_format(tree, hf_tcapsrt_EndSession, tvb, 0, 0,
p_tcaphash_context->first_frame,
"Begin of session in frame %u",
p_tcaphash_context->first_frame);
PROTO_ITEM_SET_GENERATED(ti);
PROTO_ITEM_SET_GENERATED(pi);
/* Calculate Service Response Time */
nstime_delta(&delta, &pinfo->fd->abs_ts, &p_tcaphash_context->begin_time);
/* display Service Response Time and make it filterable */
ti = proto_tree_add_time(tree, hf_tcapsrt_SessionTime, tvb, 0, 0, &delta);
PROTO_ITEM_SET_GENERATED(ti);
pi = proto_tree_add_time(tree, hf_tcapsrt_SessionTime, tvb, 0, 0, &delta);
PROTO_ITEM_SET_GENERATED(pi);
}
/* Close the context and remove it */
tcapsrt_close(p_tcaphash_context,pinfo);
} /* context present */
} /* context present */
return p_tcaphash_context;
}
/*
* Initialize the Message Info used by the main dissector
* Data are linked to a TCAP transaction
* Data are linked to a TCAP transaction
*/
struct tcapsrt_info_t *
tcapsrt_razinfo(void)
@ -1174,9 +1184,9 @@ tcapsrt_razinfo(void)
if(tcapsrt_global_current==MAX_TCAP_INSTANCE){
tcapsrt_global_current=0;
}
p_tcapsrt_info=&tcapsrt_global_info[tcapsrt_global_current];
memset(p_tcapsrt_info,0,sizeof(struct tcapsrt_info_t));
memset(p_tcapsrt_info,0,sizeof(struct tcapsrt_info_t));
return p_tcapsrt_info;
}
@ -1202,7 +1212,7 @@ tcapsrt_close(struct tcaphash_context_t *p_tcaphash_context,
#endif
g_hash_table_remove(tcaphash_end, p_tcaphash_context->endcall->endkey);
}
/* If the contkey is present */
if ( p_tcaphash_context->contcall
&& !gtcap_PersistentSRT) {
@ -1211,7 +1221,7 @@ tcapsrt_close(struct tcaphash_context_t *p_tcaphash_context,
#endif
g_hash_table_remove(tcaphash_cont, p_tcaphash_context->contcall->contkey);
}
/* If the beginkey is present */
if (p_tcaphash_context->begincall->next_begincall) {
if (p_tcaphash_context->begincall->previous_begincall ) {
@ -1237,7 +1247,7 @@ tcapsrt_close(struct tcaphash_context_t *p_tcaphash_context,
dbg(20,"remove context ");
#endif
g_hash_table_remove(tcaphash_context, p_tcaphash_context->key);
} /* begincall without chained string */
} else { /* no context */
#ifdef DEBUG_TCAPSRT