Network Simulator-3 (NS-3) Practical Lab Manual
ISBN 9788119221820

Highlights

Notes

  

Program 22:: Program to simulate DHCP server and n clients.

dhcp-server.cc

/* -*- Mode:C++; c-file-style:”gnu”; indent-tabs-mode:nil; -*- */

/*

* Copyright (c) 2011 UPB

* Copyright (c) 2017 NITK Surathkal

*

* This program is free software; you can redistribute it and/or modify

* it under the terms of the GNU General Public License version 2 as

* published by the Free Software Foundation;

*

* This program is distributed in the hope that it will be useful,

* but WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

* GNU General Public License for more details.

*

* You should have received a copy of the GNU General Public License

* along with this program; if not, write to the Free Software

* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

*

* Author: Radu Lupu <rlupu@elcom.pub.ro>

* Ankit Deepak <adadeepak8@gmail.com>

* Deepti Rajagopal <deeptir96@gmail.com>

*

*/

/*

* Network layout:

*

* R0 is a DHCP server. The DHCP server announced R1 as the default router.

* Nodes N1 will send UDP Echo packets to node A.

*

*

* ┌                 ┐

* | DHCP Clients |

* |  172.30.0.14  |

* |  DHCP static |

* | ┌──────┐  ┌──────┐  ┌──────┐ |

* | │ N0 │  │ N1 │  │ N2 │  |  ┌──────┐

* | └──────┘  └──────┘  └──────┘ | ┌────│ A

* | │ │ │ | │ └──────┘

* └ │ │ │ ┘ │ 172.30.1.2

* DHCP Server │ │ │ │

* ┌──────┐ │ │ │ ┌──────┐ │

* │ R0

│────────┴──────────────┴───────────────┴──────│ R1

│────┘

* └──────┘ └──────┘172.30.1.1

* 172.30.0.12 172.30.0.17

*

* Things to notice:

* 1) The routes in A are manually set to have R1 as the default router,

* just because using a dynamic outing in this example is an overkill.

* 2) R1’s address is set statically though the DHCP server helper interface.

* This is useful to prevent address conflicts with the dynamic pool.

* Not necessary if the DHCP pool is not conflicting with static addresses.

* 3) N2 has a dynamically-assigned, static address (i.e., a fixed address assigned via DHCP).

*

*/

#include “ns3/core-module.h”

#include “ns3/internet-apps-module.h” 
#include “ns3/csma-module.h” 
#include “ns3/internet-module.h” 
#include “ns3/point-to-point-module.h” 
#include “ns3/applications-module.h” 
#include “ns3/netanim-module.h”

using namespace ns3; 
NS_LOG_COMPONENT_DEFINE (“DhcpExample”);

int

main (int argc, char *argv[])

{

CommandLine cmd ( FILE );

bool verbose = false; bool tracing = false;

std::string animFile = “dhcp-server-client-animation.xml”; 
cmd.AddValue (“verbose”, “turn on the logs”, verbose); 
cmd.AddValue (“tracing”, “turn on the tracing”, tracing);

cmd.Parse (argc, argv);

// GlobalValue::Bind (“ChecksumEnabled”, BooleanValue (true)); if (verbose)

{

LogComponentEnable (“DhcpServer”, LOG_LEVEL_ALL); 
LogComponentEnable (“DhcpClient”, LOG_LEVEL_ALL); 
LogComponentEnable (“UdpEchoServerApplication”, 
LOG_LEVEL_INFO); LogComponentEnable (“UdpEchoClientApplication”, LOG_LEVEL_INFO);

}

Time stopTime = Seconds (20);

NS_LOG_INFO (“Create nodes.”); 
NodeContainer nodes; 
NodeContainer router; 
nodes.Create (3);

router.Create (2);

NodeContainer net (nodes, router);

NS_LOG_INFO (“Create channels.”); 
CsmaHelper csma;

csma.SetChannelAttribute (“DataRate”, StringValue (“5Mbps”)); 
csma.SetChannelAttribute (“Delay”, StringValue (“2ms”)); 
csma.SetDeviceAttribute (“Mtu”, UintegerValue (1500)); 
NetDeviceContainer devNet = csma.Install (net);

NodeContainer p2pNodes; 
p2pNodes.Add (net.Get (4));

p2pNodes.Create (1);

PointToPointHelper pointToPoint;

pointToPoint.SetDeviceAttribute (“DataRate”, StringValue (“5Mbps”)); 
pointToPoint.SetChannelAttribute (“Delay”, StringValue (“2ms”));

NetDeviceContainer p2pDevices;

p2pDevices = pointToPoint.Install (p2pNodes);

InternetStackHelper tcpip; 
tcpip.Install (nodes); 
tcpip.Install (router); 
tcpip.Install (p2pNodes.Get (1));

Ipv4AddressHelper address;

address.SetBase (“172.30.1.0”, “255.255.255.0”);

Ipv4InterfaceContainer p2pInterfaces; 
p2pInterfaces = address.Assign (p2pDevices);

// manually add a routing entry because we don’t want to add a dynamic routing 
Ipv4StaticRoutingHelper ipv4RoutingHelper;

Ptr<Ipv4> ipv4Ptr = p2pNodes.Get (1)->GetObject<Ipv4> (); 
Ptr<Ipv4StaticRouting> staticRoutingA = ipv4RoutingHelper.GetStaticRouting (ipv4Ptr);

staticRoutingA->AddNetworkRouteTo (Ipv4Address (“172.30.0.0”), Ipv4Mask (“/24”),

Ipv4Address (“172.30.1.1”), 1);

NS_LOG_INFO (“Setup the IP addresses and create DHCP applications.”); DhcpHelper dhcpHelper;

// The router must have a fixed IP.

Ipv4InterfaceContainer fixedNodes = dhcpHelper.InstallFixedAddress 
(devNet.Get (4), Ipv4Address (“172.30.0.17”), Ipv4Mask (“/24”));

// Not really necessary, IP forwarding is enabled by default in IPv4. 
fixedNodes.Get (0).first->SetAttribute (“IpForward”, BooleanValue (true));

// DHCP server

ApplicationContainer dhcpServerApp = dhcpHelper.InstallDhcpServer 
(devNet.Get (3), Ipv4Address (“172.30.0.12”),

Ipv4Address (“172.30.0.0”), Ipv4Mask (“/24”), Ipv4Address (“172.30.0.10”), Ipv4Address (“172.30.0.15”),

Ipv4Address (“172.30.0.17”));

// This is just to show how it can be done.

DynamicCast<DhcpServer> (dhcpServerApp.Get (0))->AddStaticDhcpEntry (devNet.Get (2)->GetAddress (), Ipv4Address (“172.30.0.14”));

dhcpServerApp.Start (Seconds (0.0)); 
dhcpServerApp.Stop (stopTime);

// DHCP clients

NetDeviceContainer dhcpClientNetDevs; dhcpClientNetDevs.Add (devNet.Get (0));

dhcpClientNetDevs.Add (devNet.Get (1));

dhcpClientNetDevs.Add (devNet.Get (2));

ApplicationContainer dhcpClients = dhcpHelper.InstallDhcpClient 
(dhcpClientNetDevs);

dhcpClients.Start (Seconds (1.0)); dhcpClients.Stop (stopTime);

UdpEchoServerHelper echoServer (9);

ApplicationContainer serverApps = echoServer.Install (p2pNodes.Get (1)); 
serverApps.Start (Seconds (0.0));

serverApps.Stop (stopTime);

UdpEchoClientHelper echoClient (p2pInterfaces.GetAddress (1), 9); 
echoClient.SetAttribute (“MaxPackets”, UintegerValue (100)); 
echoClient.SetAttribute (“Interval”, TimeValue (Seconds (1.0))); 
echoClient.SetAttribute (“PacketSize”, UintegerValue (1024));

ApplicationContainer clientApps = echoClient.Install (nodes.Get (1)); 
clientApps.Start (Seconds (10.0));

clientApps.Stop (stopTime);

Simulator::Stop (stopTime + Seconds (10.0));

// Create the animation object and configure for specified output 
AnimationInterface anim (animFile);

if (tracing)

{

csma.EnablePcapAll (“dhcp-csma”); 
pointToPoint.EnablePcapAll (“dhcp-p2p”);

}

NS_LOG_INFO (“Run Simulation.”);

Simulator::Run (); Simulator::Destroy (); 
NS_LOG_INFO (“Done.”);

}

Output: