aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/CMakeLists.txt8
-rw-r--r--epan/introspection-enums.c5
-rw-r--r--epan/introspection.c8
-rw-r--r--epan/introspection.h10
-rwxr-xr-xtools/make-enums.py83
-rw-r--r--wiretap/CMakeLists.txt2
-rw-r--r--wiretap/introspection-enums.c538
-rw-r--r--wiretap/introspection.c31
-rw-r--r--wiretap/introspection.h36
-rw-r--r--wsutil/CMakeLists.txt2
-rw-r--r--wsutil/introspection.c27
-rw-r--r--wsutil/introspection.h29
12 files changed, 707 insertions, 72 deletions
diff --git a/epan/CMakeLists.txt b/epan/CMakeLists.txt
index 1a8a103f23..55d39ee4dc 100644
--- a/epan/CMakeLists.txt
+++ b/epan/CMakeLists.txt
@@ -429,14 +429,6 @@ set_target_properties(wscbor_test PROPERTIES
EXCLUDE_FROM_DEFAULT_BUILD True
)
-# This tries to parse C headers using Python to extract enums for
-# introspection. It is slow and has some particular dependencies.
-# It's also not foolproof. It should not be part of the ALL target.
-add_custom_target(gen-enums
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/make-enums.py
- WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
-)
-
CHECKAPI(
NAME
epan
diff --git a/epan/introspection-enums.c b/epan/introspection-enums.c
index dc4bce27a3..00b9d14119 100644
--- a/epan/introspection-enums.c
+++ b/epan/introspection-enums.c
@@ -5,9 +5,8 @@
*
* SPDX-License-Identifier: GPL-2.0-or-later
*
- * Generated automatically from make-enums.py.
- *
- * It can be re-created using "make gen-enums".
+ * Generated automatically from make-enums.py. It can be re-created by running
+ * "tools/make-enums.py" from the top source directory.
*
* It is fine to edit this file by hand. Particularly if a symbol
* disappears from the API it can just be removed here. There is no
diff --git a/epan/introspection.c b/epan/introspection.c
index c42b86b2ec..4499b74114 100644
--- a/epan/introspection.c
+++ b/epan/introspection.c
@@ -19,11 +19,6 @@ const ws_enum_t *epan_inspect_enums(void)
return all_enums;
}
-static int compare_enum(const void *needle, const void *memb)
-{
- return strcmp(needle, ((const ws_enum_t *)memb)->symbol);
-}
-
size_t epan_inspect_enums_count(void)
{
/* Exclude null terminator */
@@ -32,6 +27,5 @@ size_t epan_inspect_enums_count(void)
const ws_enum_t *epan_inspect_enums_bsearch(const char *needle)
{
- return bsearch(needle, all_enums, epan_inspect_enums_count(),
- sizeof(ws_enum_t), compare_enum);
+ return ws_enums_bsearch(all_enums, epan_inspect_enums_count(), needle);
}
diff --git a/epan/introspection.h b/epan/introspection.h
index 712ac1c597..013fc133d7 100644
--- a/epan/introspection.h
+++ b/epan/introspection.h
@@ -8,16 +8,12 @@
* SPDX-License-Identifier: GPL-2.0-or-later
*/
-#ifndef _INTROSPECTION_H_
-#define _INTROSPECTION_H_
+#ifndef _EPAN_INTROSPECTION_H_
+#define _EPAN_INTROSPECTION_H_
#include <stddef.h>
#include <ws_symbol_export.h>
-
-typedef struct {
- const char *symbol;
- int value;
-} ws_enum_t;
+#include <wsutil/introspection.h>
/** Returns an array of ws_enum_t elements. The array is sorted and
* ends with {NULL, 0}.
diff --git a/tools/make-enums.py b/tools/make-enums.py
index 826c8c7d51..b6a2835e11 100755
--- a/tools/make-enums.py
+++ b/tools/make-enums.py
@@ -20,37 +20,14 @@ import sys
import argparse
from pyclibrary import CParser
-default_infiles = [
- "epan/address.h",
- "epan/ipproto.h",
- "epan/proto.h",
- "epan/ftypes/ftypes.h",
- "epan/stat_groups.h",
-]
-
-default_outfile = "epan/introspection-enums.c"
-
-argp = argparse.ArgumentParser()
-argp.add_argument("-o", "--outfile")
-argp.add_argument("infiles", nargs="*")
-args = argp.parse_args()
-
-if args.infiles:
- infiles = args.infiles
-else:
- infiles = default_infiles
-
-if args.outfile:
- outfile = args.outfile
-else:
- outfile = default_outfile
+def parse_files(infiles, outfile):
-print("input: {}".format(infiles))
-print("output: {}".format(outfile))
+ print("Input: {}".format(infiles))
+ print("Output: '{}'".format(outfile))
-parser = CParser(infiles)
+ parser = CParser(infiles)
-source = """\
+ source = """\
/*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
@@ -58,9 +35,8 @@ source = """\
*
* SPDX-License-Identifier: GPL-2.0-or-later
*
- * Generated automatically from %s.
- *
- * It can be re-created using "make gen-enums".
+ * Generated automatically from %s. It can be re-created by running
+ * "tools/make-enums.py" from the top source directory.
*
* It is fine to edit this file by hand. Particularly if a symbol
* disappears from the API it can just be removed here. There is no
@@ -69,36 +45,49 @@ source = """\
*/
""" % (os.path.basename(sys.argv[0]))
-for f in infiles:
- source += '#include <{}>\n'.format(f)
+ for f in infiles:
+ source += '#include <{}>\n'.format(f)
-source += """
+ source += """
#define ENUM(arg) { #arg, arg }
static ws_enum_t all_enums[] = {
"""
-definitions = parser.defs['values']
-symbols = list(definitions.keys())
-symbols.sort()
+ definitions = parser.defs['values']
+ symbols = list(definitions.keys())
+ symbols.sort()
-for s in symbols:
- if isinstance(definitions[s], int):
- source += ' ENUM({}),\n'.format(s)
+ for s in symbols:
+ if isinstance(definitions[s], int):
+ source += ' ENUM({}),\n'.format(s)
-source += """\
+ source += """\
{ NULL, 0 },
};
"""
-try:
- fh = open(outfile, 'w')
-except OSError:
- sys.exit('Unable to write ' + outfile + '.\n')
+ try:
+ fh = open(outfile, 'w')
+ except OSError:
+ sys.exit('Unable to write ' + outfile + '.\n')
-fh.write(source)
-fh.close()
+ fh.write(source)
+ fh.close()
+epan_files = [
+ "epan/address.h",
+ "epan/ipproto.h",
+ "epan/proto.h",
+ "epan/ftypes/ftypes.h",
+ "epan/stat_groups.h",
+]
+parse_files(epan_files, "epan/introspection-enums.c")
+
+wtap_files = [
+ "wiretap/wtap.h",
+]
+parse_files(wtap_files, "wiretap/introspection-enums.c")
#
# Editor modelines - https://www.wireshark.org/tools/modelines.html
diff --git a/wiretap/CMakeLists.txt b/wiretap/CMakeLists.txt
index 51fdd227ca..7f6c062bec 100644
--- a/wiretap/CMakeLists.txt
+++ b/wiretap/CMakeLists.txt
@@ -9,6 +9,7 @@
set(WIRETAP_PUBLIC_HEADERS
file_wrappers.h
+ introspection.h
merge.h
pcap-encap.h
pcapng_module.h
@@ -112,6 +113,7 @@ set(WIRETAP_MODULE_FILES
set(WIRETAP_NONGENERATED_C_FILES
${WIRETAP_C_MODULE_FILES}
${CMAKE_CURRENT_SOURCE_DIR}/pcapng.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/introspection.c
${CMAKE_CURRENT_SOURCE_DIR}/libpcap.c
${CMAKE_CURRENT_SOURCE_DIR}/file_access.c
${CMAKE_CURRENT_SOURCE_DIR}/file_wrappers.c
diff --git a/wiretap/introspection-enums.c b/wiretap/introspection-enums.c
new file mode 100644
index 0000000000..f030f7738b
--- /dev/null
+++ b/wiretap/introspection-enums.c
@@ -0,0 +1,538 @@
+/*
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Generated automatically from make-enums.py. It can be re-created by running
+ * "tools/make-enums.py" from the top source directory.
+ *
+ * It is fine to edit this file by hand. Particularly if a symbol
+ * disappears from the API it can just be removed here. There is no
+ * requirement to re-run the generator script.
+ *
+ */
+#include <wiretap/wtap.h>
+
+#define ENUM(arg) { #arg, arg }
+
+static ws_enum_t all_enums[] = {
+ ENUM(AAL_1),
+ ENUM(AAL_2),
+ ENUM(AAL_3_4),
+ ENUM(AAL_5),
+ ENUM(AAL_OAMCELL),
+ ENUM(AAL_SIGNALLING),
+ ENUM(AAL_UNKNOWN),
+ ENUM(AAL_USER),
+ ENUM(ASCEND_MAX_STR_LEN),
+ ENUM(ASCEND_PFX_ETHER),
+ ENUM(ASCEND_PFX_ISDN_R),
+ ENUM(ASCEND_PFX_ISDN_X),
+ ENUM(ASCEND_PFX_WDD),
+ ENUM(ASCEND_PFX_WDS_R),
+ ENUM(ASCEND_PFX_WDS_X),
+ ENUM(ATM_AAL2_NOPHDR),
+ ENUM(ATM_NO_HEC),
+ ENUM(ATM_RAW_CELL),
+ ENUM(ATM_REASSEMBLY_ERROR),
+ ENUM(BBLOG_TYPE_EVENT_BLOCK),
+ ENUM(BBLOG_TYPE_SKIPPED_BLOCK),
+ ENUM(BLOCK_NOT_SUPPORTED),
+ ENUM(BTHCI_CHANNEL_ACL),
+ ENUM(BTHCI_CHANNEL_COMMAND),
+ ENUM(BTHCI_CHANNEL_EVENT),
+ ENUM(BTHCI_CHANNEL_ISO),
+ ENUM(BTHCI_CHANNEL_SCO),
+ ENUM(COSINE_DIR_RX),
+ ENUM(COSINE_DIR_TX),
+ ENUM(COSINE_ENCAP_ATM),
+ ENUM(COSINE_ENCAP_ETH),
+ ENUM(COSINE_ENCAP_FR),
+ ENUM(COSINE_ENCAP_HDLC),
+ ENUM(COSINE_ENCAP_PPP),
+ ENUM(COSINE_ENCAP_PPoATM),
+ ENUM(COSINE_ENCAP_PPoFR),
+ ENUM(COSINE_ENCAP_TEST),
+ ENUM(COSINE_ENCAP_UNKNOWN),
+ ENUM(COSINE_MAX_IF_NAME_LEN),
+ ENUM(FROM_DCE),
+ ENUM(FT_SORT_BY_DESCRIPTION),
+ ENUM(FT_SORT_BY_NAME),
+ ENUM(GSM_UM_CHANNEL_AGCH),
+ ENUM(GSM_UM_CHANNEL_BCCH),
+ ENUM(GSM_UM_CHANNEL_CCCH),
+ ENUM(GSM_UM_CHANNEL_FACCH),
+ ENUM(GSM_UM_CHANNEL_PCH),
+ ENUM(GSM_UM_CHANNEL_RACH),
+ ENUM(GSM_UM_CHANNEL_SACCH),
+ ENUM(GSM_UM_CHANNEL_SDCCH),
+ ENUM(GSM_UM_CHANNEL_UNKNOWN),
+ ENUM(IRDA_CLASS_FRAME),
+ ENUM(IRDA_CLASS_LOG),
+ ENUM(IRDA_CLASS_MASK),
+ ENUM(IRDA_INCOMING),
+ ENUM(IRDA_LOG_MESSAGE),
+ ENUM(IRDA_MISSED_MSG),
+ ENUM(IRDA_OUTGOING),
+ ENUM(K12_PORT_ATMPVC),
+ ENUM(K12_PORT_DS0S),
+ ENUM(K12_PORT_DS1),
+ ENUM(LLCP_PHDR_FLAG_SENT),
+ ENUM(MAXNAMELEN),
+ ENUM(MAX_ERF_EHDR),
+ ENUM(MTP2_ANNEX_A_NOT_USED),
+ ENUM(MTP2_ANNEX_A_USED),
+ ENUM(MTP2_ANNEX_A_USED_UNKNOWN),
+ ENUM(MULTIPLE_BLOCKS_SUPPORTED),
+ ENUM(MULTIPLE_OPTIONS_SUPPORTED),
+ ENUM(ONE_BLOCK_SUPPORTED),
+ ENUM(ONE_OPTION_SUPPORTED),
+ ENUM(OPEN_INFO_HEURISTIC),
+ ENUM(OPEN_INFO_MAGIC),
+ ENUM(OPTION_NOT_SUPPORTED),
+ ENUM(PACK_FLAGS_CRC_ERROR),
+ ENUM(PACK_FLAGS_DIRECTION_INBOUND),
+ ENUM(PACK_FLAGS_DIRECTION_MASK),
+ ENUM(PACK_FLAGS_DIRECTION_OUTBOUND),
+ ENUM(PACK_FLAGS_DIRECTION_SHIFT),
+ ENUM(PACK_FLAGS_DIRECTION_UNKNOWN),
+ ENUM(PACK_FLAGS_FCS_LENGTH_MASK),
+ ENUM(PACK_FLAGS_FCS_LENGTH_SHIFT),
+ ENUM(PACK_FLAGS_PACKET_TOO_LONG),
+ ENUM(PACK_FLAGS_PACKET_TOO_SHORT),
+ ENUM(PACK_FLAGS_PREAMBLE_ERROR),
+ ENUM(PACK_FLAGS_RECEPTION_TYPE_BROADCAST),
+ ENUM(PACK_FLAGS_RECEPTION_TYPE_MASK),
+ ENUM(PACK_FLAGS_RECEPTION_TYPE_MULTICAST),
+ ENUM(PACK_FLAGS_RECEPTION_TYPE_PROMISCUOUS),
+ ENUM(PACK_FLAGS_RECEPTION_TYPE_SHIFT),
+ ENUM(PACK_FLAGS_RECEPTION_TYPE_UNICAST),
+ ENUM(PACK_FLAGS_RECEPTION_TYPE_UNSPECIFIED),
+ ENUM(PACK_FLAGS_RESERVED_MASK),
+ ENUM(PACK_FLAGS_START_FRAME_DELIMITER_ERROR),
+ ENUM(PACK_FLAGS_SYMBOL_ERROR),
+ ENUM(PACK_FLAGS_UNALIGNED_FRAME),
+ ENUM(PACK_FLAGS_WRONG_INTER_FRAME_GAP),
+ ENUM(PHDR_802_11AD_MAX_FREQUENCY),
+ ENUM(PHDR_802_11AD_MIN_FREQUENCY),
+ ENUM(PHDR_802_11A_CHANNEL_TYPE_HALF_CLOCKED),
+ ENUM(PHDR_802_11A_CHANNEL_TYPE_NORMAL),
+ ENUM(PHDR_802_11A_CHANNEL_TYPE_QUARTER_CLOCKED),
+ ENUM(PHDR_802_11A_TURBO_TYPE_DYNAMIC_TURBO),
+ ENUM(PHDR_802_11A_TURBO_TYPE_NORMAL),
+ ENUM(PHDR_802_11A_TURBO_TYPE_STATIC_TURBO),
+ ENUM(PHDR_802_11A_TURBO_TYPE_TURBO),
+ ENUM(PHDR_802_11G_MODE_NORMAL),
+ ENUM(PHDR_802_11G_MODE_SUPER_G),
+ ENUM(PHDR_802_11_0_LENGTH_PSDU_S1G_NDP),
+ ENUM(PHDR_802_11_0_LENGTH_PSDU_VENDOR_SPECIFIC),
+ ENUM(PHDR_802_11_A_MPDU_DELIM_CRC_ERROR),
+ ENUM(PHDR_802_11_BANDWIDTH_160_MHZ),
+ ENUM(PHDR_802_11_BANDWIDTH_20LL),
+ ENUM(PHDR_802_11_BANDWIDTH_20LLL),
+ ENUM(PHDR_802_11_BANDWIDTH_20LLU),
+ ENUM(PHDR_802_11_BANDWIDTH_20LU),
+ ENUM(PHDR_802_11_BANDWIDTH_20LUL),
+ ENUM(PHDR_802_11_BANDWIDTH_20LUU),
+ ENUM(PHDR_802_11_BANDWIDTH_20UL),
+ ENUM(PHDR_802_11_BANDWIDTH_20ULL),
+ ENUM(PHDR_802_11_BANDWIDTH_20ULU),
+ ENUM(PHDR_802_11_BANDWIDTH_20UU),
+ ENUM(PHDR_802_11_BANDWIDTH_20UUL),
+ ENUM(PHDR_802_11_BANDWIDTH_20UUU),
+ ENUM(PHDR_802_11_BANDWIDTH_20_20L),
+ ENUM(PHDR_802_11_BANDWIDTH_20_20U),
+ ENUM(PHDR_802_11_BANDWIDTH_20_MHZ),
+ ENUM(PHDR_802_11_BANDWIDTH_40LL),
+ ENUM(PHDR_802_11_BANDWIDTH_40LU),
+ ENUM(PHDR_802_11_BANDWIDTH_40UL),
+ ENUM(PHDR_802_11_BANDWIDTH_40UU),
+ ENUM(PHDR_802_11_BANDWIDTH_40_40L),
+ ENUM(PHDR_802_11_BANDWIDTH_40_40U),
+ ENUM(PHDR_802_11_BANDWIDTH_40_MHZ),
+ ENUM(PHDR_802_11_BANDWIDTH_80_80L),
+ ENUM(PHDR_802_11_BANDWIDTH_80_80U),
+ ENUM(PHDR_802_11_BANDWIDTH_80_MHZ),
+ ENUM(PHDR_802_11_DATA_NOT_CAPTURED),
+ ENUM(PHDR_802_11_LAST_PART_OF_A_MPDU),
+ ENUM(PHDR_802_11_PHY_11A),
+ ENUM(PHDR_802_11_PHY_11AC),
+ ENUM(PHDR_802_11_PHY_11AD),
+ ENUM(PHDR_802_11_PHY_11AH),
+ ENUM(PHDR_802_11_PHY_11AX),
+ ENUM(PHDR_802_11_PHY_11B),
+ ENUM(PHDR_802_11_PHY_11BE),
+ ENUM(PHDR_802_11_PHY_11G),
+ ENUM(PHDR_802_11_PHY_11N),
+ ENUM(PHDR_802_11_PHY_11_DSSS),
+ ENUM(PHDR_802_11_PHY_11_FHSS),
+ ENUM(PHDR_802_11_PHY_11_IR),
+ ENUM(PHDR_802_11_PHY_UNKNOWN),
+ ENUM(PHDR_802_11_SOUNDING_PSDU),
+ ENUM(REC_TYPE_CUSTOM_BLOCK),
+ ENUM(REC_TYPE_FT_SPECIFIC_EVENT),
+ ENUM(REC_TYPE_FT_SPECIFIC_REPORT),
+ ENUM(REC_TYPE_PACKET),
+ ENUM(REC_TYPE_SYSCALL),
+ ENUM(REC_TYPE_SYSTEMD_JOURNAL_EXPORT),
+ ENUM(SITA_ERROR_NO_BUFFER),
+ ENUM(SITA_ERROR_RX_ABORT),
+ ENUM(SITA_ERROR_RX_BREAK),
+ ENUM(SITA_ERROR_RX_CD_LOST),
+ ENUM(SITA_ERROR_RX_COLLISION),
+ ENUM(SITA_ERROR_RX_CRC),
+ ENUM(SITA_ERROR_RX_DPLL),
+ ENUM(SITA_ERROR_RX_FRAME_LEN_VIOL),
+ ENUM(SITA_ERROR_RX_FRAME_LONG),
+ ENUM(SITA_ERROR_RX_FRAME_SHORT),
+ ENUM(SITA_ERROR_RX_FRAMING),
+ ENUM(SITA_ERROR_RX_NONOCTET_ALIGNED),
+ ENUM(SITA_ERROR_RX_OVERRUN),
+ ENUM(SITA_ERROR_RX_PARITY),
+ ENUM(SITA_ERROR_RX_UNDEF1),
+ ENUM(SITA_ERROR_RX_UNDEF2),
+ ENUM(SITA_ERROR_RX_UNDEF3),
+ ENUM(SITA_ERROR_TX_CTS_LOST),
+ ENUM(SITA_ERROR_TX_RETX_LIMIT),
+ ENUM(SITA_ERROR_TX_UART_ERROR),
+ ENUM(SITA_ERROR_TX_UNDEF1),
+ ENUM(SITA_ERROR_TX_UNDEF2),
+ ENUM(SITA_ERROR_TX_UNDEF3),
+ ENUM(SITA_ERROR_TX_UNDEF4),
+ ENUM(SITA_ERROR_TX_UNDERRUN),
+ ENUM(SITA_FRAME_DIR),
+ ENUM(SITA_FRAME_DIR_RXED),
+ ENUM(SITA_FRAME_DIR_TXED),
+ ENUM(SITA_PROTO_ALC),
+ ENUM(SITA_PROTO_ASYNC_BLKIO),
+ ENUM(SITA_PROTO_ASYNC_INTIO),
+ ENUM(SITA_PROTO_BOP_FRL),
+ ENUM(SITA_PROTO_BOP_LAPB),
+ ENUM(SITA_PROTO_DPM_LINK),
+ ENUM(SITA_PROTO_ETHERNET),
+ ENUM(SITA_PROTO_I2C),
+ ENUM(SITA_PROTO_PPP_HDLC),
+ ENUM(SITA_PROTO_SDLC),
+ ENUM(SITA_PROTO_TOKENRING),
+ ENUM(SITA_PROTO_UNUSED),
+ ENUM(SITA_PROTO_UTS),
+ ENUM(SITA_SIG_CTS),
+ ENUM(SITA_SIG_DCD),
+ ENUM(SITA_SIG_DSR),
+ ENUM(SITA_SIG_DTR),
+ ENUM(SITA_SIG_RTS),
+ ENUM(SITA_SIG_UNDEF1),
+ ENUM(SITA_SIG_UNDEF2),
+ ENUM(SITA_SIG_UNDEF3),
+ ENUM(TRAF_FR),
+ ENUM(TRAF_GPRS_NS),
+ ENUM(TRAF_ILMI),
+ ENUM(TRAF_IPSILON),
+ ENUM(TRAF_LANE),
+ ENUM(TRAF_LLCMX),
+ ENUM(TRAF_SPANS),
+ ENUM(TRAF_SSCOP),
+ ENUM(TRAF_ST_IPSILON_FT0),
+ ENUM(TRAF_ST_IPSILON_FT1),
+ ENUM(TRAF_ST_IPSILON_FT2),
+ ENUM(TRAF_ST_LANE_802_3),
+ ENUM(TRAF_ST_LANE_802_3_MC),
+ ENUM(TRAF_ST_LANE_802_5),
+ ENUM(TRAF_ST_LANE_802_5_MC),
+ ENUM(TRAF_ST_LANE_LE_CTRL),
+ ENUM(TRAF_ST_UNKNOWN),
+ ENUM(TRAF_ST_VCMX_802_3),
+ ENUM(TRAF_ST_VCMX_802_3_FCS),
+ ENUM(TRAF_ST_VCMX_802_4),
+ ENUM(TRAF_ST_VCMX_802_4_FCS),
+ ENUM(TRAF_ST_VCMX_802_5),
+ ENUM(TRAF_ST_VCMX_802_5_FCS),
+ ENUM(TRAF_ST_VCMX_802_6),
+ ENUM(TRAF_ST_VCMX_802_6_FCS),
+ ENUM(TRAF_ST_VCMX_BPDU),
+ ENUM(TRAF_ST_VCMX_FDDI),
+ ENUM(TRAF_ST_VCMX_FDDI_FCS),
+ ENUM(TRAF_ST_VCMX_FRAGMENTS),
+ ENUM(TRAF_UMTS_FP),
+ ENUM(TRAF_UNKNOWN),
+ ENUM(TRAF_VCMX),
+ ENUM(WTAP_COMMENT_PER_INTERFACE),
+ ENUM(WTAP_COMMENT_PER_PACKET),
+ ENUM(WTAP_COMMENT_PER_SECTION),
+ ENUM(WTAP_ENCAP_3MB_ETHERNET),
+ ENUM(WTAP_ENCAP_APPLE_IP_OVER_IEEE1394),
+ ENUM(WTAP_ENCAP_ARCNET),
+ ENUM(WTAP_ENCAP_ARCNET_LINUX),
+ ENUM(WTAP_ENCAP_ASCEND),
+ ENUM(WTAP_ENCAP_ATM_PDUS),
+ ENUM(WTAP_ENCAP_ATM_PDUS_UNTRUNCATED),
+ ENUM(WTAP_ENCAP_ATM_RFC1483),
+ ENUM(WTAP_ENCAP_AUERSWALD_LOG),
+ ENUM(WTAP_ENCAP_AUTOSAR_DLT),
+ ENUM(WTAP_ENCAP_AX25),
+ ENUM(WTAP_ENCAP_AX25_KISS),
+ ENUM(WTAP_ENCAP_BACNET_MS_TP),
+ ENUM(WTAP_ENCAP_BACNET_MS_TP_WITH_PHDR),
+ ENUM(WTAP_ENCAP_BER),
+ ENUM(WTAP_ENCAP_BLUETOOTH_BREDR_BB),
+ ENUM(WTAP_ENCAP_BLUETOOTH_H4),
+ ENUM(WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR),
+ ENUM(WTAP_ENCAP_BLUETOOTH_HCI),
+ ENUM(WTAP_ENCAP_BLUETOOTH_LE_LL),
+ ENUM(WTAP_ENCAP_BLUETOOTH_LE_LL_WITH_PHDR),
+ ENUM(WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR),
+ ENUM(WTAP_ENCAP_CAN20B),
+ ENUM(WTAP_ENCAP_CATAPULT_DCT2000),
+ ENUM(WTAP_ENCAP_CHDLC),
+ ENUM(WTAP_ENCAP_CHDLC_WITH_PHDR),
+ ENUM(WTAP_ENCAP_CISCO_IOS),
+ ENUM(WTAP_ENCAP_COSINE),
+ ENUM(WTAP_ENCAP_DBUS),
+ ENUM(WTAP_ENCAP_DOCSIS),
+ ENUM(WTAP_ENCAP_DOCSIS31_XRA31),
+ ENUM(WTAP_ENCAP_DPAUXMON),
+ ENUM(WTAP_ENCAP_DPNSS),
+ ENUM(WTAP_ENCAP_DVBCI),
+ ENUM(WTAP_ENCAP_EBHSCR),
+ ENUM(WTAP_ENCAP_ENC),
+ ENUM(WTAP_ENCAP_EPON),
+ ENUM(WTAP_ENCAP_ERF),
+ ENUM(WTAP_ENCAP_ERI_ENB_LOG),
+ ENUM(WTAP_ENCAP_ETHERNET),
+ ENUM(WTAP_ENCAP_ETHERNET_MPACKET),
+ ENUM(WTAP_ENCAP_ETW),
+ ENUM(WTAP_ENCAP_FDDI),
+ ENUM(WTAP_ENCAP_FDDI_BITSWAPPED),
+ ENUM(WTAP_ENCAP_FIBRE_CHANNEL_FC2),
+ ENUM(WTAP_ENCAP_FIBRE_CHANNEL_FC2_WITH_FRAME_DELIMS),
+ ENUM(WTAP_ENCAP_FLEXRAY),
+ ENUM(WTAP_ENCAP_FRELAY),
+ ENUM(WTAP_ENCAP_FRELAY_WITH_PHDR),
+ ENUM(WTAP_ENCAP_GCOM_SERIAL),
+ ENUM(WTAP_ENCAP_GCOM_TIE1),
+ ENUM(WTAP_ENCAP_GFP_F),
+ ENUM(WTAP_ENCAP_GFP_T),
+ ENUM(WTAP_ENCAP_GPRS_LLC),
+ ENUM(WTAP_ENCAP_GSM_UM),
+ ENUM(WTAP_ENCAP_HHDLC),
+ ENUM(WTAP_ENCAP_I2C_LINUX),
+ ENUM(WTAP_ENCAP_IEEE802_15_4),
+ ENUM(WTAP_ENCAP_IEEE802_15_4_NOFCS),
+ ENUM(WTAP_ENCAP_IEEE802_15_4_NONASK_PHY),
+ ENUM(WTAP_ENCAP_IEEE802_15_4_TAP),
+ ENUM(WTAP_ENCAP_IEEE802_16_MAC_CPS),
+ ENUM(WTAP_ENCAP_IEEE_802_11),
+ ENUM(WTAP_ENCAP_IEEE_802_11_AVS),
+ ENUM(WTAP_ENCAP_IEEE_802_11_NETMON),
+ ENUM(WTAP_ENCAP_IEEE_802_11_PRISM),
+ ENUM(WTAP_ENCAP_IEEE_802_11_RADIOTAP),
+ ENUM(WTAP_ENCAP_IEEE_802_11_WITH_RADIO),
+ ENUM(WTAP_ENCAP_INFINIBAND),
+ ENUM(WTAP_ENCAP_IPMB_KONTRON),
+ ENUM(WTAP_ENCAP_IPMI_TRACE),
+ ENUM(WTAP_ENCAP_IPNET),
+ ENUM(WTAP_ENCAP_IP_OVER_FC),
+ ENUM(WTAP_ENCAP_IP_OVER_IB_PCAP),
+ ENUM(WTAP_ENCAP_IP_OVER_IB_SNOOP),
+ ENUM(WTAP_ENCAP_IRDA),
+ ENUM(WTAP_ENCAP_ISDN),
+ ENUM(WTAP_ENCAP_ISO14443),
+ ENUM(WTAP_ENCAP_IXVERIWAVE),
+ ENUM(WTAP_ENCAP_JPEG_JFIF),
+ ENUM(WTAP_ENCAP_JSON),
+ ENUM(WTAP_ENCAP_JUNIPER_ATM1),
+ ENUM(WTAP_ENCAP_JUNIPER_ATM2),
+ ENUM(WTAP_ENCAP_JUNIPER_CHDLC),
+ ENUM(WTAP_ENCAP_JUNIPER_ETHER),
+ ENUM(WTAP_ENCAP_JUNIPER_FRELAY),
+ ENUM(WTAP_ENCAP_JUNIPER_GGSN),
+ ENUM(WTAP_ENCAP_JUNIPER_MLFR),
+ ENUM(WTAP_ENCAP_JUNIPER_MLPPP),
+ ENUM(WTAP_ENCAP_JUNIPER_PPP),
+ ENUM(WTAP_ENCAP_JUNIPER_PPPOE),
+ ENUM(WTAP_ENCAP_JUNIPER_ST),
+ ENUM(WTAP_ENCAP_JUNIPER_SVCS),
+ ENUM(WTAP_ENCAP_JUNIPER_VN),
+ ENUM(WTAP_ENCAP_JUNIPER_VP),
+ ENUM(WTAP_ENCAP_K12),
+ ENUM(WTAP_ENCAP_LAPB),
+ ENUM(WTAP_ENCAP_LAPD),
+ ENUM(WTAP_ENCAP_LAYER1_EVENT),
+ ENUM(WTAP_ENCAP_LIN),
+ ENUM(WTAP_ENCAP_LINUX_ATM_CLIP),
+ ENUM(WTAP_ENCAP_LINUX_LAPD),
+ ENUM(WTAP_ENCAP_LOCALTALK),
+ ENUM(WTAP_ENCAP_LOGCAT),
+ ENUM(WTAP_ENCAP_LOGCAT_BRIEF),
+ ENUM(WTAP_ENCAP_LOGCAT_LONG),
+ ENUM(WTAP_ENCAP_LOGCAT_PROCESS),
+ ENUM(WTAP_ENCAP_LOGCAT_TAG),
+ ENUM(WTAP_ENCAP_LOGCAT_THREAD),
+ ENUM(WTAP_ENCAP_LOGCAT_THREADTIME),
+ ENUM(WTAP_ENCAP_LOGCAT_TIME),
+ ENUM(WTAP_ENCAP_LOG_3GPP),
+ ENUM(WTAP_ENCAP_LOOP),
+ ENUM(WTAP_ENCAP_LORATAP),
+ ENUM(WTAP_ENCAP_MA_WFP_CAPTURE_2V4),
+ ENUM(WTAP_ENCAP_MA_WFP_CAPTURE_2V6),
+ ENUM(WTAP_ENCAP_MA_WFP_CAPTURE_AUTH_V4),
+ ENUM(WTAP_ENCAP_MA_WFP_CAPTURE_AUTH_V6),
+ ENUM(WTAP_ENCAP_MA_WFP_CAPTURE_V4),
+ ENUM(WTAP_ENCAP_MA_WFP_CAPTURE_V6),
+ ENUM(WTAP_ENCAP_MIME),
+ ENUM(WTAP_ENCAP_MOST),
+ ENUM(WTAP_ENCAP_MP4),
+ ENUM(WTAP_ENCAP_MPEG),
+ ENUM(WTAP_ENCAP_MPEG_2_TS),
+ ENUM(WTAP_ENCAP_MTP2),
+ ENUM(WTAP_ENCAP_MTP2_WITH_PHDR),
+ ENUM(WTAP_ENCAP_MTP3),
+ ENUM(WTAP_ENCAP_MUX27010),
+ ENUM(WTAP_ENCAP_NETANALYZER),
+ ENUM(WTAP_ENCAP_NETANALYZER_TRANSPARENT),
+ ENUM(WTAP_ENCAP_NETLINK),
+ ENUM(WTAP_ENCAP_NETMON_HEADER),
+ ENUM(WTAP_ENCAP_NETMON_NETWORK_INFO_EX),
+ ENUM(WTAP_ENCAP_NETMON_NET_FILTER),
+ ENUM(WTAP_ENCAP_NETMON_NET_NETEVENT),
+ ENUM(WTAP_ENCAP_NETTL_ETHERNET),
+ ENUM(WTAP_ENCAP_NETTL_FDDI),
+ ENUM(WTAP_ENCAP_NETTL_RAW_ICMP),
+ ENUM(WTAP_ENCAP_NETTL_RAW_ICMPV6),
+ ENUM(WTAP_ENCAP_NETTL_RAW_IP),
+ ENUM(WTAP_ENCAP_NETTL_RAW_TELNET),
+ ENUM(WTAP_ENCAP_NETTL_TOKEN_RING),
+ ENUM(WTAP_ENCAP_NETTL_UNKNOWN),
+ ENUM(WTAP_ENCAP_NETTL_X25),
+ ENUM(WTAP_ENCAP_NFC_LLCP),
+ ENUM(WTAP_ENCAP_NFLOG),
+ ENUM(WTAP_ENCAP_NORDIC_BLE),
+ ENUM(WTAP_ENCAP_NSTRACE_1_0),
+ ENUM(WTAP_ENCAP_NSTRACE_2_0),
+ ENUM(WTAP_ENCAP_NSTRACE_3_0),
+ ENUM(WTAP_ENCAP_NSTRACE_3_5),
+ ENUM(WTAP_ENCAP_NULL),
+ ENUM(WTAP_ENCAP_OLD_PFLOG),
+ ENUM(WTAP_ENCAP_PACKETLOGGER),
+ ENUM(WTAP_ENCAP_PER_PACKET),
+ ENUM(WTAP_ENCAP_PFLOG),
+ ENUM(WTAP_ENCAP_PKTAP),
+ ENUM(WTAP_ENCAP_PPI),
+ ENUM(WTAP_ENCAP_PPP),
+ ENUM(WTAP_ENCAP_PPP_ETHER),
+ ENUM(WTAP_ENCAP_PPP_WITH_PHDR),
+ ENUM(WTAP_ENCAP_RAW_IP),
+ ENUM(WTAP_ENCAP_RAW_IP4),
+ ENUM(WTAP_ENCAP_RAW_IP6),
+ ENUM(WTAP_ENCAP_RAW_IPFIX),
+ ENUM(WTAP_ENCAP_REDBACK),
+ ENUM(WTAP_ENCAP_RFC7468),
+ ENUM(WTAP_ENCAP_RTAC_SERIAL),
+ ENUM(WTAP_ENCAP_RUBY_MARSHAL),
+ ENUM(WTAP_ENCAP_SCCP),
+ ENUM(WTAP_ENCAP_SCTP),
+ ENUM(WTAP_ENCAP_SDH),
+ ENUM(WTAP_ENCAP_SDLC),
+ ENUM(WTAP_ENCAP_SITA),
+ ENUM(WTAP_ENCAP_SLIP),
+ ENUM(WTAP_ENCAP_SLL),
+ ENUM(WTAP_ENCAP_SLL2),
+ ENUM(WTAP_ENCAP_SOCKETCAN),
+ ENUM(WTAP_ENCAP_STANAG_4607),
+ ENUM(WTAP_ENCAP_STANAG_5066_D_PDU),
+ ENUM(WTAP_ENCAP_SYMANTEC),
+ ENUM(WTAP_ENCAP_SYSTEMD_JOURNAL),
+ ENUM(WTAP_ENCAP_TNEF),
+ ENUM(WTAP_ENCAP_TOKEN_RING),
+ ENUM(WTAP_ENCAP_TZSP),
+ ENUM(WTAP_ENCAP_UNKNOWN),
+ ENUM(WTAP_ENCAP_USBPCAP),
+ ENUM(WTAP_ENCAP_USB_2_0),
+ ENUM(WTAP_ENCAP_USB_2_0_FULL_SPEED),
+ ENUM(WTAP_ENCAP_USB_2_0_HIGH_SPEED),
+ ENUM(WTAP_ENCAP_USB_2_0_LOW_SPEED),
+ ENUM(WTAP_ENCAP_USB_DARWIN),
+ ENUM(WTAP_ENCAP_USB_FREEBSD),
+ ENUM(WTAP_ENCAP_USB_LINUX),
+ ENUM(WTAP_ENCAP_USB_LINUX_MMAPPED),
+ ENUM(WTAP_ENCAP_USER0),
+ ENUM(WTAP_ENCAP_USER1),
+ ENUM(WTAP_ENCAP_USER10),
+ ENUM(WTAP_ENCAP_USER11),
+ ENUM(WTAP_ENCAP_USER12),
+ ENUM(WTAP_ENCAP_USER13),
+ ENUM(WTAP_ENCAP_USER14),
+ ENUM(WTAP_ENCAP_USER15),
+ ENUM(WTAP_ENCAP_USER2),
+ ENUM(WTAP_ENCAP_USER3),
+ ENUM(WTAP_ENCAP_USER4),
+ ENUM(WTAP_ENCAP_USER5),
+ ENUM(WTAP_ENCAP_USER6),
+ ENUM(WTAP_ENCAP_USER7),
+ ENUM(WTAP_ENCAP_USER8),
+ ENUM(WTAP_ENCAP_USER9),
+ ENUM(WTAP_ENCAP_V5_EF),
+ ENUM(WTAP_ENCAP_VPP),
+ ENUM(WTAP_ENCAP_VSOCK),
+ ENUM(WTAP_ENCAP_WFLEET_HDLC),
+ ENUM(WTAP_ENCAP_WIRESHARK_UPPER_PDU),
+ ENUM(WTAP_ENCAP_X2E_SERIAL),
+ ENUM(WTAP_ENCAP_X2E_XORAYA),
+ ENUM(WTAP_ENCAP_ZBNCP),
+ ENUM(WTAP_ENCAP_ZWAVE_SERIAL),
+ ENUM(WTAP_ERR_BAD_FILE),
+ ENUM(WTAP_ERR_CANT_CLOSE),
+ ENUM(WTAP_ERR_CANT_OPEN),
+ ENUM(WTAP_ERR_CANT_SEEK),
+ ENUM(WTAP_ERR_CANT_SEEK_COMPRESSED),
+ ENUM(WTAP_ERR_CANT_WRITE),
+ ENUM(WTAP_ERR_CANT_WRITE_TO_PIPE),
+ ENUM(WTAP_ERR_CHECK_WSLUA),
+ ENUM(WTAP_ERR_COMPRESSION_NOT_SUPPORTED),
+ ENUM(WTAP_ERR_DECOMPRESS),
+ ENUM(WTAP_ERR_DECOMPRESSION_NOT_SUPPORTED),
+ ENUM(WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED),
+ ENUM(WTAP_ERR_FILE_UNKNOWN_FORMAT),
+ ENUM(WTAP_ERR_INTERNAL),
+ ENUM(WTAP_ERR_NOT_REGULAR_FILE),
+ ENUM(WTAP_ERR_PACKET_TOO_LARGE),
+ ENUM(WTAP_ERR_RANDOM_OPEN_PIPE),
+ ENUM(WTAP_ERR_RANDOM_OPEN_STDIN),
+ ENUM(WTAP_ERR_SHORT_READ),
+ ENUM(WTAP_ERR_SHORT_WRITE),
+ ENUM(WTAP_ERR_TIME_STAMP_NOT_SUPPORTED),
+ ENUM(WTAP_ERR_UNC_OVERFLOW),
+ ENUM(WTAP_ERR_UNSUPPORTED),
+ ENUM(WTAP_ERR_UNWRITABLE_ENCAP),
+ ENUM(WTAP_ERR_UNWRITABLE_FILE_TYPE),
+ ENUM(WTAP_ERR_UNWRITABLE_REC_DATA),
+ ENUM(WTAP_ERR_UNWRITABLE_REC_TYPE),
+ ENUM(WTAP_FILE_TYPE_SUBTYPE_UNKNOWN),
+ ENUM(WTAP_GZIP_COMPRESSED),
+ ENUM(WTAP_HAS_CAP_LEN),
+ ENUM(WTAP_HAS_INTERFACE_ID),
+ ENUM(WTAP_HAS_SECTION_NUMBER),
+ ENUM(WTAP_HAS_TS),
+ ENUM(WTAP_LZ4_COMPRESSED),
+ ENUM(WTAP_MAX_PACKET_SIZE_DBUS),
+ ENUM(WTAP_MAX_PACKET_SIZE_EBHSCR),
+ ENUM(WTAP_MAX_PACKET_SIZE_STANDARD),
+ ENUM(WTAP_MAX_PACKET_SIZE_USBPCAP),
+ ENUM(WTAP_OPEN_ERROR),
+ ENUM(WTAP_OPEN_MINE),
+ ENUM(WTAP_OPEN_NOT_MINE),
+ ENUM(WTAP_TSPREC_CSEC),
+ ENUM(WTAP_TSPREC_DSEC),
+ ENUM(WTAP_TSPREC_MSEC),
+ ENUM(WTAP_TSPREC_NSEC),
+ ENUM(WTAP_TSPREC_PER_PACKET),
+ ENUM(WTAP_TSPREC_SEC),
+ ENUM(WTAP_TSPREC_UNKNOWN),
+ ENUM(WTAP_TSPREC_USEC),
+ ENUM(WTAP_TYPE_AUTO),
+ ENUM(WTAP_UNCOMPRESSED),
+ ENUM(WTAP_ZSTD_COMPRESSED),
+ { NULL, 0 },
+};
diff --git a/wiretap/introspection.c b/wiretap/introspection.c
new file mode 100644
index 0000000000..032eee8eb4
--- /dev/null
+++ b/wiretap/introspection.c
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2021, João Valverde <j@v6e.pt>
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+#include "config.h"
+#include "introspection.h"
+#include <string.h>
+#include <stdlib.h>
+
+#include "introspection-enums.c"
+
+const ws_enum_t *wtap_inspect_enums(void)
+{
+ return all_enums;
+}
+
+size_t wtap_inspect_enums_count(void)
+{
+ /* Exclude null terminator */
+ return sizeof(all_enums)/sizeof(ws_enum_t) - 1;
+}
+
+const ws_enum_t *wtap_inspect_enums_bsearch(const char *needle)
+{
+ return ws_enums_bsearch(all_enums, wtap_inspect_enums_count(), needle);
+}
diff --git a/wiretap/introspection.h b/wiretap/introspection.h
new file mode 100644
index 0000000000..c12bbcf59d
--- /dev/null
+++ b/wiretap/introspection.h
@@ -0,0 +1,36 @@
+/** @file
+ * Copyright 2021, João Valverde <j@v6e.pt>
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef _WTAP_INTROSPECTION_H_
+#define _WTAP_INTROSPECTION_H_
+
+#include <stddef.h>
+#include <ws_symbol_export.h>
+#include <wsutil/introspection.h>
+
+/** Returns an array of ws_enum_t elements. The array is sorted and
+ * ends with {NULL, 0}.
+ *
+ * It can be used by language bindings to the Wireshark API to obtain
+ * the value of some magic constants. The array can be binary searched,
+ * imported to a hash table, serialized, etc.
+ */
+WS_DLL_PUBLIC
+const ws_enum_t *wtap_inspect_enums(void);
+
+/** Returns size of enums array not including null terminator. */
+WS_DLL_PUBLIC
+size_t wtap_inspect_enums_count(void);
+
+/** Performs a binary search for the magic constant "needle". */
+WS_DLL_PUBLIC
+const ws_enum_t *wtap_inspect_enums_bsearch(const char *needle);
+
+#endif
diff --git a/wsutil/CMakeLists.txt b/wsutil/CMakeLists.txt
index da6b8441db..f0799d6d65 100644
--- a/wsutil/CMakeLists.txt
+++ b/wsutil/CMakeLists.txt
@@ -45,6 +45,7 @@ set(WSUTIL_PUBLIC_HEADERS
inet_ipv4.h
inet_ipv6.h
interface.h
+ introspection.h
jsmn.h
json_dumper.h
mpeg-audio.h
@@ -110,6 +111,7 @@ set(WSUTIL_COMMON_FILES
g711.c
inet_addr.c
interface.c
+ introspection.c
jsmn.c
json_dumper.c
mpeg-audio.c
diff --git a/wsutil/introspection.c b/wsutil/introspection.c
new file mode 100644
index 0000000000..c571c8d5b5
--- /dev/null
+++ b/wsutil/introspection.c
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2021, João Valverde <j@v6e.pt>
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+#include "config.h"
+#include "introspection.h"
+#include <string.h>
+#include <stdlib.h>
+
+
+static int
+compare_enum(const void *needle, const void *memb)
+{
+ return strcmp(needle, ((const ws_enum_t *)memb)->symbol);
+}
+
+const ws_enum_t *
+ws_enums_bsearch(const ws_enum_t *enums, size_t count,
+ const char *needle)
+{
+ return bsearch(needle, enums, count, sizeof(ws_enum_t), compare_enum);
+}
diff --git a/wsutil/introspection.h b/wsutil/introspection.h
new file mode 100644
index 0000000000..f3272df80c
--- /dev/null
+++ b/wsutil/introspection.h
@@ -0,0 +1,29 @@
+/** @file
+ * Copyright 2021, João Valverde <j@v6e.pt>
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef _INTROSPECTION_H_
+#define _INTROSPECTION_H_
+
+#include <stddef.h>
+#include <ws_symbol_export.h>
+
+typedef struct {
+ const char *symbol;
+ int value;
+} ws_enum_t;
+
+
+/** Performs a binary search for the magic constant "needle". */
+WS_DLL_PUBLIC
+const ws_enum_t *
+ws_enums_bsearch(const ws_enum_t *enums, size_t count,
+ const char *needle);
+
+#endif