From 075eedc4fb0a605911743210cf30fba5f9fcd596 Mon Sep 17 00:00:00 2001
From: Nikhil Handigol <nikhilh@stanford.edu>
Date: Thu, 20 Jan 2011 17:08:19 -0800
Subject: [PATCH] Adding 2 new functions to pytopology that makes it more useful/usable

* get_datapaths() : returns a list of all datapathids in the network
* get_neighbors(dpid) : returns a list of neighbors of a given datapathid.
---
 src/nox/netapps/topology/pytopology.cc |   19 +++++++++++++++++++
 src/nox/netapps/topology/pytopology.hh |    2 ++
 src/nox/netapps/topology/pytopology.i  |   10 ++++++++++
 src/nox/netapps/topology/topology.cc   |   11 +++++++++++
 src/nox/netapps/topology/topology.hh   |    3 +++
 5 files changed, 45 insertions(+), 0 deletions(-)

diff --git a/src/nox/netapps/topology/pytopology.cc b/src/nox/netapps/topology/pytopology.cc
index 22f963b..c591502 100644
--- a/src/nox/netapps/topology/pytopology.cc
+++ b/src/nox/netapps/topology/pytopology.cc
@@ -69,3 +69,22 @@ pytopology_proxy::get_outlinks(datapathid dpsrc, datapathid dpdst) const
     }
     return returnme; 
 }
+
+std::list<datapathid> 
+pytopology_proxy::get_neighbors(datapathid dpsrc) const
+{
+    std::list<datapathid> returnme;
+    Topology::DatapathLinkMap dp_link_map = topo->get_outlinks(dpsrc);
+    Topology::DatapathLinkMap::iterator dpl_it;
+    for (dpl_it = dp_link_map.begin(); dpl_it != dp_link_map.end(); dpl_it++) {
+        returnme.push_back(dpl_it->first);
+    }
+    return returnme;
+}
+
+std::list<datapathid> 
+pytopology_proxy::get_datapaths() const
+{
+    return topo->get_datapaths();
+}
+
diff --git a/src/nox/netapps/topology/pytopology.hh b/src/nox/netapps/topology/pytopology.hh
index 19518fd..d842f88 100644
--- a/src/nox/netapps/topology/pytopology.hh
+++ b/src/nox/netapps/topology/pytopology.hh
@@ -46,6 +46,8 @@ public:
 
     std::list<PyLinkPorts> get_outlinks(datapathid dpsrc, datapathid dpdst) const;
     bool is_internal(datapathid dp, uint16_t port) const;
+    std::list<datapathid> get_neighbors(datapathid dpsrc) const;
+    std::list<datapathid> get_datapaths() const;
 
 protected:   
 
diff --git a/src/nox/netapps/topology/pytopology.i b/src/nox/netapps/topology/pytopology.i
index 21d92d1..94a9f4b 100644
--- a/src/nox/netapps/topology/pytopology.i
+++ b/src/nox/netapps/topology/pytopology.i
@@ -35,7 +35,9 @@ struct PyLinkPorts {
     uint16_t dst;
 };
 
+
 %template(LLinkSet) std::list<PyLinkPorts>;
+%template(DPIDList) std::list<datapathid>;
 
 class pytopology_proxy{
 public:
@@ -47,6 +49,8 @@ public:
 
     std::list<PyLinkPorts> get_outlinks(datapathid dpsrc, datapathid dpdst) const;
     bool is_internal(datapathid dp, uint16_t port) const;
+    std::list<datapathid> get_datapaths() const;
+    std::list<datapathid> get_neighbors(datapathid dpsrc) const;
 
 protected:   
 
@@ -82,6 +86,12 @@ class pytopology(Component):
     def is_internal(self, dp, port):
         return self.pytop.is_internal(dp, port)
 
+    def get_datapaths(self):
+        return self.pytop.get_datapaths()
+
+    def get_neighbors(self, dpsrc):
+        return self.pytop.get_neighbors(dpsrc)
+
 
 def getFactory():
     class Factory():
diff --git a/src/nox/netapps/topology/topology.cc b/src/nox/netapps/topology/topology.cc
index 3dee4b0..9a5e702 100644
--- a/src/nox/netapps/topology/topology.cc
+++ b/src/nox/netapps/topology/topology.cc
@@ -133,6 +133,17 @@ Topology::is_internal(const datapathid& dp, uint16_t port) const
     return (pm_iter != nlm_iter->second.internal.end());
 }
 
+std::list<datapathid> 
+Topology::get_datapaths()
+{
+    std::list<datapathid> returnme;
+    Topology::NetworkLinkMap::iterator dpit;
+    for(dpit = topology.begin(); dpit != topology.end(); dpit++) {
+	returnme.push_back(datapathid(dpit->first));
+    }
+    return returnme;
+}
+
 
 Disposition
 Topology::handle_datapath_join(const Event& e)
diff --git a/src/nox/netapps/topology/topology.hh b/src/nox/netapps/topology/topology.hh
index 9ad7be6..4f763d5 100644
--- a/src/nox/netapps/topology/topology.hh
+++ b/src/nox/netapps/topology/topology.hh
@@ -95,6 +95,9 @@ public:
     /** \brief Check if link is internal (i.e., between switches)
      */
     bool is_internal(const datapathid& dp, uint16_t port) const;
+    /** \brief Get a list of datapaths in the network
+     */
+    std::list<datapathid> get_datapaths();
 
 private:
     /** \brief Map of information index by datapath id
-- 
1.7.1

