/* -*- 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-rit.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

    DROP_CONGESTION, /**< Congestion detected */
    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<CcnxInterestHeader> &header,
                             const Ptr<Packet> &packet);
  virtual void SendContentObject (const Ptr<CcnxFace> &face,
                                  const Ptr<CcnxContentObjectHeader> &header,
                                  const Ptr<Packet> &packet);
  virtual void Receive (const Ptr<CcnxFace> &face, const Ptr<const Packet> &p);

  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();
protected:
  /**
   * \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
   */
  virtual 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
   */
  virtual 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
   */
  virtual 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 A helper function
   */
  void TransmittedDataTrace (Ptr<Packet>,
                             ContentObjectSource,
                             Ptr<Ccnx>, Ptr<const CcnxFace>);
  
  
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)
  
  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;
  
  /**
   * \brief Trace of dropped packets, including reason and all headers
   * \internal
   */
  // TracedCallback<Ptr<const Packet>, DropReason, Ptr<const Ccnx>, Ptr<const CcnxFace> > m_dropTrace;
};
  
} // Namespace ns3

#endif /* CCNX_L3_PROTOCOL_H */
