--- a/src/mih/mih-callbacks.h Wed Nov 26 09:22:37 2008 +0100
+++ b/src/mih/mih-callbacks.h Thu Nov 27 05:45:56 2008 +0100
@@ -81,7 +81,7 @@
typedef Callback<void, MihfId, NetworkTypeAddressList, EventList, MihCommandList, InformationServiceQueryTypeList, TransportSupportList, MakeBeforeBreakSupportList, MihCapabilityDisdoverResponseCallback> MihCapabilityDisdoverIndicationCallback;
typedef Callback<void, MihfId, Status, NetworkTypeAddressList, EventList, MihCommandList, InformationServiceQueryTypeList, TransportSupportList, MakeBeforeBreakSupportList> MihCapabilityDisdoverConfirmCallback;
// Register;
- typedef Callback<MihfId, Status, uint32_t> MihRegisterResponseCallback;
+ typedef Callback<void, MihfId, Status, uint32_t> MihRegisterResponseCallback;
typedef Callback<void, MihfId, LinkIdentifierList, RegistrationCode, MihRegisterResponseCallback> MihRegisterIndicationCallback;
typedef TracedCallback<MihfId, LinkIdentifierList, RegistrationCode, MihRegisterResponseCallback> MihRegisterIndicationTracedCallback;
typedef Callback<void, MihfId, Status, uint32_t> MihRegisterConfirmCallback;
--- a/src/mih/mih-protocol.cc Wed Nov 26 09:22:37 2008 +0100
+++ b/src/mih/mih-protocol.cc Thu Nov 27 05:45:56 2008 +0100
@@ -57,7 +57,7 @@
return found;
}
Ptr<Session>
- MihProtocol::GetSession (MihfId fromMihfid, Address from, MihfId toMihfId, Address to)
+ MihProtocol::GetSession (MihfId fromMihfid, Address from, MihfId toMihfId, Address to, Ptr<Socket> serverSocket)
{
NS_LOG_WARN ("Arm a destructor event for this session!");
SessionListI i;
@@ -65,7 +65,7 @@
{
return (*i);
}
- Ptr<Session> session = Create<Session> (fromMihfid, from, toMihfId, to);
+ Ptr<Session> session = Create<Session> (fromMihfid, from, toMihfId, to, serverSocket);
m_sessions.push_back (session);
return session;
}
@@ -79,17 +79,58 @@
MihProtocol::HandleRead (Ptr<Socket> socket)
{
Ptr<Packet> pkt = 0;
+ Ptr<Session> session = 0;
Address from;
+
while (pkt = socket->RecvFrom (from))
{
MihHeader mihHeader;
+ MihfId fromMihfId;
+ MihfId toMihfId;
+ const uint8_t *packetData;
+ uint32_t payloadSize;
+ Buffer buffer;
+ Ptr<MihFunction> mihFunction = GetObject<MihFunction> ();
+
+ NS_ASSERT_MSG (mihFunction != 0, "Could not retrieve the MihFunction object!");
+
+ // Remove header to access to the payload within
+ // the same packet internal buffer.
pkt->RemoveHeader (mihHeader);
+ payloadSize = pkt->GetSize ();
+ packetData = pkt->PeekData ();
+ buffer = Buffer (payloadSize);
+ Buffer::Iterator i = buffer.Begin ();
+ for (uint32_t j = 0; j < payloadSize; j++, packetData++)
+ {
+ i.WriteU8 (*packetData);
+ }
+ fromMihfId.TlvDeserialize (buffer);
+ toMihfId.TlvDeserialize (buffer);
+
+ NS_ASSERT_MSG (toMihfId == mihFunction->GetMihfId (), "Destination MIHFID and local one differ!");
+
if (mihHeader.GetServiceId () == MihHeader::MANAGEMENT)
{
switch (mihHeader.GetActionId ())
{
case MihHeader::MIH_REGISTER :
-
+ if (mihHeader.GetOpCode () == MihHeader::REQUEST)
+ {
+ LinkIdentifierList linkIdentifierList;
+ RegistrationCode registrationCode;
+ ns3::mih::TlvDeserialize (buffer, linkIdentifierList);
+ registrationCode.TlvDeserialize (buffer);
+ session = GetSession (toMihfId, Address (), fromMihfId, from, m_serverSocket);
+ NS_ASSERT_MSG (session != 0, "An error occured while allocating a session!");
+ mihFunction->RegisterIndication (fromMihfId, linkIdentifierList, registrationCode, session->ReceiveRegisterRequest (pkt, mihHeader.GetTransactionId ()));
+ }
+ else if (mihHeader.GetOpCode () == MihHeader::RESPONSE)
+ {}
+ else
+ {
+ NS_ASSERT_MSG (0, "Illegal MihHeader::MIH_REGISTER opcode!");
+ }
break;
case MihHeader::MIH_DEREGISTER :
NS_ASSERT_MSG (0, "Not implemented yet!");
--- a/src/mih/mih-protocol.h Wed Nov 26 09:22:37 2008 +0100
+++ b/src/mih/mih-protocol.h Thu Nov 27 05:45:56 2008 +0100
@@ -74,7 +74,7 @@
MihLinkPduTransmitStatusIndicationCallback linkPduTxStatusEventCallback8,
MihEventSubscribeConfirmCallback subscribeConfirmCallback);
protected:
- Ptr<Session> GetSession (MihfId fromMihfid, Address from, MihfId toMihfId, Address to);
+ Ptr<Session> GetSession (MihfId fromMihfId, Address from, MihfId toMihfId, Address to, Ptr<Socket> serverSocket = 0);
bool FindSessionByMihfId (MihfId toMihfId, SessionListI &iter);
void ReceiveRegisterRequest (Ptr<Packet> packet, Ptr<Socket> socket);
Address ResolveMihfIdToAddress (MihfId mihfid);
--- a/src/mih/mih-session.cc Wed Nov 26 09:22:37 2008 +0100
+++ b/src/mih/mih-session.cc Thu Nov 27 05:45:56 2008 +0100
@@ -19,18 +19,20 @@
*/
#include "ns3/assert.h"
+#include "ns3/simulator.h"
#include "mih-header.h"
#include "mih-session.h"
namespace ns3 {
namespace mih {
Session::Session (MihfId sourceMihfid, Address sourceIp,
- MihfId destinationMihfid, Address destinationIp) :
+ MihfId destinationMihfid, Address destinationIp,
+ Ptr<Socket> socket) :
m_sourceMihfid (sourceMihfid),
m_sourceInetSocketAddress (sourceIp),
m_destinationMihfid (destinationMihfid),
m_destinationInetSocketAddress (destinationIp),
- m_socket (0),
+ m_socket (socket),
m_nextTransactionId (0),
m_delay (0),
m_maxSize (0)
@@ -60,6 +62,11 @@
return m_sourceInetSocketAddress;
}
void
+ Session::SetSocket (Ptr<Socket> socket)
+ {
+ m_socket = socket;
+ }
+ void
Session::NotifyNewPendingRequest (void)
{
if (m_currentTransaction)
@@ -71,30 +78,52 @@
m_pendingRequestQueue.pop_front ();
m_socket->SendTo (m_currentTransaction->GetPacket (), 0, m_destinationInetSocketAddress);
}
+ void
+ Session::NotifyPendingResponseDone (void)
+ {
+ Simulator::ScheduleNow(&Session::DisposePendingResponse, this);
+ }
+ void
+ Session::DisposePendingResponse (void)
+ {
+ NS_ASSERT_MSG (m_pendingResponseTransaction->IsToBeDeleted (), "Illegal state for deletion on transaction!");
+ m_pendingResponseTransaction = 0;
+ }
void
Session::SendRegisterRequest (Ptr<Packet> packet,
MihRegisterConfirmCallback registerConfirmCallback)
{
MihHeader mihHeader;
+ uint16_t transactionId = m_nextTransactionId;
+ m_nextTransactionId++;
mihHeader.SetVersion (MihHeader::VERSION_ONE);
mihHeader.SetServiceId (MihHeader::COMMAND);
mihHeader.SetOpCode (MihHeader::REQUEST);
mihHeader.SetActionId (MihHeader::MIH_REGISTER);
- mihHeader.SetTransactionId (m_nextTransactionId++);
+ mihHeader.SetTransactionId (transactionId);
mihHeader.SetPayloadLength (packet->GetSize ());
packet->AddHeader (mihHeader);
- Ptr<RegisterRequestTransaction> registerRequestTransaction = Create<RegisterRequestTransaction> (packet, registerConfirmCallback);
+ Ptr<RegisterRequestTransaction> registerRequestTransaction = Create<RegisterRequestTransaction> (packet,
+ GetFromMihfId (),
+ GetToMihfId (),
+ GetToAddress (),
+ transactionId,
+ registerConfirmCallback);
m_pendingRequestQueue.push_back (registerRequestTransaction);
-
NotifyNewPendingRequest ();
}
- Ptr<RegisterResponseTransaction>
- Session::CreatePendingRegisterResponseTransaction (Ptr<Packet> packet,
- Ptr<Socket> socket)
+ MihRegisterResponseCallback
+ Session::ReceiveRegisterRequest (Ptr<Packet> packet, uint16_t transactionId)
{
- NS_ASSERT_MSG (0, "Not implemented yet!");
- return Create<RegisterResponseTransaction> (packet, socket);
+ Ptr<RegisterResponseTransaction> registerResponseTransaction = Create<RegisterResponseTransaction> (packet,
+ GetFromMihfId (),
+ GetToMihfId (),
+ GetToAddress (),
+ transactionId,
+ m_socket);
+ registerResponseTransaction->SetNotifyDoneCallback (MakeCallback (&Session::NotifyPendingResponseDone, this));
+ return MakeCallback (&RegisterResponseTransaction::SendRegisterResponse, registerResponseTransaction);
}
void
Session::ReceiveRegisterResponse (Ptr<Packet> packet)
--- a/src/mih/mih-session.h Wed Nov 26 09:22:37 2008 +0100
+++ b/src/mih/mih-session.h Thu Nov 27 05:45:56 2008 +0100
@@ -33,16 +33,18 @@
class Session : public RefCountBase {
public:
Session (MihfId sourceMihfid, Address sourceIp,
- MihfId destinationMihfid, Address destinationIp);
+ MihfId destinationMihfid, Address destinationIp,
+ Ptr<Socket> socket = 0);
~Session (void);
MihfId GetToMihfId (void);
Address GetToAddress (void);
MihfId GetFromMihfId (void);
Address GetFromAddress (void);
+ void SetSocket (Ptr<Socket> socket);
void SendRegisterRequest (Ptr<Packet> packet,
MihRegisterConfirmCallback registerConfirmCallback);
- Ptr<RegisterResponseTransaction> CreatePendingRegisterResponseTransaction (Ptr<Packet> packet,
- Ptr<Socket> socket);
+ MihRegisterResponseCallback ReceiveRegisterRequest (Ptr<Packet> packet,
+ uint16_t transactionId);
void ReceiveRegisterResponse (Ptr<Packet> packet);
protected:
@@ -53,7 +55,10 @@
void NotifyNewPendingRequest (void);
void NotifyResponseReceived (void);
+ void NotifyPendingResponseDone (void);
+ void DisposePendingResponse (void);
+
// Inner members;
MihfId m_sourceMihfid;
Address m_sourceInetSocketAddress;
@@ -66,6 +71,7 @@
uint16_t m_maxSize;
TransactionQueue m_pendingRequestQueue;
Ptr<Transaction> m_currentTransaction;
+ Ptr<Transaction> m_pendingResponseTransaction;
TransactionQueue m_pendingEventQueue;
};
typedef std::vector<Ptr<Session> > SessionList;
--- a/src/mih/mih-transaction.cc Wed Nov 26 09:22:37 2008 +0100
+++ b/src/mih/mih-transaction.cc Thu Nov 27 05:45:56 2008 +0100
@@ -26,22 +26,22 @@
namespace ns3 {
namespace mih {
// class Transaction
- Transaction::Transaction (Ptr<Packet> packet, enum Transaction::State state) :
+ Transaction::Transaction (Ptr<Packet> packet, MihfId fromMihfid, MihfId toMihfid, Address to, uint16_t tid) :
m_packet (packet),
+ m_fromMihfId (fromMihfid),
+ m_toMihfId (toMihfid),
+ m_to (to),
m_tstamp (Simulator::Now ()),
m_toBedeleted (false),
- m_setToBeDeletedEvent (),
- m_state (state)
+ m_transactionId (tid),
+ m_state (Transaction::INIT),
+ m_notifyDone (MakeNullCallback<void> ())
{
- MihHeader mihHeader;
- packet->PeekHeader (mihHeader);
- m_transactionId = mihHeader.GetTransactionId ();
}
Transaction::~Transaction (void)
{
NS_ASSERT_MSG (m_toBedeleted, "Illegal deletion of living Transact object!");
m_packet = 0;
- Simulator::Cancel (m_setToBeDeletedEvent);
}
Time
Transaction::GetStartTime (void)
@@ -78,9 +78,14 @@
{
return m_state;
}
+ void
+ Transaction::SetNotifyDoneCallback (Callback<void> doneCb)
+ {
+ m_notifyDone = doneCb;
+ }
// class RegisterRequestTransaction
- RegisterRequestTransaction::RegisterRequestTransaction (Ptr<Packet> packet, MihRegisterConfirmCallback registerConfirmCallback) :
- Transaction (packet),
+ RegisterRequestTransaction::RegisterRequestTransaction (Ptr<Packet> packet, MihfId fromMihfid, MihfId toMihfid, Address to, uint16_t tid, MihRegisterConfirmCallback registerConfirmCallback) :
+ Transaction (packet, fromMihfid, toMihfid, to, tid),
m_registerConfirmCallback (registerConfirmCallback)
{}
RegisterRequestTransaction::~RegisterRequestTransaction (void)
@@ -91,15 +96,10 @@
m_registerConfirmCallback (mihfid, status, validLifetime);
}
// class RegisterResponseTransaction
- RegisterResponseTransaction::RegisterResponseTransaction (Ptr<Packet> packet, Ptr<Socket> socket) :
- Transaction (packet),
+ RegisterResponseTransaction::RegisterResponseTransaction (Ptr<Packet> packet, MihfId fromMihfid, MihfId toMihfid, Address to, uint16_t tid, Ptr<Socket> socket) :
+ Transaction (packet, fromMihfid, toMihfid, to, tid),
m_socket (socket)
{
- SocketAddressTag tag;
- bool found;
- found = packet->FindFirstMatchingTag (tag);
- NS_ASSERT_MSG (found, "SocketAddressTag could not be found!");
- m_to = tag.GetAddress ();
}
RegisterResponseTransaction::~RegisterResponseTransaction (void)
{
@@ -109,6 +109,7 @@
RegisterResponseTransaction::SendRegisterResponse (MihfId mihfid, Status status, uint32_t validLifetime)
{
NS_ASSERT_MSG (0, "Not implemented yet!");
+ SetToBeDeleted ();
// m_socket->SendTo (p, 0, m_to);
}
} // namespace mih
--- a/src/mih/mih-transaction.h Wed Nov 26 09:22:37 2008 +0100
+++ b/src/mih/mih-transaction.h Thu Nov 27 05:45:56 2008 +0100
@@ -44,7 +44,7 @@
};
enum Event {
};
- Transaction (Ptr<Packet> packet, enum Transaction::State state = Transaction::INIT);
+ Transaction (Ptr<Packet> packet, MihfId fromMihfid, MihfId toMihfid, Address to, uint16_t tid);
virtual ~Transaction (void);
virtual Time GetStartTime (void);
virtual uint16_t GetTransactionId (void);
@@ -53,17 +53,21 @@
virtual Ptr<Packet> GetPacket (void);
virtual void SetState (enum State state);
virtual enum State GetState (void);
+ void SetNotifyDoneCallback (Callback<void> doneCb);
protected:
Ptr<Packet> m_packet;
+ MihfId m_fromMihfId;
+ MihfId m_toMihfId;
+ Address m_to;
Time m_tstamp;
bool m_toBedeleted;
- EventId m_setToBeDeletedEvent;
uint16_t m_transactionId;
enum State m_state;
+ Callback<void> m_notifyDone;
};
class RegisterRequestTransaction : public Transaction {
public:
- RegisterRequestTransaction (Ptr<Packet> packet, MihRegisterConfirmCallback registerConfirmCallback);
+ RegisterRequestTransaction (Ptr<Packet> packet, MihfId fromMihfid, MihfId toMihfid, Address to, uint16_t tid, MihRegisterConfirmCallback registerConfirmCallback);
virtual ~RegisterRequestTransaction (void);
void operator () (MihfId mihfid, Status status, uint32_t validLifetime);
protected:
@@ -71,12 +75,11 @@
};
class RegisterResponseTransaction : public Transaction {
public:
- RegisterResponseTransaction (Ptr<Packet> packet, Ptr<Socket> socket);
+ RegisterResponseTransaction (Ptr<Packet> packet, MihfId fromMihfid, MihfId toMihfid, Address to, uint16_t tid, Ptr<Socket> socket);
virtual ~RegisterResponseTransaction (void);
void SendRegisterResponse (MihfId mihfid, Status status, uint32_t validLifetime);
protected:
Ptr<Socket> m_socket;
- Address m_to;
};
typedef std::deque<Ptr<Transaction> > TransactionQueue;
typedef TransactionQueue::reverse_iterator TransactionQueueRI;