ndn: Add NFD and NLSR class abstractions

refs: #2528

Change-Id: I3241af0e85f4eec4eb640aca274ff9ca4f812656
diff --git a/ndn/ndn_host.py b/ndn/ndn_host.py
new file mode 100644
index 0000000..427aced
--- /dev/null
+++ b/ndn/ndn_host.py
@@ -0,0 +1,84 @@
+from mininet.node import CPULimitedHost, Host, Node
+from ndn.nfd import Nfd
+
+class NdnHostCommon():
+    "Common methods of NdnHost and CpuLimitedNdnHost"
+
+    def configNdn(self):
+        self.buildPeerIp()
+
+    def buildPeerIp(self):
+        for iface in self.intfList():
+            link = iface.link
+            if link:
+                node1, node2 = link.intf1.node, link.intf2.node
+                if node1 == self:
+                    self.peerList[node2.name] = link.intf2.node.IP(link.intf2)
+                else:
+                    self.peerList[node1.name] = link.intf1.node.IP(link.intf1)
+
+    inited = False
+
+    @classmethod
+    def init(cls):
+        "Initialization for NDNHost class"
+        cls.inited = True
+
+class NdnHost(Host, NdnHostCommon):
+    "NDNHost is a Host that always runs NFD"
+
+    def __init__(self, name, **kwargs):
+
+        Host.__init__(self, name, **kwargs)
+        if not NdnHost.inited:
+            NdnHostCommon.init()
+
+        self.nfd = Nfd(self)
+        self.nfd.start()
+
+        self.peerList = {}
+
+    def config(self, fib=None, app=None, cache=None, **params):
+
+        r = Node.config(self, **params)
+
+        self.setParam(r, 'app', fib=fib)   # why is this not app=app, to be investigated
+        self.setParam(r, 'fib', app=app)   # and this fib=fib
+        self.setParam(r, 'cache', cache=cache)
+
+        return r
+
+    def terminate(self):
+        "Stop node."
+        self.nfd.stop()
+        Host.terminate(self)
+
+class CpuLimitedNdnHost(CPULimitedHost, NdnHostCommon):
+    '''CPULimitedNDNHost is a Host that always runs NFD and extends CPULimitedHost.
+       It should be used when one wants to limit the resources of NDN routers and hosts '''
+
+    def __init__(self, name, sched='cfs', **kwargs):
+
+        CPULimitedHost.__init__(self, name, sched, **kwargs)
+        if not NdnHost.inited:
+            NdnHostCommon.init()
+
+        self.nfd = Nfd(self)
+        self.nfd.start()
+
+        self.peerList = {}
+
+    def config(self, fib=None, app=None, cpu=None, cores=None, cache=None, **params):
+
+        r = CPULimitedHost.config(self,cpu,cores, **params)
+
+        self.setParam(r, 'app', fib=fib)   #????? shoud it be app=app
+        self.setParam(r, 'fib', app=app)
+        self.setParam(r, 'cache', cache=cache)
+
+        return r
+
+    def terminate(self):
+        "Stop node."
+        self.nfd.stop()
+        Host.terminate(self)