/* -*- 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
{
  Name::Components 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 Name::Components &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_

