src/node/packet-socket.cc
author tjkopena@cs.drexel.edu
Fri, 29 Aug 2008 13:22:09 -0400
changeset 3570 44b0bc6817c6
parent 3548 e5ab96db540e
child 3568 01bebf28addd
permissions -rw-r--r--
Stats module and example merged in.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2007 Emmanuelle Laprise, INRIA
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 *
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 *
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 *
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 *
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 * Authors: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 *          Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
 */
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
#include "packet-socket.h"
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
#include "packet-socket-address.h"
1505
286ec92f4113 debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1308
diff changeset
    24
#include "ns3/log.h"
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
#include "ns3/node.h"
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1505
diff changeset
    26
#include "ns3/packet.h"
3117
c8160bbb2085 Add SocketDefaults to store socket option attributes
Tom Henderson <tomh@tomh.org>
parents: 3112
diff changeset
    27
#include "ns3/uinteger.h"
3112
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    28
#include "ns3/trace-source-accessor.h"
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
3219
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
    30
#include <algorithm>
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
    31
1505
286ec92f4113 debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1308
diff changeset
    32
NS_LOG_COMPONENT_DEFINE ("PacketSocket");
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    34
namespace ns3 {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    35
3112
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    36
TypeId
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    37
PacketSocket::GetTypeId (void)
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    38
{
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    39
  static TypeId tid = TypeId ("ns3::PacketSocket")
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    40
    .SetParent<Socket> ()
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    41
    .AddConstructor<PacketSocket> ()
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    42
    .AddTraceSource ("Drop", "Drop packet due to receive buffer overflow",
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    43
                     MakeTraceSourceAccessor (&PacketSocket::m_dropTrace))
3123
fae57a467d54 undo SocketDefaults class; plumb in new UdpSocket option attributes
Tom Henderson <tomh@tomh.org>
parents: 3122
diff changeset
    44
    .AddAttribute ("RcvBufSize",
fae57a467d54 undo SocketDefaults class; plumb in new UdpSocket option attributes
Tom Henderson <tomh@tomh.org>
parents: 3122
diff changeset
    45
                   "PacketSocket maximum receive buffer size (bytes)",
fae57a467d54 undo SocketDefaults class; plumb in new UdpSocket option attributes
Tom Henderson <tomh@tomh.org>
parents: 3122
diff changeset
    46
                   UintegerValue (0xffffffffl),
fae57a467d54 undo SocketDefaults class; plumb in new UdpSocket option attributes
Tom Henderson <tomh@tomh.org>
parents: 3122
diff changeset
    47
                   MakeUintegerAccessor (&PacketSocket::m_rcvBufSize),
fae57a467d54 undo SocketDefaults class; plumb in new UdpSocket option attributes
Tom Henderson <tomh@tomh.org>
parents: 3122
diff changeset
    48
                   MakeUintegerChecker<uint32_t> ())
3112
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    49
    ;
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    50
  return tid;
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    51
}
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    52
3104
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3098
diff changeset
    53
PacketSocket::PacketSocket () : m_rxAvailable (0)
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    54
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
    55
  NS_LOG_FUNCTION_NOARGS ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    56
  m_state = STATE_OPEN;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    57
  m_shutdownSend = false;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
  m_shutdownRecv = false;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
  m_errno = ERROR_NOTERROR;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    60
}
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1870
diff changeset
    62
void 
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1870
diff changeset
    63
PacketSocket::SetNode (Ptr<Node> node)
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1870
diff changeset
    64
{
3112
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    65
  NS_LOG_FUNCTION_NOARGS ();
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1870
diff changeset
    66
  m_node = node;
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1870
diff changeset
    67
}
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1870
diff changeset
    68
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    69
PacketSocket::~PacketSocket ()
1505
286ec92f4113 debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1308
diff changeset
    70
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
    71
  NS_LOG_FUNCTION_NOARGS ();
1505
286ec92f4113 debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1308
diff changeset
    72
}
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    73
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    74
void 
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
PacketSocket::DoDispose (void)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    76
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
    77
  NS_LOG_FUNCTION_NOARGS ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
  m_device = 0;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
}
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
1264
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1195
diff changeset
    81
enum Socket::SocketErrno
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1195
diff changeset
    82
PacketSocket::GetErrno (void) const
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1195
diff changeset
    83
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
    84
  NS_LOG_FUNCTION_NOARGS ();
1264
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1195
diff changeset
    85
  return m_errno;
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1195
diff changeset
    86
}
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1195
diff changeset
    87
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
Ptr<Node>
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    89
PacketSocket::GetNode (void) const
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
    91
  NS_LOG_FUNCTION_NOARGS ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    92
  return m_node;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    93
}
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    94
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    95
int
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    96
PacketSocket::Bind (void)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    97
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
    98
  NS_LOG_FUNCTION_NOARGS ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    99
  PacketSocketAddress address;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   100
  address.SetProtocol (0);
1195
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   101
  address.SetAllDevices ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   102
  return DoBind (address);
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   103
}
1505
286ec92f4113 debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1308
diff changeset
   104
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   105
int
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
PacketSocket::Bind (const Address &address)
1505
286ec92f4113 debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1308
diff changeset
   107
{ 
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
   108
  NS_LOG_FUNCTION_NOARGS ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
  if (!PacketSocketAddress::IsMatchingType (address))
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   110
    {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   111
      m_errno = ERROR_INVAL;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
      return -1;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   113
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   114
  PacketSocketAddress ad = PacketSocketAddress::ConvertFrom (address);
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   115
  return DoBind (ad);
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   116
}
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   117
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   118
int
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   119
PacketSocket::DoBind (const PacketSocketAddress &address)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   120
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
   121
  NS_LOG_FUNCTION_NOARGS ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   122
  if (m_state == STATE_BOUND ||
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   123
      m_state == STATE_CONNECTED)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   124
    {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   125
      m_errno = ERROR_INVAL;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   126
      return -1;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   127
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   128
  if (m_state == STATE_CLOSED)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   129
    {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   130
      m_errno = ERROR_BADF;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   131
      return -1;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
    }
1195
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   133
  Ptr<NetDevice> dev ;
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   134
  if (address.IsSingleDevice ())
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   135
    {
3018
0ac9b895494d PacketSocket bind-to-interface bug
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2983
diff changeset
   136
      dev = m_node->GetDevice (address.GetSingleDevice ());
1195
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   137
    }
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   138
  else
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   139
    {
3018
0ac9b895494d PacketSocket bind-to-interface bug
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2983
diff changeset
   140
      dev = 0;
1195
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   141
    }
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   142
  m_node->RegisterProtocolHandler (MakeCallback (&PacketSocket::ForwardUp, this),
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   143
                                   address.GetProtocol (), dev);
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   144
  m_state = STATE_BOUND;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   145
  m_protocol = address.GetProtocol ();
1195
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   146
  m_isSingleDevice = address.IsSingleDevice ();
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   147
  m_device = address.GetSingleDevice ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   148
  return 0;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   149
}
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   151
int
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   152
PacketSocket::ShutdownSend (void)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   153
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
   154
  NS_LOG_FUNCTION_NOARGS ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   155
  if (m_state == STATE_CLOSED)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   156
    {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   157
      m_errno = ERROR_BADF;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   158
      return -1;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   159
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   160
  m_shutdownSend = true;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   161
  return 0;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   162
}
1505
286ec92f4113 debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1308
diff changeset
   163
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   164
int
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   165
PacketSocket::ShutdownRecv (void)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   166
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
   167
  NS_LOG_FUNCTION_NOARGS ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   168
  if (m_state == STATE_CLOSED)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   169
    {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   170
      m_errno = ERROR_BADF;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   171
      return -1;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   172
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   173
  m_shutdownRecv = false;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   174
  return 0;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   175
}
1505
286ec92f4113 debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1308
diff changeset
   176
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   177
int
1264
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1195
diff changeset
   178
PacketSocket::Close(void)
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   179
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
   180
  NS_LOG_FUNCTION_NOARGS ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   181
  if (m_state == STATE_CLOSED)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   182
    {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   183
      m_errno = ERROR_BADF;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   184
      return -1;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   185
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   186
  m_state = STATE_CLOSED;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
  return 0;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   188
}
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   189
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   190
int
1264
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1195
diff changeset
   191
PacketSocket::Connect(const Address &ad)
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   192
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
   193
  NS_LOG_FUNCTION_NOARGS ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   194
  PacketSocketAddress address;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   195
  if (m_state == STATE_CLOSED)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   196
    {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   197
      m_errno = ERROR_BADF;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   198
      goto error;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   199
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   200
  if (m_state == STATE_OPEN)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   201
    {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   202
      // connect should happen _after_ bind.
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
      m_errno = ERROR_INVAL; // generic error condition.
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   204
      goto error;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   205
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   206
  if (m_state == STATE_CONNECTED)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   207
    {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   208
      m_errno = ERROR_ISCONN;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   209
      goto error;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   210
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   211
  if (!PacketSocketAddress::IsMatchingType (ad))
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   212
    {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   213
      m_errno = ERROR_AFNOSUPPORT;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   214
      goto error;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   215
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   216
  m_destAddr = ad;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   217
  m_state = STATE_CONNECTED;
1264
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1195
diff changeset
   218
  NotifyConnectionSucceeded ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   219
  return 0;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   220
 error:
1264
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1195
diff changeset
   221
  NotifyConnectionFailed ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   222
  return -1;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   223
}
3213
08a0424399fb bug 203: Listen must be implemented for Udp and Packet sockets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3123
diff changeset
   224
int 
08a0424399fb bug 203: Listen must be implemented for Udp and Packet sockets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3123
diff changeset
   225
PacketSocket::Listen(uint32_t queueLimit)
08a0424399fb bug 203: Listen must be implemented for Udp and Packet sockets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3123
diff changeset
   226
{
08a0424399fb bug 203: Listen must be implemented for Udp and Packet sockets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3123
diff changeset
   227
  m_errno = Socket::ERROR_OPNOTSUPP;
08a0424399fb bug 203: Listen must be implemented for Udp and Packet sockets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3123
diff changeset
   228
  return -1;
08a0424399fb bug 203: Listen must be implemented for Udp and Packet sockets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3123
diff changeset
   229
}
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   230
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   231
int
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   232
PacketSocket::Send (Ptr<Packet> p, uint32_t flags)
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   233
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
   234
  NS_LOG_FUNCTION_NOARGS ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   235
  if (m_state == STATE_OPEN ||
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   236
      m_state == STATE_BOUND)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   237
    {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   238
      m_errno = ERROR_NOTCONN;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   239
      return -1;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   240
    }
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   241
  return SendTo (p, flags, m_destAddr);
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   242
}
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   243
3219
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   244
uint32_t
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   245
PacketSocket::GetMinMtu (PacketSocketAddress ad) const
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   246
{
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   247
  if (ad.IsSingleDevice ())
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   248
    {
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   249
      Ptr<NetDevice> device = m_node->GetDevice (ad.GetSingleDevice ());
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   250
      return device->GetMtu ();
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   251
    }
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   252
  else
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   253
    {
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   254
      uint32_t minMtu = 0xffff;
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   255
      for (uint32_t i = 0; i < m_node->GetNDevices (); i++)
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   256
        {
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   257
          Ptr<NetDevice> device = m_node->GetDevice (i);
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   258
          minMtu = std::min (minMtu, (uint32_t)device->GetMtu ());
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   259
        }
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   260
      return minMtu;
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   261
    }
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   262
}
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   263
3105
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   264
uint32_t 
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   265
PacketSocket::GetTxAvailable (void) const
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   266
{
3219
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   267
  if (m_state == STATE_CONNECTED)
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   268
    {
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   269
      PacketSocketAddress ad = PacketSocketAddress::ConvertFrom (m_destAddr);      
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   270
      return GetMinMtu (ad);
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   271
    }
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   272
  // If we are not connected, we return a 'safe' value by default.
3122
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3121
diff changeset
   273
  return 0xffff;
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   274
}
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   275
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   276
int
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   277
PacketSocket::SendTo (Ptr<Packet> p, uint32_t flags, const Address &address)
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   278
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
   279
  NS_LOG_FUNCTION_NOARGS ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   280
  PacketSocketAddress ad;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   281
  if (m_state == STATE_CLOSED)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   282
    {
1832
80654949d03b Add a few NS_LOG_LOGIC calls in PacketSocket::SendTo ()
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1505
diff changeset
   283
      NS_LOG_LOGIC ("ERROR_BADF");
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   284
      m_errno = ERROR_BADF;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   285
      return -1;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   286
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   287
  if (m_shutdownSend)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   288
    {
1832
80654949d03b Add a few NS_LOG_LOGIC calls in PacketSocket::SendTo ()
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1505
diff changeset
   289
      NS_LOG_LOGIC ("ERROR_SHUTDOWN");
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   290
      m_errno = ERROR_SHUTDOWN;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   291
      return -1;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   292
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   293
  if (!PacketSocketAddress::IsMatchingType (address))
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   294
    {
1832
80654949d03b Add a few NS_LOG_LOGIC calls in PacketSocket::SendTo ()
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1505
diff changeset
   295
      NS_LOG_LOGIC ("ERROR_AFNOSUPPORT");
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   296
      m_errno = ERROR_AFNOSUPPORT;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   297
      return -1;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   298
    }
3219
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   299
  ad = PacketSocketAddress::ConvertFrom (address);
49dcb3f0bd34 bug 210: must take device mtu into account.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3218
diff changeset
   300
  if (p->GetSize () > GetMinMtu (ad))
3122
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3121
diff changeset
   301
    {
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3121
diff changeset
   302
      m_errno = ERROR_MSGSIZE;
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3121
diff changeset
   303
      return -1;
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3121
diff changeset
   304
    }
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   305
  
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   306
  bool error = false;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   307
  Address dest = ad.GetPhysicalAddress ();
1195
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   308
  if (ad.IsSingleDevice ())
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   309
    {
1195
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   310
      Ptr<NetDevice> device = m_node->GetDevice (ad.GetSingleDevice ());
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   311
      if (!device->Send (p, dest, ad.GetProtocol ()))
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   312
        {
1832
80654949d03b Add a few NS_LOG_LOGIC calls in PacketSocket::SendTo ()
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1505
diff changeset
   313
          NS_LOG_LOGIC ("error: NetDevice::Send error");
1195
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   314
          error = true;
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   315
        }
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   316
    }
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   317
  else
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   318
    {
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   319
      for (uint32_t i = 0; i < m_node->GetNDevices (); i++)
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   320
        {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   321
          Ptr<NetDevice> device = m_node->GetDevice (i);
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   322
          if (!device->Send (p, dest, ad.GetProtocol ()))
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   323
            {
1832
80654949d03b Add a few NS_LOG_LOGIC calls in PacketSocket::SendTo ()
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1505
diff changeset
   324
              NS_LOG_LOGIC ("error: NetDevice::Send error");
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   325
              error = true;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   326
            }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   327
        }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   328
    }
1264
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1195
diff changeset
   329
  if (!error)
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   330
    {
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1505
diff changeset
   331
      NotifyDataSent (p->GetSize ());
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   332
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   333
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   334
  if (error)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   335
    {
1832
80654949d03b Add a few NS_LOG_LOGIC calls in PacketSocket::SendTo ()
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1505
diff changeset
   336
      NS_LOG_LOGIC ("ERROR_INVAL 2");
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   337
      m_errno = ERROR_INVAL;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   338
      return -1;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   339
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   340
  else
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   341
    {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   342
      return 0;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   343
    }
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   344
}
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   345
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   346
void 
3548
e5ab96db540e bug 273: constify packet pointers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3448
diff changeset
   347
PacketSocket::ForwardUp (Ptr<NetDevice> device, Ptr<const Packet> packet, 
3448
0bd851bb1225 Simplify promiscuous mode API: NetDevices always operate in promiscuous mode, normal receive callbacks receive extra destination address and packet type.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3276
diff changeset
   348
                         uint16_t protocol, const Address &from,
0bd851bb1225 Simplify promiscuous mode API: NetDevices always operate in promiscuous mode, normal receive callbacks receive extra destination address and packet type.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3276
diff changeset
   349
                         const Address &to, NetDevice::PacketType packetType)
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   350
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2783
diff changeset
   351
  NS_LOG_FUNCTION_NOARGS ();
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   352
  if (m_shutdownRecv)
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   353
    {
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   354
      return;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   355
    }
3448
0bd851bb1225 Simplify promiscuous mode API: NetDevices always operate in promiscuous mode, normal receive callbacks receive extra destination address and packet type.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3276
diff changeset
   356
  if (packetType != NetDevice::PACKET_HOST)
0bd851bb1225 Simplify promiscuous mode API: NetDevices always operate in promiscuous mode, normal receive callbacks receive extra destination address and packet type.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3276
diff changeset
   357
    {
0bd851bb1225 Simplify promiscuous mode API: NetDevices always operate in promiscuous mode, normal receive callbacks receive extra destination address and packet type.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3276
diff changeset
   358
      return;
0bd851bb1225 Simplify promiscuous mode API: NetDevices always operate in promiscuous mode, normal receive callbacks receive extra destination address and packet type.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3276
diff changeset
   359
    }
0bd851bb1225 Simplify promiscuous mode API: NetDevices always operate in promiscuous mode, normal receive callbacks receive extra destination address and packet type.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3276
diff changeset
   360
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   361
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   362
  PacketSocketAddress address;
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   363
  address.SetPhysicalAddress (from);
1195
53f1175dbe94 fix tracing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1188
diff changeset
   364
  address.SetSingleDevice (device->GetIfIndex ());
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   365
  address.SetProtocol (protocol);
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   366
3123
fae57a467d54 undo SocketDefaults class; plumb in new UdpSocket option attributes
Tom Henderson <tomh@tomh.org>
parents: 3122
diff changeset
   367
  if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
3112
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   368
    {
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   369
      SocketAddressTag tag;
3112
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   370
      tag.SetAddress (address);
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   371
      packet->AddTag (tag);
3548
e5ab96db540e bug 273: constify packet pointers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3448
diff changeset
   372
      m_deliveryQueue.push (packet->Copy ());
3112
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   373
      m_rxAvailable += packet->GetSize ();
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   374
      NS_LOG_LOGIC ("UID is " << packet->GetUid() << " PacketSocket " << this);
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   375
      NotifyDataRecv ();
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   376
    }
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   377
  else
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   378
    {
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   379
      // In general, this case should not occur unless the
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   380
      // receiving application reads data from this socket slowly
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   381
      // in comparison to the arrival rate
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   382
      //
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   383
      // drop and trace packet
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   384
      NS_LOG_WARN ("No receive buffer space available.  Drop.");
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   385
      m_dropTrace (packet);
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   386
    }
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   387
}
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   388
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   389
uint32_t
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   390
PacketSocket::GetRxAvailable (void) const
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   391
{
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   392
  NS_LOG_FUNCTION_NOARGS ();
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   393
  // We separately maintain this state to avoid walking the queue 
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   394
  // every time this might be called
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   395
  return m_rxAvailable;
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   396
}
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   397
3097
1b1661bbfa33 Plumb in socket receive pull model, in parallel to existing Receive framework
Tom Henderson <tomh@tomh.org>
parents: 2983
diff changeset
   398
Ptr<Packet> 
1b1661bbfa33 Plumb in socket receive pull model, in parallel to existing Receive framework
Tom Henderson <tomh@tomh.org>
parents: 2983
diff changeset
   399
PacketSocket::Recv (uint32_t maxSize, uint32_t flags)
1b1661bbfa33 Plumb in socket receive pull model, in parallel to existing Receive framework
Tom Henderson <tomh@tomh.org>
parents: 2983
diff changeset
   400
{
3112
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   401
  NS_LOG_FUNCTION_NOARGS ();
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   402
  if (m_deliveryQueue.empty() )
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   403
    {
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   404
      return 0;
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   405
    }
3097
1b1661bbfa33 Plumb in socket receive pull model, in parallel to existing Receive framework
Tom Henderson <tomh@tomh.org>
parents: 2983
diff changeset
   406
  Ptr<Packet> p = m_deliveryQueue.front ();
3104
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3098
diff changeset
   407
  if (p->GetSize () <= maxSize)
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   408
    {
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   409
      m_deliveryQueue.pop ();
3104
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3098
diff changeset
   410
      m_rxAvailable -= p->GetSize ();
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   411
    }
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   412
  else
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   413
    {
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   414
      p = 0;
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   415
    }
3097
1b1661bbfa33 Plumb in socket receive pull model, in parallel to existing Receive framework
Tom Henderson <tomh@tomh.org>
parents: 2983
diff changeset
   416
  return p;
1b1661bbfa33 Plumb in socket receive pull model, in parallel to existing Receive framework
Tom Henderson <tomh@tomh.org>
parents: 2983
diff changeset
   417
}
1b1661bbfa33 Plumb in socket receive pull model, in parallel to existing Receive framework
Tom Henderson <tomh@tomh.org>
parents: 2983
diff changeset
   418
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   419
Ptr<Packet>
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   420
PacketSocket::RecvFrom (uint32_t maxSize, uint32_t flags, Address &fromAddress)
3104
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3098
diff changeset
   421
{
3112
b5413dcad0c8 Enable receive buffer limit for packet socket
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   422
  NS_LOG_FUNCTION_NOARGS ();
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   423
  Ptr<Packet> packet = Recv (maxSize, flags);
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   424
  if (packet != 0)
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   425
    {
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   426
      SocketAddressTag tag;
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   427
      bool found;
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   428
      found = packet->FindFirstMatchingTag (tag);
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   429
      NS_ASSERT (found);
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   430
      fromAddress = tag.GetAddress ();
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   431
    }
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3219
diff changeset
   432
  return packet;
3104
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3098
diff changeset
   433
}
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3098
diff changeset
   434
1188
34386185bc1f a packet socket
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   435
}//namespace ns3