src/internet-stack/nsc-tcp-socket-impl.cc
author Fabian Mauchle <f1mauchl@hsr.ch>
Thu, 04 Feb 2010 14:10:13 -0500
changeset 5971 805783c866fc
parent 5889 526381e48c1d
child 6319 2b1bbc8d0c58
permissions -rw-r--r--
Bug 748 - Cloned TCP socket uses wrong source address
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 "tcp-typedefs.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    32
#include "ns3/simulator.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    33
#include "ns3/packet.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    34
#include "ns3/uinteger.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    35
#include "ns3/trace-source-accessor.h"
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    36
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    37
#include <algorithm>
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    38
3711
fed597b0583e nsc: avoid unecessary use of posix headers
Florian Westphal <fw@strlen.de>
parents: 3635
diff changeset
    39
// for ntohs().
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    40
#include <arpa/inet.h>
3711
fed597b0583e nsc: avoid unecessary use of posix headers
Florian Westphal <fw@strlen.de>
parents: 3635
diff changeset
    41
#include <netinet/in.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_interface.h"
cddd59578812 compile nsc code unconditionally.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3589
diff changeset
    44
#include "sim_errno.h"
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    45
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    46
NS_LOG_COMPONENT_DEFINE ("NscTcpSocketImpl");
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    47
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    48
using namespace std;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    49
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    50
namespace ns3 {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    51
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    52
NS_OBJECT_ENSURE_REGISTERED (NscTcpSocketImpl);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    53
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    54
TypeId
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    55
NscTcpSocketImpl::GetTypeId ()
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    56
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    57
  static TypeId tid = TypeId("ns3::NscTcpSocketImpl")
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    58
    .SetParent<TcpSocket> ()
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    59
    .AddTraceSource ("CongestionWindow",
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    60
                     "The TCP connection's congestion window",
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    61
                     MakeTraceSourceAccessor (&NscTcpSocketImpl::m_cWnd))
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    62
    ;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    63
  return tid;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    64
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    65
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    66
  NscTcpSocketImpl::NscTcpSocketImpl ()
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    67
  : m_endPoint (0),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    68
    m_node (0),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    69
    m_tcp (0),
3778
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
    70
    m_localAddress (Ipv4Address::GetZero ()),
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
    71
    m_localPort (0),
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    72
    m_peerAddress ("0.0.0.0", 0),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    73
    m_errno (ERROR_NOTERROR),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    74
    m_shutdownSend (false),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    75
    m_shutdownRecv (false),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    76
    m_connected (false),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    77
    m_state (CLOSED),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    78
    m_closeOnEmpty (false),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    79
    m_txBufferSize (0),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    80
    m_lastMeasuredRtt (Seconds(0.0))
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    81
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    82
  NS_LOG_FUNCTION (this);
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
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    85
NscTcpSocketImpl::NscTcpSocketImpl(const NscTcpSocketImpl& sock)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    86
  : TcpSocket(sock), //copy the base class callbacks
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    87
    m_delAckMaxCount (sock.m_delAckMaxCount),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    88
    m_delAckTimeout (sock.m_delAckTimeout),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    89
    m_endPoint (0),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    90
    m_node (sock.m_node),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    91
    m_tcp (sock.m_tcp),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    92
    m_remoteAddress (sock.m_remoteAddress),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    93
    m_remotePort (sock.m_remotePort),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    94
    m_localAddress (sock.m_localAddress),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    95
    m_localPort (sock.m_localPort),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    96
    m_peerAddress (sock.m_peerAddress),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    97
    m_errno (sock.m_errno),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    98
    m_shutdownSend (sock.m_shutdownSend),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
    99
    m_shutdownRecv (sock.m_shutdownRecv),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   100
    m_connected (sock.m_connected),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   101
    m_state (sock.m_state),
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   102
    m_closeOnEmpty (sock.m_closeOnEmpty),
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
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   173
Ptr<Node>
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   174
NscTcpSocketImpl::GetNode (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   175
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   176
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   177
  return m_node;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   178
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   179
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   180
void 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   181
NscTcpSocketImpl::Destroy (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   182
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   183
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   184
  m_node = 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   185
  m_endPoint = 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   186
  m_tcp = 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   187
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   188
int
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   189
NscTcpSocketImpl::FinishBind (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   190
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   191
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   192
  if (m_endPoint == 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
      return -1;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   195
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   196
  m_endPoint->SetRxCallback (MakeCallback (&NscTcpSocketImpl::ForwardUp, Ptr<NscTcpSocketImpl>(this)));
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   197
  m_endPoint->SetDestroyCallback (MakeCallback (&NscTcpSocketImpl::Destroy, Ptr<NscTcpSocketImpl>(this)));
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   198
  m_localAddress = m_endPoint->GetLocalAddress ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   199
  m_localPort = m_endPoint->GetLocalPort ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   200
  return 0;
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
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   203
int
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   204
NscTcpSocketImpl::Bind (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   205
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   206
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   207
  m_endPoint = m_tcp->Allocate ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   208
  return FinishBind ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   209
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   210
int 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   211
NscTcpSocketImpl::Bind (const Address &address)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   212
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   213
  NS_LOG_FUNCTION (this<<address);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   214
  if (!InetSocketAddress::IsMatchingType (address))
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
      return ERROR_INVAL;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   217
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   218
  InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   219
  Ipv4Address ipv4 = transport.GetIpv4 ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   220
  uint16_t port = transport.GetPort ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   221
  if (ipv4 == Ipv4Address::GetAny () && port == 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   222
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   223
      m_endPoint = m_tcp->Allocate ();
5888
c9193222c2a4 NSC logging statements
Tom Henderson <tomh@tomh.org>
parents: 5887
diff changeset
   224
      NS_LOG_LOGIC ("NscTcpSocketImpl "<<this<<" got an endpoint: "<<m_endPoint);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   225
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   226
  else if (ipv4 == Ipv4Address::GetAny () && port != 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   227
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   228
      m_endPoint = m_tcp->Allocate (port);
5888
c9193222c2a4 NSC logging statements
Tom Henderson <tomh@tomh.org>
parents: 5887
diff changeset
   229
      NS_LOG_LOGIC ("NscTcpSocketImpl "<<this<<" got an endpoint: "<<m_endPoint);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   230
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   231
  else if (ipv4 != Ipv4Address::GetAny () && port == 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   232
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   233
      m_endPoint = m_tcp->Allocate (ipv4);
5888
c9193222c2a4 NSC logging statements
Tom Henderson <tomh@tomh.org>
parents: 5887
diff changeset
   234
      NS_LOG_LOGIC ("NscTcpSocketImpl "<<this<<" got an endpoint: "<<m_endPoint);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   235
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   236
  else if (ipv4 != Ipv4Address::GetAny () && port != 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   237
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   238
      m_endPoint = m_tcp->Allocate (ipv4, port);
5888
c9193222c2a4 NSC logging statements
Tom Henderson <tomh@tomh.org>
parents: 5887
diff changeset
   239
      NS_LOG_LOGIC ("NscTcpSocketImpl "<<this<<" got an endpoint: "<<m_endPoint);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   240
    }
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
  m_localPort = port;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   243
  return FinishBind ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   244
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   245
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   246
int 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   247
NscTcpSocketImpl::ShutdownSend (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   248
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   249
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   250
  m_shutdownSend = true;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   251
  return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   252
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   253
int 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   254
NscTcpSocketImpl::ShutdownRecv (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   255
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   256
  NS_LOG_FUNCTION_NOARGS ();
4491
893d48fcf7f3 bug 535: UDP/TCP ShutdownRecv incorrect
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3869
diff changeset
   257
  m_shutdownRecv = true;
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   258
  return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   259
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   260
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   261
int
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   262
NscTcpSocketImpl::Close (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   263
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   264
  NS_LOG_FUNCTION (this << m_state);
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
  if (m_state == CLOSED)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   267
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   268
      return -1;
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
  if (!m_txBuffer.empty ())
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   271
    { // App close with pending data must wait until all data transmitted
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   272
      m_closeOnEmpty = true;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   273
      NS_LOG_LOGIC("Socket " << this << 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   274
                   " deferring close, state " << m_state);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   275
      return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   276
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   277
5888
c9193222c2a4 NSC logging statements
Tom Henderson <tomh@tomh.org>
parents: 5887
diff changeset
   278
  NS_LOG_LOGIC("NscTcp socket " << this << " calling disconnect(); moving to CLOSED");
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   279
  m_nscTcpSocket->disconnect();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   280
  m_state = CLOSED;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   281
  ShutdownSend ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   282
  return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   283
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   284
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   285
int
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   286
NscTcpSocketImpl::Connect (const Address & address)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   287
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   288
  NS_LOG_FUNCTION (this << address);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   289
  if (m_endPoint == 0)
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
      if (Bind () == -1)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   292
        {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   293
          NS_ASSERT (m_endPoint == 0);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   294
          return -1;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   295
        }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   296
      NS_ASSERT (m_endPoint != 0);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   297
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   298
  InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   299
  m_remoteAddress = transport.GetIpv4 ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   300
  m_remotePort = transport.GetPort ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   301
3711
fed597b0583e nsc: avoid unecessary use of posix headers
Florian Westphal <fw@strlen.de>
parents: 3635
diff changeset
   302
  std::ostringstream ss;
fed597b0583e nsc: avoid unecessary use of posix headers
Florian Westphal <fw@strlen.de>
parents: 3635
diff changeset
   303
  m_remoteAddress.Print(ss);
fed597b0583e nsc: avoid unecessary use of posix headers
Florian Westphal <fw@strlen.de>
parents: 3635
diff changeset
   304
  std::string ipstring = ss.str ();
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   305
3711
fed597b0583e nsc: avoid unecessary use of posix headers
Florian Westphal <fw@strlen.de>
parents: 3635
diff changeset
   306
  m_nscTcpSocket->connect(ipstring.c_str (), m_remotePort);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   307
  m_state = SYN_SENT;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   308
  return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   309
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   310
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   311
int
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   312
NscTcpSocketImpl::Send (const Ptr<Packet> p, uint32_t flags)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   313
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   314
  NS_LOG_FUNCTION (this << p);
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
  NS_ASSERT (p->GetSize () > 0);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   317
  if (m_state == ESTABLISHED || m_state == SYN_SENT || m_state == CLOSE_WAIT)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   318
  {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   319
    if (p->GetSize () > GetTxAvailable ())
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   320
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   321
      m_errno = ERROR_MSGSIZE;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   322
      return -1;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   323
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   324
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
   325
    uint32_t sent = p->GetSize ();
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   326
    if (m_state == ESTABLISHED)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   327
      {
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
   328
        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
   329
        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
   330
        SendPendingData();
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   331
      }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   332
      else
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   333
      {  // SYN_SET -- Queue Data
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   334
         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
   335
         m_txBufferSize += sent;
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   336
      }
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
   337
    return sent;
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   338
  }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   339
  else
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   340
  {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   341
    m_errno = ERROR_NOTCONN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   342
    return -1;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   343
  }
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
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   346
int
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   347
NscTcpSocketImpl::SendTo (Ptr<Packet> p, uint32_t flags, const Address &address)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   348
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   349
  NS_LOG_FUNCTION (this << address << p);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   350
  if (!m_connected)
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
      m_errno = ERROR_NOTCONN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   353
      return -1;
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
  else
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   356
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   357
      return Send (p, flags); //drop the address according to BSD manpages
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   358
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   359
}
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
uint32_t
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   362
NscTcpSocketImpl::GetTxAvailable (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   363
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   364
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   365
  if (m_txBufferSize != 0)
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
      NS_ASSERT (m_txBufferSize <= m_sndBufSize);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   368
      return m_sndBufSize - m_txBufferSize;
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
  else
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   371
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   372
      return m_sndBufSize;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   373
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   374
}
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
int
3772
f0d8608ab155 Remove queue limit from listen
Craig Dowell <craigdo@ee.washington.edu>
parents: 3711
diff changeset
   377
NscTcpSocketImpl::Listen (void)
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   378
{
3772
f0d8608ab155 Remove queue limit from listen
Craig Dowell <craigdo@ee.washington.edu>
parents: 3711
diff changeset
   379
  NS_LOG_FUNCTION (this);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   380
  m_nscTcpSocket->listen(m_localPort);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   381
  m_state = LISTEN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   382
  return 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   383
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   384
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   385
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   386
void
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   387
NscTcpSocketImpl::NSCWakeup ()
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   388
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   389
  switch (m_state) {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   390
  case SYN_SENT:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   391
      if (!m_nscTcpSocket->is_connected())
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   392
          break;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   393
      m_state = ESTABLISHED;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   394
      Simulator::ScheduleNow(&NscTcpSocketImpl::ConnectionSucceeded, this);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   395
      // fall through to schedule read/write events
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   396
  case ESTABLISHED:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   397
      if (!m_txBuffer.empty ())
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   398
          Simulator::ScheduleNow(&NscTcpSocketImpl::SendPendingData, this);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   399
      Simulator::ScheduleNow(&NscTcpSocketImpl::ReadPendingData, this);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   400
      break;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   401
  case LISTEN:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   402
      Simulator::ScheduleNow(&NscTcpSocketImpl::Accept, this);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   403
      break;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   404
  case CLOSED: break;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   405
  default:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   406
      NS_LOG_DEBUG (this << " invalid state: " << m_state);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   407
  }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   408
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   409
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   410
Ptr<Packet>
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   411
NscTcpSocketImpl::Recv (uint32_t maxSize, uint32_t flags)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   412
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   413
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   414
  if (m_deliveryQueue.empty() )
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   415
    {
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
   416
      m_errno = ERROR_AGAIN;
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   417
      return 0;
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
  Ptr<Packet> p = m_deliveryQueue.front ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   420
  if (p->GetSize () <= maxSize)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   421
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   422
      m_deliveryQueue.pop ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   423
      m_rxAvailable -= p->GetSize ();
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
  else
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   426
    {
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
   427
      m_errno = ERROR_AGAIN;
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   428
      p = 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   429
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   430
  return p;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   431
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   432
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   433
Ptr<Packet>
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   434
NscTcpSocketImpl::RecvFrom (uint32_t maxSize, uint32_t flags,
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   435
  Address &fromAddress)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   436
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   437
  NS_LOG_FUNCTION (this << maxSize << flags);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   438
  Ptr<Packet> packet = Recv (maxSize, flags);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   439
  if (packet != 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   440
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   441
      SocketAddressTag tag;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   442
      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
   443
      found = packet->PeekPacketTag (tag);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   444
      NS_ASSERT (found);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   445
      fromAddress = tag.GetAddress ();
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
  return packet;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   448
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   449
3778
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   450
int
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   451
NscTcpSocketImpl::GetSockName (Address &address) const
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   452
{
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   453
  NS_LOG_FUNCTION_NOARGS ();
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   454
  address = InetSocketAddress(m_localAddress, m_localPort);
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   455
  return 0;
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   456
}
78c4c41557f3 Liu's GetSockName patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3772
diff changeset
   457
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   458
uint32_t
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   459
NscTcpSocketImpl::GetRxAvailable (void) const
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   460
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   461
  NS_LOG_FUNCTION_NOARGS ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   462
  // We separately maintain this state to avoid walking the queue 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   463
  // every time this might be called
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   464
  return m_rxAvailable;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   465
}
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
void
5971
805783c866fc Bug 748 - Cloned TCP socket uses wrong source address
Fabian Mauchle <f1mauchl@hsr.ch>
parents: 5889
diff changeset
   468
NscTcpSocketImpl::ForwardUp (Ptr<Packet> packet, Ipv4Address saddr, Ipv4Address daddr, uint16_t port)
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   469
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   470
  NSCWakeup();
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 NscTcpSocketImpl::CompleteFork(void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   474
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   475
  // The address pairs (m_localAddress, m_localPort, m_remoteAddress, m_remotePort)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   476
  // are bogus, but this isn't important at the moment, because
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   477
  // address <-> Socket handling is done by NSC internally.
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   478
  // 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
   479
  // 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
   480
  struct sockaddr_in sin;
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   481
  size_t sin_len = sizeof(sin);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   482
3869
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   483
  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
   484
    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
   485
    m_remoteAddress = m_remoteAddress.Deserialize((const uint8_t*) &sin.sin_addr);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   486
    m_peerAddress = InetSocketAddress(m_remoteAddress, m_remotePort);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   487
  }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   488
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   489
  m_endPoint = m_tcp->Allocate ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   490
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   491
  //the cloned socket with be in listen state, so manually change state
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   492
  NS_ASSERT(m_state == LISTEN);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   493
  m_state = ESTABLISHED;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   494
3869
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   495
  sin_len = sizeof(sin);
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   496
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   497
  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
   498
    m_localAddress = m_localAddress.Deserialize((const uint8_t*) &sin.sin_addr);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   499
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   500
  NS_LOG_LOGIC ("NscTcpSocketImpl " << this << " accepted connection from " 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   501
                 << m_remoteAddress << ":" << m_remotePort
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   502
                 << " to " << m_localAddress << ":" << m_localPort);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   503
  //equivalent to FinishBind
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   504
  m_endPoint->SetRxCallback (MakeCallback (&NscTcpSocketImpl::ForwardUp, Ptr<NscTcpSocketImpl>(this)));
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   505
  m_endPoint->SetDestroyCallback (MakeCallback (&NscTcpSocketImpl::Destroy, Ptr<NscTcpSocketImpl>(this)));
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
  NotifyNewConnectionCreated (this, m_peerAddress);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   508
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   509
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   510
void NscTcpSocketImpl::ConnectionSucceeded()
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   511
{ // We would preferred to have scheduled an event directly to
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   512
  // NotifyConnectionSucceeded, but (sigh) these are protected
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   513
  // 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
   514
  struct sockaddr_in sin;
0edba1e055aa nsc-tcp-socket-impl: use new nsc getsockname/getpeername interface.
Florian Westphal <fw@strlen.de>
parents: 3780
diff changeset
   515
  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
   516
  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
   517
    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
   518
    m_localPort = ntohs(sin.sin_port);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   519
  }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   520
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   521
  NS_LOG_LOGIC ("NscTcpSocketImpl " << this << " connected to "
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   522
                 << m_remoteAddress << ":" << m_remotePort
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   523
                 << " from " << m_localAddress << ":" << m_localPort);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   524
  NotifyConnectionSucceeded();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   525
}
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
bool NscTcpSocketImpl::Accept (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   529
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   530
  if (m_state == CLOSED)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   531
    {  // Happens if application closes listening socket after Accept() was scheduled.
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   532
      return false;
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
  NS_ASSERT (m_state == LISTEN);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   535
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   536
  if (!m_nscTcpSocket->is_listening())
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   537
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   538
      return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   539
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   540
  INetStreamSocket *newsock;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   541
  int res = m_nscTcpSocket->accept(&newsock);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   542
  if (res != 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   543
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   544
      return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   545
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   546
// We could obtain a fromAddress using getpeername, but we've already
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   547
// finished the tcp handshake here, i.e. this is a new connection
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   548
// and not a connection request.
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   549
// if (!NotifyConnectionRequest(fromAddress))
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   550
//   return true;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   551
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   552
  // Clone the socket
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   553
  Ptr<NscTcpSocketImpl> newSock = Copy ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   554
  newSock->m_nscTcpSocket = newsock;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   555
  NS_LOG_LOGIC ("Cloned a NscTcpSocketImpl " << newSock);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   556
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   557
  Simulator::ScheduleNow (&NscTcpSocketImpl::CompleteFork, newSock);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   558
  return true;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   559
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   560
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   561
bool NscTcpSocketImpl::ReadPendingData (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   562
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   563
  if (m_state != ESTABLISHED)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   564
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   565
      return false;
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
  int len, err;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   568
  uint8_t buffer[8192];
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   569
  len = sizeof(buffer);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   570
  m_errno = ERROR_NOTERROR;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   571
  err = m_nscTcpSocket->read_data(buffer, &len);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   572
  if (err == 0 && len == 0)
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
      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
   575
      m_state = CLOSE_WAIT;
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   576
      return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   577
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   578
  m_errno = GetNativeNs3Errno(err);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   579
  switch (m_errno)
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
      case ERROR_NOTERROR: break; // some data was sent
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   582
      case ERROR_AGAIN: return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   583
      default:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   584
        NS_LOG_WARN ("Error (" << err << ") " <<
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   585
                     "during read_data, ns-3 errno set to" << m_errno);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   586
        m_state = CLOSED;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   587
        return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   588
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   589
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   590
  Ptr<Packet> p =  Create<Packet> (buffer, len);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   591
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   592
  SocketAddressTag tag;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   593
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   594
  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
   595
  p->AddPacketTag (tag);
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   596
  m_deliveryQueue.push (p);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   597
  m_rxAvailable += p->GetSize ();
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
  NotifyDataRecv ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   600
  return true;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   601
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   602
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   603
bool NscTcpSocketImpl::SendPendingData (void)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   604
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   605
  NS_LOG_FUNCTION (this);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   606
  NS_LOG_LOGIC ("ENTERING SendPendingData");
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   607
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   608
  if (m_txBuffer.empty ())
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
      return false;
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
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   613
  int ret;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   614
  size_t size, written = 0;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   615
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   616
  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
   617
    NS_ASSERT (!m_txBuffer.empty ());
3578
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   618
    Ptr<Packet> &p = m_txBuffer.front ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   619
    size = p->GetSize ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   620
    NS_ASSERT (size > 0);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   621
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   622
    m_errno = ERROR_NOTERROR;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   623
    ret = m_nscTcpSocket->send_data((const char *)p->PeekData (), size);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   624
    if (ret <= 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   625
      {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   626
        break;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   627
      }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   628
    written += ret;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   629
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   630
    NS_ASSERT (m_txBufferSize >= (size_t)ret);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   631
    m_txBufferSize -= ret;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   632
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   633
    if ((size_t)ret < size)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   634
      {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   635
        p->RemoveAtStart(ret);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   636
        break;
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
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   639
    m_txBuffer.pop ();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   640
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   641
    if (m_txBuffer.empty ())
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   642
      {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   643
        if (m_closeOnEmpty)
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
            m_nscTcpSocket->disconnect();
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   646
            m_state = CLOSED;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   647
          }
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
  } while ((size_t) ret == size);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   651
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   652
  if (written > 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   653
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   654
      Simulator::ScheduleNow(&NscTcpSocketImpl::NotifyDataSent, this, ret);
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   655
      return true;
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
  return false;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   658
}
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
Ptr<NscTcpSocketImpl> NscTcpSocketImpl::Copy ()
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
  return CopyObject<NscTcpSocketImpl> (this);
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
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   665
void
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   666
NscTcpSocketImpl::SetSndBufSize (uint32_t size)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   667
{
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   668
  m_sndBufSize = size;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   669
}
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
uint32_t
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   672
NscTcpSocketImpl::GetSndBufSize (void) const
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 m_sndBufSize;
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::SetRcvBufSize (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_rcvBufSize = 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::GetRcvBufSize (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_rcvBufSize;
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::SetSegSize (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_segmentSize = 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::GetSegSize (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_segmentSize;
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::SetAdvWin (uint32_t window)
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_advertisedWindowSize = window;
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::GetAdvWin (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_advertisedWindowSize;
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::SetSSThresh (uint32_t threshold)
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_ssThresh = threshold;
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::GetSSThresh (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_ssThresh;
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::SetInitialCwnd (uint32_t cwnd)
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_initialCWnd = cwnd;
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::GetInitialCwnd (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_initialCWnd;
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::SetConnTimeout (Time timeout)
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_cnTimeout = timeout;
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
Time
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   744
NscTcpSocketImpl::GetConnTimeout (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_cnTimeout;
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::SetConnCount (uint32_t count)
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_cnCount = count;
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
uint32_t 
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   756
NscTcpSocketImpl::GetConnCount (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_cnCount;
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::SetDelAckTimeout (Time timeout)
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_delAckTimeout = timeout;
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
Time
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   768
NscTcpSocketImpl::GetDelAckTimeout (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_delAckTimeout;
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::SetDelAckMaxCount (uint32_t count)
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_delAckMaxCount = count;
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
uint32_t
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   780
NscTcpSocketImpl::GetDelAckMaxCount (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_delAckMaxCount;
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
enum Socket::SocketErrno
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   786
NscTcpSocketImpl::GetNativeNs3Errno(int error) const
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
  enum nsc_errno err;
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
  if (error >= 0)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   791
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   792
       return ERROR_NOTERROR;
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
  err = (enum nsc_errno) error;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   795
  switch (err)
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   796
    {
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   797
      case NSC_EADDRINUSE: // fallthrough
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   798
      case NSC_EADDRNOTAVAIL: return ERROR_AFNOSUPPORT;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   799
      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
   800
      case NSC_EAGAIN: return ERROR_AGAIN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   801
      case NSC_EISCONN: // fallthrough
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   802
      case NSC_EALREADY: return ERROR_ISCONN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   803
      case NSC_ECONNREFUSED: return ERROR_NOROUTETOHOST; // XXX, better mapping?
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   804
      case NSC_ECONNRESET: // for no, all of these fall through
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   805
      case NSC_EHOSTDOWN:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   806
      case NSC_ENETUNREACH:
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   807
      case NSC_EHOSTUNREACH: return ERROR_NOROUTETOHOST;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   808
      case NSC_EMSGSIZE: return ERROR_MSGSIZE;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   809
      case NSC_ENOTCONN: return ERROR_NOTCONN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   810
      case NSC_ESHUTDOWN: return ERROR_SHUTDOWN;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   811
      case NSC_ETIMEDOUT: return ERROR_NOTCONN; // XXX - this mapping isn't correct
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   812
      case NSC_ENOTDIR: // used by eg. sysctl(2). Shouldn't happen normally,
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   813
                        // but is triggered by e.g. show_config().
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   814
      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
   815
    }
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   816
  NS_ASSERT_MSG(0, "Unknown NSC error");
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   817
  return ERROR_INVAL;
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   818
}
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   819
e6374560e19e nsc: core files.
Florian Westphal <fw@strlen.de>
parents:
diff changeset
   820
}//namespace ns3