src/internet/model/nsc-tcp-socket-impl.cc
author Tom Henderson <tomh@tomh.org>
Fri, 25 Feb 2011 10:32:35 -0800
changeset 6834 036f9a0b9899
parent 6694 src/internet-stack/nsc-tcp-socket-impl.cc@a814f37d15bf
child 7176 9f2663992e99
permissions -rw-r--r--
Rename internet-stack to internet, and organize module
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
     2
/*
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
     3
 * This program is free software; you can redistribute it and/or modify
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
     4
 * it under the terms of the GNU General Public License version 2 as
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
     5
 * published by the Free Software Foundation;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
     6
 *
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
     7
 * This program is distributed in the hope that it will be useful,
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
     8
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
     9
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    10
 * GNU General Public License for more details.
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    11
 *
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    12
 * You should have received a copy of the GNU General Public License
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    13
 * along with this program; if not, write to the Free Software
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    14
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    15
 *
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    16
 * based on tcp-socket-impl.cc, Author: Raj Bhattacharjea <raj.b@gatech.edu>
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    17
 * Author: Florian Westphal <fw@strlen.de>
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    18
 */
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    19
5887
50e5de0b03db add context to tcp logging
Tom Henderson <tomh@tomh.org>
parents: 4740
diff changeset
    20
#define NS_LOG_APPEND_CONTEXT                                   \
50e5de0b03db add context to tcp logging
Tom Henderson <tomh@tomh.org>
parents: 4740
diff changeset
    21
  if (m_node) { std::clog << Simulator::Now ().GetSeconds () << " [node " << m_node->GetId () << "] "; } 
50e5de0b03db add context to tcp logging
Tom Henderson <tomh@tomh.org>
parents: 4740
diff changeset
    22
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    23
#include "ns3/node.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    24
#include "ns3/inet-socket-address.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    25
#include "ns3/log.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    26
#include "ns3/ipv4.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    27
#include "ipv4-end-point.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    28
#include "nsc-tcp-l4-protocol.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    29
#include "nsc-tcp-socket-impl.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    30
#include "ns3/simulation-singleton.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    31
#include "ns3/simulator.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    32
#include "ns3/packet.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    33
#include "ns3/uinteger.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    34
#include "ns3/trace-source-accessor.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    35
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    36
#include <algorithm>
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    37
3711
fed597b0583e nsc: avoid unecessary use of posix headers
Florian Westphal <fw@strlen.de>
parents: 3635
diff changeset
    38
// for ntohs().
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    39
#include <arpa/inet.h>
3711
fed597b0583e nsc: avoid unecessary use of posix headers
Florian Westphal <fw@strlen.de>
parents: 3635
diff changeset
    40
#include <netinet/in.h>
6694
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
    41
#include "sim_interface.h"
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    42
3635
cddd59578812 compile nsc code unconditionally.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3589
diff changeset
    43
#include "sim_errno.h"
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    44
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    45
NS_LOG_COMPONENT_DEFINE ("NscTcpSocketImpl");
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    46
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    47
using namespace std;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    48
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    49
namespace ns3 {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    50
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    51
NS_OBJECT_ENSURE_REGISTERED (NscTcpSocketImpl);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    52
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    53
TypeId
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    54
NscTcpSocketImpl::GetTypeId ()
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    55
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    56
  static TypeId tid = TypeId("ns3::NscTcpSocketImpl")
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    57
    .SetParent<TcpSocket> ()
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    58
    .AddTraceSource ("CongestionWindow",
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    59
                     "The TCP connection's congestion window",
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    60
                     MakeTraceSourceAccessor (&NscTcpSocketImpl::m_cWnd))
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    61
    ;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    62
  return tid;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    63
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    64
6694
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
    65
NscTcpSocketImpl::NscTcpSocketImpl ()
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    66
  : m_endPoint (0),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    67
    m_node (0),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    68
    m_tcp (0),
3778
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
    69
    m_localAddress (Ipv4Address::GetZero ()),
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
    70
    m_localPort (0),
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    71
    m_peerAddress ("0.0.0.0", 0),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    72
    m_errno (ERROR_NOTERROR),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    73
    m_shutdownSend (false),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    74
    m_shutdownRecv (false),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    75
    m_connected (false),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    76
    m_state (CLOSED),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    77
    m_closeOnEmpty (false),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    78
    m_txBufferSize (0),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    79
    m_lastMeasuredRtt (Seconds(0.0))
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    80
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    81
  NS_LOG_FUNCTION (this);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    82
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    83
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    84
NscTcpSocketImpl::NscTcpSocketImpl(const NscTcpSocketImpl& sock)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    85
  : TcpSocket(sock), //copy the base class callbacks
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    86
    m_delAckMaxCount (sock.m_delAckMaxCount),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    87
    m_delAckTimeout (sock.m_delAckTimeout),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    88
    m_endPoint (0),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    89
    m_node (sock.m_node),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    90
    m_tcp (sock.m_tcp),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    91
    m_remoteAddress (sock.m_remoteAddress),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    92
    m_remotePort (sock.m_remotePort),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    93
    m_localAddress (sock.m_localAddress),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    94
    m_localPort (sock.m_localPort),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    95
    m_peerAddress (sock.m_peerAddress),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    96
    m_errno (sock.m_errno),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    97
    m_shutdownSend (sock.m_shutdownSend),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    98
    m_shutdownRecv (sock.m_shutdownRecv),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    99
    m_connected (sock.m_connected),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   100
    m_state (sock.m_state),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   101
    m_closeOnEmpty (sock.m_closeOnEmpty),
6319
2b1bbc8d0c58 bug 906: NSC TCP socket fork did not copy txbuffersize over
Antti Mäkelä <zarhan@cc.hut.fi>
parents: 5971
diff changeset
   102
    m_txBufferSize (sock.m_txBufferSize),
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   103
    m_segmentSize (sock.m_segmentSize),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   104
    m_rxWindowSize (sock.m_rxWindowSize),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   105
    m_advertisedWindowSize (sock.m_advertisedWindowSize),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   106
    m_cWnd (sock.m_cWnd),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   107
    m_ssThresh (sock.m_ssThresh),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   108
    m_initialCWnd (sock.m_initialCWnd),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   109
    m_lastMeasuredRtt (Seconds(0.0)),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   110
    m_cnTimeout (sock.m_cnTimeout),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   111
    m_cnCount (sock.m_cnCount),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   112
    m_rxAvailable (0),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   113
    m_nscTcpSocket (0),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   114
    m_sndBufSize (sock.m_sndBufSize)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   115
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   116
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   117
  NS_LOG_LOGIC("Invoked the copy constructor");
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   118
  //copy the pending data if necessary
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   119
  if(!sock.m_txBuffer.empty () )
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   120
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   121
      m_txBuffer = sock.m_txBuffer;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   122
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   123
  //can't "copy" the endpoint just yes, must do this when we know the peer info
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   124
  //too; this is in SYN_ACK_TX
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   125
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   126
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   127
NscTcpSocketImpl::~NscTcpSocketImpl ()
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   128
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   129
  NS_LOG_FUNCTION(this);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   130
  m_node = 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   131
  if (m_endPoint != 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   132
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   133
      NS_ASSERT (m_tcp != 0);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   134
      /**
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   135
       * Note that this piece of code is a bit tricky:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   136
       * when DeAllocate is called, it will call into
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   137
       * Ipv4EndPointDemux::Deallocate which triggers
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   138
       * a delete of the associated endPoint which triggers
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   139
       * in turn a call to the method ::Destroy below
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   140
       * will will zero the m_endPoint field.
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   141
       */
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   142
      NS_ASSERT (m_endPoint != 0);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   143
      m_tcp->DeAllocate (m_endPoint);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   144
      NS_ASSERT (m_endPoint == 0);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   145
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   146
  m_tcp = 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   147
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   148
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   149
void
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   150
NscTcpSocketImpl::SetNode (Ptr<Node> node)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   151
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   152
  m_node = node;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   153
  // Initialize some variables 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   154
  m_cWnd = m_initialCWnd * m_segmentSize;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   155
  m_rxWindowSize = m_advertisedWindowSize;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   156
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   157
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   158
void 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   159
NscTcpSocketImpl::SetTcp (Ptr<NscTcpL4Protocol> tcp)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   160
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   161
  m_nscTcpSocket = tcp->m_nscStack->new_tcp_socket();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   162
  m_tcp = tcp;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   163
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   164
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   165
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   166
enum Socket::SocketErrno
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   167
NscTcpSocketImpl::GetErrno (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   168
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   169
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   170
  return m_errno;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   171
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   172
6689
e2de571e920a Implement Socket::GetSocketType
Josh Pelkey <jpelkey@gatech.edu>
parents: 6549
diff changeset
   173
enum Socket::SocketType
e2de571e920a Implement Socket::GetSocketType
Josh Pelkey <jpelkey@gatech.edu>
parents: 6549
diff changeset
   174
NscTcpSocketImpl::GetSocketType (void) const
e2de571e920a Implement Socket::GetSocketType
Josh Pelkey <jpelkey@gatech.edu>
parents: 6549
diff changeset
   175
{
6692
591fb1aa0ca4 Avoid enum name collision in socket
Josh Pelkey <jpelkey@gatech.edu>
parents: 6689
diff changeset
   176
  return NS3_SOCK_STREAM;
6689
e2de571e920a Implement Socket::GetSocketType
Josh Pelkey <jpelkey@gatech.edu>
parents: 6549
diff changeset
   177
}
e2de571e920a Implement Socket::GetSocketType
Josh Pelkey <jpelkey@gatech.edu>
parents: 6549
diff changeset
   178
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   179
Ptr<Node>
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   180
NscTcpSocketImpl::GetNode (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   181
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   182
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   183
  return m_node;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   184
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   185
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   186
void 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   187
NscTcpSocketImpl::Destroy (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   188
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   189
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   190
  m_node = 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   191
  m_endPoint = 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   192
  m_tcp = 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   193
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   194
int
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   195
NscTcpSocketImpl::FinishBind (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   196
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   197
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   198
  if (m_endPoint == 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   199
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   200
      return -1;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   201
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   202
  m_endPoint->SetRxCallback (MakeCallback (&NscTcpSocketImpl::ForwardUp, Ptr<NscTcpSocketImpl>(this)));
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   203
  m_endPoint->SetDestroyCallback (MakeCallback (&NscTcpSocketImpl::Destroy, Ptr<NscTcpSocketImpl>(this)));
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   204
  m_localAddress = m_endPoint->GetLocalAddress ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   205
  m_localPort = m_endPoint->GetLocalPort ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   206
  return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   207
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   208
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   209
int
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   210
NscTcpSocketImpl::Bind (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   211
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   212
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   213
  m_endPoint = m_tcp->Allocate ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   214
  return FinishBind ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   215
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   216
int 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   217
NscTcpSocketImpl::Bind (const Address &address)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   218
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   219
  NS_LOG_FUNCTION (this<<address);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   220
  if (!InetSocketAddress::IsMatchingType (address))
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   221
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   222
      return ERROR_INVAL;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   223
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   224
  InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   225
  Ipv4Address ipv4 = transport.GetIpv4 ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   226
  uint16_t port = transport.GetPort ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   227
  if (ipv4 == Ipv4Address::GetAny () && port == 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   228
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   229
      m_endPoint = m_tcp->Allocate ();
5888
c9193222c2a4 NSC logging statements
Tom Henderson <tomh@tomh.org>
parents: 5887
diff changeset
   230
      NS_LOG_LOGIC ("NscTcpSocketImpl "<<this<<" got an endpoint: "<<m_endPoint);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   231
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   232
  else if (ipv4 == Ipv4Address::GetAny () && port != 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   233
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   234
      m_endPoint = m_tcp->Allocate (port);
5888
c9193222c2a4 NSC logging statements
Tom Henderson <tomh@tomh.org>
parents: 5887
diff changeset
   235
      NS_LOG_LOGIC ("NscTcpSocketImpl "<<this<<" got an endpoint: "<<m_endPoint);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   236
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   237
  else if (ipv4 != Ipv4Address::GetAny () && port == 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   238
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   239
      m_endPoint = m_tcp->Allocate (ipv4);
5888
c9193222c2a4 NSC logging statements
Tom Henderson <tomh@tomh.org>
parents: 5887
diff changeset
   240
      NS_LOG_LOGIC ("NscTcpSocketImpl "<<this<<" got an endpoint: "<<m_endPoint);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   241
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   242
  else if (ipv4 != Ipv4Address::GetAny () && port != 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   243
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   244
      m_endPoint = m_tcp->Allocate (ipv4, port);
5888
c9193222c2a4 NSC logging statements
Tom Henderson <tomh@tomh.org>
parents: 5887
diff changeset
   245
      NS_LOG_LOGIC ("NscTcpSocketImpl "<<this<<" got an endpoint: "<<m_endPoint);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   246
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   247
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   248
  m_localPort = port;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   249
  return FinishBind ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   250
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   251
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   252
int 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   253
NscTcpSocketImpl::ShutdownSend (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   254
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   255
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   256
  m_shutdownSend = true;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   257
  return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   258
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   259
int 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   260
NscTcpSocketImpl::ShutdownRecv (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   261
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   262
  NS_LOG_FUNCTION_NOARGS ();
4491
893d48fcf7f3 bug 535: UDP/TCP ShutdownRecv incorrect
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3869
diff changeset
   263
  m_shutdownRecv = true;
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   264
  return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   265
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   266
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   267
int
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   268
NscTcpSocketImpl::Close (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   269
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   270
  NS_LOG_FUNCTION (this << m_state);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   271
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   272
  if (m_state == CLOSED)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   273
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   274
      return -1;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   275
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   276
  if (!m_txBuffer.empty ())
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   277
    { // App close with pending data must wait until all data transmitted
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   278
      m_closeOnEmpty = true;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   279
      NS_LOG_LOGIC("Socket " << this << 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   280
                   " deferring close, state " << m_state);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   281
      return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   282
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   283
5888
c9193222c2a4 NSC logging statements
Tom Henderson <tomh@tomh.org>
parents: 5887
diff changeset
   284
  NS_LOG_LOGIC("NscTcp socket " << this << " calling disconnect(); moving to CLOSED");
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   285
  m_nscTcpSocket->disconnect();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   286
  m_state = CLOSED;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   287
  ShutdownSend ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   288
  return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   289
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   290
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   291
int
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   292
NscTcpSocketImpl::Connect (const Address & address)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   293
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   294
  NS_LOG_FUNCTION (this << address);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   295
  if (m_endPoint == 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   296
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   297
      if (Bind () == -1)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   298
        {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   299
          NS_ASSERT (m_endPoint == 0);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   300
          return -1;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   301
        }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   302
      NS_ASSERT (m_endPoint != 0);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   303
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   304
  InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   305
  m_remoteAddress = transport.GetIpv4 ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   306
  m_remotePort = transport.GetPort ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   307
3711
fed597b0583e nsc: avoid unecessary use of posix headers
Florian Westphal <fw@strlen.de>
parents: 3635
diff changeset
   308
  std::ostringstream ss;
fed597b0583e nsc: avoid unecessary use of posix headers
Florian Westphal <fw@strlen.de>
parents: 3635
diff changeset
   309
  m_remoteAddress.Print(ss);
fed597b0583e nsc: avoid unecessary use of posix headers
Florian Westphal <fw@strlen.de>
parents: 3635
diff changeset
   310
  std::string ipstring = ss.str ();
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   311
3711
fed597b0583e nsc: avoid unecessary use of posix headers
Florian Westphal <fw@strlen.de>
parents: 3635
diff changeset
   312
  m_nscTcpSocket->connect(ipstring.c_str (), m_remotePort);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   313
  m_state = SYN_SENT;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   314
  return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   315
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   316
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   317
int
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   318
NscTcpSocketImpl::Send (const Ptr<Packet> p, uint32_t flags)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   319
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   320
  NS_LOG_FUNCTION (this << p);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   321
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   322
  NS_ASSERT (p->GetSize () > 0);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   323
  if (m_state == ESTABLISHED || m_state == SYN_SENT || m_state == CLOSE_WAIT)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   324
  {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   325
    if (p->GetSize () > GetTxAvailable ())
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   326
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   327
      m_errno = ERROR_MSGSIZE;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   328
      return -1;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   329
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   330
3780
317ccc4ebb4e bug 386: make sure errno is not set incorrectly and don't access stale packets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3778
diff changeset
   331
    uint32_t sent = p->GetSize ();
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   332
    if (m_state == ESTABLISHED)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   333
      {
3780
317ccc4ebb4e bug 386: make sure errno is not set incorrectly and don't access stale packets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3778
diff changeset
   334
        m_txBuffer.push(p);
317ccc4ebb4e bug 386: make sure errno is not set incorrectly and don't access stale packets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3778
diff changeset
   335
        m_txBufferSize += sent;
317ccc4ebb4e bug 386: make sure errno is not set incorrectly and don't access stale packets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3778
diff changeset
   336
        SendPendingData();
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   337
      }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   338
      else
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   339
      {  // SYN_SET -- Queue Data
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   340
         m_txBuffer.push(p);
3780
317ccc4ebb4e bug 386: make sure errno is not set incorrectly and don't access stale packets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3778
diff changeset
   341
         m_txBufferSize += sent;
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   342
      }
3780
317ccc4ebb4e bug 386: make sure errno is not set incorrectly and don't access stale packets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3778
diff changeset
   343
    return sent;
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   344
  }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   345
  else
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   346
  {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   347
    m_errno = ERROR_NOTCONN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   348
    return -1;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   349
  }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   350
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   351
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   352
int
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   353
NscTcpSocketImpl::SendTo (Ptr<Packet> p, uint32_t flags, const Address &address)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   354
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   355
  NS_LOG_FUNCTION (this << address << p);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   356
  if (!m_connected)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   357
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   358
      m_errno = ERROR_NOTCONN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   359
      return -1;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   360
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   361
  else
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   362
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   363
      return Send (p, flags); //drop the address according to BSD manpages
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   364
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   365
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   366
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   367
uint32_t
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   368
NscTcpSocketImpl::GetTxAvailable (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   369
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   370
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   371
  if (m_txBufferSize != 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   372
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   373
      NS_ASSERT (m_txBufferSize <= m_sndBufSize);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   374
      return m_sndBufSize - m_txBufferSize;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   375
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   376
  else
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   377
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   378
      return m_sndBufSize;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   379
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   380
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   381
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   382
int
3772
f0d8608ab155 Remove queue limit from listen
Craig Dowell <craigdo@ee.washington.edu>
parents: 3711
diff changeset
   383
NscTcpSocketImpl::Listen (void)
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   384
{
3772
f0d8608ab155 Remove queue limit from listen
Craig Dowell <craigdo@ee.washington.edu>
parents: 3711
diff changeset
   385
  NS_LOG_FUNCTION (this);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   386
  m_nscTcpSocket->listen(m_localPort);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   387
  m_state = LISTEN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   388
  return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   389
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   390
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   391
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   392
void
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   393
NscTcpSocketImpl::NSCWakeup ()
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   394
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   395
  switch (m_state) {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   396
  case SYN_SENT:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   397
      if (!m_nscTcpSocket->is_connected())
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   398
          break;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   399
      m_state = ESTABLISHED;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   400
      Simulator::ScheduleNow(&NscTcpSocketImpl::ConnectionSucceeded, this);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   401
      // fall through to schedule read/write events
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   402
  case ESTABLISHED:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   403
      if (!m_txBuffer.empty ())
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   404
          Simulator::ScheduleNow(&NscTcpSocketImpl::SendPendingData, this);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   405
      Simulator::ScheduleNow(&NscTcpSocketImpl::ReadPendingData, this);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   406
      break;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   407
  case LISTEN:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   408
      Simulator::ScheduleNow(&NscTcpSocketImpl::Accept, this);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   409
      break;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   410
  case CLOSED: break;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   411
  default:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   412
      NS_LOG_DEBUG (this << " invalid state: " << m_state);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   413
  }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   414
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   415
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   416
Ptr<Packet>
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   417
NscTcpSocketImpl::Recv (uint32_t maxSize, uint32_t flags)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   418
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   419
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   420
  if (m_deliveryQueue.empty() )
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   421
    {
3780
317ccc4ebb4e bug 386: make sure errno is not set incorrectly and don't access stale packets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3778
diff changeset
   422
      m_errno = ERROR_AGAIN;
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   423
      return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   424
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   425
  Ptr<Packet> p = m_deliveryQueue.front ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   426
  if (p->GetSize () <= maxSize)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   427
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   428
      m_deliveryQueue.pop ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   429
      m_rxAvailable -= p->GetSize ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   430
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   431
  else
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   432
    {
3780
317ccc4ebb4e bug 386: make sure errno is not set incorrectly and don't access stale packets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3778
diff changeset
   433
      m_errno = ERROR_AGAIN;
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   434
      p = 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   435
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   436
  return p;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   437
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   438
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   439
Ptr<Packet>
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   440
NscTcpSocketImpl::RecvFrom (uint32_t maxSize, uint32_t flags,
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   441
  Address &fromAddress)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   442
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   443
  NS_LOG_FUNCTION (this << maxSize << flags);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   444
  Ptr<Packet> packet = Recv (maxSize, flags);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   445
  if (packet != 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   446
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   447
      SocketAddressTag tag;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   448
      bool found;
4523
b8bdc36a3355 use packet tags rather than byte tags to match TcpSocketImpl and UdpSocketImpl
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4516
diff changeset
   449
      found = packet->PeekPacketTag (tag);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   450
      NS_ASSERT (found);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   451
      fromAddress = tag.GetAddress ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   452
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   453
  return packet;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   454
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   455
3778
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   456
int
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   457
NscTcpSocketImpl::GetSockName (Address &address) const
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   458
{
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   459
  NS_LOG_FUNCTION_NOARGS ();
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   460
  address = InetSocketAddress(m_localAddress, m_localPort);
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   461
  return 0;
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   462
}
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   463
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   464
uint32_t
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   465
NscTcpSocketImpl::GetRxAvailable (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   466
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   467
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   468
  // We separately maintain this state to avoid walking the queue 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   469
  // every time this might be called
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   470
  return m_rxAvailable;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   471
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   472
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   473
void
6442
f380cf1aa4d8 Bug 671 add packet-info-tag.cc for IP_PKTINFO/IPV6_PKTINFO
Hajime Tazaki <tazaki@sfc.wide.ad.jp>
parents: 6437
diff changeset
   474
NscTcpSocketImpl::ForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16_t port,
f380cf1aa4d8 Bug 671 add packet-info-tag.cc for IP_PKTINFO/IPV6_PKTINFO
Hajime Tazaki <tazaki@sfc.wide.ad.jp>
parents: 6437
diff changeset
   475
                             Ptr<Ipv4Interface> incomingInterface)
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   476
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   477
  NSCWakeup();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   478
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   479
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   480
void NscTcpSocketImpl::CompleteFork(void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   481
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   482
  // The address pairs (m_localAddress, m_localPort, m_remoteAddress, m_remotePort)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   483
  // are bogus, but this isn't important at the moment, because
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   484
  // address <-> Socket handling is done by NSC internally.
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   485
  // We only need to add the new ns-3 socket to the list of sockets, so
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   486
  // we use plain Allocate() instead of Allocate(m_localAddress, ... )
3869
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   487
  struct sockaddr_in sin;
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   488
  size_t sin_len = sizeof(sin);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   489
3869
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   490
  if (0 == m_nscTcpSocket->getpeername((struct sockaddr*) &sin, &sin_len)) {
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   491
    m_remotePort = ntohs(sin.sin_port);
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   492
    m_remoteAddress = m_remoteAddress.Deserialize((const uint8_t*) &sin.sin_addr);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   493
    m_peerAddress = InetSocketAddress(m_remoteAddress, m_remotePort);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   494
  }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   495
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   496
  m_endPoint = m_tcp->Allocate ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   497
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   498
  //the cloned socket with be in listen state, so manually change state
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   499
  NS_ASSERT(m_state == LISTEN);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   500
  m_state = ESTABLISHED;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   501
3869
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   502
  sin_len = sizeof(sin);
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   503
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   504
  if (0 == m_nscTcpSocket->getsockname((struct sockaddr *) &sin, &sin_len))
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   505
    m_localAddress = m_localAddress.Deserialize((const uint8_t*) &sin.sin_addr);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   506
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   507
  NS_LOG_LOGIC ("NscTcpSocketImpl " << this << " accepted connection from " 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   508
                 << m_remoteAddress << ":" << m_remotePort
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   509
                 << " to " << m_localAddress << ":" << m_localPort);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   510
  //equivalent to FinishBind
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   511
  m_endPoint->SetRxCallback (MakeCallback (&NscTcpSocketImpl::ForwardUp, Ptr<NscTcpSocketImpl>(this)));
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   512
  m_endPoint->SetDestroyCallback (MakeCallback (&NscTcpSocketImpl::Destroy, Ptr<NscTcpSocketImpl>(this)));
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   513
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   514
  NotifyNewConnectionCreated (this, m_peerAddress);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   515
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   516
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   517
void NscTcpSocketImpl::ConnectionSucceeded()
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   518
{ // We would preferred to have scheduled an event directly to
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   519
  // NotifyConnectionSucceeded, but (sigh) these are protected
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   520
  // and we can get the address of it :(
3869
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   521
  struct sockaddr_in sin;
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   522
  size_t sin_len = sizeof(sin);
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   523
  if (0 == m_nscTcpSocket->getsockname((struct sockaddr *) &sin, &sin_len)) {
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   524
    m_localAddress = m_localAddress.Deserialize((const uint8_t*)&sin.sin_addr);
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   525
    m_localPort = ntohs(sin.sin_port);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   526
  }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   527
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   528
  NS_LOG_LOGIC ("NscTcpSocketImpl " << this << " connected to "
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   529
                 << m_remoteAddress << ":" << m_remotePort
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   530
                 << " from " << m_localAddress << ":" << m_localPort);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   531
  NotifyConnectionSucceeded();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   532
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   533
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   534
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   535
bool NscTcpSocketImpl::Accept (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   536
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   537
  if (m_state == CLOSED)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   538
    {  // Happens if application closes listening socket after Accept() was scheduled.
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   539
      return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   540
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   541
  NS_ASSERT (m_state == LISTEN);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   542
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   543
  if (!m_nscTcpSocket->is_listening())
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   544
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   545
      return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   546
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   547
  INetStreamSocket *newsock;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   548
  int res = m_nscTcpSocket->accept(&newsock);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   549
  if (res != 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   550
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   551
      return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   552
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   553
// We could obtain a fromAddress using getpeername, but we've already
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   554
// finished the tcp handshake here, i.e. this is a new connection
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   555
// and not a connection request.
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   556
// if (!NotifyConnectionRequest(fromAddress))
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   557
//   return true;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   558
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   559
  // Clone the socket
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   560
  Ptr<NscTcpSocketImpl> newSock = Copy ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   561
  newSock->m_nscTcpSocket = newsock;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   562
  NS_LOG_LOGIC ("Cloned a NscTcpSocketImpl " << newSock);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   563
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   564
  Simulator::ScheduleNow (&NscTcpSocketImpl::CompleteFork, newSock);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   565
  return true;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   566
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   567
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   568
bool NscTcpSocketImpl::ReadPendingData (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   569
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   570
  if (m_state != ESTABLISHED)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   571
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   572
      return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   573
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   574
  int len, err;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   575
  uint8_t buffer[8192];
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   576
  len = sizeof(buffer);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   577
  m_errno = ERROR_NOTERROR;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   578
  err = m_nscTcpSocket->read_data(buffer, &len);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   579
  if (err == 0 && len == 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   580
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   581
      NS_LOG_LOGIC ("ReadPendingData got EOF from socket");
5889
526381e48c1d Fix NSC improper response to FIN
Tom Henderson <tomh@tomh.org>
parents: 5888
diff changeset
   582
      m_state = CLOSE_WAIT;
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   583
      return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   584
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   585
  m_errno = GetNativeNs3Errno(err);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   586
  switch (m_errno)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   587
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   588
      case ERROR_NOTERROR: break; // some data was sent
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   589
      case ERROR_AGAIN: return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   590
      default:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   591
        NS_LOG_WARN ("Error (" << err << ") " <<
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   592
                     "during read_data, ns-3 errno set to" << m_errno);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   593
        m_state = CLOSED;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   594
        return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   595
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   596
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   597
  Ptr<Packet> p =  Create<Packet> (buffer, len);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   598
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   599
  SocketAddressTag tag;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   600
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   601
  tag.SetAddress (m_peerAddress);
4523
b8bdc36a3355 use packet tags rather than byte tags to match TcpSocketImpl and UdpSocketImpl
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4516
diff changeset
   602
  p->AddPacketTag (tag);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   603
  m_deliveryQueue.push (p);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   604
  m_rxAvailable += p->GetSize ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   605
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   606
  NotifyDataRecv ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   607
  return true;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   608
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   609
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   610
bool NscTcpSocketImpl::SendPendingData (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   611
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   612
  NS_LOG_FUNCTION (this);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   613
  NS_LOG_LOGIC ("ENTERING SendPendingData");
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   614
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   615
  if (m_txBuffer.empty ())
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   616
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   617
      return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   618
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   619
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   620
  int ret;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   621
  size_t size, written = 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   622
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   623
  do {
3780
317ccc4ebb4e bug 386: make sure errno is not set incorrectly and don't access stale packets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3778
diff changeset
   624
    NS_ASSERT (!m_txBuffer.empty ());
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   625
    Ptr<Packet> &p = m_txBuffer.front ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   626
    size = p->GetSize ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   627
    NS_ASSERT (size > 0);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   628
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   629
    m_errno = ERROR_NOTERROR;
6549
487146fc889e get rid of about a zillion PeekData
Craig Dowell <craigdo@ee.washington.edu>
parents: 6448
diff changeset
   630
487146fc889e get rid of about a zillion PeekData
Craig Dowell <craigdo@ee.washington.edu>
parents: 6448
diff changeset
   631
    uint8_t *buf = new uint8_t[size];
487146fc889e get rid of about a zillion PeekData
Craig Dowell <craigdo@ee.washington.edu>
parents: 6448
diff changeset
   632
    p->CopyData (buf, size);
487146fc889e get rid of about a zillion PeekData
Craig Dowell <craigdo@ee.washington.edu>
parents: 6448
diff changeset
   633
    ret = m_nscTcpSocket->send_data((const char *)buf, size);
487146fc889e get rid of about a zillion PeekData
Craig Dowell <craigdo@ee.washington.edu>
parents: 6448
diff changeset
   634
    delete[] buf;
487146fc889e get rid of about a zillion PeekData
Craig Dowell <craigdo@ee.washington.edu>
parents: 6448
diff changeset
   635
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   636
    if (ret <= 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   637
      {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   638
        break;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   639
      }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   640
    written += ret;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   641
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   642
    NS_ASSERT (m_txBufferSize >= (size_t)ret);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   643
    m_txBufferSize -= ret;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   644
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   645
    if ((size_t)ret < size)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   646
      {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   647
        p->RemoveAtStart(ret);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   648
        break;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   649
      }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   650
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   651
    m_txBuffer.pop ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   652
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   653
    if (m_txBuffer.empty ())
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   654
      {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   655
        if (m_closeOnEmpty)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   656
          {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   657
            m_nscTcpSocket->disconnect();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   658
            m_state = CLOSED;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   659
          }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   660
        break;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   661
      }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   662
  } while ((size_t) ret == size);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   663
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   664
  if (written > 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   665
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   666
      Simulator::ScheduleNow(&NscTcpSocketImpl::NotifyDataSent, this, ret);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   667
      return true;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   668
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   669
  return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   670
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   671
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   672
Ptr<NscTcpSocketImpl> NscTcpSocketImpl::Copy ()
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   673
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   674
  return CopyObject<NscTcpSocketImpl> (this);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   675
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   676
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   677
void
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   678
NscTcpSocketImpl::SetSndBufSize (uint32_t size)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   679
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   680
  m_sndBufSize = size;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   681
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   682
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   683
uint32_t
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   684
NscTcpSocketImpl::GetSndBufSize (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   685
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   686
  return m_sndBufSize;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   687
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   688
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   689
void
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   690
NscTcpSocketImpl::SetRcvBufSize (uint32_t size)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   691
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   692
  m_rcvBufSize = size;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   693
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   694
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   695
uint32_t
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   696
NscTcpSocketImpl::GetRcvBufSize (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   697
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   698
  return m_rcvBufSize;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   699
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   700
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   701
void
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   702
NscTcpSocketImpl::SetSegSize (uint32_t size)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   703
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   704
  m_segmentSize = size;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   705
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   706
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   707
uint32_t
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   708
NscTcpSocketImpl::GetSegSize (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   709
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   710
  return m_segmentSize;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   711
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   712
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   713
void
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   714
NscTcpSocketImpl::SetAdvWin (uint32_t window)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   715
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   716
  m_advertisedWindowSize = window;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   717
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   718
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   719
uint32_t
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   720
NscTcpSocketImpl::GetAdvWin (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   721
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   722
  return m_advertisedWindowSize;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   723
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   724
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   725
void
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   726
NscTcpSocketImpl::SetSSThresh (uint32_t threshold)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   727
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   728
  m_ssThresh = threshold;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   729
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   730
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   731
uint32_t
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   732
NscTcpSocketImpl::GetSSThresh (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   733
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   734
  return m_ssThresh;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   735
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   736
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   737
void
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   738
NscTcpSocketImpl::SetInitialCwnd (uint32_t cwnd)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   739
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   740
  m_initialCWnd = cwnd;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   741
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   742
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   743
uint32_t
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   744
NscTcpSocketImpl::GetInitialCwnd (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   745
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   746
  return m_initialCWnd;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   747
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   748
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   749
void 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   750
NscTcpSocketImpl::SetConnTimeout (Time timeout)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   751
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   752
  m_cnTimeout = timeout;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   753
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   754
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   755
Time
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   756
NscTcpSocketImpl::GetConnTimeout (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   757
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   758
  return m_cnTimeout;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   759
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   760
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   761
void 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   762
NscTcpSocketImpl::SetConnCount (uint32_t count)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   763
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   764
  m_cnCount = count;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   765
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   766
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   767
uint32_t 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   768
NscTcpSocketImpl::GetConnCount (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   769
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   770
  return m_cnCount;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   771
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   772
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   773
void 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   774
NscTcpSocketImpl::SetDelAckTimeout (Time timeout)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   775
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   776
  m_delAckTimeout = timeout;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   777
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   778
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   779
Time
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   780
NscTcpSocketImpl::GetDelAckTimeout (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   781
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   782
  return m_delAckTimeout;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   783
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   784
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   785
void
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   786
NscTcpSocketImpl::SetDelAckMaxCount (uint32_t count)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   787
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   788
  m_delAckMaxCount = count;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   789
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   790
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   791
uint32_t
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   792
NscTcpSocketImpl::GetDelAckMaxCount (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   793
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   794
  return m_delAckMaxCount;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   795
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   796
6694
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
   797
void 
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
   798
NscTcpSocketImpl::SetPersistTimeout (Time timeout)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
   799
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
   800
  m_persistTimeout = timeout;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
   801
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
   802
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
   803
Time
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
   804
NscTcpSocketImpl::GetPersistTimeout (void) const
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
   805
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
   806
  return m_persistTimeout;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
   807
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents: 6692
diff changeset
   808
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   809
enum Socket::SocketErrno
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   810
NscTcpSocketImpl::GetNativeNs3Errno(int error) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   811
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   812
  enum nsc_errno err;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   813
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   814
  if (error >= 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   815
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   816
       return ERROR_NOTERROR;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   817
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   818
  err = (enum nsc_errno) error;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   819
  switch (err)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   820
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   821
      case NSC_EADDRINUSE: // fallthrough
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   822
      case NSC_EADDRNOTAVAIL: return ERROR_AFNOSUPPORT;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   823
      case NSC_EINPROGRESS: // Altough nsc sockets are nonblocking, we pretend they're not.
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   824
      case NSC_EAGAIN: return ERROR_AGAIN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   825
      case NSC_EISCONN: // fallthrough
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   826
      case NSC_EALREADY: return ERROR_ISCONN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   827
      case NSC_ECONNREFUSED: return ERROR_NOROUTETOHOST; // XXX, better mapping?
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   828
      case NSC_ECONNRESET: // for no, all of these fall through
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   829
      case NSC_EHOSTDOWN:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   830
      case NSC_ENETUNREACH:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   831
      case NSC_EHOSTUNREACH: return ERROR_NOROUTETOHOST;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   832
      case NSC_EMSGSIZE: return ERROR_MSGSIZE;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   833
      case NSC_ENOTCONN: return ERROR_NOTCONN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   834
      case NSC_ESHUTDOWN: return ERROR_SHUTDOWN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   835
      case NSC_ETIMEDOUT: return ERROR_NOTCONN; // XXX - this mapping isn't correct
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   836
      case NSC_ENOTDIR: // used by eg. sysctl(2). Shouldn't happen normally,
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   837
                        // but is triggered by e.g. show_config().
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   838
      case NSC_EUNKNOWN: return ERROR_INVAL; // Catches stacks that 'return -1' without real mapping
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   839
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   840
  NS_ASSERT_MSG(0, "Unknown NSC error");
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   841
  return ERROR_INVAL;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   842
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   843
6448
184a509cc71d Still Bug 943: fix UdpSocketImpl::GetAllowBroadcast, let Socket::SetAllowBroadcast return a bool indicating success/failure, instead of a fatal error.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6442
diff changeset
   844
bool
6437
c11291f51d57 Bug 943 - Add a SO_BROADCAST socket option
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6319
diff changeset
   845
NscTcpSocketImpl::SetAllowBroadcast (bool allowBroadcast)
c11291f51d57 Bug 943 - Add a SO_BROADCAST socket option
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6319
diff changeset
   846
{
c11291f51d57 Bug 943 - Add a SO_BROADCAST socket option
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6319
diff changeset
   847
  if (allowBroadcast)
c11291f51d57 Bug 943 - Add a SO_BROADCAST socket option
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6319
diff changeset
   848
    {
6448
184a509cc71d Still Bug 943: fix UdpSocketImpl::GetAllowBroadcast, let Socket::SetAllowBroadcast return a bool indicating success/failure, instead of a fatal error.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6442
diff changeset
   849
      return false;
6437
c11291f51d57 Bug 943 - Add a SO_BROADCAST socket option
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6319
diff changeset
   850
    }
6448
184a509cc71d Still Bug 943: fix UdpSocketImpl::GetAllowBroadcast, let Socket::SetAllowBroadcast return a bool indicating success/failure, instead of a fatal error.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6442
diff changeset
   851
  return true;
6437
c11291f51d57 Bug 943 - Add a SO_BROADCAST socket option
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6319
diff changeset
   852
}
c11291f51d57 Bug 943 - Add a SO_BROADCAST socket option
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6319
diff changeset
   853
c11291f51d57 Bug 943 - Add a SO_BROADCAST socket option
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6319
diff changeset
   854
bool
c11291f51d57 Bug 943 - Add a SO_BROADCAST socket option
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6319
diff changeset
   855
NscTcpSocketImpl::GetAllowBroadcast () const
c11291f51d57 Bug 943 - Add a SO_BROADCAST socket option
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6319
diff changeset
   856
{
c11291f51d57 Bug 943 - Add a SO_BROADCAST socket option
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6319
diff changeset
   857
  return false;
c11291f51d57 Bug 943 - Add a SO_BROADCAST socket option
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6319
diff changeset
   858
}
c11291f51d57 Bug 943 - Add a SO_BROADCAST socket option
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 6319
diff changeset
   859
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   860
}//namespace ns3