Fixing Bootstrap virtual node creation bug.
--- 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);