From Linas Vepstas via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=8962
authoreapache <eapache@f5534014-38df-0310-8fa8-9805f1628bb7>
Sun, 28 Jul 2013 23:41:18 +0000 (23:41 +0000)
committereapache <eapache@f5534014-38df-0310-8fa8-9805f1628bb7>
Sun, 28 Jul 2013 23:41:18 +0000 (23:41 +0000)
Enhancement: Add STANAG 4607 file format

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@50996 f5534014-38df-0310-8fa8-9805f1628bb7

AUTHORS
docbook/release-notes.asciidoc
wiretap/CMakeLists.txt
wiretap/Makefile.common
wiretap/README
wiretap/file_access.c
wiretap/stanag4607.c [new file with mode: 0644]
wiretap/stanag4607.h [new file with mode: 0644]
wiretap/wtap.h

diff --git a/AUTHORS b/AUTHORS
index 9c4f57a1f3aa7370fc74aa2f517a8fdb4aa4e242..95267efbf2d44ae6792bf51f11896a8d18f549ef 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -3749,6 +3749,7 @@ Fabio Tarabelloni <fabio.tarabelloni[AT]reloc.it>
 Chas Williams          <chas[AT]cmf.nrl.navy.mil>
 Javier Godoy           <uce[AT]rjgodoy.com.ar>
 Matt Texier            <mtexier[AT]arbor.net>
+Linas Vepstas          <linasvepstas[AT]gmail.com>
 
 Dan Lasley <dlasley[AT]promus.com> gave permission for his
 dumpit() hex-dump routine to be used.
index 6bbee7c69b45aacb63c41f0c1ea2ee540ad39e17..2bb33014c96b8aba9c26dc7673df05d2baecc9db 100644 (file)
@@ -55,6 +55,7 @@ Too many protocols have been updated to list here.
 --sort-and-group--
 
 Netscaler 2.6
+STANAG 4607
 
 --sort-and-group--
 
index 706211427ff9a9cfb0f7e7941d3ebf06f7305f8b..c4d0295eea43e73945814fef1da060d124299ea6 100644 (file)
@@ -69,6 +69,7 @@ set(CLEAN_FILES
        pppdump.c
        radcom.c
        snoop.c
+       stanag4607.c
        tnef.c
        toshiba.c
        visual.c
index b03904fe2778e24ab3635140fcaca775b686d9d5..50bf121651038678b358a9024d783ba7e4ed5015 100644 (file)
@@ -75,6 +75,7 @@ NONGENERATED_C_FILES = \
        pppdump.c               \
        radcom.c                \
        snoop.c                 \
+       stanag4607.c            \
        tnef.c                  \
        toshiba.c               \
        visual.c                \
@@ -133,6 +134,7 @@ NONGENERATED_HEADER_FILES = \
        pppdump.h               \
        radcom.h                \
        snoop.h                 \
+       stanag4607.h            \
        tnef.h                  \
        toshiba.h               \
        visual.h                \
index c2aaa0c3b34cf964132aee52fa120f56f7117275..abff1cac1a3f9143acc30f89f983fec6cbaa2a1d 100644 (file)
@@ -176,3 +176,9 @@ usually found on board ports).
 
 Gilbert Ramirez <gram@alumni.rice.edu>
 Guy Harris <guy@alum.mit.edu>
+
+STANAG 4607
+-----------
+Initial support for the STANAG 4607 protocol.  Documentation at:
+http://www.nato.int/structur/AC/224/standard/4607/4607.htm
+
index 55262cf09abe3bf0e966d9294c92994d17e7a7c2..8d9dc197c0013a670ad0cd89be305f3f8179ac3c 100644 (file)
@@ -86,6 +86,7 @@
 #include "ipfix.h"
 #include "vwr.h"
 #include "camins.h"
+#include "stanag4607.h"
 #include "pcap-encap.h"
 
 /* The open_file_* routines should return:
@@ -147,6 +148,7 @@ static wtap_open_routine_t open_routines_base[] = {
        dct3trace_open,
        daintree_sna_open,
        mime_file_open,
+       stanag4607_open,
        /* Files that don't have magic bytes at a fixed location,
         * but that instead require a heuristic of some sort to
         * identify them.  This includes the ASCII trace files that
@@ -821,8 +823,14 @@ static const struct file_type_info dump_open_table_base[] = {
 
        /* WTAP_FILE_CAMINS */
        { "CAM Inspector file", "camins", "camins", NULL,
+         FALSE, FALSE, 0,
+         NULL, NULL },
+
+       /* WTAP_FILE_STANAG_4607 */
+       { "STANAG 4607 Format", "stanag4607", NULL, NULL,
          FALSE, FALSE, 0,
          NULL, NULL }
+
 };
 
 gint wtap_num_file_types = sizeof(dump_open_table_base) / sizeof(struct file_type_info);
diff --git a/wiretap/stanag4607.c b/wiretap/stanag4607.c
new file mode 100644 (file)
index 0000000..fcd1885
--- /dev/null
@@ -0,0 +1,192 @@
+/* stanag4607.c
+ *
+ * STANAG 4607 file reading
+ *
+ * $Id$
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "config.h"
+
+#include <arpa/inet.h>
+#include <errno.h>
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#include "wtap-int.h"
+#include "file_wrappers.h"
+#include "buffer.h"
+#include "stanag4607.h"
+
+static gboolean is_valid_id(guint16 version_id)
+{
+#define VERSION_21 0x3231
+#define VERSION_30 0x3330
+  if ((version_id != VERSION_21) &&
+      (version_id != VERSION_30))
+     /* Not a stanag4607 file */
+     return FALSE;
+  return TRUE;
+}
+
+static gboolean stanag4607_read_file(wtap *wth, FILE_T fh, struct wtap_pkthdr *phdr,
+                               Buffer *buf, int *err, gchar **err_info)
+{
+  static gint64 base_secs = 0;
+  guint32 millisecs, secs, nsecs;
+  gint64 offset = 0;
+  guint8 stanag_pkt_hdr[37];
+  int bytes_read;
+  guint32 packet_size;
+
+  *err = 0;
+
+  /* Combined packet header and segment header */
+  bytes_read = file_read(stanag_pkt_hdr, sizeof stanag_pkt_hdr, fh);
+  if (bytes_read != sizeof stanag_pkt_hdr)
+    goto fail;
+  offset += bytes_read;
+
+  if (!is_valid_id(pntohs(&stanag_pkt_hdr[0]))) {
+    *err = WTAP_ERR_BAD_FILE;
+    *err_info = g_strdup("Bad version number");
+    return FALSE;
+  }
+
+  /* The next 4 bytes are the packet length */
+  packet_size = pntohl(&stanag_pkt_hdr[2]);
+  phdr->caplen = packet_size;
+  phdr->len = packet_size;
+
+  /* Sadly, the header doesn't contain times; but some segments do */
+  /* So, get the segment header, which is just past tthe 32-byte header. */
+  phdr->presence_flags = WTAP_HAS_TS;
+
+  /* If no time specified, its the last baseline time */
+  phdr->ts.secs = base_secs;
+  phdr->ts.nsecs = 0;
+  millisecs = 0;
+
+#define MISSION_SEGMENT 1
+#define DWELL_SEGMENT 2
+#define JOB_DEFINITION_SEGMENT 5
+#define PLATFORM_LOCATION_SEGMENT 13
+  if (MISSION_SEGMENT == stanag_pkt_hdr[32]) {
+    guint8 mseg[39];
+    struct tm tm;
+
+    bytes_read = file_read(&mseg, sizeof mseg, fh);
+    if (bytes_read != sizeof mseg)
+      goto fail;
+    offset += bytes_read;
+
+    tm.tm_year = pntohs(&mseg[35]) - 1900;
+    tm.tm_mon = mseg[37] - 1;
+    tm.tm_mday = mseg[38];
+    tm.tm_hour = 0;
+    tm.tm_min = 0;
+    tm.tm_sec = 0;
+    tm.tm_isdst = -1;
+    base_secs = mktime(&tm);
+    phdr->ts.secs = base_secs;
+  }
+  else if (PLATFORM_LOCATION_SEGMENT == stanag_pkt_hdr[32]) {
+    bytes_read = file_read(&millisecs, sizeof millisecs, fh);
+    if (bytes_read != sizeof millisecs)
+      goto fail;
+    offset += bytes_read;
+    millisecs = ntohl(millisecs);
+  }
+  else if (DWELL_SEGMENT == stanag_pkt_hdr[32]) {
+    guint8 dseg[19];
+    bytes_read = file_read(&dseg, sizeof dseg, fh);
+    if (bytes_read != sizeof dseg)
+      goto fail;
+    offset += bytes_read;
+    millisecs = pntohl(&dseg[15]);
+  }
+  if (0 != millisecs) {
+    secs = millisecs/1000;
+    nsecs = (millisecs - 1000 * secs) * 1000000;
+    phdr->ts.secs = base_secs + secs;
+    phdr->ts.nsecs = nsecs;
+  }
+
+  /* wind back to the start of the packet ... */
+  if (file_seek(fh, - offset, SEEK_CUR, err) == -1)
+    goto fail;
+
+  return wtap_read_packet_bytes(fh, buf, packet_size, err, err_info);
+
+fail:
+  *err = file_error(wth->fh, err_info);
+  return FALSE;
+}
+
+static gboolean stanag4607_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset)
+{
+  gint64 offset;
+
+  *err = 0;
+
+  offset = file_tell(wth->fh);
+
+  *data_offset = offset;
+
+  return stanag4607_read_file(wth, wth->fh, &wth->phdr, wth->frame_buffer, err, err_info);
+}
+
+static gboolean stanag4607_seek_read(wtap *wth, gint64 seek_off,
+                               struct wtap_pkthdr *phdr,
+                               Buffer *buf, int length _U_, int *err, gchar **err_info)
+{
+  if (file_seek(wth->random_fh, seek_off, SEEK_SET, err) == -1)
+    return FALSE;
+
+  return stanag4607_read_file(wth, wth->random_fh, phdr, buf, err, err_info);
+}
+
+int stanag4607_open(wtap *wth, int *err, gchar **err_info)
+{
+  int bytes_read;
+  guint16 version_id;
+
+  bytes_read = file_read(&version_id, sizeof version_id, wth->fh);
+  if (bytes_read != sizeof version_id) {
+    *err = file_error(wth->fh, err_info);
+    return (*err != 0) ? -1 : 0;
+  }
+
+  if (!is_valid_id(GUINT16_TO_BE(version_id)))
+     /* Not a stanag4607 file */
+     return 0;
+
+  /* seek back to the start of the file  */
+  if (file_seek(wth->fh, 0, SEEK_SET, err) == -1)
+    return -1;
+
+  wth->file_type = WTAP_FILE_STANAG_4607;
+  wth->file_encap = WTAP_ENCAP_STANAG_4607;
+  wth->snapshot_length = 0; /* not known */
+
+  wth->subtype_read = stanag4607_read;
+  wth->subtype_seek_read = stanag4607_seek_read;
+  wth->tsprecision = WTAP_FILE_TSPREC_MSEC;
+
+  return 1;
+}
diff --git a/wiretap/stanag4607.h b/wiretap/stanag4607.h
new file mode 100644 (file)
index 0000000..a6bd190
--- /dev/null
@@ -0,0 +1,32 @@
+/* stanag4607.h
+ *
+ * STANAG 4607 file reading
+ *
+ * $Id$
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#ifndef __STANAG_4607_H__
+#define __STANAG_4607_H__
+
+#include <glib.h>
+#include <wiretap/wtap.h>
+#include "ws_symbol_export.h"
+
+int stanag4607_open(wtap *wth, int *err, gchar **err_info);
+
+#endif
index b4238d7a79314b4591175b991886b5f19208d999..44001a870b884520f247f3f040aa0965399590be 100644 (file)
@@ -248,6 +248,7 @@ extern "C" {
 #define WTAP_ENCAP_RTAC_SERIAL                  154
 #define WTAP_ENCAP_BLUETOOTH_LE_LL              155
 #define WTAP_ENCAP_WIRESHARK_UPPER_PDU          156
+#define WTAP_ENCAP_STANAG_4607                  157
 
 #define WTAP_NUM_ENCAP_TYPES                    wtap_get_num_encap_types()
 
@@ -319,6 +320,7 @@ extern "C" {
 #define WTAP_FILE_VWR_80211                     62
 #define WTAP_FILE_VWR_ETH                       63
 #define WTAP_FILE_CAMINS                        64
+#define WTAP_FILE_STANAG_4607                   65
 
 #define WTAP_NUM_FILE_TYPES                     wtap_get_num_file_types()