Created tests for source filtering and made some cosmetic changes draft default tip
authorkrishna
Thu, 07 Aug 2014 13:15:43 +0530
changeset 10811 53e154b45447
parent 10810 cfa9449e7c4f
Created tests for source filtering and made some cosmetic changes
examples/ipv6/Mldv2-example.cc
src/internet/model/ipv6-list-routing.cc
src/internet/model/ipv6-static-routing.cc
src/internet/model/mldv2-router-entry.cc
src/internet/model/mldv2-router-entry.h
src/internet/model/mldv2-router-table.cc
src/internet/model/mldv2-router-table.h
src/internet/model/mldv2.cc
src/internet/model/mldv2.h
src/internet/test/mldv2-test-suite.cc
--- 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