aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2019-05-08 17:55:37 -0700
committerGuy Harris <guy@alum.mit.edu>2019-05-09 01:22:46 +0000
commit26968f911b5f3c88189eb9249dea2e7ee7732a7e (patch)
tree0f726f5cf5c1aee23b03cba6a566a90ed12910db /wiretap
parentb41d12214218b38b8b44aac0361c5404b4480a73 (diff)
Set packet flags for some link layers.
Change-Id: Ia46a639b241dcbd983205ee0118c51abf5604a15 Reviewed-on: https://code.wireshark.org/review/33124 Petri-Dish: Guy Harris <guy@alum.mit.edu> Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris <guy@alum.mit.edu>
Diffstat (limited to 'wiretap')
-rw-r--r--wiretap/ngsniffer.c51
1 files changed, 44 insertions, 7 deletions
diff --git a/wiretap/ngsniffer.c b/wiretap/ngsniffer.c
index 0201993742..f1194a5418 100644
--- a/wiretap/ngsniffer.c
+++ b/wiretap/ngsniffer.c
@@ -200,7 +200,7 @@ struct frame2_rec {
*/
#define FS_FDDI_INVALID 0x10 /* frame indicators are invalid */
#define FS_FDDI_ERROR 0x20 /* "frame error bit 1" */
-#define FS_FDDI_PCI_VDL 0x01 /* VDL error on frame on PCI adapter */
+#define FS_FDDI_PCI_VDL 0x01 /* VDL (Valid Data Length?) error on frame on PCI adapter */
#define FS_FDDI_PCI_CRC 0x02 /* CRC error on frame on PCI adapter */
#define FS_FDDI_ISA_CRC 0x20 /* CRC error on frame on ISA adapter */
@@ -502,8 +502,8 @@ static gboolean ngsniffer_seek_read(wtap *wth, gint64 seek_off,
static int ngsniffer_process_record(wtap *wth, gboolean is_random,
guint *padding, wtap_rec *rec, Buffer *buf, int *err,
gchar **err_info);
-static void set_pseudo_header_frame2(wtap *wth,
- union wtap_pseudo_header *pseudo_header, struct frame2_rec *frame2);
+static void set_metadata_frame2(wtap *wth, wtap_rec *rec,
+ struct frame2_rec *frame2);
static void set_pseudo_header_frame4(union wtap_pseudo_header *pseudo_header,
struct frame4_rec *frame4);
static void set_pseudo_header_frame6(wtap *wth,
@@ -1146,6 +1146,9 @@ ngsniffer_process_record(wtap *wth, gboolean is_random, guint *padding,
rec_type = pletoh16(record_type);
rec_length_remaining = pletoh16(record_length);
+ /* Initialize - we'll be setting some presence flags below. */
+ rec->presence_flags = 0;
+
ngsniffer = (ngsniffer_t *)wth->priv;
switch (rec_type) {
@@ -1180,7 +1183,7 @@ ngsniffer_process_record(wtap *wth, gboolean is_random, guint *padding,
rec_length_remaining -= (guint)sizeof frame2; /* we already read that much */
- set_pseudo_header_frame2(wth, &rec->rec_header.packet_header.pseudo_header, &frame2);
+ set_metadata_frame2(wth, rec, &frame2);
break;
case REC_FRAME4:
@@ -1302,7 +1305,7 @@ ngsniffer_process_record(wtap *wth, gboolean is_random, guint *padding,
}
rec->rec_type = REC_TYPE_PACKET;
- rec->presence_flags = true_size ? WTAP_HAS_TS|WTAP_HAS_CAP_LEN : WTAP_HAS_TS;
+ rec->presence_flags |= true_size ? WTAP_HAS_TS|WTAP_HAS_CAP_LEN : WTAP_HAS_TS;
rec->rec_header.packet_header.len = true_size ? true_size : size;
rec->rec_header.packet_header.caplen = size;
@@ -1352,9 +1355,13 @@ ngsniffer_process_record(wtap *wth, gboolean is_random, guint *padding,
}
static void
-set_pseudo_header_frame2(wtap *wth, union wtap_pseudo_header *pseudo_header,
- struct frame2_rec *frame2)
+set_metadata_frame2(wtap *wth, wtap_rec *rec, struct frame2_rec *frame2)
{
+ ngsniffer_t *ngsniffer;
+ union wtap_pseudo_header *pseudo_header;
+
+ ngsniffer = (ngsniffer_t *)wth->priv;
+
/*
* In one PPP "Internetwork analyzer" capture:
*
@@ -1397,6 +1404,36 @@ set_pseudo_header_frame2(wtap *wth, union wtap_pseudo_header *pseudo_header,
* correlation with anything. See previous comment
* about display filters.
*/
+ switch (ngsniffer->network) {
+
+ case NETWORK_ENET:
+ rec->presence_flags |= WTAP_HAS_PACK_FLAGS;
+ rec->rec_header.packet_header.pack_flags = 0;
+ if (frame2->fs & FS_ETH_CRC)
+ rec->rec_header.packet_header.pack_flags |= PACK_FLAGS_CRC_ERROR;
+ if (frame2->fs & FS_ETH_ALIGN)
+ rec->rec_header.packet_header.pack_flags |= PACK_FLAGS_UNALIGNED_FRAME;
+ if (frame2->fs & FS_ETH_RUNT)
+ rec->rec_header.packet_header.pack_flags |= PACK_FLAGS_PACKET_TOO_SHORT;;
+ break;
+
+ case NETWORK_FDDI:
+ rec->presence_flags |= WTAP_HAS_PACK_FLAGS;
+ rec->rec_header.packet_header.pack_flags = 0;
+ if (!(frame2->fs & FS_FDDI_INVALID) &&
+ (frame2->fs & (FS_FDDI_PCI_CRC|FS_FDDI_ISA_CRC)))
+ rec->rec_header.packet_header.pack_flags |= PACK_FLAGS_CRC_ERROR;
+ break;
+
+ case NETWORK_SYNCHRO:
+ rec->presence_flags |= WTAP_HAS_PACK_FLAGS;
+ rec->rec_header.packet_header.pack_flags = 0;
+ if (frame2->fs & FS_SYNC_CRC)
+ rec->rec_header.packet_header.pack_flags |= PACK_FLAGS_CRC_ERROR;
+ break;
+ }
+
+ pseudo_header = &rec->rec_header.packet_header.pseudo_header;
switch (wth->file_encap) {
case WTAP_ENCAP_ETHERNET: