/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/*
 * Copyright (c) 2011 University of California, Los Angeles
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation;
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
 */

#ifndef _CCNX_RIT_H_
#define	_CCNX_RIT_H_

#include <list>
#include "ns3/nstime.h"
#include "ns3/name-components.h"
#include "ns3/object.h"
#include "ns3/nstime.h"
#include "ns3/event-id.h"

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/tag.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/sequenced_index.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>

namespace ns3 {

class CcnxInterestHeader;

/**
 * \ingroup ccnx
 * \brief Recently satisfied interest 
 *
 * This entry holds information about recently satisfied interest
 *
 * RIT entries will stay in the table for a while before being cleaned out
 */
struct CcnxRitEntry
{
  CcnxNameComponents m_prefix; ///< \brief Prefix of the recently satisfied interest
  uint32_t m_nonce; ///< \brief Nonce of the recently satisfied interest
  Time m_expireTime;  ///< \brief Time when the record should be removed

  CcnxRitEntry (const CcnxNameComponents &prefix, uint32_t nonce, const Time &timeout)
    : m_prefix (prefix)
    , m_nonce (nonce)
    , m_expireTime (timeout)
  { }
};

/**
 * \ingroup ccnx
 * \brief Private namespace for CCNx RIT implementation
 */
namespace __ccnx_private_rit
{
class nonce {}; ///< tag for nonce hash
class timestamp {}; ///< tag for timestamp-ordered records (for cleanup optimization)  
};

/**
 * \ingroup ccnx
 * \brief Typedef for RIT container implemented as a Boost.MultiIndex container
 *
 * - First index (tag<nonce>) is a non-unique hash index based on
 *   nonce (there could be several records with the same nonce,
 *   provided that the prefixes are different
 * - Second index (tag<timestamp>) is a sequenced index based on
 *   arrival order (for clean-up optimizations)
 *
 * Container allows having non-unique nonce values.  In the
 * implementation it is allowed only if prefixes are different. During
 * the lookup process, the nonce field is checked first and, if a
 * match found, the prefix field will be checked to match prefix of
 * the interest.
 *
 * \see http://www.boost.org/doc/libs/1_46_1/libs/multi_index/doc/ for more information on Boost.MultiIndex library
 */
struct CcnxRitContainer
{
  typedef
  boost::multi_index::multi_index_container<
    CcnxRitEntry,
    boost::multi_index::indexed_by<
      boost::multi_index::hashed_non_unique<
        boost::multi_index::tag<__ccnx_private_rit::nonce>,
        boost::multi_index::member<CcnxRitEntry, uint32_t, &CcnxRitEntry::m_nonce>
        >,
      boost::multi_index::sequenced<
        boost::multi_index::tag<__ccnx_private_rit::timestamp> >
      >
    > type;
};


/**
 * \ingroup ccnx
 * \brief Recently satisfied interest storage
 *
 * This storage holds information about all recently satisfied
 * interests (prefix and nonce).
 *
 * There is no hard limit on number of entries (limited by the amount
 * of the available memory).  Entries are removed after preconfigured
 * amount of time (RitTimeout, default is 1 second).
 */
class CcnxRit : public Object
{
public:
  /**
   * \brief Interface ID
   *
   * \return interface ID
   */
  static TypeId GetTypeId ();

  /**
   * \brief Default constructor
   */
  CcnxRit ();
  virtual ~CcnxRit( );

  /**
   * \brief Find corresponding RIT entry for the given content name
   *
   * This check consists of two steps.  First, we find records with
   * the same nonce.  Then check prefixes of all found records and if
   * prefix of any of them matched prefix of the interest, this
   * function returns true.  In all other cases, it will return false.
   *
   * \param header header of the interest packet in question
   *
   * \returns true if the same interest was recently satisfied
   */
  bool WasRecentlySatisfied (const CcnxInterestHeader &header);

  /**
   * \brief Add a new RIT entry
   *
   * This function asserts (only in debug) if the same interest is
   * already present in RIT.  The caller is responsible of calling
   * WasRecentlySatisfied before calling SetRecentlySatisfied.
   * 
   * \param header header of the interest packet in question
   */
  void SetRecentlySatisfied (const CcnxInterestHeader &header);

  /**
   * \brief Set RIT entries lifetime
   *
   * \param lifetime of RIT entries timeout
   */
  void SetRitTimeout (const Time &timeout);

  /**
   * \brief Get RIT entries lifetime
   *
   * \returns lifetime of RIT entries timeout
   */
  Time GetRitTimeout () const;
  
  /**
   * \brief Set cleanup timeout
   *
   * Side effect: current clean up even (if any) will be cancelled and a new event started
   *
   * \param timeout cleanup timeout
   */
  void SetCleanupTimeout (const Time &timeout);

  /**
   * \brief Get cleanup timeout
   *
   * \returns cleanup timeout
   */
  Time GetCleanupTimeout () const;

private:
  /**
   * \brief Periodic even to clean up stalled entries
   */
  void CleanExpired ();
	
private:
  Time    m_ritTimeout; ///< \brief Configurable timeout of RIT entries
  Time    m_cleanupTimeout; ///< \brief Configurable timeout of how often cleanup events are working
  EventId m_cleanupEvent; ///< \brief Cleanup event
  
  CcnxRitContainer::type m_rit; ///< \brief Actual RIT container
};

} // namespace ns3

#endif // _CCNX_RIT_H_

