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

#include <list>
#include <vector>
#include <stdint.h>
#include "ns3/ptr.h"
#include "ns3/net-device.h"
#include "ns3/traced-callback.h"
#include "ns3/nstime.h"
#include "ns3/simulator.h"

#include "ns3/ccnx-producer-helper.h"
#include "ccnx-content-store.h"
#include "ccnx-pit.h"
#include "ccnx-fib.h"

#include "ccnx.h"

namespace ns3 {

class Packet;
class NetDevice;
class Node;
class CcnxFace;
class CcnxRoute;
class CcnxForwardingStrategy;
class Header;
class CcnxInterestHeader;
class CcnxContentObjectHeader;

    
/**
 * \ingroup ccnx
 * \brief Actual implementation of the Ccnx network layer
 * 
 * \todo This description is incorrect. Should be changed accordingly
 *
 * This class contains two distinct groups of trace sources.  The
 * trace sources 'Rx' and 'Tx' are called, respectively, immediately
 * after receiving from the NetDevice and immediately before sending
 * to a NetDevice for transmitting a packet.  These are low level
 * trace sources that include the CcnxHeader already serialized into
 * the packet.  In contrast, the Drop, SendOutgoing, UnicastForward,
 * and LocalDeliver trace sources are slightly higher-level and pass
 * around the CcnxHeader as an explicit parameter and not as part of
 * the packet.
 */
class CcnxL3Protocol : public Ccnx
{
public:
  /**
   * \brief Interface ID
   *
   * \return interface ID
   */
  static TypeId GetTypeId ();

  static const uint16_t ETHERNET_FRAME_TYPE; ///< \brief Ethernet Frame Type of CCNx
  // static const uint16_t IP_PROTOCOL_TYPE;    ///< \brief IP protocol type of CCNx
  // static const uint16_t UDP_PORT;            ///< \brief UDP port of CCNx

  /**
   * \brief Default constructor. Creates an empty stack without forwarding strategy set
   */
  CcnxL3Protocol();
  virtual ~CcnxL3Protocol ();

  /**
   * \enum DropReason
   * \brief Reason why a packet has been dropped.
   */
  enum DropReason 
  {
    NDN_DUPLICATE_INTEREST,  ///< \brief Duplicate Interest
    NDN_SUPPRESSED_INTEREST, ///< \brief Suppressed Interest
    NDN_UNSOLICITED_DATA,    ///< \brief Unsolicited ContentObject(duplicate?)
    NDN_PIT_TIMER_EXPIRED,
    INTERFACE_DOWN,          ///< \brief Interface is down

    NACK_SUPPRESSED,
    NACK_AFTER_SATISFIED,
    NACK_NONDUPLICATE,

    DROP_NO_ROUTE,   /**< No route to host */
  };    

  /**
   * \enum DropReason
   * \brief Description of where content object was originated
   */
  enum ContentObjectSource
  {
    APPLICATION,
    FORWARDED,
    CACHED
  };

  /**
   * \brief Assigns node to the CCNx stack
   *
   * \param node Simulation node
   */
  void SetNode (Ptr<Node> node);

  ////////////////////////////////////////////////////////////////////
  // functions defined in base class Ccnx
  
  void SetForwardingStrategy (Ptr<CcnxForwardingStrategy> forwardingStrategy);
  Ptr<CcnxForwardingStrategy> GetForwardingStrategy () const;

  // virtual void SendInterest (const Ptr<CcnxFace> &face,
  //                            const Ptr<const CcnxInterestHeader> &header,
  //                            const Ptr<Packet> &packet);
  // virtual void SendContentObject (const Ptr<CcnxFace> &face,
  //                                 const Ptr<const CcnxContentObjectHeader> &header,
  //                                 const Ptr<Packet> &packet);

  virtual uint32_t
  AddFace (const Ptr<CcnxFace> &face);
  
  virtual uint32_t
  GetNFaces () const;
  
  virtual Ptr<CcnxFace>
  GetFace (uint32_t face) const;

  virtual void
  RemoveFace (Ptr<CcnxFace> face);

  virtual Ptr<CcnxFace>
  GetFaceByNetDevice (Ptr<NetDevice> netDevice) const;
  
  Ptr<CcnxPit> GetPit();
  
  // void ScheduleLeakage();
private:
  void
  Receive (const Ptr<CcnxFace> &face, const Ptr<const Packet> &p);

  /**
   * \brief Actual processing of incoming CCNx interests. Note, interests do not have payload
   * 
   * Processing Interest packets
   * @param face    incoming face
   * @param header  deserialized Interest header
   * @param packet  original packet
   */
  void
  OnInterest (const Ptr<CcnxFace> &face,
              Ptr<CcnxInterestHeader> &header,
              const Ptr<const Packet> &p);

  /**
   * \brief Processing of incoming CCNx NACKs. Note, these packets, like interests, do not have payload
   * 
   * Processing NACK packets
   * @param face    incoming face
   * @param header  deserialized Interest header
   * @param packet  original packet
   */
  void
  OnNack (const Ptr<CcnxFace> &face,
          Ptr<CcnxInterestHeader> &header,
          const Ptr<const Packet> &p);
  
  /**
   * \brief Actual processing of incoming CCNx content objects
   * 
   * Processing ContentObject packets
   * @param face    incoming face
   * @param header  deserialized ContentObject header
   * @param payload data packet payload
   * @param packet  original packet
   */
  void
  OnData (const Ptr<CcnxFace> &face,
          Ptr<CcnxContentObjectHeader> &header,
          Ptr<Packet> &payload,
          const Ptr<const Packet> &packet);

protected:
  virtual void DoDispose (void);

  /**
   * This function will notify other components connected to the node that a new stack member is now connected
   * This will be used to notify Layer 3 protocol of layer 4 protocol stack to connect them together.
   */
  virtual void NotifyNewAggregate ();

private:
  CcnxL3Protocol(const CcnxL3Protocol &); ///< copy constructor is disabled
  CcnxL3Protocol &operator = (const CcnxL3Protocol &); ///< copy operator is disabled

  /// \brief Set buckets leak interval
  void
  SetBucketLeakInterval (Time interval);

  /// \brief Get buckets leak interval
  Time
  GetBucketLeakInterval () const;
  
  /// \brief Periodically generate pre-calculated number of tokens (leak buckets)
  void
  LeakBuckets ();

  void
  GiveUpInterest (const CcnxPitEntry &pitEntry,
                  Ptr<CcnxInterestHeader> header);

private:
  uint32_t m_faceCounter; ///< \brief counter of faces. Increased every time a new face is added to the stack
  typedef std::vector<Ptr<CcnxFace> > CcnxFaceList;
  CcnxFaceList m_faces; ///< \brief list of faces that belongs to ccnx stack on this node

  Ptr<Node> m_node; ///< \brief node on which ccnx stack is installed
  Ptr<CcnxForwardingStrategy> m_forwardingStrategy; ///< \brief smart pointer to the selected forwarding strategy

  // Ptr<CcnxRit> m_rit; ///< \brief RIT (recently interest table)
  Ptr<CcnxPit> m_pit; ///< \brief PIT (pending interest table)
  Ptr<CcnxFib> m_fib; ///< \brief FIB  
  Ptr<CcnxContentStore> m_contentStore; ///< \brief Content store (for caching purposes only)

  Time    m_bucketLeakInterval;
  EventId m_bucketLeakEvent;
  
  TracedCallback<Ptr<const CcnxInterestHeader>,
                 Ptr<Ccnx>, Ptr<const CcnxFace> > m_receivedInterestsTrace;
  
  TracedCallback<Ptr<const CcnxInterestHeader>,
                 Ptr<Ccnx>, Ptr<const CcnxFace> > m_transmittedInterestsTrace;
  
  TracedCallback<Ptr<const CcnxInterestHeader>,
                 DropReason,
                 Ptr<Ccnx>, Ptr<const CcnxFace> > m_droppedInterestsTrace;

  TracedCallback<Ptr<const CcnxContentObjectHeader>,
                 Ptr<const Packet>,/*payload*/
                 Ptr<Ccnx>, Ptr<const CcnxFace> > m_receivedDataTrace;

  TracedCallback<Ptr<const CcnxContentObjectHeader>,
                  Ptr<const Packet>,/*payload*/
                  ContentObjectSource,
                  Ptr<Ccnx>, Ptr<const CcnxFace> > m_transmittedDataTrace;
  TracedCallback<Ptr<const CcnxContentObjectHeader>,
                  Ptr<const Packet>,/*payload*/
                  DropReason,
                  Ptr<Ccnx>, Ptr<const CcnxFace> > m_droppedDataTrace;
};
  
} // Namespace ns3

#endif /* CCNX_L3_PROTOCOL_H */
