A few more dissectors to wmem.

svn path=/trunk/; revision=51616
This commit is contained in:
Evan Huus 2013-08-31 15:47:04 +00:00
parent 50815e08e4
commit 83a7fedb55
3 changed files with 61 additions and 72 deletions

View File

@ -32,7 +32,7 @@
#include <glib.h>
#include <epan/packet.h>
#include <epan/conversation.h>
#include <epan/emem.h>
#include <epan/wmem/wmem.h>
#include <epan/prefs.h>
#include <epan/reassemble.h>
#include <epan/asn1.h>
@ -66,7 +66,7 @@ static gboolean gssapi_reassembly = TRUE;
typedef struct _gssapi_conv_info_t {
gssapi_oid_value *oid;
emem_tree_t *frags;
wmem_tree_t *frags;
gboolean do_reassembly; /* this field is used on first sequential scan of packets to help indicate when the next blob is a fragment continuing a previous one */
int first_frame;
@ -215,10 +215,10 @@ dissect_gssapi_work(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
gss_info = (gssapi_conv_info_t *)conversation_get_proto_data(conversation, proto_gssapi);
if (!gss_info) {
gss_info = se_new(gssapi_conv_info_t);
gss_info = wmem_new(wmem_file_scope(), gssapi_conv_info_t);
gss_info->oid=NULL;
gss_info->do_reassembly=FALSE;
gss_info->frags=se_tree_create_non_persistent(EMEM_TREE_TYPE_RED_BLACK, "gssapi_frags");
gss_info->frags=wmem_tree_new(wmem_file_scope());
conversation_add_proto_data(conversation, proto_gssapi, gss_info);
}
@ -251,11 +251,11 @@ dissect_gssapi_work(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
if( (!pinfo->fd->flags.visited)
&& (gss_info->do_reassembly)
&& (gssapi_reassembly) ){
fi=(gssapi_frag_info_t *)se_tree_lookup32(gss_info->frags, gss_info->first_frame);
fi=(gssapi_frag_info_t *)wmem_tree_lookup32(gss_info->frags, gss_info->first_frame);
if(!fi){
goto done;
}
se_tree_insert32(gss_info->frags, pinfo->fd->num, fi);
wmem_tree_insert32(gss_info->frags, pinfo->fd->num, fi);
fd_head=fragment_add(&gssapi_reassembly_table,
tvb, 0, pinfo, fi->first_frame, NULL,
gss_info->frag_offset,
@ -279,7 +279,7 @@ dissect_gssapi_work(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
*/
if( (pinfo->fd->flags.visited)
&& (gssapi_reassembly) ){
fi=(gssapi_frag_info_t *)se_tree_lookup32(gss_info->frags, pinfo->fd->num);
fi=(gssapi_frag_info_t *)wmem_tree_lookup32(gss_info->frags, pinfo->fd->num);
if(fi){
fd_head=fragment_get(&gssapi_reassembly_table,
pinfo, fi->first_frame, NULL);
@ -422,10 +422,10 @@ dissect_gssapi_work(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
&& (tvb_length(gss_tvb)==tvb_reported_length(gss_tvb))
&& (len1>(guint32)tvb_length_remaining(gss_tvb, oid_start_offset))
&& (gssapi_reassembly) ){
fi=se_new(gssapi_frag_info_t);
fi=wmem_new(wmem_file_scope(), gssapi_frag_info_t);
fi->first_frame=pinfo->fd->num;
fi->reassembled_in=0;
se_tree_insert32(gss_info->frags, pinfo->fd->num, fi);
wmem_tree_insert32(gss_info->frags, pinfo->fd->num, fi);
fragment_add(&gssapi_reassembly_table,
gss_tvb, 0, pinfo, pinfo->fd->num, NULL,

View File

@ -45,7 +45,7 @@
#include "packet-ip.h"
#include "packet-icmp.h"
#include <epan/conversation.h>
#include <epan/emem.h>
#include <epan/wmem/wmem.h>
#include <epan/tap.h>
static int icmp_tap = -1;
@ -58,8 +58,8 @@ static int hf_icmp_data_time = -1;
static int hf_icmp_data_time_relative = -1;
typedef struct _icmp_conv_info_t {
emem_tree_t *unmatched_pdus;
emem_tree_t *matched_pdus;
wmem_tree_t *unmatched_pdus;
wmem_tree_t *matched_pdus;
} icmp_conv_info_t;
static icmp_transaction_t *transaction_start(packet_info * pinfo,
@ -1017,20 +1017,16 @@ static icmp_transaction_t *transaction_start(packet_info * pinfo,
conversation_t *conversation;
icmp_conv_info_t *icmp_info;
icmp_transaction_t *icmp_trans;
emem_tree_key_t icmp_key[3];
wmem_tree_key_t icmp_key[3];
proto_item *it;
/* Handle the conversation tracking */
conversation = _find_or_create_conversation(pinfo);
icmp_info = (icmp_conv_info_t *)conversation_get_proto_data(conversation, proto_icmp);
if (icmp_info == NULL) {
icmp_info = se_new(icmp_conv_info_t);
icmp_info->unmatched_pdus =
se_tree_create_non_persistent(EMEM_TREE_TYPE_RED_BLACK,
"icmp_unmatched_pdus");
icmp_info->matched_pdus =
se_tree_create_non_persistent(EMEM_TREE_TYPE_RED_BLACK,
"icmp_matched_pdus");
icmp_info = wmem_new(wmem_file_scope(), icmp_conv_info_t);
icmp_info->unmatched_pdus = wmem_tree_new(wmem_file_scope());
icmp_info->matched_pdus = wmem_tree_new(wmem_file_scope());
conversation_add_proto_data(conversation, proto_icmp,
icmp_info);
}
@ -1044,12 +1040,12 @@ static icmp_transaction_t *transaction_start(packet_info * pinfo,
icmp_key[1].length = 0;
icmp_key[1].key = NULL;
icmp_trans = se_new(icmp_transaction_t);
icmp_trans = wmem_new(wmem_file_scope(), icmp_transaction_t);
icmp_trans->rqst_frame = PINFO_FD_NUM(pinfo);
icmp_trans->resp_frame = 0;
icmp_trans->rqst_time = pinfo->fd->abs_ts;
nstime_set_zero(&icmp_trans->resp_time);
se_tree_insert32_array(icmp_info->unmatched_pdus, icmp_key,
wmem_tree_insert32_array(icmp_info->unmatched_pdus, icmp_key,
(void *) icmp_trans);
} else {
/* Already visited this frame */
@ -1063,7 +1059,7 @@ static icmp_transaction_t *transaction_start(packet_info * pinfo,
icmp_key[2].key = NULL;
icmp_trans =
(icmp_transaction_t *)se_tree_lookup32_array(icmp_info->matched_pdus,
(icmp_transaction_t *)wmem_tree_lookup32_array(icmp_info->matched_pdus,
icmp_key);
}
if (icmp_trans == NULL) {
@ -1092,7 +1088,7 @@ static icmp_transaction_t *transaction_end(packet_info * pinfo,
conversation_t *conversation;
icmp_conv_info_t *icmp_info;
icmp_transaction_t *icmp_trans;
emem_tree_key_t icmp_key[3];
wmem_tree_key_t icmp_key[3];
proto_item *it;
nstime_t ns;
double resp_time;
@ -1117,7 +1113,7 @@ static icmp_transaction_t *transaction_end(packet_info * pinfo,
icmp_key[1].length = 0;
icmp_key[1].key = NULL;
icmp_trans =
(icmp_transaction_t *)se_tree_lookup32_array(icmp_info->unmatched_pdus,
(icmp_transaction_t *)wmem_tree_lookup32_array(icmp_info->unmatched_pdus,
icmp_key);
if (icmp_trans == NULL) {
return NULL;
@ -1140,11 +1136,11 @@ static icmp_transaction_t *transaction_end(packet_info * pinfo,
icmp_key[2].key = NULL;
frame_num = icmp_trans->rqst_frame;
se_tree_insert32_array(icmp_info->matched_pdus, icmp_key,
wmem_tree_insert32_array(icmp_info->matched_pdus, icmp_key,
(void *) icmp_trans);
frame_num = icmp_trans->resp_frame;
se_tree_insert32_array(icmp_info->matched_pdus, icmp_key,
wmem_tree_insert32_array(icmp_info->matched_pdus, icmp_key,
(void *) icmp_trans);
} else {
/* Already visited this frame */
@ -1158,7 +1154,7 @@ static icmp_transaction_t *transaction_end(packet_info * pinfo,
icmp_key[2].key = NULL;
icmp_trans =
(icmp_transaction_t *)se_tree_lookup32_array(icmp_info->matched_pdus,
(icmp_transaction_t *)wmem_tree_lookup32_array(icmp_info->matched_pdus,
icmp_key);
if (icmp_trans == NULL) {

View File

@ -60,7 +60,7 @@
#include <epan/ipproto.h>
#include <epan/addr_resolv.h>
#include <epan/sctpppids.h>
#include <epan/emem.h>
#include <epan/wmem/wmem.h>
#include <epan/expert.h>
#include <epan/show_exception.h>
#include <wsutil/crc32.h>
@ -516,8 +516,8 @@ struct _sctp_half_assoc_t {
guint32 first_tsn; /* start */
guint32 cumm_ack; /* rel */
emem_tree_t *tsns; /* sctp_tsn_t* by rel_tsn */
emem_tree_t *tsn_acks; /* sctp_tsn_t* by ctsn_frame */
wmem_tree_t *tsns; /* sctp_tsn_t* by rel_tsn */
wmem_tree_t *tsn_acks; /* sctp_tsn_t* by ctsn_frame */
struct _sctp_half_assoc_t *peer;
};
@ -545,18 +545,18 @@ typedef struct _sctp_tsn_t {
} sctp_tsn_t;
static emem_tree_key_t*
static wmem_tree_key_t*
make_address_key(guint32 spt, guint32 dpt, address *addr)
{
emem_tree_key_t *k = (emem_tree_key_t *)ep_alloc(sizeof(emem_tree_key_t)*6);
wmem_tree_key_t *k = (wmem_tree_key_t *)wmem_alloc(wmem_packet_scope(), sizeof(wmem_tree_key_t)*6);
k[0].length = 1; k[0].key = (guint32*)ep_memdup(&spt,sizeof(spt));
k[1].length = 1; k[1].key = (guint32*)ep_memdup(&dpt,sizeof(dpt));
k[0].length = 1; k[0].key = (guint32*)wmem_memdup(wmem_packet_scope(), &spt,sizeof(spt));
k[1].length = 1; k[1].key = (guint32*)wmem_memdup(wmem_packet_scope(), &dpt,sizeof(dpt));
k[2].length = 1; k[2].key = (guint32*)(void *)&(addr->type);
k[3].length = 1; k[3].key = (guint32*)(void *)&(addr->len);
k[4].length = ((addr->len/4)+1);
k[4].key = (guint32*)ep_alloc0(((addr->len/4)+1)*4);
k[4].key = (guint32*)wmem_alloc0(wmem_packet_scope(), ((addr->len/4)+1)*4);
if (addr->len) memcpy(k[4].key, addr->data, addr->len);
k[5].length = 0; k[5].key = NULL;
@ -564,14 +564,14 @@ make_address_key(guint32 spt, guint32 dpt, address *addr)
return k;
}
static emem_tree_key_t *
static wmem_tree_key_t *
make_dir_key(guint32 spt, guint32 dpt, guint32 vtag)
{
emem_tree_key_t *k = (emem_tree_key_t *)ep_alloc(sizeof(emem_tree_key_t)*4);
wmem_tree_key_t *k = (wmem_tree_key_t *)wmem_alloc(wmem_packet_scope(), sizeof(wmem_tree_key_t)*4);
k[0].length = 1; k[0].key = (guint32*)ep_memdup(&spt,sizeof(spt));
k[1].length = 1; k[1].key = (guint32*)ep_memdup(&dpt,sizeof(dpt));
k[2].length = 1; k[2].key = (guint32*)ep_memdup(&vtag,sizeof(vtag));
k[0].length = 1; k[0].key = (guint32*)wmem_memdup(wmem_packet_scope(), &spt,sizeof(spt));
k[1].length = 1; k[1].key = (guint32*)wmem_memdup(wmem_packet_scope(), &dpt,sizeof(dpt));
k[2].length = 1; k[2].key = (guint32*)wmem_memdup(wmem_packet_scope(), &vtag,sizeof(vtag));
k[3].length = 0; k[3].key = NULL;
return k;
@ -579,44 +579,44 @@ make_dir_key(guint32 spt, guint32 dpt, guint32 vtag)
static emem_tree_t *dirs_by_ptvtag; /* sctp_half_assoc_t* */
static emem_tree_t *dirs_by_ptaddr; /* sctp_half_assoc_t**, it may contain a null pointer */
static wmem_tree_t *dirs_by_ptvtag; /* sctp_half_assoc_t* */
static wmem_tree_t *dirs_by_ptaddr; /* sctp_half_assoc_t**, it may contain a null pointer */
static sctp_half_assoc_t *
get_half_assoc(packet_info *pinfo, guint32 spt, guint32 dpt, guint32 vtag)
{
sctp_half_assoc_t *ha;
sctp_half_assoc_t **hb;
emem_tree_key_t *k;
wmem_tree_key_t *k;
if (!enable_tsn_analysis || !vtag) return NULL;
/* look for the current half_assoc by spt, dpt and vtag */
k = make_dir_key(spt, dpt, vtag);
if (( ha = (sctp_half_assoc_t *)emem_tree_lookup32_array(dirs_by_ptvtag, k) )) {
if (( ha = (sctp_half_assoc_t *)wmem_tree_lookup32_array(dirs_by_ptvtag, k) )) {
/* found, if it has been already matched we're done */
if (ha->peer) return ha;
} else {
/* not found, make a new one and add it to the table */
ha = se_new0(sctp_half_assoc_t);
ha = wmem_new0(wmem_file_scope(), sctp_half_assoc_t);
ha->spt = spt;
ha->dpt = dpt;
ha->vtag = vtag;
ha->tsns = se_tree_create_non_persistent(EMEM_TREE_TYPE_RED_BLACK, "sctp_tsns");
ha->tsn_acks = se_tree_create_non_persistent(EMEM_TREE_TYPE_RED_BLACK, "sctp_tsn_acks");
ha->tsns = wmem_tree_new(wmem_file_scope());
ha->tsn_acks = wmem_tree_new(wmem_file_scope());
ha->started = FALSE;
ha->first_tsn= 0;
ha->cumm_ack= 0;
/* add this half to the table indexed by ports and vtag */
emem_tree_insert32_array(dirs_by_ptvtag, k, ha);
wmem_tree_insert32_array(dirs_by_ptvtag, k, ha);
}
/* at this point we have an unmatched half, look for its other half using the ports and IP address */
k = make_address_key(dpt, spt, &(pinfo->dst));
if (( hb = (sctp_half_assoc_t **)emem_tree_lookup32_array(dirs_by_ptaddr, k) )) {
if (( hb = (sctp_half_assoc_t **)wmem_tree_lookup32_array(dirs_by_ptaddr, k) )) {
/*the table contains a pointer to a pointer to a half */
if (! *hb) {
/* if there is no half pointed by this, add the current half to the table */
@ -629,9 +629,9 @@ get_half_assoc(packet_info *pinfo, guint32 spt, guint32 dpt, guint32 vtag)
}
} else {
/* we found no entry in the table: add one (using reversed ports and src addresss) so that it can be matched later */
*(hb = (sctp_half_assoc_t **)se_alloc(sizeof(void*))) = ha;
*(hb = (sctp_half_assoc_t **)wmem_alloc(wmem_file_scope(), sizeof(void*))) = ha;
k = make_address_key(spt, dpt, &(pinfo->src));
emem_tree_insert32_array(dirs_by_ptaddr, k, hb);
wmem_tree_insert32_array(dirs_by_ptaddr, k, hb);
}
return ha;
@ -769,15 +769,15 @@ sctp_tsn(packet_info *pinfo, tvbuff_t *tvb, proto_item *tsn_item,
/* printf("%.3d REL TSN: %p->%p [%u] %u \n",framenum,h,h->peer,tsn,reltsn); */
/* look for this tsn in this half's tsn table */
if (! (t = (sctp_tsn_t *)emem_tree_lookup32(h->tsns,reltsn) )) {
if (! (t = (sctp_tsn_t *)wmem_tree_lookup32(h->tsns,reltsn) )) {
/* no tsn found, create a new one */
t = se_new0(sctp_tsn_t);
t = wmem_new0(wmem_file_scope(), sctp_tsn_t);
t->tsn = tsn;
t->first_transmit.framenum = framenum;
t->first_transmit.ts = pinfo->fd->abs_ts;
emem_tree_insert32(h->tsns,reltsn,t);
wmem_tree_insert32(h->tsns,reltsn,t);
}
is_retransmission = (t->first_transmit.framenum != framenum);
@ -795,14 +795,7 @@ sctp_tsn(packet_info *pinfo, tvbuff_t *tvb, proto_item *tsn_item,
}
if (i <= MAX_RETRANS_TRACKED_PER_TSN) {
/* TODO: we're allocating 16 bytes here. The se_
* allocator adds 8 bytes of canary to that at each
* allocation. Should these allocations be batched
* or does it not matter for the rare cases when there's
* more than 1 or 2 retransmissions of a TSN?
* For now, go with simplicity (of code here).
*/
*r = se_new0(retransmit_t);
*r = wmem_new0(wmem_file_scope(), retransmit_t);
(*r)->framenum = framenum;
(*r)->ts = pinfo->fd->abs_ts;
}
@ -853,7 +846,7 @@ sctp_ack(packet_info *pinfo, tvbuff_t *tvb, proto_tree *acks_tree,
/* printf("%.6d ACK: %p->%p [%u] \n",framenum,h,h->peer,reltsn); */
t = (sctp_tsn_t *)se_tree_lookup32(h->peer->tsns,reltsn);
t = (sctp_tsn_t *)wmem_tree_lookup32(h->peer->tsns,reltsn);
if (t) {
if (! t->ack.framenum) {
@ -862,13 +855,13 @@ sctp_ack(packet_info *pinfo, tvbuff_t *tvb, proto_tree *acks_tree,
t->ack.framenum = framenum;
t->ack.ts = pinfo->fd->abs_ts;
if (( t2 = (sctp_tsn_t *)emem_tree_lookup32(h->peer->tsn_acks, framenum) )) {
if (( t2 = (sctp_tsn_t *)wmem_tree_lookup32(h->peer->tsn_acks, framenum) )) {
for(;t2->next;t2 = t2->next)
;
t2->next = t;
} else {
emem_tree_insert32(h->peer->tsn_acks, framenum,t);
wmem_tree_insert32(h->peer->tsn_acks, framenum,t);
}
}
@ -907,7 +900,7 @@ sctp_ack_block(packet_info *pinfo, sctp_half_assoc_t *h, tvbuff_t *tvb,
}
if ((t = (sctp_tsn_t *)emem_tree_lookup32(h->peer->tsn_acks, framenum))) {
if ((t = (sctp_tsn_t *)wmem_tree_lookup32(h->peer->tsn_acks, framenum))) {
for(;t;t = t->next) {
guint32 tsn = t->tsn;
@ -2186,7 +2179,7 @@ frag_free_msgs(sctp_frag_msg *msg)
g_free(fragment);
}
/* msg->messages is se_ allocated, no need to free it */
/* msg->messages is wmem_ allocated, no need to free it */
g_free(msg);
}
@ -2580,12 +2573,12 @@ fragment_reassembly(tvbuff_t *tvb, sctp_fragment *fragment,
*/
len += frag_i->len;
message = se_new(sctp_complete_msg);
message = wmem_new(wmem_file_scope(), sctp_complete_msg);
message->begin = begin->fragment->tsn;
message->end = end->fragment->tsn;
message->reassembled_in = fragment;
message->len = len;
message->data = (unsigned char *)se_alloc(len);
message->data = (unsigned char *)wmem_alloc(wmem_file_scope(), len);
message->next = NULL;
/* now copy all fragments */
@ -4354,8 +4347,8 @@ proto_register_sctp(void)
register_init_routine(frag_table_init);
dirs_by_ptvtag = se_tree_create(EMEM_TREE_TYPE_RED_BLACK, "sctp_dirs_by_ptvtag");
dirs_by_ptaddr = se_tree_create(EMEM_TREE_TYPE_RED_BLACK, "sctp_dirs_by_ptaddr");
dirs_by_ptvtag = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
dirs_by_ptaddr = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
}
void