aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap/pcapng.c
diff options
context:
space:
mode:
Diffstat (limited to 'wiretap/pcapng.c')
-rw-r--r--wiretap/pcapng.c49
1 files changed, 24 insertions, 25 deletions
diff --git a/wiretap/pcapng.c b/wiretap/pcapng.c
index df91b7a619..24a0e53b4d 100644
--- a/wiretap/pcapng.c
+++ b/wiretap/pcapng.c
@@ -16,6 +16,7 @@
*/
#include "config.h"
+#include "wtap_opttypes.h"
#define WS_LOG_DOMAIN LOG_DOMAIN_WIRETAP
@@ -540,6 +541,21 @@ pcapng_process_uint8_option(wtapng_block_t *wblock,
}
static void
+pcapng_process_uint32_option(wtapng_block_t *wblock,
+ guint16 option_code, guint16 option_length,
+ guint32 option_content)
+{
+ if (option_length == 4) {
+ /*
+ * If this option can appear only once in a block, this call
+ * will fail on the second and later occurrences of the option;
+ * we silently ignore the failure.
+ */
+ wtap_block_add_uint32_option(wblock->block, option_code, option_content);
+ }
+}
+
+static void
pcapng_process_timestamp_option(wtapng_block_t *wblock,
const section_info_t *section_info,
guint16 option_code, guint16 option_length,
@@ -1441,8 +1457,7 @@ pcapng_process_packet_block_option(wtapng_block_t *wblock,
memcpy(&tmp32, option_content, sizeof(guint32));
if (section_info->byte_swapped)
tmp32 = GUINT32_SWAP_LE_BE(tmp32);
- wblock->rec->presence_flags |= WTAP_HAS_PACK_FLAGS;
- wblock->rec->rec_header.packet_header.pack_flags = tmp32;
+ pcapng_process_uint32_option(wblock, option_code, option_length, tmp32);
ws_debug("pack_flags 0x%08x", tmp32);
break;
case(OPT_EPB_HASH):
@@ -1578,6 +1593,7 @@ pcapng_read_packet_block(FILE_T fh, pcapng_block_header_t *bh,
pcapng_packet_block_t pb;
wtapng_packet_t packet;
guint32 padding;
+ guint32 flags;
interface_info_t iface_info;
guint64 ts;
int pseudo_header_len;
@@ -1764,7 +1780,6 @@ pcapng_read_packet_block(FILE_T fh, pcapng_block_header_t *bh,
/* Option defaults */
wblock->rec->rec_header.packet_header.drop_count = -1;
- wblock->rec->rec_header.packet_header.pack_flags = 0;
wblock->rec->rec_header.packet_header.packet_id = 0;
wblock->rec->rec_header.packet_header.interface_queue = 0;
@@ -1784,10 +1799,10 @@ pcapng_read_packet_block(FILE_T fh, pcapng_block_header_t *bh,
/*
* Did we get a packet flags option?
*/
- if (wblock->rec->presence_flags & WTAP_HAS_PACK_FLAGS) {
- if (PACK_FLAGS_FCS_LENGTH(wblock->rec->rec_header.packet_header.pack_flags) != 0) {
+ if (WTAP_OPTTYPE_SUCCESS == wtap_block_get_uint32_option_value(wblock->block, OPT_PKT_FLAGS, &flags)) {
+ if (PACK_FLAGS_FCS_LENGTH(flags) != 0) {
/* The FCS length is present */
- fcslen = PACK_FLAGS_FCS_LENGTH(wblock->rec->rec_header.packet_header.pack_flags);
+ fcslen = PACK_FLAGS_FCS_LENGTH(flags);
}
}
@@ -1914,7 +1929,6 @@ pcapng_read_simple_packet_block(FILE_T fh, pcapng_block_header_t *bh,
wblock->rec->ts.nsecs = 0;
wblock->rec->rec_header.packet_header.interface_id = 0;
wblock->rec->rec_header.packet_header.drop_count = 0;
- wblock->rec->rec_header.packet_header.pack_flags = 0;
wblock->rec->rec_header.packet_header.packet_id = 0;
wblock->rec->rec_header.packet_header.interface_queue = 0;
@@ -3709,7 +3723,7 @@ static gboolean pcapng_write_uint32_option(wtap_dumper *wdh, guint option_id, wt
return FALSE;
wdh->bytes_dumped += 4;
- if (!wtap_dump_file_write(wdh, &optval->uint32val, 1, err))
+ if (!wtap_dump_file_write(wdh, &optval->uint32val, 4, err))
return FALSE;
wdh->bytes_dumped += 4;
@@ -4262,7 +4276,7 @@ pcapng_write_enhanced_packet_block(wtap_dumper *wdh, const wtap_rec *rec,
pad_len = 0;
}
if (rec->block != NULL) {
- // Current options expected to be here: comments, verdicts, custom.
+ // Current options expected to be here: comments, flags, verdicts, custom.
// Remember to also add newly-supported option types to packet_block_options_supported
// below.
options_len = wtap_block_get_options_size_padded(rec->block);
@@ -4272,10 +4286,6 @@ pcapng_write_enhanced_packet_block(wtap_dumper *wdh, const wtap_rec *rec,
}
}
- if (rec->presence_flags & WTAP_HAS_PACK_FLAGS) {
- have_options = TRUE;
- options_total_length = options_total_length + 8;
- }
if (rec->presence_flags & WTAP_HAS_DROP_COUNT) {
have_options = TRUE;
options_total_length = options_total_length + 12;
@@ -4424,18 +4434,6 @@ pcapng_write_enhanced_packet_block(wtap_dumper *wdh, const wtap_rec *rec,
if (!wtap_block_foreach_option(rec->block, pcapng_write_option_cb, &block_data)) {
return FALSE;
}
- if (rec->presence_flags & WTAP_HAS_PACK_FLAGS) {
- option_hdr.type = OPT_EPB_FLAGS;
- option_hdr.value_length = 4;
- if (!wtap_dump_file_write(wdh, &option_hdr, 4, err))
- return FALSE;
- wdh->bytes_dumped += 4;
- if (!wtap_dump_file_write(wdh, &rec->rec_header.packet_header.pack_flags, 4, err))
- return FALSE;
- wdh->bytes_dumped += 4;
- ws_debug("Wrote Options packet flags: %x",
- rec->rec_header.packet_header.pack_flags);
- }
if (rec->presence_flags & WTAP_HAS_DROP_COUNT) {
option_hdr.type = OPT_EPB_DROPCOUNT;
option_hdr.value_length = 8;
@@ -5705,6 +5703,7 @@ static const struct supported_option_type decryption_secrets_block_options_suppo
/* Options for packet blocks. */
static const struct supported_option_type packet_block_options_supported[] = {
{ OPT_COMMENT, MULTIPLE_OPTIONS_SUPPORTED },
+ { OPT_PKT_FLAGS, ONE_OPTION_SUPPORTED },
{ OPT_EPB_VERDICT, MULTIPLE_OPTIONS_SUPPORTED },
{ OPT_CUSTOM_STR_COPY, MULTIPLE_OPTIONS_SUPPORTED },
{ OPT_CUSTOM_BIN_COPY, MULTIPLE_OPTIONS_SUPPORTED },