Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/shmif_dumpbus * attempt to make this endian-independ...



details:   https://anonhg.NetBSD.org/src/rev/dbadde22e924
branches:  trunk
changeset: 763225:dbadde22e924
user:      pooka <pooka%NetBSD.org@localhost>
date:      Mon Mar 14 11:08:28 2011 +0000

description:
* attempt to make this endian-independent (tested only on el)
* write via libpcap (since i thought there would be some fancy
  api to deal with endianness.  after doing 80% of the work i
  noticed there wasn't, but went ahead anyway)

diffstat:

 usr.bin/shmif_dumpbus/Makefile        |    4 +-
 usr.bin/shmif_dumpbus/shmif_dumpbus.c |  102 ++++++++++++++-------------------
 2 files changed, 47 insertions(+), 59 deletions(-)

diffs (202 lines):

diff -r 8b5b5b1f1a13 -r dbadde22e924 usr.bin/shmif_dumpbus/Makefile
--- a/usr.bin/shmif_dumpbus/Makefile    Mon Mar 14 09:25:01 2011 +0000
+++ b/usr.bin/shmif_dumpbus/Makefile    Mon Mar 14 11:08:28 2011 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: Makefile,v 1.1 2011/01/12 16:14:24 pooka Exp $
+#      $NetBSD: Makefile,v 1.2 2011/03/14 11:08:28 pooka Exp $
 #
 
 .include <bsd.own.mk>
@@ -10,4 +10,6 @@
 SRCS+=         shmif_dumpbus.c shmif_busops.c
 CPPFLAGS+=     -I${SHMIFD}
 
+LDADD+=                -lpcap
+
 .include <bsd.prog.mk>
diff -r 8b5b5b1f1a13 -r dbadde22e924 usr.bin/shmif_dumpbus/shmif_dumpbus.c
--- a/usr.bin/shmif_dumpbus/shmif_dumpbus.c     Mon Mar 14 09:25:01 2011 +0000
+++ b/usr.bin/shmif_dumpbus/shmif_dumpbus.c     Mon Mar 14 11:08:28 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: shmif_dumpbus.c,v 1.4 2011/03/12 18:27:42 pooka Exp $  */
+/*     $NetBSD: shmif_dumpbus.c,v 1.5 2011/03/14 11:08:28 pooka Exp $  */
 
 /*-
  * Copyright (c) 2010 Antti Kantee.  All Rights Reserved.
@@ -34,6 +34,8 @@
 #include <sys/mman.h>
 #include <sys/stat.h>
 
+#include <machine/bswap.h>
+
 #include <assert.h>
 #include <err.h>
 #include <fcntl.h>
@@ -55,20 +57,9 @@
        exit(1);
 }
 
-/*
- * Apparently pcap uses a non-exported structure as the on-disk
- * packet header.  Since that format isn't very likely to change
- * soon, just define a local version
- */
-struct ondisk_pcaphdr {
-       uint32_t ts_sec;
-       uint32_t ts_usec;
-       uint32_t caplen;
-       uint32_t len;
-
-};
-
 #define BUFSIZE 64*1024
+#define SWAPME(a) (doswap ? bswap32(a) : (a))
+#define SWAPME64(a) (doswap ? bswap64(a) : (a))
 int
 main(int argc, char *argv[])
 {
@@ -77,10 +68,11 @@
        const char *pcapfile = NULL;
        uint32_t curbus, buslast;
        struct shmif_mem *bmem;
-       int fd, pfd, i, ch;
+       int fd, i, ch;
        int bonus;
        char *buf;
-       bool hflag = false;
+       bool hflag = false, doswap = false, isstdout;
+       pcap_dumper_t *pdump;
 
        setprogname(argv[0]);
        while ((ch = getopt(argc, argv, "hp:")) != -1) {
@@ -118,45 +110,37 @@
                err(1, "mmap");
        bmem = busmem;
 
-       if (bmem->shm_magic != SHMIF_MAGIC)
-               errx(1, "%s not a shmif bus", argv[0]);
-       if (bmem->shm_version != SHMIF_VERSION)
+       if (bmem->shm_magic != SHMIF_MAGIC) {
+               if (bmem->shm_magic != bswap32(SHMIF_MAGIC))
+                       errx(1, "%s not a shmif bus", argv[0]);
+               doswap = 1;
+       }
+       if (SWAPME(bmem->shm_version) != SHMIF_VERSION)
                errx(1, "bus vesrsion %d, program %d",
-                   bmem->shm_version, SHMIF_VERSION);
+                   SWAPME(bmem->shm_version), SHMIF_VERSION);
        printf("bus version %d, lock: %d, generation: %" PRIu64
            ", firstoff: 0x%04x, lastoff: 0x%04x\n",
-           bmem->shm_version, bmem->shm_lock, bmem->shm_gen,
-           bmem->shm_first, bmem->shm_last);
+           SWAPME(bmem->shm_version), SWAPME(bmem->shm_lock),
+           SWAPME64(bmem->shm_gen),
+           SWAPME(bmem->shm_first), SWAPME(bmem->shm_last));
 
        if (hflag)
                exit(0);
 
        if (pcapfile) {
-               struct pcap_file_header phdr;
-
-               if (strcmp(pcapfile, "-") == 0) {
-                       pfd = STDOUT_FILENO;
-               } else {
-                       pfd = open(pcapfile, O_RDWR | O_CREAT | O_TRUNC, 0777);
-                       if (pfd == -1)
-                               err(1, "create pcap dump");
-               }
-
-               memset(&phdr, 0, sizeof(phdr));
-               phdr.magic = 0xa1b2c3d4; /* tcpdump magic */
-               phdr.version_major = PCAP_VERSION_MAJOR;
-               phdr.version_minor = PCAP_VERSION_MINOR;
-               phdr.snaplen = 1518;
-               phdr.linktype = DLT_EN10MB;
-
-               if (write(pfd, &phdr, sizeof(phdr)) != sizeof(phdr))
-                       err(1, "phdr write");
+               isstdout = strcmp(pcapfile, "-") == 0;
+               pcap_t *pcap = pcap_open_dead(DLT_EN10MB, 1518);
+               pdump = pcap_dump_open(pcap, pcapfile);
+               if (pdump == NULL)
+                       err(1, "cannot open pcap dump file");
        } else {
-               pfd = -1; /* XXXgcc */
+               /* XXXgcc */
+               isstdout = false;
+               pdump = NULL;
        }
        
-       curbus = bmem->shm_first;
-       buslast = bmem->shm_last;
+       curbus = SWAPME(bmem->shm_first);
+       buslast = SWAPME(bmem->shm_last);
        if (curbus == BUSMEM_DATASIZE)
                curbus = 0;
 
@@ -166,9 +150,10 @@
 
        i = 0;
        while (curbus <= buslast || bonus) {
-               struct ondisk_pcaphdr packhdr;
+               struct pcap_pkthdr packhdr;
                struct shmif_pkthdr sp;
                uint32_t oldoff;
+               uint32_t curlen;
                bool wrap;
 
                assert(curbus < sb.st_size);
@@ -180,38 +165,39 @@
                        bonus = 0;
 
                assert(curbus < sb.st_size);
+               curlen = SWAPME(sp.sp_len);
 
-               if (sp.sp_len == 0) {
+               if (curlen == 0) {
                        continue;
                }
 
-               if (pfd != STDOUT_FILENO)
+               if (!isstdout)
                        printf("packet %d, offset 0x%04x, length 0x%04x, "
                            "ts %d/%06d\n", i++, curbus,
-                           sp.sp_len, sp.sp_sec, sp.sp_usec);
+                           curlen, SWAPME(sp.sp_sec), SWAPME(sp.sp_usec));
 
                if (!pcapfile) {
                        curbus = shmif_busread(bmem,
-                           buf, curbus, sp.sp_len, &wrap);
+                           buf, curbus, curlen, &wrap);
                        if (wrap)
                                bonus = 0;
                        continue;
                }
 
                memset(&packhdr, 0, sizeof(packhdr));
-               packhdr.caplen = packhdr.len = sp.sp_len;
-               packhdr.ts_sec = sp.sp_sec;
-               packhdr.ts_usec = sp.sp_usec;
-               assert(sp.sp_len <= BUFSIZE);
+               packhdr.caplen = packhdr.len = curlen;
+               packhdr.ts.tv_sec = SWAPME(sp.sp_sec);
+               packhdr.ts.tv_usec = SWAPME(sp.sp_usec);
+               assert(curlen <= BUFSIZE);
 
-               if (write(pfd, &packhdr, sizeof(packhdr)) != sizeof(packhdr))
-                       err(1, "error writing packethdr");
-               curbus = shmif_busread(bmem, buf, curbus, sp.sp_len, &wrap);
-               if (write(pfd, buf, sp.sp_len) != (ssize_t)sp.sp_len)
-                       err(1, "write packet");
+               curbus = shmif_busread(bmem, buf, curbus, curlen, &wrap);
+               pcap_dump((u_char *)pdump, &packhdr, (u_char *)buf);
                if (wrap)
                        bonus = 0;
        }
 
+       if (pcapfile)
+               pcap_dump_close(pdump);
+
        return 0;
 }



Home | Main Index | Thread Index | Old Index