147 lines
4.7 KiB
C++
147 lines
4.7 KiB
C++
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
|
/*
|
|
* Copyright (c) 2005,2006 INRIA
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation;
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
|
*/
|
|
|
|
#ifndef PCAP_WRITER_H
|
|
#define PCAP_WRITER_H
|
|
|
|
#include <stdint.h>
|
|
#include "ns3/ref-count-base.h"
|
|
|
|
namespace ns3 {
|
|
|
|
class Packet;
|
|
|
|
/**
|
|
* \ingroup common
|
|
*
|
|
* \brief Pcap output for Packet logger
|
|
*
|
|
* Log Packets to a file in pcap format which can be
|
|
* read by pcap readers.
|
|
*/
|
|
class PcapWriter : public RefCountBase
|
|
{
|
|
public:
|
|
PcapWriter ();
|
|
~PcapWriter ();
|
|
|
|
/**
|
|
* \param name the name of the file to store packet log into.
|
|
* This method creates the file if it does not exist. If it
|
|
* exists, the file is emptied.
|
|
*/
|
|
void Open (std::string const &name);
|
|
|
|
/**
|
|
* Write a pcap header in the output file which specifies
|
|
* that the content of the file will be Packets with
|
|
* Ethernet/LLC/SNAP encapsulation. This method should
|
|
* be invoked before ns3::PcapWriter::writePacket and after
|
|
* ns3::PcapWriter::open.
|
|
*/
|
|
void WriteEthernetHeader (void);
|
|
|
|
/**
|
|
* Write a pcap header in the output file which specifies
|
|
* that the content of the file will be IPv4 Packets. This
|
|
* method should be invoked before ns3::PcapWriter::WritePacket
|
|
* and after ns3::PcapWriter::Open.
|
|
*/
|
|
void WriteIpHeader (void);
|
|
|
|
/**
|
|
* Write a pcap header in the output file which specifies
|
|
* that the content of the file will be 802.11 Packets. This
|
|
* method should be invoked before ns3::PcapWriter::WritePacket
|
|
* and after ns3::PcapWriter::Open.
|
|
*/
|
|
void WriteWifiHeader (void);
|
|
|
|
/**
|
|
* Write a pcap header in the output file which specifies
|
|
* that the content of the file will be 802.11 Packets preceded by a
|
|
* radiotap header providing PHY layer info. This method should be
|
|
* invoked before ns3::PcapWriter::WritePacket and after
|
|
* ns3::PcapWriter::Open.
|
|
*/
|
|
void WriteWifiRadiotapHeader (void);
|
|
|
|
/**
|
|
* Write a pcap header in the output file which specifies
|
|
* that the content of the file will be 802.11 Packets preceded by a
|
|
* prism header providing PHY layer info. This method should be
|
|
* invoked before ns3::PcapWriter::WritePacket and after
|
|
* ns3::PcapWriter::Open.
|
|
*/
|
|
void WriteWifiPrismHeader (void);
|
|
|
|
/**
|
|
* Write a pcap header in the output file which specifies
|
|
* that the content of the file will be ppp Packets. This
|
|
* method should be invoked before ns3::PcapWriter::WritePacket
|
|
* and after ns3::PcapWriter::Open.
|
|
*/
|
|
void WritePppHeader (void);
|
|
|
|
/**
|
|
* \param packet packet to write to output file
|
|
*/
|
|
void WritePacket (Ptr<const Packet> packet);
|
|
|
|
/**
|
|
* Write a Packet, possibly adding wifi PHY layer information to it
|
|
*
|
|
* @param packet the packet being received
|
|
* @param channelFreqMhz the frequency in MHz at which the packet is
|
|
* received. Note that in real devices this is normally the
|
|
* frequency to which the receiver is tuned, and this can be
|
|
* different than the frequency at which the packet was originally
|
|
* transmitted. This is because it is possible to have the receiver
|
|
* tuned on a given channel and still to be able to receive packets
|
|
* on a nearby channel.
|
|
* @param rate the PHY data rate in units of 500kbps (i.e., the same
|
|
* units used both for the radiotap and for the prism header)
|
|
* @param isPreambleShort true if short preamble is used, false otherwise
|
|
* @param isTx true if packet is being transmitted, false when
|
|
* packet is being received
|
|
* @param signalDbm signal power in dBm
|
|
* @param noiseDbm noise power in dBm
|
|
*/
|
|
void WriteWifiMonitorPacket(Ptr<const Packet> packet, uint16_t channelFreqMhz, uint32_t rate, bool isShortPreamble, bool isTx, double signalDbm, double noiseDbm);
|
|
|
|
|
|
|
|
|
|
private:
|
|
void WriteData (uint8_t const*buffer, uint32_t size);
|
|
void Write64 (uint64_t data);
|
|
void Write32 (uint32_t data);
|
|
void Write16 (uint16_t data);
|
|
void Write8 (uint8_t data);
|
|
void WriteHeader (uint32_t network);
|
|
int8_t RoundToInt8 (double value);
|
|
std::ofstream *m_writer;
|
|
uint32_t m_pcapMode;
|
|
};
|
|
|
|
} // namespace ns3
|
|
|
|
#endif /* PCAP_WRITER_H */
|