From Luis Ontanon for Mate:

- moved gop and gog indexes into gopcfgs, which is a propedeutic
change for upcoming changes in the way gops are to be grouped
-  changed the way gog-keys are kept in memory
- every gopkey attribute is copied into the gop->extras to avoid
redundancy in the configuration
- added timers to gogs mate.gog_type.StartTime and mate.gog_type.Time
- fixed a bug in scs_subscribe that mangled some strings
- minor interface improvement to scs propedeutic to having types avp
values in a future
- changed medium and large into mate_medium and mate_large in the
scs_collection
- fixed Mode=Replace in Transforms, now it works
- fixed a crash at reinit due to impropper initialization of mate_items

svn path=/trunk/; revision=12902
This commit is contained in:
Lars Roland 2004-12-31 14:27:38 +00:00
parent fd39b4ddca
commit 2ce1e037f6
7 changed files with 268 additions and 137 deletions

View File

@ -157,7 +157,7 @@ typedef struct _mate_cfg_item {
gint ett_attr;
gint ett_times;
gint ett_children;
/* pdu */
gboolean discard_pdu_attributes;
gboolean last_to_be_created;
@ -170,19 +170,25 @@ typedef struct _mate_cfg_item {
int hfid_pdu_rel_time;
int hfid_pdu_time_in_gop;
/* common to gop and gog */
int hfid_start_time;
int hfid_stop_time;
int hfid_last_time;
/* gop */
AVPL* start; /* start candidate avpl */
AVPL* stop; /* stop candidate avpl */
AVPL* key; /* key candidate avpl */
gboolean show_pdu_tree;
gboolean show_gop_times;
gboolean show_times;
gboolean drop_gop;
int hfid_gop_pdu;
int hfid_gop_start_time;
int hfid_gop_stop_time;
int hfid_gop_last_time;
int hfid_gop_num_pdus;
GHashTable* gop_index;
GHashTable* gog_index;
/* gog */
LoAL* keys;
float expiration;
@ -199,7 +205,7 @@ typedef struct _mate_config {
gboolean drop_gop; /* destroy the gop if not assign to a gog */
guint8* mate_lib_path; /* where to look for "Include" files first */
gboolean show_pdu_tree;
gboolean show_gop_times;
gboolean show_times;
gboolean last_to_be_created;
avpl_match_mode match_mode;
avpl_replace_mode replace_mode;
@ -240,9 +246,6 @@ typedef struct _mate_runtime_data {
guint highest_analyzed_frame;
GHashTable* frames; /* k=frame.num v=pdus */
GHashTable* items; /* k=item->id v=item */
GHashTable* gops; /* k=gop_key_match v=gop */
GHashTable* gogs; /* k=gog_key_match v=gog */
} mate_runtime_data;
@ -256,6 +259,14 @@ struct _mate_item {
mate_item* next; /* in pdu: next in gop; in gop: next in gog; in gog this doesn't make any sense yet */
float expiration; /* when will it expire after release (all gops releases if gog)? */
float idle_expiration; /* when will it expire if no new pdus are assigned to it */
/* on gop and gog: */
float start_time; /* time of start */
float release_time; /* when this gop/gog was released */
float last_time; /* the rel_time at which the last pdu has been added (to gop or gog's gop) */
/* union _payload { */
/* struct _pdu { */
guint32 frame; /* wich frame I belog to? */
@ -275,16 +286,12 @@ struct _mate_item {
gboolean released; /* has this gop been released? */
int num_of_pdus; /* how many gops a gog has? */
int num_of_after_release_pdus; /* how many pdus have arrived since it's been released */
float start_time; /* time of start */
float release_time; /* when this gop was released */
float last_time; /* the rel time at which the last pdu/gop has been added */
guint8* gop_key; /* used by gop */
mate_pdu* last_pdu; /* last pdu in pdu's list */
/* } gop; */
/* struct _gog { */
mate_gop* gops; /* gops that belong to a gog (NULL in gop) */
float expiration; /* when will it expire once released? */
int num_of_gops; /* how many gops a gog has? */
int num_of_released_gops; /* how many of them have already been released */
guint last_n; /* the number of attributes the avpl had the last time we checked */

View File

@ -43,6 +43,7 @@ struct _mate_range {
guint end;
};
typedef struct _tmp_pdu_data {
GPtrArray* ranges;
GHashTable* interesting;
@ -50,6 +51,12 @@ typedef struct _tmp_pdu_data {
} tmp_pdu_data;
typedef struct _gogkey {
guint8* key;
mate_cfg_gop* cfg;
} gogkey;
static mate_runtime_data* rd = NULL;
static mate_config* mc = NULL;
@ -64,23 +71,50 @@ static FILE* dbg_facility = NULL;
static gboolean destroy_mate_items(gpointer k _U_, gpointer v, gpointer p _U_) {
mate_item* mi = (mate_item*) v;
gogkey* gog_key;
if (mi->gop_key) g_free(mi->gop_key);
if (mi->gog_keys) g_ptr_array_free (mi->gog_keys,TRUE);
if (mi->gog_keys) {
while (mi->gog_keys->len) {
gog_key = g_ptr_array_remove_index_fast(mi->gog_keys,0);
g_free(gog_key->key);
g_free(gog_key);
}
g_ptr_array_free (mi->gog_keys,FALSE);
}
if (mi->avpl) delete_avpl(mi->avpl,TRUE);
return TRUE;
}
static gboolean clean_index(gpointer k _U_, gpointer v _U_, gpointer p _U_) {
return TRUE;
}
static gboolean destroy_items_in_cfg(gpointer k _U_, gpointer v, gpointer p _U_) {
g_hash_table_foreach_remove(((mate_cfg_item*)v)->items,destroy_mate_items,NULL);
((mate_cfg_item*)v)->last_id = 0;
mate_cfg_item* c = v;
if (c->gop_index) {
g_hash_table_foreach_remove(c->gop_index,clean_index,NULL);
}
if (c->gog_index) {
g_hash_table_foreach_remove(c->gog_index,clean_index,NULL);
}
g_hash_table_foreach_remove(c->items,destroy_mate_items,NULL);
c->last_id = 0;
return TRUE;
}
static void delete_mate_runtime_data(mate_runtime_data* rdat) {
g_hash_table_destroy(rdat->gops);
g_hash_table_destroy(rdat->frames);
g_hash_table_destroy(rdat->gogs);
g_hash_table_foreach_remove(mc->pducfgs,destroy_items_in_cfg,NULL);
g_hash_table_foreach_remove(mc->gopcfgs,destroy_items_in_cfg,NULL);
@ -106,8 +140,6 @@ extern void initialize_mate_runtime(void) {
rd->current_items = 0;
rd->now = -1.0;
rd->frames = g_hash_table_new(g_direct_hash,g_direct_equal);
rd->gops = g_hash_table_new(g_str_hash,g_str_equal);
rd->gogs = g_hash_table_new(g_str_hash,g_str_equal);
rd->mate_items = g_mem_chunk_new("mate_items",sizeof(mate_item),1024,G_ALLOC_AND_FREE);
rd->highest_analyzed_frame = 0;
@ -126,19 +158,48 @@ extern void initialize_mate_runtime(void) {
static mate_item* new_mate_item(mate_cfg_item* cfg) {
mate_item* it = g_mem_chunk_alloc(rd->mate_items);
it->cfg = cfg;
cfg->last_id++;
it->id = cfg->last_id;
it->cfg = cfg;
it->avpl = NULL ;
it->frame = 0 ;
it->next = NULL ;
it->released = FALSE ;
it->expiration = 0.0;
it->expiration = 0.0;
it->idle_expiration = 0.0;
it->start_time = 0.0;
it->release_time = 0.0;
it->last_time = 0.0;
it->frame = 0 ;
it->gop = NULL;
it->first = FALSE;
it->is_start = FALSE;
it->is_stop = FALSE;
it->after_release = FALSE;
it->rel_time = 0.0;
it->time_in_gop = -1.0;
it->next_in_frame = NULL;
it->gog = NULL;
it->pdus = NULL;
it->released = FALSE ;
it->num_of_pdus = 0;
it->num_of_after_release_pdus = 0;
it->gop_key = NULL;
it->gops = NULL;
it->num_of_gops = 0;
it->num_of_released_gops = 0;
it->last_n = 0;
it->gog_keys = NULL;
it->last_gop = NULL;
rd->current_items++;
g_hash_table_insert(cfg->items,GUINT_TO_POINTER(it->id),it);
return it;
}
@ -150,14 +211,10 @@ static mate_gop* new_gop(mate_cfg_gop* cfg, mate_pdu* pdu, guint8* key) {
gop->avpl = new_avpl(cfg->name);
gop->gog = NULL;
gop->pdus = pdu;
gop->last_pdu = pdu;
gop->gop_key = key;
gop->next = NULL;
gop->start_time = rd->now;
gop->release_time = 0.0;
gop->last_time = 0.0;
pdu->gop = gop;
pdu->next = NULL;
@ -193,14 +250,10 @@ static mate_gog* new_gog(mate_cfg_gog* cfg, mate_gop* gop) {
dbg_print (dbg_gog,1,dbg_facility,"new_gog: %s:d for %s:%d",gog->cfg->name,gog->id,gog->cfg->name,gop->id);
gog->cfg = cfg;
gog->avpl = new_avpl(cfg->name);
gog->gops = NULL;
gog->last_n = 0;
gog->gog_keys = g_ptr_array_new();
gog->last_gop = NULL;
gog->start_time = gop->rel_time;
gog->gog_keys = g_ptr_array_new();
gog->start_time = rd->now;
adopt_gop(gog,gop);
@ -236,25 +289,34 @@ static void apply_extras(AVPL* from, AVPL* to, mate_cfg_item* cfg) {
}
static void gog_remove_keys (mate_gog* gog) {
guint8* k;
gogkey* gog_key;
while (gog->gog_keys->len) {
k = (guint8*) g_ptr_array_remove_index_fast(gog->gog_keys,0);
g_hash_table_remove(rd->gogs,k);
g_free(k);
gog_key = g_ptr_array_remove_index_fast(gog->gog_keys,0);
if (g_hash_table_lookup(gog_key->cfg->gog_index,gog_key->key)) {
g_hash_table_remove(gog_key->cfg->gog_index,gog_key->key);
}
g_free(gog_key->key);
g_free(gog_key);
}
}
static void reanalyze_gop(mate_gop* gop) {
LoAL* gog_keys = NULL;
AVPL* curr_gogkey = NULL;
mate_cfg_gop* gop_cfg = NULL;
void* cookie = NULL;
AVPL* gogkey_match = NULL;
mate_gog* gog = gop->gog;
guint8* key;
gogkey* gog_key;
if ( ! gog ) return;
gog->last_time = rd->now;
dbg_print (dbg_gog,1,dbg_facility,"reanalize_gop: gop=%s gog=%s\n",gog->cfg->name,gog->id,gog->cfg->name,gop->id);
apply_extras(gop->avpl,gog->avpl,gog->cfg);
@ -266,18 +328,34 @@ static void reanalyze_gop(mate_gop* gop) {
gog_keys = gog->cfg->keys;
while (( curr_gogkey = get_next_avpl(gog_keys,&cookie) )) {
if (( gogkey_match = new_avpl_exact_match("",gog->avpl,curr_gogkey,FALSE) )) {
key = avpl_to_str(gogkey_match);
if ( g_hash_table_lookup(rd->gogs,key) ) {
g_free(key);
} else {
dbg_print (dbg_gog,1,dbg_facility,"analize_gop: new key for gog=%s:%d : %s\n",gog->cfg->name,gog->id,key);
g_hash_table_insert(rd->gogs,key,gog);
g_ptr_array_add(gog->gog_keys,key);
}
gop_cfg = g_hash_table_lookup(mc->gopcfgs,curr_gogkey->name);
if (( gogkey_match = new_avpl_exact_match(gop_cfg->name,gog->avpl,curr_gogkey,FALSE) )) {
gog_key = g_malloc(sizeof(gogkey));
gog_key->key = avpl_to_str(gogkey_match);
delete_avpl(gogkey_match,FALSE);
gog_key->cfg = gop_cfg;
if (g_hash_table_lookup(gop_cfg->gog_index,gog_key->key)) {
g_free(gog_key->key);
g_free(gog_key);
gog_key = NULL;
}
if (! gog_key ) {
/* TODO: try mergeing the gogs */
} else {
dbg_print (dbg_gog,1,dbg_facility,"analize_gop: new key for gog=%s:%d : %s\n",gog->cfg->name,gog->id,gog_key->key);
g_ptr_array_add(gog->gog_keys,gog_key);
g_hash_table_insert(gog_key->cfg->gog_index,gog_key->key,gog);
}
}
}
gog->last_n = gog->avpl->len;
}
@ -317,13 +395,13 @@ static void analize_gop(mate_gop* gop) {
dbg_print (dbg_gog,2,dbg_facility,"analize_gop: about to match\n");
if (( gogkey_match = new_avpl_exact_match(curr_gogkey->name,gop->avpl,curr_gogkey,TRUE) )) {
if (( gogkey_match = new_avpl_exact_match(gop->cfg->name,gop->avpl,curr_gogkey,TRUE) )) {
key = avpl_to_str(gogkey_match);
dbg_print (dbg_gog,1,dbg_facility,"analize_gop: got gogkey_match: %s\n",key);
if (( gog = g_hash_table_lookup(rd->gogs,key) )) {
if (( gog = g_hash_table_lookup(gop->cfg->gog_index,key) )) {
dbg_print (dbg_gog,1,dbg_facility,"analize_gop: got already a matching gog\n");
if (gog->num_of_gops == gog->num_of_released_gops && gog->expiration < rd->now) {
@ -332,7 +410,6 @@ static void analize_gop(mate_gop* gop) {
gog_remove_keys(gog);
gog = new_gog(gog->cfg,gop);
gog->num_of_gops = 1;
break;
} else {
@ -348,9 +425,10 @@ static void analize_gop(mate_gop* gop) {
dbg_print (dbg_gog,1,dbg_facility,"analize_gop: no such gog in hash, let's create a new one\n");
cfg = g_hash_table_lookup(mc->gogcfgs,curr_gogkey->name);
gog = new_gog(cfg,gop);
gog->num_of_gops = 1;
if (cfg) {
gog = new_gog(cfg,gop);
gog->num_of_gops = 1;
}
}
delete_avpl(gogkey_match,TRUE);
@ -415,7 +493,7 @@ static void analize_pdu(mate_pdu* pdu) {
delete_avpl(is_start,FALSE);
}
g_hash_table_lookup_extended(rd->gops,gop_key,(gpointer*)&orig_gop_key,(gpointer*)&gop);
g_hash_table_lookup_extended(cfg->gop_index,gop_key,(gpointer*)&orig_gop_key,(gpointer*)&gop);
if ( gop ) {
g_free(gop_key);
@ -426,13 +504,13 @@ static void analize_pdu(mate_pdu* pdu) {
if (is_start) {
if ( gop->released ) {
g_hash_table_remove(rd->gops,gop_key);
dbg_print (dbg_gop,1,dbg_facility,"analize_pdu: start on released gop, a new gop\n");
g_hash_table_remove(cfg->gop_index,gop_key);
gop = new_gop(cfg,pdu,gop_key);
g_hash_table_insert(rd->gops,gop_key,gop);
g_hash_table_insert(cfg->gop_index,gop_key,gop);
} else {
dbg_print (dbg_gop,1,dbg_facility,"analize_pdu: duplicate start on gop\n");
}
dbg_print (dbg_gop,1,dbg_facility,"analize_pdu: duplicate start on gop\n");
}
pdu->gop = gop;
@ -446,14 +524,13 @@ static void analize_pdu(mate_pdu* pdu) {
} else {
dbg_print (dbg_gop,1,dbg_facility,"analize_pdu: no gop\n");
dbg_print (dbg_gop,1,dbg_facility,"analize_pdu: no gop already\n");
if (is_start) {
gop = new_gop(cfg,pdu,gop_key);
g_hash_table_insert(rd->gops,gop_key,gop);
g_hash_table_insert(cfg->gop_index,gop_key,gop);
} else {
dbg_print (dbg_gop,1,dbg_facility,"analize_pdu: an unassigned pdu\n");
dbg_print (dbg_gop,6,dbg_facility,"analize_pdu: an unassigned pdu\n");
pdu->gop = NULL;
pdu->next = NULL;

View File

@ -114,7 +114,7 @@ static mate_cfg_item* new_mate_cfg_item(guint8* name) {
new->drop_gop = matecfg->drop_gop;
new->expiration = matecfg->gog_expiration;
new->show_pdu_tree = matecfg->show_pdu_tree;
new->show_gop_times = matecfg->show_gop_times;
new->show_times = matecfg->show_times;
new->last_id = 0;
new->hfid_ranges = NULL;
new->hfids_attr = NULL;
@ -131,9 +131,9 @@ static mate_cfg_item* new_mate_cfg_item(guint8* name) {
new->items = g_hash_table_new(g_direct_hash,g_direct_equal);
new->hfid_gop_pdu = -1;
new->hfid_gop_start_time = -1;
new->hfid_gop_stop_time = -1;
new->hfid_gop_last_time = -1;
new->hfid_start_time = -1;
new->hfid_stop_time = -1;
new->hfid_last_time = -1;
new->hfid_gop_num_pdus = -1;
new->hfid_gog_num_of_gops = -1;
@ -144,6 +144,9 @@ static mate_cfg_item* new_mate_cfg_item(guint8* name) {
new->ett_times = -1;
new->ett_children = -1;
new->gop_index = NULL;
new->gog_index = NULL;
return new;
}
@ -197,6 +200,9 @@ static mate_cfg_gop* new_gopcfg(guint8* name) {
g_hash_table_insert(matecfg->gopcfgs,(gpointer) new->name, (gpointer) new);
new->gop_index = g_hash_table_new(g_str_hash,g_str_equal);
new->gog_index = g_hash_table_new(g_str_hash,g_str_equal);
return new;
}
@ -566,7 +572,7 @@ static gboolean config_settings(AVPL*avpl) {
matecfg->drop_pdu = extract_named_bool(avpl, KEYWORD_DROPPDU,matecfg->drop_pdu);
matecfg->drop_gop = extract_named_bool(avpl, KEYWORD_DROPGOP,matecfg->drop_gop);
matecfg->show_pdu_tree = extract_named_bool(avpl, KEYWORD_SHOWPDUTREE,matecfg->show_pdu_tree);
matecfg->show_gop_times = extract_named_bool(avpl, KEYWORD_SHOWGOPTIMES,matecfg->show_gop_times);
matecfg->show_times = extract_named_bool(avpl, KEYWORD_SHOWGOPTIMES,matecfg->show_times);
if(( avp = extract_avp_by_name(avpl,KEYWORD_DEBUGFILENAME) )) {
matecfg->dbg_facility = dbg_facility = fopen(avp->v,"w");
@ -721,7 +727,7 @@ static gboolean config_gop(AVPL* avpl) {
cfg->drop_gop = extract_named_bool(avpl, KEYWORD_DROPGOP,matecfg->drop_gop);
cfg->show_pdu_tree = extract_named_bool(avpl, KEYWORD_SHOWPDUTREE, matecfg->show_pdu_tree);
cfg->show_gop_times = extract_named_bool(avpl, KEYWORD_SHOWGOPTIMES,matecfg->show_gop_times);
cfg->show_times = extract_named_bool(avpl, KEYWORD_SHOWGOPTIMES,matecfg->show_times);
cfg->key = avpl;
@ -784,7 +790,7 @@ static gboolean config_gopextra(AVPL* avpl) {
cfg->drop_gop = extract_named_bool(avpl, KEYWORD_DROPGOP,cfg->drop_gop);
cfg->show_pdu_tree = extract_named_bool(avpl, KEYWORD_SHOWPDUTREE, cfg->show_pdu_tree);
cfg->show_gop_times = extract_named_bool(avpl, KEYWORD_SHOWGOPTIMES,cfg->show_gop_times);
cfg->show_times = extract_named_bool(avpl, KEYWORD_SHOWGOPTIMES,cfg->show_times);
merge_avpl(cfg->extra,avpl,TRUE);
@ -1235,7 +1241,7 @@ static void analyze_gop_config(gpointer k _U_, gpointer v, gpointer p _U_) {
g_array_append_val(matecfg->hfrs,hfri);
hfri.p_id = &(cfg->hfid_gop_start_time);
hfri.p_id = &(cfg->hfid_start_time);
hfri.hfinfo.name = g_strdup_printf("%s start time",cfg->name);
hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.StartTime",cfg->name);
hfri.hfinfo.type = FT_FLOAT;
@ -1244,14 +1250,14 @@ static void analyze_gop_config(gpointer k _U_, gpointer v, gpointer p _U_) {
g_array_append_val(matecfg->hfrs,hfri);
hfri.p_id = &(cfg->hfid_gop_stop_time);
hfri.p_id = &(cfg->hfid_stop_time);
hfri.hfinfo.name = g_strdup_printf("%s hold time",cfg->name);
hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.Time",cfg->name);
hfri.hfinfo.blurb = g_strdup_printf("Duration in seconds from start to stop of this %s",cfg->name);
g_array_append_val(matecfg->hfrs,hfri);
hfri.p_id = &(cfg->hfid_gop_last_time);
hfri.p_id = &(cfg->hfid_last_time);
hfri.hfinfo.name = g_strdup_printf("%s duration",cfg->name);
hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.Duration",cfg->name);
hfri.hfinfo.blurb = g_strdup_printf("Time passed between the start of this %s and the last pdu assigned to it",cfg->name);
@ -1324,6 +1330,7 @@ static void analyze_gog_config(gpointer k _U_, gpointer v, gpointer p _U_) {
void* avpl_cookie;
AVP* avp;
AVPL* avpl;
AVPL* key_avps;
hf_register_info hfri = { NULL, {NULL, NULL, FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL}};
gint* ett;
@ -1335,16 +1342,32 @@ static void analyze_gog_config(gpointer k _U_, gpointer v, gpointer p _U_) {
hfri.hfinfo.display = BASE_DEC;
g_array_append_val(matecfg->hfrs,hfri);
hfri.p_id = &(cfg->hfid_gog_num_of_gops);
hfri.hfinfo.name = "number of GOPs";
hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.NumOfGops",cfg->name);
hfri.hfinfo.type = FT_UINT32;
hfri.hfinfo.display = BASE_DEC;
hfri.hfinfo.blurb = g_strdup_printf("Number of GOPs assigned to this %s",cfg->name);
g_array_append_val(matecfg->hfrs,hfri);
hfri.p_id = &(cfg->hfid_start_time);
hfri.hfinfo.name = g_strdup_printf("%s start time",cfg->name);
hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.StartTime",cfg->name);
hfri.hfinfo.type = FT_FLOAT;
hfri.hfinfo.blurb = g_strdup_printf("Seconds passed since the begining of caputre to the start of this %s",cfg->name);
g_array_append_val(matecfg->hfrs,hfri);
hfri.p_id = &(cfg->hfid_last_time);
hfri.hfinfo.name = g_strdup_printf("%s duration",cfg->name);
hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.Duration",cfg->name);
hfri.hfinfo.blurb = g_strdup_printf("Time passed between the start of this %s and the last pdu assigned to it",cfg->name);
g_array_append_val(matecfg->hfrs,hfri);
/* this might become mate.gogname.gopname */
hfri.p_id = &(cfg->hfid_gog_gop);
hfri.hfinfo.name = "a GOP";
hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.Gop",cfg->name);
@ -1354,12 +1377,15 @@ static void analyze_gog_config(gpointer k _U_, gpointer v, gpointer p _U_) {
g_array_append_val(matecfg->hfrs,hfri);
key_avps = new_avpl("");
avpl_cookie = NULL;
while (( avpl = get_next_avpl(cfg->keys,&avpl_cookie) )) {
avp_cookie = NULL;
while (( avp = get_next_avp(avpl,&avp_cookie) )) {
if (! g_hash_table_lookup(cfg->my_hfids,avp->n)) {
new_attr_hfri(cfg,avp->n);
insert_avp(key_avps,avp);
}
}
}
@ -1370,7 +1396,10 @@ static void analyze_gog_config(gpointer k _U_, gpointer v, gpointer p _U_) {
new_attr_hfri(cfg,avp->n);
}
}
merge_avpl(cfg->extra,key_avps,TRUE);
delete_avpl(key_avps,FALSE);
analyze_transform_hfrs(cfg);
ett = &cfg->ett;
@ -1382,6 +1411,9 @@ static void analyze_gog_config(gpointer k _U_, gpointer v, gpointer p _U_) {
ett = &cfg->ett_children;
g_array_append_val(matecfg->ett,ett);
ett = &cfg->ett_times;
g_array_append_val(matecfg->ett,ett);
}
static size_t analyze_config() {
@ -1499,17 +1531,7 @@ static void init_actions() {
}
void reset_cfg(gpointer k _U_, gpointer v, gpointer p _U_) {
mate_cfg_item* c = v;
c->last_id = 0;
}
extern mate_config* mate_cfg() {
g_hash_table_foreach(matecfg->pducfgs,reset_cfg,NULL);
g_hash_table_foreach(matecfg->gopcfgs,reset_cfg,NULL);
g_hash_table_foreach(matecfg->gogcfgs,reset_cfg,NULL);
return matecfg;
}
@ -1525,7 +1547,7 @@ extern mate_config* mate_make_config(guint8* filename) {
matecfg->drop_pdu = FALSE;
matecfg->drop_gop = FALSE;
matecfg->show_pdu_tree = TRUE;
matecfg->show_gop_times = TRUE;
matecfg->show_times = TRUE;
matecfg->last_to_be_created = FALSE;
matecfg->match_mode = AVPL_STRICT;
matecfg->replace_mode = AVPL_INSERT;

View File

@ -95,23 +95,22 @@ void dbg_print(const guint* which, guint how, FILE* where, guint8* fmt, ... ) {
*
* Initializes the scs hash.
**/
/* Don't call variables "small" or "huge". They are keywords for the MSVC compiler. Rename them to "mate_small" and "mate_huge"*/
struct _scs_collection {
GHashTable* hash; /* key: a string value: guint number of subscribers */
GMemChunk* ctrs;
GMemChunk* mate_small;
GMemChunk* medium;
GMemChunk* large;
GMemChunk* mate_medium;
GMemChunk* mate_large;
GMemChunk* mate_huge;
guint8* buf;
};
extern void destroy_scs_collection(SCS_collection* c) {
if ( c->ctrs ) g_mem_chunk_destroy(c->ctrs);
if ( c->mate_small ) g_mem_chunk_destroy(c->mate_small);
if ( c->medium ) g_mem_chunk_destroy(c->medium);
if ( c->large ) g_mem_chunk_destroy(c->large);
if ( c->mate_medium ) g_mem_chunk_destroy(c->mate_medium);
if ( c->mate_large ) g_mem_chunk_destroy(c->mate_large);
if ( c->mate_huge ) g_mem_chunk_destroy(c->mate_huge);
if (c->hash) g_hash_table_destroy(c->hash);
@ -128,17 +127,14 @@ extern SCS_collection* scs_init(void) {
c->mate_small = g_mem_chunk_new("small_scs_chunk", SCS_SMALL_SIZE,
SCS_SMALL_SIZE * SCS_SMALL_CHUNK_SIZE, G_ALLOC_AND_FREE);
c->medium = g_mem_chunk_new("medium_scs_chunk", SCS_MEDIUM_SIZE,
c->mate_medium = g_mem_chunk_new("medium_scs_chunk", SCS_MEDIUM_SIZE,
SCS_MEDIUM_SIZE * SCS_MEDIUM_CHUNK_SIZE, G_ALLOC_AND_FREE);
c->large = g_mem_chunk_new("large_scs_chunk", SCS_LARGE_SIZE,
c->mate_large = g_mem_chunk_new("large_scs_chunk", SCS_LARGE_SIZE,
SCS_LARGE_SIZE * SCS_LARGE_CHUNK_SIZE, G_ALLOC_AND_FREE);
c->mate_huge = g_mem_chunk_new("huge_scs_chunk", SCS_HUGE_SIZE,
SCS_HUGE_SIZE * SCS_HUGE_CHUNK_SIZE, G_ALLOC_AND_FREE);
c->buf = g_mem_chunk_alloc0(c->mate_huge);
return c;
}
@ -159,41 +155,43 @@ guint8* scs_subscribe(SCS_collection* c, guint8* s) {
guint8* orig = NULL;
guint* ip = NULL;
size_t len = 0;
guint8* new = NULL;
GMemChunk* chunk = NULL;
g_hash_table_lookup_extended(c->hash,s,(gpointer*)&orig,(gpointer*)&ip);
if (ip) {
(*ip)++;
new = orig;
} else {
ip = g_mem_chunk_alloc(c->ctrs);
*ip = 0;
len = strlen(s) + 1;
if (len <= SCS_SMALL_SIZE) {
chunk = c->mate_small;
len = SCS_SMALL_SIZE;
} else if (len <= SCS_MEDIUM_SIZE) {
chunk = c->medium;
chunk = c->mate_medium;
len = SCS_MEDIUM_SIZE;
} else if (len <= SCS_LARGE_SIZE) {
chunk = c->large;
chunk = c->mate_large;
len = SCS_LARGE_SIZE;
} else if (len < SCS_HUGE_SIZE) {
chunk = c->mate_huge;
len = SCS_HUGE_SIZE;
} else {
chunk = c->mate_huge;
len = SCS_HUGE_SIZE;
g_warning("mate SCS: string truncated to huge size");
}
--len;
new = g_mem_chunk_alloc(chunk);
strncpy(new,s,len);
orig = g_mem_chunk_alloc(chunk);
strncpy(orig,s,len);
g_hash_table_insert(c->hash,new,ip);
g_hash_table_insert(c->hash,orig,ip);
}
return new;
return orig;
}
/**
@ -221,9 +219,9 @@ void scs_unsubscribe(SCS_collection* c, guint8* s) {
if (len < SCS_SMALL_SIZE) {
chunk = c->mate_small;
} else if (len < SCS_MEDIUM_SIZE) {
chunk = c->medium;
chunk = c->mate_medium;
} else if (len < SCS_LARGE_SIZE) {
chunk = c->large;
chunk = c->mate_large;
} else {
chunk = c->mate_huge;
}
@ -231,7 +229,9 @@ void scs_unsubscribe(SCS_collection* c, guint8* s) {
g_mem_chunk_free(chunk,orig);
g_mem_chunk_free(c->ctrs,ip);
}
else (*ip)--;
else {
(*ip)--;
}
} else {
g_warning("unsusbcribe: already deleted: '%s'?",s);
}
@ -248,14 +248,30 @@ void scs_unsubscribe(SCS_collection* c, guint8* s) {
**/
extern guint8* scs_subscribe_printf(SCS_collection* c, guint8* fmt, ...) {
va_list list;
static guint8 buf[SCS_HUGE_SIZE];
va_start( list, fmt );
g_vsnprintf(c->buf, SCS_HUGE_SIZE-1 ,fmt, list);
g_vsnprintf(buf, SCS_HUGE_SIZE-1 ,fmt, list);
va_end( list );
return scs_subscribe(c,c->buf);
return scs_subscribe(c,buf);
}
extern guint8* scs_subscribe_int(SCS_collection* c, int i) {
static guint8 buf[SCS_SMALL_SIZE];
g_snprintf(buf, SCS_SMALL_SIZE-1 ,"%i", i);
return scs_subscribe(c,buf);
}
extern guint8* scs_subscribe_float(SCS_collection* c, float f) {
static guint8 buf[SCS_SMALL_SIZE];
g_snprintf(buf, SCS_SMALL_SIZE-1 ,"%f", f);
return scs_subscribe(c,buf);
}
/***************************************************************************
* AVPs & Co.
@ -357,22 +373,21 @@ extern void avp_init(void) {
extern AVP* new_avp_from_finfo(guint8* name, field_info* finfo) {
AVP* new = g_mem_chunk_alloc(avp_chunk);
guint8* value;
guint8* str;
new->n = scs_subscribe(avp_strings, name);
if (finfo->value.ftype->get_value_integer) {
value = scs_subscribe_printf(avp_strings, "%i",fvalue_get_integer(&finfo->value));
value = scs_subscribe_int(avp_strings, fvalue_get_integer(&finfo->value));
#ifdef _AVP_DEBUGGING
dbg_print (dbg_avp,2,dbg_fp,"new_avp_from_finfo: from integer: %s",value);
#endif
} else if (finfo->value.ftype->val_to_string_repr) {
str = fvalue_to_string_repr(&finfo->value,FTREPR_DISPLAY,NULL);
value = scs_subscribe(avp_strings, str);
value = scs_subscribe(avp_strings, fvalue_to_string_repr(&finfo->value,FTREPR_DISPLAY,NULL));
#ifdef _AVP_DEBUGGING
dbg_print (dbg_avp,2,dbg_fp,"new_avp_from_finfo: from string: %s",value);
#endif
} else if (finfo->value.ftype->get_value_floating) {
value = scs_subscribe_printf(avp_strings, "%f",fvalue_get_floating(&finfo->value));
value = scs_subscribe_float(avp_strings, fvalue_get_floating(&finfo->value));
#ifdef _AVP_DEBUGGING
dbg_print (dbg_avp,2,dbg_fp,"new_avp_from_finfo: from float: %s",value);
#endif
@ -380,7 +395,7 @@ extern AVP* new_avp_from_finfo(guint8* name, field_info* finfo) {
#ifdef _AVP_DEBUGGING
dbg_print (dbg_avp,2,dbg_fp,"new_avp_from_finfo: a proto: %s",finfo->hfinfo->abbrev);
#endif
value = scs_subscribe(avp_strings, finfo->hfinfo->abbrev);
value = scs_subscribe(avp_strings, "");
}
new->v = value;
@ -1420,7 +1435,7 @@ extern AVPL_Transf* new_avpl_transform(guint8* name, AVPL* mixed, avpl_match_mod
while (( avp = extract_first_avp(mixed) )) {
if (*(avp->n) == '.') {
rename_avp(avp,(avp->n+1));
rename_avp(avp,((avp->n)+1));
insert_avp(t->replace, avp);
} else {
insert_avp(t->match, avp);
@ -1476,7 +1491,6 @@ extern void avpl_transform(AVPL* src, AVPL_Transf* op) {
AVPN* cs;
AVPN* cm;
AVPN* n;
gboolean d;
#ifdef _AVP_DEBUGGING
dbg_print(dbg_avpl_op,3,dbg_fp,"avpl_transform: src=%X op=%X",src,op);
@ -1498,9 +1512,8 @@ extern void avpl_transform(AVPL* src, AVPL_Transf* op) {
case AVPL_REPLACE:
cs = src->null.next;
cm = avpl->null.next;
d = FALSE;
while(cs->avp) {
if (cs->avp == cm->avp) {
if (cm->avp && cs->avp->n == cm->avp->n && cs->avp->v == cm->avp->v) {
n = cs->next;
cs->prev->next = cs->next;
@ -1514,7 +1527,7 @@ extern void avpl_transform(AVPL* src, AVPL_Transf* op) {
}
}
merge_avpl(src,avpl,TRUE);
merge_avpl(src,op->replace,TRUE);
delete_avpl(avpl,TRUE);
return;
}

View File

@ -1,7 +1,7 @@
# h225_ras.mate
# $Id$
Action=PduDef; Name=ras_pdu; Proto=h225.RasMessage; Transport=udp/ip; addr=ip.addr; ras_sn=h225.RequestSeqNum; ras_msg=h225.RasMessage;
Action=PduDef; Name=ras_pdu; Proto=h225.RasMessage; Transport=udp/ip; ras_sn=h225.RequestSeqNum; ras_msg=h225.RasMessage; addr=ip.addr;
Action=GopDef; Name=ras_leg; On=ras_pdu; addr; addr; ras_sn;
Action=GopStart; For=ras_leg; ras_msg|0|3|6|9|12|15|18|21|26|30;
Action=GopStop; For=ras_leg; ras_msg|1|2|4|5|7|8|10|11|13|14|16|17|19|20|22|24|27|28|29|31;

View File

@ -1,6 +1,7 @@
# isup.mate
# $Id$
#Action=Transform; Name=isup_msg_type; Mode=Insert; Match=Strict; isup_msg=1; .isup_IAM=;
#Action=Transform; Name=isup_msg_type; Mode=Insert; Match=Strict; isup_msg=2; .isup_SAM=;
#Action=Transform; Name=isup_msg_type; Mode=Insert; Match=Strict; isup_msg=3; .isup_INR=;
@ -21,3 +22,4 @@ Action=PduDef; Name=isup_pdu; Proto=isup; Transport=mtp3; mtp3pc=mtp3.dpc; mtp3p
Action=GopDef; Name=isup_leg; On=isup_pdu; ShowPduTree=TRUE; mtp3pc; mtp3pc; cic;
Action=GopStart; For=isup_leg; isup_msg=1;
Action=GopStop; For=isup_leg; isup_msg=16;

View File

@ -67,6 +67,8 @@ void mate_gop_tree(proto_tree* pdu_tree, tvbuff_t *tvb, mate_gop* gop);
void mate_gog_tree(proto_tree* tree, tvbuff_t *tvb, mate_gog* gog, mate_gop* gop) {
proto_item *gog_item;
proto_tree *gog_tree;
proto_item *gog_time_item;
proto_tree *gog_time_tree;
proto_item *gog_gop_item;
proto_tree *gog_gop_tree;
mate_gop* gog_gops;
@ -81,6 +83,14 @@ void mate_gog_tree(proto_tree* tree, tvbuff_t *tvb, mate_gog* gog, mate_gop* gop
attrs_tree(gog_tree,tvb,gog);
if (gog->cfg->show_times) {
gog_time_item = proto_tree_add_text(gog_tree,tvb,0,0,"%s Times",gog->cfg->name);
gog_time_tree = proto_item_add_subtree(gog_time_item, gog->cfg->ett_times);
proto_tree_add_float(gog_time_tree, gog->cfg->hfid_start_time, tvb, 0, 0, gog->start_time);
proto_tree_add_float(gog_time_tree, gog->cfg->hfid_last_time, tvb, 0, 0, gog->last_time - gog->start_time);
}
gog_gop_item = proto_tree_add_uint(gog_tree, gog->cfg->hfid_gog_num_of_gops,
tvb, 0, 0, gog->num_of_gops);
@ -115,17 +125,17 @@ void mate_gop_tree(proto_tree* tree, tvbuff_t *tvb, mate_gop* gop) {
attrs_tree(gop_tree,tvb,gop);
if (gop->cfg->show_gop_times) {
if (gop->cfg->show_times) {
gop_time_item = proto_tree_add_text(gop_tree,tvb,0,0,"%s Times",gop->cfg->name);
gop_time_tree = proto_item_add_subtree(gop_time_item, gop->cfg->ett_times);
proto_tree_add_float(gop_time_tree, gop->cfg->hfid_gop_start_time, tvb, 0, 0, gop->start_time);
proto_tree_add_float(gop_time_tree, gop->cfg->hfid_start_time, tvb, 0, 0, gop->start_time);
if (gop->released) {
proto_tree_add_float(gop_time_tree, gop->cfg->hfid_gop_stop_time, tvb, 0, 0, gop->release_time - gop->start_time);
proto_tree_add_float(gop_time_tree, gop->cfg->hfid_gop_last_time, tvb, 0, 0, gop->last_time - gop->start_time);
proto_tree_add_float(gop_time_tree, gop->cfg->hfid_stop_time, tvb, 0, 0, gop->release_time - gop->start_time);
proto_tree_add_float(gop_time_tree, gop->cfg->hfid_last_time, tvb, 0, 0, gop->last_time - gop->start_time);
} else {
proto_tree_add_float(gop_time_tree, gop->cfg->hfid_gop_last_time, tvb, 0, 0, gop->last_time - gop->start_time);
proto_tree_add_float(gop_time_tree, gop->cfg->hfid_last_time, tvb, 0, 0, gop->last_time - gop->start_time);
}
}
@ -212,7 +222,7 @@ extern void mate_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
mate_pdu* pdus;
proto_tree *mate_t;
if ( ! (tree && mc) ) return;
if ( ! mc || ! tree ) return;
analyze_frame(pinfo,tree);