First steps in CCNx packet coding. ccnx_encode* routines rewritten in NS3 style (using NS3::Buffer)

diff --git a/model/ccnx-forwarding-strategy.h b/model/ccnx-forwarding-strategy.h
new file mode 100644
index 0000000..6a76531
--- /dev/null
+++ b/model/ccnx-forwarding-strategy.h
@@ -0,0 +1,146 @@
+/* -*- 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 */