updated on Thu Jan 19 00:16:31 UTC 2012
[aur-mirror.git] / qemu-6828 / pcap
blobe26499fda48d48456d812d7cdc1324103a3527a2
1 # HG changeset patch
2 # Parent 6030a90ae3ac82273dbb9dff32752b8d3634271b
4 diff -r 6030a90ae3ac Makefile.target
5 --- a/Makefile.target   Fri Aug 27 04:45:05 2010 -0400
6 +++ b/Makefile.target   Mon Aug 30 13:03:18 2010 -0400
7 @@ -154,6 +154,7 @@
8  ifdef CONFIG_SOFTMMU
9  
10  obj-y = vl.o async.o monitor.o pci.o pci_host.o pcie_host.o machine.o gdbstub.o
11 +obj-y += pcap.o
12  # virtio has to be here due to weird dependency between PCI and virtio-net.
13  # need to fix this properly
14  obj-y += virtio-blk.o virtio-balloon.o virtio-net.o virtio-console.o virtio-pci.o
15 diff -r 6030a90ae3ac net/slirp.c
16 --- a/net/slirp.c       Fri Aug 27 04:45:05 2010 -0400
17 +++ b/net/slirp.c       Mon Aug 30 13:03:18 2010 -0400
18 @@ -31,6 +31,8 @@
19  #include "qemu_socket.h"
20  #include "slirp/libslirp.h"
22 +#include "pcap.h"
24  static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
25  {
26      const char *p, *p1;
27 @@ -104,6 +106,7 @@
28  {
29      SlirpState *s = opaque;
31 +    pcap_dump(pkt, pkt_len);
32      qemu_send_packet(&s->nc, pkt, pkt_len);
33  }
35 @@ -111,6 +114,7 @@
36  {
37      SlirpState *s = DO_UPCAST(SlirpState, nc, nc);
39 +    pcap_dump(buf, size);
40      slirp_input(s->slirp, buf, size);
42      return size;
43 diff -r 6030a90ae3ac pcap.c
44 --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
45 +++ b/pcap.c    Mon Aug 30 13:03:18 2010 -0400
46 @@ -0,0 +1,61 @@
47 +#include <assert.h>
48 +#include <stdio.h>
49 +#include <sys/time.h>
50 +#include <time.h>
52 +#include "pcap.h"
54 +static int started = 0;
55 +static FILE *cap_file;
57 +static void
58 +pcap_write(const char *b, int l) {
59 +       size_t c = fwrite(b, 1, l, cap_file);
60 +       assert(c == l);
61 +       fflush(cap_file);
64 +void
65 +pcap_dump_init(const char *fname) {
66 +       pcap_hdr_t pcap_hdr;
68 +       if (!fname)
69 +               fname = "slirp.cap";
71 +       cap_file = fopen(fname, "wb");
72 +       if (!cap_file) {
73 +               perror("pcap_dump_init:");
74 +               return;
75 +       }
77 +       pcap_hdr.magic_number = PCAP_MAGIC;
78 +       pcap_hdr.version_major = PCAP_VMAJOR;
79 +       pcap_hdr.version_minor = PCAP_VMINOR;
80 +       pcap_hdr.thiszone = 0;
81 +       pcap_hdr.sigfigs = 0;
82 +       pcap_hdr.snaplen = 65535;
83 +       pcap_hdr.network = 1; // Ethernet
85 +       pcap_write((char *)&pcap_hdr, sizeof(pcap_hdr));
87 +       started = 1;
90 +void
91 +pcap_dump(const uint8_t *pkt, int len) {
92 +       pcaprec_hdr_t pkt_hdr;
93 +       struct timeval tv;
95 +       if (!started)
96 +               return;
98 +       gettimeofday(&tv, 0);
100 +       pkt_hdr.ts_sec = tv.tv_sec;
101 +       pkt_hdr.ts_usec = tv.tv_usec;
102 +       pkt_hdr.incl_len = len;
103 +       pkt_hdr.orig_len = len;
105 +       pcap_write((char *)&pkt_hdr, sizeof(pkt_hdr));
106 +       pcap_write((char *)pkt, len);
108 diff -r 6030a90ae3ac pcap.h
109 --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
110 +++ b/pcap.h    Mon Aug 30 13:03:18 2010 -0400
111 @@ -0,0 +1,34 @@
112 +#ifndef _PCAP_H_
113 +#define _PCAP_H_
115 +#include "qemu-common.h"
118 + * Used http://wiki.wireshark.org/Development/LibpcapFileFormat to get the pcap file format
119 + */
121 +#define PCAP_MAGIC     0xa1b2c3d4
122 +#define PCAP_VMAJOR    2
123 +#define PCAP_VMINOR    4
125 +typedef struct pcap_hdr_s {
126 +        uint32_t magic_number;   /* magic number */
127 +        uint16_t version_major;  /* major version number */
128 +        uint16_t version_minor;  /* minor version number */
129 +        int32_t  thiszone;       /* GMT to local correction */
130 +        uint32_t sigfigs;        /* accuracy of timestamps */
131 +        uint32_t snaplen;        /* max length of captured packets, in octets */
132 +        uint32_t network;        /* data link type */
133 +} pcap_hdr_t;
135 +typedef struct pcaprec_hdr_s {
136 +        uint32_t ts_sec;         /* timestamp seconds */
137 +        uint32_t ts_usec;        /* timestamp microseconds */
138 +        uint32_t incl_len;       /* number of octets of packet saved in file */
139 +        uint32_t orig_len;       /* actual length of packet */
140 +} pcaprec_hdr_t;
142 +void pcap_dump_init(const char *fname);
143 +void pcap_dump(const uint8_t *pkt, int len);
145 +#endif //_PCAP_H_
146 diff -r 6030a90ae3ac qemu-options.hx
147 --- a/qemu-options.hx   Fri Aug 27 04:45:05 2010 -0400
148 +++ b/qemu-options.hx   Mon Aug 30 13:03:18 2010 -0400
149 @@ -1394,6 +1394,16 @@
150  @end table
151  ETEXI
153 +#ifdef CONFIG_SLIRP
154 +DEF("pcap", HAS_ARG, QEMU_OPTION_pcap,
155 +"-pcap <file>\n"
156 +"                when -net user is enabled, dump packets to file\n")
157 +#endif
158 +STEXI
159 +@item -pcap @var{file}
160 +When -net user is enabled, dump packets to @var{file}.
161 +ETEXI
163  DEFHEADING()
165  DEFHEADING(Linux/Multiboot boot specific:)
166 diff -r 6030a90ae3ac vl.c
167 --- a/vl.c      Fri Aug 27 04:45:05 2010 -0400
168 +++ b/vl.c      Mon Aug 30 13:03:18 2010 -0400
169 @@ -168,6 +168,10 @@
171  #include "qemu-queue.h"
173 +#ifdef CONFIG_SLIRP
174 +#include "pcap.h"
175 +#endif
177  //#define DEBUG_NET
178  //#define DEBUG_SLIRP
180 @@ -5192,6 +5196,11 @@
181                  }
182                  break;
183  #ifdef CONFIG_SLIRP
184 +            case QEMU_OPTION_pcap:
185 +                pcap_dump_init(optarg);
186 +                break;
187 +#endif
188 +#ifdef CONFIG_SLIRP
189              case QEMU_OPTION_tftp:
190                  legacy_tftp_prefix = optarg;
191                  break;