examples/netfilter-example.cc
author Qasim Javed <qasimj@gmail.com>
Thu Aug 06 11:34:29 2009 +0600 (2009-08-06)
changeset 4640 b6d772135f43
parent 4637 0882bb6eac0b
permissions -rw-r--r--
Updated the NAT example (examples/netfilter-example.cc)
qasimj@4637
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
qasimj@4637
     2
/*
qasimj@4637
     3
 * This program is free software; you can redistribute it and/or modify
qasimj@4637
     4
 * it under the terms of the GNU General Public License version 2 as
qasimj@4637
     5
 * published by the Free Software Foundation;
qasimj@4637
     6
 *
qasimj@4637
     7
 * This program is distributed in the hope that it will be useful,
qasimj@4637
     8
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
qasimj@4637
     9
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
qasimj@4637
    10
 * GNU General Public License for more details.
qasimj@4637
    11
 *
qasimj@4637
    12
 * You should have received a copy of the GNU General Public License
qasimj@4637
    13
 * along with this program; if not, write to the Free Software
qasimj@4637
    14
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
qasimj@4637
    15
 */
qasimj@4637
    16
qasimj@4637
    17
#include "ns3/core-module.h"
qasimj@4637
    18
#include "ns3/simulator-module.h"
qasimj@4637
    19
#include "ns3/node-module.h"
qasimj@4637
    20
#include "ns3/helper-module.h"
qasimj@4637
    21
#include "ns3/global-route-manager.h"
qasimj@4637
    22
#include "ns3/on-off-helper.h"
qasimj@4637
    23
#include "ns3/v4ping-helper.h"
qasimj@4640
    24
#include "ns3/ipv4-l3-protocol.h"
qasimj@4637
    25
qasimj@4637
    26
using namespace ns3;
qasimj@4637
    27
qasimj@4637
    28
NS_LOG_COMPONENT_DEFINE ("NetfilterExample");
qasimj@4637
    29
qasimj@4637
    30
  int 
qasimj@4637
    31
main (int argc, char *argv[])
qasimj@4637
    32
{
qasimj@4637
    33
  LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
qasimj@4637
    34
  LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
qasimj@4637
    35
qasimj@4637
    36
  uint16_t port = 9;
qasimj@4637
    37
qasimj@4637
    38
  NodeContainer first;
qasimj@4637
    39
  first.Create (2);
qasimj@4637
    40
qasimj@4637
    41
  NodeContainer second;
qasimj@4637
    42
  second.Add ( first.Get (1) );
qasimj@4637
    43
  second.Create (1);
qasimj@4637
    44
qasimj@4637
    45
  Packet::EnablePrinting();
qasimj@4637
    46
qasimj@4637
    47
  PointToPointHelper pointToPoint;
qasimj@4637
    48
  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
qasimj@4637
    49
  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
qasimj@4637
    50
qasimj@4637
    51
qasimj@4637
    52
  //V4PingHelper ping ( Ipv4Address ("10.2.2.2"));
qasimj@4637
    53
qasimj@4637
    54
  NetDeviceContainer devices1;
qasimj@4637
    55
  devices1 = pointToPoint.Install (first);
qasimj@4637
    56
  
qasimj@4637
    57
  NetDeviceContainer devices2;
qasimj@4637
    58
  devices2 = pointToPoint.Install (second);
qasimj@4637
    59
qasimj@4637
    60
  InternetStackHelper stack;
qasimj@4637
    61
  stack.Install (first);
qasimj@4637
    62
  stack.Install (second.Get(1));
qasimj@4637
    63
qasimj@4637
    64
  Ipv4AddressHelper address1;
qasimj@4640
    65
  address1.SetBase ("192.168.1.0", "255.255.255.0");
qasimj@4637
    66
  
qasimj@4637
    67
  Ipv4AddressHelper address2;
qasimj@4640
    68
  address2.SetBase ("203.82.48.0", "255.255.255.0");
qasimj@4637
    69
qasimj@4637
    70
  Ipv4InterfaceContainer firstInterfaces = address1.Assign (devices1);
qasimj@4640
    71
  Ipv4InterfaceContainer secondInterfaces = address2.Assign (devices2);
qasimj@4640
    72
qasimj@4640
    73
  Ptr <Ipv4> ipv4 = first.Get (1)->GetObject<Ipv4> ();
qasimj@4640
    74
  std::cout << "Number of interfaces on node " << first.Get (1)->GetId () << ": " << ipv4->GetNInterfaces () << std::endl;
qasimj@4640
    75
qasimj@4640
    76
  Ptr <Ipv4L3Protocol> ipv4L3 = DynamicCast <Ipv4L3Protocol>(first.Get (1)->GetObject<Ipv4> ());
qasimj@4640
    77
  Ipv4Netfilter *netfilter = ipv4L3->GetNetfilter ();
qasimj@4640
    78
  netfilter->EnableNat ();
qasimj@4640
    79
  std::cout << "Adding rule at node " << first.Get (1)->GetId () << ", device " << first.Get (1)->GetDevice (1)->GetIfIndex () << std::endl;
qasimj@4640
    80
  netfilter->AddNatRule ( NatRule (Ipv4Address ("192.168.1.1"), Ipv4Address ("203.82.48.1"), first.Get (1)->GetDevice (1)));
qasimj@4637
    81
qasimj@4637
    82
  UdpEchoServerHelper echoServer (9);
qasimj@4637
    83
qasimj@4640
    84
  ApplicationContainer serverApps = echoServer.Install (second.Get (1));
qasimj@4637
    85
  serverApps.Start (Seconds (1.0));
qasimj@4637
    86
  serverApps.Stop (Seconds (10.0));
qasimj@4637
    87
qasimj@4640
    88
  UdpEchoClientHelper echoClient (secondInterfaces.GetAddress (1), 9);
qasimj@4637
    89
  echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
qasimj@4637
    90
  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.)));
qasimj@4640
    91
  echoClient.SetAttribute ("PacketSize", UintegerValue (512));
qasimj@4637
    92
qasimj@4640
    93
  ApplicationContainer clientApps = echoClient.Install (first.Get (0));
qasimj@4637
    94
  clientApps.Start (Seconds (2.0));
qasimj@4637
    95
  clientApps.Stop (Seconds (10.0));
qasimj@4637
    96
qasimj@4637
    97
  OnOffHelper onOff ( "ns3::TcpSocketFactory", 
qasimj@4640
    98
                      Address (InetSocketAddress ("192.168.1.1", port)));
qasimj@4637
    99
  onOff.SetAttribute ("MaxBytes", UintegerValue (512));
qasimj@4637
   100
qasimj@4637
   101
  ApplicationContainer onOffApp = onOff.Install (second.Get (1));
qasimj@4637
   102
qasimj@4637
   103
  PacketSinkHelper packetSink ( "ns3::TcpSocketFactory",
qasimj@4640
   104
                                Address (InetSocketAddress ("192.168.1.1", port)));
qasimj@4637
   105
qasimj@4637
   106
  ApplicationContainer packetSinkApp = packetSink.Install (first.Get (0));
qasimj@4637
   107
qasimj@4640
   108
  /*packetSinkApp.Start (Seconds (2.0));
qasimj@4637
   109
  packetSinkApp.Stop (Seconds (4.0));
qasimj@4637
   110
qasimj@4637
   111
  onOffApp.Start (Seconds (3.0));
qasimj@4640
   112
  onOffApp.Stop (Seconds (4.0));*/
qasimj@4637
   113
qasimj@4637
   114
  /*ApplicationContainer pingApp = ping.Install (first.Get (0));
qasimj@4637
   115
  pingApp.Start (Seconds (3.0));
qasimj@4637
   116
  pingApp.Stop (Seconds (4.0));*/
qasimj@4637
   117
qasimj@4637
   118
  GlobalRouteManager::PopulateRoutingTables ();
qasimj@4637
   119
qasimj@4637
   120
  PointToPointHelper::EnablePcapAll ("netfilter");
qasimj@4637
   121
qasimj@4637
   122
  Simulator::Run ();
qasimj@4637
   123
  Simulator::Destroy ();
qasimj@4637
   124
  return 0;
qasimj@4637
   125
}