summaryrefslogtreecommitdiff
path: root/epan/dissectors
diff options
context:
space:
mode:
authorLuis Ontanon <luis.ontanon@gmail.com>2005-12-28 19:38:33 +0000
committerLuis Ontanon <luis.ontanon@gmail.com>2005-12-28 19:38:33 +0000
commit78ed00ce3aa847f3ac1b33d4cc137eb8d0b2d0ff (patch)
treeeb09efa8aa439f71204c02000d2e77d7f0a03ddf /epan/dissectors
parent1b3ca88853450d174af2026fcbb02cf027909d27 (diff)
downloadwireshark-78ed00ce3aa847f3ac1b33d4cc137eb8d0b2d0ff.tar.gz
Keep a hash of call legs indexed by nsap:sugr and separate the leg tree code so that it can be called from others.
svn path=/trunk/; revision=16913
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-alcap.c173
-rw-r--r--epan/dissectors/packet-alcap.h4
2 files changed, 106 insertions, 71 deletions
diff --git a/epan/dissectors/packet-alcap.c b/epan/dissectors/packet-alcap.c
index 00b1512443..105cb7105a 100644
--- a/epan/dissectors/packet-alcap.c
+++ b/epan/dissectors/packet-alcap.c
@@ -39,8 +39,7 @@
#include <epan/emem.h>
#include <epan/prefs.h>
#include "packet-alcap.h"
-#include "packet-e164.h"
-#include "packet-isup.h"
+#include <epan/dissectors/packet-isup.h>
#include <epan/expert.h>
#include <epan/strutil.h>
@@ -408,6 +407,7 @@ static gboolean keep_persistent_info = TRUE;
GHashTable* legs_by_dsaid = NULL;
GHashTable* legs_by_osaid = NULL;
GHashTable* legs_by_circuit_id = NULL;
+GHashTable* legs_by_bearer = NULL;
static gchar* dissect_fields_unknown(packet_info* pinfo _U_, tvbuff_t *tvb, proto_tree *tree, int offset, int len, alcap_message_info_t* msg_info _U_) {
proto_item* pi = proto_tree_add_item(tree,hf_alcap_unknown,tvb,offset,len,FALSE);
@@ -591,9 +591,8 @@ static gchar* dissect_fields_dnsea(packet_info* pinfo _U_, tvbuff_t *tvb, proto_
return NULL;
}
- msg_info->dest_nsap = ep_tvb_memdup(tvb,offset+1,len+1);
- msg_info->dest_nsap[len] = '\0';
-
+ msg_info->dest_nsap = tvb_bytes_to_str(tvb,offset,20);
+
proto_tree_add_item(tree, hf_alcap_dnsea, tvb, offset, 20, FALSE);
dissect_nsap(tvb, offset,20, tree);
@@ -613,8 +612,7 @@ static gchar* dissect_fields_onsea(packet_info* pinfo _U_, tvbuff_t *tvb, proto_
return NULL;
}
- msg_info->orig_nsap = ep_tvb_memdup(tvb,offset+1,len+1);
- msg_info->orig_nsap[len] = '\0';
+ msg_info->orig_nsap = tvb_bytes_to_str(tvb,offset,20);
proto_tree_add_item(tree, hf_alcap_onsea, tvb, offset, 20, FALSE);
dissect_nsap(tvb, offset,20, tree);
@@ -1294,6 +1292,78 @@ static alcap_msg_type_info_t msg_types[] = {
{ NULL, 0 }
};
+static void alcap_leg_tree(proto_tree* tree, tvbuff_t* tvb, const alcap_leg_info_t* leg) {
+ proto_item* pi = proto_tree_add_text(tree,tvb,0,0,"[ALCAP Leg Info]");
+
+ tree = proto_item_add_subtree(pi,ett_leg);
+
+ if (leg->dsaid) {
+ pi = proto_tree_add_uint(tree,hf_alcap_leg_dsaid,tvb,0,0,leg->dsaid);
+ PROTO_ITEM_SET_GENERATED(pi);
+ }
+
+ if (leg->osaid) {
+ pi = proto_tree_add_uint(tree,hf_alcap_leg_osaid,tvb,0,0,leg->osaid);
+ PROTO_ITEM_SET_GENERATED(pi);
+ }
+
+ if (leg->pathid) {
+ pi = proto_tree_add_uint(tree,hf_alcap_leg_pathid,tvb,0,0,leg->pathid);
+ PROTO_ITEM_SET_GENERATED(pi);
+ }
+
+ if (leg->cid) {
+ pi = proto_tree_add_uint(tree,hf_alcap_leg_cid,tvb,0,0,leg->cid);
+ PROTO_ITEM_SET_GENERATED(pi);
+ }
+
+ if (leg->sugr) {
+ pi = proto_tree_add_uint(tree,hf_alcap_leg_sugr,tvb,0,0,leg->sugr);
+ PROTO_ITEM_SET_GENERATED(pi);
+ }
+
+ if (leg->orig_nsap) {
+ pi = proto_tree_add_string(tree,hf_alcap_leg_onsea,tvb,0,0,leg->orig_nsap);
+ PROTO_ITEM_SET_GENERATED(pi);
+ }
+
+ if (leg->dest_nsap) {
+ pi = proto_tree_add_string(tree,hf_alcap_leg_dnsea,tvb,0,0,leg->dest_nsap);
+ PROTO_ITEM_SET_GENERATED(pi);
+ }
+
+ if(leg->release_cause) {
+ pi = proto_tree_add_uint(tree,hf_alcap_leg_release_cause,tvb,0,0,leg->release_cause);
+ PROTO_ITEM_SET_GENERATED(pi);
+ if (leg->release_cause && leg->release_cause != 31)
+ proto_item_set_expert_flags(pi, PI_RESPONSE_CODE, PI_WARN);
+ }
+
+ if(leg->msgs) {
+ alcap_msg_data_t* msg = leg->msgs;
+ proto_item* pi = proto_tree_add_text(tree,tvb,0,0,"[Messages in this leg]");
+ proto_tree* tree = proto_item_add_subtree(pi,ett_leg);
+
+
+ do {
+ pi = proto_tree_add_uint(tree,hf_alcap_leg_frame,tvb,0,0,msg->framenum);
+ proto_item_set_text(pi,"%s in frame %u", val_to_str(msg->msg_type,msg_type_strings,"Unknown message"),msg->framenum);
+ PROTO_ITEM_SET_GENERATED(pi);
+ } while (( msg = msg->next));
+
+ }
+
+}
+
+
+extern void alcap_tree_from_bearer_key(proto_tree* tree, tvbuff_t* tvb, const gchar* key) {
+ alcap_leg_info_t* leg = g_hash_table_lookup(legs_by_bearer,key);
+
+ if (leg) {
+ alcap_leg_tree(tree,tvb,leg);
+ }
+}
+
#define GET_MSG_TYPE(id) ( array_length(msg_types) < id ? &(msg_types[0]) : &(msg_types[id]) )
static void dissect_alcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
@@ -1379,9 +1449,30 @@ static void dissect_alcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
leg->cid = msg_info->cid;
leg->sugr = msg_info->sugr;
- leg->orig_nsap = msg_info->orig_nsap ? se_strdup(bytes_to_str(msg_info->orig_nsap,FIELD_NSAP_ADDRESS_LEN)) : NULL;
- leg->dest_nsap = msg_info->dest_nsap ? se_strdup(bytes_to_str(msg_info->dest_nsap,FIELD_NSAP_ADDRESS_LEN)) : NULL;
+ if (msg_info->orig_nsap) {
+ gchar* key = se_strdup_printf("%s:%.8X",msg_info->orig_nsap,leg->sugr);
+ g_strdown(key);
+
+ leg->orig_nsap = se_strdup(msg_info->orig_nsap);
+
+ if (!g_hash_table_lookup(legs_by_bearer,key)) {
+ g_hash_table_insert(legs_by_bearer,key,leg);
+ }
+
+ proto_tree_add_text(alcap_tree,tvb,0,0,"Key=>%s",key);
+ }
+
+ if (msg_info->dest_nsap) {
+ gchar* key = se_strdup_printf("%s:%.8X",msg_info->dest_nsap,leg->sugr);
+ g_strdown(key);
+ leg->dest_nsap = se_strdup(msg_info->dest_nsap);
+
+ if (!g_hash_table_lookup(legs_by_bearer,key)) {
+ g_hash_table_insert(legs_by_bearer,key,leg);
+ }
+ }
+
leg->msgs = NULL;
leg->release_cause = 0;
@@ -1436,67 +1527,7 @@ static void dissect_alcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
}
- if (tree && leg) {
- proto_item* pi = proto_tree_add_text(alcap_tree,tvb,0,0,"[Call Leg Info]");
- proto_tree* tree = proto_item_add_subtree(pi,ett_leg);
-
- if (leg->dsaid) {
- pi = proto_tree_add_uint(tree,hf_alcap_leg_dsaid,tvb,0,0,leg->dsaid);
- PROTO_ITEM_SET_GENERATED(pi);
- }
-
- if (leg->osaid) {
- pi = proto_tree_add_uint(tree,hf_alcap_leg_osaid,tvb,0,0,leg->osaid);
- PROTO_ITEM_SET_GENERATED(pi);
- }
-
- if (leg->pathid) {
- pi = proto_tree_add_uint(tree,hf_alcap_leg_pathid,tvb,0,0,leg->pathid);
- PROTO_ITEM_SET_GENERATED(pi);
- }
-
- if (leg->cid) {
- pi = proto_tree_add_uint(tree,hf_alcap_leg_cid,tvb,0,0,leg->cid);
- PROTO_ITEM_SET_GENERATED(pi);
- }
-
- if (leg->sugr) {
- pi = proto_tree_add_uint(tree,hf_alcap_leg_sugr,tvb,0,0,leg->sugr);
- PROTO_ITEM_SET_GENERATED(pi);
- }
-
- if (leg->orig_nsap) {
- pi = proto_tree_add_string(tree,hf_alcap_leg_onsea,tvb,0,0,leg->orig_nsap);
- PROTO_ITEM_SET_GENERATED(pi);
- }
-
- if (leg->dest_nsap) {
- pi = proto_tree_add_string(tree,hf_alcap_leg_dnsea,tvb,0,0,leg->dest_nsap);
- PROTO_ITEM_SET_GENERATED(pi);
- }
-
- if(leg->release_cause) {
- pi = proto_tree_add_uint(tree,hf_alcap_leg_release_cause,tvb,0,0,leg->release_cause);
- PROTO_ITEM_SET_GENERATED(pi);
- if (leg->release_cause != 31)
- expert_add_info_format(pinfo, pi, PI_RESPONSE_CODE, PI_WARN, "Abnormal Release");
- }
-
- if(leg->msgs) {
- alcap_msg_data_t* msg = leg->msgs;
- proto_item* pi = proto_tree_add_text(alcap_tree,tvb,0,0,"[Messages in this leg]");
- proto_tree* tree = proto_item_add_subtree(pi,ett_leg);
-
-
- do {
- pi = proto_tree_add_uint(tree,hf_alcap_leg_frame,tvb,0,0,msg->framenum);
- proto_item_set_text(pi,"%s in frame %u", val_to_str(msg->msg_type,msg_type_strings,"Unknown message"),msg->framenum);
- PROTO_ITEM_SET_GENERATED(pi);
- } while (( msg = msg->next));
-
- }
-
- }
+ if (tree && leg) alcap_leg_tree(alcap_tree,tvb,leg);
}
}
@@ -1506,9 +1537,11 @@ static void alcap_init(void) {
if (legs_by_dsaid == NULL) {
legs_by_dsaid = g_hash_table_new(g_direct_hash,g_direct_equal);
legs_by_osaid = g_hash_table_new(g_direct_hash,g_direct_equal);
+ legs_by_bearer = g_hash_table_new(g_str_hash,g_str_equal);
} else {
g_hash_table_foreach_remove(legs_by_dsaid,just_do_it,NULL);
g_hash_table_foreach_remove(legs_by_osaid,just_do_it,NULL);
+ g_hash_table_foreach_remove(legs_by_bearer,just_do_it,NULL);
}
}
diff --git a/epan/dissectors/packet-alcap.h b/epan/dissectors/packet-alcap.h
index dada2a1998..9ed413333a 100644
--- a/epan/dissectors/packet-alcap.h
+++ b/epan/dissectors/packet-alcap.h
@@ -21,7 +21,9 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-#include "packet-e164.h"
+#include <epan/dissectors/packet-e164.h>
+
+extern void alcap_tree_from_bearer_key(proto_tree* tree, tvbuff_t* tvb, const gchar* key);
typedef struct _alcap_msg_data_t {
guint msg_type;