/* -*- 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 _NDN_LIMITS_RATE_H_
#define	_NDN_LIMITS_RATE_H_

#include "ndn-limits.h"

namespace ns3 {
namespace ndn {

/**
 * \ingroup ndn
 * \brief Structure to manage limits for outstanding interests
 */
class LimitsRate :
    public Limits
{
public:
  typedef Limits super;
  
  static TypeId
  GetTypeId ();
  
  /**
   * \brief Constructor
   * \param prefix smart pointer to the prefix for the FIB entry
   */
  LimitsRate ()
    : m_bucketMax (0)
    , m_bucketLeak (0)
    , m_bucket (0)
  { }

  virtual
  ~LimitsRate () { }

  virtual void
  SetLimits (double rate, double delay)
  {
    super::SetLimits (rate, delay);

    // maximum allowed burst
    m_bucketMax = GetMaxRate () * GetMaxDelay ();

    // amount of packets allowed every second (leak rate)
    m_bucketLeak = GetMaxRate ();
  }

  /**
   * @brief Check if Interest limit is reached (token bucket is not empty)
   */
  virtual bool
  IsBelowLimit ();

  /**
   * @brief Get token from the bucket
   */
  virtual void
  BorrowLimit ();

  /**
   * @brief Does nothing (token bucket leakage is time-dependent only)
   */
  virtual void
  ReturnLimit ();

  /**
   * @brief Update current leak ratio and maximum burst
   */
  virtual void
  UpdateCurrentLimit (double limit);

  /**
   */
  virtual double
  GetCurrentLimit () const
  {
    return m_bucketLeak;
  }

private:
  /**
   * @brief Leak bucket, assuming `interval' seconds between leakages
   *
   * @param interval Time interval for leakage. Used to calculate size of the leak
   */
  void
  LeakBucket (double interval);

private:
  double m_bucketMax;   ///< \brief Maximum Interest allowance for this face (maximum tokens that can be issued at the same time)
  double m_bucketLeak;  ///< \brief Normalized amount that should be leaked every second (token bucket leak rate)
  double m_bucket;      ///< \brief Value representing current size of the Interest allowance for this face (current size of token bucket)
};
  

} // namespace ndn
} // namespace ns3

#endif // _NDN_LIMITS_RATE_H_
