src/internet-stack/udp-socket-impl.cc
author Florian Westphal <fw@strlen.de>
Wed, 03 Sep 2008 23:24:59 +0200
changeset 3595 693faf7f4e9b
parent 3588 ad0a36bfdb62
child 3718 f22f8ab3f6f5
permissions -rw-r--r--
nsc: Fix build problem if gtk config store is disabled gtk config store pulled in libdl.so for us, so things fail to link of the config store isn't enabled. This makes nsc pull in libdl itself when its enabled.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2007 INRIA
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 *
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 *
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 *
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 *
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 */
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1270
diff changeset
    20
1504
36ecc970ba96 checkpoint debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1452
diff changeset
    21
#include "ns3/log.h"
729
b5e744285e92 rename i-node to node
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 728
diff changeset
    22
#include "ns3/node.h"
1171
335886fe4ddd InetAddress -> InetSocketAddress
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1164
diff changeset
    23
#include "ns3/inet-socket-address.h"
1317
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
    24
#include "ns3/ipv4-route.h"
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
    25
#include "ns3/ipv4.h"
3125
d2d8a36cfd23 s/ns3::Udp/ns3::UdpSocketFactory
Tom Henderson <tomh@tomh.org>
parents: 3124
diff changeset
    26
#include "ns3/udp-socket-factory.h"
3117
c8160bbb2085 Add SocketDefaults to store socket option attributes
Tom Henderson <tomh@tomh.org>
parents: 3113
diff changeset
    27
#include "ns3/trace-source-accessor.h"
c8160bbb2085 Add SocketDefaults to store socket option attributes
Tom Henderson <tomh@tomh.org>
parents: 3113
diff changeset
    28
#include "ns3/uinteger.h"
3123
fae57a467d54 undo SocketDefaults class; plumb in new UdpSocket option attributes
Tom Henderson <tomh@tomh.org>
parents: 3122
diff changeset
    29
#include "ns3/boolean.h"
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
    30
#include "udp-socket-impl.h"
741
38ebb2fb16f5 udp.h -> udp-l4-protocol.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 729
diff changeset
    31
#include "udp-l4-protocol.h"
495
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
    32
#include "ipv4-end-point.h"
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
    34
NS_LOG_COMPONENT_DEFINE ("UdpSocketImpl");
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    35
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    36
namespace ns3 {
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    37
3122
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3120
diff changeset
    38
static const uint32_t MAX_IPV4_UDP_DATAGRAM_SIZE = 65507;
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3120
diff changeset
    39
3127
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
    40
// Add attributes generic to all UdpSockets to base class UdpSocket
3105
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
    41
TypeId
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
    42
UdpSocketImpl::GetTypeId (void)
3105
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
    43
{
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
    44
  static TypeId tid = TypeId ("ns3::UdpSocketImpl")
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
    45
    .SetParent<UdpSocket> ()
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
    46
    .AddConstructor<UdpSocketImpl> ()
3105
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
    47
    .AddTraceSource ("Drop", "Drop UDP packet due to receive buffer overflow",
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
    48
                     MakeTraceSourceAccessor (&UdpSocketImpl::m_dropTrace))
3105
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
    49
    ;
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
    50
  return tid;
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
    51
}
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
    52
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
    53
UdpSocketImpl::UdpSocketImpl ()
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    54
  : m_endPoint (0),
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2574
diff changeset
    55
    m_node (0),
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2574
diff changeset
    56
    m_udp (0),
646
f7475a7c5ae6 Rename the SocketErrno enumeration values, from ESOMETHING to ERROR_SOMETHING, to avoid conflict with errno #define's; fixes compilation in mingw32.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 607
diff changeset
    57
    m_errno (ERROR_NOTERROR),
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
    m_shutdownSend (false),
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
    m_shutdownRecv (false),
3104
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3102
diff changeset
    60
    m_connected (false),
3123
fae57a467d54 undo SocketDefaults class; plumb in new UdpSocket option attributes
Tom Henderson <tomh@tomh.org>
parents: 3122
diff changeset
    61
    m_rxAvailable (0)
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1270
diff changeset
    62
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
    63
  NS_LOG_FUNCTION_NOARGS ();
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1270
diff changeset
    64
}
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1270
diff changeset
    65
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
    66
UdpSocketImpl::~UdpSocketImpl ()
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    67
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
    68
  NS_LOG_FUNCTION_NOARGS ();
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1270
diff changeset
    69
557
927a5bb6432a convert UdpSocket and Udp to Ptr<Node>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 524
diff changeset
    70
  m_node = 0;
515
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    71
  if (m_endPoint != 0)
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    72
    {
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    73
      NS_ASSERT (m_udp != 0);
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    74
      /**
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    75
       * Note that this piece of code is a bit tricky:
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    76
       * when DeAllocate is called, it will call into
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    77
       * Ipv4EndPointDemux::Deallocate which triggers
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    78
       * a delete of the associated endPoint which triggers
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    79
       * in turn a call to the method ::Destroy below
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    80
       * will will zero the m_endPoint field.
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    81
       */
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    82
      NS_ASSERT (m_endPoint != 0);
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    83
      m_udp->DeAllocate (m_endPoint);
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    84
      NS_ASSERT (m_endPoint == 0);
e907146a191e fix valgrind warning: UdpSocket must manage carefully its Ipv4EndPoint to avoid double deleting it.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 503
diff changeset
    85
    }
568
e1660959ecbb use Ptr<> everywhere Object or NsUnknown are used
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 557
diff changeset
    86
  m_udp = 0;
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
}
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2574
diff changeset
    89
void 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
    90
UdpSocketImpl::SetNode (Ptr<Node> node)
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2574
diff changeset
    91
{
3113
e6740c0582bf tweak UdpSocket buffer limit behavior
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    92
  NS_LOG_FUNCTION_NOARGS ();
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2574
diff changeset
    93
  m_node = node;
3105
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
    94
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2574
diff changeset
    95
}
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2574
diff changeset
    96
void 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
    97
UdpSocketImpl::SetUdp (Ptr<UdpL4Protocol> udp)
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2574
diff changeset
    98
{
3113
e6740c0582bf tweak UdpSocket buffer limit behavior
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
    99
  NS_LOG_FUNCTION_NOARGS ();
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2574
diff changeset
   100
  m_udp = udp;
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2574
diff changeset
   101
}
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2574
diff changeset
   102
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2574
diff changeset
   103
1264
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1186
diff changeset
   104
enum Socket::SocketErrno
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   105
UdpSocketImpl::GetErrno (void) const
1264
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1186
diff changeset
   106
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   107
  NS_LOG_FUNCTION_NOARGS ();
1264
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1186
diff changeset
   108
  return m_errno;
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1186
diff changeset
   109
}
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1186
diff changeset
   110
728
95c426b1cb60 rename INode to Node
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 646
diff changeset
   111
Ptr<Node>
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   112
UdpSocketImpl::GetNode (void) const
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   113
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   114
  NS_LOG_FUNCTION_NOARGS ();
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   115
  return m_node;
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   116
}
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   117
495
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   118
void 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   119
UdpSocketImpl::Destroy (void)
495
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
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: 2834
diff changeset
   121
  NS_LOG_FUNCTION_NOARGS ();
557
927a5bb6432a convert UdpSocket and Udp to Ptr<Node>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 524
diff changeset
   122
  m_node = 0;
495
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   123
  m_endPoint = 0;
568
e1660959ecbb use Ptr<> everywhere Object or NsUnknown are used
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 557
diff changeset
   124
  m_udp = 0;
495
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   125
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1270
diff changeset
   126
495
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   127
int
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   128
UdpSocketImpl::FinishBind (void)
495
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   129
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   130
  NS_LOG_FUNCTION_NOARGS ();
495
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   131
  if (m_endPoint == 0)
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   132
    {
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   133
      return -1;
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   134
    }
3157
de8e4b4c662f Bug #154: Attach sockets to nodes. Patch by Rajib Bhattacharjea.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3145
diff changeset
   135
  m_endPoint->SetRxCallback (MakeCallback (&UdpSocketImpl::ForwardUp, Ptr<UdpSocketImpl> (this)));
de8e4b4c662f Bug #154: Attach sockets to nodes. Patch by Rajib Bhattacharjea.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3145
diff changeset
   136
  m_endPoint->SetDestroyCallback (MakeCallback (&UdpSocketImpl::Destroy, Ptr<UdpSocketImpl> (this)));
495
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   137
  return 0;
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   138
}
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   139
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   140
int
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   141
UdpSocketImpl::Bind (void)
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   142
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   143
  NS_LOG_FUNCTION_NOARGS ();
499
8a469663f7ea implement properly the refcounting rules for the capability getters
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 496
diff changeset
   144
  m_endPoint = m_udp->Allocate ();
495
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   145
  return FinishBind ();
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   146
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1270
diff changeset
   147
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   148
int 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   149
UdpSocketImpl::Bind (const Address &address)
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   151
  NS_LOG_FUNCTION (this << address);
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1270
diff changeset
   152
1172
2e5b994330c7 add InetSocketAddress::IsMatchingType and use it
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1171
diff changeset
   153
  if (!InetSocketAddress::IsMatchingType (address))
2e5b994330c7 add InetSocketAddress::IsMatchingType and use it
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1171
diff changeset
   154
    {
1504
36ecc970ba96 checkpoint debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1452
diff changeset
   155
      NS_LOG_ERROR ("Not IsMatchingType");
1172
2e5b994330c7 add InetSocketAddress::IsMatchingType and use it
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1171
diff changeset
   156
      return ERROR_INVAL;
2e5b994330c7 add InetSocketAddress::IsMatchingType and use it
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1171
diff changeset
   157
    }
1207
a9f3610bbffa remove implicit conversion from Address to Eui48Address, to Ipv4Address and to InetSocketAddress
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1204
diff changeset
   158
  InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
1162
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   159
  Ipv4Address ipv4 = transport.GetIpv4 ();
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   160
  uint16_t port = transport.GetPort ();
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   161
  if (ipv4 == Ipv4Address::GetAny () && port == 0)
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   162
    {
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   163
      m_endPoint = m_udp->Allocate ();
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   164
    }
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   165
  else if (ipv4 == Ipv4Address::GetAny () && port != 0)
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   166
    {
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   167
      m_endPoint = m_udp->Allocate (port);
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   168
    }
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   169
  else if (ipv4 != Ipv4Address::GetAny () && port == 0)
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   170
    {
2608
408589d1dfff merge with HEAD
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2600
diff changeset
   171
      m_endPoint = m_udp->Allocate (ipv4);
1162
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   172
    }
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   173
  else if (ipv4 != Ipv4Address::GetAny () && port != 0)
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   174
    {
2608
408589d1dfff merge with HEAD
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2600
diff changeset
   175
      m_endPoint = m_udp->Allocate (ipv4, port);
1162
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   176
    }
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   177
495
a839408950b9 rework the socket/udp layer to remove the Ipv4EndPointDemux template
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   178
  return FinishBind ();
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   179
}
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   180
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   181
int 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   182
UdpSocketImpl::ShutdownSend (void)
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   183
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   184
  NS_LOG_FUNCTION_NOARGS ();
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   185
  m_shutdownSend = true;
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   186
  return 0;
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1270
diff changeset
   188
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   189
int 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   190
UdpSocketImpl::ShutdownRecv (void)
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   191
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   192
  NS_LOG_FUNCTION_NOARGS ();
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   193
  m_shutdownRecv = false;
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   194
  return 0;
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   195
}
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   196
1186
909e9eb2124e rework the NetDevice <-> Node interface
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1182
diff changeset
   197
int
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   198
UdpSocketImpl::Close(void)
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   199
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   200
  NS_LOG_FUNCTION_NOARGS ();
1186
909e9eb2124e rework the NetDevice <-> Node interface
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1182
diff changeset
   201
  return 0;
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   202
}
1264
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1186
diff changeset
   203
1186
909e9eb2124e rework the NetDevice <-> Node interface
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1182
diff changeset
   204
int
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   205
UdpSocketImpl::Connect(const Address & address)
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   206
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   207
  NS_LOG_FUNCTION (this << address);
1207
a9f3610bbffa remove implicit conversion from Address to Eui48Address, to Ipv4Address and to InetSocketAddress
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1204
diff changeset
   208
  InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
1162
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   209
  m_defaultAddress = transport.GetIpv4 ();
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   210
  m_defaultPort = transport.GetPort ();
1264
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1186
diff changeset
   211
  NotifyConnectionSucceeded ();
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   212
  m_connected = true;
1434
2b63aafb050b set source address in socket
Craig Dowell <craigdo@ee.washington.edu>
parents: 1429
diff changeset
   213
1186
909e9eb2124e rework the NetDevice <-> Node interface
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1182
diff changeset
   214
  return 0;
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   215
}
1317
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   216
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   217
int 
3213
08a0424399fb bug 203: Listen must be implemented for Udp and Packet sockets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3157
diff changeset
   218
UdpSocketImpl::Listen (uint32_t queueLimit)
08a0424399fb bug 203: Listen must be implemented for Udp and Packet sockets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3157
diff changeset
   219
{
08a0424399fb bug 203: Listen must be implemented for Udp and Packet sockets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3157
diff changeset
   220
  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: 3157
diff changeset
   221
  return -1;
08a0424399fb bug 203: Listen must be implemented for Udp and Packet sockets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3157
diff changeset
   222
}
08a0424399fb bug 203: Listen must be implemented for Udp and Packet sockets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3157
diff changeset
   223
08a0424399fb bug 203: Listen must be implemented for Udp and Packet sockets.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3157
diff changeset
   224
int 
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   225
UdpSocketImpl::Send (Ptr<Packet> p, uint32_t flags)
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   226
{
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   227
  NS_LOG_FUNCTION (this << p << flags);
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1270
diff changeset
   228
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   229
  if (!m_connected)
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   230
    {
646
f7475a7c5ae6 Rename the SocketErrno enumeration values, from ESOMETHING to ERROR_SOMETHING, to avoid conflict with errno #define's; fixes compilation in mingw32.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 607
diff changeset
   231
      m_errno = ERROR_NOTCONN;
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   232
      return -1;
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   233
    }
1317
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   234
  return DoSend (p);
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   235
}
1317
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   236
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   237
int 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   238
UdpSocketImpl::DoSend (Ptr<Packet> p)
1317
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   239
{
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   240
  NS_LOG_FUNCTION (this << p);
1317
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   241
  if (m_endPoint == 0)
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   242
    {
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   243
      if (Bind () == -1)
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   244
       {
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   245
          NS_ASSERT (m_endPoint == 0);
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   246
         return -1;
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   247
       }
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   248
      NS_ASSERT (m_endPoint != 0);
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   249
    }
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   250
  if (m_shutdownSend)
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   251
    {
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   252
      m_errno = ERROR_SHUTDOWN;
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   253
      return -1;
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   254
    } 
1318
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   255
  
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   256
  return DoSendTo (p, m_defaultAddress, m_defaultPort);
1317
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   257
}
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   258
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   259
int
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   260
UdpSocketImpl::DoSendTo (Ptr<Packet> p, const Address &address)
1162
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   261
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   262
  NS_LOG_FUNCTION (this << p << address);
1449
df86e6b876ef merge with trunk
Craig Dowell <craigdo@ee.washington.edu>
parents: 1440 1318
diff changeset
   263
1318
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   264
  if (!m_connected)
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   265
    {
1504
36ecc970ba96 checkpoint debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1452
diff changeset
   266
      NS_LOG_LOGIC ("Not connected");
1318
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   267
      InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   268
      Ipv4Address ipv4 = transport.GetIpv4 ();
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   269
      uint16_t port = transport.GetPort ();
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   270
      return DoSendTo (p, ipv4, port);
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   271
    }
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   272
  else
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   273
    {
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   274
      // connected UDP socket must use default addresses
1504
36ecc970ba96 checkpoint debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1452
diff changeset
   275
      NS_LOG_LOGIC ("Connected");
1318
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   276
      return DoSendTo (p, m_defaultAddress, m_defaultPort);
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   277
    }
1162
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   278
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1270
diff changeset
   279
1162
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   280
int
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   281
UdpSocketImpl::DoSendTo (Ptr<Packet> p, Ipv4Address dest, uint16_t port)
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   282
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   283
  NS_LOG_FUNCTION (this << p << dest << port);
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1270
diff changeset
   284
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   285
  if (m_endPoint == 0)
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   286
    {
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   287
      if (Bind () == -1)
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   288
	{
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   289
          NS_ASSERT (m_endPoint == 0);
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   290
	  return -1;
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   291
	}
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   292
      NS_ASSERT (m_endPoint != 0);
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   293
    }
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   294
  if (m_shutdownSend)
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   295
    {
646
f7475a7c5ae6 Rename the SocketErrno enumeration values, from ESOMETHING to ERROR_SOMETHING, to avoid conflict with errno #define's; fixes compilation in mingw32.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 607
diff changeset
   296
      m_errno = ERROR_SHUTDOWN;
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   297
      return -1;
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   298
    }
1452
973c456d3684 socket update broke multicast
Craig Dowell <craigdo@ee.washington.edu>
parents: 1450
diff changeset
   299
3122
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3120
diff changeset
   300
  if (p->GetSize () > GetTxAvailable () )
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3120
diff changeset
   301
    {
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3120
diff changeset
   302
      m_errno = ERROR_MSGSIZE;
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3120
diff changeset
   303
      return -1;
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3120
diff changeset
   304
    }
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3120
diff changeset
   305
1452
973c456d3684 socket update broke multicast
Craig Dowell <craigdo@ee.washington.edu>
parents: 1450
diff changeset
   306
  uint32_t localIfIndex;
2257
71a58e70c671 QueryInterface -> GetObject
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2231
diff changeset
   307
  Ptr<Ipv4> ipv4 = m_node->GetObject<Ipv4> ();
1452
973c456d3684 socket update broke multicast
Craig Dowell <craigdo@ee.washington.edu>
parents: 1450
diff changeset
   308
3124
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   309
  // Locally override the IP TTL for this socket
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   310
  // We cannot directly modify the TTL at this stage, so we set a Packet tag
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   311
  // The destination can be either multicast, unicast/anycast, or
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   312
  // either all-hosts broadcast or limited (subnet-directed) broadcast.
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   313
  // For the latter two broadcast types, the TTL will later be set to one
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   314
  // irrespective of what is set in these socket options.  So, this tagging  
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   315
  // may end up setting the TTL of a limited broadcast packet to be
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   316
  // the same as a unicast, but it will be fixed further down the stack
3127
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   317
  //NS_LOG_UNCOND ("IPttl: " << m_ipTtl);
3124
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   318
  if (m_ipMulticastTtl != 0 && dest.IsMulticast ())
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   319
    {
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   320
      SocketIpTtlTag tag;
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   321
      tag.SetTtl (m_ipMulticastTtl);
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   322
      p->AddTag (tag);
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   323
    }
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   324
  else if (m_ipTtl != 0 && !dest.IsMulticast () && !dest.IsBroadcast ())
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   325
    {
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   326
      SocketIpTtlTag tag;
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   327
      tag.SetTtl (m_ipTtl);
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   328
      p->AddTag (tag);
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 3123
diff changeset
   329
    }
1318
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   330
  //
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   331
  // If dest is sent to the limited broadcast address (all ones),
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   332
  // convert it to send a copy of the packet out of every interface
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   333
  //
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   334
  if (dest.IsBroadcast ())
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   335
    {
2299
0b9193f38f18 Some more udp socket debug messages
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2257
diff changeset
   336
      NS_LOG_LOGIC ("Limited broadcast start.");
1318
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   337
      for (uint32_t i = 0; i < ipv4->GetNInterfaces (); i++ )
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   338
        {
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   339
          Ipv4Address addri = ipv4->GetAddress (i);
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   340
          Ipv4Mask maski = ipv4->GetNetworkMask (i);
2299
0b9193f38f18 Some more udp socket debug messages
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2257
diff changeset
   341
          Ipv4Address bcast = addri.GetSubnetDirectedBroadcast (maski);
2305
518187ed457c Backed out changeset 055ff23aa034 (Tom does not like it turns out OLSR does not need it)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2300
diff changeset
   342
          NS_LOG_LOGIC ("Sending one copy from " << addri << " to " << bcast
2299
0b9193f38f18 Some more udp socket debug messages
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2257
diff changeset
   343
                        << " (mask is " << maski << ")");
2305
518187ed457c Backed out changeset 055ff23aa034 (Tom does not like it turns out OLSR does not need it)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2300
diff changeset
   344
          m_udp->Send (p->Copy (), addri, bcast,
1318
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   345
                       m_endPoint->GetLocalPort (), port);
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   346
          NotifyDataSent (p->GetSize ());
1318
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   347
        }
2299
0b9193f38f18 Some more udp socket debug messages
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2257
diff changeset
   348
      NS_LOG_LOGIC ("Limited broadcast end.");
2912
843e6218834f Fix bug 168: Socket::SendTo does not return the number of bytes sent for udp sockets.
Liu Jian <liujatp@gmail.com>
parents: 2834
diff changeset
   349
      return p->GetSize();
1318
89b78e2d521e Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script
Tom Henderson <tomh@tomh.org>
parents: 1317
diff changeset
   350
    }
1452
973c456d3684 socket update broke multicast
Craig Dowell <craigdo@ee.washington.edu>
parents: 1450
diff changeset
   351
  else if (ipv4->GetIfIndexForDestination(dest, localIfIndex))
1317
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   352
    {
1504
36ecc970ba96 checkpoint debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1452
diff changeset
   353
      NS_LOG_LOGIC ("Route exists");
2914
5092e8290b9b update testcase to deal with the return value of Socket::Send. Make sure udp packets are copied before going down the ip stack.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2912
diff changeset
   354
      m_udp->Send (p->Copy (), ipv4->GetAddress (localIfIndex), dest,
1162
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   355
		   m_endPoint->GetLocalPort (), port);
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   356
      NotifyDataSent (p->GetSize ());
2912
843e6218834f Fix bug 168: Socket::SendTo does not return the number of bytes sent for udp sockets.
Liu Jian <liujatp@gmail.com>
parents: 2834
diff changeset
   357
      return p->GetSize();;
1317
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   358
    }
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   359
  else
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   360
   {
1504
36ecc970ba96 checkpoint debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1452
diff changeset
   361
      NS_LOG_ERROR ("ERROR_NOROUTETOHOST");
1317
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   362
      m_errno = ERROR_NOROUTETOHOST;
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   363
      return -1;
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   364
   }
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   365
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   366
  return 0;
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   367
}
1317
82629189efff Fold the two patches for bu6 69 together, building on the bug 65 patch
Tom Henderson <tomh@tomh.org>
parents: 1308
diff changeset
   368
3122
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3120
diff changeset
   369
// XXX maximum message size for UDP broadcast is limited by MTU
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3120
diff changeset
   370
// size of underlying link; we are not checking that now.
3105
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   371
uint32_t
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   372
UdpSocketImpl::GetTxAvailable (void) const
3105
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   373
{
3113
e6740c0582bf tweak UdpSocket buffer limit behavior
Tom Henderson <tomh@tomh.org>
parents: 3107
diff changeset
   374
  NS_LOG_FUNCTION_NOARGS ();
3122
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3120
diff changeset
   375
  // No finite send buffer is modelled, but we must respect
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3120
diff changeset
   376
  // the maximum size of an IP datagram (65535 bytes - headers).
dfa83ab5172d improve send semantics, documentation
Tom Henderson <tomh@tomh.org>
parents: 3120
diff changeset
   377
  return MAX_IPV4_UDP_DATAGRAM_SIZE;
3105
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   378
}
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   379
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   380
int 
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   381
UdpSocketImpl::SendTo (Ptr<Packet> p, uint32_t flags, const Address &address)
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   382
{
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   383
  NS_LOG_FUNCTION (this << p << flags << address);
1207
a9f3610bbffa remove implicit conversion from Address to Eui48Address, to Ipv4Address and to InetSocketAddress
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1204
diff changeset
   384
  InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
1162
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   385
  Ipv4Address ipv4 = transport.GetIpv4 ();
10f9613bd9be convert Socket to use Address class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 742
diff changeset
   386
  uint16_t port = transport.GetPort ();
1264
577875bb5a65 split callback registration from socket operations in socket.h API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1186
diff changeset
   387
  return DoSendTo (p, ipv4, port);
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   388
}
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   389
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   390
uint32_t
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   391
UdpSocketImpl::GetRxAvailable (void) const
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   392
{
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   393
  NS_LOG_FUNCTION_NOARGS ();
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   394
  // 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: 3213
diff changeset
   395
  // every time this might be called
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   396
  return m_rxAvailable;
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   397
}
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   398
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   399
Ptr<Packet>
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   400
UdpSocketImpl::Recv (uint32_t maxSize, uint32_t flags)
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   401
{
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   402
  NS_LOG_FUNCTION (this << maxSize << flags);
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   403
  if (m_deliveryQueue.empty() )
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   404
    {
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   405
      return 0;
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   406
    }
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   407
  Ptr<Packet> p = m_deliveryQueue.front ();
3104
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3102
diff changeset
   408
  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
   409
    {
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   410
      m_deliveryQueue.pop ();
3104
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3102
diff changeset
   411
      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
   412
    }
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   413
  else
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   414
    {
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   415
      p = 0; 
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   416
    }
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   417
  return p;
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   418
}
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   419
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   420
Ptr<Packet>
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   421
UdpSocketImpl::RecvFrom (uint32_t maxSize, uint32_t flags, 
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   422
  Address &fromAddress)
3104
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3102
diff changeset
   423
{
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   424
  NS_LOG_FUNCTION (this << maxSize << flags);
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   425
  Ptr<Packet> packet = Recv (maxSize, flags);
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   426
  if (packet != 0)
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   427
    {
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   428
      SocketAddressTag tag;
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   429
      bool found;
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   430
      found = packet->FindFirstMatchingTag (tag);
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   431
      NS_ASSERT (found);
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   432
      fromAddress = tag.GetAddress ();
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   433
    }
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   434
  return packet;
3104
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3102
diff changeset
   435
}
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3102
diff changeset
   436
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   437
void 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   438
UdpSocketImpl::ForwardUp (Ptr<Packet> packet, Ipv4Address ipv4, uint16_t port)
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   439
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
   440
  NS_LOG_FUNCTION (this << packet << ipv4 << port);
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1270
diff changeset
   441
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   442
  if (m_shutdownRecv)
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   443
    {
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   444
      return;
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   445
    }
3123
fae57a467d54 undo SocketDefaults class; plumb in new UdpSocket option attributes
Tom Henderson <tomh@tomh.org>
parents: 3122
diff changeset
   446
  if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
3105
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   447
    {
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   448
      Address address = InetSocketAddress (ipv4, port);
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   449
      SocketAddressTag tag;
3105
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   450
      tag.SetAddress (address);
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   451
      packet->AddTag (tag);
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   452
      m_deliveryQueue.push (packet);
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   453
      m_rxAvailable += packet->GetSize ();
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   454
      NotifyDataRecv ();
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   455
    }
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   456
  else
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   457
    {
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   458
      // In general, this case should not occur unless the
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   459
      // receiving application reads data from this socket slowly
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   460
      // in comparison to the arrival rate
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   461
      //
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   462
      // drop and trace packet
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   463
      NS_LOG_WARN ("No receive buffer space available.  Drop.");
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   464
      m_dropTrace (packet);
682950a37ea6 Add GetTxBuffer; add some socket options; make limited UDP receive buffer functional
Tom Henderson <tomh@tomh.org>
parents: 3104
diff changeset
   465
    }
453
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   466
}
ddbb935800d8 remove DatagramSocket, use Socket base class for UdpSocket subclass.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   467
3127
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   468
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   469
void 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   470
UdpSocketImpl::SetRcvBufSize (uint32_t size)
3127
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   471
{
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   472
  m_rcvBufSize = size;
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   473
}
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   474
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   475
uint32_t 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   476
UdpSocketImpl::GetRcvBufSize (void) const
3127
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   477
{
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   478
  return m_rcvBufSize;
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   479
}
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   480
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   481
void 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   482
UdpSocketImpl::SetIpTtl (uint32_t ipTtl)
3127
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   483
{
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   484
  m_ipTtl = ipTtl;
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   485
}
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   486
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   487
uint32_t 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   488
UdpSocketImpl::GetIpTtl (void) const
3127
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   489
{
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   490
  return m_ipTtl;
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   491
}
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   492
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   493
void 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   494
UdpSocketImpl::SetIpMulticastTtl (uint32_t ipTtl)
3127
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   495
{
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   496
  m_ipMulticastTtl = ipTtl;
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   497
}
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   498
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   499
uint32_t 
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   500
UdpSocketImpl::GetIpMulticastTtl (void) const
3127
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   501
{
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   502
  return m_ipMulticastTtl;
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   503
}
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   504
1435
a70de165a25a set source IP address in udp-socket packets
Craig Dowell <craigdo@ee.washington.edu>
parents: 1434
diff changeset
   505
} //namespace ns3
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   506
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   507
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   508
#ifdef RUN_SELF_TESTS
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   509
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   510
#include "ns3/test.h"
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   511
#include "ns3/socket-factory.h"
3125
d2d8a36cfd23 s/ns3::Udp/ns3::UdpSocketFactory
Tom Henderson <tomh@tomh.org>
parents: 3124
diff changeset
   512
#include "ns3/udp-socket-factory.h"
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   513
#include "ns3/simulator.h"
2673
a70e0c7aaf56 SimpleChannel/SimpleNetDevice. Use them where needed.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2608
diff changeset
   514
#include "ns3/simple-channel.h"
a70e0c7aaf56 SimpleChannel/SimpleNetDevice. Use them where needed.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2608
diff changeset
   515
#include "ns3/simple-net-device.h"
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   516
#include "ns3/drop-tail-queue.h"
2828
2344451f63c9 do not use InternetNode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2674
diff changeset
   517
#include "internet-stack.h"
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   518
#include <string>
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   520
namespace ns3 {
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   521
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   522
class UdpSocketImplTest: public Test
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   523
{
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   524
  Ptr<Packet> m_receivedPacket;
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   525
  Ptr<Packet> m_receivedPacket2;
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   526
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   527
public:
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   528
  virtual bool RunTests (void);
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   529
  UdpSocketImplTest ();
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   530
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   531
  void ReceivePacket (Ptr<Socket> socket, Ptr<Packet> packet, const Address &from);
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   532
  void ReceivePacket2 (Ptr<Socket> socket, Ptr<Packet> packet, const Address &from);
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   533
  void ReceivePkt (Ptr<Socket> socket);
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   534
  void ReceivePkt2 (Ptr<Socket> socket);
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   535
};
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   536
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   537
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   538
UdpSocketImplTest::UdpSocketImplTest ()
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   539
  : Test ("UdpSocketImpl") 
3127
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   540
{
f5971b43ee58 Add attributes to new abstract base class for UdpSocket
Tom Henderson <tomh@tomh.org>
parents: 3125
diff changeset
   541
}
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   542
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   543
void UdpSocketImplTest::ReceivePacket (Ptr<Socket> socket, Ptr<Packet> packet, const Address &from)
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   544
{
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   545
  m_receivedPacket = packet;
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   546
}
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   547
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   548
void UdpSocketImplTest::ReceivePacket2 (Ptr<Socket> socket, Ptr<Packet> packet, const Address &from)
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   549
{
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   550
  m_receivedPacket2 = packet;
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   551
}
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   552
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   553
void UdpSocketImplTest::ReceivePkt (Ptr<Socket> socket)
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   554
{
3145
16dd98873ec3 fix optimized build
Tom Henderson <tomh@tomh.org>
parents: 3130
diff changeset
   555
  uint32_t availableData;
16dd98873ec3 fix optimized build
Tom Henderson <tomh@tomh.org>
parents: 3130
diff changeset
   556
  availableData = socket->GetRxAvailable ();
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   557
  m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max(), 0);
3104
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3102
diff changeset
   558
  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   559
}
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   560
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   561
void UdpSocketImplTest::ReceivePkt2 (Ptr<Socket> socket)
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   562
{
3145
16dd98873ec3 fix optimized build
Tom Henderson <tomh@tomh.org>
parents: 3130
diff changeset
   563
  uint32_t availableData;
16dd98873ec3 fix optimized build
Tom Henderson <tomh@tomh.org>
parents: 3130
diff changeset
   564
  availableData = socket->GetRxAvailable ();
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   565
  m_receivedPacket2 = socket->Recv (std::numeric_limits<uint32_t>::max(), 0);
3104
24d9d9aa0977 Implement GetRxAvailable ()
Tom Henderson <tomh@tomh.org>
parents: 3102
diff changeset
   566
  NS_ASSERT (availableData == m_receivedPacket2->GetSize ());
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   567
}
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   568
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   569
bool
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   570
UdpSocketImplTest::RunTests (void)
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   571
{
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   572
  bool result = true;
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   573
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   574
  // Create topology
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   575
  
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   576
  // Receiver Node
2828
2344451f63c9 do not use InternetNode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2674
diff changeset
   577
  Ptr<Node> rxNode = CreateObject<Node> ();
2344451f63c9 do not use InternetNode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2674
diff changeset
   578
  AddInternetStack (rxNode);
2673
a70e0c7aaf56 SimpleChannel/SimpleNetDevice. Use them where needed.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2608
diff changeset
   579
  Ptr<SimpleNetDevice> rxDev1, rxDev2;
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   580
  { // first interface
2673
a70e0c7aaf56 SimpleChannel/SimpleNetDevice. Use them where needed.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2608
diff changeset
   581
    rxDev1 = CreateObject<SimpleNetDevice> ();
a70e0c7aaf56 SimpleChannel/SimpleNetDevice. Use them where needed.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2608
diff changeset
   582
    rxDev1->SetAddress (Mac48Address::Allocate ());
2503
e667dc0f350e merge with HEAD
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2326 2501
diff changeset
   583
    rxNode->AddDevice (rxDev1);
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   584
    Ptr<Ipv4> ipv4 = rxNode->GetObject<Ipv4> ();
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   585
    uint32_t netdev_idx = ipv4->AddInterface (rxDev1);
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   586
    ipv4->SetAddress (netdev_idx, Ipv4Address ("10.0.0.1"));
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   587
    ipv4->SetNetworkMask (netdev_idx, Ipv4Mask (0xffff0000U));
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   588
    ipv4->SetUp (netdev_idx);
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   589
  }
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   590
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   591
  { // second interface
2673
a70e0c7aaf56 SimpleChannel/SimpleNetDevice. Use them where needed.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2608
diff changeset
   592
    rxDev2 = CreateObject<SimpleNetDevice> ();
a70e0c7aaf56 SimpleChannel/SimpleNetDevice. Use them where needed.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2608
diff changeset
   593
    rxDev2->SetAddress (Mac48Address::Allocate ());
2503
e667dc0f350e merge with HEAD
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2326 2501
diff changeset
   594
    rxNode->AddDevice (rxDev2);
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   595
    Ptr<Ipv4> ipv4 = rxNode->GetObject<Ipv4> ();
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   596
    uint32_t netdev_idx = ipv4->AddInterface (rxDev2);
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   597
    ipv4->SetAddress (netdev_idx, Ipv4Address ("10.0.1.1"));
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   598
    ipv4->SetNetworkMask (netdev_idx, Ipv4Mask (0xffff0000U));
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   599
    ipv4->SetUp (netdev_idx);
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   600
  }
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   601
  
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   602
  // Sender Node
2828
2344451f63c9 do not use InternetNode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2674
diff changeset
   603
  Ptr<Node> txNode = CreateObject<Node> ();
2344451f63c9 do not use InternetNode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2674
diff changeset
   604
  AddInternetStack (txNode);
2674
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   605
  Ptr<SimpleNetDevice> txDev1;
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   606
  {
2674
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   607
    txDev1 = CreateObject<SimpleNetDevice> ();
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   608
    txDev1->SetAddress (Mac48Address::Allocate ());
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   609
    txNode->AddDevice (txDev1);
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   610
    Ptr<Ipv4> ipv4 = txNode->GetObject<Ipv4> ();
2674
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   611
    uint32_t netdev_idx = ipv4->AddInterface (txDev1);
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   612
    ipv4->SetAddress (netdev_idx, Ipv4Address ("10.0.0.2"));
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   613
    ipv4->SetNetworkMask (netdev_idx, Ipv4Mask (0xffff0000U));
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   614
    ipv4->SetUp (netdev_idx);
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   615
  }
2674
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   616
  Ptr<SimpleNetDevice> txDev2;
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   617
  {
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   618
    txDev2 = CreateObject<SimpleNetDevice> ();
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   619
    txDev2->SetAddress (Mac48Address::Allocate ());
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   620
    txNode->AddDevice (txDev2);
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   621
    Ptr<Ipv4> ipv4 = txNode->GetObject<Ipv4> ();
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   622
    uint32_t netdev_idx = ipv4->AddInterface (txDev2);
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   623
    ipv4->SetAddress (netdev_idx, Ipv4Address ("10.0.1.2"));
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   624
    ipv4->SetNetworkMask (netdev_idx, Ipv4Mask (0xffff0000U));
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   625
    ipv4->SetUp (netdev_idx);
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   626
  }
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   627
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   628
  // link the two nodes
2674
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   629
  Ptr<SimpleChannel> channel1 = CreateObject<SimpleChannel> ();
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   630
  rxDev1->SetChannel (channel1);
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   631
  txDev1->SetChannel (channel1);
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   632
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   633
  Ptr<SimpleChannel> channel2 = CreateObject<SimpleChannel> ();
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   634
  rxDev2->SetChannel (channel2);
41f943501ae7 Fix the udp socket unit test problem discovered by Mathieu.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2673
diff changeset
   635
  txDev2->SetChannel (channel2);
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   636
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   637
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   638
  // Create the UDP sockets
3125
d2d8a36cfd23 s/ns3::Udp/ns3::UdpSocketFactory
Tom Henderson <tomh@tomh.org>
parents: 3124
diff changeset
   639
  Ptr<SocketFactory> rxSocketFactory = rxNode->GetObject<UdpSocketFactory> ();
1524
3ead2b66f2e4 Fix a regression in handling of broadcast packets and UDP sockets (closes bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1520
diff changeset
   640
  Ptr<Socket> rxSocket = rxSocketFactory->CreateSocket ();
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   641
  NS_TEST_ASSERT_EQUAL (rxSocket->Bind (InetSocketAddress (Ipv4Address ("10.0.0.1"), 1234)), 0);
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   642
  rxSocket->SetRecvCallback (MakeCallback (&UdpSocketImplTest::ReceivePkt, this));
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   643
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   644
  Ptr<Socket> rxSocket2 = rxSocketFactory->CreateSocket ();
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   645
  rxSocket2->SetRecvCallback (MakeCallback (&UdpSocketImplTest::ReceivePkt2, this));
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   646
  NS_TEST_ASSERT_EQUAL (rxSocket2->Bind (InetSocketAddress (Ipv4Address ("10.0.1.1"), 1234)), 0);
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   647
3125
d2d8a36cfd23 s/ns3::Udp/ns3::UdpSocketFactory
Tom Henderson <tomh@tomh.org>
parents: 3124
diff changeset
   648
  Ptr<SocketFactory> txSocketFactory = txNode->GetObject<UdpSocketFactory> ();
1524
3ead2b66f2e4 Fix a regression in handling of broadcast packets and UDP sockets (closes bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1520
diff changeset
   649
  Ptr<Socket> txSocket = txSocketFactory->CreateSocket ();
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   650
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   651
  // ------ Now the tests ------------
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   652
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   653
  // Unicast test
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   654
  m_receivedPacket = Create<Packet> ();
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   655
  m_receivedPacket2 = Create<Packet> ();
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   656
  NS_TEST_ASSERT_EQUAL (txSocket->SendTo ( Create<Packet> (123), 0, 
3120
774b2637845e swap SendTo parameters
Tom Henderson <tomh@tomh.org>
parents: 3117
diff changeset
   657
    InetSocketAddress (Ipv4Address("10.0.0.1"), 1234)), 123);
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   658
  Simulator::Run ();
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   659
  NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   660
  NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 0); // second interface should receive it
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   661
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   662
  m_receivedPacket->RemoveAllTags ();
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   663
  m_receivedPacket2->RemoveAllTags ();
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   664
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   665
  // Simple broadcast test
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   666
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   667
  m_receivedPacket = Create<Packet> ();
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   668
  m_receivedPacket2 = Create<Packet> ();
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   669
  NS_TEST_ASSERT_EQUAL (txSocket->SendTo ( Create<Packet> (123), 0, 
3120
774b2637845e swap SendTo parameters
Tom Henderson <tomh@tomh.org>
parents: 3117
diff changeset
   670
    InetSocketAddress (Ipv4Address("255.255.255.255"), 1234)), 123);
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   671
  Simulator::Run ();
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   672
  NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   673
  // second socket should not receive it (it is bound specifically to the second interface's address
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   674
  NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 0);
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   675
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   676
  m_receivedPacket->RemoveAllTags ();
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   677
  m_receivedPacket2->RemoveAllTags ();
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   678
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   679
  // Broadcast test with multiple receiving sockets
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   680
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   681
  // When receiving broadcast packets, all sockets sockets bound to
2326
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   682
  // the address/port should receive a copy of the same packet -- if
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   683
  // the socket address matches.
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   684
  rxSocket2->Dispose ();
eec07777d1a2 Fix broadcast packet reception for locally bound sockets (bug #136)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 2305
diff changeset
   685
  rxSocket2 = rxSocketFactory->CreateSocket ();
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   686
  rxSocket2->SetRecvCallback (MakeCallback (&UdpSocketImplTest::ReceivePkt2, this));
1524
3ead2b66f2e4 Fix a regression in handling of broadcast packets and UDP sockets (closes bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1520
diff changeset
   687
  NS_TEST_ASSERT_EQUAL (rxSocket2->Bind (InetSocketAddress (Ipv4Address ("0.0.0.0"), 1234)), 0);
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   688
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   689
  m_receivedPacket = Create<Packet> ();
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   690
  m_receivedPacket2 = Create<Packet> ();
3269
448134601b03 RecvFrom() expansion, add flags parameter to some Send calls
Tom Henderson <tomh@tomh.org>
parents: 3213
diff changeset
   691
  NS_TEST_ASSERT_EQUAL (txSocket->SendTo (Create<Packet> (123), 0,
3120
774b2637845e swap SendTo parameters
Tom Henderson <tomh@tomh.org>
parents: 3117
diff changeset
   692
InetSocketAddress (Ipv4Address("255.255.255.255"), 1234)), 123);
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   693
  Simulator::Run ();
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   694
  NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   695
  NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 123);
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   696
3098
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   697
  m_receivedPacket->RemoveAllTags ();
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   698
  m_receivedPacket2->RemoveAllTags ();
d384d52f8f6e Cut over UDP applications to use the new receive API
Tom Henderson <tomh@tomh.org>
parents: 3097
diff changeset
   699
1704
41c3142f4293 add missing call to Simulator::Destroy to cleanup after test
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   700
  Simulator::Destroy ();
41c3142f4293 add missing call to Simulator::Destroy to cleanup after test
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   701
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   702
  return result;
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   703
}
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   704
3130
881cc06cd651 rename UdpSocket to UdpSocketImpl
Tom Henderson <tomh@tomh.org>
parents: 3129
diff changeset
   705
static UdpSocketImplTest gUdpSocketImplTest;
1519
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   706
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   707
}; // namespace ns3
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   708
9b1cbc4c63f8 Add a couple of Udp socket unit tests: unicast (passing) and broadcast (failing, bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1511
diff changeset
   709
#endif /* RUN_SELF_TESTS */