Files
unison/examples/routing-table-test.cc
2009-03-18 22:36:12 +03:00

294 lines
12 KiB
C++

/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2009 IITP RAS
*
* 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: Kirill Andreev <andreev@iitp.ru>
*/
#include <iostream>
#include <fstream>
#include "ns3/core-module.h"
#include <vector>
#include "ns3/mac48-address.h"
#include "ns3/simulator-module.h"
#include <string.h>
#include "ns3/hwmp-rtable.h"
using namespace ns3;
NS_LOG_COMPONENT_DEFINE ("RoutingTableTest");
void
aux_function (Ptr<HwmpRtable> ptr, Mac48Address addr, std::vector<bool> *results, std::vector<Time> *seconds)
{
if (ptr->LookupReactive (addr).retransmitter.IsBroadcast () && ptr->LookupReactive (addr).metric == 0xffffffff)
results->push_back (false);
else
results->push_back (true);
seconds->push_back (Simulator::Now ());
NS_LOG_UNCOND ("Reactive retransmitter is " << ptr->LookupReactive (addr).retransmitter <<
"\nport is " << ptr->LookupReactive (addr).ifIndex <<
"\nmetric is " << ptr->LookupReactive (addr).metric <<
"\nseqnum is " << ptr->LookupReactive (addr).seqnum);
NS_LOG_UNCOND ("Checked at " << Simulator::Now ().GetSeconds () << " seconds\n\n");
};
void
aux_function1 (Ptr<HwmpRtable> ptr, uint32_t port, std::vector<bool> *results, std::vector<Time> *seconds)
{
if (ptr->LookupProactive (port).retransmitter.IsBroadcast () && ptr->LookupProactive (port).metric == 0xffffffff)
results->push_back (false);
else
results->push_back (true);
seconds->push_back (Simulator::Now ());
NS_LOG_UNCOND ("Proactive retransmitter is " << ptr->LookupProactive (port).retransmitter <<
"\nport is " << ptr->LookupProactive (port).ifIndex <<
"\nmetric is " << ptr->LookupProactive (port).metric <<
"\nseqnum is " << ptr->LookupProactive (port).seqnum);
NS_LOG_UNCOND ("Checked at " << Simulator::Now ().GetSeconds () << " seconds\n\n");
};
void
print_results (std::vector<bool> *results, std::vector<Time> *seconds)
{
NS_LOG_UNCOND ("Fulfilled " << results->size () << " tests\n");
for (unsigned int i = 0; i != results->size (); i++)
{
NS_LOG_UNCOND ("Result: " << results->at (i));
NS_LOG_UNCOND ("Tested at " << seconds->at (i).GetSeconds () << " seconds\n");
}
}
void
get_conclusion (std::vector<bool> *results)
{
if (
results->at (0)
&& results->at (1)
&& results->at (2)
&& results->at (3)
&& results->at (4)
&& results->at (5)
&& results->at (6)
&& results->at (7)
&& !results->at (8)
&& !results->at (9)
&& !results->at (10)
&& !results->at (11)
&& !results->at (12)
&& !results->at (13)
&& !results->at (14))
NS_LOG_UNCOND ("\n\n\nPASSED\n\n\n");
else
NS_LOG_UNCOND ("\n\n\nNOT PASSED\n\n\n");
}
int main (int argc, char *argv[])
{
// Create Table
Ptr<HwmpRtable> table = CreateObject<HwmpRtable> ();
std::vector<bool> test_results = std::vector<bool> ();
std::vector<Time> test_time = std::vector<Time> ();
//Add reactive paths
table->AddReactivePath (Mac48Address ("01:00:00:01:00:01"), Mac48Address ("01:00:00:01:00:03"), 8010, 10, Seconds (20), 1);
table->AddReactivePath (Mac48Address ("01:00:00:02:00:01"), Mac48Address ("01:00:00:02:00:03"), 8020, 20, Seconds (30), 2);
// table->AddReactivePath (Mac48Address("01:00:00:03:00:01"),Mac48Address("01:00:00:03:00:03"),8030,30,Seconds(30),3);
// table->AddReactivePath (Mac48Address("01:00:00:04:00:01"),Mac48Address("01:00:00:04:00:03"),8040,40,Seconds(35),4);
//Add proactive paths
table->AddProactivePath (10, Mac48Address ("01:00:00:01:00:01"), Mac48Address ("01:00:00:01:00:03"), 8010, Seconds (20), 1);
table->AddProactivePath (20, Mac48Address ("01:00:00:02:00:01"), Mac48Address ("01:00:00:02:00:03"), 8020, Seconds (30), 2);
table->AddProactivePath (30, Mac48Address ("01:00:00:03:00:01"), Mac48Address ("01:00:00:03:00:03"), 8030, Seconds (20), 3);
table->AddProactivePath (40, Mac48Address ("01:00:00:04:00:01"), Mac48Address ("01:00:00:04:00:03"), 8040, Seconds (30), 4);
Simulator::Schedule (Seconds (0.0),
&aux_function,
table,
Mac48Address ("01:00:00:01:00:01"),
&test_results,
&test_time);
Simulator::Schedule (Seconds (0.0),
&aux_function1,
table,
8010,
&test_results,
&test_time);
Simulator::Schedule (Seconds (0.0),
&aux_function,
table,
Mac48Address ("01:00:00:02:00:01"),
&test_results,
&test_time);
Simulator::Schedule (Seconds (0.0),
&aux_function1,
table,
8020,
&test_results,
&test_time);
Simulator::Schedule (Seconds (1.0),
&aux_function,
table,
Mac48Address ("01:00:00:01:00:01"),
&test_results,
&test_time);
Simulator::Schedule (Seconds (1.0),
&aux_function1,
table,
8010,
&test_results,
&test_time);
Simulator::Schedule (Seconds (1.0),
&aux_function,
table,
Mac48Address ("01:00:00:02:00:01"),
&test_results,
&test_time);
Simulator::Schedule (Seconds (1.0),
&aux_function1,
table,
8020,
&test_results,
&test_time);
//Print routing info
NS_LOG_UNCOND ("Added reactive path number " <<
table->LookupReactive (Mac48Address ("01:00:00:01:00:01")).seqnum <<
" at dest " <<
table->LookupReactive (Mac48Address ("01:00:00:01:00:01")).retransmitter <<
" with metric " <<
table->LookupReactive (Mac48Address ("01:00:00:01:00:01")).metric << "\n");
NS_LOG_UNCOND ("Added reactive path number " <<
table->LookupReactive (Mac48Address ("01:00:00:02:00:01")).seqnum <<
" at dest " <<
table->LookupReactive (Mac48Address ("01:00:00:02:00:01")).retransmitter <<
" with metric " <<
table->LookupReactive (Mac48Address ("01:00:00:02:00:01")).metric << "\n");
NS_LOG_UNCOND ("Added reactive path number " <<
table->LookupReactive (Mac48Address ("01:00:00:03:00:01")).seqnum <<
" at dest " <<
table->LookupReactive (Mac48Address ("01:00:00:03:00:01")).retransmitter <<
" with metric " <<
table->LookupReactive (Mac48Address ("01:00:00:03:00:01")).metric << "\n");
NS_LOG_UNCOND ("Added reactive path number " <<
table->LookupReactive (Mac48Address ("01:00:00:04:00:01")).seqnum <<
" at dest " <<
table->LookupReactive (Mac48Address ("01:00:00:04:00:01")).retransmitter <<
" with metric " << table->LookupReactive (Mac48Address ("01:00:00:04:00:01")).metric <<"\n");
NS_LOG_UNCOND ("Added proactive path number " <<
table->LookupProactive (8010).seqnum <<
" with retr " <<
table->LookupProactive (8010).retransmitter <<
" at port " <<
table->LookupProactive (8010).ifIndex <<
" with metric " <<
table->LookupProactive (8010).metric << "\n");
NS_LOG_UNCOND ("Added proactive path number " <<
table->LookupProactive (8020).seqnum <<
" with retr " <<
table->LookupProactive (8020).retransmitter <<
" at port " <<
table->LookupProactive (8020).ifIndex <<
" with metric " <<
table->LookupProactive (8020).metric <<"\n");
NS_LOG_UNCOND ("Added proactive path number " <<
table->LookupProactive (8030).seqnum <<
" with retr " <<
table->LookupProactive (8030).retransmitter <<
" at port " <<
table->LookupProactive (8030).ifIndex <<
" with metric " <<
table->LookupProactive (8030).metric << "\n");
NS_LOG_UNCOND ("Added proactive path number " <<
table->LookupProactive (8040).seqnum <<
" with retr " <<
table->LookupProactive (8040).retransmitter <<
" at port " <<
table->LookupProactive (8040).ifIndex <<
" with metric " <<
table->LookupProactive (8040).metric << "\n");
table->DeleteProactivePath (8030);
table->DeleteProactivePath (Mac48Address ("01:00:00:04:00:01"), 8040);
Simulator::Schedule (Seconds (1.0),
&aux_function1,
table,
8030,
&test_results,
&test_time);
Simulator::Schedule (Seconds (1.0),
&aux_function1,
table,
8040,
&test_results,
&test_time);
Simulator::Schedule (Seconds (10.0),
&HwmpRtable::DeleteReactivePath,
table,
Mac48Address ("01:00:00:02:00:01"),
8020);
Simulator::Schedule (Seconds (15.0),
&aux_function,
table,
Mac48Address ("01:00:00:02:00:01"),
&test_results,
&test_time);
Simulator::Schedule (Seconds (25.0),
&aux_function,
table,
Mac48Address ("01:00:00:01:00:01"),
&test_results,
&test_time);
Simulator::Schedule (Seconds (25.0),
&aux_function,
table,
Mac48Address ("01:00:00:02:00:01"),
&test_results,
&test_time);
Simulator::Schedule (Seconds (25.0),
&aux_function1,
table,
8010,
&test_results,
&test_time);
Simulator::Schedule (Seconds (30.0),
&aux_function,
table,
Mac48Address ("01:00:00:01:00:01"),
&test_results,
&test_time);
Simulator::Schedule (Seconds (40.0),
&print_results,
&test_results,
&test_time);
Simulator::Schedule (Seconds (41.0),
&get_conclusion,
&test_results);
Simulator::Run ();
Simulator::Destroy ();
return 0;
}