[Click] nsclick rng support for ns3

Sascha Alexander Jopen jopen at informatik.uni-bonn.de
Mon Jan 21 06:16:16 EST 2013


Hey,

please find attached a patchset for click and ns3 which adds support for
drawing random numbers within click simulations from the underlying ns3
random number generator. Each simulated click node has its own uniformly
distributed random number stream (as opposed to my previously submitted
patch). This way all nodes have independent random number streams.

Setting the seed or run numbers is done within the simulation by means of

RngSeedManager::SetSeed ();
RngSeedManager::SetRun ();

or with environment variables or command line parameters.
See http://www.nsnam.org/docs/manual/html/random-variables.html

I still have no ns2 available. Currently, missing rng support from the
simulator side is detected and reported but no random numbers are
available to the simulation. Implementing a fallback method should be
possible, however. Maybe someone who uses ns2 could provide this?

click-ns3-rng.diff is for the click side and ns3-nsclick-rng.diff for
the ns3 side.

Regards,
Sascha

-- 
Dipl.-Inform. Sascha Jopen

University of Bonn                     Tel.:   +49-228-73-54219
Institute of Computer Science 4        Fax:    +49-228-73-4571
Friedrich-Ebert-Allee 144              E-mail: jopen at cs.uni-bonn.de
D-53113 Bonn, Germany
-------------- next part --------------
diff --git a/include/click/glue.hh b/include/click/glue.hh
index a908496..eed522b 100644
--- a/include/click/glue.hh
+++ b/include/click/glue.hh
@@ -70,6 +70,7 @@ CLICK_CXX_UNPROTECT
 # include <sys/time.h>
 # if CLICK_NS
 extern "C" int simclick_gettimeofday(struct timeval *);
+extern "C" uint32_t simclick_random();
 # endif
 # if HAVE_MULTITHREAD
 #  include <pthread.h>
@@ -132,6 +133,8 @@ void click_random_srandom();
 
 #if CLICK_BSDMODULE
 # define CLICK_RAND_MAX 0x7FFFFFFFU
+#elif CLICK_NS
+# define CLICK_RAND_MAX 0xFFFFFFFEU
 #elif !CLICK_LINUXMODULE && RAND_MAX >= 0x7FFFFFFFU
 # define CLICK_RAND_MAX RAND_MAX
 #else
@@ -145,6 +148,8 @@ inline uint32_t click_random() {
 #elif CLICK_LINUXMODULE
     click_random_seed = click_random_seed * 69069L + 5;
     return (click_random_seed ^ jiffies) & CLICK_RAND_MAX; // XXX jiffies??
+#elif CLICK_NS
+    return simclick_random();
 #elif HAVE_RANDOM && CLICK_RAND_MAX == RAND_MAX
     return random();
 #else
@@ -155,6 +160,9 @@ inline uint32_t click_random() {
 inline void click_srandom(uint32_t seed) {
 #if CLICK_BSDMODULE
     srandom(seed);
+#elif CLICK_NS
+    // do nothing, seeding is done by the ns seed manager
+    (void) seed;
 #elif !CLICK_LINUXMODULE && HAVE_RANDOM && CLICK_RAND_MAX == RAND_MAX
     srandom(seed);
 #elif !CLICK_LINUXMODULE && CLICK_RAND_MAX == RAND_MAX
diff --git a/include/click/simclick.h b/include/click/simclick.h
index 972a977..863d827 100644
--- a/include/click/simclick.h
+++ b/include/click/simclick.h
@@ -106,6 +106,7 @@ int simclick_gettimeofday(struct timeval* tv);
 #define SIMCLICK_CHANGE_CHANNEL		11 // int ifid, int channelid
 #define SIMCLICK_IF_PROMISC		12 // int ifid
 #define SIMCLICK_IPPREFIX_FROM_NAME	13 // const char *ifname, char *buf, int len
+#define SIMCLICK_RANDOM				14 // none
 
 int simclick_sim_command(simclick_node_t *sim, int cmd, ...);
 int simclick_click_command(simclick_node_t *sim, int cmd, ...);
diff --git a/ns/nsclick.cc b/ns/nsclick.cc
index 1e00b32..a2b54fc 100644
--- a/ns/nsclick.cc
+++ b/ns/nsclick.cc
@@ -153,6 +154,23 @@ int simclick_gettimeofday(struct timeval* tv) {
   }
 }
 
+uint32_t simclick_random() {
+	static bool sim_rng_support = simclick_sim_command(NULL, SIMCLICK_SUPPORTS, SIMCLICK_RANDOM);
+
+	if (sim_rng_support) {
+		if (cursimnode) {
+			uint32_t random_number;
+			simclick_sim_command(cursimnode, SIMCLICK_RANDOM, &random_number);
+			return random_number;
+		} else {
+		    click_chatter("simclick_random: call without simstate set");
+		}
+	} else {
+	    click_chatter("simclick_random: simulator has no random number support");
+	}
+	return 0;
+}
+
 int simclick_click_send(simclick_node_t *simnode,
 			int ifid,int type,const unsigned char* data,int len,
 			simclick_simpacketinfo* pinfo) {
-------------- next part --------------
diff -r fd38b9505eb9 src/click/model/ipv4-click-routing.cc
--- a/src/click/model/ipv4-click-routing.cc	Mon Jan 14 09:39:06 2013 -0800
+++ b/src/click/model/ipv4-click-routing.cc	Mon Jan 21 10:27:06 2013 +0100
@@ -24,6 +24,7 @@
 #include "ns3/node.h"
 #include "ns3/simulator.h"
 #include "ns3/log.h"
+#include "ns3/random-variable.h"
 #include "ns3/mac48-address.h"
 #include "ns3/ipv4-interface.h"
 #include "ns3/ipv4-l3-click-protocol.h"
@@ -63,6 +64,7 @@
   : m_nonDefaultName (false),
     m_ipv4 (0)
 {
+  m_random = CreateObject<UniformRandomVariable> ();
 }
 
 Ipv4ClickRouting::~Ipv4ClickRouting ()
@@ -111,6 +113,12 @@
   m_ipv4 = ipv4;
 }
 
+Ptr<UniformRandomVariable>
+Ipv4ClickRouting::GetRandom (void)
+{
+  return m_random;
+}
+
 void
 Ipv4ClickRouting::DoDispose ()
 {
@@ -606,7 +614,7 @@
     case SIMCLICK_SUPPORTS:
       {
         int othercmd = va_arg (val, int);
-        retval = (othercmd >= SIMCLICK_VERSION && othercmd <= SIMCLICK_GET_NODE_ID);
+        retval = (othercmd >= SIMCLICK_VERSION && othercmd <= SIMCLICK_RANDOM);
         break;
       }
 
@@ -738,6 +746,16 @@
         NS_LOG_DEBUG (clickInstance->GetNodeName () << " Received a call for SIMCLICK_GET_NODE_ID");
         break;
       }
+
+    case SIMCLICK_RANDOM:
+      {
+        uint32_t *random_value = va_arg (val, uint32_t *);
+
+        *random_value = clickInstance->GetRandom ()->GetInteger (0, 0xFFFFFFFEU);
+        retval = 0;
+        NS_LOG_DEBUG (clickInstance->GetNodeName () << " SIMCLICK_RANDOM: " << *random_value << " " << ns3::Simulator::Now ());
+        break;
+      }
     }
   return retval;
 }
diff -r fd38b9505eb9 src/click/model/ipv4-click-routing.h
--- a/src/click/model/ipv4-click-routing.h	Mon Jan 14 09:39:06 2013 -0800
+++ b/src/click/model/ipv4-click-routing.h	Mon Jan 21 10:27:06 2013 +0100
@@ -25,6 +25,7 @@
 #include "ns3/packet.h"
 #include "ns3/ipv4.h"
 #include "ns3/ipv4-routing-protocol.h"
+#include "ns3/random-variable-stream.h"
 #include "ns3/test.h"
 
 #include <sys/time.h>
@@ -63,6 +64,7 @@
   Ipv4ClickRouting ();
   virtual ~Ipv4ClickRouting ();
 
+  Ptr<UniformRandomVariable> GetRandom (void);
 protected:
   virtual void DoStart (void);
 
@@ -255,6 +257,7 @@
   bool m_nonDefaultName;
 
   Ptr<Ipv4> m_ipv4;
+  Ptr<UniformRandomVariable> m_random;
 #endif /* NS3_CLICK */
 };
 


More information about the click mailing list