/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/*
 * Copyright (c) 2009 University of Washington
 *
 * 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
 */
#ifndef CCNX_FORWARDING_STRATEGY_H
#define CCNX_FORWARDING_STRATEGY_H

#include "ns3/packet.h"
#include "ns3/callback.h"
#include "ns3/object.h"
#include "ns3/socket.h"
#include "ns3/output-stream-wrapper.h"

#include "ccnx.h"

namespace ns3 {

class CcnxRoute;
class CcnxFace;

/**
 * \ingroup internet 
 * \defgroup ccnxForwarding CcnxForwardingStrategy 
 */
/**
 * \ingroup ccnxForwarding
 * \brief Abstract base class for Ccnx forwarding protocols. 
 * 
 * Defines two virtual functions for packet forwarding and forwarding.  The first, 
 * RouteOutput(), is used for locally originated packets, and the second,
 * RouteInput(), is used for forwarding and/or delivering received packets. 
 * Also defines the signatures of four callbacks used in RouteInput().
 *
 */
class CcnxForwardingStrategy : public Object
{
public:
  static TypeId GetTypeId (void);

  typedef Callback<void, Ptr<Packet>, Ptr<CcnxRoute> > SendCallback;
  typedef Callback<void, Ptr<Packet>/*, Socket::SocketErrno*/ > ErrorCallback;

  /**
   * \brief Query forwarding cache for an existing route, for an outbound packet
  //  *
  //  * This lookup is used by transport protocols.  It does not cause any
  //  * packet to be forwarded, and is synchronous.  Can be used for
  //  * multicast or unicast.  The Linux equivalent is ip_route_output()
  //  *
  //  * \param p packet to be routed.  Note that this method may modify the packet.
  //  *          Callers may also pass in a null pointer. 
  //  * \param header input parameter (used to form key to search for the route)
  //  * \param oif Output interface Netdevice.  May be zero, or may be bound via
  //  *            socket options to a particular output interface.
  //  * \param sockerr Output parameter; socket errno 
  //  *
  //  * \returns a code that indicates what happened in the lookup
  //  */
  // virtual Ptr<CcnxRoute> RouteOutput (Ptr<Packet> p, const CcnxHeader &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr) = 0;

  /**
   * \brief Route an input packet (to be forwarded or locally delivered)
   *
   * This lookup is used in the forwarding process.  The packet is
   * handed over to the CcnxForwardingStrategy, and will get forwarded onward
   * by one of the callbacks.  The Linux equivalent is ip_route_input().
   * There are four valid outcomes, and a matching callbacks to handle each.
   *
   * \param p received packet
   * \param header input parameter used to form a search key for a route
   * \param iface Pointer to ingress face
   * \param ucb Callback for the case in which the packet is to be forwarded
   * \param ecb Callback to call if there is an error in forwarding
   * \returns true if the CcnxForwardingStrategy takes responsibility for 
   *          forwarding or delivering the packet, false otherwise
   */ 
  virtual bool RouteInput  (Ptr<Packet> p, Ptr<CcnxFace> iface, 
                            SendCallback ucb, ErrorCallback ecb) = 0;

  /**
   * \param interface the index of the interface we are being notified about
   *
   * Protocols are expected to implement this method to be notified of the state change of
   * an interface in a node.
   */
  virtual void NotifyInterfaceUp (uint32_t interface) = 0;
  /**
   * \param interface the index of the interface we are being notified about
   *
   * Protocols are expected to implement this method to be notified of the state change of
   * an interface in a node.
   */
  virtual void NotifyInterfaceDown (uint32_t interface) = 0;


  // Should be modified to notify about new prefixes ?
  
  /**
   * \param interface the index of the interface we are being notified about
   * \param address a new address being added to an interface
   *
   * Protocols are expected to implement this method to be notified whenever
   * a new address is added to an interface. Typically used to add a 'network route' on an
   * interface. Can be invoked on an up or down interface.
   */
  // virtual void NotifyAddAddress (uint32_t interface, CcnxInterfaceAddress address) = 0;

  /**
   * \param interface the index of the interface we are being notified about
   * \param address a new address being added to an interface
   *
   * Protocols are expected to implement this method to be notified whenever
   * a new address is removed from an interface. Typically used to remove the 'network route' of an
   * interface. Can be invoked on an up or down interface.
   */
  // virtual void NotifyRemoveAddress (uint32_t interface, CcnxInterfaceAddress address) = 0;

  /**
   * \param ccnx the ccnx object this forwarding protocol is being associated with
   * 
   * Typically, invoked directly or indirectly from ns3::Ccnx::SetForwardingStrategy
   */
  virtual void SetCcnx (Ptr<Ccnx> ccnx);

  virtual void PrintForwardingTable (Ptr<OutputStreamWrapper> stream) const = 0;

protected:
  Ptr<Ccnx> m_ccnx;
};

} //namespace ns3

#endif /* CCNX_FORWARDING_STRATEGY_H */
