Ipv4ClickRouting ready for aggregation with an actual node. nsclick-test.cc improved.
authorLalith Suresh
Fri, 28 May 2010 14:40:42 +0530
changeset 6288 9056138c8223
parent 6287 4c38b94a4aaa
child 6289 e3f16dd7456b
Ipv4ClickRouting ready for aggregation with an actual node. nsclick-test.cc improved.
scratch/nsclick-test.cc
src/routing/click/ipv4-click-routing.cc
src/routing/click/ipv4-click-routing.h
--- a/scratch/nsclick-test.cc	Thu May 27 19:21:13 2010 +0530
+++ b/scratch/nsclick-test.cc	Fri May 28 14:40:42 2010 +0530
@@ -7,12 +7,12 @@
 
 using namespace ns3;
 
+/*
 void testme1(Ptr<Ipv4ClickRouting> cr)
 {
-  NS_LOG_UNCOND ("TESTME: " << Simulator::Now ());
-
   cr->TestInit ();
 }
+*/
 /*
 void testme1(Ptr<Ipv4ClickRouting> cr)
 {
@@ -28,11 +28,30 @@
 
   clickNodes.Create (1);
 
-  Ptr<Ipv4ClickRouting> test = Create<Ipv4ClickRouting>();
+  CsmaHelper csma;
+  csma.SetChannelAttribute ("DataRate", DataRateValue (DataRate (5000000)));
+  csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
+  NetDeviceContainer devices = csma.Install (clickNodes);
+
+  InternetStackHelper internet;
+  internet.Install (clickNodes.Get (0));
+
+  Ipv4AddressHelper ipv4;
+  ipv4.SetBase ("172.16.1.0", "255.255.255.0");
+  ipv4.Assign (devices);
 
-//  test->TestInit ();
+  Ptr<Ipv4> stack = clickNodes.Get (0)->GetObject<Ipv4> ();
+
+  Ptr<Ipv4ClickRouting> click = Create<Ipv4ClickRouting>();
+  click->SetClickFile ("nsclick-simple-bridge.click");
+  click->SetNodeName ("Node0");
 
-  Simulator::Schedule (Seconds (20.0), &testme1, test);
+  stack->SetRoutingProtocol (click);
+
+  click->DoStart ();
+//  click->TestInit ();
+
+//  Simulator::Schedule (Seconds (20.0), &testme1, click);
 //  Simulator::Schedule (Seconds (20.0), &testme2, test);
 
   Simulator::Stop (Seconds (30.0));
--- a/src/routing/click/ipv4-click-routing.cc	Thu May 27 19:21:13 2010 +0530
+++ b/src/routing/click/ipv4-click-routing.cc	Fri May 28 14:40:42 2010 +0530
@@ -21,8 +21,10 @@
 
 #ifdef NS3_CLICK
 
+#include "ns3/node.h"
 #include "ns3/simulator.h"
 #include "ns3/log.h"
+#include "ns3/mac48-address.h"
 
 #include "ipv4-click-routing.h"
 #include <string>
@@ -38,6 +40,8 @@
 std::map < simclick_node_t *, Ptr<Ipv4ClickRouting> > Ipv4ClickRouting::m_clickInstanceFromSimNode;
 
 Ipv4ClickRouting::Ipv4ClickRouting ()
+  : m_clickFile (NULL),
+    m_ipv4 (0)
 {}
 
 Ipv4ClickRouting::~Ipv4ClickRouting ()
@@ -46,8 +50,28 @@
 void
 Ipv4ClickRouting::DoStart ()
 {
-  m_simnode = new simclick_node_t;
+  uint32_t id = m_ipv4->GetObject<Node> ()->GetId ();
+
+  std::stringstream name;
+  name << "Node" << id;
+  m_nodeName = name.str ();
+
+  m_simNode = new simclick_node_t;
   AddSimNodeToClickMapping ();
+
+  NS_ASSERT (m_clickFile != NULL);
+
+  if (simclick_click_create (m_simNode, m_clickFile) >= 0)
+    {
+      NS_LOG_DEBUG (m_nodeName << " has initialised a Click Router");
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Click Router Initialisation failed for " << m_nodeName);
+    }
+
+  timerclear (&m_simNode->curtime);
+  simclick_click_run (m_simNode);
 }
 
 void
@@ -60,6 +84,25 @@
 Ipv4ClickRouting::DoDispose ()
 {
   m_ipv4 = 0;
+  delete m_simNode;
+}
+
+void
+Ipv4ClickRouting::SetClickFile (const char *clickfile)
+{
+  m_clickFile = clickfile;
+}
+
+void
+Ipv4ClickRouting::SetNodeName (std::string name)
+{
+  m_nodeName = name;
+}
+
+std::string
+Ipv4ClickRouting::GetNodeName ()
+{
+  return m_nodeName;
 }
 
 void
@@ -70,11 +113,69 @@
 Ipv4ClickRouting::SendToExtRouter (Ptr<Packet>, bool direction)
 {}
 
+int
+Ipv4ClickRouting::GetInterfaceId (const char *ifname)
+{
+  int retval = -1;
+
+  if (strstr(ifname, "tap") || strstr(ifname, "tun"))
+    {
+      retval = ExtRouter::IFID_KERNELTAP;
+    }
+  else if (const char *devname = strstr(ifname, "eth"))
+    {
+      while (*devname && !isdigit((unsigned char) *devname))
+        {
+          devname++;
+        }
+
+      if (*devname)
+        {
+          retval = atoi(devname) + ExtRouter::IFID_FIRSTIF;
+        }
+    }
+   else if (const char *devname = strstr(ifname, "drop"))
+     {
+       while (*devname && !isdigit((unsigned char) *devname))
+         {
+           devname++;
+         }
+       if (*devname)
+         {
+           retval = atoi(devname) + ExtRouter::IFID_FIRSTIFDROP;
+         }
+     }
+
+  return retval;
+}
+
+std::string
+Ipv4ClickRouting::GetIpAddrFromIfid (int ifid)
+{
+  std::stringstream addr;
+  m_ipv4->GetAddress (ifid, 0).GetLocal ().Print (addr);
+
+  return addr.str ();
+}
+
+std::string
+Ipv4ClickRouting::GetMacAddrFromIfid (int ifid)
+{
+  std::stringstream addr;
+
+  Ptr<NetDevice> device = m_ipv4->GetNetDevice (ifid);
+
+  Address devAddr = device->GetAddress ();
+  addr << Mac48Address::ConvertFrom(devAddr);
+
+  NS_LOG_DEBUG (addr.str ());
+  return addr.str ();
+}
 
 void
 Ipv4ClickRouting::AddSimNodeToClickMapping ()
 {
-  m_clickInstanceFromSimNode.insert (std::make_pair (m_simnode, this));
+  m_clickInstanceFromSimNode.insert (std::make_pair (m_simNode, this));
 }
 
 Ptr<Ipv4ClickRouting>
@@ -86,24 +187,20 @@
 void
 Ipv4ClickRouting::HandleScheduleFromClick (const struct timeval *when)
 {
-  NS_LOG_UNCOND ("HandleScheduleFromClick at " << Simulator::Now ());
-//  simclick_simpacketinfo pinfo;
+  NS_LOG_DEBUG ("HandleScheduleFromClick at " << Simulator::Now ());
 
-  m_simnode->curtime = *when;
-  simclick_click_run (m_simnode);
-//  simclick_click_send(simnode,1,-1,0,100,&pinfo);
+  m_simNode->curtime = *when;
+  simclick_click_run (m_simNode);
 }
 
 void
 Ipv4ClickRouting::HandlePacketFromClick (int ifid, int ptype, const unsigned char* data, int len)
 {
-  NS_LOG_UNCOND ("HandlePacketFromClick"); 
+  NS_LOG_DEBUG ("HandlePacketFromClick"); 
 
   // Figure out packet's destination here:
   // If ifid == 0, then packet's going up
   // else, packet's going down
-
-  Simulator::Schedule (Seconds (1.0), &Ipv4ClickRouting::SendPacketToClick, this, 2, -1, data, 100);
   
 }
 
@@ -111,40 +208,23 @@
 Ipv4ClickRouting::SendPacketToClick (int ifid, int ptype, const unsigned char* data, int len)
 {
   simclick_simpacketinfo pinfo;
-  simclick_click_send(m_simnode,ifid,ptype,data,len,&pinfo);
+  simclick_click_send(m_simNode,ifid,ptype,data,len,&pinfo);
 }
 
 void
 Ipv4ClickRouting::TestInit ()
 {
-  timerclear (&m_simnode->curtime);
-  
-  DoStart ();
+//  NS_LOG_DEBUG ("GetNInterfaces () : " << m_ipv4->GetNInterfaces ());
+//  DoStart (); // Call DoStart for now, because we are not using Helpers yet
 
-  // This would go into DoStart ()
-  if (simclick_click_create (m_simnode, "/home/nightstrike/builds/gsoc/ns-3-click/src/routing/click/nsclick-simple-bridge.click") >= 0)
-    {
-      NS_LOG_UNCOND ("Initialised a Click Router");
-    }
-  else
-    {
-      NS_LOG_UNCOND ("Initialisation failed");
-    }
 
-  NS_LOG_UNCOND ("Testing simclick run");
-
-  simclick_click_run (m_simnode);
-
-  NS_LOG_UNCOND ("Testing simclick_click_send");
+//  simclick_simpacketinfo pinfo;
+//  simnode_->curtime = *when;
+//  pinfo.id = 2;
+//  pinfo.fid =2;
+//  simclick_click_send(simnode_,ifid_,ptype_,data_,len_,&pinfo);
 
-  simclick_simpacketinfo pinfo;
-
-//  simnode_->curtime = *when;
-  pinfo.id = 2;
-  pinfo.fid =2;
-
-//  simclick_click_send(simnode_,ifid_,ptype_,data_,len_,&pinfo);
-  simclick_click_send(m_simnode,1,-1,0,100,&pinfo);
+//  simclick_click_send(m_simNode,1,-1,0,100,&pinfo);
 }
 
 } // namespace ns3
@@ -169,8 +249,7 @@
       s.copy(buf, len);
       buf[len] = '\0';
     }
-
-    return 0;
+  return 0;
 }
 
 // Sends a Packet from Click to the Simulator: Defined in simclick.h
@@ -178,7 +257,7 @@
                       int ifid, int type, const unsigned char* data, int len,
                       simclick_simpacketinfo *pinfo)
 {
-  NS_LOG_UNCOND ("simclick_sim_send called : " << ifid << " " << type << " " << data << " "<< len);
+  NS_LOG_DEBUG ("simclick_sim_send called : " << ifid << " " << type << " " << data << " "<< len);
   
   Ptr<Ipv4ClickRouting> clickInstance = Ipv4ClickRouting::GetClickInstanceFromSimNode (simnode);
 
@@ -215,37 +294,9 @@
       {
         const char *ifname = va_arg(val, const char *);
 
-        retval = -1;
-
-        if (strstr(ifname, "tap") || strstr(ifname, "tun"))
-          {
-            retval = ExtRouter::IFID_KERNELTAP;
-          }
-        else if (const char *devname = strstr(ifname, "eth"))
-          {
-            while (*devname && !isdigit((unsigned char) *devname))
-              {
-                devname++;
-              }
-
-            if (*devname)
-              {
-                retval = atoi(devname) + ExtRouter::IFID_FIRSTIF;
-              }
-          }
-        else if (const char *devname = strstr(ifname, "drop"))
-          {
-            while (*devname && !isdigit((unsigned char) *devname))
-              {
-                devname++;
-              }
-            if (*devname)
-              {
-                retval = atoi(devname) + ExtRouter::IFID_FIRSTIFDROP;
-              }
-          }
+        retval = clickInstance->GetInterfaceId (ifname);
  
-        NS_LOG_UNCOND ("SIMCLICK_IFID_FROM_NAME: " << ifname << " " << retval);
+        NS_LOG_DEBUG (clickInstance->GetNodeName () << " SIMCLICK_IFID_FROM_NAME: " << ifname << " " << retval);
         break;
       }
 
@@ -255,9 +306,9 @@
         char *buf = va_arg(val, char *);
         int len = va_arg(val, int);
         
-        retval = simstrlcpy(buf, len, "172.16.1.10"); // For testing purposes: Instead, retrieve interface IP addr.
+        retval = simstrlcpy(buf, len, clickInstance->GetIpAddrFromIfid (clickInstance->GetInterfaceId (ifname)));
 
-        NS_LOG_UNCOND ("SIMCLICK_IPADDR_FROM_NAME: "<< ifname << " "<< buf << " " << len);
+        NS_LOG_DEBUG (clickInstance->GetNodeName () << " SIMCLICK_IPADDR_FROM_NAME: "<< ifname << " "<< buf << " " << len);
         break;
       }
 
@@ -267,9 +318,9 @@
         char *buf = va_arg(val, char *);
         int len = va_arg(val, int);
 //        int ifid = cc->GetIFID(ifname);
-        retval = simstrlcpy(buf, len, "00:03:47:70:89:03"); // For testing purposes: Instead, retrieve interface MAC addr.
+        retval = simstrlcpy(buf, len, clickInstance->GetMacAddrFromIfid (clickInstance->GetInterfaceId (ifname)));
 
-        NS_LOG_UNCOND ("SIMCLICK_MACADDR_FROM_NAME: "<< ifname << " "<< buf << " "<< len);
+        NS_LOG_DEBUG (clickInstance->GetNodeName () << " SIMCLICK_MACADDR_FROM_NAME: "<< ifname << " "<< buf << " "<< len);
         break;
       }
 
@@ -283,7 +334,7 @@
         Simulator::Schedule (Seconds(simdelay), &Ipv4ClickRouting::HandleScheduleFromClick, clickInstance, when); //Testing
 
 //        clickInstance->HandleScheduleFromClick (simnode,when);
-        NS_LOG_UNCOND ("SIMCLICK_SCHEDULE: "<< simtime << " " << Simulator::Now ().GetSeconds () << " " <<simdelay);
+        NS_LOG_DEBUG (clickInstance->GetNodeName () << " SIMCLICK_SCHEDULE: "<< simtime << " " << Simulator::Now ().GetSeconds () << " " <<simdelay);
 
         retval = 0;
         break;
@@ -293,9 +344,9 @@
       {
         char *buf = va_arg(val, char *);
         int len = va_arg(val, int);
-        retval = simstrlcpy(buf, len, "Node0");
+        retval = simstrlcpy(buf, len, clickInstance->GetNodeName ());
 
-        NS_LOG_UNCOND ("SIMCLICK_GET_NODE_NAME: " << buf);
+        NS_LOG_DEBUG (clickInstance->GetNodeName () << " SIMCLICK_GET_NODE_NAME: " << buf);
         break;
       }
 
@@ -306,19 +357,19 @@
         // We're not using a ClickQueue, so we're always ready (for the timebeing)    
         retval = 1;
 
-        NS_LOG_UNCOND ("SIMCLICK_IF_READY: " << ifid << " " << Simulator::Now ());
+        NS_LOG_DEBUG (clickInstance->GetNodeName () << " SIMCLICK_IF_READY: " << ifid << " " << Simulator::Now ());
         break;
       }
 
     case SIMCLICK_TRACE:
       {
-        NS_LOG_UNCOND ("Received a call for SIMCLICK_TRACE");
+        NS_LOG_DEBUG (clickInstance->GetNodeName () << " Received a call for SIMCLICK_TRACE");
         break;
       }
 
     case SIMCLICK_GET_NODE_ID:
       {
-        NS_LOG_UNCOND ("Received a call for SIMCLICK_GET_NODE_ID");
+        NS_LOG_DEBUG (clickInstance->GetNodeName () << " Received a call for SIMCLICK_GET_NODE_ID");
         break;
       }
   }
--- a/src/routing/click/ipv4-click-routing.h	Thu May 27 19:21:13 2010 +0530
+++ b/src/routing/click/ipv4-click-routing.h	Fri May 28 14:40:42 2010 +0530
@@ -38,32 +38,35 @@
 class Ipv4ClickRouting : public Ipv4ExternalRouting
 {
 public:
+
   Ipv4ClickRouting ();
   virtual ~Ipv4ClickRouting ();
 
   virtual void DoStart ();
   virtual void DoDispose ();
+  void SetClickFile (const char *clickfile);
+  void SetNodeName (std::string name);
 
 private:
   // Allow Click Service methods to choose appropriate Ipv4ClickRouting object
   static std::map < simclick_node_t *, Ptr<Ipv4ClickRouting> > m_clickInstanceFromSimNode;
 
-  std::string m_clickFile;
+  const char *m_clickFile;
   std::string m_nodeName;
 
-  simclick_node_t *m_simnode;
+  simclick_node_t *m_simNode;
 
   std::map < std::string, uint32_t > m_ifaceIdFromName;
   std::map < std::string, Address > m_ifaceMacFromName;
   std::map < std::string, Ipv4Address > m_ifaceAddrFromName;
   bool m_clickInitialised;
 
-// Uncomment below once node is ready for aggregation: Else it leads to a SIGSEGV
   Ptr<Ipv4> m_ipv4;
 
 public:
-  std::string GetIpAddr (int ifid);
-  std::string GetMacAddr (int ifid);
+  int GetInterfaceId (const char *ifname);
+  std::string GetIpAddrFromIfid (int ifid);
+  std::string GetMacAddrFromIfid (int ifid);
   std::string GetNodeName ();
   int IfReady (int ifid);
   virtual void ReceiveFromExtRouter (Ptr<Packet> p, bool direction);