src/common/pcap-writer.cc
changeset 150 663120712cd9
parent 143 552ff26b4224
child 163 2a7e05018eeb
equal deleted inserted replaced
149:d5b12472c5e2 150:663120712cd9
     1 /* -*- Mode:NS3; -*- */
     1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
     2 /*
     2 /*
     3  * Copyright (c) 2005,2006 INRIA
     3  * Copyright (c) 2005,2006 INRIA
     4  * All rights reserved.
     4  * All rights reserved.
     5  *
     5  *
     6  * This program is free software; you can redistribute it and/or modify
     6  * This program is free software; you can redistribute it and/or modify
    31 
    31 
    32 
    32 
    33 namespace ns3 {
    33 namespace ns3 {
    34 
    34 
    35 enum {
    35 enum {
    36     PCAP_ETHERNET = 1
    36   PCAP_ETHERNET = 1
    37 };
    37 };
    38 
    38 
    39 PcapWriter::PcapWriter ()
    39 PcapWriter::PcapWriter ()
    40 {
    40 {
    41     m_writer = 0;
    41   m_writer = 0;
    42 }
    42 }
    43 PcapWriter::~PcapWriter ()
    43 PcapWriter::~PcapWriter ()
    44 {
    44 {
    45     delete m_writer;
    45   delete m_writer;
    46 }
    46 }
    47 
    47 
    48 void
    48 void
    49 PcapWriter::Open (char const *name)
    49 PcapWriter::Open (char const *name)
    50 {
    50 {
    51     m_writer = new SystemFile ();
    51   m_writer = new SystemFile ();
    52     m_writer->Open (name);
    52   m_writer->Open (name);
    53 }
    53 }
    54 
    54 
    55 void 
    55 void 
    56 PcapWriter::WriteHeaderEthernet (void)
    56 PcapWriter::WriteHeaderEthernet (void)
    57 {
    57 {
    58     Write32 (0xa1b2c3d4);
    58   Write32 (0xa1b2c3d4);
    59     Write16 (2);
    59   Write16 (2);
    60     Write16 (4);
    60   Write16 (4);
    61     Write32 (0);
    61   Write32 (0);
    62     Write32 (0);
    62   Write32 (0);
    63     Write32 (0xffff);
    63   Write32 (0xffff);
    64     Write32 (PCAP_ETHERNET);
    64   Write32 (PCAP_ETHERNET);
    65 }
    65 }
    66 
    66 
    67 void 
    67 void 
    68 PcapWriter::WritePacket (Packet const packet)
    68 PcapWriter::WritePacket (Packet const packet)
    69 {
    69 {
    70     if (m_writer != 0) 
    70   if (m_writer != 0) 
    71       {
    71     {
    72         uint64_t current = Simulator::Now ().ApproximateToMicroSeconds ();
    72       uint64_t current = Simulator::Now ().ApproximateToMicroSeconds ();
    73         uint64_t s = current / 1000000;
    73       uint64_t s = current / 1000000;
    74         uint64_t us = current % 1000000;
    74       uint64_t us = current % 1000000;
    75         Write32 (s & 0xffffffff);
    75       Write32 (s & 0xffffffff);
    76         Write32 (us & 0xffffffff);
    76       Write32 (us & 0xffffffff);
    77         Write32 (packet.GetSize ());
    77       Write32 (packet.GetSize ());
    78         Write32 (packet.GetSize ());
    78       Write32 (packet.GetSize ());
    79     	m_writer->Write (packet.PeekData (), packet.GetSize ());
    79   	m_writer->Write (packet.PeekData (), packet.GetSize ());
    80       }
    80     }
    81 }
    81 }
    82 
    82 
    83 void
    83 void
    84 PcapWriter::WriteData (uint8_t *buffer, uint32_t size)
    84 PcapWriter::WriteData (uint8_t *buffer, uint32_t size)
    85 {
    85 {
    86     m_writer->Write (buffer, size);
    86   m_writer->Write (buffer, size);
    87 }
    87 }
    88 void
    88 void
    89 PcapWriter::Write32 (uint32_t data)
    89 PcapWriter::Write32 (uint32_t data)
    90 {
    90 {
    91     m_writer->Write ((uint8_t*)&data, 4);
    91   m_writer->Write ((uint8_t*)&data, 4);
    92 }
    92 }
    93 void
    93 void
    94 PcapWriter::Write16 (uint16_t data)
    94 PcapWriter::Write16 (uint16_t data)
    95 {
    95 {
    96     m_writer->Write ((uint8_t*)&data, 2);
    96   m_writer->Write ((uint8_t*)&data, 2);
    97 }
    97 }
    98 
    98 
    99 }; // namespace ns3
    99 }; // namespace ns3