Receive Register Request in Session
authorProvidence SALUMU M. <Providence.Salumu_Munga@it-sudparis.eu>
Thu, 27 Nov 2008 05:45:56 +0100
changeset 3929 7c1778bd5359
parent 3928 5cd16c7b2631
child 3930 fb0d84b0055e
Receive Register Request in Session
src/mih/mih-callbacks.h
src/mih/mih-protocol.cc
src/mih/mih-protocol.h
src/mih/mih-session.cc
src/mih/mih-session.h
src/mih/mih-transaction.cc
src/mih/mih-transaction.h
--- 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;