--- 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;
}
}