model+helper+tests: Create an ndnSIM-specific transport for the NFD face system

This commit replaces the previous hack of implementing NS-3's inter-node
communication using the LinkService abstraction of the NFD face system.
The new implementation has higher memory overhead, but allows simulation
of any LinkService versions, including GenericLinkService that
implements NDNLPv2 protocol (i.e., fragmentation, network NACKs, etc.).

Change-Id: I3d16bcf29f4858049d1040a3e421e1c7151b3ba2
Refs: #3871, #3873
diff --git a/model/ndn-net-device-transport.hpp b/model/ndn-net-device-transport.hpp
new file mode 100644
index 0000000..b502d4f
--- /dev/null
+++ b/model/ndn-net-device-transport.hpp
@@ -0,0 +1,81 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2016  Regents of the University of California.
+ *
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
+ *
+ * ndnSIM is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * ndnSIM 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
+ * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#ifndef NDN_NET_DEVICE_TRANSPORT_HPP
+#define NDN_NET_DEVICE_TRANSPORT_HPP
+
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+#include "ns3/ndnSIM/NFD/daemon/face/transport.hpp"
+
+#include "ns3/net-device.h"
+#include "ns3/log.h"
+#include "ns3/packet.h"
+#include "ns3/node.h"
+#include "ns3/pointer.h"
+
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/channel.h"
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * \ingroup ndn-face
+ * \brief ndnSIM-specific transport
+ */
+class NetDeviceTransport : public nfd::face::Transport
+{
+public:
+  NetDeviceTransport(Ptr<Node> node, const Ptr<NetDevice>& netDevice,
+                     const std::string& localUri,
+                     const std::string& remoteUri,
+                     ::ndn::nfd::FaceScope scope = ::ndn::nfd::FACE_SCOPE_NON_LOCAL,
+                     ::ndn::nfd::FacePersistency persistency = ::ndn::nfd::FACE_PERSISTENCY_PERSISTENT,
+                     ::ndn::nfd::LinkType linkType = ::ndn::nfd::LINK_TYPE_POINT_TO_POINT);
+
+  ~NetDeviceTransport();
+
+  Ptr<NetDevice>
+  GetNetDevice() const;
+
+private:
+  virtual void
+  beforeChangePersistency(::ndn::nfd::FacePersistency newPersistency) override;
+
+  virtual void
+  doClose() override;
+
+  virtual void
+  doSend(Packet&& packet) override;
+
+  void
+  receiveFromNetDevice(Ptr<NetDevice> device,
+                       Ptr<const ns3::Packet> p,
+                       uint16_t protocol,
+                       const Address& from, const Address& to,
+                       NetDevice::PacketType packetType);
+
+  Ptr<NetDevice> m_netDevice; ///< \brief Smart pointer to NetDevice
+  Ptr<Node> m_node;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_NULL_TRANSPORT_HPP