Fix for accidental creation of multiple Chord rings and addition of Packet TimeToLive feature
authorHarjot Gill <gillh@seas.upenn.edu>
Wed, 17 Feb 2010 19:31:52 -0500
changeset 5997 86ea410b5dec
parent 5996 a4d23ba698c0
child 5998 c1cfbbb5750b
Fix for accidental creation of multiple Chord rings and addition of Packet TimeToLive feature
examples/chord-run/chord-test-script
src/applications/chord-ipv4/chord-ipv4.cc
src/applications/chord-ipv4/chord-ipv4.h
src/applications/chord-ipv4/chord-message.cc
src/applications/chord-ipv4/chord-message.h
src/applications/chord-ipv4/dhash-connection.cc
src/applications/chord-ipv4/dhash-connection.h
src/applications/chord-ipv4/dhash-ipv4.cc
src/applications/chord-ipv4/dhash-ipv4.h
src/applications/chord-ipv4/dhash-message.cc
--- a/examples/chord-run/chord-test-script	Sat Feb 13 17:12:33 2010 -0500
+++ b/examples/chord-run/chord-test-script	Wed Feb 17 19:31:52 2010 -0500
@@ -47,34 +47,63 @@
 
 echo-----------Inject_Data---------------
 1 Insert Boston Celtics
+Time 1000
 5 Insert NewJersey Nets
+Time 1000
 9 Insert NewYork Knicks
+Time 1000
 13 Insert Philadelphia 76ers
+Time 1000
 17 Insert Toronto Raptors
+Time 1000
 2 Insert Chicago Bulls
+Time 1000
 6 Insert Cleveland Cavaliers
+Time 1000
 10 Insert Detroit Pistons
+Time 1000
 14 Insert Indiana Pacers
+Time 1000
 18 Insert Milwaukee Bucks
+Time 1000
 3 Insert Atlanta Hawks
+Time 1000
 7 Insert Charlotte Bobcats
+Time 1000
 11 Insert Miami Heat
+Time 1000
 15 Insert Orlando Magic
+Time 1000
 19 Insert Washington Wizards
+Time 1000
 4 Insert Dallas Mavericks
+Time 1000
 8 Insert Houston Rockets
+Time 1000
 12 Insert Memphis Grizzlies
+Time 1000
 16 Insert NewOrleans Hornets
+Time 1000
 19 Insert SanAntonio Spurs
+Time 1000
 1 Insert GoldenState Warriors
+Time 1000
 2 Insert LosAngeles Clippers
+Time 1000
 3 Insert LosAngeles Lakers
+Time 1000
 4 Insert Phoenix Suns
+Time 1000
 5 Insert Sacramento Kings
+Time 1000
 6 Insert Denver Nuggets
+Time 1000
 7 Insert Minnesota Timberwolves
+Time 1000
 8 Insert Portland TrailBlazers
+Time 1000
 9 Insert OklahomaCity Thunder
+Time 1000
 10 Insert Utah Jazz
 
 
--- a/src/applications/chord-ipv4/chord-ipv4.cc	Sat Feb 13 17:12:33 2010 -0500
+++ b/src/applications/chord-ipv4/chord-ipv4.cc	Wed Feb 17 19:31:52 2010 -0500
@@ -131,6 +131,11 @@
                    TimeValue (MilliSeconds (DEFAULT_FIX_FINGER_INTERVAL)),
                    MakeTimeAccessor (&ChordIpv4::m_fixFingerInterval),
                    MakeTimeChecker ())
+    .AddAttribute ("PacketTTL",
+                   "Maximum HopCounter(TimeToLive) for Chord Requests",
+                   UintegerValue (DEFAULT_MAX_PACKET_TTL),
+                   MakeUintegerAccessor (&ChordIpv4::m_maxPacketTTL),
+                   MakeUintegerChecker<uint8_t> ())
 
   ;
   return tid;
@@ -492,8 +497,7 @@
   Ptr<ChordNode> chordNode = DynamicCast<ChordNode> (vNode);
   m_vNodeMap.UpdateNode (chordNode);
   // Send this request to bootstrap IP
-  Ptr<Packet> packet = Create<Packet> ();
-  ChordMessage chordMessage = ChordMessage ();
+  ChordMessage chordMessage = ChordMessage (m_maxPacketTTL);
   vNode->PackJoinReq (chordMessage);
   // Add transaction
   Ptr<ChordTransaction> chordTransaction = Create<ChordTransaction> (chordMessage.GetTransactionId (), chordMessage, m_requestTimeout, m_maxRequestRetries);
@@ -503,20 +507,16 @@
   // Start transaction timer
   EventId requestTimeoutId = Simulator::Schedule (chordTransaction->GetRequestTimeout (), &ChordIpv4::HandleRequestTimeout, this, vNode, chordMessage.GetTransactionId ());
   chordTransaction->SetRequestTimeoutEventId (requestTimeoutId);
-  packet->AddHeader (chordMessage);
-  if (packet->GetSize ())
+  NS_LOG_INFO ("Sending JoinReq\n" << chordMessage);
+  if (m_vNodeMap.GetSize () > 1)
     {
-      NS_LOG_INFO ("Sending JoinReq\n" << chordMessage);
-      if (m_vNodeMap.GetSize () > 1)
+      if (RouteChordMessage (vNode->GetChordIdentifier (), chordMessage) == true)
         {
-          if (RoutePacket (vNode->GetChordIdentifier (), packet) == true)
-            {
-              return;
-            }
+          return;
         }
-      // Default:: Send to bootstrap node
-      SendPacket (packet, m_bootStrapIp, m_bootStrapPort);
     }
+  // Default:: Send to bootstrap node
+  SendChordMessage (chordMessage, m_bootStrapIp, m_bootStrapPort);
 }
 
 
@@ -535,17 +535,12 @@
   Ptr<ChordVNode> virtualNode = DynamicCast<ChordVNode> (chordNode);
 
   // Send this request to bootstrap IP
-  Ptr<Packet> packet = Create<Packet> ();
-  ChordMessage chordMessage = ChordMessage ();
+  ChordMessage chordMessage = ChordMessage (m_maxPacketTTL);
   virtualNode->PackLeaveReq (chordMessage);
  
-  packet->AddHeader (chordMessage);
-  if (packet->GetSize ())
-    {
-      NS_LOG_INFO ("Sending LeaveReq\n" << chordMessage);
-      SendPacket (packet,virtualNode->GetSuccessor ()->GetIpAddress (), virtualNode->GetSuccessor ()->GetPort ());
-      SendPacket (packet,virtualNode->GetPredecessor ()->GetIpAddress (), virtualNode->GetPredecessor ()->GetPort ());
-    }
+  NS_LOG_INFO ("Sending LeaveReq\n" << chordMessage);
+  SendChordMessage (chordMessage, virtualNode->GetSuccessor ()->GetIpAddress (), virtualNode->GetSuccessor ()->GetPort ());
+  SendChordMessage (chordMessage, virtualNode->GetPredecessor ()->GetIpAddress (), virtualNode->GetPredecessor ()->GetPort ());
 
   // delete VNode from m_vNodeMap
   DeleteVNode (vNodeName);
@@ -584,8 +579,7 @@
   virtualNode = FindNearestVNode (requestedIdentifier);
   if (virtualNode)
     {
-      Ptr<Packet> packet = Create<Packet> ();
-      ChordMessage chordMessage = ChordMessage ();
+      ChordMessage chordMessage = ChordMessage (m_maxPacketTTL);
       virtualNode->PackLookupReq (requestedIdentifier, chordMessage);
       // Add transaction
       Ptr<ChordTransaction> chordTransaction = Create<ChordTransaction> (chordMessage.GetTransactionId (), chordMessage, m_requestTimeout, m_maxRequestRetries);
@@ -597,12 +591,7 @@
       // Start transaction timer
       EventId requestTimeoutId = Simulator::Schedule (chordTransaction->GetRequestTimeout (), &ChordIpv4::HandleRequestTimeout, this, virtualNode, chordMessage.GetTransactionId ());
       chordTransaction->SetRequestTimeoutEventId (requestTimeoutId);
-      packet->AddHeader (chordMessage);
-      if (packet->GetSize ())
-        {
-          RouteViaFinger (requestedIdentifier, virtualNode, packet);
-          // SendPacket (packet, virtualNode->GetSuccessor()->GetIpAddress(), virtualNode->GetSuccessor()->GetPort());
-        }
+      RouteChordMessageViaFinger (requestedIdentifier, virtualNode, chordMessage);
     }
   else
     {
@@ -618,7 +607,8 @@
   NS_LOG_FUNCTION_NOARGS ();
   Ptr<Packet> packet;
   Address from;
-  while (packet = socket->RecvFrom (from))
+  //while (packet = socket->RecvFrom (from))
+  if ((packet = socket->RecvFrom (from)) != 0)
     {
       if (InetSocketAddress::IsMatchingType (from))
         {
@@ -626,7 +616,7 @@
           NS_LOG_INFO ("ChordIpv4: Received " << packet->GetSize () << " bytes packet from " <<  address.GetIpv4 ());
           Ipv4Address fromIpAddress = address.GetIpv4 ();
 
-          ChordMessage chordMessage = ChordMessage ();
+          ChordMessage chordMessage = ChordMessage (m_maxPacketTTL);
           // Retrieve and Deserialize chord message
           packet->RemoveHeader (chordMessage);
           NS_LOG_INFO ("ChordMessage: " << chordMessage);
@@ -690,28 +680,18 @@
       // No vNode exists as yet, drop this request.
       return;
     }
-  Ptr<Packet> packet = Create<Packet> ();
   // Check if we can be this node's successor
   Ptr<ChordVNode> virtualNode = LookupLocal (requestorNode->GetChordIdentifier ());
   if (virtualNode)
     {
-      ChordMessage chordMessageRsp = ChordMessage ();
+      ChordMessage chordMessageRsp = ChordMessage (m_maxPacketTTL);
       virtualNode->PackJoinRsp (requestorNode, transactionId, chordMessageRsp);
-      packet->AddHeader (chordMessageRsp);
-      // Send packet
-      if (packet->GetSize ())
-        {
-          NS_LOG_INFO ("Sending JoinRsp: " << chordMessageRsp);
-          SendPacket (packet, requestorNode->GetIpAddress (), requestorNode->GetPort ());
-        }
+      NS_LOG_INFO ("Sending JoinRsp: " << chordMessageRsp);
+      SendChordMessage (chordMessageRsp, requestorNode->GetIpAddress (), requestorNode->GetPort ());
       return;
     }
   // Could not resolve join request, forward to nearest successor
-  packet->AddHeader (chordMessage);
-  if (packet->GetSize ())
-    {
-      RoutePacket (requestorNode->GetChordIdentifier (), packet);
-    }
+  RouteChordMessage (requestorNode->GetChordIdentifier (), chordMessage);
 }
 
 void
@@ -758,25 +738,18 @@
       // No vNode exists as yet, drop this request.
       return;
     }
-  Ptr<Packet> packet = Create<Packet> ();
   // Check if we are owner of requestedIdentifier
   Ptr<ChordVNode> virtualNode = LookupLocal (requestedIdentifier);
   if (virtualNode)
     {
-      ChordMessage chordMessageRsp = ChordMessage ();
+      ChordMessage chordMessageRsp = ChordMessage (m_maxPacketTTL);
       virtualNode->PackLookupRsp (requestorNode,  transactionId, chordMessageRsp);
-      packet->AddHeader (chordMessageRsp);
-      // Send packet
-      if (packet->GetSize ())
-        {
-          NS_LOG_INFO ("Sending LookupRsp: " << chordMessageRsp);
-          SendPacket (packet, requestorNode->GetIpAddress (), requestorNode->GetPort ());
-        }
+      NS_LOG_INFO ("Sending LookupRsp: " << chordMessageRsp);
+      SendChordMessage (chordMessageRsp, requestorNode->GetIpAddress (), requestorNode->GetPort ());
       return;
     }
   // Could not resolve lookup request, forward to nearest successor
-  packet->AddHeader (chordMessage);
-  RoutePacket (requestedIdentifier, packet);
+  RouteChordMessage (requestedIdentifier, chordMessage);
 }
 
 void
@@ -801,11 +774,9 @@
       virtualNode->SetPredecessor (Create<ChordNode> (predecessorNode));
       NotifyVNodeKeyOwnership (virtualNode->GetVNodeName (), virtualNode->GetChordIdentifier (), virtualNode->GetPredecessor (), oldPredecessorNode->GetChordIdentifier ());
       // Send Leave Rsp (only required in case of successor)
-      ChordMessage respMessage = ChordMessage ();
+      ChordMessage respMessage = ChordMessage (m_maxPacketTTL);
       virtualNode->PackLeaveRsp (requestorNode, successorNode, predecessorNode, chordMessage);
-      Ptr<Packet> packet = Create<Packet> ();
-      packet->AddHeader (chordMessage);
-      SendPacket (packet, requestorNode->GetIpAddress (), requestorNode->GetPort ());
+      SendChordMessage (chordMessage, requestorNode->GetIpAddress (), requestorNode->GetPort ());
       NS_LOG_INFO ("Predecessor changed for VNode");
     }
 
@@ -907,16 +878,11 @@
       NotifyVNodeKeyOwnership (virtualNode->GetVNodeName (), virtualNode->GetChordIdentifier (), virtualNode->GetPredecessor (), oldPredecessorNode->GetChordIdentifier ());
       NS_LOG_INFO ("Predecessor changed for VNode");
     }
-  Ptr<Packet> packet = Create<Packet> ();
   // Send Response
-  ChordMessage chordMessageRsp = ChordMessage ();
+  ChordMessage chordMessageRsp = ChordMessage (m_maxPacketTTL);
   virtualNode->PackStabilizeRsp (requestorNode, chordMessageRsp);
-  packet->AddHeader (chordMessageRsp);
-  if (packet->GetSize ())
-    {
-      NS_LOG_INFO ("Sending StabilizeRsp: " << chordMessageRsp);
-      SendPacket (packet, requestorNode->GetIpAddress (), requestorNode->GetPort ());
-    }
+  NS_LOG_INFO ("Sending StabilizeRsp: " << chordMessageRsp);
+  SendChordMessage (chordMessageRsp, requestorNode->GetIpAddress (), requestorNode->GetPort ());
   return;
 }
 
@@ -972,15 +938,10 @@
     }
 
   // Reply to heartbeat
-  Ptr<Packet> packet = Create<Packet> ();
-  ChordMessage chordMessageRsp = ChordMessage ();
+  ChordMessage chordMessageRsp = ChordMessage (m_maxPacketTTL);
   virtualNode->PackHeartbeatRsp (requestorNode, chordMessageRsp);
-  packet->AddHeader (chordMessageRsp);
-  if (packet->GetSize ())
-    {
-      NS_LOG_INFO ("Sending StabilizeRsp: " << chordMessageRsp);
-      SendPacket (packet, requestorNode->GetIpAddress (), requestorNode->GetPort ());
-    }
+  NS_LOG_INFO ("Sending StabilizeRsp: " << chordMessageRsp);
+  SendChordMessage (chordMessageRsp, requestorNode->GetIpAddress (), requestorNode->GetPort ());
   return;
 }
 
@@ -1015,32 +976,25 @@
       // No vNode exists as yet, drop this request.
       return;
     }
-  Ptr<Packet> packet = Create<Packet> ();
   // Check if we are owner of requestedIdentifier
   Ptr<ChordVNode> virtualNode = LookupLocal (requestedIdentifier);
   if (virtualNode)
     {
-      ChordMessage chordMessageRsp = ChordMessage ();
+      ChordMessage chordMessageRsp = ChordMessage (m_maxPacketTTL);
       virtualNode->PackFingerRsp (requestorNode, requestedIdentifier,chordMessageRsp);
-      packet->AddHeader (chordMessageRsp);
-      // Send packet
-      if (packet->GetSize ())
-        {
-          NS_LOG_INFO ("Sending FingerRsp: " << chordMessageRsp);
-          SendPacket (packet, requestorNode->GetIpAddress (), requestorNode->GetPort ());
-        }
+      NS_LOG_INFO ("Sending FingerRsp: " << chordMessageRsp);
+      SendChordMessage (chordMessageRsp, requestorNode->GetIpAddress (), requestorNode->GetPort ());
       return;
     }
   // Could not resolve finger request, forward to successor
-  packet->AddHeader (chordMessage);
   Ptr<ChordVNode> vNode = FindNearestVNode (requestedIdentifier);
   if (vNode)
     {
-      SendPacket (packet, vNode->GetSuccessor ()->GetIpAddress (), vNode->GetSuccessor ()->GetPort ());
+      SendChordMessage (chordMessage, vNode->GetSuccessor ()->GetIpAddress (), vNode->GetSuccessor ()->GetPort ());
     }
   else
     {
-      SendViaAnyVNode (packet);
+      SendChordMessageViaAnyVNode (chordMessage);
     }
 }
 
@@ -1079,31 +1033,27 @@
       if (chordTransaction->GetChordMessage ().GetMessageType () == ChordMessage::JOIN_REQ)
         {
           NS_LOG_ERROR ("Join request failed!");
-          NotifyVNodeFailure (vNode->GetVNodeName (), vNode->GetChordIdentifier ());
           // Delete vNode
           DeleteVNode (vNode->GetChordIdentifier ());
+          NotifyVNodeFailure (vNode->GetVNodeName (), vNode->GetChordIdentifier ());
         }
       else if (chordTransaction->GetChordMessage ().GetMessageType () == ChordMessage::LOOKUP_REQ)
         {
           NS_LOG_ERROR ("Lookup Request failed!");
-          NotifyLookupFailure (chordTransaction->GetChordMessage ().GetLookupReq ().requestedIdentifier, chordTransaction->GetOriginator ());
           // cancel transaction
           vNode->RemoveTransaction (chordTransaction->GetTransactionId ());
+          NotifyLookupFailure (chordTransaction->GetChordMessage ().GetLookupReq ().requestedIdentifier, chordTransaction->GetOriginator ());
         }
       return;
     }
   else
     {
+      ChordMessage chordMessage = chordTransaction->GetChordMessage ();
       // Retransmit
       uint8_t retries = chordTransaction->GetRetries ();
       chordTransaction->SetRetries (retries + 1);
-      Ptr<Packet> packet = Create<Packet> ();
-      packet->AddHeader (chordTransaction->GetChordMessage ());
-      if (packet->GetSize ())
-        {
-          NS_LOG_INFO ("Retransmission Req\n" << chordTransaction->GetChordMessage ());
-          SendPacket (packet, m_bootStrapIp, m_bootStrapPort);
-        }
+      NS_LOG_INFO ("Retransmission Req\n" << chordTransaction->GetChordMessage ());
+      SendChordMessage (chordMessage , m_bootStrapIp, m_bootStrapPort);
       // Reschedule
       // Start transaction timer
       EventId requestTimeoutId = Simulator::Schedule (chordTransaction->GetRequestTimeout (), &ChordIpv4::HandleRequestTimeout, this, vNode, transactionId);
@@ -1157,13 +1107,15 @@
       if (chordIdentifier->IsInBetween (vNode->GetPredecessor ()->GetChordIdentifier (), vNode->GetChordIdentifier () ))
         {
           // Do not accept ownership if we have set ourselves as predecessor, but accept in bootstrap case. This means our predecessor recently died and we are waiting for someone to send us stabilize.
-          if (vNode->GetPredecessor ()->GetChordIdentifier ()->IsEqual (vNode->GetChordIdentifier ()) && !vNode->GetPredecessor ()->GetChordIdentifier ()->IsEqual (vNode->GetSuccessor ()->GetChordIdentifier ()))
+          if (vNode->GetPredecessor ()->GetChordIdentifier ()->IsEqual (vNode->GetChordIdentifier ()) && !(isBootStrapNode && m_vNodeMap.GetSize() == 1))
             {
-              return 0;
+              continue;
             }
-
-          // We are the owner. Set virtualNode pointer and return success
-          return DynamicCast<ChordVNode> (*vNodeIter);
+          else
+            {
+              // We are the owner. Set virtualNode pointer and return success
+              return DynamicCast<ChordVNode> (*vNodeIter);
+            }
         }
     }
   NS_LOG_INFO ("NOT OWNER, localIpAddress: " << m_localIpAddress << " listeningPort" << m_listeningPort);
@@ -1186,6 +1138,23 @@
 }
 
 void
+ChordIpv4::SendChordMessage (ChordMessage &chordMessage, Ipv4Address destinationIp, uint16_t destinationPort)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  if (!UpdateTTL (chordMessage))
+    {
+      NS_LOG_INFO ("Dropping packet: TTL expiry");
+      return;
+    }
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader (chordMessage);
+  if (packet->GetSize ())
+   {
+      SendPacket (packet, destinationIp, destinationPort);
+    }
+}
+
+void
 ChordIpv4::SendPacket (Ptr<Packet> packet, Ipv4Address destinationIp, uint16_t destinationPort)
 {
   NS_LOG_FUNCTION_NOARGS ();
@@ -1209,6 +1178,27 @@
   return DynamicCast<ChordVNode> (chordNode);
 }
 
+bool
+ChordIpv4::SendChordMessageViaAnyVNode (ChordMessage &chordMessage)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  if (!UpdateTTL (chordMessage))
+    {
+      NS_LOG_INFO ("Dropping packet: TTL expiry");
+      return true;
+    }
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader (chordMessage);
+  if (packet->GetSize ())
+    {
+      return SendViaAnyVNode (packet);
+    }
+  else
+    {
+      return false;
+    }
+}
+
 bool 
 ChordIpv4::SendViaAnyVNode (Ptr<Packet> packet)
 {
@@ -1227,7 +1217,26 @@
     }
   return false;
 }
-
+bool
+ChordIpv4::RouteChordMessage (Ptr<ChordIdentifier> targetIdentifier, ChordMessage &chordMessage)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  if (!UpdateTTL (chordMessage))
+    {
+      NS_LOG_INFO ("Dropping packet: TTL expiry");
+      return true;
+    }
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader (chordMessage);
+  if (packet->GetSize ())
+    {
+      return RoutePacket (targetIdentifier, packet);
+    }
+  else
+    {
+      return false;
+    }
+}
 
 bool
 ChordIpv4::RoutePacket (Ptr<ChordIdentifier> targetIdentifier, Ptr<Packet> packet)
@@ -1252,6 +1261,27 @@
 }
 
 bool
+ChordIpv4::RouteChordMessageViaFinger (Ptr<ChordIdentifier> targetIdentifier, Ptr<ChordVNode> vNode, ChordMessage &chordMessage)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  if (!UpdateTTL (chordMessage))
+    {
+      NS_LOG_INFO ("Dropping packet: TTL expiry");
+      return true;
+    }
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader (chordMessage);
+  if (packet->GetSize ())
+    {
+      return RouteViaFinger (targetIdentifier, vNode, packet);
+    }
+  else
+    {
+      return false;
+    }
+}
+
+bool
 ChordIpv4::RouteViaFinger (Ptr<ChordIdentifier> targetIdentifier, Ptr<ChordVNode> vNode, Ptr<Packet> packet)
 {
   if (packet->GetSize ())
@@ -1273,6 +1303,16 @@
   return false;
 }
 
+bool
+ChordIpv4::UpdateTTL (ChordMessage &chordMessage)
+{
+  if (chordMessage.GetTTL () <= 0)
+    {
+      return false;
+    }
+  chordMessage.SetTTL (chordMessage.GetTTL () - 1);
+  return true;
+}
 
 
 void
@@ -1283,6 +1323,12 @@
   for (vector<Ptr<ChordNode> >::iterator vNodeIter = chordNodes.begin (); vNodeIter != chordNodes.end (); vNodeIter++)
     {
       Ptr<ChordVNode> vNode = DynamicCast<ChordVNode> (*vNodeIter);
+      //Do not process for nodes still in joining process
+      if (vNode->GetSuccessor ()->GetChordIdentifier ()->IsEqual (vNode->GetChordIdentifier ()))
+        {
+          continue;
+        }
+
       // Check if successor is alive. Shift successor if necessary. If all else fails, send CHORD_FAILURE to user and remove vNode
       // Compare timestamp and check if current successor has died
       if (vNode->GetSuccessor ()->GetTimestamp ().GetMilliSeconds () + m_stabilizeInterval.GetMilliSeconds () * m_maxMissedKeepAlives < Simulator::Now ().GetMilliSeconds ())
@@ -1403,18 +1449,12 @@
           virtualNode->GetFingerTable ().UpdateNode (fingerNode);
           continue;
         }
-      Ptr<Packet> packet = Create<Packet> ();
-      ChordMessage chordMessage = ChordMessage ();
+      ChordMessage chordMessage = ChordMessage (m_maxPacketTTL);
       virtualNode->PackFingerReq (fingerIdentifier, chordMessage);
-      packet->AddHeader (chordMessage);
-      if (packet->GetSize ())
-        {
-          virtualNode->GetStats ().fingersLookedUp++;
-          NS_LOG_INFO ("Sending FingerReq: " << chordMessage);
-          // Route using successor for finger fixing
-          SendPacket (packet, virtualNode->GetSuccessor ()->GetIpAddress (), virtualNode->GetSuccessor ()->GetPort ());
-          // RoutePacket (fingerIdentifier, packet);
-        }
+      virtualNode->GetStats ().fingersLookedUp++;
+      NS_LOG_INFO ("Sending FingerReq: " << chordMessage);
+      // Route using successor for finger fixing
+      SendChordMessage (chordMessage, virtualNode->GetSuccessor ()->GetIpAddress (), virtualNode->GetSuccessor ()->GetPort ());
     }
 }
 
@@ -1427,15 +1467,10 @@
       virtualNode->GetSuccessor ()->SetTimestamp (Simulator::Now ());
       return;
     }
-  Ptr<Packet> packet = Create<Packet> ();
-  ChordMessage chordMessage = ChordMessage ();
+  ChordMessage chordMessage = ChordMessage (m_maxPacketTTL);
   virtualNode->PackStabilizeReq (chordMessage);
-  packet->AddHeader (chordMessage);
-  if (packet->GetSize ())
-    {
-      NS_LOG_INFO ("Sending StabilizeReq: " << chordMessage);
-      SendPacket (packet, virtualNode->GetSuccessor ()->GetIpAddress (), virtualNode->GetSuccessor ()->GetPort ());
-    }
+  NS_LOG_INFO ("Sending StabilizeReq: " << chordMessage);
+  SendChordMessage (chordMessage, virtualNode->GetSuccessor ()->GetIpAddress (), virtualNode->GetSuccessor ()->GetPort ());
 }
 
 void
@@ -1447,15 +1482,10 @@
       virtualNode->GetPredecessor ()->SetTimestamp (Simulator::Now ());
       return;
     }
-  Ptr<Packet> packet = Create<Packet> ();
-  ChordMessage chordMessage = ChordMessage ();
+  ChordMessage chordMessage = ChordMessage (m_maxPacketTTL);
   virtualNode->PackHeartbeatReq (chordMessage);
-  packet->AddHeader (chordMessage);
-  if (packet->GetSize ())
-    {
-      NS_LOG_INFO ("Sending HeartbeatReq: " << chordMessage);
-      SendPacket (packet, virtualNode->GetPredecessor ()->GetIpAddress (), virtualNode->GetPredecessor ()->GetPort ());
-    }
+  NS_LOG_INFO ("Sending HeartbeatReq: " << chordMessage);
+  SendChordMessage (chordMessage, virtualNode->GetPredecessor ()->GetIpAddress (), virtualNode->GetPredecessor ()->GetPort ());
 
 }
 
@@ -1527,16 +1557,10 @@
   if (virtualNode)
     {
       NotifyTraceRing (virtualNode->GetVNodeName (), virtualNode->GetChordIdentifier ());
-      Ptr<Packet> packet = Create<Packet> ();
-      ChordMessage chordMessageFwd = ChordMessage ();
+      ChordMessage chordMessageFwd = ChordMessage (m_maxPacketTTL);
       virtualNode->PackTraceRing (virtualNode, chordMessageFwd);
-      packet->AddHeader (chordMessageFwd);
-      if (packet->GetSize ())
-        {
-          NS_LOG_INFO ("Forwarding TraceRing: " << chordMessageFwd);
-          SendPacket (packet, virtualNode->GetSuccessor ()->GetIpAddress (), virtualNode->GetSuccessor ()->GetPort ());
-        }
-
+      NS_LOG_INFO ("Forwarding TraceRing: " << chordMessageFwd);
+      SendChordMessage (chordMessageFwd, virtualNode->GetSuccessor ()->GetIpAddress (), virtualNode->GetSuccessor ()->GetPort ());
     }
 }
 
@@ -1564,15 +1588,10 @@
     {
       return;
     }
-  Ptr<Packet> packet = Create<Packet> ();
-  ChordMessage chordMessageFwd = ChordMessage ();
+  ChordMessage chordMessageFwd = ChordMessage (m_maxPacketTTL);
   virtualNode->PackTraceRing (requestorNode, chordMessageFwd);
-  packet->AddHeader (chordMessageFwd);
-  if (packet->GetSize ())
-    {
-      NS_LOG_INFO ("Forwarding TraceRing: " << chordMessageFwd);
-      SendPacket (packet, virtualNode->GetSuccessor ()->GetIpAddress (), virtualNode->GetSuccessor ()->GetPort ());
-    }
+  NS_LOG_INFO ("Forwarding TraceRing: " << chordMessageFwd);
+  SendChordMessage (chordMessageFwd, virtualNode->GetSuccessor ()->GetIpAddress (), virtualNode->GetSuccessor ()->GetPort ());
 
 }
 
--- a/src/applications/chord-ipv4/chord-ipv4.h	Sat Feb 13 17:12:33 2010 -0500
+++ b/src/applications/chord-ipv4/chord-ipv4.h	Wed Feb 17 19:31:52 2010 -0500
@@ -51,6 +51,8 @@
 #define DEFAULT_MAX_VNODE_SUCCESSOR_LIST_SIZE 8
 // Max Predecessor List Size
 #define DEFAULT_MAX_VNODE_PREDECESSOR_LIST_SIZE 8
+// Max Packet TimeToLive
+#define DEFAULT_MAX_PACKET_TTL 32
 
 
 namespace ns3 {
@@ -311,6 +313,7 @@
   uint8_t m_maxMissedKeepAlives;
 
   uint8_t m_maxRequestRetries;
+  uint8_t m_maxPacketTTL;
 
   void StabilizeTimerExpire ();
   void HeartBeatTimerExpire ();
@@ -384,10 +387,15 @@
   Ptr<ChordVNode> LookupLocal (Ptr<ChordIdentifier> chordIdentifier);
 
   // Send/Routing Methods
+  void SendChordMessage (ChordMessage &chordMessage, Ipv4Address destinationIO, uint16_t destinationPort);
   void SendPacket (Ptr<Packet> packet, Ipv4Address destinationIp, uint16_t destinationPort);
+  bool SendChordMessageViaAnyVNode (ChordMessage &chordMessage);
   bool SendViaAnyVNode (Ptr<Packet> packet);
+  bool RouteChordMessage (Ptr<ChordIdentifier> targetIdentifier, ChordMessage &chordMessage);
   bool RoutePacket (Ptr<ChordIdentifier> targetIdentifier, Ptr<Packet> packet);
+  bool RouteChordMessageViaFinger (Ptr<ChordIdentifier> targetIdentifier, Ptr<ChordVNode> vNode, ChordMessage &chordMessage);
   bool RouteViaFinger (Ptr<ChordIdentifier> targetIdentifier, Ptr<ChordVNode> vNode, Ptr<Packet> packet);
+  bool UpdateTTL (ChordMessage &chordMessage);
 
   // Timeouts
   void HandleRequestTimeout (Ptr<ChordVNode> chordVNode, uint32_t transactionId);
--- a/src/applications/chord-ipv4/chord-message.cc	Sat Feb 13 17:12:33 2010 -0500
+++ b/src/applications/chord-ipv4/chord-message.cc	Wed Feb 17 19:31:52 2010 -0500
@@ -26,9 +26,14 @@
 
 NS_OBJECT_ENSURE_REGISTERED (ChordMessage);
 
+ChordMessage::ChordMessage (uint8_t ttl)
+{
+  m_transactionId = 0;
+  m_ttl = ttl;
+}
+
 ChordMessage::ChordMessage ()
 {
-  m_transactionId = 0;
 }
 
 ChordMessage::~ChordMessage ()
@@ -161,7 +166,7 @@
   os << "TransactionId: " << m_transactionId << "\n";
   os << "Requestor Node: " << "\n";
   m_chordNode->Print (os);
-  os << "TTL : " << m_ttl << "\n";
+  os << "TTL : " << (uint16_t) m_ttl << "\n";
   os << "Payload:: \n";
   switch (m_messageType)
     {
--- a/src/applications/chord-ipv4/chord-message.h	Sat Feb 13 17:12:33 2010 -0500
+++ b/src/applications/chord-ipv4/chord-message.h	Wed Feb 17 19:31:52 2010 -0500
@@ -54,6 +54,7 @@
     TRACE_RING = 20,
   };
 
+  ChordMessage (uint8_t ttl);
   ChordMessage ();
   virtual ~ChordMessage ();
 
--- a/src/applications/chord-ipv4/dhash-connection.cc	Sat Feb 13 17:12:33 2010 -0500
+++ b/src/applications/chord-ipv4/dhash-connection.cc	Wed Feb 17 19:31:52 2010 -0500
@@ -58,6 +58,7 @@
   m_totalTxBytes = 0;
   m_currentTxBytes = 0;
   m_lastActivityTime = Simulator::Now ();
+  m_connState = dHashConnection->GetConnState();
   m_socket->SetRecvCallback (MakeCallback (&DHashConnection::ReadTCPBuffer, this));
 }
 
@@ -85,9 +86,9 @@
     {
       m_socket->Close ();
       m_socket->SetRecvCallback (MakeNullCallback<void, Ptr<Socket> > ());
+      m_socket->SetConnectCallback (MakeNullCallback<void, Ptr<Socket> > () , MakeNullCallback<void, Ptr<Socket> > ());
       m_socket = 0;
     }
-  m_ipAddress = 0;
   m_port = 0;
   m_txState = TX_IDLE;
   m_rxState = RX_IDLE;
@@ -96,6 +97,18 @@
   m_txPacketList.clear ();
 }
 
+DHashConnection::ConnectionState
+DHashConnection::GetConnState ()
+{
+  return m_connState;
+}
+
+void
+DHashConnection::SetConnState (DHashConnection::ConnectionState connState)
+{
+  m_connState = connState;
+}
+
 Ipv4Address
 DHashConnection::GetIpAddress ()
 {
@@ -125,8 +138,11 @@
       // Start transmitting
       m_txState = TRANSMITTING;
       m_socket->SetSendCallback (MakeCallback (&DHashConnection::WriteTCPBuffer, this));
-      // Initiate transmission
-      WriteTCPBuffer (m_socket, m_socket->GetTxAvailable ());
+      if (m_connState == CONNECTED)
+        {
+          // Initiate transmission
+          WriteTCPBuffer (m_socket, m_socket->GetTxAvailable ());
+        }
     }
   return;
 }
--- a/src/applications/chord-ipv4/dhash-connection.h	Sat Feb 13 17:12:33 2010 -0500
+++ b/src/applications/chord-ipv4/dhash-connection.h	Wed Feb 17 19:31:52 2010 -0500
@@ -42,6 +42,13 @@
 class DHashConnection : public SimpleRefCount<DHashConnection>
 {
 public:
+
+  enum ConnectionState
+  {
+    NOT_CONNECTED = 0,
+    CONNECTED = 1,
+  };
+
   /**
    *  \brief Constructor
    *  \param ipAddress Ipv4Address of remote node
@@ -59,6 +66,15 @@
   virtual void DoDispose ();
 
   /**
+   *  \returns connection state
+   */
+  ConnectionState GetConnState ();
+  /**
+   *  \sets connection state
+   */
+  void SetConnState (ConnectionState connState);
+  
+  /**
    *  \returns Ipv4Address of remote host
    */
   Ipv4Address GetIpAddress ();
@@ -138,6 +154,8 @@
   uint32_t m_currentRxBytes;
   Ptr<Packet> m_currentRxPacket;
   Callback<void, Ptr<Packet>, Ptr<DHashConnection> > m_recvFn;
+
+  ConnectionState m_connState;
   /**
    *  \endcond
    */
--- a/src/applications/chord-ipv4/dhash-ipv4.cc	Sat Feb 13 17:12:33 2010 -0500
+++ b/src/applications/chord-ipv4/dhash-ipv4.cc	Wed Feb 17 19:31:52 2010 -0500
@@ -250,7 +250,7 @@
           // Open new connection
           TypeId tid = TypeId::LookupByName ("ns3::TcpSocketFactory");
           Ptr<Socket> socket = Socket::CreateSocket (m_chordApplication->GetNode (), tid);
-          connection = AddConnection (socket, ipAddress, port);
+          connection = AddConnection (socket, ipAddress, port, DHashConnection::NOT_CONNECTED);
           socket->Bind ();
           socket->Connect (InetSocketAddress (ipAddress, port));
         }
@@ -321,7 +321,7 @@
 DHashIpv4::HandleAccept (Ptr<Socket> socket, const Address& address)
 {
   InetSocketAddress from = InetSocketAddress::ConvertFrom (address);
-  AddConnection (socket, from.GetIpv4 (), from.GetPort ());
+  AddConnection (socket, from.GetIpv4 (), from.GetPort (), DHashConnection::CONNECTED);
 }
 
 void
@@ -679,17 +679,36 @@
   SendDHashRequest (ipAddress, port, dHashTransaction);
 }
 
+void
+DHashIpv4::HandleConnectSuccess (Ptr<Socket> socket)
+{
+  Ptr<DHashConnection> connection = FindConnection (socket);
+  if (connection != NULL)
+    {
+      connection->SetConnState (DHashConnection::CONNECTED);
+      //Start transmission
+      connection->WriteTCPBuffer (connection->GetSocket (), connection->GetSocket ()->GetTxAvailable ());
+    }
+}
+
+void
+DHashIpv4::HandleConnectFailure (Ptr<Socket> socket)
+{
+  HandleClose (socket);
+}
+
 Ptr<DHashConnection>
-DHashIpv4::AddConnection (Ptr<Socket> socket, Ipv4Address ipAddress, uint16_t port)
+DHashIpv4::AddConnection (Ptr<Socket> socket, Ipv4Address ipAddress, uint16_t port, DHashConnection::ConnectionState connState)
 {
   // Create new connection control block
   Ptr<DHashConnection> dHashConnection = Create<DHashConnection> (ipAddress, port, socket);
-  // socket->SetRecvCallback (MakeCallback(&DHashConnection::ReadTCPBuffer, dHashConnection));
   dHashConnection->SetRecvCallback (MakeCallback (&DHashIpv4::ProcessDHashMessage, this));
-  // dHashConnection->SetCloseCallback(MakeCallback(&DHashIpv4::ProcessDHashMessage, this));
+  dHashConnection->SetConnState (connState);
 
   socket->SetCloseCallbacks (MakeCallback (&DHashIpv4::HandleClose, this),
                              MakeCallback (&DHashIpv4::HandleClose, this));
+  socket->SetConnectCallback (MakeCallback (&DHashIpv4::HandleConnectSuccess, this),
+                              MakeCallback (&DHashIpv4::HandleConnectFailure, this));
   // Add new connection to map
   m_dHashConnectionTable.insert (std::make_pair (socket, dHashConnection));
   return dHashConnection;
--- a/src/applications/chord-ipv4/dhash-ipv4.h	Sat Feb 13 17:12:33 2010 -0500
+++ b/src/applications/chord-ipv4/dhash-ipv4.h	Wed Feb 17 19:31:52 2010 -0500
@@ -121,6 +121,9 @@
   void HandleAccept (Ptr<Socket> socket, const Address& address);
   void HandleOwnershipTrigger (uint8_t* vNodeKey, uint8_t vNodeBytes,uint8_t* predKey, uint8_t predBytes, uint8_t* oldPredKey, uint8_t oldPredBytes, Ipv4Address predIp, uint16_t predPort);
   void HandleClose (Ptr<Socket> socket);
+  //For Traffic sockets
+  void HandleConnectSuccess (Ptr<Socket>);
+  void HandleConnectFailure (Ptr<Socket>);
 
   // Periodic processes
   void DoPeriodicAuditConnections ();
@@ -157,7 +160,7 @@
   void SendDHashRequest (Ipv4Address ipAddress, uint16_t port, Ptr<DHashTransaction> dHashTransaction);
 
   // Connection Layer
-  Ptr<DHashConnection> AddConnection (Ptr<Socket> socket, Ipv4Address ipAddress, uint16_t port);
+  Ptr<DHashConnection> AddConnection (Ptr<Socket> socket, Ipv4Address ipAddress, uint16_t port, DHashConnection::ConnectionState);
   Ptr<DHashConnection> FindConnection (Ptr<Socket> m_socket);
   void RemoveConnection (Ptr<Socket> socket);
   Ptr<DHashConnection> FindConnection (Ipv4Address ipAddress, uint16_t port);
--- a/src/applications/chord-ipv4/dhash-message.cc	Sat Feb 13 17:12:33 2010 -0500
+++ b/src/applications/chord-ipv4/dhash-message.cc	Wed Feb 17 19:31:52 2010 -0500
@@ -272,7 +272,7 @@
 DHashMessage::StoreRsp::Print (std::ostream &os) const
 {
   os << "StoreRsp: \n";
-  os << "Status: \n" << statusTag;
+  os << "Status: \n" << (uint16_t) statusTag;
   os << "Object Identifier: " << objectIdentifier;
 }
 
@@ -339,8 +339,11 @@
 DHashMessage::RetrieveRsp::Print (std::ostream &os) const
 {
   os << "RetrieveRsp: \n";
-  os << "Status: \n" << statusTag;
-  os << "Object Dump: " << dHashObject;
+  os << "Status: \n" << (uint16_t) statusTag;
+  if (statusTag == DHashMessage::OBJECT_FOUND)
+    {
+      os << "Object: \n" << dHashObject;
+    }
 }
 
 void