src/fd-net-device/model/fd-net-device.cc
author Tom Henderson <tomh@tomh.org>
Mon, 28 Sep 2015 20:27:25 -0700
changeset 11676 05ea1489e509
parent 11547 941beab1b849
permissions -rw-r--r--
bug 2184: Integer overflow in MacLow
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
     2
/*
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
     3
 * Copyright (c) 2012 INRIA, 2012 University of Washington
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
     4
 *
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
     7
 * published by the Free Software Foundation;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
     8
 *
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    12
 * GNU General Public License for more details.
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    13
 *
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    17
 *
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    18
 * Author: Alina Quereilhac <alina.quereilhac@inria.fr>
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    19
 *         Claudio Freire <klaussfreire@sourceforge.net>
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    20
 */
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    21
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    22
#include "fd-net-device.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    23
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    24
#include "ns3/abort.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    25
#include "ns3/boolean.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    26
#include "ns3/channel.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    27
#include "ns3/enum.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    28
#include "ns3/ethernet-header.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    29
#include "ns3/ethernet-trailer.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    30
#include "ns3/log.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    31
#include "ns3/llc-snap-header.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    32
#include "ns3/mac48-address.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    33
#include "ns3/pointer.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    34
#include "ns3/simulator.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    35
#include "ns3/string.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    36
#include "ns3/trace-source-accessor.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    37
#include "ns3/uinteger.h"
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    38
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    39
#include <unistd.h>
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    40
#include <arpa/inet.h>
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    41
#include <net/ethernet.h>
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    42
10968
2d29fee2b7b8 [Bug 1551] Redux: NS_LOG_COMPONENT_DEFINE inside or outside of ns3 namespace?
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10652
diff changeset
    43
namespace ns3 {
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    44
10968
2d29fee2b7b8 [Bug 1551] Redux: NS_LOG_COMPONENT_DEFINE inside or outside of ns3 namespace?
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10652
diff changeset
    45
NS_LOG_COMPONENT_DEFINE ("FdNetDevice");
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    46
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    47
FdNetDeviceFdReader::FdNetDeviceFdReader ()
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    48
  : m_bufferSize (65536) // Defaults to maximum TCP window size
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    49
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    50
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    51
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    52
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    53
FdNetDeviceFdReader::SetBufferSize (uint32_t bufferSize)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    54
{
11220
018b26ee77e7 add comments and logging around changeset c97ef876d98c
Tom Henderson <tomh@tomh.org>
parents: 11219
diff changeset
    55
  NS_LOG_FUNCTION (this << bufferSize);
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    56
  m_bufferSize = bufferSize;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    57
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    58
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    59
FdReader::Data FdNetDeviceFdReader::DoRead (void)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    60
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    61
  NS_LOG_FUNCTION (this);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    62
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    63
  uint8_t *buf = (uint8_t *)malloc (m_bufferSize);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    64
  NS_ABORT_MSG_IF (buf == 0, "malloc() failed");
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    65
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    66
  NS_LOG_LOGIC ("Calling read on fd " << m_fd);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    67
  ssize_t len = read (m_fd, buf, m_bufferSize);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    68
  if (len <= 0)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    69
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    70
      free (buf);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    71
      buf = 0;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    72
      len = 0;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    73
    }
11220
018b26ee77e7 add comments and logging around changeset c97ef876d98c
Tom Henderson <tomh@tomh.org>
parents: 11219
diff changeset
    74
  NS_LOG_LOGIC ("Read " << len << " bytes on fd " << m_fd);
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    75
  return FdReader::Data (buf, len);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    76
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    77
10652
dc18deba4502 [doxygen] Revert r10410, r10411, r10412
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10410
diff changeset
    78
NS_OBJECT_ENSURE_REGISTERED (FdNetDevice);
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    79
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    80
TypeId
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    81
FdNetDevice::GetTypeId (void)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    82
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    83
  static TypeId tid = TypeId ("ns3::FdNetDevice")
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    84
    .SetParent<NetDevice> ()
11371
7b99ca2ee2e7 SetGroupName for fd-net-device module
Tom Henderson <tomh@tomh.org>
parents: 11220
diff changeset
    85
    .SetGroupName ("FdNetDevice")
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    86
    .AddConstructor<FdNetDevice> ()
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    87
    .AddAttribute ("Address",
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    88
                   "The MAC address of this device.",
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    89
                   Mac48AddressValue (Mac48Address ("ff:ff:ff:ff:ff:ff")),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    90
                   MakeMac48AddressAccessor (&FdNetDevice::m_address),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    91
                   MakeMac48AddressChecker ())
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    92
    .AddAttribute ("Start",
11085
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    93
                   "The simulation time at which to spin up "
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    94
                   "the device thread.",
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    95
                   TimeValue (Seconds (0.)),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    96
                   MakeTimeAccessor (&FdNetDevice::m_tStart),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    97
                   MakeTimeChecker ())
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
    98
    .AddAttribute ("Stop",
11085
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    99
                   "The simulation time at which to tear down "
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   100
                   "the device thread.",
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   101
                   TimeValue (Seconds (0.)),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   102
                   MakeTimeAccessor (&FdNetDevice::m_tStop),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   103
                   MakeTimeChecker ())
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   104
    .AddAttribute ("EncapsulationMode",
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   105
                   "The link-layer encapsulation type to use.",
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   106
                   EnumValue (DIX),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   107
                   MakeEnumAccessor (&FdNetDevice::m_encapMode),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   108
                   MakeEnumChecker (DIX, "Dix",
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   109
                                    LLC, "Llc",
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   110
                                    DIXPI, "DixPi"))
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   111
    .AddAttribute ("RxQueueSize", "Maximum size of the read queue.  "
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   112
                   "This value limits number of packets that have been read "
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   113
                   "from the network into a memory buffer but have not yet "
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   114
                   "been processed by the simulator.",
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   115
                   UintegerValue (1000),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   116
                   MakeUintegerAccessor (&FdNetDevice::m_maxPendingReads),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   117
                   MakeUintegerChecker<uint32_t> ())
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   118
    //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   119
    // Trace sources at the "top" of the net device, where packets transition
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   120
    // to/from higher layers.  These points do not really correspond to the
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   121
    // MAC layer of the underlying operating system, but exist to provide
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   122
    // a consitent tracing environment.  These trace hooks should really be
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   123
    // interpreted as the points at which a packet leaves the ns-3 environment
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   124
    // destined for the underlying operating system or vice-versa.
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   125
    //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   126
    .AddTraceSource ("MacTx",
11085
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   127
                     "Trace source indicating a packet has "
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   128
                     "arrived for transmission by this device",
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   129
                     MakeTraceSourceAccessor (&FdNetDevice::m_macTxTrace),
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   130
                     "ns3::Packet::TracedCallback")
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   131
    .AddTraceSource ("MacTxDrop",
11085
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   132
                     "Trace source indicating a packet has "
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   133
                     "been dropped by the device before transmission",
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   134
                     MakeTraceSourceAccessor (&FdNetDevice::m_macTxDropTrace),
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   135
                     "ns3::Packet::TracedCallback")
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   136
    .AddTraceSource ("MacPromiscRx",
11085
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   137
                     "A packet has been received by this device, "
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   138
                     "has been passed up from the physical layer "
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   139
                     "and is being forwarded up the local protocol stack.  "
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   140
                     "This is a promiscuous trace,",
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   141
                     MakeTraceSourceAccessor (&FdNetDevice::m_macPromiscRxTrace),
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   142
                     "ns3::Packet::TracedCallback")
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   143
    .AddTraceSource ("MacRx",
11085
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   144
                     "A packet has been received by this device, "
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   145
                     "has been passed up from the physical layer "
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   146
                     "and is being forwarded up the local protocol stack.  "
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   147
                     "This is a non-promiscuous trace,",
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   148
                     MakeTraceSourceAccessor (&FdNetDevice::m_macRxTrace),
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   149
                     "ns3::Packet::TracedCallback")
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   150
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   151
    //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   152
    // Trace sources designed to simulate a packet sniffer facility (tcpdump).
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   153
    //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   154
    .AddTraceSource ("Sniffer",
11085
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   155
                     "Trace source simulating a non-promiscuous "
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   156
                     "packet sniffer attached to the device",
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   157
                     MakeTraceSourceAccessor (&FdNetDevice::m_snifferTrace),
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   158
                     "ns3::Packet::TracedCallback")
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   159
    .AddTraceSource ("PromiscSniffer",
11085
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   160
                     "Trace source simulating a promiscuous "
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   161
                     "packet sniffer attached to the device",
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   162
                     MakeTraceSourceAccessor (&FdNetDevice::m_promiscSnifferTrace),
6e4d08656d7c TracedCallback function signatures, the simple ones.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   163
                     "ns3::Packet::TracedCallback")
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   164
  ;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   165
  return tid;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   166
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   167
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   168
FdNetDevice::FdNetDevice ()
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   169
  : m_node (0),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   170
    m_ifIndex (0),
11547
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   171
    // Defaults to Ethernet v2 MTU
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   172
    m_mtu (1500),
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   173
    m_fd (-1),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   174
    m_fdReader (0),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   175
    m_isBroadcast (true),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   176
    m_isMulticast (false),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   177
    m_startEvent (),
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   178
    m_stopEvent ()
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   179
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   180
  NS_LOG_FUNCTION (this);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   181
  Start (m_tStart);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   182
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   183
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   184
FdNetDevice::FdNetDevice (FdNetDevice const &)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   185
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   186
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   187
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   188
FdNetDevice::~FdNetDevice ()
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   189
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   190
  NS_LOG_FUNCTION (this);
11547
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   191
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   192
  {
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   193
    CriticalSection cs (m_pendingReadMutex);
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   194
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   195
    while (!m_pendingQueue.empty ())
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   196
      {
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   197
        std::pair<uint8_t *, ssize_t> next = m_pendingQueue.front ();
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   198
        m_pendingQueue.pop ();
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   199
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   200
        free (next.first);
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   201
      }
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   202
  }
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   203
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   204
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   205
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   206
FdNetDevice::DoDispose (void)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   207
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   208
  NS_LOG_FUNCTION (this);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   209
  StopDevice ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   210
  NetDevice::DoDispose ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   211
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   212
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   213
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   214
FdNetDevice::SetEncapsulationMode (enum EncapsulationMode mode)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   215
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   216
  NS_LOG_FUNCTION (mode);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   217
  m_encapMode = mode;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   218
  NS_LOG_LOGIC ("m_encapMode = " << m_encapMode);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   219
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   220
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   221
FdNetDevice::EncapsulationMode
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   222
FdNetDevice::GetEncapsulationMode (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   223
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   224
  NS_LOG_FUNCTION (this);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   225
  return m_encapMode;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   226
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   227
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   228
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   229
FdNetDevice::Start (Time tStart)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   230
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   231
  NS_LOG_FUNCTION (tStart);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   232
  Simulator::Cancel (m_startEvent);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   233
  m_startEvent = Simulator::Schedule (tStart, &FdNetDevice::StartDevice, this);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   234
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   235
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   236
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   237
FdNetDevice::Stop (Time tStop)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   238
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   239
  NS_LOG_FUNCTION (tStop);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   240
  Simulator::Cancel (m_stopEvent);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   241
  m_startEvent = Simulator::Schedule (tStop, &FdNetDevice::StopDevice, this);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   242
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   243
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   244
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   245
FdNetDevice::StartDevice (void)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   246
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   247
  NS_LOG_FUNCTION (this);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   248
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   249
  if (m_fd == -1)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   250
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   251
      NS_LOG_DEBUG ("FdNetDevice::Start(): Failure, invalid file descriptor.");
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   252
      return;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   253
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   254
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   255
  // A similar story exists for the node ID.  We can't just naively do a
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   256
  // GetNode ()->GetId () since GetNode is going to give us a Ptr<Node> which
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   257
  // is reference counted.  We need to stash away the node ID for use in the
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   258
  // read thread.
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   259
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   260
  m_nodeId = GetNode ()->GetId ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   261
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   262
  m_fdReader = Create<FdNetDeviceFdReader> ();
11220
018b26ee77e7 add comments and logging around changeset c97ef876d98c
Tom Henderson <tomh@tomh.org>
parents: 11219
diff changeset
   263
  // 22 bytes covers 14 bytes Ethernet header with possible 8 bytes LLC/SNAP
11547
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   264
  m_fdReader->SetBufferSize (m_mtu + 22);
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   265
  m_fdReader->Start (m_fd, MakeCallback (&FdNetDevice::ReceiveCallback, this));
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   266
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   267
  NotifyLinkUp ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   268
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   269
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   270
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   271
FdNetDevice::StopDevice (void)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   272
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   273
  NS_LOG_FUNCTION (this);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   274
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   275
  if (m_fdReader != 0)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   276
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   277
      m_fdReader->Stop ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   278
      m_fdReader = 0;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   279
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   280
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   281
  if (m_fd != -1)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   282
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   283
      close (m_fd);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   284
      m_fd = -1;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   285
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   286
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   287
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   288
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   289
FdNetDevice::ReceiveCallback (uint8_t *buf, ssize_t len)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   290
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   291
  NS_LOG_FUNCTION (this << buf << len);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   292
  bool skip = false;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   293
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   294
  {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   295
    CriticalSection cs (m_pendingReadMutex);
11547
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   296
    if (m_pendingQueue.size () >= m_maxPendingReads)
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   297
      {
11220
018b26ee77e7 add comments and logging around changeset c97ef876d98c
Tom Henderson <tomh@tomh.org>
parents: 11219
diff changeset
   298
        NS_LOG_WARN ("Packet dropped");
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   299
        skip = true;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   300
      }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   301
    else
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   302
      {
11547
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   303
        m_pendingQueue.push (std::make_pair (buf, len));
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   304
      }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   305
  }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   306
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   307
  if (skip)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   308
    {
11547
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   309
      struct timespec time = {
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   310
        0, 100000000L
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   311
      };                                        // 100 ms
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   312
      nanosleep (&time, NULL);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   313
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   314
  else
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   315
    {
11547
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   316
      Simulator::ScheduleWithContext (m_nodeId, Time (0), MakeEvent (&FdNetDevice::ForwardUp, this));
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   317
    }
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   318
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   319
11407
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   320
/**
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   321
 * \ingroup fd-net-device
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   322
 * \brief Synthesize PI header for the kernel
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   323
 * \param buf the buffer to add the header to
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   324
 * \param len the buffer length
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   325
 *
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   326
 * \todo Consider having a instance member m_packetBuffer and using memmove
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   327
 * instead of memcpy to add the PI header. It might be faster in this case
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   328
 * to use memmove and avoid the extra mallocs.
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   329
 */
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   330
static void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   331
AddPIHeader (uint8_t *&buf, ssize_t &len)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   332
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   333
  // Synthesize PI header for our friend the kernel
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   334
  uint8_t *buf2 = (uint8_t*)malloc (len + 4);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   335
  memcpy (buf2 + 4, buf, len);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   336
  len += 4;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   337
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   338
  // PI = 16 bits flags (0) + 16 bits proto
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   339
  // NOTE: be careful to interpret buffer data explicitly as
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   340
  //  little-endian to be insensible to native byte ordering.
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   341
  uint16_t flags = 0;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   342
  uint16_t proto = 0x0008; // default to IPv4
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   343
  if (len > 14)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   344
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   345
      if (buf[12] == 0x81 && buf[13] == 0x00 && len > 18)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   346
        {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   347
          // tagged ethernet packet
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   348
          proto = buf[16] | (buf[17] << 8);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   349
        }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   350
      else
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   351
        {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   352
          // untagged ethernet packet
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   353
          proto = buf[12] | (buf[13] << 8);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   354
        }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   355
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   356
  buf2[0] = (uint8_t)flags;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   357
  buf2[1] = (uint8_t)(flags >> 8);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   358
  buf2[2] = (uint8_t)proto;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   359
  buf2[3] = (uint8_t)(proto >> 8);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   360
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   361
  // swap buffer
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   362
  free (buf);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   363
  buf = buf2;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   364
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   365
11407
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   366
/**
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   367
 * \ingroup fd-net-device
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   368
 * \brief Removes PI header
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   369
 * \param buf the buffer to add the header to
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   370
 * \param len the buffer length
c175567f535a [Doxygen] fd-net-device module fixes
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11371
diff changeset
   371
 */
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   372
static void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   373
RemovePIHeader (uint8_t *&buf, ssize_t &len)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   374
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   375
  // strip PI header if present, shrink buffer
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   376
  if (len >= 4)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   377
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   378
      len -= 4;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   379
      memmove (buf, buf + 4, len);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   380
      buf = (uint8_t*)realloc (buf, len);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   381
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   382
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   383
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   384
void
11547
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   385
FdNetDevice::ForwardUp (void)
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   386
{
11547
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   387
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   388
  uint8_t *buf = 0; 
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   389
  ssize_t len = 0;
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   390
11547
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   391
  {
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   392
    CriticalSection cs (m_pendingReadMutex);
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   393
    std::pair<uint8_t *, ssize_t> next = m_pendingQueue.front ();
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   394
    m_pendingQueue.pop ();
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   395
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   396
    buf = next.first;
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   397
    len = next.second;
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   398
  }
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   399
941beab1b849 bug 2119: Fixing memory leaks in FdNetDevice test with DefaultSimulatorImpl due to non-executed events when simulation ends
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11407
diff changeset
   400
  NS_LOG_FUNCTION (this << buf << len);
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   401
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   402
  // We need to remove the PI header and ignore it
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   403
  if (m_encapMode == DIXPI)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   404
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   405
      RemovePIHeader (buf, len);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   406
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   407
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   408
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   409
  // Create a packet out of the buffer we received and free that buffer.
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   410
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   411
  Ptr<Packet> packet = Create<Packet> (reinterpret_cast<const uint8_t *> (buf), len);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   412
  free (buf);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   413
  buf = 0;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   414
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   415
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   416
  // Trace sinks will expect complete packets, not packets without some of the
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   417
  // headers
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   418
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   419
  Ptr<Packet> originalPacket = packet->Copy ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   420
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   421
  Mac48Address destination;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   422
  Mac48Address source;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   423
  uint16_t protocol;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   424
  bool isBroadcast = false;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   425
  bool isMulticast = false;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   426
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   427
  EthernetHeader header (false);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   428
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   429
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   430
  // This device could be running in an environment where completely unexpected
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   431
  // kinds of packets are flying around, so we need to harden things a bit and
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   432
  // filter out packets we think are completely bogus, so we always check to see
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   433
  // that the packet is long enough to contain the header we want to remove.
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   434
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   435
  if (packet->GetSize () < header.GetSerializedSize ())
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   436
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   437
      m_phyRxDropTrace (originalPacket);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   438
      return;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   439
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   440
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   441
  packet->RemoveHeader (header);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   442
  destination = header.GetDestination ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   443
  source = header.GetSource ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   444
  isBroadcast = header.GetDestination ().IsBroadcast ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   445
  isMulticast = header.GetDestination ().IsGroup ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   446
  protocol = header.GetLengthType ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   447
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   448
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   449
  // If the length/type is less than 1500, it corresponds to a length
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   450
  // interpretation packet.  In this case, it is an 802.3 packet and
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   451
  // will also have an 802.2 LLC header.  If greater than 1500, we
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   452
  // find the protocol number (Ethernet type) directly.
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   453
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   454
  if (m_encapMode == LLC and header.GetLengthType () <= 1500)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   455
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   456
      LlcSnapHeader llc;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   457
      //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   458
      // Check to see that the packet is long enough to possibly contain the
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   459
      // header we want to remove before just naively calling.
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   460
      //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   461
      if (packet->GetSize () < llc.GetSerializedSize ())
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   462
        {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   463
          m_phyRxDropTrace (originalPacket);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   464
          return;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   465
        }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   466
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   467
      packet->RemoveHeader (llc);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   468
      protocol = llc.GetType ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   469
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   470
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   471
  NS_LOG_LOGIC ("Pkt source is " << source);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   472
  NS_LOG_LOGIC ("Pkt destination is " << destination);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   473
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   474
  PacketType packetType;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   475
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   476
  if (isBroadcast)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   477
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   478
      packetType = NS3_PACKET_BROADCAST;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   479
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   480
  else if (isMulticast)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   481
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   482
      packetType = NS3_PACKET_MULTICAST;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   483
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   484
  else if (destination == m_address)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   485
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   486
      packetType = NS3_PACKET_HOST;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   487
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   488
  else
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   489
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   490
      packetType = NS3_PACKET_OTHERHOST;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   491
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   492
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   493
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   494
  // For all kinds of packetType we receive, we hit the promiscuous sniffer
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   495
  // hook and pass a copy up to the promiscuous callback.  Pass a copy to
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   496
  // make sure that nobody messes with our packet.
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   497
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   498
  m_promiscSnifferTrace (originalPacket);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   499
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   500
  if (!m_promiscRxCallback.IsNull ())
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   501
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   502
      m_macPromiscRxTrace (originalPacket);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   503
      m_promiscRxCallback (this, packet, protocol, source, destination,
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   504
                           packetType);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   505
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   506
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   507
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   508
  // If this packet is not destined for some other host, it must be for us
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   509
  // as either a broadcast, multicast or unicast.  We need to hit the mac
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   510
  // packet received trace hook and forward the packet up the stack.
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   511
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   512
  if (packetType != NS3_PACKET_OTHERHOST)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   513
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   514
      m_snifferTrace (originalPacket);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   515
      m_macRxTrace (originalPacket);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   516
      m_rxCallback (this, packet, protocol, source);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   517
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   518
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   519
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   520
bool
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   521
FdNetDevice::Send (Ptr<Packet> packet, const Address& destination, uint16_t protocolNumber)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   522
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   523
  NS_LOG_FUNCTION (this << packet << destination << protocolNumber);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   524
  return SendFrom (packet, m_address, destination, protocolNumber);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   525
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   526
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   527
bool
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   528
FdNetDevice::SendFrom (Ptr<Packet> packet, const Address& src, const Address& dest, uint16_t protocolNumber)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   529
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   530
  NS_LOG_FUNCTION (this << packet << src << dest << protocolNumber);
11220
018b26ee77e7 add comments and logging around changeset c97ef876d98c
Tom Henderson <tomh@tomh.org>
parents: 11219
diff changeset
   531
  NS_LOG_LOGIC ("packet: " << packet << " UID: " << packet->GetUid ());
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   532
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   533
  if (IsLinkUp () == false)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   534
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   535
      m_macTxDropTrace (packet);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   536
      return false;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   537
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   538
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   539
  Mac48Address destination = Mac48Address::ConvertFrom (dest);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   540
  Mac48Address source = Mac48Address::ConvertFrom (src);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   541
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   542
  NS_LOG_LOGIC ("Transmit packet with UID " << packet->GetUid ());
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   543
  NS_LOG_LOGIC ("Transmit packet from " << source);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   544
  NS_LOG_LOGIC ("Transmit packet to " << destination);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   545
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   546
  EthernetHeader header (false);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   547
  header.SetSource (source);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   548
  header.SetDestination (destination);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   549
11219
c97ef876d98c bug 2063: FdNetDevice::SendFrom() Assert does not take into account the size of the headers. (fix due Rubén Martínez and Tom Henderson)
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11085
diff changeset
   550
  NS_ASSERT_MSG (packet->GetSize () <= m_mtu, "FdNetDevice::SendFrom(): Packet too big " << packet->GetSize ());
c97ef876d98c bug 2063: FdNetDevice::SendFrom() Assert does not take into account the size of the headers. (fix due Rubén Martínez and Tom Henderson)
Alina Quereilhac <alina.quereilhac@inria.fr>
parents: 11085
diff changeset
   551
9271
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   552
  if (m_encapMode == LLC)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   553
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   554
      LlcSnapHeader llc;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   555
      llc.SetType (protocolNumber);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   556
      packet->AddHeader (llc);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   557
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   558
      header.SetLengthType (packet->GetSize ());
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   559
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   560
  else
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   561
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   562
      header.SetLengthType (protocolNumber);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   563
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   564
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   565
  packet->AddHeader (header);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   566
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   567
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   568
  // there's not much meaning associated with the different layers in this
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   569
  // device, so don't be surprised when they're all stacked together in
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   570
  // essentially one place.  We do this for trace consistency across devices.
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   571
  //
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   572
  m_macTxTrace (packet);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   573
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   574
  m_promiscSnifferTrace (packet);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   575
  m_snifferTrace (packet);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   576
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   577
  NS_LOG_LOGIC ("calling write");
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   578
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   579
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   580
  ssize_t len =  (ssize_t) packet->GetSize ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   581
  uint8_t *buffer = (uint8_t*)malloc (len);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   582
  packet->CopyData (buffer, len);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   583
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   584
  // We need to add the PI header
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   585
  if (m_encapMode == DIXPI)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   586
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   587
      AddPIHeader (buffer, len);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   588
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   589
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   590
  ssize_t written = write (m_fd, buffer, len);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   591
  free (buffer);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   592
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   593
  if (written == -1 || written != len)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   594
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   595
      m_macTxDropTrace (packet);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   596
      return false;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   597
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   598
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   599
  return true;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   600
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   601
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   602
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   603
FdNetDevice::SetFileDescriptor (int fd)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   604
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   605
  if (m_fd == -1 and fd > 0)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   606
    {
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   607
      m_fd = fd;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   608
    }
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   609
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   610
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   611
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   612
FdNetDevice::SetAddress (Address address)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   613
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   614
  m_address = Mac48Address::ConvertFrom (address);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   615
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   616
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   617
Address
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   618
FdNetDevice::GetAddress (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   619
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   620
  return m_address;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   621
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   622
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   623
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   624
FdNetDevice::NotifyLinkUp (void)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   625
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   626
  m_linkUp = true;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   627
  m_linkChangeCallbacks ();
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   628
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   629
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   630
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   631
FdNetDevice::SetIfIndex (const uint32_t index)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   632
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   633
  m_ifIndex = index;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   634
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   635
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   636
uint32_t
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   637
FdNetDevice::GetIfIndex (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   638
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   639
  return m_ifIndex;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   640
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   641
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   642
Ptr<Channel>
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   643
FdNetDevice::GetChannel (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   644
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   645
  return NULL;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   646
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   647
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   648
bool
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   649
FdNetDevice::SetMtu (const uint16_t mtu)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   650
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   651
  // The MTU depends on the technology associated to 
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   652
  // the file descriptor. The user is responsible of
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   653
  // setting the correct value of the MTU.
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   654
  // If the file descriptor is created using a helper,
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   655
  // then is the responsibility of the helper to set 
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   656
  // the correct MTU value.
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   657
  m_mtu = mtu;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   658
  return true;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   659
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   660
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   661
uint16_t
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   662
FdNetDevice::GetMtu (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   663
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   664
  return m_mtu;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   665
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   666
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   667
bool
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   668
FdNetDevice::IsLinkUp (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   669
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   670
  return m_linkUp;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   671
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   672
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   673
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   674
FdNetDevice::AddLinkChangeCallback (Callback<void> callback)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   675
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   676
  m_linkChangeCallbacks.ConnectWithoutContext (callback);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   677
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   678
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   679
bool
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   680
FdNetDevice::IsBroadcast (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   681
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   682
  return m_isBroadcast;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   683
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   684
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   685
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   686
FdNetDevice::SetIsBroadcast (bool broadcast)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   687
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   688
  m_isBroadcast = broadcast;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   689
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   690
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   691
Address
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   692
FdNetDevice::GetBroadcast (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   693
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   694
  return Mac48Address ("ff:ff:ff:ff:ff:ff");
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   695
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   696
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   697
bool
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   698
FdNetDevice::IsMulticast (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   699
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   700
  return m_isMulticast;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   701
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   702
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   703
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   704
FdNetDevice::SetIsMulticast (bool multicast)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   705
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   706
  m_isMulticast = multicast;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   707
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   708
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   709
Address
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   710
FdNetDevice::GetMulticast (Ipv4Address multicastGroup) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   711
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   712
  return Mac48Address::GetMulticast (multicastGroup);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   713
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   714
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   715
Address
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   716
FdNetDevice::GetMulticast (Ipv6Address addr) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   717
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   718
  return Mac48Address::GetMulticast (addr);
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   719
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   720
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   721
bool
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   722
FdNetDevice::IsBridge (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   723
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   724
  return false;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   725
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   726
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   727
bool
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   728
FdNetDevice::IsPointToPoint (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   729
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   730
  return false;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   731
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   732
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   733
Ptr<Node>
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   734
FdNetDevice::GetNode (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   735
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   736
  return m_node;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   737
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   738
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   739
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   740
FdNetDevice::SetNode (Ptr<Node> node)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   741
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   742
  m_node = node;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   743
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   744
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   745
bool
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   746
FdNetDevice::NeedsArp (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   747
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   748
  return true;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   749
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   750
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   751
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   752
FdNetDevice::SetReceiveCallback (NetDevice::ReceiveCallback cb)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   753
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   754
  m_rxCallback = cb;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   755
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   756
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   757
void
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   758
FdNetDevice::SetPromiscReceiveCallback (PromiscReceiveCallback cb)
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   759
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   760
  m_promiscRxCallback = cb;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   761
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   762
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   763
bool
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   764
FdNetDevice::SupportsSendFrom (void) const
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   765
{
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   766
  return true;
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   767
}
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   768
85e753b6676c Merge fd-net-device into ns-3-dev
alina
parents:
diff changeset
   769
} // namespace ns3