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