wslua: Port make-taps to Python3

Port the script that creates taps_wslua.c and taps.txt to Python3. The
generated taps_wslua.c has one less newline, otherwise the output is
identical to the Perl version. Make the "taps" configuration file an
ConfigParser / .ini file.
Ping #18152.
This commit is contained in:
Gerald Combs 2022-06-25 20:11:45 -07:00
parent dac75fba7f
commit ae3010cabe
6 changed files with 436 additions and 301 deletions

View File

@ -190,7 +190,7 @@ probably isn't. There is even a third model in use: pre-loading the member
fields of the class table with the values, instead of waiting for the Lua
script to access a particular one to retrieve it; for example the Listener tap
extractors table is pre-populated (see files 'wslua_listener.c' and 'taps'
which through the make-taps.pl perl script creates 'taps_wslua.c'). The
which through the make-taps.py Python3 script creates 'taps_wslua.c'). The
downside of that approach is the performance impact, filling fields the Lua
script may never access. Lastly, the Field, FieldInfo, and Tvb's ByteArray
type each provide a __call metamethod as an accessor - I strongly suggest you
@ -258,15 +258,14 @@ The Listener object is one of the more complicated ones. When the Lua script
creates a Listener (using Listener.new()), the code creates and returns a tap
object. The type of tap is based on the passed-in argument to Listener.new(),
and it creates a Lua table of the tap member variables. That happens in
taps_wslua.c, which is an auto-generated file from make-taps.pl. That Perl
script reads from a file called 'taps', which identifies every struct name
(and associated enum name) that should be exposed as a tap type. The Perl
taps_wslua.c, which is an auto-generated file from make-taps.py. That Python3
script reads from a file called 'taps.ini', which identifies every struct name
(and associated enum name) that should be exposed as a tap type. The Python3
script then generates the taps_wslua.c to push those whenever the Listener
calls for a tap; and it also generates a taps.tx file documenting them all.
So to add a new type, add the info to the taps file (or uncomment an existing
one), and make sure every member of the tap struct you're exposing is of a
type that make-taps.pl has in its Perl %types and %comments associative
arrays.
type that make-taps.py has in its Python "types" and "comments" dictionaries.
Note on Lua versions:

View File

@ -54,7 +54,7 @@ set_source_files_properties(
COMPILE_FLAGS "${WERROR_COMMON_FLAGS}"
)
# make-taps.pl depends on the current working directory
# make-taps.py depends on the current working directory
# to find the dissector files (contents of taps file
# depend on this actually, so just changing the paths
# in these lists won't help).
@ -71,18 +71,17 @@ set(WSLUA_TAPS_USED
add_custom_command(
OUTPUT
${CMAKE_BINARY_DIR}/epan/wslua/taps_wslua.c
# XXX taps.txt doesn't appear to be used anywhere.
${CMAKE_BINARY_DIR}/epan/wslua/taps.txt
COMMAND
${PERL_EXECUTABLE}
${CMAKE_SOURCE_DIR}/epan/wslua/make-taps.pl
${CMAKE_SOURCE_DIR}/epan/wslua/taps
${PYTHON_EXECUTABLE}
${CMAKE_SOURCE_DIR}/epan/wslua/make-taps.py
${CMAKE_BINARY_DIR}/epan/wslua/taps_wslua.c
${CMAKE_BINARY_DIR}/epan/wslua/taps.txt
${CMAKE_SOURCE_DIR}/epan/wslua
DEPENDS
${CMAKE_SOURCE_DIR}/epan/wslua/taps
${CMAKE_SOURCE_DIR}/epan/wslua/make-taps.pl
# Only here to add dependencies for the taps "source"files
${CMAKE_SOURCE_DIR}/epan/wslua/taps.ini
${CMAKE_SOURCE_DIR}/epan/wslua/make-taps.py
# Only here to add dependencies for the taps "source" files
${WSLUA_TAPS_USED}
)

View File

@ -1,222 +0,0 @@
#!/usr/bin/perl
#
# make-taps.pl
# Extract structs from C headers to generate a function that
# pushes a lua table into the stack containing the elements of
# the struct.
#
# (c) 2006 Luis E. Garcia Ontanon <luis@ontanon.org>
#
# Wireshark - Network traffic analyzer
# By Gerald Combs <gerald@wireshark.org>
# Copyright 2006 Gerald Combs
#
# SPDX-License-Identifier: GPL-2.0-or-later
use strict;
use warnings;
my %types = %{{
'gchar[]' => 'lua_pushstring(L,(const char*)v->STR);',
'gchar*' => 'lua_pushstring(L,(const char*)v->STR);',
'guint' => 'lua_pushnumber(L,(lua_Number)v->STR);',
'guint8' => 'lua_pushnumber(L,(lua_Number)v->STR);',
'guint16' => 'lua_pushnumber(L,(lua_Number)v->STR);',
'guint32' => 'lua_pushnumber(L,(lua_Number)v->STR);',
'gint' => 'lua_pushnumber(L,(lua_Number)v->STR);',
'gint8' => 'lua_pushnumber(L,(lua_Number)v->STR);',
'gint16' => 'lua_pushnumber(L,(lua_Number)v->STR);',
'gint32' => 'lua_pushnumber(L,(lua_Number)v->STR);',
'gboolean' => 'lua_pushboolean(L,(int)v->STR);',
'address' => '{ Address a = (Address)g_malloc(sizeof(address)); copy_address(a, &(v->STR)); pushAddress(L,a); }',
'address*' => '{ Address a = (Address)g_malloc(sizeof(address)); copy_address(a, v->STR); pushAddress(L,a); }',
'int' => 'lua_pushnumber(L,(lua_Number)v->STR);',
'nstime_t' => 'lua_pushnumber(L,(lua_Number)nstime_to_sec(&(v->STR)));',
'nstime_t*' => 'lua_pushnumber(L,(lua_Number)nstime_to_sec(v->STR));'
}};
my %comments = %{{
'gchar[]' => 'string',
'gchar*' => 'string',
'guint' => 'number',
'guint8' => 'number',
'guint16' => 'number',
'guint32' => 'number',
'gint' => 'number',
'gint8' => 'number',
'gint16' => 'number',
'gint32' => 'number',
'gboolean' => 'boolean',
'address' => 'Address',
'address*' => 'Address',
'int' => 'number',
'nstime_t' => 'number (seconds, since 1-1-1970 if absolute)',
'nstime_t*' => 'number (seconds, since 1-1-1970 if absolute)',
}};
my %functs = ();
my %enums = ();
sub dotap {
my ($tname,$fname,$sname,@enums) = @_;
my $buf = '';
open FILE, "< $fname";
while(<FILE>) {
$buf .= $_;
}
close FILE;
$buf =~ s@/\*.*?\*/@@;
for my $ename (@enums) {
$enums{$ename} = [];
my $a = $enums{$ename};
my $enumre = "typedef\\s+enum[^{]*{([^}]*)}[\\s\\n]*" . ${ename} . "[\\s\\n]*;";
if ($buf =~ s/$enumre//ms ) {
$types{$ename} = "lua_pushnumber(L,(lua_Number)v->STR); /* $ename */";
my $ebody = $1;
$ebody =~ s/\s+//msg;
$comments{$ename} = "$ename: { $ebody }";
$comments{$ename} =~ s/,/|/g;
for (split /,/, $ebody) {
push @{$a}, $_;
}
}
}
my $re = "typedef\\s+struct.*?{([^}]*)}[\\s\\n]*($sname)[\\s\\n]*;";
my $body;
while ($buf =~ s/$re//ms) {
$body = $1;
}
die "could not find typedef $sname in $fname" if not defined $body and $sname ne "void";
my %elems = ();
while($body =~ s/\s*(.*?)([\w\d_]+)\s*\[\s*\d+\s*\]\s*;//) {
my ($k,$v) = ($2,$1 . "[]");
$v =~ s/const //g;
$v =~ s/\s+//g;
$elems{$k} = $v;
}
while($body =~ s/\s*(.*?)([\w\d_]+)\s*;//) {
my ($k,$v) = ($2,$1);
$v =~ s/const //g;
$v =~ s/\s+//g;
$elems{$k} = $v;
}
my $code = "static void wslua_${tname}_to_table(lua_State* L, const void* p) {\n\tconst $sname* v;\n\n\tv = (const $sname*)p;\n\tlua_newtable(L);\n\n";
my $doc = "Tap: $tname\n";
for my $n (sort keys %elems) {
my $fmt = $types{$elems{$n}};
my $lua_type;
if ($fmt) {
$code .= "\tlua_pushstring(L,\"$n\");\n\t";
($lua_type = $fmt) =~ s/\bSTR\b/$n/g;
$code .= $lua_type;
$code .= "\n\tlua_settable(L,-3);\n";
$doc .= "\t$n: $comments{$elems{$n}}\n";
}
}
$code .= "}\n\n";
$doc .= "\n";
$functs{$tname} = "wslua_${tname}_to_table";
return ($code,$doc);
}
open TAPSFILE, "< $ARGV[0]";
open CFILE, "> $ARGV[1]";
open DOCFILE, "> $ARGV[2]";
my $srcdir = $ARGV[3];
print CFILE <<"HEADER";
/* This file is autogenerated from ./taps by ./make-taps.pl */
/* DO NOT EDIT! */
#include "config.h"
#include "wslua.h"
#include <wsutil/nstime.h>
HEADER
print DOCFILE "\n";
while (<TAPSFILE>) {
s@#.*@@;
next if /^\s*$/;
my ($tname,$fname,$sname,@enums) = split /\s+/;
my ($c,$doc) = dotap($tname,$srcdir . "/" . $fname,$sname,@enums);
print CFILE "#include \"$fname\"\n";
print CFILE $c;
print DOCFILE $doc;
}
print CFILE <<"TBLHDR";
static tappable_t tappables[] = {
TBLHDR
for my $tname (sort keys %functs) {
print CFILE <<"TBLELEM";
{"$tname", $functs{$tname} },
TBLELEM
}
print CFILE <<"TBLFTR";
{"frame",NULL},
{NULL,NULL}
};
int wslua_set_tap_enums(lua_State* L) {
TBLFTR
for my $ename (sort keys %enums) {
print CFILE "\n\t/*\n\t * $ename\n\t */\n\tlua_newtable(L);\n";
for my $a (@{$enums{$ename}}) {
print CFILE <<"ENUMELEM";
lua_pushnumber(L,(lua_Number)$a);
lua_setglobal(L,"$a");
lua_pushnumber(L,(lua_Number)$a);
lua_pushstring(L,"$a");
lua_settable(L,-3);
ENUMELEM
}
print CFILE "\tlua_setglobal(L,\"$ename\");\n";
}
print CFILE <<"TAIL";
return 0;
}
tap_extractor_t wslua_get_tap_extractor(const gchar* name) {
tappable_t* t;
for(t = tappables; t->name; t++ ) {
if (g_str_equal(t->name,name)) return t->extractor;
}
return NULL;
}
TAIL
exit 0;

215
epan/wslua/make-taps.py Executable file
View File

@ -0,0 +1,215 @@
#!/usr/bin/env python3
#
# make-taps.py
#
# By Gerald Combs <gerald@wireshark.org>
# Based on make-taps.pl by Luis E. Garcia Onatnon <luis.ontanon@gmail.com>
#
# Wireshark - Network traffic analyzer
# By Gerald Combs <gerald@wireshark.org>
# Copyright 1998 Gerald Combs
#
# SPDX-License-Identifier: GPL-2.0-or-later
'''\
Extract structs from C headers to generate a function that pushes a lua table
into the stack containing the elements of the struct.
'''
import argparse
import configparser
import os
import re
import sys
this_dir = os.path.dirname(__file__)
def get_tap_info(tap_name, header_file, struct_name, enum_types):
code = f'#include "{header_file}"\n'
doc = f'Tap: {tap_name}\n'
enums = {}
buf = ''
types = {
'gchar[]': 'lua_pushstring(L,(const char*)v->STR);',
'gchar*': 'lua_pushstring(L,(const char*)v->STR);',
'guint': 'lua_pushnumber(L,(lua_Number)v->STR);',
'guint8': 'lua_pushnumber(L,(lua_Number)v->STR);',
'guint16': 'lua_pushnumber(L,(lua_Number)v->STR);',
'guint32': 'lua_pushnumber(L,(lua_Number)v->STR);',
'gint': 'lua_pushnumber(L,(lua_Number)v->STR);',
'gint8': 'lua_pushnumber(L,(lua_Number)v->STR);',
'gint16': 'lua_pushnumber(L,(lua_Number)v->STR);',
'gint32': 'lua_pushnumber(L,(lua_Number)v->STR);',
'gboolean': 'lua_pushboolean(L,(int)v->STR);',
'address': '{ Address a = (Address)g_malloc(sizeof(address)); copy_address(a, &(v->STR)); pushAddress(L,a); }',
'address*': '{ Address a = (Address)g_malloc(sizeof(address)); copy_address(a, v->STR); pushAddress(L,a); }',
'int': 'lua_pushnumber(L,(lua_Number)v->STR);',
'nstime_t': 'lua_pushnumber(L,(lua_Number)nstime_to_sec(&(v->STR)));',
'nstime_t*': 'lua_pushnumber(L,(lua_Number)nstime_to_sec(v->STR));',
}
comments = {
'gchar[]': 'string',
'gchar*': 'string',
'guint': 'number',
'guint8': 'number',
'guint16': 'number',
'guint32': 'number',
'gint': 'number',
'gint8': 'number',
'gint16': 'number',
'gint32': 'number',
'gboolean': 'boolean',
'address': 'Address',
'address*': 'Address',
'int': 'number',
'nstime_t': 'number (seconds, since 1-1-1970 if absolute)',
'nstime_t*': 'number (seconds, since 1-1-1970 if absolute)',
}
with open(os.path.join(this_dir, header_file), encoding='utf-8') as header_f:
for line in header_f:
# Remove comments
line = re.sub(r'\/\*.*?\*/', '', line)
line = re.sub(r'//.*', '', line)
buf += line
for enum in enum_types:
m = re.search(fr'typedef\s+enum[^{{]*{{([^}}]*)}}[\s\n]*{enum}[\s\n]*;', buf, flags=re.DOTALL)
if m:
types[enum] = f'lua_pushnumber(L,(lua_Number)v->STR); /* {enum} */'
econsts = m.group(1).splitlines()
econsts = [re.sub('\s+', '', item) for item in econsts]
econsts = [re.sub(',', '', item) for item in econsts]
econsts = [item for item in econsts if item]
enums[enum] = econsts
ebody = '|'.join(econsts)
comments[enum] = f'{enum}: {{ {ebody} }}'
m = re.search(fr'typedef\s+struct.*?{{([^}}]*)}}[\s\n]*({struct_name})[\s\n]*;', buf, flags=re.DOTALL)
if not m:
sys.stderr.write(f'could not find typedef {struct_name} in {header_file}')
sys.exit(1)
body = m.group(1)
elems = {}
for line in body.splitlines():
k = None
v = None
m = re.search(r'\s*(.*?)([\w\d_]+)\s*\[\s*\d+\s*\]\s*;', line)
if m:
k = m.group(2)
v = m.group(1)
v += '[]'
m = re.search(r'\s*(.*?)([\w\d_]+)\s*;', line)
if m:
k = m.group(2)
v = m.group(1)
if v and k:
v = re.sub(r'const ', '', v)
v = re.sub(r'\s+', '', v)
elems[k] = v
code += f'static void wslua_{tap_name}_to_table(lua_State* L, const void* p) {{\n\tconst {struct_name}* v;\n\n\tv = (const {struct_name}*)p;\n\tlua_newtable(L);\n\n'
for el in sorted(elems):
try:
fmt = types[elems[el]]
code += f'\tlua_pushstring(L,\"{el}\");\n\t'
lua_type = re.sub(r'\bSTR\b', el, fmt)
code += lua_type
code += '\n\tlua_settable(L,-3);\n'
doc += f'\t{el}: {comments[elems[el]]}\n'
except KeyError:
pass
code += "}\n\n"
doc += "\n"
return (code, doc, enums)
def main():
parser = argparse.ArgumentParser(description="Generate bindings required for Lua taps.")
parser.add_argument("out_c", metavar='C file', help="output C file")
parser.add_argument("out_doc", metavar='documentation file', help="output text file")
args = parser.parse_args()
tap_config = configparser.ConfigParser()
tap_config.read(os.path.join(this_dir, 'taps.ini'))
enums = {}
c_body = '''\
/* This file is autogenerated from ./taps by ./make-taps.py */
/* DO NOT EDIT! */
#include "config.h"
#include "wslua.h"
#include <wsutil/nstime.h>
'''
doc_body = '\n'
for tap_name in tap_config.sections():
tap_d = tap_config[tap_name]
enum_types = []
if 'enum_types' in tap_d.keys():
enum_types = tap_d['enum_types'].split(' ')
(code, doc, file_enums) = get_tap_info(tap_name, tap_d['header_file'], tap_d['struct_name'], enum_types)
c_body += code
doc_body += doc
enums.update(file_enums)
c_body += 'static tappable_t tappables[] = {\n'
for tap_name in sorted(tap_config.sections()):
c_body += f'\t{{"{tap_name}", wslua_{tap_name}_to_table }},\n'
c_body += '''\
{"frame",NULL},
{NULL,NULL}
};
'''
c_body += '\nint wslua_set_tap_enums(lua_State* L) {\n'
for enum in sorted(enums):
c_body += f'\n\t/*\n\t * {enum}\n\t */\n\tlua_newtable(L);\n'
for econst in enums[enum]:
c_body += f'''\
lua_pushnumber(L,(lua_Number){econst});
lua_setglobal(L,"{econst}");
lua_pushnumber(L,(lua_Number){econst});
lua_pushstring(L,"{econst}");
lua_settable(L,-3);
'''
c_body += f'\tlua_setglobal(L,\"{enum}\");\n'
c_body += '\treturn 0;\n}\n'
c_body += '''\
tap_extractor_t wslua_get_tap_extractor(const gchar* name) {
tappable_t* t;
for(t = tappables; t->name; t++ ) {
if (g_str_equal(t->name,name)) return t->extractor;
}
return NULL;
}
'''
with open(args.out_c, mode='w', encoding='utf-8') as out_c_f:
out_c_f.write(c_body)
with open(args.out_doc, mode='w', encoding='utf-8') as out_doc_f:
out_doc_f.write(doc_body)
if __name__ == '__main__':
main()

View File

@ -1,65 +0,0 @@
# taps
# instructions for make-taps.pl to generate the taps.c file
#
# (c) 2006 Luis E. Garcia Ontanon <luis@ontanon.org>
#
# Wireshark - Network traffic analyzer
# By Gerald Combs <gerald@wireshark.org>
# Copyright 2006 Gerald Combs
#
# SPDX-License-Identifier: GPL-2.0-or-later
# Each line is a tap type (the data structure passed by dissectors).
# Elements are separated by whitespace.
# tapname source_file_for_struct typedef_name_of_struct an_enum_name another_enum_name ...
#
#frame ../dissectors/packet_frame.h void
ip ../dissectors/packet-ip.h ws_ip4
udp ../dissectors/packet-udp.h e_udphdr
http ../dissectors/packet-http.h http_info_value_t
# BACnet statistics
bacapp ../dissectors/packet-bacapp.h bacapp_info_value_t
h225 ../dissectors/packet-h225.h h225_packet_info h225_msg_type h225_cs_type
actrace ../dissectors/packet-actrace.h actrace_info_t
#afp ../dissectors/packet-afp.h
ansi_a ../dissectors/packet-ansi_a.h ansi_a_tap_rec_t
ansi_map ../dissectors/packet-ansi_map.h ansi_map_tap_rec_t
#bootp ../dissectors/packet-bootp.h bootp_info_t
#dcerpc ../dissectors/packet-dcerpc.h dcerpc_info_t
#dccp ../dissectors/packet-dccp.h dccp_info_t
#dtls ../dissectors/packet-dtls.h dtls_info_t
#epl ../dissectors/packet-epl.h epl_info_t
eth ../dissectors/packet-eth.h eth_hdr
#fc ../dissectors/packet-fc.h fc_hdr
#gsm_a ../dissectors/packet-gsm_a.h gsm_a_info_t
#gsm_map ../dissectors/packet-gsm_map.h gsm_map_info_t
#h245 ../dissectors/packet-h245.h h245_info_t
#h245dg ../dissectors/packet-h245dg.h h245dg_info_t
#ipx ../dissectors/packet-ipx.h ipx_info_t
#isup ../dissectors/packet-isup.h isup_info_t
#jxta ../dissectors/packet-jxta.h jxta_info_t
ldap ../dissectors/packet-ldap.h ldap_call_response_t
#mtp3 ../dissectors/packet-mtp3.h mtp3_info_t
#ncp_srt ../dissectors/packet-ncp_srt.h ncp_srt_info_t
#ncp_hdr ../dissectors/packet-ncp_hdr.h ncp_hdr_info_t
#ntlmssp ../dissectors/packet-ntlmssp.h ntlmssp_info_t
#q931 ../dissectors/packet-q931.h q931_info_t
#rpc ../dissectors/packet-rpc.h rpc_info_t
#rsvp ../dissectors/packet-rsvp.h rsvp_info_t
#rtpevent ../dissectors/packet-rtpevent.h rtpevent_info_t
#rtp ../dissectors/packet-rtp.h rtp_info_t
#scsi ../dissectors/packet-scsi.h scsi_info_t
#sctp ../dissectors/packet-sctp.h sctp_info_t
#sdp ../dissectors/packet-sdp.h sdp_info_t
#sip ../dissectors/packet-sip.h sip_info_t
smb ../dissectors/packet-smb.h smb_info_t
smb2 ../dissectors/packet-smb2.h smb2_info_t
#t38 ../dissectors/packet-t38.h t38_info_t
tcp ../dissectors/packet-tcp.h tcp_info_t
#teredo ../dissectors/packet-teredo.h teredo_info_t
#tls ../dissectors/packet-tls.h ssl_info_t
#tr ../dissectors/packet-tr.h tr_info_t
wlan ../dissectors/packet-ieee80211.h wlan_hdr_t
#wsp ../dissectors/packet-wsp.h wsp_info_t

209
epan/wslua/taps.ini Normal file
View File

@ -0,0 +1,209 @@
# taps.ini
# Instructions for make-taps.py to generate the taps.c file.
# Based on the "taps" configuration file for make-taps.pl
#
# (c) 2006 Luis E. Garcia Ontanon <luis@ontanon.org>
#
# Wireshark - Network traffic analyzer
# By Gerald Combs <gerald@wireshark.org>
# Copyright 2006 Gerald Combs
#
# SPDX-License-Identifier: GPL-2.0-or-later
# Each section is a tap type (the data structure passed by dissectors).
# Sections have the following format:
# [tapname]
# header_file: <path to dissector header>
# struct_name: <name of struct typedef>
# enum_types: <space-separated list of enum types, optional>
# [frame]
# header_file: ../dissectors/packet_frame.h
# struct_name: void
[ip]
header_file: ../dissectors/packet-ip.h
struct_name: ws_ip4
[udp]
header_file: ../dissectors/packet-udp.h
struct_name: e_udphdr
[http]
header_file: ../dissectors/packet-http.h
struct_name: http_info_value_t
# BACnet statistics
[bacapp]
header_file: ../dissectors/packet-bacapp.h
struct_name: bacapp_info_value_t
[h225]
header_file: ../dissectors/packet-h225.h
struct_name: h225_packet_info
enum_types: h225_msg_type h225_cs_type
[actrace]
header_file: ../dissectors/packet-actrace.h
struct_name: actrace_info_t
# [afp]
# header_file: ../dissectors/packet-afp.h
# struct_name:
[ansi_a]
header_file: ../dissectors/packet-ansi_a.h
struct_name: ansi_a_tap_rec_t
[ansi_map]
header_file: ../dissectors/packet-ansi_map.h
struct_name: ansi_map_tap_rec_t
# [bootp]
# header_file: ../dissectors/packet-bootp.h
# struct_name: bootp_info_t
# [dcerpc]
# header_file: ../dissectors/packet-dcerpc.h
# struct_name: dcerpc_info_t
# [dccp]
# header_file: ../dissectors/packet-dccp.h
# struct_name: dccp_info_t
# [dtls]
# header_file: ../dissectors/packet-dtls.h
# struct_name: dtls_info_t
# [epl]
# header_file: ../dissectors/packet-epl.h
# struct_name: epl_info_t
[eth]
header_file: ../dissectors/packet-eth.h
struct_name: eth_hdr
# [fc]
# header_file: ../dissectors/packet-fc.h
# struct_name: fc_hdr
# [gsm_a]
# header_file: ../dissectors/packet-gsm_a.h
# struct_name: gsm_a_info_t
# [gsm_map]
# header_file: ../dissectors/packet-gsm_map.h
# struct_name: gsm_map_info_t
# [h245]
# header_file: ../dissectors/packet-h245.h
# struct_name: h245_info_t
# [h245dg]
# header_file: ../dissectors/packet-h245dg.h
# struct_name: h245dg_info_t
# [ipx]
# header_file: ../dissectors/packet-ipx.h
# struct_name: ipx_info_t
# [isup]
# header_file: ../dissectors/packet-isup.h
# struct_name: isup_info_t
# [jxta]
# header_file: ../dissectors/packet-jxta.h
# struct_name: jxta_info_t
[ldap]
header_file: ../dissectors/packet-ldap.h
struct_name: ldap_call_response_t
# [mtp3]
# header_file: ../dissectors/packet-mtp3.h
# struct_name: mtp3_info_t
# [ncp_srt]
# header_file: ../dissectors/packet-ncp_srt.h
# struct_name: ncp_srt_info_t
# [ncp_hdr]
# header_file: ../dissectors/packet-ncp_hdr.h
# struct_name: ncp_hdr_info_t
# [ntlmssp]
# header_file: ../dissectors/packet-ntlmssp.h
# struct_name: ntlmssp_info_t
# [q931]
# header_file: ../dissectors/packet-q931.h
# struct_name: q931_info_t
# [rpc]
# header_file: ../dissectors/packet-rpc.h
# struct_name: rpc_info_t
# [rsvp]
# header_file: ../dissectors/packet-rsvp.h
# struct_name: rsvp_info_t
# [rtpevent]
# header_file: ../dissectors/packet-rtpevent.h
# struct_name: rtpevent_info_t
# [rtp]
# header_file: ../dissectors/packet-rtp.h
# struct_name: rtp_info_t
# [scsi]
# header_file: ../dissectors/packet-scsi.h
# struct_name: scsi_info_t
# [sctp]
# header_file: ../dissectors/packet-sctp.h
# struct_name: sctp_info_t
# [sdp]
# header_file: ../dissectors/packet-sdp.h
# struct_name: sdp_info_t
# [sip]
# header_file: ../dissectors/packet-sip.h
# struct_name: sip_info_t
[smb]
header_file: ../dissectors/packet-smb.h
struct_name: smb_info_t
[smb2]
header_file: ../dissectors/packet-smb2.h
struct_name: smb2_info_t
# [t38]
# header_file: ../dissectors/packet-t38.h
# struct_name: t38_info_t
[tcp]
header_file: ../dissectors/packet-tcp.h
struct_name: tcp_info_t
# [teredo]
# header_file: ../dissectors/packet-teredo.h
# struct_name: teredo_info_t
# [tls]
# header_file: ../dissectors/packet-tls.h
# struct_name: ssl_info_t
# [tr]
# header_file: ../dissectors/packet-tr.h
# struct_name: tr_info_t
[wlan]
header_file: ../dissectors/packet-ieee80211.h
struct_name: wlan_hdr_t
# [wsp]
# header_file: ../dissectors/packet-wsp.h
# struct_name: wsp_info_t