1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 as
5 * published by the Free Software Foundation;
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15 */
16
17 // Implement an object to create a star topology.
18
19 #include <cmath>
20 #include <iostream>
21 #include <sstream>
22
23 // ns3 includes
24 #include "ns3/log.h"
25 #include "ns3/point-to-point-star.h"
26 #include "ns3/constant-position-mobility-model.h"
27
28 #include "ns3/node-list.h"
29 #include "ns3/point-to-point-net-device.h"
30 #include "ns3/vector.h"
31 #include "ns3/ipv6-address-generator.h"
32
33 namespace ns3 {
34
35 NS_LOG_COMPONENT_DEFINE ("PointToPointStarHelper");
36
PointToPointStarHelper(uint32_t numSpokes,PointToPointHelper p2pHelper)37 PointToPointStarHelper::PointToPointStarHelper (uint32_t numSpokes,
38 PointToPointHelper p2pHelper)
39 {
40 m_hub.Create (1);
41 m_spokes.Create (numSpokes);
42
43 for (uint32_t i = 0; i < m_spokes.GetN (); ++i)
44 {
45 NetDeviceContainer nd = p2pHelper.Install (m_hub.Get (0), m_spokes.Get (i));
46 m_hubDevices.Add (nd.Get (0));
47 m_spokeDevices.Add (nd.Get (1));
48 }
49 }
50
~PointToPointStarHelper()51 PointToPointStarHelper::~PointToPointStarHelper ()
52 {
53 }
54
55 Ptr<Node>
GetHub() const56 PointToPointStarHelper::GetHub () const
57 {
58 return m_hub.Get (0);
59 }
60
61 Ptr<Node>
GetSpokeNode(uint32_t i) const62 PointToPointStarHelper::GetSpokeNode (uint32_t i) const
63 {
64 return m_spokes.Get (i);
65 }
66
67 Ipv4Address
GetHubIpv4Address(uint32_t i) const68 PointToPointStarHelper::GetHubIpv4Address (uint32_t i) const
69 {
70 return m_hubInterfaces.GetAddress (i);
71 }
72
73 Ipv4Address
GetSpokeIpv4Address(uint32_t i) const74 PointToPointStarHelper::GetSpokeIpv4Address (uint32_t i) const
75 {
76 return m_spokeInterfaces.GetAddress (i);
77 }
78
79 Ipv6Address
GetHubIpv6Address(uint32_t i) const80 PointToPointStarHelper::GetHubIpv6Address (uint32_t i) const
81 {
82 return m_hubInterfaces6.GetAddress (i, 1);
83 }
84
85 Ipv6Address
GetSpokeIpv6Address(uint32_t i) const86 PointToPointStarHelper::GetSpokeIpv6Address (uint32_t i) const
87 {
88 return m_spokeInterfaces6.GetAddress (i, 1);
89 }
90
91 uint32_t
SpokeCount() const92 PointToPointStarHelper::SpokeCount () const
93 {
94 return m_spokes.GetN ();
95 }
96
97 void
InstallStack(InternetStackHelper stack)98 PointToPointStarHelper::InstallStack (InternetStackHelper stack)
99 {
100 stack.Install (m_hub);
101 stack.Install (m_spokes);
102 }
103
104 void
AssignIpv4Addresses(Ipv4AddressHelper address)105 PointToPointStarHelper::AssignIpv4Addresses (Ipv4AddressHelper address)
106 {
107 for (uint32_t i = 0; i < m_spokes.GetN (); ++i)
108 {
109 m_hubInterfaces.Add (address.Assign (m_hubDevices.Get (i)));
110 m_spokeInterfaces.Add (address.Assign (m_spokeDevices.Get (i)));
111 address.NewNetwork ();
112 }
113 }
114
115 void
AssignIpv6Addresses(Ipv6Address addrBase,Ipv6Prefix prefix)116 PointToPointStarHelper::AssignIpv6Addresses (Ipv6Address addrBase, Ipv6Prefix prefix)
117 {
118 Ipv6AddressGenerator::Init (addrBase, prefix);
119 Ipv6Address v6network;
120 Ipv6AddressHelper addressHelper;
121
122 for (uint32_t i = 0; i < m_spokes.GetN (); ++i)
123 {
124 v6network = Ipv6AddressGenerator::GetNetwork (prefix);
125 addressHelper.SetBase (v6network, prefix);
126
127 Ipv6InterfaceContainer ic = addressHelper.Assign (m_hubDevices.Get (i));
128 m_hubInterfaces6.Add (ic);
129 ic = addressHelper.Assign (m_spokeDevices.Get (i));
130 m_spokeInterfaces6.Add (ic);
131
132 Ipv6AddressGenerator::NextNetwork (prefix);
133 }
134 }
135
136 void
BoundingBox(double ulx,double uly,double lrx,double lry)137 PointToPointStarHelper::BoundingBox (double ulx, double uly,
138 double lrx, double lry)
139 {
140 double xDist;
141 double yDist;
142 if (lrx > ulx)
143 {
144 xDist = lrx - ulx;
145 }
146 else
147 {
148 xDist = ulx - lrx;
149 }
150 if (lry > uly)
151 {
152 yDist = lry - uly;
153 }
154 else
155 {
156 yDist = uly - lry;
157 }
158
159 // Place the hub
160 Ptr<Node> hub = m_hub.Get (0);
161 Ptr<ConstantPositionMobilityModel> hubLoc = hub->GetObject<ConstantPositionMobilityModel> ();
162 if (hubLoc == 0)
163 {
164 hubLoc = CreateObject<ConstantPositionMobilityModel> ();
165 hub->AggregateObject (hubLoc);
166 }
167 Vector hubVec (ulx + xDist/2.0, uly + yDist/2.0, 0);
168 hubLoc->SetPosition (hubVec);
169
170 double spokeDist;
171 if (xDist > yDist)
172 {
173 spokeDist = yDist/4.0;
174 }
175 else
176 {
177 spokeDist = xDist/4.0;
178 }
179
180 double theta = 2*M_PI/m_spokes.GetN ();
181 for (uint32_t i = 0; i < m_spokes.GetN (); ++i)
182 {
183 Ptr<Node> spokeNode = m_spokes.Get (i);
184 Ptr<ConstantPositionMobilityModel> spokeLoc = spokeNode->GetObject<ConstantPositionMobilityModel> ();
185 if (spokeLoc == 0)
186 {
187 spokeLoc = CreateObject<ConstantPositionMobilityModel> ();
188 spokeNode->AggregateObject (spokeLoc);
189 }
190 Vector spokeVec (hubVec.x + std::cos (theta*i) * spokeDist,
191 hubVec.y + std::sin (theta*i) * spokeDist,
192 0);
193 spokeLoc->SetPosition (spokeVec);
194 }
195 }
196
197 } // namespace ns3
198