--- 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/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;