Source-Changes-HG archive

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

[src/trunk]: src/sys/rump/net/lib/libshmif Add a little utility to convert sh...



details:   https://anonhg.NetBSD.org/src/rev/26e78e00b5b3
branches:  trunk
changeset: 757039:26e78e00b5b3
user:      pooka <pooka%NetBSD.org@localhost>
date:      Wed Aug 11 12:41:09 2010 +0000

description:
Add a little utility to convert shmif bus traffic to a pcap file
which can be then examined with tcpdump -r, wireshark, etc.

diffstat:

 sys/rump/net/lib/libshmif/dumpbus.c |  133 ++++++++++++++++++++++++++++++++++++
 1 files changed, 133 insertions(+), 0 deletions(-)

diffs (137 lines):

diff -r 7e4f026f4dd0 -r 26e78e00b5b3 sys/rump/net/lib/libshmif/dumpbus.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/rump/net/lib/libshmif/dumpbus.c       Wed Aug 11 12:41:09 2010 +0000
@@ -0,0 +1,133 @@
+/*     $NetBSD: dumpbus.c,v 1.1 2010/08/11 12:41:09 pooka Exp $        */
+
+/*
+ * Little utility to convert shmif bus traffic to a pcap file
+ * which can be then examined with tcpdump -r, wireshark, etc.
+ */
+
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+
+#include <err.h>
+#include <fcntl.h>
+#include <pcap.h>
+#include <stdio.h>
+#include <unistd.h>
+
+/* XXX: sync with driver */
+struct bushdr {
+       uint32_t lock;
+       uint32_t gen;
+       uint32_t last;
+       uint32_t version;
+};
+
+static void
+usage(void)
+{
+
+       fprintf(stderr, "usage: a.out [-p pcapfile] buspath\n");
+       exit(1);
+}
+
+int
+main(int argc, char *argv[])
+{
+       struct stat sb;
+       void *busmem;
+       const char *pcapfile = NULL;
+       uint8_t *curbus, *buslast;
+       struct bushdr *bhdr;
+       int fd, pfd, i, ch;
+
+       while ((ch = getopt(argc, argv, "p:")) != -1) {
+               switch (ch) {
+               case 'p':
+                       pcapfile = optarg;
+                       break;
+               default:
+                       usage();
+               }
+       }
+
+       argc -= optind;
+       argv += optind;
+
+       if (argc != 1)
+               usage();
+
+       fd = open(argv[0], O_RDONLY);
+       if (fd == -1)
+               err(1, "open bus");
+
+       if (fstat(fd, &sb) == -1)
+               err(1, "stat");
+
+       busmem = mmap(NULL, sb.st_size, PROT_READ, MAP_FILE, fd, 0);
+       if (busmem == MAP_FAILED)
+               err(1, "mmap");
+
+       bhdr = busmem;
+       if (bhdr->version != 1)
+               errx(1, "cannot handle bus version %d", bhdr->version);
+       printf("bus version %d, lock: %d, generation: %d, lastoff: 0x%x\n",
+           bhdr->version, bhdr->lock, bhdr->gen, bhdr->last);
+
+       if (bhdr->gen != 0) {
+               printf("this dumper can manage only generation 0, sorry\n");
+               exit(0);
+       }
+
+       if (pcapfile) {
+               struct pcap_file_header phdr;
+
+               pfd = open(pcapfile, O_RDWR | O_CREAT, 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");
+       }
+       
+       curbus = busmem;
+       buslast = curbus + bhdr->last;
+       curbus += sizeof(*bhdr);
+
+       i = 0;
+       while (curbus <= buslast) {
+               uint32_t pktlen;
+               struct pcap_pkthdr packhdr;
+
+               pktlen = *(uint32_t *)curbus;
+               curbus += sizeof(pktlen);
+
+               /* quirk */
+               if (pktlen == 0)
+                       continue;
+
+               printf("packet %d, offset 0x%x, length 0x%x\n",
+                   i++, curbus - (uint8_t *)(bhdr + 1), pktlen);
+
+               if (!pcapfile || pktlen == 0) {
+                       curbus += pktlen;
+                       continue;
+               }
+
+               memset(&packhdr, 0, sizeof(packhdr));
+               packhdr.caplen = packhdr.len = pktlen;
+
+               if (write(pfd, &packhdr, sizeof(packhdr)) != sizeof(packhdr))
+                       err(1, "error writing packethdr");
+               if (write(pfd, curbus, pktlen) != pktlen)
+                       err(1, "write packet");
+               curbus += pktlen;
+       }
+}



Home | Main Index | Thread Index | Old Index