2 * MATE -- Meta Analysis Tracing Engine
4 * Copyright 2004, Luis E. Garcia Ontanon <luis@ontanon.org>
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 /* the current mate_config */
28 static mate_config* matecfg = NULL;
30 /* appends the formatted string to the current error log */
31 static void report_error(const gchar* fmt, ...) {
32 static gchar error_buffer[DEBUG_BUFFER_SIZE];
36 va_start( list, fmt );
37 g_vsnprintf(error_buffer,DEBUG_BUFFER_SIZE,fmt,list);
40 g_string_append(matecfg->config_error,error_buffer);
41 g_string_append_c(matecfg->config_error,'\n');
45 /* creates a blank pdu config
46 is going to be called only by the grammar
47 which will set all those elements that aren't set here */
48 extern mate_cfg_pdu* new_pducfg(gchar* name) {
49 mate_cfg_pdu* cfg = (mate_cfg_pdu *)g_malloc(sizeof(mate_cfg_pdu));
51 cfg->name = g_strdup(name);
54 cfg->items = g_hash_table_new(g_direct_hash,g_direct_equal);
55 cfg->transforms = NULL;
59 cfg->hfid_pdu_rel_time = -1;
60 cfg->hfid_pdu_time_in_gop = -1;
62 cfg->my_hfids = g_hash_table_new(g_str_hash,g_str_equal);
67 cfg->criterium = NULL;
68 cfg->criterium_match_mode = AVPL_NO_MATCH;
69 cfg->criterium_accept_mode = ACCEPT_MODE;
71 g_ptr_array_add(matecfg->pducfglist,(gpointer) cfg);
72 g_hash_table_insert(matecfg->pducfgs,(gpointer) cfg->name,(gpointer) cfg);
74 cfg->hfids_attr = g_hash_table_new(g_int_hash,g_int_equal);
79 extern mate_cfg_gop* new_gopcfg(gchar* name) {
80 mate_cfg_gop* cfg = (mate_cfg_gop *)g_malloc(sizeof(mate_cfg_gop));
82 cfg->name = g_strdup(name);
85 cfg->items = g_hash_table_new(g_direct_hash,g_direct_equal);
86 cfg->transforms = NULL;
88 cfg->extra = new_avpl("extra");
95 cfg->ett_children = -1;
97 cfg->hfid_start_time = -1;
98 cfg->hfid_stop_time = -1;
99 cfg->hfid_last_time = -1;
101 cfg->hfid_gop_pdu = -1;
102 cfg->hfid_gop_num_pdus = -1;
104 cfg->my_hfids = g_hash_table_new(g_str_hash,g_str_equal);
106 cfg->gop_index = g_hash_table_new(g_str_hash,g_str_equal);
107 cfg->gog_index = g_hash_table_new(g_str_hash,g_str_equal);
109 g_hash_table_insert(matecfg->gopcfgs,(gpointer) cfg->name, (gpointer) cfg);
114 extern mate_cfg_gog* new_gogcfg(gchar* name) {
115 mate_cfg_gog* cfg = (mate_cfg_gog *)g_malloc(sizeof(mate_cfg_gop));
117 cfg->name = g_strdup(name);
120 cfg->items = g_hash_table_new(g_direct_hash,g_direct_equal);
121 cfg->transforms = NULL;
123 cfg->extra = new_avpl("extra");
125 cfg->my_hfids = g_hash_table_new(g_str_hash,g_str_equal);
131 cfg->ett_children = -1;
132 cfg->ett_gog_gop = -1;
134 cfg->hfid_gog_num_of_gops = -1;
135 cfg->hfid_gog_gop = -1;
136 cfg->hfid_gog_gopstart = -1;
137 cfg->hfid_gog_gopstop = -1;
139 cfg->hfid_start_time = -1;
140 cfg->hfid_stop_time = -1;
141 cfg->hfid_last_time = -1;
143 g_hash_table_insert(matecfg->gogcfgs,(gpointer) cfg->name, (gpointer) cfg);
148 extern gboolean add_hfid(header_field_info* hfi, gchar* how, GHashTable* where) {
149 header_field_info* first_hfi = NULL;
150 gboolean exists = FALSE;
157 hfi = (hfi->same_name_prev_id != -1) ? proto_registrar_get_nth(hfi->same_name_prev_id) : NULL;
164 ip = (int *)g_malloc(sizeof(int));
168 if (( as = (gchar *)g_hash_table_lookup(where,ip) )) {
170 if (! g_str_equal(as,how)) {
171 report_error("MATE Error: add field to Pdu: attempt to add %s(%i) as %s"
172 " failed: field already added as '%s'",hfi->abbrev,hfi->id,how,as);
177 g_hash_table_insert(where,ip,h);
180 hfi = hfi->same_name_next;
185 report_error("MATE Error: cannot find field for attribute %s",how);
192 * XXX - where is this suposed to be used?
194 extern gchar* add_ranges(gchar* range,GPtrArray* range_ptr_arr) {
197 header_field_info* hfi;
200 ranges = g_strsplit(range,"/",0);
203 for (i=0; ranges[i]; i++) {
204 hfi = proto_registrar_get_byname(ranges[i]);
206 hfidp = (int *)g_malloc(sizeof(int));
208 g_ptr_array_add(range_ptr_arr,(gpointer)hfidp);
209 g_string_append_printf(matecfg->fields_filter, "||%s",ranges[i]);
212 return g_strdup_printf("no such proto: '%s'",ranges[i]);
223 static void new_attr_hfri(gchar* item_name, GHashTable* hfids, gchar* name) {
224 int* p_id = (int *)g_malloc(sizeof(int));
225 hf_register_info hfri;
227 memset(&hfri, 0, sizeof hfri);
230 hfri.hfinfo.name = g_strdup(name);
231 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.%s",item_name,name);
232 hfri.hfinfo.type = FT_STRING;
233 hfri.hfinfo.display = BASE_NONE;
234 hfri.hfinfo.strings = NULL;
235 hfri.hfinfo.bitmask = 0;
236 hfri.hfinfo.blurb = g_strdup_printf("%s attribute of %s",name,item_name);
239 g_hash_table_insert(hfids,name,p_id);
240 g_array_append_val(matecfg->hfrs,hfri);
244 static const gchar* my_protoname(int proto_id) {
246 return proto_registrar_get_abbrev(proto_id);
252 static void analyze_pdu_hfids(gpointer k, gpointer v, gpointer p) {
253 mate_cfg_pdu* cfg = (mate_cfg_pdu *)p;
254 new_attr_hfri(cfg->name,cfg->my_hfids,(gchar*) v);
257 * Add this hfid to our table of hfids.
259 matecfg->wanted_fields = g_array_append_val(matecfg->wanted_fields, *(int *)k);
261 g_string_append_printf(matecfg->fields_filter,"||%s",my_protoname(*(int*)k));
264 static void analyze_transform_hfrs(gchar* name, GPtrArray* transforms, GHashTable* hfids) {
270 for (i=0; i < transforms->len;i++) {
271 for (t = (AVPL_Transf *)g_ptr_array_index(transforms,i); t; t=t->next ) {
273 while(( avp = get_next_avp(t->replace,&cookie) )) {
274 if (! g_hash_table_lookup(hfids,avp->n)) {
275 new_attr_hfri(name,hfids,avp->n);
282 static void analyze_pdu_config(mate_cfg_pdu* cfg) {
283 hf_register_info hfri = { NULL, {NULL, NULL, FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL}};
286 hfri.p_id = &(cfg->hfid);
287 hfri.hfinfo.name = g_strdup(cfg->name);
288 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s",cfg->name);
289 hfri.hfinfo.blurb = g_strdup_printf("%s id",cfg->name);
290 hfri.hfinfo.type = FT_UINT32;
291 hfri.hfinfo.display = BASE_DEC;
293 g_array_append_val(matecfg->hfrs,hfri);
295 hfri.p_id = &(cfg->hfid_pdu_rel_time);
296 hfri.hfinfo.name = g_strdup_printf("%s time",cfg->name);
297 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.RelativeTime",cfg->name);
298 hfri.hfinfo.type = FT_FLOAT;
299 hfri.hfinfo.display = BASE_NONE;
300 hfri.hfinfo.blurb = "Seconds passed since the start of capture";
302 g_array_append_val(matecfg->hfrs,hfri);
304 hfri.p_id = &(cfg->hfid_pdu_time_in_gop);
305 hfri.hfinfo.name = g_strdup_printf("%s time since beginning of Gop",cfg->name);
306 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.TimeInGop",cfg->name);
307 hfri.hfinfo.type = FT_FLOAT;
308 hfri.hfinfo.display = BASE_NONE;
309 hfri.hfinfo.blurb = "Seconds passed since the start of the GOP";
311 g_array_append_val(matecfg->hfrs,hfri);
313 g_hash_table_foreach(cfg->hfids_attr,analyze_pdu_hfids,cfg);
316 g_array_append_val(matecfg->ett,ett);
318 ett = &cfg->ett_attr;
319 g_array_append_val(matecfg->ett,ett);
321 analyze_transform_hfrs(cfg->name,cfg->transforms,cfg->my_hfids);
324 static void analyze_gop_config(gpointer k _U_, gpointer v, gpointer p _U_) {
325 mate_cfg_gop* cfg = (mate_cfg_gop *)v;
329 hf_register_info hfri = { NULL, {NULL, NULL, FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL}};
331 hfri.p_id = &(cfg->hfid);
332 hfri.hfinfo.name = g_strdup(cfg->name);
333 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s",cfg->name);
334 hfri.hfinfo.blurb = g_strdup_printf("%s id",cfg->name);
335 hfri.hfinfo.type = FT_UINT32;
336 hfri.hfinfo.display = BASE_DEC;
338 g_array_append_val(matecfg->hfrs,hfri);
340 hfri.p_id = &(cfg->hfid_start_time);
341 hfri.hfinfo.name = g_strdup_printf("%s start time",cfg->name);
342 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.StartTime",cfg->name);
343 hfri.hfinfo.type = FT_FLOAT;
344 hfri.hfinfo.display = BASE_NONE;
345 hfri.hfinfo.blurb = g_strdup_printf("Seconds passed since the beginning of capture to the start of this %s",cfg->name);
347 g_array_append_val(matecfg->hfrs,hfri);
349 hfri.p_id = &(cfg->hfid_stop_time);
350 hfri.hfinfo.name = g_strdup_printf("%s hold time",cfg->name);
351 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.Time",cfg->name);
352 hfri.hfinfo.blurb = g_strdup_printf("Duration in seconds from start to stop of this %s",cfg->name);
354 g_array_append_val(matecfg->hfrs,hfri);
356 hfri.p_id = &(cfg->hfid_last_time);
357 hfri.hfinfo.name = g_strdup_printf("%s duration",cfg->name);
358 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.Duration",cfg->name);
359 hfri.hfinfo.blurb = g_strdup_printf("Time passed between the start of this %s and the last pdu assigned to it",cfg->name);
361 g_array_append_val(matecfg->hfrs,hfri);
363 hfri.p_id = &(cfg->hfid_gop_num_pdus);
364 hfri.hfinfo.name = g_strdup_printf("%s number of PDUs",cfg->name);
365 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.NumOfPdus",cfg->name);
366 hfri.hfinfo.blurb = g_strdup_printf("Number of PDUs assigned to this %s",cfg->name);
367 hfri.hfinfo.type = FT_UINT32;
368 hfri.hfinfo.display = BASE_DEC;
370 g_array_append_val(matecfg->hfrs,hfri);
372 hfri.p_id = &(cfg->hfid_gop_pdu);
373 hfri.hfinfo.name = g_strdup_printf("A PDU of %s",cfg->name);
374 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.Pdu",cfg->name);
375 hfri.hfinfo.blurb = g_strdup_printf("A PDU assigned to this %s",cfg->name);
377 if (cfg->pdu_tree_mode == GOP_FRAME_TREE) {
378 hfri.hfinfo.type = FT_FRAMENUM;
379 hfri.hfinfo.display = BASE_NONE;
380 g_array_append_val(matecfg->hfrs,hfri);
381 } else if (cfg->pdu_tree_mode == GOP_PDU_TREE) {
382 hfri.hfinfo.type = FT_UINT32;
383 g_array_append_val(matecfg->hfrs,hfri);
385 cfg->pdu_tree_mode = GOP_NO_TREE;
388 while(( avp = get_next_avp(cfg->key,&cookie) )) {
389 if (! g_hash_table_lookup(cfg->my_hfids,avp->n)) {
390 new_attr_hfri(cfg->name,cfg->my_hfids,avp->n);
396 while(( avp = get_next_avp(cfg->start,&cookie) )) {
397 if (! g_hash_table_lookup(cfg->my_hfids,avp->n)) {
398 new_attr_hfri(cfg->name,cfg->my_hfids,avp->n);
405 while(( avp = get_next_avp(cfg->stop,&cookie) )) {
406 if (! g_hash_table_lookup(cfg->my_hfids,avp->n)) {
407 new_attr_hfri(cfg->name,cfg->my_hfids,avp->n);
413 while(( avp = get_next_avp(cfg->extra,&cookie) )) {
414 if (! g_hash_table_lookup(cfg->my_hfids,avp->n)) {
415 new_attr_hfri(cfg->name,cfg->my_hfids,avp->n);
419 analyze_transform_hfrs(cfg->name,cfg->transforms,cfg->my_hfids);
422 g_array_append_val(matecfg->ett,ett);
424 ett = &cfg->ett_attr;
425 g_array_append_val(matecfg->ett,ett);
427 ett = &cfg->ett_times;
428 g_array_append_val(matecfg->ett,ett);
430 ett = &cfg->ett_children;
431 g_array_append_val(matecfg->ett,ett);
433 g_hash_table_insert(matecfg->gops_by_pduname,cfg->name,cfg);
436 static void analyze_gog_config(gpointer k _U_, gpointer v, gpointer p _U_) {
437 mate_cfg_gog* cfg = (mate_cfg_gog *)v;
444 LoAL* gog_keys = NULL;
445 hf_register_info hfri = { NULL, {NULL, NULL, FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL}};
448 /* create the hf array for this gog */
449 hfri.p_id = &(cfg->hfid);
450 hfri.hfinfo.name = g_strdup(cfg->name);
451 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s",cfg->name);
452 hfri.hfinfo.blurb = g_strdup_printf("%s Id",cfg->name);
453 hfri.hfinfo.type = FT_UINT32;
454 hfri.hfinfo.display = BASE_DEC;
456 g_array_append_val(matecfg->hfrs,hfri);
458 hfri.p_id = &(cfg->hfid_gog_num_of_gops);
459 hfri.hfinfo.name = "number of GOPs";
460 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.NumOfGops",cfg->name);
461 hfri.hfinfo.type = FT_UINT32;
462 hfri.hfinfo.display = BASE_DEC;
463 hfri.hfinfo.blurb = g_strdup_printf("Number of GOPs assigned to this %s",cfg->name);
465 g_array_append_val(matecfg->hfrs,hfri);
467 hfri.p_id = &(cfg->hfid_gog_gopstart);
468 hfri.hfinfo.name = "GopStart frame";
469 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.GopStart",cfg->name);
470 hfri.hfinfo.type = FT_FRAMENUM;
471 hfri.hfinfo.display = BASE_NONE;
472 hfri.hfinfo.blurb = g_strdup("The start frame of a GOP");
474 g_array_append_val(matecfg->hfrs,hfri);
476 hfri.p_id = &(cfg->hfid_gog_gopstop);
477 hfri.hfinfo.name = "GopStop frame";
478 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.GopStop",cfg->name);
479 hfri.hfinfo.type = FT_FRAMENUM;
480 hfri.hfinfo.display = BASE_NONE;
481 hfri.hfinfo.blurb = g_strdup("The stop frame of a GOP");
483 g_array_append_val(matecfg->hfrs,hfri);
485 hfri.p_id = &(cfg->hfid_start_time);
486 hfri.hfinfo.name = g_strdup_printf("%s start time",cfg->name);
487 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.StartTime",cfg->name);
488 hfri.hfinfo.type = FT_FLOAT;
489 hfri.hfinfo.blurb = g_strdup_printf("Seconds passed since the beginning of capture to the start of this %s",cfg->name);
491 g_array_append_val(matecfg->hfrs,hfri);
493 hfri.p_id = &(cfg->hfid_last_time);
494 hfri.hfinfo.name = g_strdup_printf("%s duration",cfg->name);
495 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.Duration",cfg->name);
496 hfri.hfinfo.blurb = g_strdup_printf("Time passed between the start of this %s and the last pdu assigned to it",cfg->name);
498 g_array_append_val(matecfg->hfrs,hfri);
500 /* this might become mate.gogname.gopname */
501 hfri.p_id = &(cfg->hfid_gog_gop);
502 hfri.hfinfo.name = "a GOP";
503 hfri.hfinfo.abbrev = g_strdup_printf("mate.%s.Gop",cfg->name);
504 hfri.hfinfo.type = FT_STRING;
505 hfri.hfinfo.display = BASE_NONE;
506 hfri.hfinfo.blurb = g_strdup_printf("a GOPs assigned to this %s",cfg->name);
508 g_array_append_val(matecfg->hfrs,hfri);
510 /* index the keys of gog for every gop
511 and insert the avps of the keys to the hfarray */
512 key_avps = new_avpl("");
515 while (( avpl = get_next_avpl(cfg->keys,&avpl_cookie) )) {
517 if (! ( gog_keys = (LoAL *)g_hash_table_lookup(matecfg->gogs_by_gopname,avpl->name))) {
518 gog_keys = new_loal(avpl->name);
519 g_hash_table_insert(matecfg->gogs_by_gopname,gog_keys->name,gog_keys);
522 gopkey_avpl = new_avpl_from_avpl(cfg->name, avpl, TRUE);
523 loal_append(gog_keys,gopkey_avpl);
526 while (( avp = get_next_avp(avpl,&avp_cookie) )) {
527 if (! g_hash_table_lookup(cfg->my_hfids,avp->n)) {
528 new_attr_hfri(cfg->name,cfg->my_hfids,avp->n);
529 insert_avp(key_avps,avp);
534 /* insert the extra avps to the hfarray */
536 while (( avp = get_next_avp(cfg->extra,&avp_cookie) )) {
537 if (! g_hash_table_lookup(cfg->my_hfids,avp->n)) {
538 new_attr_hfri(cfg->name,cfg->my_hfids,avp->n);
542 /* every key_avp ios an extra as well.
543 one day every Member will have its own extras */
544 merge_avpl(cfg->extra,key_avps,TRUE);
547 analyze_transform_hfrs(cfg->name,cfg->transforms,cfg->my_hfids);
550 g_array_append_val(matecfg->ett,ett);
552 ett = &cfg->ett_attr;
553 g_array_append_val(matecfg->ett,ett);
555 ett = &cfg->ett_children;
556 g_array_append_val(matecfg->ett,ett);
558 ett = &cfg->ett_times;
559 g_array_append_val(matecfg->ett,ett);
561 ett = &cfg->ett_gog_gop;
562 g_array_append_val(matecfg->ett,ett);
566 static void analyze_config(void) {
569 for (i=0; i < matecfg->pducfglist->len; i++) {
570 analyze_pdu_config((mate_cfg_pdu*) g_ptr_array_index(matecfg->pducfglist,i));
573 g_hash_table_foreach(matecfg->gopcfgs,analyze_gop_config,matecfg);
574 g_hash_table_foreach(matecfg->gogcfgs,analyze_gog_config,matecfg);
578 extern mate_config* mate_cfg(void) {
582 extern mate_config* mate_make_config(const gchar* filename, int mate_hfid) {
586 matecfg = (mate_config *)g_malloc(sizeof(mate_config));
588 matecfg->hfid_mate = mate_hfid;
590 matecfg->wanted_fields = g_array_new(FALSE, FALSE, (guint)sizeof(int));
592 matecfg->fields_filter = g_string_new("");
593 matecfg->protos_filter = g_string_new("");
595 matecfg->dbg_facility = NULL;
597 matecfg->mate_lib_path = g_strdup_printf("%s%c%s%c",get_datafile_dir(),DIR_SEP,DEFAULT_MATE_LIB_PATH,DIR_SEP);
599 matecfg->pducfgs = g_hash_table_new(g_str_hash,g_str_equal);
600 matecfg->gopcfgs = g_hash_table_new(g_str_hash,g_str_equal);
601 matecfg->gogcfgs = g_hash_table_new(g_str_hash,g_str_equal);
602 matecfg->transfs = g_hash_table_new(g_str_hash,g_str_equal);
604 matecfg->pducfglist = g_ptr_array_new();
605 matecfg->gops_by_pduname = g_hash_table_new(g_str_hash,g_str_equal);
606 matecfg->gogs_by_gopname = g_hash_table_new(g_str_hash,g_str_equal);
608 matecfg->ett_root = -1;
610 matecfg->hfrs = g_array_new(FALSE,FALSE,sizeof(hf_register_info));
611 matecfg->ett = g_array_new(FALSE,FALSE,sizeof(gint*));
613 matecfg->defaults.pdu.drop_unassigned = FALSE;
614 matecfg->defaults.pdu.discard = FALSE;
615 matecfg->defaults.pdu.last_extracted = FALSE;
616 matecfg->defaults.pdu.match_mode = AVPL_STRICT;
617 matecfg->defaults.pdu.replace_mode = AVPL_INSERT;
620 matecfg->defaults.gop.expiration = -1.0f;
621 matecfg->defaults.gop.idle_timeout = -1.0f;
622 matecfg->defaults.gop.lifetime = -1.0f;
623 matecfg->defaults.gop.pdu_tree_mode = GOP_FRAME_TREE;
624 matecfg->defaults.gop.show_times = TRUE;
625 matecfg->defaults.gop.drop_unassigned = FALSE;
628 matecfg->defaults.gog.expiration = 5.0f;
629 matecfg->defaults.gog.show_times = TRUE;
630 matecfg->defaults.gog.gop_tree_mode = GOP_BASIC_TREE;
632 /* what to dbgprint */
633 matecfg->dbg_lvl = 0;
634 matecfg->dbg_pdu_lvl = 0;
635 matecfg->dbg_gop_lvl = 0;
636 matecfg->dbg_gog_lvl = 0;
638 matecfg->config_error = g_string_new("");
640 ett = &matecfg->ett_root;
641 g_array_append_val(matecfg->ett,ett);
643 if ( mate_load_config(filename,matecfg) ) {
646 report_failure("MATE failed to configure!\n"
647 "It is recommended that you fix your config and restart Wireshark.\n"
648 "The reported error is:\n%s\n",matecfg->config_error->str);
650 /* if (matecfg) destroy_mate_config(matecfg,FALSE); */
655 if (matecfg->fields_filter->len > 1) {
656 g_string_erase(matecfg->fields_filter,0,2);
657 g_string_erase(matecfg->protos_filter,0,2);
659 /*destroy_mate_config(matecfg,FALSE);*/
664 matecfg->tap_filter = g_strdup_printf("(%s) && (%s)",matecfg->protos_filter->str,matecfg->fields_filter->str);
670 * Editor modelines - http://www.wireshark.org/tools/modelines.html
675 * indent-tabs-mode: t
678 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
679 * :indentSize=8:tabSize=8:noTabs=false: