1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
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;
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.
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
17 #include "ns3/core-module.h"
18 #include "ns3/simulator-module.h"
19 #include "ns3/node-module.h"
20 #include "ns3/helper-module.h"
21 #include "ns3/global-route-manager.h"
22 #include "ns3/on-off-helper.h"
23 #include "ns3/v4ping-helper.h"
24 #include "ns3/ipv4-l3-protocol.h"
28 NS_LOG_COMPONENT_DEFINE ("NetfilterExample");
31 main (int argc, char *argv[])
33 LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
34 LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
42 second.Add ( first.Get (1) );
45 Packet::EnablePrinting();
47 PointToPointHelper pointToPoint;
48 pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
49 pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
52 //V4PingHelper ping ( Ipv4Address ("10.2.2.2"));
54 NetDeviceContainer devices1;
55 devices1 = pointToPoint.Install (first);
57 NetDeviceContainer devices2;
58 devices2 = pointToPoint.Install (second);
60 InternetStackHelper stack;
61 stack.Install (first);
62 stack.Install (second.Get(1));
64 Ipv4AddressHelper address1;
65 address1.SetBase ("192.168.1.0", "255.255.255.0");
67 Ipv4AddressHelper address2;
68 address2.SetBase ("203.82.48.0", "255.255.255.0");
70 Ipv4InterfaceContainer firstInterfaces = address1.Assign (devices1);
71 Ipv4InterfaceContainer secondInterfaces = address2.Assign (devices2);
73 Ptr <Ipv4> ipv4 = first.Get (1)->GetObject<Ipv4> ();
74 std::cout << "Number of interfaces on node " << first.Get (1)->GetId () << ": " << ipv4->GetNInterfaces () << std::endl;
76 Ptr <Ipv4L3Protocol> ipv4L3 = DynamicCast <Ipv4L3Protocol>(first.Get (1)->GetObject<Ipv4> ());
77 Ipv4Netfilter *netfilter = ipv4L3->GetNetfilter ();
78 netfilter->EnableNat ();
79 std::cout << "Adding rule at node " << first.Get (1)->GetId () << ", device " << first.Get (1)->GetDevice (1)->GetIfIndex () << std::endl;
80 netfilter->AddNatRule ( NatRule (Ipv4Address ("192.168.1.1"), Ipv4Address ("203.82.48.1"), first.Get (1)->GetDevice (1)));
82 UdpEchoServerHelper echoServer (9);
84 ApplicationContainer serverApps = echoServer.Install (second.Get (1));
85 serverApps.Start (Seconds (1.0));
86 serverApps.Stop (Seconds (10.0));
88 UdpEchoClientHelper echoClient (secondInterfaces.GetAddress (1), 9);
89 echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
90 echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.)));
91 echoClient.SetAttribute ("PacketSize", UintegerValue (512));
93 ApplicationContainer clientApps = echoClient.Install (first.Get (0));
94 clientApps.Start (Seconds (2.0));
95 clientApps.Stop (Seconds (10.0));
97 OnOffHelper onOff ( "ns3::TcpSocketFactory",
98 Address (InetSocketAddress ("192.168.1.1", port)));
99 onOff.SetAttribute ("MaxBytes", UintegerValue (512));
101 ApplicationContainer onOffApp = onOff.Install (second.Get (1));
103 PacketSinkHelper packetSink ( "ns3::TcpSocketFactory",
104 Address (InetSocketAddress ("192.168.1.1", port)));
106 ApplicationContainer packetSinkApp = packetSink.Install (first.Get (0));
108 /*packetSinkApp.Start (Seconds (2.0));
109 packetSinkApp.Stop (Seconds (4.0));
111 onOffApp.Start (Seconds (3.0));
112 onOffApp.Stop (Seconds (4.0));*/
114 /*ApplicationContainer pingApp = ping.Install (first.Get (0));
115 pingApp.Start (Seconds (3.0));
116 pingApp.Stop (Seconds (4.0));*/
118 GlobalRouteManager::PopulateRoutingTables ();
120 PointToPointHelper::EnablePcapAll ("netfilter");
123 Simulator::Destroy ();