VirtualBox

source: vbox/trunk/src/VBox/Devices/Network/Pcap.cpp@ 16954

Last change on this file since 16954 was 10755, checked in by vboxsync, 16 years ago

Share the code writing the pcap files.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.4 KB
Line 
1/* $Id: Pcap.cpp 10755 2008-07-18 19:57:45Z vboxsync $ */
2/** @file
3 * Helpers for writing libpcap files.
4 */
5
6/*
7 * Copyright (C) 2006-2008 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22/*******************************************************************************
23* Header Files *
24*******************************************************************************/
25#include "Pcap.h"
26
27#include <iprt/file.h>
28#include <iprt/stream.h>
29#include <iprt/time.h>
30#include <iprt/err.h>
31
32
33/*******************************************************************************
34* Structures and Typedefs *
35*******************************************************************************/
36
37/* "libpcap" magic */
38#define PCAP_MAGIC 0xa1b2c3d4
39
40/* "libpcap" file header (minus magic number). */
41struct pcap_hdr
42{
43 uint16_t version_major; /* major version number = 2 */
44 uint16_t version_minor; /* minor version number = 4 */
45 int32_t thiszone; /* GMT to local correction = 0 */
46 uint32_t sigfigs; /* accuracy of timestamps = 0 */
47 uint32_t snaplen; /* max length of captured packets, in octets = 0xffff */
48 uint32_t network; /* data link type = 01 */
49};
50
51/* "libpcap" record header. */
52struct pcaprec_hdr
53{
54 uint32_t ts_sec; /* timestamp seconds */
55 uint32_t ts_usec; /* timestamp microseconds */
56 uint32_t incl_len; /* number of octets of packet saved in file */
57 uint32_t orig_len; /* actual length of packet */
58};
59
60struct pcaprec_hdr_init
61{
62 uint32_t u32Magic;
63 struct pcap_hdr pcap;
64 struct pcaprec_hdr rec0;
65};
66
67
68/*******************************************************************************
69* Global Variables *
70*******************************************************************************/
71static pcaprec_hdr_init const s_Hdr =
72{
73 PCAP_MAGIC,
74 { 2, 4, 0, 0, 0xffff, 1 },
75 /* force ethereal to start at 0.000000. */
76 { 0, 1, 0, 60 }
77
78};
79
80
81/**
82 * Internal helper.
83 */
84static void pcapCalcHeader(struct pcaprec_hdr *pHdr, uint64_t StartNanoTS, size_t cbFrame, size_t cbMax)
85{
86 uint64_t u64TS = RTTimeNanoTS() - StartNanoTS;
87 pHdr->ts_sec = (uint32_t)(u64TS / 1000000000);
88 pHdr->ts_usec = (uint32_t)((u64TS / 1000) % 1000000);
89 pHdr->incl_len = RT_MIN(cbFrame, cbMax);
90 pHdr->orig_len = cbFrame;
91}
92
93
94/**
95 * Writes the stream header.
96 *
97 * @returns IPRT status code, @see RTStrmWrite.
98 *
99 * @param pStream The stream handle.
100 * @param StartNanoTS What to subtract from the RTTimeNanoTS output.
101 */
102int PcapStreamHdr(PRTSTREAM pStream, uint64_t StartNanoTS)
103{
104 pcaprec_hdr_init Hdr = s_Hdr;
105 pcapCalcHeader(&Hdr.rec0, StartNanoTS, 60, 0);
106 return RTStrmWrite(pStream, &Hdr, sizeof(Hdr));
107}
108
109
110/**
111 * Writes a frame to a stream.
112 *
113 * @returns IPRT status code, @see RTStrmWrite.
114 *
115 * @param pStream The stream handle.
116 * @param StartNanoTS What to subtract from the RTTimeNanoTS output.
117 * @param pvFrame The start of the frame.
118 * @param cbFrame The size of the frame.
119 * @param cbMax The max number of bytes to include in the file.
120 */
121int PcapStreamFrame(PRTSTREAM pStream, uint64_t StartNanoTS, const void *pvFrame, size_t cbFrame, size_t cbMax)
122{
123 struct pcaprec_hdr Hdr;
124 pcapCalcHeader(&Hdr, StartNanoTS, cbFrame, cbMax);
125 int rc1 = RTStrmWrite(pStream, &Hdr, sizeof(Hdr));
126 int rc2 = RTStrmWrite(pStream, pvFrame, Hdr.incl_len);
127 return RT_SUCCESS(rc1) ? rc2 : rc1;
128}
129
130
131/**
132 * Writes the file header.
133 *
134 * @returns IPRT status code, @see RTFileWrite.
135 *
136 * @param File The file handle.
137 * @param StartNanoTS What to subtract from the RTTimeNanoTS output.
138 */
139int PcapFileHdr(RTFILE File, uint64_t StartNanoTS)
140{
141 pcaprec_hdr_init Hdr = s_Hdr;
142 pcapCalcHeader(&Hdr.rec0, StartNanoTS, 60, 0);
143 return RTFileWrite(File, &Hdr, sizeof(Hdr), NULL);
144}
145
146
147/**
148 * Writes a frame to a file.
149 *
150 * @returns IPRT status code, @see RTFileWrite.
151 *
152 * @param File The file handle.
153 * @param StartNanoTS What to subtract from the RTTimeNanoTS output.
154 * @param pvFrame The start of the frame.
155 * @param cbFrame The size of the frame.
156 * @param cbMax The max number of bytes to include in the file.
157 */
158int PcapFileFrame(RTFILE File, uint64_t StartNanoTS, const void *pvFrame, size_t cbFrame, size_t cbMax)
159{
160 struct pcaprec_hdr Hdr;
161 pcapCalcHeader(&Hdr, StartNanoTS, cbFrame, cbMax);
162 int rc1 = RTFileWrite(File, &Hdr, sizeof(Hdr), NULL);
163 int rc2 = RTFileWrite(File, pvFrame, Hdr.incl_len, NULL);
164 return RT_SUCCESS(rc1) ? rc2 : rc1;
165}
166
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette