A Discrete-Event Network Simulator
API
mpi-test-fixtures.cc
Go to the documentation of this file.
1 /*
2  * Copyright 2018. Lawrence Livermore National Security, LLC.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Steven Smith <smith84@llnl.gov>
18  */
19 
20 #include "mpi-test-fixtures.h"
21 
22 #include "ns3/address.h"
23 #include "ns3/inet-socket-address.h"
24 #include "ns3/inet6-socket-address.h"
25 #include "ns3/packet.h"
26 #include "ns3/ptr.h"
27 #include "ns3/simulator.h"
28 
29 #include <mpi.h>
30 
31 namespace ns3
32 {
33 
34 unsigned long SinkTracer::m_sinkCount = 0;
35 unsigned long SinkTracer::m_line = 0;
38 
39 void
41 {
42  m_sinkCount = 0;
43  m_line = 0;
44  MPI_Comm_rank(MPI_COMM_WORLD, &m_worldRank);
45  MPI_Comm_size(MPI_COMM_WORLD, &m_worldSize);
46 }
47 
48 void
50  const ns3::Address& srcAddress,
51  const ns3::Address& destAddress)
52 {
53  m_sinkCount++;
54 }
55 
56 void
57 SinkTracer::Verify(unsigned long expectedCount)
58 {
59  unsigned long globalCount;
60 
61 #ifdef NS3_MPI
62  MPI_Reduce(&m_sinkCount, &globalCount, 1, MPI_UNSIGNED_LONG, MPI_SUM, 0, MPI_COMM_WORLD);
63 #else
64  globalCount = m_sinkCount;
65 #endif
66 
67  if (expectedCount == globalCount)
68  {
69  RANK0COUT("PASSED\n");
70  }
71  else
72  {
73  RANK0COUT("FAILED Observed sink traces (" << globalCount << ") not equal to expected ("
74  << expectedCount << ")\n");
75  }
76 }
77 
78 std::string
80 {
81  std::stringstream ss;
82 
84  {
87  }
89  {
92  }
93  return ss.str();
94 }
95 
96 } // namespace ns3
a polymophic address class
Definition: address.h:101
static Inet6SocketAddress ConvertFrom(const Address &addr)
Convert the address to a InetSocketAddress.
uint16_t GetPort() const
Get the port.
static bool IsMatchingType(const Address &addr)
If the address match.
Ipv6Address GetIpv6() const
Get the IPv6 address.
static bool IsMatchingType(const Address &address)
Ipv4Address GetIpv4() const
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address.
static void SinkTrace(const ns3::Ptr< const ns3::Packet > packet, const ns3::Address &srcAddress, const ns3::Address &destAddress)
PacketSink receive trace callback.
static int m_worldRank
MPI CommWorld rank.
static void Verify(unsigned long expectedCount)
Verify the sink trace count observed matches the expected count.
static int m_worldSize
MPI CommWorld size.
static unsigned long m_line
Current output line number for ordering output.
static void Init()
PacketSink Init.
static unsigned long m_sinkCount
Running sum of number of SinkTrace calls observed.
static std::string FormatAddress(const ns3::Address address)
Get the source address and port, as a formatted string.
#define RANK0COUT(x)
Write to std::cout only from rank 0.
Common methods for MPI examples.
address
Definition: first.py:47
Every class exported by the ns3 library is enclosed in the ns3 namespace.