Fixing Bootstrap virtual node creation bug.
authorHarjot Gill <gillh@seas.upenn.edu>
Wed, 10 Mar 2010 14:56:05 -0500
changeset 5998 c1cfbbb5750b
parent 5997 86ea410b5dec
child 5999 a8d77c56c7af
Fixing Bootstrap virtual node creation bug.
src/applications/chord-ipv4/chord-ipv4.cc
src/applications/chord-ipv4/chord-ipv4.h
--- a/src/applications/chord-ipv4/chord-ipv4.cc	Wed Feb 17 19:31:52 2010 -0500
+++ b/src/applications/chord-ipv4/chord-ipv4.cc	Wed Mar 10 14:56:05 2010 -0500
@@ -37,7 +37,7 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("ChordIpv4Application");
+NS_LOG_COMPONENT_DEFINE ("ChordIpv4");
 NS_OBJECT_ENSURE_REGISTERED (ChordIpv4);
 
 TypeId
@@ -150,6 +150,7 @@
   NS_LOG_FUNCTION_NOARGS ();
   m_socket = 0;
   isBootStrapNode = false;
+  m_started = false;
   // Timer configuration
 }
 
@@ -171,6 +172,9 @@
 ChordIpv4::StartApplication (void)
 {
   NS_LOG_FUNCTION_NOARGS ();
+  if (m_started)
+    return;
+  m_started = true;
   NS_LOG_INFO ("***ChordIpv4 starting on Node: " << GetNode ()->GetId ()
                                                  << "\n***Parameters: "
                                                  << "\n***bootStrapIp: " << m_bootStrapIp
@@ -229,6 +233,7 @@
 void
 ChordIpv4::StopApplication ()
 {
+  m_started = false;
   NS_LOG_FUNCTION_NOARGS ();
   if (m_socket != 0)
     {
@@ -236,7 +241,6 @@
       m_socket->SetRecvCallback (MakeNullCallback<void, Ptr<Socket> > ());
       // m_socket = 0;
     }
-  m_dHashIpv4->DoDispose ();
   // Cancel Timers
   m_stabilizeTimer.Cancel ();
   m_heartbeatTimer.Cancel ();
@@ -480,10 +484,10 @@
   vNode->SetPredecessor (Create<ChordNode> (vNode));
   // Set routable = false
   vNode->SetRoutable (false);
-
   /* bootStrapIp is same as local Ip and no v-nodes exist. In that case we need to create a new chord */
-  if (isBootStrapNode && m_vNodeMap.GetSize () == 0)
+  if (isBootStrapNode && m_vNodeMap.GetSize () == 0 && m_started)
     {
+      NS_LOG_INFO ("Bootstrap new Chord network");
       // Create a new chord network
       // Insert VNode into list
       Ptr<ChordNode> chordNode = DynamicCast<ChordNode> (vNode);
@@ -492,10 +496,24 @@
       NotifyJoinSuccess (vNode->GetVNodeName (), vNode->GetChordIdentifier ());
       return;
     }
-
+  else if (isBootStrapNode && m_vNodeMap.GetSize () == 1 && m_started)
+  {
+    NS_LOG_INFO ("Bootstrap case, InsertVNode");
+    vNode->SetSuccessor (Create<ChordNode> (*(m_vNodeMap.GetNodes ().begin ())));
+    vNode->SetRoutable (true);
+    // Insert VNode into list
+    Ptr<ChordNode> chordNode = DynamicCast<ChordNode> (vNode);
+    m_vNodeMap.UpdateNode (chordNode);
+    DoStabilize (vNode);
+    DoFixFinger (vNode);
+    NotifyJoinSuccess (vNode->GetVNodeName (), vNode->GetChordIdentifier ());
+    return;
+  }
   // Insert VNode into list
   Ptr<ChordNode> chordNode = DynamicCast<ChordNode> (vNode);
-  m_vNodeMap.UpdateNode (chordNode);
+  //Do not store vNode if ChordIpv4 is inactive.
+  if (m_started)
+    m_vNodeMap.UpdateNode (chordNode);
   // Send this request to bootstrap IP
   ChordMessage chordMessage = ChordMessage (m_maxPacketTTL);
   vNode->PackJoinReq (chordMessage);
@@ -614,58 +632,61 @@
         {
           InetSocketAddress address = InetSocketAddress::ConvertFrom (from);
           NS_LOG_INFO ("ChordIpv4: Received " << packet->GetSize () << " bytes packet from " <<  address.GetIpv4 ());
-          Ipv4Address fromIpAddress = address.GetIpv4 ();
+          ProcessMessage (packet);
+        }
+    }
+}
 
-          ChordMessage chordMessage = ChordMessage (m_maxPacketTTL);
-          // Retrieve and Deserialize chord message
-          packet->RemoveHeader (chordMessage);
-          NS_LOG_INFO ("ChordMessage: " << chordMessage);
-          switch (chordMessage.GetMessageType ())
-            {
-            case ChordMessage::JOIN_REQ:
-              ProcessJoinReq (chordMessage);
-              break;
-            case ChordMessage::JOIN_RSP:
-              ProcessJoinRsp (chordMessage);
-              break;
-            case ChordMessage::LEAVE_REQ:
-              ProcessLeaveReq (chordMessage);
-              break;
-            case ChordMessage::LEAVE_RSP:
-              ProcessLeaveRsp (chordMessage);
-              break;
-            case ChordMessage::LOOKUP_REQ:
-              ProcessLookupReq (chordMessage);
-              break;
-            case ChordMessage::LOOKUP_RSP:
-              ProcessLookupRsp (chordMessage);
-              break;
-            case ChordMessage::STABILIZE_REQ:
-              ProcessStabilizeReq (chordMessage);
-              break;
-            case ChordMessage::STABILIZE_RSP:
-              ProcessStabilizeRsp (chordMessage);
-              break;
-            case ChordMessage::HEARTBEAT_REQ:
-              ProcessHeartbeatReq (chordMessage);
-              break;
-            case ChordMessage::HEARTBEAT_RSP:
-              ProcessHeartbeatRsp (chordMessage);
-              break;
-            case ChordMessage::FINGER_REQ:
-              ProcessFingerReq (chordMessage);
-              break;
-            case ChordMessage::FINGER_RSP:
-              ProcessFingerRsp (chordMessage);
-              break;
-            case ChordMessage::TRACE_RING:
-              ProcessTraceRing (chordMessage);
-              break;
-            default:
-              break;
-
-            }
-        }
+void
+ChordIpv4::ProcessMessage (Ptr<Packet> packet)
+{
+  ChordMessage chordMessage = ChordMessage (m_maxPacketTTL);
+  // Retrieve and Deserialize chord message
+  packet->RemoveHeader (chordMessage);
+  NS_LOG_INFO ("ChordMessage: " << chordMessage);
+  switch (chordMessage.GetMessageType ())
+    {
+      case ChordMessage::JOIN_REQ:
+        ProcessJoinReq (chordMessage);
+        break;
+      case ChordMessage::JOIN_RSP:
+        ProcessJoinRsp (chordMessage);
+        break;
+      case ChordMessage::LEAVE_REQ:
+        ProcessLeaveReq (chordMessage);
+        break;
+      case ChordMessage::LEAVE_RSP:
+        ProcessLeaveRsp (chordMessage);
+        break;
+      case ChordMessage::LOOKUP_REQ:
+        ProcessLookupReq (chordMessage);
+        break;
+      case ChordMessage::LOOKUP_RSP:
+        ProcessLookupRsp (chordMessage);
+        break;
+      case ChordMessage::STABILIZE_REQ:
+        ProcessStabilizeReq (chordMessage);
+        break;
+      case ChordMessage::STABILIZE_RSP:
+        ProcessStabilizeRsp (chordMessage);
+        break;
+      case ChordMessage::HEARTBEAT_REQ:
+        ProcessHeartbeatReq (chordMessage);
+        break;
+      case ChordMessage::HEARTBEAT_RSP:
+        ProcessHeartbeatRsp (chordMessage);
+        break;
+      case ChordMessage::FINGER_REQ:
+        ProcessFingerReq (chordMessage);
+        break;
+      case ChordMessage::FINGER_RSP:
+        ProcessFingerRsp (chordMessage);
+        break;
+      case ChordMessage::TRACE_RING:
+        ProcessTraceRing (chordMessage);
+        break;
+      default:
+        break;
     }
 }
 
@@ -1158,7 +1179,19 @@
 ChordIpv4::SendPacket (Ptr<Packet> packet, Ipv4Address destinationIp, uint16_t destinationPort)
 {
   NS_LOG_FUNCTION_NOARGS ();
-  m_socket->SendTo (packet, 0, InetSocketAddress (destinationIp, destinationPort));
+  if (m_started)
+  {
+    if (destinationIp == m_localIpAddress && destinationPort == m_listeningPort)
+    {
+      Simulator::Schedule (Simulator::Now (), &ChordIpv4::ProcessMessage, this, packet);
+    }
+    else
+    {
+      m_socket->SendTo (packet, 0, InetSocketAddress (destinationIp, destinationPort));
+    }
+  }
+  else
+    NS_LOG_ERROR ("Error: ChordIpv4 layer inactive");
 }
 
 /*  Logic: We need to send packet via virtual node whose key is nearest to the requested key. Our aim is to minimize lookup hops.
@@ -1346,11 +1379,10 @@
 
                   continue;
                 }
-
+              // Delete vNode
+              DeleteVNode (vNode->GetChordIdentifier ());
               // No successor(s) in list, report failure and remove vNode
               NotifyVNodeFailure (vNode->GetVNodeName (), vNode->GetChordIdentifier ());
-              // Delete vNode
-              DeleteVNode (vNode->GetChordIdentifier ());
               if (m_vNodeMap.GetSize () == 0)
                 {
                   break;
--- a/src/applications/chord-ipv4/chord-ipv4.h	Wed Feb 17 19:31:52 2010 -0500
+++ b/src/applications/chord-ipv4/chord-ipv4.h	Wed Mar 10 14:56:05 2010 -0500
@@ -276,10 +276,12 @@
 private:
   virtual void StartApplication (void);
   virtual void StopApplication (void);
-
+  
   /**
    *  \cond
    */
+  bool m_started;
+
   bool m_dHashEnable;
 
   Ptr<Socket> m_socket;
@@ -358,6 +360,7 @@
   void NotifyRetrieveFailure (uint8_t* key, uint8_t keyBytes);
 
   // Message processing methods
+  void ProcessMessage (Ptr<Packet> packet);
   void ProcessUdpPacket (Ptr<Socket> socket);
   void ProcessJoinReq (ChordMessage chordMessage);
   void ProcessJoinRsp (ChordMessage chordMessage);