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