--- a/examples/ipv6/Mldv2-example.cc Sun Aug 03 14:14:27 2014 +0530
+++ b/examples/ipv6/Mldv2-example.cc Thu Aug 07 13:15:43 2014 +0530
@@ -88,22 +88,27 @@
TypeId tid = TypeId::LookupByName ("ns3::Ipv6RawSocketFactory");
Ptr<Socket> socketOne = Socket::CreateSocket (n.Get (0), tid);
Ptr<Socket> socketTwo = Socket::CreateSocket (n.Get (0), tid);
+ Ptr<Socket> socketThree = Socket::CreateSocket (n.Get (0), tid);
AsciiTraceHelper ascii;
csma.EnableAsciiAll (ascii.CreateFileStream ("mldv2.tr"));
csma.EnablePcapAll (std::string ("mldv2"), false);
NS_LOG_INFO ("Run Simulation.");
- std::vector<Ipv6Address> sourceAddresses,sourceAddressesTwo;
- Ipv6Address multicastAddressOne ="2001::1";
- Ipv6Address multicastAddressTwo ="2001::2";
- sourceAddresses.push_back (Ipv6Address ("1111::1"));
- sourceAddresses.push_back (Ipv6Address ("1113::1"));
- sourceAddressesTwo.push_back (Ipv6Address ("1111::1"));
- sourceAddressesTwo.push_back (Ipv6Address ("1112::1"));
- Simulator::Schedule (Seconds (2), &Include,socketTwo,multicastAddressOne,sourceAddressesTwo);
+ vector<Ipv6Address> add1,add2,add3;
+ add1.push_back (Ipv6Address ("2001::1"));
+ add1.push_back (Ipv6Address ("2002::1"));
+ add1.push_back (Ipv6Address ("2003::1"));
+ add2.push_back (Ipv6Address ("2002::1"));
+ add2.push_back (Ipv6Address ("2003::1"));
+ add2.push_back (Ipv6Address ("2004::1"));
+ add3.push_back (Ipv6Address ("2003::1"));
+ add3.push_back (Ipv6Address ("2004::1"));
+ add3.push_back (Ipv6Address ("2005::1"));
+ Simulator::Schedule (Seconds (1), &Exclude,socketOne,Ipv6Address ("2007::1"),add1);
+ Simulator::Schedule (Seconds (2), &Exclude,socketTwo,Ipv6Address ("2007::1"),add2);
+ Simulator::Schedule (Seconds (3), &Include,socketThree,Ipv6Address ("2007::1"),add3);
- Simulator::Schedule (Seconds (3), &Exclude,socketOne,multicastAddressOne,sourceAddresses);
Simulator::Stop (Seconds (100));
Simulator::Run ();
Simulator::Destroy ();
--- a/src/internet/model/ipv6-list-routing.cc Sun Aug 03 14:14:27 2014 +0530
+++ b/src/internet/model/ipv6-list-routing.cc Thu Aug 07 13:15:43 2014 +0530
@@ -129,8 +129,8 @@
}
/* do not forward link-local multicast address */
- if (dst == Ipv6Address::GetAllNodesMulticast () || dst == Ipv6Address::GetAllRoutersMulticast () || dst == Ipv6Address::GetAllHostsMulticast ())
- {
+ if (dst.IsLinkLocalMulticast ())
+ {
return retVal;
}
--- a/src/internet/model/ipv6-static-routing.cc Sun Aug 03 14:14:27 2014 +0530
+++ b/src/internet/model/ipv6-static-routing.cc Thu Aug 07 13:15:43 2014 +0530
@@ -285,9 +285,7 @@
uint32_t shortestMetric = 0xffffffff;
/* when sending on link-local multicast, there have to be interface specified */
- if (dst == Ipv6Address::GetAllNodesMulticast () || dst.IsSolicitedMulticast ()
- || dst == Ipv6Address::GetAllRoutersMulticast () || dst == Ipv6Address::GetAllHostsMulticast ()
- || dst == Ipv6Address::GetAllMldv2RoutersMulticast ())
+ if (dst.IsLinkLocalMulticast ())
{
NS_ASSERT_MSG (interface, "Try to send on link-local multicast address, and no interface index is given!");
rtentry = Create<Ipv6Route> ();
--- a/src/internet/model/mldv2-router-entry.cc Sun Aug 03 14:14:27 2014 +0530
+++ b/src/internet/model/mldv2-router-entry.cc Thu Aug 07 13:15:43 2014 +0530
@@ -1,4 +1,4 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2014-2015 International Institute Of Information Technology - Hyderabad
*
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Author: Krishna Teja Yadavalli <ykrishnateja93@gmail.com>
+ * Author: Krishna Teja <ykrishnateja93@gmail.com>
*/
#include "ns3/socket.h"
@@ -36,7 +36,7 @@
void Mldv2RouterEntry::DoDispose ()
{
NS_LOG_FUNCTION (this);
- map<Ipv6Address,Timer>::iterator it;
+ map<Ipv6Address, Timer>::iterator it;
for(it=m_sourceTimers.begin (); it!=m_sourceTimers.end (); it++)
{
if(it->second.IsRunning ())
@@ -46,8 +46,8 @@
}
m_sourceTimers.clear ();
}
-Mldv2RouterEntry::Mldv2RouterEntry(uint32_t interfaceIndex,Ipv6Address multicastAddress,
- Mldv2RouterEntry::FilterMode filterMode,vector<Ipv6Address> sourceAddress)
+Mldv2RouterEntry::Mldv2RouterEntry(uint32_t interfaceIndex, Ipv6Address multicastAddress,
+ Mldv2RouterEntry::FilterMode filterMode, vector<Ipv6Address> sourceAddress)
{
NS_LOG_FUNCTION (this);
@@ -59,7 +59,7 @@
vector<Ipv6Address>::iterator it;
for(it=sourceAddress.begin (); it!=sourceAddress.end (); it++)
{
- m_sourceTimers.insert (make_pair (*it,Timer ()));
+ m_sourceTimers.insert (make_pair (*it, Timer ()));
}
@@ -69,7 +69,7 @@
{
NS_LOG_FUNCTION (this);
- map<Ipv6Address,Timer>::iterator it;
+ map<Ipv6Address, Timer>::iterator it;
vector<Ipv6Address>::iterator sourceAddress;
vector<Ipv6Address> tempSourceAddresses;
for(sourceAddress=m_sourceAddress.begin (); sourceAddress!=m_sourceAddress.end (); sourceAddress++)
@@ -87,7 +87,7 @@
{
NS_LOG_FUNCTION (this);
- map<Ipv6Address,Timer>::iterator it;
+ map<Ipv6Address, Timer>::iterator it;
vector<Ipv6Address>::iterator sourceAddress;
vector<Ipv6Address> tempSourceAddresses;
for(sourceAddress=m_sourceAddress.begin (); sourceAddress!=m_sourceAddress.end (); sourceAddress++)
@@ -117,20 +117,20 @@
void Mldv2RouterEntry::DeleteSourceAddresses (vector<Ipv6Address> sourceAddresses)
{
NS_LOG_FUNCTION (this);
-
- map<Ipv6Address,Timer>::iterator it;
+ map<Ipv6Address, Timer>::iterator it;
vector<Ipv6Address>::iterator sourceAddress;
for(sourceAddress=sourceAddresses.begin (); sourceAddress!=sourceAddresses.end (); sourceAddress++)
{
+
it=m_sourceTimers.find (*sourceAddress);
NS_ASSERT (it!=m_sourceTimers.end ());
- it=m_sourceTimers.find (*sourceAddress);
it->second.Cancel ();
m_sourceTimers.erase (*sourceAddress);
}
vector<Ipv6Address> tempSourceAddresses;
for(sourceAddress=m_sourceAddress.begin (); sourceAddress!=m_sourceAddress.end (); sourceAddress++)
{
+
it=m_sourceTimers.find (*sourceAddress);
if(it!=m_sourceTimers.end ())
{
@@ -138,13 +138,14 @@
}
}
+ m_sourceAddress.clear ();
m_sourceAddress=tempSourceAddresses;
}
bool Mldv2RouterEntry::LookUpSourceAddress (Ipv6Address address)
{
NS_LOG_FUNCTION (this);
- map<Ipv6Address,Timer>::iterator it=m_sourceTimers.find (address);
+ map<Ipv6Address, Timer>::iterator it=m_sourceTimers.find (address);
if( it != m_sourceTimers.end ())
{
return true;
@@ -155,30 +156,33 @@
void Mldv2RouterEntry::UpdateSourceAddressesTimers (vector<Ipv6Address> sourceAddress, Time interval)
{
NS_LOG_FUNCTION (this);
-
vector<Ipv6Address>::iterator sourceIterator;
- map<Ipv6Address,Timer>::iterator it;
+ map<Ipv6Address, Timer>::iterator it;
//Inserting the source addresses which are not present in the Entry
for(sourceIterator=sourceAddress.begin (); sourceIterator!=sourceAddress.end (); sourceIterator++)
{
it=m_sourceTimers.find (*sourceIterator);
if(it==m_sourceTimers.end ())
{
- m_sourceTimers.insert (make_pair (*sourceIterator,Timer ()));
+ m_sourceTimers.insert (make_pair (*sourceIterator, Timer ()));
m_sourceAddress.push_back (*sourceIterator);
}
}
- for(it=m_sourceTimers.begin (); it!=m_sourceTimers.end (); it++)
+ for(sourceIterator=sourceAddress.begin (); sourceIterator!=sourceAddress.end (); sourceIterator++)
{
- if(it->second.IsRunning ())
+ it=m_sourceTimers.find (*sourceIterator);
+ if(it != m_sourceTimers.end ())
{
- it->second.Remove ();
+ if(it->second.IsRunning ())
+ {
+ (*it).second.Remove ();
+ }
+ (*it).second.SetFunction (&Mldv2RouterEntry::SourceEntryTimerExpired, this);
+ (*it).second.SetArguments (it->first);
+ (*it).second.SetDelay (interval);
+ (*it).second.Schedule ();
}
- it->second.SetFunction (&Mldv2RouterEntry::SourceEntryTimerExpired,this);
- it->second.SetArguments (it->first);
- it->second.SetDelay (interval);
- it->second.Schedule ();
}
@@ -187,7 +191,7 @@
}
void Mldv2RouterEntry::SetFilterMode (FilterMode filterMode)
{
- map<Ipv6Address,Timer>::iterator it;
+ map<Ipv6Address, Timer>::iterator it;
vector<Ipv6Address> requiredRecords;
if(m_filterMode == EXCLUDEMODE && filterMode == INCLUDEMODE)
{
@@ -210,13 +214,14 @@
void Mldv2RouterEntry::SourceEntryTimerExpired (Ipv6Address sourceAddress)
{
NS_LOG_FUNCTION (this);
- map<Ipv6Address,Timer>::iterator it=m_sourceTimers.find (sourceAddress);
+ map<Ipv6Address, Timer>::iterator it=m_sourceTimers.find (sourceAddress);
- if(m_filterMode==INCLUDEMODE)
+ if(m_filterMode == INCLUDEMODE)
{
m_sourceTimers.erase (it);
+ m_sourceAddress.erase (std::remove (m_sourceAddress.begin (), m_sourceAddress.end (), sourceAddress), m_sourceAddress.end ());
+
}
- m_sourceAddress.erase (std::remove (m_sourceAddress.begin (), m_sourceAddress.end (), sourceAddress), m_sourceAddress.end ());
}
};
--- a/src/internet/model/mldv2-router-entry.h Sun Aug 03 14:14:27 2014 +0530
+++ b/src/internet/model/mldv2-router-entry.h Thu Aug 07 13:15:43 2014 +0530
@@ -6,7 +6,7 @@
* 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,
+ * 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.
@@ -52,7 +52,7 @@
*/
enum FilterMode
{
- INCLUDEMODE=1,
+ INCLUDEMODE=1,
EXCLUDEMODE
};
@@ -63,8 +63,8 @@
* \param filterMode Filtermode of the entry.
* \param sourceAddress Source Addresses of the entry.
*/
- Mldv2RouterEntry (uint32_t interfaceIndex,Ipv6Address multicastAddress,
- FilterMode filterMode,vector<Ipv6Address> sourceAddress);
+ Mldv2RouterEntry (uint32_t interfaceIndex, Ipv6Address multicastAddress,
+ FilterMode filterMode, vector<Ipv6Address> sourceAddress);
/**
* \brief Destructor.
@@ -87,7 +87,7 @@
* \brief Updating the list of source addresses with give time.
* \param interval Time to which source times must be updated.
*/
- void UpdateSourceAddressesTimers (vector<Ipv6Address> adddresses,Time interval);
+ void UpdateSourceAddressesTimers (vector<Ipv6Address> adddresses, Time interval);
/**
* \brief Lookup for source address.
@@ -134,7 +134,7 @@
uint32_t m_interfaceIndex; //!< Interface address.
Ipv6Address m_multicastAddress; //!< Multicast address.
FilterMode m_filterMode; //!< Filter mode .
- map<Ipv6Address,Timer> m_sourceTimers; //!< Timers of the respective source address.
+ map<Ipv6Address, Timer> m_sourceTimers; //!< Timers of the respective source address.
};
}
--- a/src/internet/model/mldv2-router-table.cc Sun Aug 03 14:14:27 2014 +0530
+++ b/src/internet/model/mldv2-router-table.cc Thu Aug 07 13:15:43 2014 +0530
@@ -1,4 +1,4 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2014-2015 International Institute Of Information Technology - Hyderabad
*
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Author: Krishna Teja Yadavalli <ykrishnateja93@gmail.com>
+ * Author: Krishna Teja <ykrishnateja93@gmail.com>
*/
#include "ipv6-interface.h"
@@ -37,20 +37,20 @@
}
-bool Mldv2RouterTable::LookupEntry (uint32_t interfaceIndex,Ipv6Address multicastAddress)
+bool Mldv2RouterTable::LookupEntry (uint32_t interfaceIndex, Ipv6Address multicastAddress)
{
NS_LOG_FUNCTION (this);
- map<pair<uint32_t,Ipv6Address>, Ptr<Mldv2RouterEntry> >::iterator it = m_entryList.find (make_pair (interfaceIndex,multicastAddress));
+ map<pair<uint32_t, Ipv6Address>, Ptr<Mldv2RouterEntry> >::iterator it = m_entryList.find (make_pair (interfaceIndex, multicastAddress));
if(it!=m_entryList.end ())
return true;
else
return false;
}
-Ptr<Mldv2RouterEntry> Mldv2RouterTable::GetMldv2Entry (uint32_t interfaceIndex,Ipv6Address multicastAddress)
+Ptr<Mldv2RouterEntry> Mldv2RouterTable::GetMldv2Entry (uint32_t interfaceIndex, Ipv6Address multicastAddress)
{
- map<pair<uint32_t,Ipv6Address>, Ptr<Mldv2RouterEntry> >::iterator index = m_entryList.find (make_pair (interfaceIndex,multicastAddress));
+ map<pair<uint32_t, Ipv6Address>, Ptr<Mldv2RouterEntry> >::iterator index = m_entryList.find (make_pair (interfaceIndex, multicastAddress));
NS_ASSERT (index != m_entryList.end ());
return index->second;
}
@@ -59,7 +59,7 @@
{
NS_LOG_FUNCTION (this);
- map<pair<uint32_t,Ipv6Address>,Timer>::iterator it;
+ map<pair<uint32_t, Ipv6Address>, Timer>::iterator it;
for(it=m_filterTimers.begin (); it!=m_filterTimers.end (); it++)
{
if(it->second.IsRunning ())
@@ -72,7 +72,7 @@
{
NS_LOG_FUNCTION (this);
- map<pair<uint32_t,Ipv6Address>, Ptr<Mldv2RouterEntry> >::iterator it;
+ map<pair<uint32_t, Ipv6Address>, Ptr<Mldv2RouterEntry> >::iterator it;
for(it=m_entryList.begin (); it!=m_entryList.end (); it++)
{
if(it->second->GetFilterMode ()==Mldv2RouterEntry::INCLUDEMODE && it->second->GetRequestedList ().size ()==0)
@@ -81,37 +81,37 @@
}
}
}
-Ptr<Mldv2RouterEntry> Mldv2RouterTable::AddMldv2Entry (uint32_t interfaceIndex,Ipv6Address multicastAddress,Mldv2RouterEntry::FilterMode filterMode
- ,vector<Ipv6Address> sourceAddresses)
+Ptr<Mldv2RouterEntry> Mldv2RouterTable::AddMldv2Entry (uint32_t interfaceIndex, Ipv6Address multicastAddress, Mldv2RouterEntry::FilterMode filterMode
+ , vector<Ipv6Address> sourceAddresses)
{
NS_LOG_FUNCTION (this);
- map<pair<uint32_t,Ipv6Address>, Ptr<Mldv2RouterEntry> >::iterator index = m_entryList.find (make_pair (interfaceIndex,multicastAddress));
+ map<pair<uint32_t, Ipv6Address>, Ptr<Mldv2RouterEntry> >::iterator index = m_entryList.find (make_pair (interfaceIndex, multicastAddress));
NS_ASSERT (index == m_entryList.end ());
- Ptr<Mldv2RouterEntry> newEntry = CreateObject<Mldv2RouterEntry>(interfaceIndex,multicastAddress,filterMode,sourceAddresses);
- m_entryList.insert (make_pair (make_pair (interfaceIndex,multicastAddress),newEntry));
- m_filterTimers.insert (make_pair (make_pair (interfaceIndex,multicastAddress),Timer ()));
+ Ptr<Mldv2RouterEntry> newEntry = CreateObject<Mldv2RouterEntry>(interfaceIndex, multicastAddress, filterMode, sourceAddresses);
+ m_entryList.insert (make_pair (make_pair (interfaceIndex, multicastAddress), newEntry));
+ m_filterTimers.insert (make_pair (make_pair (interfaceIndex, multicastAddress), Timer ()));
return newEntry;
}
-void Mldv2RouterTable::UpdateFilterTimer (uint32_t interfaceIndex,Ipv6Address multicastAddress, Time interval)
+void Mldv2RouterTable::UpdateFilterTimer (uint32_t interfaceIndex, Ipv6Address multicastAddress, Time interval)
{
NS_LOG_FUNCTION (this);
- map<pair<uint32_t,Ipv6Address >,Timer>::iterator it= m_filterTimers.find (make_pair (interfaceIndex,multicastAddress));
+ map<pair<uint32_t, Ipv6Address >, Timer>::iterator it= m_filterTimers.find (make_pair (interfaceIndex, multicastAddress));
if(it->second.IsRunning ())
{
it->second.Cancel ();
}
- it->second.SetFunction (&Mldv2RouterTable::FilterExpired,this);
- it->second.SetArguments (interfaceIndex,multicastAddress);
+ it->second.SetFunction (&Mldv2RouterTable::FilterExpired, this);
+ it->second.SetArguments (interfaceIndex, multicastAddress);
it->second.SetDelay (interval);
it->second.Schedule ();
}
-Time Mldv2RouterTable::GetEntryTimeLeft (uint32_t interfaceIndex,Ipv6Address multicastAddress)
+Time Mldv2RouterTable::GetEntryTimeLeft (uint32_t interfaceIndex, Ipv6Address multicastAddress)
{
NS_LOG_FUNCTION (this);
- map<pair<uint32_t,Ipv6Address >,Timer>::iterator it = m_filterTimers.find (make_pair (interfaceIndex,multicastAddress));
+ map<pair<uint32_t, Ipv6Address >, Timer>::iterator it = m_filterTimers.find (make_pair (interfaceIndex, multicastAddress));
return it->second.GetDelayLeft ();
}
@@ -125,8 +125,8 @@
void Mldv2RouterTable::FilterExpired (uint32_t interfaceIndex, Ipv6Address multicastAddress)
{
NS_LOG_FUNCTION (this);
- map<pair<uint32_t,Ipv6Address>, Ptr<Mldv2RouterEntry> >::iterator index;
- index = m_entryList.find (make_pair (interfaceIndex,multicastAddress));
+ map<pair<uint32_t, Ipv6Address>, Ptr<Mldv2RouterEntry> >::iterator index;
+ index = m_entryList.find (make_pair (interfaceIndex, multicastAddress));
if(index->second->GetFilterMode ()==Mldv2RouterEntry::EXCLUDEMODE)
{
index->second->SetFilterMode (Mldv2RouterEntry::INCLUDEMODE);
--- a/src/internet/model/mldv2-router-table.h Sun Aug 03 14:14:27 2014 +0530
+++ b/src/internet/model/mldv2-router-table.h Thu Aug 07 13:15:43 2014 +0530
@@ -1,4 +1,4 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2014-2015 International Institute Of Information Technology - Hyderabad
*
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Author: Krishna Teja Yadavalli <ykrishnateja93@gmail.com>
+ * Author: Krishna Teja <ykrishnateja93@gmail.com>
*/
/**
@@ -24,7 +24,7 @@
* \brief Mldv2 router table.
*
* This class helps to maintain router entries for Mldv2 protocol. This class helps to
- * maintain Mldv2 router entries these table helps in lookup ,adding new entries to it
+ * maintain Mldv2 router entries these table helps in lookup, adding new entries to it
* and also handle expiration of the filter and purging .
*/
@@ -55,7 +55,7 @@
* \param multicastAddress Multicast Address.
* \return Presence of entry.
*/
- bool LookupEntry (uint32_t interfaceIndex,Ipv6Address multicastAddress);
+ bool LookupEntry (uint32_t interfaceIndex, Ipv6Address multicastAddress);
/**
* \brief Get the corresponding router entry.
@@ -63,7 +63,7 @@
* \param multicastAddress Multicast Address.
* \return Pointer to the Mldv2 router entry.
*/
- Ptr<Mldv2RouterEntry> GetMldv2Entry (uint32_t interfaceIndex,Ipv6Address multicastAddress);
+ Ptr<Mldv2RouterEntry> GetMldv2Entry (uint32_t interfaceIndex, Ipv6Address multicastAddress);
/**
* \brief Adding a new mldv2 entry to the router table.
@@ -73,8 +73,8 @@
* \param sourceAddresses list of source addresses .
* \return Pointer to the Mldv2 router entry.
*/
- Ptr<Mldv2RouterEntry> AddMldv2Entry (uint32_t interfaceIndex,Ipv6Address multicastAddress,
- Mldv2RouterEntry::FilterMode filterMode,vector<Ipv6Address> sourceAddresses);
+ Ptr<Mldv2RouterEntry> AddMldv2Entry (uint32_t interfaceIndex, Ipv6Address multicastAddress,
+ Mldv2RouterEntry::FilterMode filterMode, vector<Ipv6Address> sourceAddresses);
/**
* \brief Updating filter timer of a entry.
@@ -82,7 +82,7 @@
* \param multicastAddress Multicast Address.
* \param interval filter timer updating time.
*/
- void UpdateFilterTimer (uint32_t interfaceIndex,Ipv6Address multicastAddress, Time interval);
+ void UpdateFilterTimer (uint32_t interfaceIndex, Ipv6Address multicastAddress, Time interval);
/**
* \brief Deletes the router entries which are expired
@@ -94,20 +94,20 @@
* \param interfaceIndex Index of the interface.
* \param multicastAddress Multicast Address.
*/
- Time GetEntryTimeLeft (uint32_t interfaceIndex,Ipv6Address multicastAddress);
+ Time GetEntryTimeLeft (uint32_t interfaceIndex, Ipv6Address multicastAddress);
private:
/**
* \brief Called when a filter timer expires.
* \param interfaceIndex Index of the interface.
* \param multicastAddress Multicast Address.
*/
- void FilterExpired (uint32_t interfaceIndex,Ipv6Address multicastAddress);
+ void FilterExpired (uint32_t interfaceIndex, Ipv6Address multicastAddress);
/**
* \brief Cancelling all the timers .
*/
virtual void DoDispose (void);
- map<pair<uint32_t,Ipv6Address>, Ptr<Mldv2RouterEntry> > m_entryList; //!< list of entries.
- map<pair<uint32_t,Ipv6Address >,Timer> m_filterTimers; //!< Timers corresponding to the router entries.
+ map<pair<uint32_t, Ipv6Address>, Ptr<Mldv2RouterEntry> > m_entryList; //!< list of entries.
+ map<pair<uint32_t, Ipv6Address >, Timer> m_filterTimers; //!< Timers corresponding to the router entries.
};
--- a/src/internet/model/mldv2.cc Sun Aug 03 14:14:27 2014 +0530
+++ b/src/internet/model/mldv2.cc Thu Aug 07 13:15:43 2014 +0530
@@ -1,4 +1,4 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2014-2015 International Institute Of Information Technology - Hyderabad
*
@@ -15,8 +15,9 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Author: Krishna Teja Yadavalli <ykrishnateja93@gmail.com>
+ * Author: Krishna Teja <ykrishnateja93@gmail.com>
*/
+
#include "mldv2.h"
#include "ns3/log.h"
#include "ipv6-l3-protocol.h"
@@ -43,11 +44,11 @@
static TypeId tid = TypeId ("ns3::Mldv2")
.SetParent<Object> ()
.AddConstructor<Mldv2> ()
- .AddAttribute ("QueryInterval", "The Time gap between General Queries",
+ .AddAttribute ("QueryInterval", "The Time gap between General Queries",
UintegerValue (30),
MakeUintegerAccessor (&Mldv2::m_queryInterval),
MakeUintegerChecker<uint8_t> ())
- .AddAttribute ("MulticastAddressListeningInterval", "The time for expiration of routing entry.",
+ .AddAttribute ("MulticastAddressListeningInterval", "The time for expiration of routing entry.",
TimeValue (Seconds (35)),
MakeTimeAccessor (&Mldv2::m_multicastAddressListeningInterval),
MakeTimeChecker ())
@@ -82,11 +83,11 @@
}
else if (query.GetSourceNumber () == 0)
{
- HandleAddressSpecificQuery (query,interfaceIndex);
+ HandleAddressSpecificQuery (query, interfaceIndex);
}
else
{
- HandleSourceSpecificQuery (query,interfaceIndex);
+ HandleSourceSpecificQuery (query, interfaceIndex);
}
}
}
@@ -105,57 +106,57 @@
p = Create<Packet> ();
Icmpv6Mldv2Report req;
req.SetMulticastRecords (records);
- req.CalculatePseudoHeaderChecksum (source, destination, p->GetSize () + req.GetSerializedSize (),58);
+ req.CalculatePseudoHeaderChecksum (source, destination, p->GetSize () + req.GetSerializedSize (), 58);
p->AddHeader (req);
m_icmpv6 = this->GetObject<Icmpv6L4Protocol> ();
- m_icmpv6->SendMessage (p,source,destination,1);
+ m_icmpv6->SendMessage (p, source, destination, 1);
}
/*
* Router State Report Received New Router State Actions
- ------------ --------------- ---------------- -------
-
-
- 1. INCLUDE (A) IS_IN (B) INCLUDE (A+B) (B)=MALI
-
- 2. INCLUDE (A) IS_EX (B) EXCLUDE (A*B, B-A) (B-A)=0
- Delete (A-B)
- Filter Timer=MALI
-
- 3. EXCLUDE (X,Y) IS_IN (A) EXCLUDE (X+A, Y-A) (A)=MALI
-
- 4.EXCLUDE (X,Y) IS_EX (A) EXCLUDE (A-Y, Y*A) (A-X-Y)=MALI
- Delete (X-A)
- Delete (Y-A)
- Filter Timer=MALI
- 5. INCLUDE (A) ALLOW (B) INCLUDE (A+B) (B)=MALI
-
- 6.INCLUDE (A) BLOCK (B) INCLUDE (A) Send Q(MA,A*B)
-
- 7.INCLUDE (A) TO_EX (B) EXCLUDE (A*B,B-A) (B-A)=0
- Delete (A-B)
- Send Q(MA,A*B)
- Filter Timer=MALI
-
- 8.INCLUDE (A) TO_IN (B) INCLUDE (A+B) (B)=MALI
- Send Q(MA,A-B)
-
- 9.EXCLUDE (X,Y) ALLOW (A) EXCLUDE (X+A,Y-A) (A)=MALI
-
- 10.EXCLUDE (X,Y) BLOCK (A) EXCLUDE (X+(A-Y),Y) (A-X-Y) =
- Filter Timer
- Send Q(MA,A-Y)
-
- 11.EXCLUDE (X,Y) TO_EX (A) EXCLUDE (A-Y,Y*A) (A-X-Y) =
- Filter Timer
- Delete (X-A)
- Delete (Y-A)
- Send Q(MA,A-Y)
- Filter Timer=MALI
-
- 12.EXCLUDE (X,Y) TO_IN (A) EXCLUDE (X+A,Y-A) (A)=MALI
- Send Q(MA,X-A)
- Send Q(MA) */
+ * ------------ --------------- ---------------- -------
+ *
+ *
+ * 1. INCLUDE (A) IS_IN (B) INCLUDE (A+B) (B)=MALI
+ *
+ * 2. INCLUDE (A) IS_EX (B) EXCLUDE (A*B, B-A) (B-A)=0
+ * Delete (A-B)
+ * Filter Timer=MALI
+ *
+ * 3. EXCLUDE (X, Y) IS_IN (A) EXCLUDE (X+A, Y-A) (A)=MALI
+ *
+ * 4.EXCLUDE (X, Y) IS_EX (A) EXCLUDE (A-Y, Y*A) (A-X-Y)=MALI
+ * Delete (X-A)
+ * Delete (Y-A)
+ * Filter Timer=MALI
+ * 5. INCLUDE (A) ALLOW (B) INCLUDE (A+B) (B)=MALI
+ *
+ * 6.INCLUDE (A) BLOCK (B) INCLUDE (A) Send Q(MA, A*B)
+ *
+ * 7.INCLUDE (A) TO_EX (B) EXCLUDE (A*B, B-A) (B-A)=0
+ * Delete (A-B)
+ * Send Q(MA, A*B)
+ * Filter Timer=MALI
+ *
+ * 8.INCLUDE (A) TO_IN (B) INCLUDE (A+B) (B)=MALI
+ * Send Q(MA, A-B)
+ *
+ * 9.EXCLUDE (X, Y) ALLOW (A) EXCLUDE (X+A, Y-A) (A)=MALI
+ *
+ * 10.EXCLUDE (X, Y) BLOCK (A) EXCLUDE (X+(A-Y), Y) (A-X-Y) =
+ * Filter Timer
+ * Send Q(MA, A-Y)
+ *
+ * 11.EXCLUDE (X, Y) TO_EX (A) EXCLUDE (A-Y, Y*A) (A-X-Y) =
+ * Filter Timer
+ * Delete (X-A)
+ * Delete (Y-A)
+ * Send Q(MA, A-Y)
+ * Filter Timer=MALI
+ *
+ * 12.EXCLUDE (X, Y) TO_IN (A) EXCLUDE (X+A, Y-A) (A)=MALI
+ * Send Q(MA, X-A)
+ * Send Q(MA) */
void Mldv2::HandleListenerReport (Ptr<Packet> p, Ptr<Ipv6Interface> interface)
@@ -171,149 +172,159 @@
{
Ptr<Mldv2RouterEntry> presentEntry;
Ipv6Address multicastAddress = (*it).multicastAddress;
- if(m_routerTable.LookupEntry (interfaceIndex,multicastAddress) == 0)
+ if(m_routerTable.LookupEntry (interfaceIndex, multicastAddress) == 0)
{
//Insert new record with Filtermode as include and empty list of source addresses
- presentEntry=m_routerTable.AddMldv2Entry (interfaceIndex,multicastAddress,Mldv2RouterEntry::INCLUDEMODE
- ,(*it).sourceAddresses);
+ presentEntry=m_routerTable.AddMldv2Entry (interfaceIndex, multicastAddress, Mldv2RouterEntry::INCLUDEMODE
+ , (*it).sourceAddresses);
}
else
{
- presentEntry=m_routerTable.GetMldv2Entry (interfaceIndex,multicastAddress);
+ presentEntry=m_routerTable.GetMldv2Entry (interfaceIndex, multicastAddress);
}
- Time filterTimeLeft=m_routerTable.GetEntryTimeLeft (interfaceIndex,multicastAddress);
+ Time filterTimeLeft=m_routerTable.GetEntryTimeLeft (interfaceIndex, multicastAddress);
vector<Ipv6Address> requestedList=presentEntry->GetRequestedList ();
+
vector<Ipv6Address> excludeList= presentEntry->GetExcludeList ();
if(presentEntry->GetFilterMode () == Mldv2RouterEntry::INCLUDEMODE
&& (*it).recordType == Icmpv6Mldv2Report::MODE_IS_INCLUDE)
{
//1
- presentEntry->UpdateSourceAddressesTimers ((*it).sourceAddresses,m_multicastAddressListeningInterval);
-
+ presentEntry->UpdateSourceAddressesTimers ((*it).sourceAddresses, m_multicastAddressListeningInterval);
+
}
else if(presentEntry->GetFilterMode () == Mldv2RouterEntry::INCLUDEMODE
&& (*it).recordType == Icmpv6Mldv2Report::MODE_IS_EXCLUDE)
{
//2
-
- vector<Ipv6Address> requiredAddresses = DifferenceOperator ((*it).sourceAddresses,requestedList); //B-A
- presentEntry->UpdateSourceAddressesTimers (requiredAddresses,Time (0)); //(B-A)=0
- requiredAddresses = DifferenceOperator (requestedList,(*it).sourceAddresses); //A-B
+
+ vector<Ipv6Address> requiredAddresses = DifferenceOperator ((*it).sourceAddresses, requestedList); //B-A
+ presentEntry->UpdateSourceAddressesTimers (requiredAddresses, Time (0)); //(B-A)=0
+ requiredAddresses = DifferenceOperator (requestedList, (*it).sourceAddresses); //A-B
presentEntry->DeleteSourceAddresses (requiredAddresses); //Delete (A-B)
- m_routerTable.UpdateFilterTimer (interfaceIndex,presentEntry->GetMulticastGroupAddress (),m_multicastAddressListeningInterval);
+ m_routerTable.UpdateFilterTimer (interfaceIndex, presentEntry->GetMulticastGroupAddress (), m_multicastAddressListeningInterval);
}
else if(presentEntry->GetFilterMode () == Mldv2RouterEntry::EXCLUDEMODE
&& (*it).recordType == Icmpv6Mldv2Report::MODE_IS_INCLUDE)
{
//3
- presentEntry->UpdateSourceAddressesTimers ((*it).sourceAddresses,m_multicastAddressListeningInterval);
+
+ presentEntry->UpdateSourceAddressesTimers ((*it).sourceAddresses, m_multicastAddressListeningInterval);
}
else if(presentEntry->GetFilterMode () == Mldv2RouterEntry::EXCLUDEMODE
&& (*it).recordType == Icmpv6Mldv2Report::MODE_IS_EXCLUDE)
{
//4
-
- vector<Ipv6Address> requiredAddresses = DifferenceOperator (DifferenceOperator ((*it).sourceAddresses,requestedList),
+
+ vector<Ipv6Address> requiredAddresses = DifferenceOperator (DifferenceOperator ((*it).sourceAddresses, requestedList),
excludeList); //A-X-Y
- presentEntry->UpdateSourceAddressesTimers (requiredAddresses,m_multicastAddressListeningInterval);
- presentEntry->DeleteSourceAddresses (DifferenceOperator (requestedList,(*it).sourceAddresses));
- presentEntry->DeleteSourceAddresses (DifferenceOperator (excludeList,(*it).sourceAddresses));
- m_routerTable.UpdateFilterTimer (interfaceIndex,presentEntry->GetMulticastGroupAddress (),m_multicastAddressListeningInterval);
-
+ presentEntry->UpdateSourceAddressesTimers (requiredAddresses, m_multicastAddressListeningInterval);
+ presentEntry->DeleteSourceAddresses (DifferenceOperator (requestedList, (*it).sourceAddresses));
+ presentEntry->DeleteSourceAddresses (DifferenceOperator (excludeList, (*it).sourceAddresses));
+ m_routerTable.UpdateFilterTimer (interfaceIndex, presentEntry->GetMulticastGroupAddress (), m_multicastAddressListeningInterval);
+
}
else if(presentEntry->GetFilterMode () == Mldv2RouterEntry::INCLUDEMODE
&& (*it).recordType == Icmpv6Mldv2Report::ALLOW_NEW_SOURCES)
{
//5
- presentEntry->UpdateSourceAddressesTimers ((*it).sourceAddresses,m_multicastAddressListeningInterval);
+
+ presentEntry->UpdateSourceAddressesTimers ((*it).sourceAddresses, m_multicastAddressListeningInterval);
}
else if(presentEntry->GetFilterMode () == Mldv2RouterEntry::INCLUDEMODE
&& (*it).recordType == Icmpv6Mldv2Report::BLOCK_OLD_SOURCES)
{
//6
- vector<Ipv6Address> requiredAddresses = IntersectionOperator ((*it).sourceAddresses,requestedList);
- SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (),requestedList);
+
+ vector<Ipv6Address> requiredAddresses = IntersectionOperator ((*it).sourceAddresses, requestedList);
+ SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (), requiredAddresses);
}
else if(presentEntry->GetFilterMode () == Mldv2RouterEntry::INCLUDEMODE
&& (*it).recordType == Icmpv6Mldv2Report::CHANGE_TO_EXCLUDE_MODE)
{
//7
+
presentEntry->SetFilterMode (Mldv2RouterEntry::EXCLUDEMODE);
- vector<Ipv6Address> requiredAddresses = DifferenceOperator ((*it).sourceAddresses,requestedList);
- presentEntry->UpdateSourceAddressesTimers (requiredAddresses,m_multicastAddressListeningInterval);
- requiredAddresses = DifferenceOperator (requestedList,(*it).sourceAddresses);
+ vector<Ipv6Address> requiredAddresses = DifferenceOperator ((*it).sourceAddresses, requestedList);
+
+ presentEntry->UpdateSourceAddressesTimers (requiredAddresses, Seconds (0));
+ requiredAddresses = DifferenceOperator (requestedList, (*it).sourceAddresses);
presentEntry->DeleteSourceAddresses (requiredAddresses);
- requiredAddresses = IntersectionOperator ((*it).sourceAddresses,requestedList);
+ requiredAddresses = IntersectionOperator ((*it).sourceAddresses, requestedList);
if(requiredAddresses.size ()!=0)
- SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (),requestedList);
- m_routerTable.UpdateFilterTimer (interfaceIndex,presentEntry->GetMulticastGroupAddress (),m_multicastAddressListeningInterval);
+ SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (), requiredAddresses);
+ m_routerTable.UpdateFilterTimer (interfaceIndex, presentEntry->GetMulticastGroupAddress (), m_multicastAddressListeningInterval);
}
else if(presentEntry->GetFilterMode () == Mldv2RouterEntry::INCLUDEMODE
&& (*it).recordType == Icmpv6Mldv2Report::CHANGE_TO_INCLUDE_MODE)
{
//8
+
presentEntry->SetFilterMode (Mldv2RouterEntry::INCLUDEMODE);
- presentEntry->UpdateSourceAddressesTimers ((*it).sourceAddresses,m_multicastAddressListeningInterval);
- vector<Ipv6Address> requiredAddresses = DifferenceOperator (requestedList,(*it).sourceAddresses);
- SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (),requestedList);
+ presentEntry->UpdateSourceAddressesTimers ((*it).sourceAddresses, m_multicastAddressListeningInterval);
+ vector<Ipv6Address> requiredAddresses = DifferenceOperator (requestedList, (*it).sourceAddresses);
+ SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (),requiredAddresses);
}
else if(presentEntry->GetFilterMode () == Mldv2RouterEntry::EXCLUDEMODE
&& (*it).recordType == Icmpv6Mldv2Report::ALLOW_NEW_SOURCES)
{
//9
- presentEntry->UpdateSourceAddressesTimers ((*it).sourceAddresses,m_multicastAddressListeningInterval);
+
+ presentEntry->UpdateSourceAddressesTimers ((*it).sourceAddresses, m_multicastAddressListeningInterval);
}
else if(presentEntry->GetFilterMode () == Mldv2RouterEntry::EXCLUDEMODE
&& (*it).recordType == Icmpv6Mldv2Report::BLOCK_OLD_SOURCES)
{
//10
- //Getting the left over filter time
- vector<Ipv6Address> requiredAddresses = DifferenceOperator (DifferenceOperator ((*it).sourceAddresses,requestedList),
+ vector<Ipv6Address> requiredAddresses = DifferenceOperator (DifferenceOperator ((*it).sourceAddresses, requestedList),
excludeList);
- presentEntry->UpdateSourceAddressesTimers (requiredAddresses,filterTimeLeft); //Change this
- requiredAddresses = DifferenceOperator ((*it).sourceAddresses,excludeList);
- SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (),requestedList);
-
+ presentEntry->UpdateSourceAddressesTimers (requiredAddresses, filterTimeLeft);
+ requiredAddresses = DifferenceOperator ((*it).sourceAddresses, excludeList);
+ if(requiredAddresses.size () != 0)
+ SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (), requiredAddresses);
+
}
else if(presentEntry->GetFilterMode () == Mldv2RouterEntry::EXCLUDEMODE
&& (*it).recordType == Icmpv6Mldv2Report::CHANGE_TO_EXCLUDE_MODE)
{
//11
+
presentEntry->SetFilterMode (Mldv2RouterEntry::EXCLUDEMODE);
- vector<Ipv6Address> requiredAddresses = DifferenceOperator (DifferenceOperator ((*it).sourceAddresses,requestedList),
+ vector<Ipv6Address> requiredAddresses = DifferenceOperator (DifferenceOperator ((*it).sourceAddresses, requestedList),
excludeList);
- presentEntry->UpdateSourceAddressesTimers (requiredAddresses,filterTimeLeft); //Change this
- presentEntry->DeleteSourceAddresses (DifferenceOperator (requestedList,(*it).sourceAddresses));
- presentEntry->DeleteSourceAddresses (DifferenceOperator (excludeList,(*it).sourceAddresses));
- requiredAddresses = DifferenceOperator ((*it).sourceAddresses,excludeList);
- SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (),requestedList);
- m_routerTable.UpdateFilterTimer (interfaceIndex,presentEntry->GetMulticastGroupAddress (),m_multicastAddressListeningInterval);
-
+ presentEntry->UpdateSourceAddressesTimers (requiredAddresses, filterTimeLeft); //Change this
+ presentEntry->DeleteSourceAddresses (DifferenceOperator (requestedList, (*it).sourceAddresses));
+ presentEntry->DeleteSourceAddresses (DifferenceOperator (excludeList, (*it).sourceAddresses));
+ requiredAddresses = DifferenceOperator ((*it).sourceAddresses, excludeList);
+ SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (), requiredAddresses);
+ m_routerTable.UpdateFilterTimer (interfaceIndex, presentEntry->GetMulticastGroupAddress (), m_multicastAddressListeningInterval);
+
}
else if(presentEntry->GetFilterMode () == Mldv2RouterEntry::EXCLUDEMODE
&& (*it).recordType == Icmpv6Mldv2Report::CHANGE_TO_INCLUDE_MODE)
{
//12
-
+
+
presentEntry->SetFilterMode (Mldv2RouterEntry::INCLUDEMODE);
- presentEntry->UpdateSourceAddressesTimers ((*it).sourceAddresses,m_multicastAddressListeningInterval);
- vector<Ipv6Address> requiredAddresses = DifferenceOperator (requestedList,(*it).sourceAddresses);
+ presentEntry->UpdateSourceAddressesTimers ((*it).sourceAddresses, m_multicastAddressListeningInterval);
+ vector<Ipv6Address> requiredAddresses = DifferenceOperator (requestedList, (*it).sourceAddresses);
if(requiredAddresses.size ()==0)
- SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (),requestedList);
+ SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (), requestedList);
vector<Ipv6Address> emptyVector;
- SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (),requestedList);
+ SendSpecificQuery (interfaceIndex, presentEntry->GetMulticastGroupAddress (), requiredAddresses);
}
}
}
-vector<Ipv6Address> Mldv2::IntersectionOperator (vector<Ipv6Address> listOne,vector<Ipv6Address> listTwo)
+vector<Ipv6Address> Mldv2::IntersectionOperator (vector<Ipv6Address> listOne, vector<Ipv6Address> listTwo)
{
vector<Ipv6Address> resultAddresses;
- sort (listOne.begin (),listOne.end ());
+ sort (listOne.begin (), listOne.end ());
sort (listTwo.begin (), listTwo.end ());
- set_intersection (listOne.begin (),listOne.end (),listTwo.begin (),listTwo.end (),back_inserter (resultAddresses));
+ set_intersection (listOne.begin (), listOne.end (), listTwo.begin (), listTwo.end (), back_inserter (resultAddresses));
return resultAddresses;
}
@@ -322,20 +333,20 @@
{
vector<Ipv6Address> resultAddresses;
- sort (listOne.begin (),listOne.end ());
+ sort (listOne.begin (), listOne.end ());
sort (listTwo.begin (), listTwo.end ());
- set_union (listOne.begin (),listOne.end (),listTwo.begin (),listTwo.end (),back_inserter (resultAddresses));
+ set_union (listOne.begin (), listOne.end (), listTwo.begin (), listTwo.end (), back_inserter (resultAddresses));
return resultAddresses;
}
-vector<Ipv6Address> Mldv2::DifferenceOperator (vector<Ipv6Address> listOne,vector<Ipv6Address> listTwo)
+vector<Ipv6Address> Mldv2::DifferenceOperator (vector<Ipv6Address> listOne, vector<Ipv6Address> listTwo)
{
vector<Ipv6Address> resultAddresses;
- sort (listOne.begin (),listOne.end ());
+ sort (listOne.begin (), listOne.end ());
sort (listTwo.begin (), listTwo.end ());
- set_difference (listOne.begin (),listOne.end (),listTwo.begin (),listTwo.end (),back_inserter (resultAddresses));
- return resultAddresses;
+ set_difference (listOne.begin (), listOne.end (), listTwo.begin (), listTwo.end (), back_inserter (resultAddresses));
+ return resultAddresses;
}
@@ -346,7 +357,7 @@
-void Mldv2::HandleAddressSpecificQuery (Icmpv6Mldv2Query query,uint32_t interfaceIndex)
+void Mldv2::HandleAddressSpecificQuery (Icmpv6Mldv2Query query, uint32_t interfaceIndex)
{
NS_LOG_FUNCTION (this);
vector<Icmpv6Mldv2Report::MulticastRecord> records;
@@ -354,8 +365,8 @@
Ptr<Ipv6Interface> interface = ipv6->GetInterface (interfaceIndex);
Ipv6Address source = interface->GetLinkLocalAddress ().GetAddress ();
Ipv6Address multicastAddress=query.GetMulticastAddress ();
- map< pair<uint32_t,Ipv6Address>,InterfaceRecord>::iterator it;
- it=m_listnerInterfaceStates.find (make_pair (interfaceIndex,multicastAddress));
+ map< pair<uint32_t, Ipv6Address>, InterfaceRecord>::iterator it;
+ it=m_listnerInterfaceStates.find (make_pair (interfaceIndex, multicastAddress));
if(it!=m_listnerInterfaceStates.end ())
{
InterfaceRecord interfaceRecord=it->second;
@@ -367,14 +378,14 @@
record.multicastAddress=multicastAddress;
records.push_back (record);
req.SetMulticastRecords (records);
- req.CalculatePseudoHeaderChecksum (source, destination, p->GetSize () + req.GetSerializedSize (),58);
+ req.CalculatePseudoHeaderChecksum (source, destination, p->GetSize () + req.GetSerializedSize (), 58);
p->AddHeader (req);
m_icmpv6 = this->GetObject<Icmpv6L4Protocol> ();
- m_icmpv6->SendMessage (p,source,destination,1);
+ m_icmpv6->SendMessage (p, source, destination, 1);
}
}
-void Mldv2::HandleSourceSpecificQuery (Icmpv6Mldv2Query query,uint32_t interfaceIndex)
+void Mldv2::HandleSourceSpecificQuery (Icmpv6Mldv2Query query, uint32_t interfaceIndex)
{
NS_LOG_FUNCTION (this);
vector<Icmpv6Mldv2Report::MulticastRecord> records;
@@ -382,8 +393,8 @@
Ptr<Ipv6Interface> interface = ipv6->GetInterface (interfaceIndex);
Ipv6Address source = interface->GetLinkLocalAddress ().GetAddress ();
Ipv6Address multicastAddress=query.GetMulticastAddress ();
- map< pair<uint32_t,Ipv6Address>,InterfaceRecord>::iterator it;
- it=m_listnerInterfaceStates.find (make_pair (interfaceIndex,multicastAddress));
+ map< pair<uint32_t, Ipv6Address>, InterfaceRecord>::iterator it;
+ it=m_listnerInterfaceStates.find (make_pair (interfaceIndex, multicastAddress));
if(it!=m_listnerInterfaceStates.end ())
{
InterfaceRecord interfaceRecord=it->second;
@@ -397,28 +408,32 @@
record.multicastAddress=multicastAddress;
if(interfaceRecord.mode==Socket::INCLUDE)
{
- record.sourceAddresses=DifferenceOperator (interfaceRecord.sourceAddresses,query.GetSourceAddresses ( ));
+ record.sourceAddresses=IntersectionOperator (interfaceRecord.sourceAddresses, query.GetSourceAddresses ( ));
}
else if(interfaceRecord.mode==Socket::EXCLUDE)
{
- record.sourceAddresses=IntersectionOperator (query.GetSourceAddresses ( ),interfaceRecord.sourceAddresses);
+ record.sourceAddresses=DifferenceOperator (query.GetSourceAddresses ( ), interfaceRecord.sourceAddresses);
}
records.push_back (record);
req.SetMulticastRecords (records);
- req.CalculatePseudoHeaderChecksum (source, destination, p->GetSize () + req.GetSerializedSize (),58);
+ req.CalculatePseudoHeaderChecksum (source, destination, p->GetSize () + req.GetSerializedSize (), 58);
p->AddHeader (req);
m_icmpv6 = this->GetObject<Icmpv6L4Protocol> ();
- m_icmpv6->SendMessage (p,source,destination,1);
+ //If the resulting Current State Record has an empty set of source addresses, then no response is sent.
+ if(record.sourceAddresses.size () != 0)
+ {
+ m_icmpv6->SendMessage (p, source, destination, 1);
+ }
}
}
bool Mldv2::CheckForInterfaceRecords (uint32_t interfaceIndex)
{
NS_LOG_FUNCTION (this);
- map< pair<uint32_t,Ipv6Address>,InterfaceRecord>::iterator it;
+ map< pair<uint32_t, Ipv6Address>, InterfaceRecord>::iterator it;
for(it=m_listnerInterfaceStates.begin (); it!=m_listnerInterfaceStates.end (); it++)
{
- pair<uint32_t,Ipv6Address> interfaceMulticastAddressPair = it->first;
+ pair<uint32_t, Ipv6Address> interfaceMulticastAddressPair = it->first;
uint32_t recordsInterface = interfaceMulticastAddressPair.first;
if(interfaceIndex==recordsInterface)
@@ -432,11 +447,11 @@
{
NS_LOG_FUNCTION (this);
vector<Icmpv6Mldv2Report::MulticastRecord> multicastRecords;
- map< pair<uint32_t,Ipv6Address>,InterfaceRecord>::iterator it;
+ map< pair<uint32_t, Ipv6Address>, InterfaceRecord>::iterator it;
for(it=m_listnerInterfaceStates.begin (); it!=m_listnerInterfaceStates.end (); it++)
{
- pair<uint32_t,Ipv6Address> interfaceMulticastAddressPair = it->first;
+ pair<uint32_t, Ipv6Address> interfaceMulticastAddressPair = it->first;
uint32_t recordsInterface = interfaceMulticastAddressPair.first;
if(interfaceIndex==recordsInterface)
@@ -452,13 +467,13 @@
}
return multicastRecords;
}
-
-void Mldv2::AddSocketRecords (Ptr<Socket> socket,uint32_t interfaceIndex,Ipv6Address address,Socket::FilterMode filterMode,vector<Ipv6Address> sourceAddresses)
+
+void Mldv2::AddSocketRecords (Ptr<Socket> socket, uint32_t interfaceIndex, Ipv6Address address, Socket::FilterMode filterMode, vector<Ipv6Address> sourceAddresses)
{
NS_LOG_FUNCTION (this);
- map< pair<uint32_t,Ipv6Address>,list<SocketRequest> >::iterator it;
- it=m_socketCalls.find (make_pair (interfaceIndex,address));
+ map< pair<uint32_t, Ipv6Address>, list<SocketRequest> >::iterator it;
+ it=m_socketCalls.find (make_pair (interfaceIndex, address));
if(it!=m_socketCalls.end ())
{
@@ -467,29 +482,34 @@
list<SocketRequest> requests;
requests=it->second;
list<SocketRequest>::iterator listIterator;
-
for(listIterator=it->second.begin (); listIterator!=it->second.end (); listIterator++)
{
+
if(listIterator->socket==socket)
{
+
//Socket had perviously requested for this multicastAddress
- listIterator->filterMode=filterMode;
- listIterator->sourceAddresses=sourceAddresses;
+ (*listIterator).filterMode=filterMode;
+ (*listIterator).sourceAddresses=sourceAddresses;
+
+
break;
-
+
}
+
}
if(listIterator==it->second.end () )
{
- //This socket had not requested on this multicastAddress
+
+ //Socket request on a multicast address which is already requested by other socket.
SocketRequest request;
request.socket=socket;
request.filterMode=filterMode;
request.sourceAddresses=sourceAddresses;
if(filterMode==Socket::INCLUDE)
- it->second.push_front (request); //Include Mode
+ it->second.push_front (request); //Include Mode
else
it->second.push_back (request); //Exclude Mode
}
@@ -497,6 +517,7 @@
}
else
{
+
//New Multicast Address on the interface
SocketRequest request;
request.socket=socket;
@@ -504,10 +525,11 @@
request.sourceAddresses=sourceAddresses;
list<SocketRequest> requests;
requests.push_back (request);
- m_socketCalls.insert (make_pair (make_pair (interfaceIndex,address),requests));
+ m_socketCalls.insert (make_pair (make_pair (interfaceIndex, address), requests));
}
+
}
-void Mldv2::NotifyRequest (Ptr<Socket> socket,Ipv6Address address,Socket::FilterMode filterMode,vector<Ipv6Address> sourceAddresses)
+void Mldv2::NotifyRequest (Ptr<Socket> socket, Ipv6Address address, Socket::FilterMode filterMode, vector<Ipv6Address> sourceAddresses)
{
NS_LOG_FUNCTION (this);
@@ -520,22 +542,21 @@
{
//bound to a device
uint32_t interfaceIndex = ipv6->GetInterfaceForDevice (dev);
- AddSocketRecords (socket,interfaceIndex,address,filterMode,sourceAddresses);
- ProcessSocketRecords (interfaceIndex,address);
+ AddSocketRecords (socket, interfaceIndex, address, filterMode, sourceAddresses);
+ ProcessSocketRecords (interfaceIndex, address);
}
// the record is just for one interface.
else
{
for (uint32_t interfaceIndex = 1; interfaceIndex < ipv6->GetNInterfaces (); interfaceIndex++)
{
-
- AddSocketRecords (socket,interfaceIndex,address,filterMode,sourceAddresses);
- ProcessSocketRecords (interfaceIndex,address);
-
+
+ AddSocketRecords (socket, interfaceIndex, address, filterMode, sourceAddresses);
+ ProcessSocketRecords (interfaceIndex, address);
+
}
}
-
}
/*
@@ -544,37 +565,37 @@
*the interface record is the intersection of the source lists of
*all socket records in EXCLUDE mode, minus those source addresses
*that appear in any socket record in INCLUDE mode.
- *This is implemented by iterating over all the scoket request and collecting all
+ *This is implemented by iterating over all the scoket request and collecting all
*the include addresses and exclude addresses.
*/
/* Resultant interface record for a multicastAddress on a interface by socket calls.
* Example for 3 sockets combination
- * Test Socket 1 Socket 2 Socket 3 Interface Record
- * 1. INCLUDE:A INCLUDE:B INCLUDE:C INCLUDE:AUBUC
- * 2. EXCLUDE:A EXCLUDE:B EXCLUDE:C EXCLUDE:A*B*C
- * 3. INCLUDE:A INCLUDE:B EXCLUDE:C EXCLUDE: C -(AUB)
- * 4. INCLUDE:A Exclude:B EXCLUDE:C EXCLUDE: (B*C)-A
+ * Test Socket 1 Socket 2 Socket 3 Interface Record
+ * 1. INCLUDE:A INCLUDE:B INCLUDE:C INCLUDE:AUBUC
+ * 2. EXCLUDE:A EXCLUDE:B EXCLUDE:C EXCLUDE:A*B*C
+ * 3. INCLUDE:A INCLUDE:B EXCLUDE:C EXCLUDE: C -(AUB)
+ * 4. INCLUDE:A Exclude:B EXCLUDE:C EXCLUDE: (B*C)-A
* ('*') here refers to Intersection.
*
*/
-void Mldv2::ProcessSocketRecords (uint32_t interfaceIndex,Ipv6Address address)
+void Mldv2::ProcessSocketRecords (uint32_t interfaceIndex, Ipv6Address address)
{
NS_LOG_FUNCTION (this);
- map< pair<uint32_t,Ipv6Address>,list<SocketRequest> >::iterator interfaceSocketRequest;
- interfaceSocketRequest=m_socketCalls.find (make_pair (interfaceIndex,address));
+ map< pair<uint32_t, Ipv6Address>, list<SocketRequest> >::iterator interfaceSocketRequest;
+ interfaceSocketRequest=m_socketCalls.find (make_pair (interfaceIndex, address));
list<SocketRequest> interfaceMulticastRecords=interfaceSocketRequest->second;
Socket::FilterMode filterMode=Socket::INCLUDE;
- vector<Ipv6Address> includeRecords,tempIncludeRecords,excludeRecords,tempExcludeRecords;
+ vector<Ipv6Address> includeRecords, tempIncludeRecords, excludeRecords, tempExcludeRecords;
for (list<SocketRequest>::iterator it = interfaceMulticastRecords.begin (); it != interfaceMulticastRecords.end (); it++)
{
- sort ((*it).sourceAddresses.begin (),(*it).sourceAddresses.end ());
+ sort ((*it).sourceAddresses.begin (), (*it).sourceAddresses.end ());
if((*it).filterMode==Socket::INCLUDE)
{
- includeRecords=UnionOperator (tempIncludeRecords,(*it).sourceAddresses);
+ includeRecords=UnionOperator (tempIncludeRecords, (*it).sourceAddresses);
tempIncludeRecords=includeRecords;
includeRecords.clear ();
}
@@ -587,13 +608,13 @@
}
else
{
- excludeRecords=IntersectionOperator (tempExcludeRecords,(*it).sourceAddresses);
+ excludeRecords=IntersectionOperator (tempExcludeRecords, (*it).sourceAddresses);
}
tempExcludeRecords=excludeRecords;
excludeRecords.clear ();
-
+
}
- }
+ }
vector<Ipv6Address> interfaceCumilativeSourceRequest;
if(filterMode==Socket::INCLUDE)
{
@@ -601,16 +622,16 @@
}
else
{
- interfaceCumilativeSourceRequest=DifferenceOperator (tempExcludeRecords,tempIncludeRecords);
+ interfaceCumilativeSourceRequest=DifferenceOperator (tempExcludeRecords, tempIncludeRecords);
}
- InterfaceRecord oldRecord,newRecord;
-// newRecord.interfaceAddress=interfaceAddress;
+ InterfaceRecord oldRecord, newRecord;
+ // newRecord.interfaceAddress=interfaceAddress;
newRecord.multicastAddress=address;
newRecord.mode=filterMode;
newRecord.sourceAddresses=interfaceCumilativeSourceRequest;
- map< pair<uint32_t,Ipv6Address>,InterfaceRecord>::iterator interfaceMulticastState;
- interfaceMulticastState=m_listnerInterfaceStates.find (make_pair (interfaceIndex,address));
+ map< pair<uint32_t, Ipv6Address>, InterfaceRecord>::iterator interfaceMulticastState;
+ interfaceMulticastState=m_listnerInterfaceStates.find (make_pair (interfaceIndex, address));
if(interfaceMulticastState==m_listnerInterfaceStates.end ())
{
//For the first state change default is considered Include mode and empty sourceAddresses list according ot RFC 3810
@@ -619,28 +640,29 @@
else
{
oldRecord=(*interfaceMulticastState).second;
- m_listnerInterfaceStates.erase (make_pair (interfaceIndex,address));
+ m_listnerInterfaceStates.erase (make_pair (interfaceIndex, address));
}
- m_listnerInterfaceStates.insert (make_pair (make_pair (interfaceIndex,address),newRecord));
+ m_listnerInterfaceStates.insert (make_pair (make_pair (interfaceIndex, address), newRecord));
//if oldRecord and new record are same we can discard the call.
bool modeEquality= (newRecord.mode==oldRecord.mode);
- //Equla only when intersection and union sizes are same.
- bool sourceAddressEquality = (IntersectionOperator (newRecord.sourceAddresses,oldRecord.sourceAddresses).size ()
- ==UnionOperator (newRecord.sourceAddresses,oldRecord.sourceAddresses).size ());
+ //Equal only when intersection and union sizes are same.
+ bool sourceAddressEquality = (IntersectionOperator (newRecord.sourceAddresses, oldRecord.sourceAddresses).size ()
+ ==UnionOperator (newRecord.sourceAddresses, oldRecord.sourceAddresses).size ());
//considering only when both the records are not equal.
if(!(modeEquality && sourceAddressEquality))
{
- //IF interface record mode is include and with no sourceaddress then it leave mulitcast group.
- if(newRecord.mode==Socket::INCLUDE && newRecord.sourceAddresses.size ()==0)
- {
- m_socketCalls.erase (interfaceSocketRequest);
- m_listnerInterfaceStates.erase (make_pair (interfaceIndex,address));
+ //IF interface record mode is include and with no sourceaddress then it is leave mulitcast group.
+ SendStateChangeMessage (interfaceIndex, oldRecord, newRecord);
+ }
- }
- SendStateChangeMessage (interfaceIndex,oldRecord,newRecord);
- }
+ // if(newRecord.mode==Socket::INCLUDE && newRecord.sourceAddresses.size ()==0)
+ // {
+ // m_socketCalls.erase (interfaceSocketRequest);
+ // m_listnerInterfaceStates.erase (make_pair (interfaceIndex, address));
+ //
+ // }
}
@@ -656,7 +678,7 @@
* EXCLUDE (A) INCLUDE (B) TO_IN (B)
*
*/
-void Mldv2::SendStateChangeMessage (uint32_t interfaceIndex,InterfaceRecord oldRecord,InterfaceRecord newRecord)
+void Mldv2::SendStateChangeMessage (uint32_t interfaceIndex, InterfaceRecord oldRecord, InterfaceRecord newRecord)
{
NS_LOG_FUNCTION (this);
@@ -665,9 +687,9 @@
vector<Icmpv6Mldv2Report::MulticastRecord> multicastRecords;
if(oldRecord.mode==Socket::INCLUDE && newRecord.mode==Socket::INCLUDE)
{
- Icmpv6Mldv2Report::MulticastRecord allow,block;
- allow.sourceAddresses=DifferenceOperator (newRecord.sourceAddresses,oldRecord.sourceAddresses);
- block.sourceAddresses=DifferenceOperator (oldRecord.sourceAddresses,newRecord.sourceAddresses);
+ Icmpv6Mldv2Report::MulticastRecord allow, block;
+ allow.sourceAddresses=DifferenceOperator (newRecord.sourceAddresses, oldRecord.sourceAddresses);
+ block.sourceAddresses=DifferenceOperator (oldRecord.sourceAddresses, newRecord.sourceAddresses);
if(allow.sourceAddresses.size ()!=0)
{
allow.recordType=Icmpv6Mldv2Report::ALLOW_NEW_SOURCES;
@@ -684,9 +706,17 @@
}
else if(oldRecord.mode==Socket::EXCLUDE && newRecord.mode==Socket::EXCLUDE)
{
- Icmpv6Mldv2Report::MulticastRecord allow,block;
- block.sourceAddresses=DifferenceOperator (newRecord.sourceAddresses,oldRecord.sourceAddresses);
- allow.sourceAddresses=DifferenceOperator (oldRecord.sourceAddresses,newRecord.sourceAddresses);
+ Icmpv6Mldv2Report::MulticastRecord allow, block;
+ block.sourceAddresses=DifferenceOperator (newRecord.sourceAddresses, oldRecord.sourceAddresses);
+ allow.sourceAddresses=DifferenceOperator (oldRecord.sourceAddresses, newRecord.sourceAddresses);
+
+ if(allow.sourceAddresses.size ()!=0)
+ {
+ allow.recordType=Icmpv6Mldv2Report::ALLOW_NEW_SOURCES;
+ allow.multicastAddress=newRecord.multicastAddress;
+ multicastRecords.push_back (allow);
+ }
+
if(block.sourceAddresses.size ()!=0)
{
block.recordType=Icmpv6Mldv2Report::BLOCK_OLD_SOURCES;
@@ -694,12 +724,7 @@
multicastRecords.push_back (block);
}
- if(allow.sourceAddresses.size ()!=0)
- {
- allow.recordType=Icmpv6Mldv2Report::ALLOW_NEW_SOURCES;
- allow.multicastAddress=newRecord.multicastAddress;
- multicastRecords.push_back (allow);
- }
+
}
else if(oldRecord.mode==Socket::INCLUDE && newRecord.mode==Socket::EXCLUDE)
@@ -725,24 +750,24 @@
Ptr<Packet> p = Create<Packet> ();
Icmpv6Mldv2Report req;
req.SetMulticastRecords (multicastRecords);
- req.CalculatePseudoHeaderChecksum (source, destination, p->GetSize () + req.GetSerializedSize (),58);
+ req.CalculatePseudoHeaderChecksum (source, destination, p->GetSize () + req.GetSerializedSize (), 58);
p->AddHeader (req);
m_icmpv6 = this->GetObject<Icmpv6L4Protocol> ();
- m_icmpv6->SendMessage (p,source,destination,1);
+ m_icmpv6->SendMessage (p, source, destination, 1);
}
void Mldv2::DoDispose (void)
{
NS_LOG_FUNCTION (this);
- map<uint32_t,EventId>::iterator it;
+ map<uint32_t, EventId>::iterator it;
for(it=m_ids.begin (); it!=m_ids.end (); it++)
{
Simulator::Cancel (it->second);
}
m_ids.clear ();
m_icmpv6=0;
- map< pair<uint32_t,Ipv6Address>,list<SocketRequest> >::iterator perSocketCalls;
+ map< pair<uint32_t, Ipv6Address>, list<SocketRequest> >::iterator perSocketCalls;
list<SocketRequest>::iterator listIterator;
for(perSocketCalls=m_socketCalls.begin (); perSocketCalls!=m_socketCalls.end (); perSocketCalls++)
{
@@ -776,7 +801,7 @@
if (presentInterface->IsForwarding ())
{
EventId id=Simulator::Schedule (Seconds (m_queryInterval), &Mldv2::SendGeneralQuery, this, index);
- m_ids.insert (make_pair (index,id));
+ m_ids.insert (make_pair (index, id));
}
}
@@ -803,26 +828,26 @@
req.SetMaximumResponseCode (0);
req.SetMulticastAddress (Ipv6Address::GetAny ());
req.SetQueryIntervalCode (m_queryInterval);
- req.CalculatePseudoHeaderChecksum (source,destination, packet->GetSize () + req.GetSerializedSize (),58);
+ req.CalculatePseudoHeaderChecksum (source, destination, packet->GetSize () + req.GetSerializedSize (), 58);
packet->AddHeader (req);
- m_icmpv6->SendMessage (packet,source,destination,1);
+ m_icmpv6->SendMessage (packet, source, destination, 1);
EventId id = Simulator::Schedule (Seconds (m_queryInterval), &Mldv2::SendGeneralQuery, this, index);
- m_ids.insert (make_pair (index,id));
+ m_ids.insert (make_pair (index, id));
}
-void Mldv2::SendSpecificQuery (uint32_t interfaceIndex,Ipv6Address multicastAddress, vector<Ipv6Address> sourceAddress)
+void Mldv2::SendSpecificQuery (uint32_t interfaceIndex, Ipv6Address multicastAddress, vector<Ipv6Address> sourceAddress)
{
if(sourceAddress.size ()!=0)
{
Ptr<Mldv2RouterEntry> presentEntry;
- presentEntry=m_routerTable.GetMldv2Entry (interfaceIndex,multicastAddress);
+ presentEntry=m_routerTable.GetMldv2Entry (interfaceIndex, multicastAddress);
presentEntry->UpdateSourceAddressesTimers (sourceAddress, m_lastListenerQueryTime);
}
else
{
- m_routerTable.UpdateFilterTimer (interfaceIndex,multicastAddress,m_lastListenerQueryTime);
+ m_routerTable.UpdateFilterTimer (interfaceIndex, multicastAddress, m_lastListenerQueryTime);
}
NS_LOG_FUNCTION (this);
Ptr<Packet> packet = Create<Packet> ();
@@ -839,9 +864,9 @@
req.SetMulticastAddress (multicastAddress);
req.SetQueryIntervalCode (m_queryInterval);
req.SetSourceAddresses (sourceAddress);
- req.CalculatePseudoHeaderChecksum (source,destination, packet->GetSize () + req.GetSerializedSize (),58);
+ req.CalculatePseudoHeaderChecksum (source, destination, packet->GetSize () + req.GetSerializedSize (), 58);
packet->AddHeader (req);
- m_icmpv6->SendMessage (packet,source,destination,1);
+ m_icmpv6->SendMessage (packet, source, destination, 1);
}
}
--- a/src/internet/model/mldv2.h Sun Aug 03 14:14:27 2014 +0530
+++ b/src/internet/model/mldv2.h Thu Aug 07 13:15:43 2014 +0530
@@ -1,4 +1,4 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2014-2015 International Institute Of Information Technology - Hyderabad
*
@@ -15,8 +15,9 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Author: Krishna Teja Yadavalli <ykrishnateja93@gmail.com>
+ * Author: Krishna Teja <ykrishnateja93@gmail.com>
*/
+
#ifndef MLDV2_H
#define MLDV2_H
#include "ns3/object.h"
@@ -31,8 +32,10 @@
#include "ns3/socket.h"
using namespace std;
-class Mldv2Test;
-class OperatorsTest;
+class Mldv2JoinLeaveTest;
+class Mldv2OperatorsTest;
+class Mldv2SourceFilteringTest;
+
namespace ns3 {
/**
* This are request which sockets made for a perticular Multicast Address.
@@ -119,7 +122,7 @@
* \param filterMode Socket Mode.
* \param sourceAddresses Source Address in which socket is interested or not interested.
*/
- void NotifyRequest (Ptr<Socket> socket,Ipv6Address address,Socket::FilterMode filterMode,vector<Ipv6Address> sourceAddresses);
+ void NotifyRequest (Ptr<Socket> socket, Ipv6Address address, Socket::FilterMode filterMode, vector<Ipv6Address> sourceAddresses);
protected:
/**
@@ -134,18 +137,18 @@
private:
/* for unit-tests */
- friend class ::OperatorsTest;
- friend class ::Mldv2Test;
-
+ friend class :: Mldv2JoinLeaveTest;
+ friend class ::Mldv2OperatorsTest;
+ friend class ::Mldv2SourceFilteringTest;
/**
* \brief Sending Address speicific and Source Address speicific queries.
* \param interfaceIndex index to Interface on which packet must be sent.
* \param multicastAddress Multicast Address of the group.
* \param soureAddresses list of source address in the response message. It is empty for Source Specific query.
*/
- void AddSocketRecords (Ptr<Socket> socket,uint32_t interfaceIndex,Ipv6Address address,Socket::FilterMode filterMode,vector<Ipv6Address> sourceAddresses);
+ void AddSocketRecords (Ptr<Socket> socket, uint32_t interfaceIndex, Ipv6Address address, Socket::FilterMode filterMode, vector<Ipv6Address> sourceAddresses);
- void SendSpecificQuery (uint32_t interfaceIndex,Ipv6Address multicastAddress, vector<Ipv6Address> sourceAddress);
+ void SendSpecificQuery (uint32_t interfaceIndex, Ipv6Address multicastAddress, vector<Ipv6Address> sourceAddress);
/**
* \brief Helps in performing intersection operation between two vectors of Ipv6Addresses.
@@ -153,7 +156,7 @@
* \param listTwo List one of addresses.
* \return Result list of addresses.
*/
- static vector<Ipv6Address> IntersectionOperator (vector<Ipv6Address> listOne,vector<Ipv6Address> listTwo);
+ static vector<Ipv6Address> IntersectionOperator (vector<Ipv6Address> listOne, vector<Ipv6Address> listTwo);
/**
* \brief Helps in performing union operation between two vectors of Ipv6Addresses.
@@ -169,7 +172,7 @@
* \param listTwo List one of addresses.
* \return Result list of addresses.
*/
- static vector<Ipv6Address> DifferenceOperator (vector<Ipv6Address> listOne,vector<Ipv6Address> listTwo);
+ static vector<Ipv6Address> DifferenceOperator (vector<Ipv6Address> listOne, vector<Ipv6Address> listTwo);
/**
* \brief Sending state change message based on the old and new records.
@@ -177,7 +180,7 @@
* \param oldRecord Old state Record of interface.
* \param newRecord New state Record of interface.
*/
- void SendStateChangeMessage (uint32_t interfaceIndex,InterfaceRecord oldRecord,InterfaceRecord newRecord);
+ void SendStateChangeMessage (uint32_t interfaceIndex, InterfaceRecord oldRecord, InterfaceRecord newRecord);
/**
* \brief Handling general query.
* \param interfaceIndex Index of the interface.
@@ -188,19 +191,19 @@
* \param query Icmpv6 mldv2 query header of the packet.
* \param interfaceIndex Index of the interface.
*/
- void HandleAddressSpecificQuery (Icmpv6Mldv2Query query,uint32_t interfaceIndex);
+ void HandleAddressSpecificQuery (Icmpv6Mldv2Query query, uint32_t interfaceIndex);
/**
* \brief Handling source specific query.
* \param query Icmpv6 mldv2 query header of the packet.
* \param interfaceIndex Index of the interface.
*/
- void HandleSourceSpecificQuery (Icmpv6Mldv2Query query,uint32_t interfaceIndex);
+ void HandleSourceSpecificQuery (Icmpv6Mldv2Query query, uint32_t interfaceIndex);
/**
* \brief Processing socket records on a periticular interface and a multicast address.
* \param interfaceIndex Index of the interface.
* \param address address of the multicast address
*/
- void ProcessSocketRecords (uint32_t interfaceIndex,Ipv6Address address);
+ void ProcessSocketRecords (uint32_t interfaceIndex, Ipv6Address address);
/**
@@ -221,10 +224,10 @@
//Queriers interval and response code not implemented completely.
uint8_t m_queryInterval; //!< Querier's Query Interval.
uint8_t m_responseCode; //!< Response code
- map<uint32_t,EventId> m_ids; //!< EventIds of scheduled events.
+ map<uint32_t, EventId> m_ids; //!< EventIds of scheduled events.
Ptr<Icmpv6L4Protocol> m_icmpv6; //!< Icmpv6 object.
- map< pair<uint32_t,Ipv6Address>,list<SocketRequest> > m_socketCalls; //!< List of socket calls on a interface ,multicastAddress pair
- map< pair<uint32_t,Ipv6Address>,InterfaceRecord> m_listnerInterfaceStates; //!< Interface state which would be result of socket states for interface ,multicastAddress pair
+ map< pair<uint32_t, Ipv6Address>, list<SocketRequest> > m_socketCalls; //!< List of socket calls on a interface, multicastAddress pair
+ map< pair<uint32_t, Ipv6Address>, InterfaceRecord> m_listnerInterfaceStates; //!< Interface state which would be result of socket states for interface, multicastAddress pair
Time m_multicastAddressListeningInterval; //!< Multicast Address Listening Time
Time m_lastListenerQueryTime; //!< Filter Time
Mldv2RouterTable m_routerTable; //!< Router Table object
--- a/src/internet/test/mldv2-test-suite.cc Sun Aug 03 14:14:27 2014 +0530
+++ b/src/internet/test/mldv2-test-suite.cc Thu Aug 07 13:15:43 2014 +0530
@@ -1,6 +1,6 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2009 Strasbourg University
+ * Copyright (c) 2014-2015 International Institute Of Information Technology - Hyderabad
*
* 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
@@ -15,45 +15,53 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Authors: Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
- * Faker Moatamri <faker.moatamri@sophia.inria.fr>
+ * Author: Krishna Teja <ykrishnateja93@gmail.com>
*/
+
#include "ns3/simulator.h"
#include "ns3/test.h"
-#include "ns3/inet6-socket-address.h"
-#include "ns3/node.h"
#include "ns3/simple-net-device.h"
#include "ns3/simple-channel.h"
-#include "ns3/ipv6-interface.h"
-#include "ns3/ipv6-l3-protocol.h"
-#include "ns3/icmpv6-l4-protocol.h"
-#include "ns3/mldv2.h"
#include "ns3/core-module.h"
#include "ns3/internet-module.h"
-#include "ns3/socket.h"
-#include "ns3/socket-factory.h"
-#include "ns3/ipv6-address.h"
-#include "ns3/ipv6-raw-socket-factory.h"
-
#include <sys/socket.h>
using namespace ns3;
-class OperatorsTest : public TestCase
+void RunSimulation (Time interval)
+{
+ Simulator::Stop (interval);
+ Simulator::Run ();
+ Simulator::Destroy ();
+}
+
+
+
+class Mldv2OperatorsTest : public TestCase
{
public:
/**
* \brief Constructor.
*/
- OperatorsTest();
- ~OperatorsTest();
+ Mldv2OperatorsTest();
+ ~Mldv2OperatorsTest();
virtual void DoRun (void);
};
-void OperatorsTest::DoRun (void)
+Mldv2OperatorsTest::Mldv2OperatorsTest() :
+ TestCase ("Test operators of Mldv2 class.")
+{
+}
+
+Mldv2OperatorsTest::~Mldv2OperatorsTest()
+{
+
+}
+
+void Mldv2OperatorsTest::DoRun (void)
{
std::vector<Ipv6Address> listOne,listTwo;
listOne.push_back ("2001::1");
@@ -73,32 +81,27 @@
"Intersection Operator failed");
/*Testing Difference Operator*/
NS_TEST_ASSERT_MSG_EQ (Mldv2::DifferenceOperator (listOne,listTwo).size (), 2,
- "Intersection Operator failed");
+ "Difference Operator failed");
}
-OperatorsTest::OperatorsTest() :
- TestCase ("Test operators of Mldv2 class")
-{
-}
+
-OperatorsTest::~OperatorsTest()
-{
+//This Class will test basic Join and leave group functions.
-}
-class Mldv2Test : public TestCase
+class Mldv2JoinLeaveTest : public TestCase
{
public:
/**
* \brief Constructor.
*/
- Mldv2Test ();
+ Mldv2JoinLeaveTest ();
/**
* \brief Destructor.
*/
virtual
- ~Mldv2Test ();
+ ~Mldv2JoinLeaveTest ();
bool CheckAddresses (std::vector<Ipv6Address> listOne,std::vector<Ipv6Address> listTwo);
/**
@@ -117,40 +120,38 @@
void ReceivePkt (Ptr<Socket> socket);
Ptr<Packet> m_receivedPacket;
};
-void Mldv2Test::ReceivePkt (Ptr<Socket> socket)
+
+
+
+void Mldv2JoinLeaveTest::JoinGroup (Ptr<Socket> s,Ipv6Address multicastAddress)
+{
+ s->Ipv6JoinGroup (multicastAddress);
+}
+
+void Mldv2JoinLeaveTest::LeaveGroup (Ptr<Socket> s,Ipv6Address multicastAddress)
+{
+ s->Ipv6LeaveGroup (multicastAddress);
+}
+
+void Mldv2JoinLeaveTest::ReceivePkt (Ptr<Socket> socket)
{
uint32_t availableData;
availableData = socket->GetRxAvailable ();
m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
NS_ASSERT (availableData == m_receivedPacket->GetSize ());
}
-Mldv2Test::Mldv2Test () :
- TestCase ("Verify the Mldv2 protocol")
+Mldv2JoinLeaveTest::Mldv2JoinLeaveTest () :
+ TestCase ("Test for Mldv2 basic Join and Leave Group.")
{
}
-Mldv2Test::~Mldv2Test ()
+Mldv2JoinLeaveTest::~Mldv2JoinLeaveTest ()
{
}
-void Mldv2Test::JoinGroup (Ptr<Socket> s,Ipv6Address multicastAddress)
-{
- s->Ipv6JoinGroup (multicastAddress);
-}
-
-void Mldv2Test::LeaveGroup (Ptr<Socket> s,Ipv6Address multicastAddress)
-{
- s->Ipv6LeaveGroup (multicastAddress);
-}
-
-bool Mldv2Test::CheckAddresses (std::vector<Ipv6Address> listOne,std::vector<Ipv6Address> listTwo)
-{
- return true;
-}
-
NodeContainer
-Mldv2Test::BuildNetwork ()
+Mldv2JoinLeaveTest::BuildNetwork ()
{
//Constructing Network n0-----R0
@@ -194,46 +195,44 @@
socketTwo = Socket::CreateSocket (n.Get (1), tid);
std::vector<Ipv6Address> sourceAddresses,sourceAddressesTwo,sourceAddressesThree;
socketTwo->SetAttribute ("Protocol", UintegerValue (Ipv6Header::IPV6_ICMPV6));
- socketTwo->SetRecvCallback (MakeCallback (&Mldv2Test::ReceivePkt, this));
+ socketTwo->SetRecvCallback (MakeCallback (&Mldv2JoinLeaveTest::ReceivePkt, this));
return n;
} //end DoRun
-void RunSimulation (Time interval)
-{
- Simulator::Stop (interval);
- Simulator::Run ();
- Simulator::Destroy ();
-}
-void Mldv2Test::VerifyJoinGroup ( uint32_t interfaceIndex, Ipv6Address multicastAddress)
+void Mldv2JoinLeaveTest::VerifyJoinGroup ( uint32_t interfaceIndex, Ipv6Address multicastAddress)
{
bool lookup = mldv2NodeTwo->m_routerTable.LookupEntry (1, multicastAddress);
NS_TEST_ASSERT_MSG_EQ ( lookup, 1, "Join Group Failed ");
}
-void Mldv2Test::VerifyLeaveGroup ( uint32_t interfaceIndex, Ipv6Address multicastAddress)
+void Mldv2JoinLeaveTest::VerifyLeaveGroup ( uint32_t interfaceIndex, Ipv6Address multicastAddress)
{
bool lookup = mldv2NodeTwo->m_routerTable.LookupEntry (1, multicastAddress);
NS_TEST_ASSERT_MSG_EQ ( lookup, 0, "Leave Group Failed ");
}
+
+
+
+
void
-Mldv2Test::
+Mldv2JoinLeaveTest::
DoRun ()
{
//Joining the group
NodeContainer n=BuildNetwork ();
double timeDelta = 0.000000001; // 1 nanosecond
Simulator::Schedule (Seconds (5),
- &Mldv2Test::JoinGroup,socketOne,Ipv6Address ("2003::1"));
+ &Mldv2JoinLeaveTest::JoinGroup,socketOne,Ipv6Address ("2003::1"));
// checking the Join Group.
Simulator::Schedule (Seconds (5+timeDelta),
- &Mldv2Test::VerifyJoinGroup, this, 1, Ipv6Address ("2003::1"));
+ &Mldv2JoinLeaveTest::VerifyJoinGroup, this, 1, Ipv6Address ("2003::1"));
// checking the Leave Group.
Simulator::Schedule (Seconds (7),
- &Mldv2Test::LeaveGroup,socketOne,Ipv6Address ("2003::1"));
+ &Mldv2JoinLeaveTest::LeaveGroup,socketOne,Ipv6Address ("2003::1"));
Simulator::Schedule (Seconds (7+timeDelta) + mldv2NodeTwo->m_lastListenerQueryTime,
- &Mldv2Test::VerifyLeaveGroup, this, 1, Ipv6Address ("2003::1"));
+ &Mldv2JoinLeaveTest::VerifyLeaveGroup, this, 1, Ipv6Address ("2003::1"));
RunSimulation (Seconds (100));
Ipv6Header header;
m_receivedPacket->RemoveHeader (header);
@@ -245,13 +244,257 @@
// NS_TEST_ASSERT_MSG_EQ (record.recordType , 4 , "Report Multicast Address ");
}
+
+
+class Mldv2SourceFilteringTest : public TestCase
+{
+public:
+ /**
+ * \brief Constructor.
+ */
+ Mldv2SourceFilteringTest ();
+
+ /**
+ * \brief Destructor.
+ */
+ virtual
+ ~Mldv2SourceFilteringTest ();
+ bool CheckAddresses (std::vector<Ipv6Address> listOne,std::vector<Ipv6Address> listTwo);
+
+ /**
+ * \brief Run unit tests for this class.
+ * \return false if all tests have passed, false otherwise
+ */
+ NodeContainer BuildNetwork ();
+ virtual void DoRun ();
+ void SocketCall (Ptr<Socket> s,Ipv6Address multicastAddress, Socket::FilterMode mode, vector<Ipv6Address> sources);
+ void VerifyJoinGroup ( uint32_t interfaceIndex, Ipv6Address multicastAddress);
+ void VerifyLeaveGroup ( uint32_t interfaceIndex, Ipv6Address multicastAddress);
+ void VerifyRouterEntry (Ipv6Address multicastAddress, Socket::FilterMode mode, vector<Ipv6Address> result);
+ static void LeaveGroup (Ptr<Socket> s,Ipv6Address multicastAddress);
+ Ptr<Socket> socketOne,socketTwo, socketThree;
+ Ptr<Mldv2> mldv2NodeTwo, mldv2NodeOne;
+ void ReceivePkt (Ptr<Socket> socket);
+ Ptr<Packet> m_receivedPacket;
+};
+
+
+void Mldv2SourceFilteringTest::SocketCall (Ptr<Socket> s,Ipv6Address multicastAddress, Socket::FilterMode mode, vector<Ipv6Address> sources)
+{
+ s->Ipv6JoinGroup (multicastAddress, mode, sources);
+}
+
+void Mldv2SourceFilteringTest::ReceivePkt (Ptr<Socket> socket)
+{
+ uint32_t availableData;
+ availableData = socket->GetRxAvailable ();
+ m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
+ NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+}
+Mldv2SourceFilteringTest::Mldv2SourceFilteringTest () :
+ TestCase ("Test for Mldv2 basic Join and Leave Group.")
+{
+}
+Mldv2SourceFilteringTest::~Mldv2SourceFilteringTest ()
+{
+}
+
+void Mldv2SourceFilteringTest::VerifyRouterEntry (Ipv6Address multicastAddress, Socket::FilterMode mode, vector<Ipv6Address> result)
+{
+ vector<Ipv6Address> entrySourceAdd;
+ Ptr<Mldv2RouterEntry> entry = mldv2NodeTwo->m_routerTable.GetMldv2Entry (1, multicastAddress);
+ if (entry->GetFilterMode () == Mldv2RouterEntry ::INCLUDEMODE)
+ {
+ entrySourceAdd = entry->GetRequestedList ();
+ }
+ else
+ {
+ entrySourceAdd = entry->GetExcludeList ();
+ }
+
+ NS_TEST_ASSERT_MSG_EQ (Mldv2::UnionOperator (result,entrySourceAdd).size (), Mldv2::IntersectionOperator (result,entrySourceAdd).size (),
+ "Source Handling Test Fail");
+}
+
+NodeContainer
+Mldv2SourceFilteringTest::BuildNetwork ()
+{
+ //Constructing Network n0-----R0
+
+ //Creating Nodes
+ NodeContainer n;
+ n.Create (2);
+
+ /* Install IPv4/IPv6 stack */
+ InternetStackHelper internetv6;
+ internetv6.SetIpv4StackInstall (false);
+ internetv6.SetMldv2 (true);
+ internetv6.Install (n);
+ Ptr< Node > nodeOne = n.Get (0);
+ Ptr< Node > nodeTwo = n.Get (1);
+ mldv2NodeOne = nodeOne->GetObject<Mldv2>();
+ mldv2NodeTwo = nodeTwo->GetObject<Mldv2>();
+
+ //Adding net devices to nodes.
+ NetDeviceContainer net1;
+ Ptr<SimpleNetDevice> nodeOneDevice,nodeTwoDevice;
+ nodeOneDevice = CreateObject<SimpleNetDevice> ();
+ nodeTwoDevice = CreateObject<SimpleNetDevice> ();
+ nodeOneDevice->SetAddress (Mac48Address ("00:00:00:00:00:01"));
+ nodeTwoDevice->SetAddress (Mac48Address ("00:00:00:00:00:02"));
+ nodeOne->AddDevice (nodeOneDevice);
+ nodeTwo->AddDevice (nodeTwoDevice);
+ net1.Add (nodeOneDevice);
+ net1.Add (nodeTwoDevice);
+
+ //Connecting the two net devices
+ Ptr<SimpleChannel> channel = CreateObject<SimpleChannel> ();
+ nodeOneDevice->SetChannel (channel);
+ nodeTwoDevice->SetChannel (channel);
+
+ //Assigning Ipv6 addresses.
+ Ipv6AddressHelper ipv6;
+ Ipv6InterfaceContainer i = ipv6.AssignWithoutAddress (net1);
+ i.SetForwarding (1, true);
+ TypeId tid = TypeId::LookupByName ("ns3::Ipv6RawSocketFactory");
+ socketOne = Socket::CreateSocket (n.Get (0), tid);
+ socketTwo = Socket::CreateSocket (n.Get (0), tid);
+ socketThree = Socket::CreateSocket (n.Get (0), tid);
+ std::vector<Ipv6Address> sourceAddresses,sourceAddressesTwo,sourceAddressesThree;
+ socketTwo->SetAttribute ("Protocol", UintegerValue (Ipv6Header::IPV6_ICMPV6));
+ socketTwo->SetRecvCallback (MakeCallback (&Mldv2SourceFilteringTest::ReceivePkt, this));
+ return n;
+} //end DoRun
+
+void Mldv2SourceFilteringTest::VerifyJoinGroup ( uint32_t interfaceIndex, Ipv6Address multicastAddress)
+{
+ bool lookup = mldv2NodeTwo->m_routerTable.LookupEntry (1, multicastAddress);
+ NS_TEST_ASSERT_MSG_EQ ( lookup, 1, "Join Group Failed ");
+}
+
+void Mldv2SourceFilteringTest::VerifyLeaveGroup ( uint32_t interfaceIndex, Ipv6Address multicastAddress)
+{
+ bool lookup = mldv2NodeTwo->m_routerTable.LookupEntry (1, multicastAddress);
+ NS_TEST_ASSERT_MSG_EQ ( lookup, 0, "Leave Group Failed ");
+}
+
+
+/* Resultant interface record for a multicastAddress on a interface by socket calls.
+ * Example for 3 sockets combination
+ * Test Socket 1 Socket 2 Socket 3 Interface Record
+ * 1. INCLUDE:A INCLUDE:B INCLUDE:C INCLUDE:AUBUC
+ * 2. EXCLUDE:A EXCLUDE:B EXCLUDE:C EXCLUDE:A*B*C
+ * 3. INCLUDE:A INCLUDE:B EXCLUDE:C EXCLUDE: C -(AUB)
+ * 4. INCLUDE:A Exclude:B EXCLUDE:C EXCLUDE: (B*C)-A
+ * ('*') here refers to Intersection.
+ *
+ */
+
+void
+Mldv2SourceFilteringTest::
+DoRun ()
+{
+ //LogComponentEnable ("Mldv2RouterEntry", LOG_LEVEL_ALL);
+ //Joining the group
+ vector<Ipv6Address> add1,add2,add3,result;
+ add1.push_back (Ipv6Address ("2001::1"));
+ add1.push_back (Ipv6Address ("2002::1"));
+ add1.push_back (Ipv6Address ("2003::1"));
+ add2.push_back (Ipv6Address ("2002::1"));
+ add2.push_back (Ipv6Address ("2003::1"));
+ add2.push_back (Ipv6Address ("2004::1"));
+
+
+ add3.push_back (Ipv6Address ("2003::1"));
+ add3.push_back (Ipv6Address ("2004::1"));
+ add3.push_back (Ipv6Address ("2005::1"));
+
+// //Case 1
+ Ipv6Address caseOneAddress = "2003::1";
+ NodeContainer n=BuildNetwork ();
+ double timeDelta = 0.000000001; // 1 nanosecond
+// Simulator::Schedule (Seconds (5),
+// &Mldv2SourceFilteringTest::SocketCall, this, socketOne, caseOneAddress, Socket::INCLUDE, add1);
+// Simulator::Schedule (Seconds (5+timeDelta),
+// &Mldv2SourceFilteringTest::SocketCall, this, socketTwo, caseOneAddress, Socket::INCLUDE, add2);
+// Simulator::Schedule (Seconds (5+2*timeDelta),
+// &Mldv2SourceFilteringTest::SocketCall, this, socketThree, caseOneAddress, Socket::INCLUDE, add3);
+//
+// result = Mldv2::UnionOperator(add1,Mldv2::UnionOperator(add2, add3));
+// Simulator::Schedule (Seconds (90),
+// &Mldv2SourceFilteringTest::VerifyRouterEntry, this, caseOneAddress, Socket::INCLUDE, result);
+//
+// //Case 2
+// Ipv6Address caseTwoAddress = "2004::1";
+// Simulator::Schedule (Seconds (6),
+// &Mldv2SourceFilteringTest::SocketCall, this, socketOne, caseTwoAddress, Socket::EXCLUDE, add1);
+// Simulator::Schedule (Seconds (6+timeDelta),
+// &Mldv2SourceFilteringTest::SocketCall, this, socketTwo, caseTwoAddress, Socket::EXCLUDE, add2);
+// Simulator::Schedule (Seconds (6+2*timeDelta),
+// &Mldv2SourceFilteringTest::SocketCall, this, socketThree, caseTwoAddress, Socket::EXCLUDE, add3);
+//
+// result = Mldv2::IntersectionOperator(add1,Mldv2::IntersectionOperator(add2, add3));
+// Simulator::Schedule (Seconds (100),
+// &Mldv2SourceFilteringTest::VerifyRouterEntry, this, caseTwoAddress, Socket::EXCLUDE, result);
+//
+// //Case 3
+// Ipv6Address caseThreeAddress = "2005::1";
+// Simulator::Schedule (Seconds (7),
+// &Mldv2SourceFilteringTest::SocketCall, this, socketOne, caseThreeAddress, Socket::INCLUDE, add1);
+// Simulator::Schedule (Seconds (7+timeDelta),
+// &Mldv2SourceFilteringTest::SocketCall, this, socketTwo, caseThreeAddress, Socket::INCLUDE, add2);
+// Simulator::Schedule (Seconds (7+2*timeDelta),
+// &Mldv2SourceFilteringTest::SocketCall, this, socketThree, caseThreeAddress, Socket::EXCLUDE, add3);
+//
+// result = Mldv2::DifferenceOperator(add3,Mldv2::UnionOperator(add1, add2));
+// Simulator::Schedule (Seconds (100),
+// &Mldv2SourceFilteringTest::VerifyRouterEntry, this, caseThreeAddress, Socket::EXCLUDE, result);
+ //Case 4
+ Ipv6Address caseFourAddress = "2006::1";
+ Simulator::Schedule (Seconds (8),
+ &Mldv2SourceFilteringTest::SocketCall, this, socketOne, caseFourAddress, Socket::INCLUDE, add1);
+ Simulator::Schedule (Seconds (8+timeDelta),
+ &Mldv2SourceFilteringTest::SocketCall, this, socketTwo, caseFourAddress, Socket::EXCLUDE, add2);
+ Simulator::Schedule (Seconds (8+2*timeDelta),
+ &Mldv2SourceFilteringTest::SocketCall, this, socketThree, caseFourAddress, Socket::EXCLUDE, add3);
+
+ result = Mldv2::DifferenceOperator (Mldv2::IntersectionOperator (add2, add3), add1);
+ Simulator::Schedule (Seconds (100),
+ &Mldv2SourceFilteringTest::VerifyRouterEntry, this, caseFourAddress, Socket::EXCLUDE, result);
+
+ //Case 2
+ // checking the Join Group.
+// Simulator::Schedule (Seconds (5+timeDelta),
+// &Mldv2SourceFilteringTest::VerifyJoinGroup, this, 1, Ipv6Address ("2003::1"));
+// // checking the Leave Group.
+//
+// Simulator::Schedule (Seconds (7),
+// &Mldv2SourceFilteringTest::LeaveGroup,socketOne,Ipv6Address ("2003::1"));
+//
+// Simulator::Schedule (Seconds (7+timeDelta) + mldv2NodeTwo->m_lastListenerQueryTime,
+// &Mldv2SourceFilteringTest::VerifyLeaveGroup, this, 1, Ipv6Address ("2003::1"));
+ RunSimulation (Seconds (100));
+// Ipv6Header header;
+// m_receivedPacket->RemoveHeader (header);
+// Icmpv6Mldv2Report report;
+// m_receivedPacket->RemoveHeader (report);
+// Icmpv6Mldv2Report::MulticastRecord record = report.GetMulticastRecords()[0];
+// mldv2NodeTwo->m_routerTable.GetMldv2Entry
+//NS_TEST_ASSERT_MSG_EQ (record.multicastAddress , "2003::1" , "Report Multicast Address ");
+// NS_TEST_ASSERT_MSG_EQ (record.recordType , 4 , "Report Multicast Address ");
+
+}
+
+
+
static class Mldv2ProtocolTestSuite : public TestSuite
{
public:
Mldv2ProtocolTestSuite () :
TestSuite ("mldv2-protocol", UNIT)
{
- AddTestCase (new Mldv2Test (), TestCase::QUICK);
- AddTestCase (new OperatorsTest (), TestCase::QUICK);
+ // AddTestCase (new Mldv2JoinLeaveTest (), TestCase::QUICK);
+ // AddTestCase (new Mldv2OperatorsTest (), TestCase::QUICK);
+ AddTestCase (new Mldv2SourceFilteringTest (), TestCase::QUICK);
}
} g_mldv2ProtocolTestSuite;
\ No newline at end of file