src/devices/emu/emu-net-device.cc
author Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
Tue, 08 Sep 2009 06:29:26 +0200
changeset 4764 e90e1ef585b0
parent 4677 258cf77942bc
child 5822 c16bcd1c6647
permissions -rw-r--r--
[Bug 653] NetDevice link change callback (SetLinkChangeCallback -> AddLinkChangeCallback).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     2
/*
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     3
 * Copyright (c) 2008 University of Washington
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     4
 *
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     8
 *
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    12
 * GNU General Public License for more details.
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    13
 *
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    17
 */
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    18
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    19
#include "emu-net-device.h"
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    20
#include "emu-encode-decode.h"
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    21
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    22
#include "ns3/log.h"
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    23
#include "ns3/queue.h"
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    24
#include "ns3/simulator.h"
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    25
#include "ns3/ethernet-header.h"
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    26
#include "ns3/ethernet-trailer.h"
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    27
#include "ns3/llc-snap-header.h"
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    28
#include "ns3/boolean.h"
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    29
#include "ns3/uinteger.h"
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    30
#include "ns3/pointer.h"
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    31
#include "ns3/string.h"
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    32
#include "ns3/trace-source-accessor.h"
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    33
#include "ns3/channel.h"
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    34
#include "ns3/system-thread.h"
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    35
#include "ns3/realtime-simulator-impl.h"
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    36
#include "ns3/mac48-address.h"
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    37
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    38
#include <sys/wait.h>
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    39
#include <sys/stat.h>
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    40
#include <sys/socket.h>
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    41
#include <sys/un.h>
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    42
#include <sys/ioctl.h>
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    43
#include <net/ethernet.h>
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    44
#include <net/if.h>
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    45
#include <netinet/in.h>
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    46
#include <netpacket/packet.h>
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    47
#include <arpa/inet.h>
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    48
#include <errno.h>
3851
cc6a7f93dc3f g++ 4.3.2-1ubuntu7 too picky
Craig Dowell <craigdo@ee.washington.edu>
parents: 3850
diff changeset
    49
#include <limits>
cc6a7f93dc3f g++ 4.3.2-1ubuntu7 too picky
Craig Dowell <craigdo@ee.washington.edu>
parents: 3850
diff changeset
    50
#include <stdlib.h>
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    51
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    52
NS_LOG_COMPONENT_DEFINE ("EmuNetDevice");
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    53
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    54
namespace ns3 {
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    55
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    56
NS_OBJECT_ENSURE_REGISTERED (EmuNetDevice);
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    57
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
    58
#define EMU_MAGIC 65867
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
    59
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    60
TypeId 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    61
EmuNetDevice::GetTypeId (void)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    62
{
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    63
  static TypeId tid = TypeId ("ns3::EmuNetDevice")
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    64
    .SetParent<NetDevice> ()
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    65
    .AddConstructor<EmuNetDevice> ()
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    66
    .AddAttribute ("Address", 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    67
                   "The ns-3 MAC address of this (virtual) device.",
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    68
                   Mac48AddressValue (Mac48Address ("ff:ff:ff:ff:ff:ff")),
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    69
                   MakeMac48AddressAccessor (&EmuNetDevice::m_address),
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    70
                   MakeMac48AddressChecker ())
4370
a64e987a727a put DeviceName Attribute back in emu net device
Craig Dowell <craigdo@ee.washington.edu>
parents: 4322
diff changeset
    71
    .AddAttribute ("DeviceName", 
a64e987a727a put DeviceName Attribute back in emu net device
Craig Dowell <craigdo@ee.washington.edu>
parents: 4322
diff changeset
    72
                   "The name of the underlying real device (e.g. eth1).",
a64e987a727a put DeviceName Attribute back in emu net device
Craig Dowell <craigdo@ee.washington.edu>
parents: 4322
diff changeset
    73
                   StringValue ("eth1"),
a64e987a727a put DeviceName Attribute back in emu net device
Craig Dowell <craigdo@ee.washington.edu>
parents: 4322
diff changeset
    74
                   MakeStringAccessor (&EmuNetDevice::m_deviceName),
a64e987a727a put DeviceName Attribute back in emu net device
Craig Dowell <craigdo@ee.washington.edu>
parents: 4322
diff changeset
    75
                   MakeStringChecker ())
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    76
    .AddAttribute ("Start", 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    77
                   "The simulation time at which to spin up the device thread.",
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    78
                   TimeValue (Seconds (0.)),
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    79
                   MakeTimeAccessor (&EmuNetDevice::m_tStart),
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    80
                   MakeTimeChecker ())
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    81
    .AddAttribute ("Stop", 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    82
                   "The simulation time at which to tear down the device thread.",
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    83
                   TimeValue (Seconds (0.)),
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    84
                   MakeTimeAccessor (&EmuNetDevice::m_tStop),
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    85
                   MakeTimeChecker ())
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    86
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    87
    //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    88
    // Transmit queueing discipline for the device which includes its own set
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    89
    // of trace hooks.  Note that this is really going to run "on top of" the 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    90
    // queueing discipline that will most likely be present in the devices of
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    91
    // the underlying operating system.
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    92
    //
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    93
    .AddAttribute ("TxQueue", 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    94
                   "A queue to use as the transmit queue in the device.",
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    95
                   PointerValue (),
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
    96
                   MakePointerAccessor (&EmuNetDevice::m_queue),
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    97
                   MakePointerChecker<Queue> ())
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    98
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
    99
    //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   100
    // Trace sources at the "top" of the net device, where packets transition
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   101
    // to/from higher layers.  These points do not really correspond to the 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   102
    // MAC layer of the underlying operating system, but exist to provide 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   103
    // a consitent tracing environment.  These trace hooks should really be
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   104
    // interpreted as the points at which a packet leaves the ns-3 environment
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   105
    // destined for the underlying operating system or vice-versa.
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   106
    //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   107
    .AddTraceSource ("MacTx", 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   108
                     "Trace source indicating a packet has arrived for transmission by this device",
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   109
                     MakeTraceSourceAccessor (&EmuNetDevice::m_macTxTrace))
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   110
    .AddTraceSource ("MacTxDrop", 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   111
                     "Trace source indicating a packet has been dropped by the device before transmission",
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   112
                     MakeTraceSourceAccessor (&EmuNetDevice::m_macTxDropTrace))
4272
b40ce56e0247 Add MacPromiscRx, make MacRx non-promisc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4265
diff changeset
   113
    .AddTraceSource ("MacPromiscRx", 
b40ce56e0247 Add MacPromiscRx, make MacRx non-promisc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4265
diff changeset
   114
                     "A packet has been received by this device, has been passed up from the physical layer "
b40ce56e0247 Add MacPromiscRx, make MacRx non-promisc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4265
diff changeset
   115
                     "and is being forwarded up the local protocol stack.  This is a promiscuous trace,",
b40ce56e0247 Add MacPromiscRx, make MacRx non-promisc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4265
diff changeset
   116
                     MakeTraceSourceAccessor (&EmuNetDevice::m_macPromiscRxTrace))
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   117
    .AddTraceSource ("MacRx", 
4272
b40ce56e0247 Add MacPromiscRx, make MacRx non-promisc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4265
diff changeset
   118
                     "A packet has been received by this device, has been passed up from the physical layer "
b40ce56e0247 Add MacPromiscRx, make MacRx non-promisc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4265
diff changeset
   119
                     "and is being forwarded up the local protocol stack.  This is a non-promiscuous trace,",
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   120
                     MakeTraceSourceAccessor (&EmuNetDevice::m_macRxTrace))
4264
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   121
#if 0
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   122
    // Not currently implemented for this device
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   123
    .AddTraceSource ("MacRxDrop", 
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   124
                     "Trace source indicating a packet was dropped before being forwarded up the stack",
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   125
                     MakeTraceSourceAccessor (&EmuNetDevice::m_macRxDropTrace))
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   126
#endif
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   127
    //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   128
    // In normal ns-3 net devices, these trace souces correspond to the "bottom"
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   129
    // of the net device, where packets transition to/from the channel.  In 
4264
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   130
    // the case of the emu device, there is no physical layer access -- all we
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   131
    // do is to send packets to another device that is really at a "real" MAC
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   132
    // level.  Since it could be misleading to call anything here PHY, we do not
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   133
    // implement these trace sources.
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   134
    //
4264
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   135
#if 0
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   136
    .AddTraceSource ("PhyTxBegin", 
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   137
                     "Trace source indicating a packet has begun transmitting over the channel",
4264
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   138
                     MakeTraceSourceAccessor (&EmuNetDevice::m_phyTxBeginTrace))
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   139
    .AddTraceSource ("PhyTxEnd", 
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   140
                     "Trace source indicating a packet has been completely transmitted over the channel",
4264
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   141
                     MakeTraceSourceAccessor (&EmuNetDevice::m_phyTxEndTrace))
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   142
    .AddTraceSource ("PhyTxDrop", 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   143
                     "Trace source indicating a packet has been dropped by the device during transmission",
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   144
                     MakeTraceSourceAccessor (&EmuNetDevice::m_phyTxDropTrace))
4264
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   145
    .AddTraceSource ("PhyRxBegin", 
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   146
                     "Trace source indicating a packet has begun being received by the device",
4264
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   147
                     MakeTraceSourceAccessor (&EmuNetDevice::m_phyRxBeginTrace))
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   148
    .AddTraceSource ("PhyRxEnd", 
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   149
                     "Trace source indicating a packet has been completely received by the device",
4264
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   150
                     MakeTraceSourceAccessor (&EmuNetDevice::m_phyRxEndTrace))
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   151
    .AddTraceSource ("PhyRxDrop", 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   152
                     "Trace source indicating a packet has been dropped by the device during reception",
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   153
                     MakeTraceSourceAccessor (&EmuNetDevice::m_phyRxDropTrace))
4264
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   154
#endif
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   155
    //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   156
    // Trace sources designed to simulate a packet sniffer facility (tcpdump). 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   157
    //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   158
    .AddTraceSource ("Sniffer", 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   159
                     "Trace source simulating a non-promiscuous packet sniffer attached to the device",
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   160
                     MakeTraceSourceAccessor (&EmuNetDevice::m_snifferTrace))
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   161
    .AddTraceSource ("PromiscSniffer", 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   162
                     "Trace source simulating a promiscuous packet sniffer attached to the device",
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   163
                     MakeTraceSourceAccessor (&EmuNetDevice::m_promiscSnifferTrace))
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   164
    ;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   165
  return tid;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   166
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   167
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   168
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   169
EmuNetDevice::EmuNetDevice () 
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   170
: 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   171
  m_startEvent (),
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   172
  m_stopEvent (),
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   173
  m_sock (-1),
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   174
  m_readThread (0),
3850
03ebd59f4d06 keep gcc 3.4 from complaining
Craig Dowell <craigdo@ee.washington.edu>
parents: 3847
diff changeset
   175
  m_ifIndex (std::numeric_limits<uint32_t>::max ()),  // absurdly large value
4479
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   176
  m_sll_ifindex (-1),
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   177
  m_isBroadcast (true),
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   178
  m_isMulticast (false)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   179
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   180
  NS_LOG_FUNCTION (this);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   181
  Start (m_tStart);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   182
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   183
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   184
EmuNetDevice::~EmuNetDevice ()
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   185
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   186
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   187
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   188
void 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   189
EmuNetDevice::DoDispose()
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   190
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   191
  NS_LOG_FUNCTION_NOARGS ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   192
  m_node = 0;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   193
  NetDevice::DoDispose ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   194
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   195
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   196
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   197
EmuNetDevice::Start (Time tStart)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   198
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   199
  NS_LOG_FUNCTION (tStart);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   200
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   201
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   202
  // Cancel any pending start event and schedule a new one at some relative time in the future.
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   203
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   204
  Simulator::Cancel (m_startEvent);
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   205
  m_startEvent = Simulator::Schedule (tStart, &EmuNetDevice::StartDevice, this);
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   206
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   207
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   208
  void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   209
EmuNetDevice::Stop (Time tStop)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   210
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   211
  NS_LOG_FUNCTION (tStop);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   212
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   213
  // Cancel any pending stop event and schedule a new one at some relative time in the future.
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   214
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   215
  Simulator::Cancel (m_stopEvent);
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   216
  m_startEvent = Simulator::Schedule (tStop, &EmuNetDevice::StopDevice, this);
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   217
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   218
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   219
  void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   220
EmuNetDevice::StartDevice (void)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   221
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   222
  NS_LOG_FUNCTION_NOARGS ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   223
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   224
  //
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   225
  // Spin up the emu net device and start receiving packets.
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   226
  //
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   227
  if (m_sock != -1)
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   228
    {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   229
      NS_FATAL_ERROR ("EmuNetDevice::StartDevice(): Device is already started");
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   230
    }
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   231
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   232
  NS_LOG_LOGIC ("Creating socket");
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   233
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   234
  // Call out to a separate process running as suid root in order to get a raw 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   235
  // socket.  We do this to avoid having the entire simulation running as root.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   236
  // If this method returns, we'll have a raw socket waiting for us in m_sock.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   237
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   238
  CreateSocket ();
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   239
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   240
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   241
  // Figure out which interface index corresponds to the device name in the corresponding attribute.
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   242
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   243
  struct ifreq ifr;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   244
  bzero (&ifr, sizeof(ifr));
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   245
  strncpy ((char *)ifr.ifr_name, m_deviceName.c_str (), IFNAMSIZ);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   246
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   247
  NS_LOG_LOGIC ("Getting interface index");
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   248
  int32_t rc = ioctl (m_sock, SIOCGIFINDEX, &ifr);
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   249
  if (rc == -1)
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   250
    {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   251
      NS_FATAL_ERROR ("EmuNetDevice::StartDevice(): Can't get interface index");
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   252
    }
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   253
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   254
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   255
  // Save the real interface index for later calls to sendto
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   256
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   257
  m_sll_ifindex = ifr.ifr_ifindex;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   258
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   259
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   260
  // Bind the socket to the interface we just found.
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   261
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   262
  struct sockaddr_ll ll;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   263
  bzero (&ll, sizeof(ll));
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   264
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   265
  ll.sll_family = AF_PACKET;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   266
  ll.sll_ifindex = m_sll_ifindex;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   267
  ll.sll_protocol = htons(ETH_P_ALL); 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   268
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   269
  NS_LOG_LOGIC ("Binding socket to interface");
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   270
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   271
  rc = bind (m_sock, (struct sockaddr *)&ll, sizeof (ll));
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   272
  if (rc == -1)
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   273
    {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   274
      NS_FATAL_ERROR ("EmuNetDevice::StartDevice(): Can't bind to specified interface");
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   275
    }
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   276
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   277
  rc = ioctl(m_sock, SIOCGIFFLAGS, &ifr);
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   278
  if (rc == -1)
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   279
    {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   280
      NS_FATAL_ERROR ("EmuNetDevice::StartDevice(): Can't get interface flags");
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   281
    }
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   282
  
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   283
  //
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   284
  // This device only works if the underlying interface is up in promiscuous 
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   285
  // mode.  We could have turned it on in the socket creator, but the situation
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   286
  // is that we expect these devices to be used in conjunction with virtual 
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   287
  // machines with connected host-only (simulated) networks, or in a testbed.
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   288
  // There is a lot of setup and configuration happening outside of this one 
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   289
  // issue, and we expect that configuration to include choosing a valid
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   290
  // interface (e.g, "ath1"), ensuring that the device supports promiscuous 
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   291
  // mode, and placing it in promiscuous mode.  We just make sure of the
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   292
  // end result.
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   293
  //
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   294
  if ((ifr.ifr_flags & IFF_PROMISC) == 0)
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   295
    {
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   296
      NS_FATAL_ERROR ("EmuNetDevice::StartDevice(): " << m_deviceName << " is not in promiscuous mode");
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   297
    }
4479
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   298
  if ((ifr.ifr_flags & IFF_BROADCAST) != IFF_BROADCAST)
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   299
    {
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   300
      // We default m_isBroadcast to true but turn it off here if not
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   301
      // supported, because in the common case, overlying IP code will 
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   302
      // assert during configuration time if this is false, before this
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   303
      // method has a chance to set it during runtime
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   304
      m_isBroadcast = false;
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   305
    }
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   306
  if ((ifr.ifr_flags & IFF_MULTICAST) == IFF_MULTICAST)
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   307
    {
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   308
      // This one is OK to enable at runtime
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   309
      m_isMulticast = true;
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   310
    }
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   311
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   312
  // Now spin up a read thread to read packets.
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   313
  //
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   314
  if (m_readThread != 0)
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   315
    {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   316
      NS_FATAL_ERROR ("EmuNetDevice::StartDevice(): Receive thread is already running");
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   317
    }
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   318
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   319
  NS_LOG_LOGIC ("Spinning up read thread");
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   320
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   321
  m_readThread = Create<SystemThread> (MakeCallback (&EmuNetDevice::ReadThread, this));
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   322
  m_readThread->Start ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   323
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   324
  NotifyLinkUp ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   325
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   326
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   327
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   328
EmuNetDevice::CreateSocket (void)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   329
{
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   330
  NS_LOG_FUNCTION_NOARGS ();
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   331
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   332
  // We want to create a raw socket for our net device.  Unfortunately for us
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   333
  // you have to have root privileges to do that.  Instead of running the 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   334
  // entire simulation as root, we decided to make a small program who's whole
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   335
  // reason for being is to run as suid root and create a raw socket.  We're
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   336
  // going to fork and exec that program soon, but we need to have a socket
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   337
  // to talk to it with.  So we create a local interprocess (Unix) socket 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   338
  // for that purpose.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   339
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   340
  int sock = socket (PF_UNIX, SOCK_DGRAM, 0);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   341
  if (sock == -1)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   342
    {
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   343
      NS_FATAL_ERROR ("EmuNetDevice::CreateSocket(): Unix socket creation error, errno = " << strerror (errno));
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   344
    }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   345
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   346
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   347
  // Bind to that socket and let the kernel allocate an endpoint
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   348
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   349
  struct sockaddr_un un;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   350
  memset (&un, 0, sizeof (un));
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   351
  un.sun_family = AF_UNIX;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   352
  int status = bind (sock, (struct sockaddr*)&un, sizeof (sa_family_t));
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   353
  if (status == -1)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   354
    {
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   355
      NS_FATAL_ERROR ("EmuNetDevice::CreateSocket(): Could not bind(): errno = " << strerror (errno));
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   356
    }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   357
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   358
  NS_LOG_INFO ("Created Unix socket");
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   359
  NS_LOG_INFO ("sun_family = " << un.sun_family);
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   360
  NS_LOG_INFO ("sun_path = " << un.sun_path);
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   361
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   362
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   363
  // We have a socket here, but we want to get it there -- to the program we're
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   364
  // going to exec.  What we'll do is to do a getsockname and then encode the
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   365
  // resulting address information as a string, and then send the string to the
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   366
  // program as an argument.  So we need to get the sock name.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   367
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   368
  socklen_t len = sizeof (un);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   369
  status = getsockname (sock, (struct sockaddr*)&un, &len);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   370
  if (status == -1)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   371
    {
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   372
      NS_FATAL_ERROR ("EmuNetDevice::CreateSocket(): Could not getsockname(): errno = " << strerror (errno));
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   373
    }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   374
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   375
  //
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   376
  // Now encode that socket name (family and path) as a string of hex digits
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   377
  //
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   378
  std::string path = EmuBufferToString((uint8_t *)&un, len);
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   379
  NS_LOG_INFO ("Encoded Unix socket as \"" << path << "\"");
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   380
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   381
  // Fork and exec the process to create our socket.  If we're us (the parent)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   382
  // we wait for the child (the socket creator) to complete and read the 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   383
  // socket it created using the ancillary data mechanism.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   384
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   385
  pid_t pid = ::fork ();
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   386
  if (pid == 0)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   387
    {
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   388
      NS_LOG_DEBUG ("Child process");
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   389
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   390
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   391
      // build a command line argument from the encoded endpoint string that 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   392
      // the socket creation process will use to figure out how to respond to
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   393
      // the (now) parent process.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   394
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   395
      std::ostringstream oss;
3835
8966e68809a6 turn off LOG in emu-sock-creator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3831
diff changeset
   396
      oss << "-p" << path;
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   397
      NS_LOG_INFO ("Parameters set to \"" << oss.str () << "\"");
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   398
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   399
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   400
      // Execute the socket creation process image.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   401
      //
4417
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   402
      status = ::execl (FindCreator ("emu-sock-creator").c_str (), 
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   403
                        "emu-sock-creator",                             // argv[0] (filename)
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   404
                        oss.str ().c_str (),                            // argv[1] (-p<path?
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   405
                        (char *)NULL);
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   406
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   407
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   408
      // If the execl successfully completes, it never returns.  If it returns it failed or the OS is
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   409
      // broken.  In either case, we bail.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   410
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   411
      NS_FATAL_ERROR ("EmuNetDevice::CreateSocket(): Back from execl(), errno = " << ::strerror (errno));
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   412
    }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   413
  else
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   414
    {
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   415
      NS_LOG_DEBUG ("Parent process");
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   416
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   417
      // We're the process running the emu net device.  We need to wait for the
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   418
      // socket creator process to finish its job.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   419
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   420
      int st;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   421
      pid_t waited = waitpid (pid, &st, 0);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   422
      if (waited == -1)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   423
	{
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   424
	  NS_FATAL_ERROR ("EmuNetDevice::CreateSocket(): waitpid() fails, errno = " << strerror (errno));
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   425
	}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   426
      NS_ASSERT_MSG (pid == waited, "EmuNetDevice::CreateSocket(): pid mismatch");
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   427
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   428
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   429
      // Check to see if the socket creator exited normally and then take a 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   430
      // look at the exit code.  If it bailed, so should we.  If it didn't
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   431
      // even exit normally, we bail too.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   432
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   433
      if (WIFEXITED (st))
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   434
	{
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   435
          int exitStatus = WEXITSTATUS (st);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   436
          if (exitStatus != 0)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   437
            {
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   438
              NS_FATAL_ERROR ("EmuNetDevice::CreateSocket(): socket creator exited normally with status " << exitStatus);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   439
            }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   440
	}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   441
      else 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   442
	{
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   443
          NS_FATAL_ERROR ("EmuNetDevice::CreateSocket(): socket creator exited abnormally");
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   444
	}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   445
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   446
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   447
      // At this point, the socket creator has run successfully and should 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   448
      // have created our raw socket and sent it back to the socket address
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   449
      // we provided.  Our socket should be waiting on the Unix socket.  We've
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   450
      // got to do a bunch of grunto work to get at it, though.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   451
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   452
      // The struct iovec below is part of a scatter-gather list.  It describes a
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   453
      // buffer.  In this case, it describes a buffer (an integer) that will
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   454
      // get the data that comes back from the socket creator process.  It will
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   455
      // be a magic number that we use as a consistency/sanity check.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   456
      // 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   457
      struct iovec iov;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   458
      uint32_t magic;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   459
      iov.iov_base = &magic;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   460
      iov.iov_len = sizeof(magic);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   461
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   462
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   463
      // The CMSG macros you'll see below are used to create and access control 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   464
      // messages (which is another name for ancillary data).  The ancillary 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   465
      // data is made up of pairs of struct cmsghdr structures and associated
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   466
      // data arrays.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   467
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   468
      // First, we're going to allocate a buffer on the stack to receive our 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   469
      // data array (that contains the socket).  Sometimes you'll see this called
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   470
      // an "ancillary element" but the msghdr uses the control message termimology
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   471
      // so we call it "control."
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   472
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   473
      size_t msg_size = sizeof(int);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   474
      char control[CMSG_SPACE(msg_size)];
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   475
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   476
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   477
      // There is a msghdr that is used to minimize the number of parameters
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   478
      // passed to recvmsg (which we will use to receive our ancillary data).  
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   479
      // This structure uses terminology corresponding to control messages, so
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   480
      // you'll see msg_control, which is the pointer to the ancillary data and 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   481
      // controllen which is the size of the ancillary data array.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   482
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   483
      // So, initialize the message header that describes the ancillary/control
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   484
      // data we expect to receive and point it to buffer.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   485
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   486
      struct msghdr msg;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   487
      msg.msg_name = 0;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   488
      msg.msg_namelen = 0;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   489
      msg.msg_iov = &iov;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   490
      msg.msg_iovlen = 1;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   491
      msg.msg_control = control;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   492
      msg.msg_controllen = sizeof (control);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   493
      msg.msg_flags = 0;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   494
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   495
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   496
      // Now we can actually receive the interesting bits from the socket
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   497
      // creator process.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   498
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   499
      ssize_t bytesRead = recvmsg (sock, &msg, 0);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   500
      if (bytesRead != sizeof(int))
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   501
	{
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   502
          NS_FATAL_ERROR ("EmuNetDevice::CreateSocket(): Wrong byte count from socket creator");
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   503
	}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   504
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   505
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   506
      // There may be a number of message headers/ancillary data arrays coming in.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   507
      // Let's look for the one with a type SCM_RIGHTS which indicates it' the
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   508
      // one we're interested in.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   509
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   510
      struct cmsghdr *cmsg;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   511
      for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   512
	{
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   513
	  if (cmsg->cmsg_level == SOL_SOCKET &&
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   514
	      cmsg->cmsg_type == SCM_RIGHTS)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   515
	    {
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   516
              //
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   517
              // This is the type of message we want.  Check to see if the magic 
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   518
              // number is correct and then pull out the socket we care about if
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   519
              // it matches
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   520
              //
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   521
              if (magic == EMU_MAGIC)
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   522
                {
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   523
                  NS_LOG_INFO ("Got SCM_RIGHTS with correct magic " << magic);
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   524
                  int *rawSocket = (int*)CMSG_DATA (cmsg);
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   525
                  NS_LOG_INFO ("Got the socket from the socket creator = " << *rawSocket);
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   526
                  m_sock = *rawSocket;
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   527
                  return;
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   528
                }
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   529
              else
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   530
                {
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   531
                  NS_LOG_INFO ("Got SCM_RIGHTS, but with bad magic " << magic);                  
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   532
                }
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   533
	    }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   534
	}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   535
      NS_FATAL_ERROR ("Did not get the raw socket from the socket creator");
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   536
    }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   537
}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   538
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   539
std::string
4417
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   540
EmuNetDevice::FindCreator (std::string creatorName)
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   541
{
4417
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   542
  NS_LOG_FUNCTION (creatorName);
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   543
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   544
  std::list<std::string> locations;
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   545
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   546
  // The path to the bits if we're sitting there with them
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   547
  locations.push_back ("./");
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   548
  locations.push_back ("./");
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   549
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   550
  // The path to the bits if we're sitting in the root of the repo
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   551
  locations.push_back ("./build/optimized/src/devices/emu/");
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   552
  locations.push_back ("./build/debug/src/devices/emu/");
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   553
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   554
  // if at the level of src (or build)
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   555
  locations.push_back ("../build/optimized/src/devices/emu/");
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   556
  locations.push_back ("../build/debug/src/devices/emu/");
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   557
4417
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   558
  // src/devices (or build/debug)
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   559
  locations.push_back ("../../build/optimized/src/devices/emu/");
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   560
  locations.push_back ("../../build/debug/src/devices/emu/");
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   561
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   562
  // src/devices/emu (or build/debug/examples)
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   563
  locations.push_back ("../../../build/optimized/src/devices/emu/");
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   564
  locations.push_back ("../../../build/debug/src/devices/emu/");
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   565
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   566
  for (std::list<std::string>::const_iterator i = locations.begin (); i != locations.end (); ++i)
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   567
    {
4417
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   568
      struct stat st;
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   569
4417
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   570
      if (::stat ((*i + creatorName).c_str (), &st) == 0)
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   571
	{
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   572
          NS_LOG_INFO ("Found Creator " << *i + creatorName);                  
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   573
	  return *i + creatorName;
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   574
	}
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   575
    }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   576
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   577
  NS_FATAL_ERROR ("EmuNetDevice::FindCreator(): Couldn't find creator");
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   578
  return ""; // quiet compiler
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   579
}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   580
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   581
void
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   582
EmuNetDevice::StopDevice (void)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   583
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   584
  NS_LOG_FUNCTION_NOARGS ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   585
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   586
  close (m_sock);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   587
  m_sock = -1;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   588
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   589
  NS_ASSERT_MSG (m_readThread != 0, "EmuNetDevice::StopDevice(): Receive thread is not running");
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   590
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   591
  NS_LOG_LOGIC ("Joining read thread");
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   592
  m_readThread->Join ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   593
  m_readThread = 0;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   594
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   595
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   596
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   597
EmuNetDevice::ForwardUp (uint8_t *buf, uint32_t len)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   598
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   599
  NS_LOG_FUNCTION (buf << len);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   600
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   601
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   602
  // Create a packet out of the buffer we received and free that buffer.
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   603
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   604
  Ptr<Packet> packet = Create<Packet> (reinterpret_cast<const uint8_t *> (buf), len);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   605
  free (buf);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   606
  buf = 0;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   607
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   608
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   609
  // Trace sinks will expect complete packets, not packets without some of the
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   610
  // headers.
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   611
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   612
  Ptr<Packet> originalPacket = packet->Copy ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   613
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   614
  EthernetHeader header (false);
4676
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   615
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   616
  //
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   617
  // This device could be running in an environment where completely unexpected
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   618
  // kinds of packets are flying around, so we need to harden things a bit and
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   619
  // filter out packets we think are completely bogus, so we always check to see
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   620
  // that the packet is long enough to contain the header we want to remove.
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   621
  //
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   622
  if (packet->GetSize() < header.GetSerializedSize())
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   623
    {
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   624
      m_phyRxDropTrace (originalPacket);
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   625
      return;
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   626
    }
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   627
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   628
  packet->RemoveHeader (header);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   629
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   630
  NS_LOG_LOGIC ("Pkt source is " << header.GetSource ());
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   631
  NS_LOG_LOGIC ("Pkt destination is " << header.GetDestination ());
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   632
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   633
  uint16_t protocol;
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   634
  
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   635
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   636
  // If the length/type is less than 1500, it corresponds to a length 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   637
  // interpretation packet.  In this case, it is an 802.3 packet and 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   638
  // will also have an 802.2 LLC header.  If greater than 1500, we
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   639
  // find the protocol number (Ethernet type) directly.
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   640
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   641
  if (header.GetLengthType () <= 1500)
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   642
    {
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   643
      LlcSnapHeader llc;
4676
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   644
      //
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   645
      // Check to see that the packet is long enough to possibly contain the
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   646
      // header we want to remove before just naively calling.
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   647
      //
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   648
      if (packet->GetSize() < llc.GetSerializedSize())
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   649
        {
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   650
          m_phyRxDropTrace (originalPacket);
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   651
          return;
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   652
        }
45d880dbe0f8 harden emu net device against malformed packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 4578
diff changeset
   653
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   654
      packet->RemoveHeader (llc);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   655
      protocol = llc.GetType ();
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   656
    }
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   657
  else
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   658
    {
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   659
      protocol = header.GetLengthType ();
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   660
    }
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   661
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   662
  PacketType packetType;
4424
af26433b13bc remove Mac48Address::IsMulticast
Fabian Mauchle <f1mauchl@hsr.ch>
parents: 4417
diff changeset
   663
3842
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   664
  if (header.GetDestination ().IsBroadcast ())
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   665
    {
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   666
      packetType = NS3_PACKET_BROADCAST;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   667
    }
4424
af26433b13bc remove Mac48Address::IsMulticast
Fabian Mauchle <f1mauchl@hsr.ch>
parents: 4417
diff changeset
   668
  else if (header.GetDestination ().IsGroup ())
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   669
    {
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   670
      packetType = NS3_PACKET_MULTICAST;          
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   671
    }
3842
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   672
  else if (header.GetDestination () == m_address)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   673
    {
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   674
      packetType = NS3_PACKET_HOST;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   675
    }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   676
  else
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   677
    {
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   678
      packetType = NS3_PACKET_OTHERHOST;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   679
    }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   680
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   681
  // 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   682
  // For all kinds of packetType we receive, we hit the promiscuous sniffer
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   683
  // hook and pass a copy up to the promiscuous callback.  Pass a copy to 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   684
  // make sure that nobody messes with our packet.
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   685
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   686
  m_promiscSnifferTrace (originalPacket);
4264
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   687
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   688
  if (!m_promiscRxCallback.IsNull ())
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   689
    {
4272
b40ce56e0247 Add MacPromiscRx, make MacRx non-promisc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4265
diff changeset
   690
      m_macPromiscRxTrace (originalPacket);
4265
5f837915710a remove unneeded packet copies, includes. Rescan
Craig Dowell <craigdo@ee.washington.edu>
parents: 4264
diff changeset
   691
      m_promiscRxCallback (this, packet, protocol, header.GetSource (), header.GetDestination (), packetType);
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   692
    }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   693
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   694
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   695
  // If this packet is not destined for some other host, it must be for us
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   696
  // as either a broadcast, multicast or unicast.  We need to hit the mac
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   697
  // packet received trace hook and forward the packet up the stack.
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   698
  //
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   699
  if (packetType != NS3_PACKET_OTHERHOST)
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   700
    {
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   701
      m_snifferTrace (originalPacket);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   702
      m_macRxTrace (originalPacket);
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   703
      m_rxCallback (this, packet, protocol, header.GetSource ());
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   704
    }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   705
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   706
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   707
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   708
EmuNetDevice::ReadThread (void)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   709
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   710
  NS_LOG_FUNCTION_NOARGS ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   711
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   712
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   713
  // It's important to remember that we're in a completely different thread than the simulator is running in.  We
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   714
  // need to synchronize with that other thread to get the packet up into ns-3.  What we will need to do is to schedule 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   715
  // a method to forward up the packet using the multithreaded simulator we are most certainly running.  However, I just 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   716
  // said it -- we are talking about two threads here, so it is very, very dangerous to do any kind of reference couning
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   717
  // on a shared object.  Just don't do it.  So what we're going to do is to allocate a buffer on the heap and pass that
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   718
  // buffer into the ns-3 context thread where it will create the packet.
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   719
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   720
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   721
  int32_t len = -1;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   722
  struct sockaddr_ll addr;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   723
  socklen_t addrSize = sizeof (addr);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   724
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   725
  for (;;) 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   726
    {
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   727
      uint32_t bufferSize = 65536;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   728
      uint8_t *buf = (uint8_t *)malloc (bufferSize);
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   729
      if (buf == 0)
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   730
        {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   731
          NS_FATAL_ERROR ("EmuNetDevice::ReadThread(): malloc packet buffer failed");
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   732
        }
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   733
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   734
      NS_LOG_LOGIC ("Calling recvfrom");
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   735
      len = recvfrom (m_sock, buf, bufferSize, 0, (struct sockaddr *)&addr, &addrSize);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   736
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   737
      if (len == -1)
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   738
        {
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   739
          free (buf);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   740
          buf = 0;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   741
          return;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   742
        }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   743
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   744
      NS_LOG_INFO ("EmuNetDevice::ReadThread(): Received packet");
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   745
      NS_LOG_INFO ("EmuNetDevice::ReadThread(): Scheduling handler");
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   746
      DynamicCast<RealtimeSimulatorImpl> (Simulator::GetImplementation ())->ScheduleRealtimeNow (
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   747
        MakeEvent (&EmuNetDevice::ForwardUp, this, buf, len));
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   748
      buf = 0;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   749
    }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   750
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   751
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   752
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   753
EmuNetDevice::Send (Ptr<Packet> packet, const Address &dest, uint16_t protocolNumber)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   754
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   755
  NS_LOG_FUNCTION (packet << dest << protocolNumber);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   756
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   757
  // The immediate questions here are how are we going to encapsulate packets and what do we use as the MAC source and 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   758
  // destination (hardware) addresses?
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   759
  //
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   760
  // If we return false from EmuNetDevice::NeedsArp, the ArpIpv4Interface will pass the broadcast address as the 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   761
  // hardware (Ethernet) destination by default.  If we return true from EmuNetDevice::NeedsArp, then the hardware
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   762
  // destination is actually meaningful, but we'll have an ns-3 ARP running on this device.  There can also be an ARP
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   763
  // running on the underlying OS so we have to be very careful, both about multiple ARPs and also about TCP, UDP, etc.
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   764
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   765
  // We are operating in promiscuous mode on the receive side (all ns-3 net devices are required to implement the 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   766
  // promiscuous callback in a meaningful way), so we have an option regarding the hardware addresses.  We don't actually have
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   767
  // to use the real hardware addresses and IP addresses of the underlying system.  We can completely use MAC-spoofing to
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   768
  // fake out the OS by using the ns-3 assigned MAC address (and also the ns-3 assigned IP addresses).  Ns-3 starts its 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   769
  // MAC address allocation using the OUI (vendor-code) 00:00:00 which is unassigned to any organization and is a globally
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   770
  // administered address, so there shouldn't be any collisions with real hardware.
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   771
  //
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   772
  // So what we do is we return true from EmuNetDevice::NeedsArp which tells ns-3 to use its own ARP.  We spoof the 
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   773
  // MAC address of the device and use promiscuous mode to receive traffic destined to that address.
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   774
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   775
  return SendFrom (packet, m_address, dest, protocolNumber);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   776
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   777
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   778
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   779
EmuNetDevice::SendFrom (Ptr<Packet> packet, const Address &src, const Address &dest, uint16_t protocolNumber)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   780
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   781
  NS_LOG_FUNCTION (packet << src << dest << protocolNumber);
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   782
  NS_LOG_LOGIC ("packet =" << packet);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   783
  NS_LOG_LOGIC ("UID is " << packet->GetUid () << ")");
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   784
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   785
  if (IsLinkUp () == false)
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   786
    {
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   787
      m_macTxDropTrace (packet);
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   788
      return false;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   789
    }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   790
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   791
  Mac48Address destination = Mac48Address::ConvertFrom (dest);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   792
  Mac48Address source = Mac48Address::ConvertFrom (src);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   793
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   794
  NS_LOG_LOGIC ("Transmit packet with UID " << packet->GetUid ());
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   795
  NS_LOG_LOGIC ("Transmit packet from " << source);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   796
  NS_LOG_LOGIC ("Transmit packet to " << destination);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   797
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   798
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   799
  // We've got to pick either DIX (Ethernet) or LLC/SNAP (IEEE 802.3) as a 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   800
  // packet format.  IEEE 802.3 is slightly more formally correct, so we 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   801
  // go that route.
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   802
  //
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   803
  LlcSnapHeader llc;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   804
  llc.SetType (protocolNumber);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   805
  packet->AddHeader (llc);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   806
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   807
  EthernetHeader header (false);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   808
  header.SetSource (source);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   809
  header.SetDestination (destination);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   810
  header.SetLengthType (packet->GetSize ());
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   811
  packet->AddHeader (header);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   812
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   813
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   814
  // there's not much meaning associated with the different layers in this
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   815
  // device, so don't be surprised when they're all stacked together in 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   816
  // essentially one place.  We do this for trace consistency across devices.
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   817
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   818
  m_macTxTrace (packet);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   819
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   820
  // 
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   821
  // Enqueue and dequeue the packet to hit the queue tracing hooks.
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   822
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   823
  m_queue->Enqueue (packet);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   824
  packet = m_queue->Dequeue ();
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   825
  NS_ASSERT_MSG (packet, "EmuNetDevice::SendFrom(): packet zero from queue");
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   826
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   827
  m_promiscSnifferTrace (packet);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   828
  m_snifferTrace (packet);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   829
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   830
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   831
  struct sockaddr_ll ll;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   832
  bzero (&ll, sizeof (ll));
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   833
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   834
  ll.sll_family = AF_PACKET;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   835
  ll.sll_ifindex = m_sll_ifindex;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   836
  ll.sll_protocol = htons(ETH_P_ALL); 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   837
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   838
  NS_LOG_LOGIC ("calling sendto");
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   839
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   840
  int32_t rc;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   841
  rc = sendto (m_sock, packet->PeekData (), packet->GetSize (), 0, reinterpret_cast<struct sockaddr *> (&ll), sizeof (ll));
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   842
  NS_LOG_LOGIC ("sendto returns " << rc);
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   843
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   844
  return rc == -1 ? false : true;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   845
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   846
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   847
void 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   848
EmuNetDevice::SetDataRate(DataRate bps)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   849
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   850
  NS_LOG_FUNCTION (this << bps);
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   851
  NS_FATAL_ERROR ("EmuNetDevice::SetDataRate():  Unable."); 
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   852
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   853
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   854
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   855
EmuNetDevice::SetQueue (Ptr<Queue> q)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   856
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   857
  NS_LOG_FUNCTION (this << q);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   858
  m_queue = q;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   859
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   860
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   861
Ptr<Queue> 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   862
EmuNetDevice::GetQueue(void) const 
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   863
{ 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   864
  NS_LOG_FUNCTION_NOARGS ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   865
  return m_queue;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   866
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   867
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   868
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   869
EmuNetDevice::NotifyLinkUp (void)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   870
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   871
  m_linkUp = true;
4764
e90e1ef585b0 [Bug 653] NetDevice link change callback (SetLinkChangeCallback -> AddLinkChangeCallback).
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 4677
diff changeset
   872
  m_linkChangeCallbacks ();
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   873
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   874
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   875
void 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   876
EmuNetDevice::SetIfIndex(const uint32_t index)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   877
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   878
  m_ifIndex = index;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   879
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   880
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   881
uint32_t 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   882
EmuNetDevice::GetIfIndex(void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   883
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   884
  return m_ifIndex;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   885
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   886
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   887
Ptr<Channel> 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   888
EmuNetDevice::GetChannel (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   889
{
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   890
  NS_FATAL_ERROR ("EmuNetDevice::GetChannel():  Unable."); 
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   891
  return 0;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   892
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   893
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   894
void 
4578
88434ff8f0a5 Finally make tap bridge work with VMs (bug 569)
Craig Dowell <craigdo@ee.washington.edu>
parents: 4479
diff changeset
   895
EmuNetDevice::SetAddress (Address address)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   896
{
4578
88434ff8f0a5 Finally make tap bridge work with VMs (bug 569)
Craig Dowell <craigdo@ee.washington.edu>
parents: 4479
diff changeset
   897
  NS_LOG_FUNCTION (address);
88434ff8f0a5 Finally make tap bridge work with VMs (bug 569)
Craig Dowell <craigdo@ee.washington.edu>
parents: 4479
diff changeset
   898
  m_address = Mac48Address::ConvertFrom (address);
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   899
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   900
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   901
Address 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   902
EmuNetDevice::GetAddress (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   903
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   904
  NS_LOG_FUNCTION_NOARGS ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   905
  return m_address;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   906
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   907
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   908
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   909
EmuNetDevice::SetMtu (const uint16_t mtu)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   910
{
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   911
  NS_FATAL_ERROR ("EmuNetDevice::SetMtu():  Unable."); 
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   912
  return false;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   913
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   914
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   915
uint16_t 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   916
EmuNetDevice::GetMtu (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   917
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   918
  struct ifreq ifr;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   919
  bzero (&ifr, sizeof (ifr));
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   920
  strcpy(ifr.ifr_name, m_deviceName.c_str ());
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   921
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   922
  int32_t fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   923
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   924
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   925
  int32_t rc = ioctl(fd, SIOCGIFMTU, &ifr);
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   926
  if (rc == -1)
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   927
    {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   928
      NS_FATAL_ERROR ("EmuNetDevice::GetMtu(): Can't ioctl SIOCGIFMTU");
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   929
    }
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   930
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   931
  close (fd);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   932
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   933
  return ifr.ifr_mtu;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   934
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   935
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   936
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   937
EmuNetDevice::IsLinkUp (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   938
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   939
  return m_linkUp;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   940
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   941
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   942
void 
4764
e90e1ef585b0 [Bug 653] NetDevice link change callback (SetLinkChangeCallback -> AddLinkChangeCallback).
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 4677
diff changeset
   943
EmuNetDevice::AddLinkChangeCallback (Callback<void> callback)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   944
{
4764
e90e1ef585b0 [Bug 653] NetDevice link change callback (SetLinkChangeCallback -> AddLinkChangeCallback).
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 4677
diff changeset
   945
  m_linkChangeCallbacks.ConnectWithoutContext (callback);
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   946
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   947
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   948
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   949
EmuNetDevice::IsBroadcast (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   950
{
4479
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   951
  return m_isBroadcast;
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   952
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   953
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   954
Address
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   955
EmuNetDevice::GetBroadcast (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   956
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   957
  return Mac48Address ("ff:ff:ff:ff:ff:ff");
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   958
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   959
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   960
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   961
EmuNetDevice::IsMulticast (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   962
{
4479
ba809221f9b3 Enable EmuNetDevice for multicast, based on underlying device (bug 571)
Tom Henderson <tomh@tomh.org>
parents: 4424
diff changeset
   963
  return m_isMulticast;
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   964
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   965
3842
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   966
  Address 
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   967
EmuNetDevice::GetMulticast (Ipv4Address multicastGroup) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   968
{
3836
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   969
  NS_LOG_FUNCTION (multicastGroup);
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   970
3842
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   971
  Mac48Address ad = Mac48Address::GetMulticast (multicastGroup);
3836
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   972
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   973
  //
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   974
  // Implicit conversion (operator Address ()) is defined for Mac48Address, so
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   975
  // use it by just returning the EUI-48 address which is automagically converted
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   976
  // to an Address.
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   977
  //
3842
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   978
  NS_LOG_LOGIC ("multicast address is " << ad);
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   979
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   980
  return ad;
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   981
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   982
3852
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   983
Address
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   984
EmuNetDevice::GetMulticast (Ipv6Address addr) const
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   985
{
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   986
  NS_LOG_FUNCTION(this << addr);
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   987
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   988
  Mac48Address ad = Mac48Address::GetMulticast (addr);
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   989
  NS_LOG_LOGIC("MAC IPv6 multicast address is " << ad);
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   990
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   991
  return ad;
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   992
}
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   993
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   994
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   995
EmuNetDevice::IsPointToPoint (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   996
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   997
  return false;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   998
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   999
3936
e525995ce5dc implement IsBridged for net devices
Craig Dowell <craigdo@ee.washington.edu>
parents: 3852
diff changeset
  1000
bool 
e525995ce5dc implement IsBridged for net devices
Craig Dowell <craigdo@ee.washington.edu>
parents: 3852
diff changeset
  1001
EmuNetDevice::IsBridge (void) const
e525995ce5dc implement IsBridged for net devices
Craig Dowell <craigdo@ee.washington.edu>
parents: 3852
diff changeset
  1002
{
e525995ce5dc implement IsBridged for net devices
Craig Dowell <craigdo@ee.washington.edu>
parents: 3852
diff changeset
  1003
  return false;
e525995ce5dc implement IsBridged for net devices
Craig Dowell <craigdo@ee.washington.edu>
parents: 3852
diff changeset
  1004
}
e525995ce5dc implement IsBridged for net devices
Craig Dowell <craigdo@ee.washington.edu>
parents: 3852
diff changeset
  1005
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1006
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
  1007
EmuNetDevice::SetPromiscReceiveCallback (PromiscReceiveCallback cb)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1008
{
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
  1009
  NS_FATAL_ERROR ("EmuNetDevice::SetPromiscReceiveCallback(): Not implemented");
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1010
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1011
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1012
  bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
  1013
EmuNetDevice::SupportsSendFrom () const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1014
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1015
  NS_LOG_FUNCTION_NOARGS ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1016
  return true;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1017
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1018
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1019
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1020
Ptr<Node> 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
  1021
EmuNetDevice::GetNode (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1022
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1023
  return m_node;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1024
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1025
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1026
void 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
  1027
EmuNetDevice::SetNode (Ptr<Node> node)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1028
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1029
  m_node = node;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1030
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1031
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1032
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
  1033
EmuNetDevice::NeedsArp (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1034
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1035
  return true;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1036
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1037
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1038
void 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
  1039
EmuNetDevice::SetReceiveCallback (NetDevice::ReceiveCallback cb)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1040
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1041
  m_rxCallback = cb;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1042
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1043
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1044
} // namespace ns3