src/devices/emu/emu-net-device.cc
author Craig Dowell <craigdo@ee.washington.edu>
Sun, 26 Apr 2009 18:20:07 -0700
changeset 4417 973e0e873127
parent 4370 a64e987a727a
child 4424 af26433b13bc
permissions -rw-r--r--
expand emu search for creator, don't check FCS
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
4322
bad9eed19283 bug 498: Object Name Service Obsoletes Legacy Naming
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4272
diff changeset
   176
  m_sll_ifindex (-1)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   177
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   178
  NS_LOG_FUNCTION (this);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   179
  Start (m_tStart);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   180
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   181
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   182
EmuNetDevice::~EmuNetDevice ()
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   183
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   184
}
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
void 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   187
EmuNetDevice::DoDispose()
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   188
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   189
  NS_LOG_FUNCTION_NOARGS ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   190
  m_node = 0;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   191
  NetDevice::DoDispose ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   192
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   193
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   194
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   195
EmuNetDevice::Start (Time tStart)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   196
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   197
  NS_LOG_FUNCTION (tStart);
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
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   200
  // 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
   201
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   202
  Simulator::Cancel (m_startEvent);
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   203
  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
   204
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   205
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   206
  void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   207
EmuNetDevice::Stop (Time tStop)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   208
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   209
  NS_LOG_FUNCTION (tStop);
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
  // 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
   212
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   213
  Simulator::Cancel (m_stopEvent);
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   214
  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
   215
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   216
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   217
  void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   218
EmuNetDevice::StartDevice (void)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   219
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   220
  NS_LOG_FUNCTION_NOARGS ();
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
  //
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   223
  // 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
   224
  //
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   225
  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
   226
    {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   227
      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
   228
    }
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   229
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   230
  NS_LOG_LOGIC ("Creating socket");
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   231
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   232
  // 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
   233
  // 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
   234
  // 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
   235
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   236
  CreateSocket ();
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   237
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   238
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   239
  // 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
   240
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   241
  struct ifreq ifr;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   242
  bzero (&ifr, sizeof(ifr));
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   243
  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
   244
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   245
  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
   246
  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
   247
  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
   248
    {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   249
      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
   250
    }
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   251
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   252
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   253
  // 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
   254
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   255
  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
   256
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   257
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   258
  // 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
   259
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   260
  struct sockaddr_ll ll;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   261
  bzero (&ll, sizeof(ll));
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   262
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   263
  ll.sll_family = AF_PACKET;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   264
  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
   265
  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
   266
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   267
  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
   268
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   269
  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
   270
  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
   271
    {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   272
      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
   273
    }
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   274
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   275
  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
   276
  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
   277
    {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   278
      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
   279
    }
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   280
  
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   281
  //
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   282
  // 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
   283
  // 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
   284
  // 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
   285
  // 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
   286
  // 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
   287
  // 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
   288
  // 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
   289
  // 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
   290
  // end result.
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   291
  //
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   292
  if ((ifr.ifr_flags & IFF_PROMISC) == 0)
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
      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
   295
    }
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   296
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   297
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   298
  // 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
   299
  //
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   300
  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
   301
    {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   302
      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
   303
    }
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   304
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   305
  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
   306
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   307
  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
   308
  m_readThread->Start ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   309
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   310
  NotifyLinkUp ();
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
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   313
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   314
EmuNetDevice::CreateSocket (void)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   315
{
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   316
  NS_LOG_FUNCTION_NOARGS ();
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   317
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   318
  // 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
   319
  // 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
   320
  // 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
   321
  // 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
   322
  // 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
   323
  // 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
   324
  // for that purpose.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   325
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   326
  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
   327
  if (sock == -1)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   328
    {
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   329
      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
   330
    }
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
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   333
  // 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
   334
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   335
  struct sockaddr_un un;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   336
  memset (&un, 0, sizeof (un));
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   337
  un.sun_family = AF_UNIX;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   338
  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
   339
  if (status == -1)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   340
    {
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   341
      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
   342
    }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   343
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   344
  NS_LOG_INFO ("Created Unix socket");
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   345
  NS_LOG_INFO ("sun_family = " << un.sun_family);
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   346
  NS_LOG_INFO ("sun_path = " << un.sun_path);
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   347
3830
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
  // 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
   350
  // 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
   351
  // 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
   352
  // 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
   353
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   354
  socklen_t len = sizeof (un);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   355
  status = getsockname (sock, (struct sockaddr*)&un, &len);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   356
  if (status == -1)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   357
    {
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   358
      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
   359
    }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   360
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   361
  //
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   362
  // 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
   363
  //
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   364
  std::string path = EmuBufferToString((uint8_t *)&un, len);
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   365
  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
   366
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   367
  // 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
   368
  // 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
   369
  // 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
   370
  //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   371
  pid_t pid = ::fork ();
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   372
  if (pid == 0)
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
      NS_LOG_DEBUG ("Child process");
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   375
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   376
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   377
      // 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
   378
      // 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
   379
      // the (now) parent process.
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
      std::ostringstream oss;
3835
8966e68809a6 turn off LOG in emu-sock-creator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3831
diff changeset
   382
      oss << "-p" << path;
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   383
      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
   384
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   385
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   386
      // Execute the socket creation process image.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   387
      //
4417
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   388
      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
   389
                        "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
   390
                        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
   391
                        (char *)NULL);
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   392
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   393
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   394
      // 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
   395
      // broken.  In either case, we bail.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   396
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   397
      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
   398
    }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   399
  else
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   400
    {
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   401
      NS_LOG_DEBUG ("Parent process");
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   402
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   403
      // 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
   404
      // socket creator process to finish its job.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   405
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   406
      int st;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   407
      pid_t waited = waitpid (pid, &st, 0);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   408
      if (waited == -1)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   409
	{
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   410
	  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
   411
	}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   412
      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
   413
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
      // 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
   416
      // 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
   417
      // even exit normally, we bail too.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   418
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   419
      if (WIFEXITED (st))
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   420
	{
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   421
          int exitStatus = WEXITSTATUS (st);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   422
          if (exitStatus != 0)
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(): socket creator exited normally with status " << exitStatus);
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
	}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   427
      else 
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
          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
   430
	}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   431
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
      // 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
   434
      // 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
   435
      // 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
   436
      // 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
   437
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   438
      // 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
   439
      // 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
   440
      // 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
   441
      // 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
   442
      // 
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   443
      struct iovec iov;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   444
      uint32_t magic;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   445
      iov.iov_base = &magic;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   446
      iov.iov_len = sizeof(magic);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   447
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   448
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   449
      // 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
   450
      // 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
   451
      // 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
   452
      // data arrays.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   453
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   454
      // 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
   455
      // 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
   456
      // 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
   457
      // so we call it "control."
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   458
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   459
      size_t msg_size = sizeof(int);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   460
      char control[CMSG_SPACE(msg_size)];
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
      // 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
   464
      // 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
   465
      // 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
   466
      // 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
   467
      // 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
   468
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   469
      // 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
   470
      // 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
   471
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   472
      struct msghdr msg;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   473
      msg.msg_name = 0;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   474
      msg.msg_namelen = 0;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   475
      msg.msg_iov = &iov;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   476
      msg.msg_iovlen = 1;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   477
      msg.msg_control = control;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   478
      msg.msg_controllen = sizeof (control);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   479
      msg.msg_flags = 0;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   480
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   481
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   482
      // 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
   483
      // creator process.
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   484
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   485
      ssize_t bytesRead = recvmsg (sock, &msg, 0);
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   486
      if (bytesRead != sizeof(int))
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   487
	{
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   488
          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
   489
	}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   490
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   491
      //
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   492
      // 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
   493
      // 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
   494
      // one we're interested in.
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
      struct cmsghdr *cmsg;
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   497
      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
   498
	{
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   499
	  if (cmsg->cmsg_level == SOL_SOCKET &&
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   500
	      cmsg->cmsg_type == SCM_RIGHTS)
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   501
	    {
3831
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   502
              //
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   503
              // 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
   504
              // 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
   505
              // it matches
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   506
              //
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   507
              if (magic == EMU_MAGIC)
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   508
                {
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   509
                  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
   510
                  int *rawSocket = (int*)CMSG_DATA (cmsg);
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   511
                  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
   512
                  m_sock = *rawSocket;
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   513
                  return;
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   514
                }
16c2970a0344 add emu-udp-echo example
Craig Dowell <craigdo@ee.washington.edu>
parents: 3830
diff changeset
   515
              else
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
                  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
   518
                }
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   519
	    }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   520
	}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   521
      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
   522
    }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   523
}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   524
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   525
std::string
4417
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   526
EmuNetDevice::FindCreator (std::string creatorName)
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   527
{
4417
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   528
  NS_LOG_FUNCTION (creatorName);
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   529
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   530
  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
   531
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   532
  // 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
   533
  locations.push_back ("./");
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   534
  locations.push_back ("./");
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   535
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   536
  // 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
   537
  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
   538
  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
   539
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   540
  // 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
   541
  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
   542
  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
   543
4417
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   544
  // 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
   545
  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
   546
  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
   547
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   548
  // 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
   549
  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
   550
  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
   551
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   552
  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
   553
    {
4417
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   554
      struct stat st;
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   555
4417
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   556
      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
   557
	{
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   558
          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
   559
	  return *i + creatorName;
973e0e873127 expand emu search for creator, don't check FCS
Craig Dowell <craigdo@ee.washington.edu>
parents: 4370
diff changeset
   560
	}
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   561
    }
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   562
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   563
  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
   564
  return ""; // quiet compiler
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   565
}
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   566
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   567
void
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   568
EmuNetDevice::StopDevice (void)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   569
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   570
  NS_LOG_FUNCTION_NOARGS ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   571
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   572
  close (m_sock);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   573
  m_sock = -1;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   574
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   575
  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
   576
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   577
  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
   578
  m_readThread->Join ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   579
  m_readThread = 0;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   580
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   581
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   582
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   583
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
   584
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   585
  NS_LOG_FUNCTION (buf << len);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   586
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   587
  /* IPv6 support*/
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   588
  uint8_t mac[6];
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   589
  Mac48Address multicast6AllNodes("33:33:00:00:00:01");
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   590
  Mac48Address multicast6AllRouters("33:33:00:00:00:02");
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   591
  Mac48Address multicast6AllHosts("33:33:00:00:00:03");
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   592
  Mac48Address multicast6Node; /* multicast address addressed to our MAC address */
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   593
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   594
  /* generate IPv6 multicast ethernet destination that nodes will accept */
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   595
  GetAddress().CopyTo(mac);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   596
  mac[0]=0x33;
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   597
  mac[1]=0x33;
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   598
  multicast6Node.CopyFrom(mac);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   599
3827
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
  // 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
   602
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   603
  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
   604
  free (buf);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   605
  buf = 0;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   606
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
  // 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
   609
  // headers.
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   610
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   611
  Ptr<Packet> originalPacket = packet->Copy ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   612
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   613
  EthernetHeader header (false);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   614
  packet->RemoveHeader (header);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   615
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   616
  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
   617
  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
   618
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   619
  uint16_t protocol;
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   620
  
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   621
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   622
  // 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
   623
  // 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
   624
  // 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
   625
  // find the protocol number (Ethernet type) directly.
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   626
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   627
  if (header.GetLengthType () <= 1500)
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   628
    {
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   629
      LlcSnapHeader llc;
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   630
      packet->RemoveHeader (llc);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   631
      protocol = llc.GetType ();
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   632
    }
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   633
  else
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
      protocol = header.GetLengthType ();
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   636
    }
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   637
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   638
  PacketType packetType;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   639
      
3842
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   640
  if (header.GetDestination ().IsBroadcast ())
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   641
    {
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   642
      packetType = NS3_PACKET_BROADCAST;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   643
    }
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   644
  else if (header.GetDestination ().IsMulticast () ||
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   645
           header.GetDestination() == multicast6Node ||
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   646
           header.GetDestination() == multicast6AllNodes ||
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   647
           header.GetDestination() == multicast6AllRouters ||
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   648
           header.GetDestination() == multicast6AllHosts)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   649
    {
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   650
      packetType = NS3_PACKET_MULTICAST;          
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   651
    }
3842
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   652
  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
   653
    {
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   654
      packetType = NS3_PACKET_HOST;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   655
    }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   656
  else
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   657
    {
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   658
      packetType = NS3_PACKET_OTHERHOST;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   659
    }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   660
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   661
  // 
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   662
  // 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
   663
  // 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
   664
  // make sure that nobody messes with our packet.
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   665
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   666
  m_promiscSnifferTrace (originalPacket);
4264
9d2e96c4e6e4 Piles of changes for tracing rework
Craig Dowell <craigdo@ee.washington.edu>
parents: 4263
diff changeset
   667
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   668
  if (!m_promiscRxCallback.IsNull ())
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   669
    {
4272
b40ce56e0247 Add MacPromiscRx, make MacRx non-promisc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4265
diff changeset
   670
      m_macPromiscRxTrace (originalPacket);
4265
5f837915710a remove unneeded packet copies, includes. Rescan
Craig Dowell <craigdo@ee.washington.edu>
parents: 4264
diff changeset
   671
      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
   672
    }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   673
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   674
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   675
  // 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
   676
  // 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
   677
  // 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
   678
  //
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   679
  if (packetType != NS3_PACKET_OTHERHOST)
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
      m_snifferTrace (originalPacket);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   682
      m_macRxTrace (originalPacket);
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   683
      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
   684
    }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   685
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   686
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   687
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   688
EmuNetDevice::ReadThread (void)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   689
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   690
  NS_LOG_FUNCTION_NOARGS ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   691
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
  // 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
   694
  // 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
   695
  // 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
   696
  // 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
   697
  // 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
   698
  // 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
   699
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   700
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   701
  int32_t len = -1;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   702
  struct sockaddr_ll addr;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   703
  socklen_t addrSize = sizeof (addr);
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
  for (;;) 
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
      uint32_t bufferSize = 65536;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   708
      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
   709
      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
   710
        {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   711
          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
   712
        }
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   713
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   714
      NS_LOG_LOGIC ("Calling recvfrom");
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   715
      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
   716
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   717
      if (len == -1)
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   718
        {
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   719
          free (buf);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   720
          buf = 0;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   721
          return;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   722
        }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   723
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   724
      NS_LOG_INFO ("EmuNetDevice::ReadThread(): Received packet");
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   725
      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
   726
      DynamicCast<RealtimeSimulatorImpl> (Simulator::GetImplementation ())->ScheduleRealtimeNow (
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   727
        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
   728
      buf = 0;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   729
    }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   730
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   731
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   732
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   733
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
   734
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   735
  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
   736
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   737
  // 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
   738
  // destination (hardware) addresses?
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   739
  //
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   740
  // 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
   741
  // 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
   742
  // 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
   743
  // 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
   744
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   745
  // 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
   746
  // 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
   747
  // 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
   748
  // 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
   749
  // 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
   750
  // 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
   751
  //
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   752
  // 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
   753
  // 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
   754
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   755
  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
   756
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   757
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   758
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   759
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
   760
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   761
  NS_LOG_FUNCTION (packet << src << dest << protocolNumber);
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   762
  NS_LOG_LOGIC ("packet =" << packet);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   763
  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
   764
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   765
  if (IsLinkUp () == false)
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   766
    {
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   767
      m_macTxDropTrace (packet);
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   768
      return false;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   769
    }
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   770
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   771
  Mac48Address destination = Mac48Address::ConvertFrom (dest);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   772
  Mac48Address source = Mac48Address::ConvertFrom (src);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   773
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   774
  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
   775
  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
   776
  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
   777
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   778
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   779
  // 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
   780
  // 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
   781
  // go that route.
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   782
  //
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   783
  LlcSnapHeader llc;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   784
  llc.SetType (protocolNumber);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   785
  packet->AddHeader (llc);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   786
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   787
  EthernetHeader header (false);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   788
  header.SetSource (source);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   789
  header.SetDestination (destination);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   790
  header.SetLengthType (packet->GetSize ());
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   791
  packet->AddHeader (header);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   792
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   793
  EthernetTrailer trailer;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   794
  trailer.CalcFcs (packet);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   795
  packet->AddTrailer (trailer);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   796
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   797
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   798
  // 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
   799
  // 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
   800
  // 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
   801
  //
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   802
  m_macTxTrace (packet);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   803
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   804
  // 
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   805
  // 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
   806
  //
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   807
  m_queue->Enqueue (packet);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   808
  packet = m_queue->Dequeue ();
4263
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   809
  NS_ASSERT_MSG (packet, "EmuNetDevice::SendFrom(): packet zero from queue");
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   810
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   811
  m_promiscSnifferTrace (packet);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   812
  m_snifferTrace (packet);
fec2f830d015 trace consistency changes
Craig Dowell <craigdo@ee.washington.edu>
parents: 4017
diff changeset
   813
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   814
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   815
  struct sockaddr_ll ll;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   816
  bzero (&ll, sizeof (ll));
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   817
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   818
  ll.sll_family = AF_PACKET;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   819
  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
   820
  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
   821
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   822
  NS_LOG_LOGIC ("calling sendto");
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   823
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   824
  int32_t rc;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   825
  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
   826
  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
   827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   828
  return rc == -1 ? false : true;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   829
}
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
void 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   832
EmuNetDevice::SetDataRate(DataRate bps)
3827
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
  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
   835
  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
   836
}
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
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   839
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
   840
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   841
  NS_LOG_FUNCTION (this << q);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   842
  m_queue = q;
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
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   845
Ptr<Queue> 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   846
EmuNetDevice::GetQueue(void) const 
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   847
{ 
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   848
  NS_LOG_FUNCTION_NOARGS ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   849
  return m_queue;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   850
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   851
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   852
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   853
EmuNetDevice::NotifyLinkUp (void)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   854
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   855
  m_linkUp = true;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   856
  if (!m_linkChangeCallback.IsNull ())
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   857
    {
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   858
      m_linkChangeCallback ();
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
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   862
void 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   863
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
   864
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   865
  m_ifIndex = index;
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
uint32_t 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   869
EmuNetDevice::GetIfIndex(void) const
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
  return m_ifIndex;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   872
}
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
Ptr<Channel> 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   875
EmuNetDevice::GetChannel (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   876
{
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   877
  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
   878
  return 0;
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
void 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   882
EmuNetDevice::SetAddress (Mac48Address addr)
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
  NS_LOG_FUNCTION (addr);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   885
  m_address = addr;
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
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   888
Address 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   889
EmuNetDevice::GetAddress (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   890
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   891
  NS_LOG_FUNCTION_NOARGS ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   892
  return m_address;
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
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   895
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   896
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
   897
{
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   898
  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
   899
  return false;
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
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   902
uint16_t 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   903
EmuNetDevice::GetMtu (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   904
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   905
  struct ifreq ifr;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   906
  bzero (&ifr, sizeof (ifr));
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   907
  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
   908
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   909
  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
   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
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   912
  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
   913
  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
   914
    {
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   915
      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
   916
    }
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
  close (fd);
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   919
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   920
  return ifr.ifr_mtu;
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
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   923
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   924
EmuNetDevice::IsLinkUp (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   925
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   926
  return m_linkUp;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   927
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   928
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   929
void 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   930
EmuNetDevice::SetLinkChangeCallback (Callback<void> callback)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   931
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   932
  m_linkChangeCallback = callback;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   933
}
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
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   936
EmuNetDevice::IsBroadcast (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   937
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   938
  return true;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   939
}
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
Address
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   942
EmuNetDevice::GetBroadcast (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   943
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   944
  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
   945
}
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
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   948
EmuNetDevice::IsMulticast (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   949
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   950
  return false;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   951
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   952
3842
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   953
  Address 
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   954
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
   955
{
3836
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   956
  NS_LOG_FUNCTION (multicastGroup);
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   957
3842
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   958
  Mac48Address ad = Mac48Address::GetMulticast (multicastGroup);
3836
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   959
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   960
  //
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   961
  // 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
   962
  // 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
   963
  // to an Address.
e3aa8940f23b enable multicast in emu-net-device
Craig Dowell <craigdo@ee.washington.edu>
parents: 3835
diff changeset
   964
  //
3842
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   965
  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
   966
545ddf9398ed apply patch for bug 294 (GetMulticastAddr) + emu device update + rescan
vincent@clarinet.u-strasbg.fr
parents: 3836
diff changeset
   967
  return ad;
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   968
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   969
3852
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   970
Address
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   971
EmuNetDevice::GetMulticast (Ipv6Address addr) const
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   972
{
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   973
  NS_LOG_FUNCTION(this << addr);
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   974
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   975
  Mac48Address ad = Mac48Address::GetMulticast (addr);
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   976
  NS_LOG_LOGIC("MAC IPv6 multicast address is " << ad);
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   977
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   978
  return ad;
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   979
}
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3851
diff changeset
   980
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   981
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   982
EmuNetDevice::IsPointToPoint (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   983
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   984
  return false;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   985
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   986
3936
e525995ce5dc implement IsBridged for net devices
Craig Dowell <craigdo@ee.washington.edu>
parents: 3852
diff changeset
   987
bool 
e525995ce5dc implement IsBridged for net devices
Craig Dowell <craigdo@ee.washington.edu>
parents: 3852
diff changeset
   988
EmuNetDevice::IsBridge (void) const
e525995ce5dc implement IsBridged for net devices
Craig Dowell <craigdo@ee.washington.edu>
parents: 3852
diff changeset
   989
{
e525995ce5dc implement IsBridged for net devices
Craig Dowell <craigdo@ee.washington.edu>
parents: 3852
diff changeset
   990
  return false;
e525995ce5dc implement IsBridged for net devices
Craig Dowell <craigdo@ee.washington.edu>
parents: 3852
diff changeset
   991
}
e525995ce5dc implement IsBridged for net devices
Craig Dowell <craigdo@ee.washington.edu>
parents: 3852
diff changeset
   992
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   993
void
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
   994
EmuNetDevice::SetPromiscReceiveCallback (PromiscReceiveCallback cb)
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   995
{
3847
784c45b27326 asserts cut and paste into places where fatal error was appropriate
Craig Dowell <craigdo@ee.washington.edu>
parents: 3842
diff changeset
   996
  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
   997
}
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
  bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
  1000
EmuNetDevice::SupportsSendFrom () const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1001
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1002
  NS_LOG_FUNCTION_NOARGS ();
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1003
  return true;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1004
}
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1005
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1006
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1007
Ptr<Node> 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
  1008
EmuNetDevice::GetNode (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1009
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1010
  return m_node;
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
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1013
void 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
  1014
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
  1015
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1016
  m_node = node;
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
bool 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
  1020
EmuNetDevice::NeedsArp (void) const
3827
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1021
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1022
  return true;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1023
}
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
void 
3830
8862b9be62bb rework to address suid root issues
Craig Dowell <craigdo@ee.washington.edu>
parents: 3827
diff changeset
  1026
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
  1027
{
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1028
  m_rxCallback = cb;
4b603cd4ee42 give up on merging tap and emulated, break apart
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
  1029
}
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
} // namespace ns3