himalis.patch
author Hajime Tazaki <tazaki@nict.go.jp>
Fri, 11 May 2012 17:03:32 +0900
changeset 20 5ca51e147e7f
parent 11 ce3a1f87be3d
permissions -rw-r--r--
unbound, bind9, fedora8 added

diff -r 9f12d65beb55 example/dce-himalis-handoff.cc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/dce-himalis-handoff.cc	Thu Mar 29 13:58:16 2012 +0900
@@ -0,0 +1,296 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 NICT
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Hajime Tazaki <tazaki@nict.go.jp>
+ */
+
+#include "ns3/network-module.h"
+#include "ns3/core-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/csma-helper.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/dce-module.h"
+#include "ns3/himalis-helper.h"
+#include "ns3/mobility-module.h"
+#include "ns3/wifi-module.h"
+#include "visual-simulator-impl.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("HimalisHandoff");
+
+// Parameters
+uint32_t stopTime = 120;
+bool noMobility = false;
+
+std::string host0_srcid = "2001-200-0-e101-0-0-0-beaf";
+std::string host1_srcid = "2001-200-0-e101-0-0-0-3939";
+std::string gw0_sim0 = "2001:3939:0:1::1";
+std::string host0_gw0_sim0 = "2001:3939:0:1::2";
+std::string gw1_sim0 = "2001:5959:0:1::1";
+std::string host0_gw1_sim0 = "2001:5959:0:1::2";
+
+std::string gw0_sim1 = "2002:4949:0:1::1";
+std::string host1_sim0 = "2002:4949:0:1::2";
+
+std::string gw1_sim1 = "2002:6969:0:1::1";
+std::string host1_sim1 = "2002:6969:0:1::2";
+
+NodeContainer hosts, gw;
+
+static void RunIp (Ptr<Node> node, Time at, std::string str)
+{
+  DceApplicationHelper process;
+  ApplicationContainer apps;
+  process.SetBinary ("ip");
+  process.SetStackSize (1<<31);
+  process.ResetArguments();
+  process.ParseArguments(str.c_str ());
+  apps = process.Install (node);
+  apps.Start (at);
+}
+
+static void
+AssocCallback (Ptr<HimalisHelper> himalis, std::string path, Mac48Address bssid)
+{
+  uint8_t gw0[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x02};
+  uint8_t gw1[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x03};
+  uint8_t cur[6];
+
+  bssid.CopyTo (cur);
+
+  std::cout << Simulator::Now ().GetSeconds () << " " << path << " with " << bssid;
+  // in case gw0
+  if (memcmp (cur, gw0, 6) == 0)
+    {
+      std::cout << " gw0 " << std::endl;
+      RunIp (hosts.Get (0), Simulator::Now (), "-f inet6 addr del " + host0_gw1_sim0 + "/64 dev sim0");
+      RunIp (hosts.Get (0), Simulator::Now (), "-f inet6 route del default via "+ gw1_sim0);
+      RunIp (hosts.Get (0), Simulator::Now (), "-f inet6 addr add " + host0_gw0_sim0 + "/64 dev sim0");
+      RunIp (hosts.Get (0), Simulator::Now (), "-f inet6 route add default via "+ gw0_sim0);
+#if 1
+      himalis->DelIdlRoute (hosts.Get (0), Simulator::Now (),
+                           host0_srcid.c_str (), host1_srcid.c_str ());
+      himalis->AddIdlRoute (hosts.Get (0), Simulator::Now (),
+                           "host", host0_srcid.c_str (), host1_srcid.c_str (),
+                           host0_gw0_sim0.c_str (), gw0_sim0.c_str (), "sim0");
+
+      himalis->DelIdlRoute (hosts.Get (1), Simulator::Now (),
+                           host1_srcid.c_str (), host0_srcid.c_str ());
+      himalis->AddIdlRoute (hosts.Get (1), Simulator::Now (),
+                           "host", host1_srcid.c_str (), host0_srcid.c_str (),
+                           host1_sim0.c_str (), gw0_sim1.c_str (), "sim0");
+#endif
+    }
+  // in case gw1
+  else if (memcmp (cur, gw1, 6) == 0)
+    {
+      std::cout << " gw1 " << std::endl;
+      RunIp (hosts.Get (0), Simulator::Now (), "-f inet6 addr del " + host0_gw0_sim0 + "/64 dev sim0");
+      RunIp (hosts.Get (0), Simulator::Now (), "-f inet6 route del default via "+ gw0_sim0);
+      RunIp (hosts.Get (0), Simulator::Now (), "-f inet6 addr add " + host0_gw1_sim0 + "/64 dev sim0");
+      RunIp (hosts.Get (0), Simulator::Now (), "-f inet6 route add default via "+ gw1_sim0);
+#if 1
+      himalis->DelIdlRoute (hosts.Get (0), Simulator::Now (),
+                           host0_srcid.c_str (), host1_srcid.c_str ());
+      himalis->AddIdlRoute (hosts.Get (0), Simulator::Now (),
+                           "host", host0_srcid.c_str (), host1_srcid.c_str (),
+                           host0_gw1_sim0.c_str (), gw1_sim0.c_str (), "sim0");
+
+      himalis->DelIdlRoute (hosts.Get (1), Simulator::Now (),
+                           host1_srcid.c_str (), host0_srcid.c_str ());
+      himalis->AddIdlRoute (hosts.Get (1), Simulator::Now (),
+                           "host", host1_srcid.c_str (), host0_srcid.c_str (),
+                           host1_sim1.c_str (), gw1_sim1.c_str (), "sim1");
+      himalis->ShowIdlRoute (hosts.Get (1), Simulator::Now ());
+#endif
+    }
+
+}
+
+
+int main (int argc, char *argv[])
+{
+  CommandLine cmd;
+  cmd.AddValue ("stopTime", "Time to stop(seconds)", stopTime);
+  cmd.AddValue ("noMobility", "Without movement", noMobility);
+  cmd.Parse (argc, argv);
+
+  // nodes
+  gw.Create (2);
+  hosts.Create (2);
+
+  // movement
+  NetDeviceContainer devices;
+  MobilityHelper mobility;
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+  positionAlloc->Add (Vector (0.0, 10.0, 0.0)); // GW0
+  positionAlloc->Add (Vector (150.0, 10.0, 0.0)); // GW1
+  positionAlloc->Add (Vector (75.0, -50.0, 0.0)); // CN
+  mobility.SetPositionAllocator (positionAlloc);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (gw);
+  mobility.Install (hosts.Get (1));
+
+  Ptr<ns3::RandomDiscPositionAllocator> r_position =
+    CreateObject<RandomDiscPositionAllocator> ();
+  r_position->SetX (100);
+  r_position->SetY (50);
+  r_position->SetRho (UniformVariable (200, 0));
+  mobility.SetPositionAllocator (r_position);
+  mobility.SetMobilityModel ("ns3::RandomDirection2dMobilityModel",
+                             "Bounds", RectangleValue (Rectangle (0, 200, 30, 60)),
+                             "Speed", RandomVariableValue (ConstantVariable (10)),
+                             "Pause", RandomVariableValue (ConstantVariable (0.2)));
+  if (noMobility)
+    {  
+      mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+    }
+  mobility.Install (hosts.Get (0));
+
+  // net devices
+  // wifi
+  WifiHelper wifi = WifiHelper::Default ();
+  YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
+  YansWifiChannelHelper phyChannel = YansWifiChannelHelper::Default ();
+  Ssid ssid = Ssid ("ns-3-ssid");
+  NqosWifiMacHelper mac;
+  wifi.SetStandard (WIFI_PHY_STANDARD_80211a);
+
+  phy.SetChannel (phyChannel.Create ());
+  mac.SetType ("ns3::StaWifiMac",
+               "Ssid", SsidValue (ssid),
+               "ActiveProbing", BooleanValue (false));
+  wifi.Install (phy, mac, hosts.Get (0));
+  mac.SetType ("ns3::ApWifiMac",
+               "Ssid", SsidValue (ssid));
+  wifi.Install (phy, mac, gw);
+  // ptp netdev
+  PointToPointHelper p2p;
+  p2p.Install (NodeContainer (gw.Get (0), hosts.Get (1))); // CN - GW0
+  p2p.Install (NodeContainer (gw.Get (1), hosts.Get (1))); // CN - GW1
+
+
+
+  // addresses (locators)
+  DceManagerHelper dceManager;
+  HimalisHelper himalis;
+  dceManager.SetTaskManagerAttribute ("FiberManagerType", 
+                                          EnumValue (0));
+  dceManager.SetLoader ("ns3::DlmLoaderFactory");
+  dceManager.SetNetworkStack("ns3::LinuxSocketFdFactory",
+                             "Library", StringValue ("liblinux-2.6.32.27-tpidl.so"));
+  dceManager.Install (NodeContainer (hosts, gw));
+  himalis.Install (NodeContainer (hosts, gw));
+
+  // GW0
+  RunIp (gw.Get (0), Seconds (0.1), "link set lo up");
+  RunIp (gw.Get (0), Seconds (0.1), "link set sim0 up");
+  RunIp (gw.Get (0), Seconds (0.1), "link set sim1 up");
+  RunIp (gw.Get (0), Seconds (0.2), "-f inet6 addr add " + gw0_sim0 + "/64 dev sim0");
+  RunIp (gw.Get (0), Seconds (0.15), "-f inet6 addr add " + gw0_sim1 + "/64 dev sim1");
+  // HIMALIS configuration
+#if 1
+  himalis.AddIdlRoute (gw.Get (0), Seconds (0.2), "forward", host0_srcid.c_str (), host1_srcid.c_str (),
+                       gw0_sim1.c_str (), host1_sim0.c_str (), "sim1");
+  himalis.AddIdlRoute (gw.Get (0), Seconds (0.2), "forward", host1_srcid.c_str (), host0_srcid.c_str (),
+                       gw0_sim0.c_str (), host0_gw0_sim0.c_str (), "sim0");
+#endif
+#if 0
+  himalis.ShowIdlRoute (gw.Get (0), Seconds (0.2));
+#endif
+  RunIp (gw.Get (0), Seconds (1.0), "addr list");
+
+  // GW1
+  RunIp (gw.Get (1), Seconds (0.1), "link set lo up");
+  RunIp (gw.Get (1), Seconds (0.1), "link set sim0 up");
+  RunIp (gw.Get (1), Seconds (0.1), "link set sim1 up");
+  RunIp (gw.Get (1), Seconds (0.2), "-f inet6 addr add " + gw1_sim0 + "/64 dev sim0");
+  RunIp (gw.Get (1), Seconds (0.2), "-f inet6 addr add " + gw1_sim1 + "/64 dev sim1");
+  // HIMALIS configuration
+#if 1
+  himalis.AddIdlRoute (gw.Get (1), Seconds (0.2), "forward", host0_srcid.c_str (), host1_srcid.c_str (),
+                       gw1_sim1.c_str (), host1_sim1.c_str (), "sim1");
+  himalis.AddIdlRoute (gw.Get (1), Seconds (0.2), "forward", host1_srcid.c_str (), host0_srcid.c_str (),
+                       gw1_sim0.c_str (), host0_gw1_sim0.c_str (), "sim0");
+#endif
+#if 0
+  himalis.ShowIdlRoute (gw.Get (1), Seconds (0.2));
+#endif
+  RunIp (gw.Get (1), Seconds (1.0), "addr list");
+
+  // Host0 (MN)
+  RunIp (hosts.Get (0), Seconds (0.1), "link set lo up");
+  RunIp (hosts.Get (0), Seconds (0.1), "link set sim0 up");
+  RunIp (hosts.Get (0), Seconds (1.0), "addr list");
+#if 0
+  RunIp (hosts.Get (0), Seconds (0.2), "-f inet6 addr add " + host0_gw1_sim0 + "/64 dev sim0");
+  RunIp (hosts.Get (0), Seconds (0.2), "-f inet6 route add default via "+ gw1_sim0);
+  himalis.AddIdlRoute (hosts.Get (0), Seconds (0.2), "host", host0_srcid.c_str (), host1_srcid.c_str (),
+                       host0_gw1_sim0.c_str (), gw1_sim0.c_str (), "sim0");
+#endif
+
+  // Host1 (CN)
+  RunIp (hosts.Get (1), Seconds (0.1), "link set lo up");
+  RunIp (hosts.Get (1), Seconds (0.1), "link set sim0 up");
+  RunIp (hosts.Get (1), Seconds (0.1), "link set sim1 up");
+  RunIp (hosts.Get (1), Seconds (0.3), "-f inet6 addr add " + host1_sim0 + "/64 dev sim0");
+  RunIp (hosts.Get (1), Seconds (0.3), "-f inet6 route add default via " + gw0_sim1);
+  RunIp (hosts.Get (1), Seconds (0.2), "-f inet6 addr add " + host1_sim1 + "/64 dev sim1");
+  RunIp (hosts.Get (1), Seconds (0.2), "-f inet6 route add default via " + gw1_sim1);
+  RunIp (hosts.Get (1), Seconds (1.0), "addr list");
+#if 0
+  himalis.AddIdlRoute (hosts.Get (1), Seconds (0.2), "host", host1_srcid.c_str (), host0_srcid.c_str (),
+                       host1_sim0.c_str (), gw0_sim1.c_str (), "sim0");
+#endif
+
+  // Applications
+  DceApplicationHelper process;
+  ApplicationContainer apps;
+#if 1
+  // server install to host1
+  process.SetBinary ("idecho-s");
+  process.ResetArguments ();
+  process.ParseArguments ("-s " + host1_srcid);
+  process.SetStackSize (1<<16);
+  apps = process.Install (hosts.Get (1));
+  apps.Start (Seconds (4.0));
+#endif
+
+  // client install to host0
+  process.SetBinary ("idecho-c");
+  process.ResetArguments ();
+  process.ParseArguments ("-s " + host0_srcid);
+  process.ParseArguments ("-d " + host1_srcid);
+  process.SetStackSize (1<<16);
+  apps = process.Install (hosts.Get (0));
+  apps.Start (Seconds (5.0));
+
+  p2p.EnablePcapAll ("dce-himalis");
+  phy.EnablePcapAll ("dce-himalis");
+
+  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::StaWifiMac/Assoc", 
+                   MakeBoundCallback (&AssocCallback, &himalis));
+
+  Simulator::Stop (Seconds (stopTime));
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+  NS_LOG_INFO ("End of experiment");
+
+  return 0;
+}
diff -r 9f12d65beb55 example/dce-himalis-simple.cc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/dce-himalis-simple.cc	Thu Mar 29 13:58:16 2012 +0900
@@ -0,0 +1,156 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 NICT
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Hajime Tazaki <tazaki@nict.go.jp>
+ */
+
+#include "ns3/network-module.h"
+#include "ns3/core-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/csma-helper.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/dce-module.h"
+#include "ns3/himalis-helper.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("HimalisSimple");
+
+// Parameters
+uint32_t stopTime = 60;
+
+static void RunIp (Ptr<Node> node, Time at, std::string str)
+{
+  DceApplicationHelper process;
+  ApplicationContainer apps;
+  process.SetBinary ("ip");
+  process.SetStackSize (1<<31);
+  process.ResetArguments();
+  process.ParseArguments(str.c_str ());
+  apps = process.Install (node);
+  apps.Start (at);
+}
+
+std::string host0_srcid = "2001-200-0-e101-0-0-0-beaf";
+std::string host1_srcid = "2001-200-0-e101-0-0-0-3939";
+std::string gw_sim0 = "2001:3939:0:1::1";
+std::string host0_sim0 = "2001:3939:0:1::2";
+std::string gw_sim1_v6 = "2002:4949:0:1::1";
+std::string host1_sim0_v6 = "2002:4949:0:1::2";
+std::string gw_sim1_v4 = "11.0.0.1";
+std::string host1_sim0_v4 = "11.0.0.2";
+
+int main (int argc, char *argv[])
+{
+  CommandLine cmd;
+  cmd.AddValue ("stopTime", "Time to stop(seconds)", stopTime);
+  cmd.Parse (argc, argv);
+
+  // nodes
+  NodeContainer hosts, gw;
+  hosts.Create (2);
+  gw.Create (1);
+
+  // net devices
+  CsmaHelper csma;
+  PointToPointHelper p2p;
+  csma.SetChannelAttribute ("DataRate", StringValue ("5Mbps"));
+  csma.SetChannelAttribute ("Delay", StringValue ("2ms"));
+
+  p2p.Install (NodeContainer (gw, hosts.Get (0))); // Host - GW
+  p2p.Install (NodeContainer (gw, hosts.Get (1))); // Host - GW
+
+  // addresses (locators)
+  DceManagerHelper dceManager;
+  HimalisHelper himalis;
+  //  dceManager.SetLoader ("ns3::DlmLoaderFactory");
+  dceManager.SetNetworkStack("ns3::LinuxSocketFdFactory",
+                             "Library", StringValue ("liblinux-2.6.32.27-tpidl.so"));
+  dceManager.Install (NodeContainer (hosts, gw));
+  himalis.Install (NodeContainer (hosts, gw));
+
+  // GW
+  RunIp (gw.Get (0), Seconds (0.1), "link set lo up");
+  RunIp (gw.Get (0), Seconds (0.1), "link set sim0 up");
+  RunIp (gw.Get (0), Seconds (0.1), "link set sim1 up");
+  RunIp (gw.Get (0), Seconds (0.1), "link set sim2 up");
+  RunIp (gw.Get (0), Seconds (0.2), "-f inet addr add 10.0.0.1/24 dev sim0");
+  RunIp (gw.Get (0), Seconds (0.2), "-f inet6 addr add " + gw_sim0 + "/64 dev sim0");
+  RunIp (gw.Get (0), Seconds (0.2), "-f inet addr add " + gw_sim1_v4 + "/24 dev sim1");
+  RunIp (gw.Get (0), Seconds (0.2), "-f inet6 addr add " + gw_sim1_v6 + "/64 dev sim1");
+  // HIMALIS configuration
+  himalis.AddIdlRoute (gw.Get (0), Seconds (0.2), "forward", host0_srcid.c_str (), host1_srcid.c_str (),
+                       gw_sim1_v4.c_str (), host1_sim0_v4.c_str (), "sim1");
+  himalis.AddIdlRoute (gw.Get (0), Seconds (0.2), "forward", host1_srcid.c_str (), host0_srcid.c_str (),
+                       "10.0.0.1", "10.0.0.2", "sim0");
+  //                       gw_sim0.c_str (), host0_sim0.c_str (), "sim0");
+  himalis.ShowIdlRoute (gw.Get (0), Seconds (0.2));
+  RunIp (gw.Get (0), Seconds (1.0), "addr list");
+
+  // Host0 (MN)
+  RunIp (hosts.Get (0), Seconds (0.1), "link set lo up");
+  RunIp (hosts.Get (0), Seconds (0.1), "link set sim0 up");
+  RunIp (hosts.Get (0), Seconds (0.2), "-f inet addr add 10.0.0.2/24 dev sim0");
+  RunIp (hosts.Get (0), Seconds (0.2), "-f inet route add default via 10.0.0.1");
+  RunIp (hosts.Get (0), Seconds (0.2), "-f inet6 addr add " + host0_sim0 + "/64 dev sim0");
+  RunIp (hosts.Get (0), Seconds (0.2), "-f inet6 route add default via "+ gw_sim0);
+  himalis.AddIdlRoute (hosts.Get (0), Seconds (0.2), "host", host0_srcid.c_str (), host1_srcid.c_str (),
+                       "10.0.0.2", "10.0.0.1", "sim0");
+  //                       host0_sim0.c_str (), gw_sim0.c_str (), "sim0");
+  himalis.ShowIdlRoute (hosts.Get (0), Seconds (0.2));
+  RunIp (hosts.Get (0), Seconds (1.0), "addr list");
+
+  // Host1 (CN)
+  RunIp (hosts.Get (1), Seconds (0.1), "link set lo up");
+  RunIp (hosts.Get (1), Seconds (0.1), "link set sim0 up");
+  RunIp (hosts.Get (1), Seconds (0.2), "-f inet addr add " + host1_sim0_v4 + "/24 dev sim0");
+  RunIp (hosts.Get (1), Seconds (0.2), "-f inet route add default via " + gw_sim1_v4);
+  RunIp (hosts.Get (1), Seconds (0.2), "-f inet6 addr add " + host1_sim0_v6 + "/64 dev sim0");
+  RunIp (hosts.Get (1), Seconds (0.2), "-f inet6 route add default via " + gw_sim1_v6);
+  himalis.AddIdlRoute (hosts.Get (1), Seconds (0.2), "host", host1_srcid.c_str (), host0_srcid.c_str (),
+                       host1_sim0_v4.c_str (), gw_sim1_v4.c_str (), "sim0");
+
+  // Applications
+  DceApplicationHelper process;
+  ApplicationContainer apps;
+  // server install to host1
+  process.SetBinary ("idecho-s");
+  process.ResetArguments ();
+  process.ParseArguments ("-s " + host1_srcid);
+  process.SetStackSize (1<<16);
+  apps = process.Install (hosts.Get (1));
+  apps.Start (Seconds (4.0));
+
+  // client install to host0
+  process.SetBinary ("idecho-c");
+  process.ResetArguments ();
+  process.ParseArguments ("-s " + host0_srcid);
+  process.ParseArguments ("-d " + host1_srcid);
+  process.SetStackSize (1<<16);
+  apps = process.Install (hosts.Get (0));
+  apps.Start (Seconds (5.0));
+
+  p2p.EnablePcapAll ("dce-himalis");
+
+  Simulator::Stop (Seconds (stopTime));
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+  NS_LOG_INFO ("End of experiment");
+
+  return 0;
+}
diff -r 9f12d65beb55 example/dce-linux.cc
--- a/example/dce-linux.cc	Thu Mar 29 13:55:58 2012 +0900
+++ b/example/dce-linux.cc	Thu Mar 29 13:58:16 2012 +0900
@@ -103,7 +103,7 @@
   }
 
   DceManagerHelper processManager;
- // processManager.SetLoader ("ns3::DlmLoaderFactory");
+  processManager.SetLoader ("ns3::DlmLoaderFactory");
   processManager.SetNetworkStack("ns3::LinuxSocketFdFactory",
 				 "Library", StringValue ("libfreebsd.git.so"));
   processManager.Install (nodes);
diff -r 9f12d65beb55 example/himalis/idecho-c.cc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/himalis/idecho-c.cc	Thu Mar 29 13:58:16 2012 +0900
@@ -0,0 +1,163 @@
+/*****************************
+ * TP/ID/Locator echo client *
+ *                           *
+ * How to make.              *
+ * $ gcc THISFILE -lidlconn  *
+ *****************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "idl.h"                /* XXX */
+
+#define BUFFER_SIZE 1 * 1024    // XXX: avoid stack overflow
+#define DEFAULT_SERVER_PORT 6001
+
+
+int connect_sockfd;
+const int one = 1;
+
+void err_func(const char *msg)
+{
+	perror(msg);
+	exit(EXIT_FAILURE);
+}
+
+void sigint_handler(int sig)
+{
+	close(connect_sockfd);
+	fprintf(stderr, "-- Disonnected --\n");
+	exit(EXIT_SUCCESS);
+}
+
+char buf[BUFFER_SIZE], id_src_str[IDL_IDSTRLEN], id_dst_str[IDL_IDSTRLEN];
+int main(int argc, char **argv)
+{
+	int read_siz = 0, write_siz, wrote_siz = 0;
+	int opt, idlconn_ecode, http_status = -1, connect_sockfd;
+	struct idl_id src_id, dst_id;
+	struct sockid_idl idaddr;
+	unsigned short port = DEFAULT_SERVER_PORT;
+
+	while ((opt = getopt(argc, argv, "hd:s:p:")) != -1) {
+		switch (opt) {
+			case 'p':
+				port = (unsigned short)atoi(optarg);
+				break;
+			case 's':
+				memcpy (id_src_str, optarg, strlen (optarg));
+				break;
+			case 'd':
+				memcpy (id_dst_str, optarg, strlen (optarg));
+				break;
+			default:
+				goto missing_operand;
+		}
+	}
+
+        idl_pton(id_src_str, &src_id);
+        fprintf(stdout, "Client ID  : %s\n", id_src_str);
+        idl_pton(id_dst_str, &dst_id);
+        fprintf(stdout, "Server ID  : %s\n", id_dst_str);
+        fprintf(stdout, "Server Port: %d\n", port);
+
+	if ((connect_sockfd = socket(PF_IDL,
+			SOCK_STREAM, 0)) < 0)
+		err_func("socket");
+
+	if (setsockopt(connect_sockfd,
+			SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int)) < 0)
+		err_func("setsockopt");
+
+	idaddr.sidl_family = IDF_IDL;
+	idaddr.sidl_port = 0;
+	memcpy (&idaddr.sidl_id, &src_id, sizeof (src_id));
+
+	if (bind(connect_sockfd, (struct sockaddr *)&idaddr, sizeof(idaddr)) < 0)
+		err_func("bind");
+
+	idaddr.sidl_family = IDF_IDL;
+	idaddr.sidl_port = htons(port);
+	memcpy (&idaddr.sidl_id, &dst_id, sizeof (dst_id));
+
+	if (connect(connect_sockfd, (struct sockaddr *)&idaddr, sizeof(idaddr)) < 0)
+		err_func("connect");
+
+	fprintf(stderr, "-- Connected --\n");
+
+	if (SIG_ERR == signal(SIGINT, sigint_handler))
+		err_func("signal");
+
+	do
+	{
+		fprintf(stderr, "-> ");
+#if 0
+		if (fgets(buf, BUFFER_SIZE, stdin) == NULL) {
+			if (ferror(stdin))
+				err_func("fgets");
+			if (feof(stdin))
+				break;
+		}
+		fflush(stdin);
+		write_siz = strlen(buf);
+#endif
+
+			
+		do
+		{
+                  char sendbuf[16] = "send echo\n";
+                  wrote_siz = 0;
+                  write_siz = sizeof (sendbuf);
+                  fprintf(stderr, "send-->%s\n", sendbuf);
+			int result = send(connect_sockfd,
+					sendbuf,
+					write_siz, 0);
+			if (result < 0)
+				err_func("send");
+
+			wrote_siz += result;
+		} while (wrote_siz < write_siz);
+
+		do
+		{
+			int result = recv(connect_sockfd,
+					buf + read_siz,
+					wrote_siz - read_siz, 0);
+			if (result < 0)
+				err_func("recv");
+
+			read_siz += result;
+
+		} while (read_siz < write_siz);
+
+		buf[read_siz] = '\0';
+		fprintf(stderr, "<- ");
+		fprintf(stdout, "%s", buf);
+		fprintf(stderr, "\n");
+
+		wrote_siz = 0;
+		read_siz = 0;
+	} while (strncmp(buf, "EXIT\r\n", 6) != 0
+			&& strncmp(buf, "EXIT\n", 5) != 0);
+
+	close(connect_sockfd);
+	fprintf(stderr, "-- Disonnected --\n");
+	exit(EXIT_SUCCESS);
+
+missing_operand:
+	printf(
+		"Usage: %s [-n DST HOST NAME]  [-d DST DOMAIN NAME]\n"
+		" -- Optional --\n"
+		"<-p SERVER PORT> Default server port is 6001.\n"
+		, argv[0], DEFAULT_SERVER_PORT
+	);
+	exit(EXIT_FAILURE);
+}
diff -r 9f12d65beb55 example/himalis/idecho-s.cc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/himalis/idecho-s.cc	Thu Mar 29 13:58:16 2012 +0900
@@ -0,0 +1,146 @@
+/*****************************
+ * TP/ID/Locator echo server *
+ *                           *
+ * How to make.              *
+ * $ gcc THISFILE -lidlconn  *
+ *****************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "idl.h"                /* XXX */
+
+#define BUFFER_SIZE		1 * 1024
+#define DEFAULT_LISTEN_PORT	6001
+#define RCV_TIMEOUT_SEC		300
+
+int listen_sockfd, accept_sockfd = 0;
+const int TRUE = 1;
+
+void err_func(const char *msg)
+{
+	perror(msg);
+	exit(EXIT_FAILURE);
+}
+
+void sigint_handler(int sig)
+{
+	close(listen_sockfd);
+
+	if (accept_sockfd != -1) {
+		close(accept_sockfd);
+		fprintf(stderr, "-- Disconnected --\n");
+	}
+
+	exit(EXIT_SUCCESS);
+}
+
+char buf[BUFFER_SIZE], id_str[IDL_IDSTRLEN];
+int main(int argc, char **argv)
+{
+	int read_siz, wrote_siz = 0;
+	int opt;
+	struct idl_id src_id;
+	struct sockid_idl idaddr;
+	socklen_t sidl_siz;
+	unsigned short port = DEFAULT_LISTEN_PORT;
+
+	while ((opt = getopt(argc, argv, "hp:s:")) != -1) {
+		switch (opt) {
+			case 'p':
+				port = (unsigned short)atoi(optarg);
+				break;
+			case 's':
+				memcpy (id_str, optarg, strlen (optarg));
+				break;
+			default:
+				fprintf(stderr, "Usage: %s\n"
+					" -- Optional--\n"
+					"<-p PORT> Default listen port is %d.\n"
+					"<-i ID_STR> Id string.\n"
+					, argv[0], DEFAULT_LISTEN_PORT);
+				exit(EXIT_FAILURE);
+		}
+	}
+
+        idl_pton(id_str, &src_id);
+        fprintf(stdout, "Server ID  : %s\n", id_str);
+        fprintf(stdout, "Listen Port: %d\n", port);
+
+	if ((listen_sockfd = socket(PF_IDL,
+			SOCK_STREAM, 0)) < 0)
+		err_func("socket");
+
+	if (setsockopt(listen_sockfd,
+			SOL_SOCKET, SO_REUSEADDR, &TRUE, sizeof(int)) < 0)
+		err_func("setsockopt");
+
+	idaddr.sidl_family = IDF_IDL;
+	idaddr.sidl_port = htons(port);
+	memcpy (&idaddr.sidl_id, &src_id, sizeof (src_id));
+	sidl_siz = sizeof(struct sockid_idl);
+
+	if (bind(listen_sockfd, (struct sockaddr *)&idaddr, sidl_siz) < 0)
+		err_func("bind");
+
+	fprintf(stderr, "-- Listening --\n");
+	if (listen(listen_sockfd, SOMAXCONN) < 0)
+		err_func("listen");
+
+	if (SIG_ERR == signal(SIGINT, sigint_handler))
+		err_func("signal");
+
+	while (1)
+	{
+		if ((accept_sockfd = accept(listen_sockfd,
+				(struct sockaddr *)&idaddr, &sidl_siz)) < 0)
+			err_func("accept");
+
+		if (setsockopt(accept_sockfd,
+			SOL_SOCKET, SO_REUSEADDR, &TRUE, sizeof(int)) < 0)
+			err_func("setsockopt");
+
+		fprintf(stderr, "-- Connected --\n");
+		idl_ntop(&idaddr.sidl_id, id_str, IDL_IDSTRLEN);
+		fprintf(stderr, "Client ID  : %s\n", id_str);
+
+		do
+		{
+			read_siz = recv(accept_sockfd, buf, BUFFER_SIZE, 0);
+			if (read_siz < 0)
+				err_func("recv");
+			if (read_siz < 1)
+				break;
+
+			buf[read_siz] = '\0';
+			fprintf(stderr, "<- len=%d", read_siz);
+			fprintf(stdout, "%s\n", buf);
+
+			do
+			{ 
+				int result = send(accept_sockfd,
+						buf + wrote_siz,
+						read_siz - wrote_siz, 0);
+				if (result < 0)
+					err_func("send");
+
+				wrote_siz += result;
+			} while (wrote_siz < read_siz);
+
+			wrote_siz = 0;
+		} while (strncmp(buf, "EXIT\r\n", 6) != 0 &&
+				strncmp(buf, "EXIT\n", 5) != 0);
+
+		fprintf(stderr, "-- Disonnected --\n");
+		close(accept_sockfd);
+		accept_sockfd = -1;
+	}
+}
diff -r 9f12d65beb55 example/himalis/idl.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/himalis/idl.h	Thu Mar 29 13:58:16 2012 +0900
@@ -0,0 +1,331 @@
+/*
+ *	ID/Locator Split Architectur Implementation 
+ *
+ *      This header file provides interface of connect to another host APIs definition.
+ */
+
+
+#ifndef _IDL_H
+#define _IDL_H
+
+#include <stdbool.h>
+#include <string.h>
+#include <errno.h>
+
+#include <linux/types.h>
+
+/*
+ * Socket ID
+ */
+#define sockid sockaddr
+
+
+/*
+ * ID family and protocol family
+ */
+#define IDF_IDL		(37)
+#define PF_IDL		IDF_IDL
+
+
+/*
+ * TP/ID/L protocol number
+ */
+#define IPPROTO_TPIDL	(254)
+
+
+/*
+ * Misc
+ */
+#define IDL_IDLEN		16
+#define IDL_ID16LEN		8
+#define IDL_ID32LEN		4
+#define IDL_IDSTRLEN		40
+#define IDL_ID_DELIM		"-"
+#define IDL_ID_ABBR_DELIM	"--"
+
+
+/*
+ *	The ID/Locator protocol ID structure
+ */
+struct idl_id {
+	union 
+	{
+		__u8	uidl_id8[16];
+		__be16	uidl_id16[8];
+		__be32	uidl_id32[4];
+	} idl_u;
+#define sidl_id8	idl_u.uidl_id8
+#define sidl_id16	idl_u.uidl_id16
+#define sidl_id32	idl_u.uidl_id32
+};
+
+
+/*
+ *	Socket ID for The ID/Locator system
+ */
+struct sockid_idl {
+	unsigned short int	sidl_family;	/* IDF_IDL or PF_IDL */
+	__be16			sidl_port;	/* Transport layer port */
+	__be32			sidl__flowinfo;	/* Flow information (reserved field) */
+	struct idl_id		sidl_id;	/* ID */
+	__u32			sidl__scope_id;	/* scope id (reserved field) */
+};
+
+
+/*
+ *	Network format ID to printable format
+ */
+static inline int idl_ntop(const struct idl_id *id, char *id_str, size_t id_str_len)
+{
+	__be16 *id16p = (__be16 *) id;
+	int i, j, n, abberv_len = 0;
+	char *outp = id_str;
+	bool abbrev = false;
+
+	if (id == NULL || id_str == NULL || id_str_len < 2) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	for (i = j = 0; i < IDL_ID16LEN; i++) {
+		while (i < IDL_ID16LEN && id16p[i] == 0) {
+			i++;
+			j++;
+		}
+
+		if (j > abberv_len)
+			abberv_len = j;
+
+		j = 0;
+	}
+
+	for (i = j = 0; i < IDL_ID16LEN; i++) {
+		if (!abbrev && id16p[i] == 0) {
+			while (i < IDL_ID16LEN && id16p[i] == 0) {
+				i++;
+				j++;
+			}
+			if (j == abberv_len) {
+				n = snprintf(outp, id_str_len, "%s", i > IDL_ID16LEN - 1 ? IDL_ID_ABBR_DELIM : IDL_ID_DELIM);
+				if (n < 0 || n >= id_str_len) {
+					errno = ENOMEM;
+					return -1;
+				}
+				outp += n;
+				id_str_len -= n;
+				abbrev = true;
+			}
+			else {
+				i -= j;
+				j = 0;
+			}
+		}
+
+		if (i < IDL_ID16LEN) {
+			n = snprintf(outp, id_str_len, "%s%x", i ? IDL_ID_DELIM : "", ntohs(id16p[i]));
+
+			if (n < 0 || n >= id_str_len) {
+				errno = ENOMEM;
+				return -1;
+			}
+			outp += n;
+			id_str_len -= n;
+		}
+	}
+
+	return 0;
+}
+
+
+/*
+ *	Printable format ID to network format
+ */
+static inline int __idl_ip6like_pton(const char *id_str, struct idl_id *id)
+{
+	size_t id_str_len = strlen(id_str);
+	int i = 0;
+
+	memset(id, 0, sizeof(*id));
+
+	if (id_str_len == 2) {
+		if (strcmp(id_str, "::") == 0)
+			return 0;
+		else {
+			errno = EINVAL;
+			return -1;
+		}
+	}
+
+	if (id_str_len < 2 || id_str_len > IDL_IDSTRLEN) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	const char *cursor = id_str;
+	const char *abbrev_delim;
+	char *next_delim;
+	int j = IDL_ID16LEN, abbrev_len = 0, delim_cnt = 0;
+	long id_elm;
+
+	if ((abbrev_delim = strstr(id_str, "::")) != NULL) {
+		if (strstr(abbrev_delim + 1, "::")) {
+			errno = EINVAL; // Because, "::" cannot duplicate
+			return -1;
+		}
+
+		abbrev_len = IDL_ID16LEN;
+		while((cursor = strchr(cursor, *":")) != NULL) {
+			abbrev_len--;
+			cursor++;
+		}
+
+		if (abbrev_len < 0 || abbrev_len > IDL_ID16LEN - 2) {
+			errno = EINVAL; // "--" can include 0 to 6 x 16 bit
+			return -1;
+		}
+
+		cursor = id_str; // Initialize
+		if (abbrev_delim == id_str) {
+			i = abbrev_len + 1;
+			cursor += 2;
+		}
+	}
+	else {
+		while((cursor = strchr(cursor, *":")) != NULL) {
+			delim_cnt++;
+			cursor++;
+		}
+
+		if (delim_cnt != IDL_ID16LEN -1) {
+			errno = EINVAL; // "::" can include 0 to 6 x 16 bit
+			return -1;
+		}
+
+		if (*id_str == *":" ||
+				*(id_str + id_str_len - 1) == *":") {
+			errno = EINVAL; // "::" can include 0 to 6 x 16 bit
+			return -1;
+		}
+
+		i = 0;
+		cursor = id_str; // Initialize
+	}
+
+	for (; i < j; i++) {
+		id_elm = strtol(cursor, &next_delim, 16);
+		if (id_elm < 0 || id_elm > 0xffff) {
+			errno = EINVAL; // "::" can include 0 to 6 x 16 bit
+			return -1;
+		}
+
+		id->sidl_id16[i] = htons((__be16)id_elm);
+
+		if (next_delim == abbrev_delim) {
+			i += abbrev_len;
+			next_delim++;
+		}
+
+		cursor = next_delim + 1;
+	}
+
+	return 0;
+}
+
+
+/*
+ *	Printable format ID to network format
+ */
+static inline int idl_pton(const char *id_str, struct idl_id *id)
+{
+	size_t id_str_len = strlen(id_str);
+	int i = 0;
+
+	memset(id, 0, sizeof(*id));
+
+	if (id_str_len == 2) {
+		if (strcmp(id_str, IDL_ID_ABBR_DELIM) == 0) // This meens "--"
+			return 0;
+		else {
+			errno = EINVAL;
+			return -1;
+		}
+	}
+
+	if (id_str_len < 2 || id_str_len > IDL_IDSTRLEN) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	const char *cursor = id_str;
+	const char *abbrev_delim;
+	char *next_delim;
+	int j = IDL_ID16LEN, abbrev_len = 0, delim_cnt = 0;
+	long id_elm;
+
+	if ((abbrev_delim = strstr(id_str, IDL_ID_ABBR_DELIM)) != NULL) {
+		if (strstr(abbrev_delim + 1, IDL_ID_ABBR_DELIM)) {
+			errno = EINVAL; // Because, "--" cannot duplicate
+			return -1;
+		}
+
+		abbrev_len = IDL_ID16LEN;
+		while((cursor = strchr(cursor, *IDL_ID_DELIM)) != NULL) {
+			abbrev_len--;
+			cursor++;
+		}
+
+		if (abbrev_len < 0 || abbrev_len > IDL_ID16LEN - 2) {
+			errno = EINVAL; // "--" can include 0 to 6 x 16 bit
+			return -1;
+		}
+
+		cursor = id_str; // Initialize
+		if (abbrev_delim == id_str) {
+			i = abbrev_len + 1;
+			cursor += 2;
+		}
+	}
+	else {
+		while((cursor = strchr(cursor, *IDL_ID_DELIM)) != NULL) {
+			delim_cnt++;
+			cursor++;
+		}
+
+		if (delim_cnt != IDL_ID16LEN -1) {
+			errno = EINVAL; // "--" can include 0 to 6 x 16 bit
+			return -1;
+		}
+
+		if (*id_str == *IDL_ID_DELIM ||
+				*(id_str + id_str_len - 1) == *IDL_ID_DELIM) {
+			errno = EINVAL; // "--" can include 0 to 6 x 16 bit
+			return -1;
+		}
+
+		i = 0;
+		cursor = id_str; // Initialize
+	}
+
+	for (; i < j; i++) {
+		id_elm = strtol(cursor, &next_delim, 16);
+		if (id_elm < 0 || id_elm > 0xffff) {
+			errno = EINVAL; // "--" can include 0 to 6 x 16 bit
+			return -1;
+		}
+
+		id->sidl_id16[i] = htons((__be16)id_elm);
+
+		if (next_delim == abbrev_delim) {
+			i += abbrev_len;
+			next_delim++;
+		}
+
+		cursor = next_delim + 1;
+	}
+
+	return 0;
+}
+
+#endif /* _IDL_H */
+
+
diff -r 9f12d65beb55 helper/himalis-helper.cc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/helper/himalis-helper.cc	Thu Mar 29 13:58:16 2012 +0900
@@ -0,0 +1,212 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 NICT
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Hajime Tazaki <tazaki@nict.go.jp>
+ */
+
+#include <Python.h>
+#include "himalis-helper.h"
+#include "ns3/object-factory.h"
+#include "ns3/names.h"
+#include "ns3/log.h"
+#include "ns3/event-id.h"
+#include "ns3/simulator.h"
+
+NS_LOG_COMPONENT_DEFINE ("HimalisHelper");
+
+namespace ns3 {
+
+
+
+
+HimalisHelper::HimalisHelper ()
+{
+  InitIdlRoutePy ();
+}
+
+HimalisHelper::~HimalisHelper ()
+{
+  Py_Finalize();
+}
+
+PyObject *m_pycode = NULL;
+
+void
+HimalisHelper::InitIdlRoutePy ()
+{
+  Py_Initialize();
+  const char *argv[] = {"python", NULL};
+  PySys_SetArgv(1, (char **)argv);
+
+  try
+    {
+      m_pycode = PyImport_ImportModule("idlroute");
+      int i=0;
+
+      if(m_pycode == NULL)
+        {
+          PyErr_Print();
+          throw "Unappropriate Python syntax";
+        }
+    }
+  catch(const char* msg)
+    {
+      NS_LOG_WARN ("ERROR :" << msg );
+    }
+  catch(...)
+    {
+      NS_LOG_WARN ("ERROR : Something Error");
+    }
+}
+
+void 
+HimalisHelper::AddIdlRoute (Ptr<Node> node, Time at, const char * host_or_fw, 
+                            const char * src_id, const char * dst_id,
+                            const char * src_addr, const char * dst_addr,
+                            const char *dev_name)
+{
+  std::string format = "(ssssss)";
+  PyObject* cmd_buf = NULL;
+  std::string value;
+
+  try{
+    cmd_buf = PyObject_CallMethod(m_pycode, (char *)"mk_add_route_cmd\0", (char *)format.c_str (),
+                                  host_or_fw, src_id, dst_id, src_addr, dst_addr, dev_name);
+    if(cmd_buf == NULL)
+      {
+
+        PyErr_Print();
+        throw "Unappropriate Python syntax";
+        NS_LOG_WARN ("ERROR :" << cmd_buf );
+      }
+    if (cmd_buf != Py_None && PyString_CheckExact(cmd_buf))
+      value = std::string(PyString_AsString(cmd_buf));
+    else
+      value = "None";
+  }
+  catch(const char* msg)
+    {
+      NS_LOG_WARN ("ERROR :" << msg );
+      return;
+    }
+
+  NS_LOG_DEBUG ("return value from python = " <<  value);
+
+  Ptr<LinuxSocketFdFactory> kern = node->GetObject<LinuxSocketFdFactory>();
+  std::string key (".net.idl.idlrt");
+  Simulator::ScheduleWithContext (node->GetId (), at,
+                                  MakeEvent (&LinuxSocketFdFactory::Set, kern,
+                                             key, value));
+
+  Py_DECREF(cmd_buf);
+}
+
+void 
+HimalisHelper::DelIdlRoute (Ptr<Node> node, Time at,
+                            const char * src_id, const char * dst_id)
+{
+  std::string value;
+  const char *format = "(ss)";
+
+  PyObject* cmd_buf = PyObject_CallMethod(m_pycode, (char *)"mk_del_route_cmd", 
+                                          (char *)format,
+                                          src_id, dst_id);
+  if(cmd_buf == NULL)
+    {
+      PyErr_Print();
+      throw "Unappropriate Python syntax";
+    }
+  if (cmd_buf != Py_None && PyString_CheckExact(cmd_buf))
+    value = std::string(PyString_AsString(cmd_buf));
+  else
+    value = "None";
+
+  NS_LOG_DEBUG ("return value from python = " <<  value);
+  Ptr<LinuxSocketFdFactory> kern = node->GetObject<LinuxSocketFdFactory>();
+  std::string key (".net.idl.idlrt");
+  Simulator::ScheduleWithContext (node->GetId (), at,
+                                  MakeEvent (&LinuxSocketFdFactory::Set, kern,
+                                             key, value));
+  Py_DECREF(cmd_buf);
+}
+
+void
+PrintIdlRoute (Ptr<Node> node)
+{
+  std::string key (".net.idl.idlrt");
+  Ptr<LinuxSocketFdFactory> kern = node->GetObject<LinuxSocketFdFactory>();
+  std::string buffer = kern->Get (key);
+  NS_LOG_INFO ("ShowIdlRoute " << buffer);
+}
+
+void 
+HimalisHelper::ShowIdlRoute (Ptr<Node> node, Time at)
+{
+  Ptr<LinuxSocketFdFactory> kern = node->GetObject<LinuxSocketFdFactory>();
+  Simulator::ScheduleWithContext (node->GetId (), at,
+                                  &LinuxSocketFdFactory::ScheduleTask, kern,
+                                  MakeEvent (PrintIdlRoute, node));
+}
+
+void 
+HimalisHelper::SetAttribute (std::string name, const AttributeValue &value)
+{
+}
+
+
+ApplicationContainer
+HimalisHelper::Install (Ptr<Node> node)
+{
+  return ApplicationContainer (InstallPriv (node));
+}
+
+ApplicationContainer
+HimalisHelper::Install (std::string nodeName)
+{
+  Ptr<Node> node = Names::Find<Node> (nodeName);
+  return ApplicationContainer (InstallPriv (node));
+}
+
+ApplicationContainer
+HimalisHelper::Install (NodeContainer c)
+{
+  ApplicationContainer apps;
+  for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
+    {
+      apps.Add (InstallPriv (*i));
+    }
+
+  return apps;
+}
+
+ApplicationContainer
+HimalisHelper::InstallPriv (Ptr<Node> node) 
+{
+  DceApplicationHelper process;
+  ApplicationContainer apps;
+
+  return apps;
+  process.SetBinary ("zebra");
+  //  process.AddArguments ("-i", "/usr/local/etc/zebra.pid");
+  process.SetStackSize (1<<16);
+  apps.Add (process.Install (node));
+  apps.Get(0)->SetStartTime (Seconds (10.0 + 0.01 * node->GetId ()));
+  node->AddApplication (apps.Get (0));
+  return apps;
+}
+
+} // namespace ns3
diff -r 9f12d65beb55 helper/himalis-helper.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/helper/himalis-helper.h	Thu Mar 29 13:58:16 2012 +0900
@@ -0,0 +1,103 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 NICT
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Hajime Tazaki <tazaki@nict.go.jp>
+ */
+#ifndef HIMALIS_HELPER_H
+#define HIMALIS_HELPER_H
+
+#include "dce-manager-helper.h"
+#include "dce-application-helper.h"
+#include "linux-socket-fd-factory.h"
+
+namespace ns3 {
+
+/**
+ * \brief create a himalis routing daemon as an application and associate it to a node
+ *
+ * This class creates one or multiple instances of ns3::Himalis and associates
+ * it/them to one/multiple node(s).
+ */
+class HimalisHelper : public Object
+{
+public:
+  /**
+   * Create a HimalisHelper which is used to make life easier for people wanting
+   * to use himalis Applications.
+   *
+   */
+  HimalisHelper ();
+  ~HimalisHelper ();
+
+
+  void InitIdlRoutePy ();
+  /**
+   * Install a himalis application on each Node in the provided NodeContainer.
+   *
+   * \param nodes The NodeContainer containing all of the nodes to get a himalis
+   *              application via ProcessManager.
+   *
+   * \returns A list of himalis applications, one for each input node
+   */
+  ApplicationContainer Install (NodeContainer nodes);
+
+  /**
+   * Install a himalis application on the provided Node.  The Node is specified
+   * directly by a Ptr<Node>
+   *
+   * \param node The node to install the HimalisApplication on.
+   *
+   * \returns An ApplicationContainer holding the himalis application created.
+   */
+  ApplicationContainer Install (Ptr<Node> node);
+
+  /**
+   * Install a himalis application on the provided Node.  The Node is specified
+   * by a string that must have previosly been associated with a Node using the
+   * Object Name Service.
+   *
+   * \param nodeName The node to install the ProcessApplication on.
+   *
+   * \returns An ApplicationContainer holding the himalis application created.
+   */
+  ApplicationContainer Install (std::string nodeName);
+
+  /**
+   * \brief Configure ping applications attribute 
+   * \param name   attribute's name
+   * \param value  attribute's value
+   */
+  void SetAttribute (std::string name, const AttributeValue &value);
+
+  void AddIdlRoute (Ptr<Node> node, Time at, const char * host_or_fw, 
+                    const char * src_id, const char * dst_id,
+                    const char * src_addr, const char * dst_addr,
+                    const char *dev_name);
+  void DelIdlRoute (Ptr<Node> node, Time at, 
+                    const char * src_id, const char * dst_id);
+  void ShowIdlRoute (Ptr<Node> node, Time at);
+
+private:
+  /**
+   * \internal
+   */
+  ApplicationContainer InstallPriv (Ptr<Node> node);
+};
+
+} // namespace ns3
+
+#endif /* HIMALIS_HELPER_H */
diff -r 9f12d65beb55 idlroute
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlroute	Thu Mar 29 13:58:16 2012 +0900
@@ -0,0 +1,328 @@
+#! /usr/bin/python
+# -*- coding: utf-8 -*-
+
+import os
+import sys
+import socket
+import fcntl
+import struct
+
+
+IDF_IDLOC	= socket.AF_INET6
+PROC_DELIMITER	= ','
+PROC_IDL_ROUTE	= '/proc/net/idlrt'
+
+ADD	= 'add'
+DEL	= 'del'
+HOST	= 'host'
+FORWARD	= 'frwd'
+IPV4	= 'ipv4'
+IPV6	= 'ipv6'
+
+FLAG_HOST	= 1
+FLAG_FORWARD	= 2
+FLAG_IPV4	= 4
+FLAG_IPV6	= 8
+
+PROC_IF_INET6	= '/proc/net/if_inet6'
+PROC_NET_DEV	= '/proc/net/dev'
+
+ID_DELIMITER	= '-'
+
+def usage():
+	print '\
+Usage: idlroute [show|stat|add|delete] opt...\n\
+\n\
+  Show route\n\
+    show\n\
+\n\
+  Show traffic status\n\
+    stat [SRC_ID] [DST_ID]\n\
+\n\
+  Add host route\n\
+    add host [SRC_ID] [DST_ID] [SRC_LOCATOR] [DST_LOCATOR]\n\
+\n\
+  Add forward route\n\
+    add forward [SRC_ID] [DST_ID] [NEXT_SRC_LOCATOR] [NEXT_DST_LOCATOR]\n\
+\n\
+  Delete route\n\
+    delete [SRC_ID] [DST_ID]\n\
+    * No particular order: [SRC_ID] [DST_ID] <-> [DST_ID] [SRC_ID]\n\
+    * If there is an ID entry for opposite way, then both are deleted.\n'
+
+
+def search_dev_by_ipv4_addr(addr):
+	dev_names = []
+	addr_dict = {}
+
+	f = open(PROC_NET_DEV, 'r')
+	# Format of PROC_NET_DEV
+	# Inter-|   Receive
+	#  face |bytes    packets errs drop fifo frame compressed ...
+	#     lo:     240       4    0    0    0     0	  0 ...
+	#   eth0: 7246766   70183    0    0    0     0	  0 ...
+	# ...
+	lines = f.readlines()
+	f.close
+
+	for line in lines[2:]:
+		dev_names.append(line.split()[0].split(":")[0])
+
+	for dev_name in dev_names:
+		s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+		try:
+			addr_dict[socket.inet_ntoa(fcntl.ioctl(
+				s.fileno(),0x8915,  # SIOCGIFADDR
+				struct.pack('256s', dev_name[:15]))[20:24])
+				] = dev_name
+		except:
+			pass
+
+	try:
+		return addr_dict[addr]
+	except:
+		return None
+
+
+def search_dev_by_ipv6_addr(addr):
+	dev_name = None
+
+	f = open(PROC_IF_INET6, 'r')
+	# Format of PROC_IF_INET6
+	# 20010c901b8d03095a946bfffe1c76d0 03 40 00 00     eth0
+	# ...
+	lines = f.readlines()
+	f.close
+
+	for line in lines:
+		addr_dev = line.split()
+		if (addr == addr_dev[0]):
+			dev_name = addr_dev[5]
+			break
+
+	return dev_name
+
+
+def mk_add_route_cmd(host_or_fw, id_1, id_2, src_addr, dst_addr, exp_dev_name):
+	buff = ADD + PROC_DELIMITER
+	if   (host_or_fw == 'host'):
+		buff += HOST    + PROC_DELIMITER
+		src_id = id_1;
+		dst_id = id_2;
+	elif (host_or_fw == 'forward'):
+		buff += FORWARD + PROC_DELIMITER
+		src_id = id_2;
+		dst_id = id_1;
+	else:
+		print 'Error: Bad params.'
+		return 1
+
+	try:
+		buff += ''.join(map(lambda B: '%02x' % B, struct.unpack('16B',
+			socket.inet_pton(socket.AF_INET6,
+			src_id.replace(ID_DELIMITER, ":"))))) + PROC_DELIMITER
+		buff += ''.join(map(lambda B: '%02x' % B, struct.unpack('16B',
+			socket.inet_pton(socket.AF_INET6,
+			dst_id.replace(ID_DELIMITER, ":"))))) + PROC_DELIMITER
+	except:
+		print 'Error: Illegal ID format.'
+		return 1
+
+	# If source addr is IPv6.
+	try:
+		src_addr = ''.join(map(lambda B: '%02x' % B,
+			struct.unpack('16B',
+			socket.inet_pton(socket.AF_INET6, src_addr))))
+		dev_name = search_dev_by_ipv6_addr(src_addr)
+	except:
+		# Else if source addr is IPv4.
+		try:
+			dev_name = search_dev_by_ipv4_addr(src_addr)
+			src_addr = '00000000000000000000ffff' \
+				+ ''.join(map(lambda B: '%02x' % B, struct.unpack('4B',
+				socket.inet_pton(socket.AF_INET, src_addr))))
+		except:
+			print 'Error: Illegal IP address format.'
+			return 1
+
+	# If destination addr is IPv6 then.
+	try:
+		dst_addr = ''.join(map(lambda B: '%02x' % B,
+			struct.unpack('16B',
+			socket.inet_pton(socket.AF_INET6, dst_addr))))
+	except:
+		# Else if destination addr is IPv4.
+		try:
+			dst_addr = '00000000000000000000ffff' \
+				+ ''.join(map(lambda B: '%02x' % B, struct.unpack('4B',
+				socket.inet_pton(socket.AF_INET, dst_addr))))
+		except:
+			print 'Error: Illegal IP address format.'
+			return 1
+
+	if (dev_name == None):
+		dev_name = exp_dev_name
+		if (exp_dev_name == None):
+			print 'Error: Network interface not found.'
+			return 1
+
+	buff += src_addr + PROC_DELIMITER
+	buff += dst_addr + PROC_DELIMITER
+	buff += dev_name
+	return buff
+
+def add_route(host_or_fw, id_1, id_2, src_addr, dst_addr):
+	buff = mk_add_route_cmd(host_or_fw, id_1, id_2, src_addr, dst_addr)
+	try:
+		f = open(PROC_IDL_ROUTE, 'w')
+		f.write(buff)
+		f.close()
+	except (IOError):
+		print 'Error: I/O error.'
+
+
+def mk_del_route_cmd(src_id, dst_id):
+	buff = DEL + PROC_DELIMITER
+	try:
+		buff += ''.join(map(lambda B: '%02x' % B, struct.unpack('16B',
+			socket.inet_pton(socket.AF_INET6, src_id.replace(ID_DELIMITER, ":"))))) + PROC_DELIMITER
+		buff += ''.join(map(lambda B: '%02x' % B, struct.unpack('16B',
+			socket.inet_pton(socket.AF_INET6, dst_id.replace(ID_DELIMITER, ":")))))
+
+	except:
+		print 'Error: Illegal ID format.'
+		return "ERROR"
+	return buff
+
+def del_route(src_id, dst_id):
+	buff = mk_del_route_cmd(src_id, dst_id)
+	f = open(PROC_IDL_ROUTE, 'w')
+	f.write(buff)
+	f.close()
+
+
+def show_route():
+	f = open(PROC_IDL_ROUTE, 'r')
+	lines = f.readlines()
+	f.close()
+
+	print 'Flags  Source ID                Destination ID           Source locator           Destination locator'
+	for line in lines:
+		host_or_fw = ' '
+		ip_version = ' '
+		forward = False
+
+		rec = line.split(',')
+
+		# Flags
+		flags = int(rec[0], 16)
+		if (flags & FLAG_HOST):
+			host_or_fw = 'H'
+		if (flags & FLAG_FORWARD):
+			host_or_fw = 'F'
+			forward = True
+		if (flags & FLAG_IPV4):
+			ip_version = '4'
+		if (flags & FLAG_IPV6):
+			ip_version = '6'
+
+		# IDs
+		id_1 = socket.inet_ntop(socket.AF_INET6, \
+				socket.inet_pton(socket.AF_INET6, rec[1])).replace(":", ID_DELIMITER)
+		id_2 = socket.inet_ntop(socket.AF_INET6, \
+				socket.inet_pton(socket.AF_INET6, rec[2])).replace(":", ID_DELIMITER)
+
+		# Locators
+		src_addr = socket.inet_ntop(socket.AF_INET6, \
+				socket.inet_pton(socket.AF_INET6, rec[3]))
+		dst_addr = socket.inet_ntop(socket.AF_INET6, 
+				socket.inet_pton(socket.AF_INET6, rec[4]))
+
+		if (ip_version == '4'):
+			src_addr = src_addr.split('::ffff:')[-1]
+			dst_addr = dst_addr.split('::ffff:')[-1]
+
+		# Host
+		if (forward == False):
+			print '%s%s     %-24s %-24s %-24s %-24s' % \
+				(host_or_fw, ip_version,
+				id_1, id_2, src_addr, dst_addr)
+		# Forward
+		else:
+			print '%s%s     %-24s %-24s %-24s %-24s' % \
+				(host_or_fw, ip_version,
+				id_2, id_1, src_addr, dst_addr)
+
+
+def stat_route(src_id, dst_id):
+	src_id = socket.inet_ntop(socket.AF_INET6,
+		socket.inet_pton(socket.AF_INET6, src_id.replace(ID_DELIMITER, ":")))
+	dst_id = socket.inet_ntop(socket.AF_INET6,
+		socket.inet_pton(socket.AF_INET6, dst_id.replace(ID_DELIMITER, ":")))
+
+	f = open(PROC_IDL_ROUTE, 'r')
+	lines = f.readlines()
+	f.close()
+
+	for line in lines:
+		rec = line.split(',')
+		# Host
+		if int(rec[0], 16) & FLAG_HOST:
+			src_id_in_rec = rec[1]
+			dst_id_in_rec = rec[2]
+		# Forward
+		else:
+			src_id_in_rec = rec[2]
+			dst_id_in_rec = rec[1]
+
+		if (src_id == socket.inet_ntop(socket.AF_INET6, \
+			socket.inet_pton(socket.AF_INET6, src_id_in_rec))
+		and dst_id == socket.inet_ntop(socket.AF_INET6, \
+			socket.inet_pton(socket.AF_INET6, dst_id_in_rec))):
+
+			rx = int(rec[6], 16)
+			tx = int(rec[7], 16)
+			print 'total    rx       tx'
+			print '%-8d %-8d %-8d' % (rx + tx, rx, tx)
+			f.close
+			return 0
+
+	f.close
+	print 'Info: No route info.'
+	return 1
+
+
+def main(argc, argv):
+	if   argc == 7 and argv[1] == 'add':  # ADD
+		if (os.getuid() != 0):
+			print 'Error: Permission denied.'
+			return 1
+		else:
+			add_route(argv[2], argv[3], argv[4], argv[5], argv[6])
+	elif argc == 4 and (argv[1] == 'delete'
+			or argv[1] == 'del'): # DEL
+		if (os.getuid() != 0):
+			print 'Error: Permission denied.'
+			return 1
+		else:
+			del_route(argv[2], argv[3])
+			del_route(argv[3], argv[2])
+	elif argc == 2 and argv[1] == 'show': # SHOW
+		show_route()
+	elif argc == 4 and argv[1] == 'stat': # STAT
+		exit(stat_route(argv[2], argv[3]))
+	else:
+		usage()
+		return 1
+
+
+if __name__ == "__main__":
+	argv = sys.argv  # コマンドライン引数を格納したリストの取得
+	argc = len(argv) # 引数の個数
+
+	if os.path.exists(PROC_IDL_ROUTE):
+		main(argc, argv)
+	else:
+		print 'The kernel is running which does not support ID/Locator.'
+
+
diff -r 9f12d65beb55 model/cooja-loader-factory.cc
--- a/model/cooja-loader-factory.cc	Thu Mar 29 13:55:58 2012 +0900
+++ b/model/cooja-loader-factory.cc	Thu Mar 29 13:58:16 2012 +0900
@@ -214,7 +214,7 @@
       if (sharedModule == 0)
         {
           void *handle = dlopen (cached.cachedFilename.c_str (),
-                                 RTLD_LAZY | RTLD_DEEPBIND | RTLD_LOCAL);
+                                 RTLD_LAZY | RTLD_DEEPBIND | RTLD_GLOBAL);
           NS_ASSERT_MSG (handle != 0, "Could not open " << cached.cachedFilename << " " << dlerror ());
           struct link_map *link_map;
           dlinfo (handle, RTLD_DI_LINKMAP, &link_map);
diff -r 9f12d65beb55 model/libc-ns3.h
--- a/model/libc-ns3.h	Thu Mar 29 13:55:58 2012 +0900
+++ b/model/libc-ns3.h	Thu Mar 29 13:58:16 2012 +0900
@@ -103,6 +103,8 @@
 NATIVE_EXPLICIT (strrchr, char * (*) (char *, int))
 NATIVE (strcasecmp)
 NATIVE (strncasecmp)
+NATIVE (strfry)
+NATIVE_EXPLICIT (strstr, char * (*) (char *, __const char *))
 
 DCE_WITH_ALIAS (strdup)
 DCE    (strndup)
diff -r 9f12d65beb55 model/linux-socket-fd-factory.cc
--- a/model/linux-socket-fd-factory.cc	Thu Mar 29 13:55:58 2012 +0900
+++ b/model/linux-socket-fd-factory.cc	Thu Mar 29 13:58:16 2012 +0900
@@ -461,6 +461,7 @@
 void
 LinuxSocketFdFactory::SetTask (std::string path, std::string value)
 {
+  NS_LOG_FUNCTION (path << value);
   std::vector<std::pair<std::string,struct SimSysFile *> > files = GetSysFileList ();
   for (uint32_t i = 0; i < files.size (); i++)
     {
@@ -488,6 +489,27 @@
     }
 }
 
+std::string 
+LinuxSocketFdFactory::Get (std::string path)
+{
+  NS_LOG_FUNCTION (path);
+  std::string ret;
+  std::vector<std::pair<std::string,struct SimSysFile *> > files = GetSysFileList ();
+  for (uint32_t i = 0; i < files.size (); i++)
+    {
+      if (files[i].first == path)
+        {
+          char buffer[512];
+          memset (buffer, 0, sizeof(buffer));
+          m_exported->sys_file_read (files[i].second, buffer, sizeof(buffer), 0);
+          NS_LOG_FUNCTION ("sysctl read: " << buffer);
+          ret = std::string (buffer);
+          break;
+        }
+    }
+  return ret;
+}
+
 void
 LinuxSocketFdFactory::InitializeStack (void)
 {
@@ -525,8 +547,9 @@
                                                       this));
   Set (".net.ipv4.conf.all.forwarding", "1");
   Set (".net.ipv4.conf.all.log_martians", "1");
-  //  Set (".net.ipv6.conf.all.forwarding", "1");
+  Set (".net.ipv6.conf.all.forwarding", "1");
   Set (".net.ipv6.conf.all.proxy_ndp", "1");
+  Set (".net.idl.idlrt", "BEAFBEAF");
 
   while (!m_earlySysfs.empty ())
     {
diff -r 9f12d65beb55 model/linux-socket-fd-factory.h
--- a/model/linux-socket-fd-factory.h	Thu Mar 29 13:55:58 2012 +0900
+++ b/model/linux-socket-fd-factory.h	Thu Mar 29 13:58:16 2012 +0900
@@ -43,7 +43,8 @@
   virtual UnixFd *CreateSocket (int domain, int type, int protocol);
 
   void Set (std::string path, std::string value);
-
+  std::string Get (std::string path);
+  void ScheduleTask (EventImpl *event);
 
 private:
   friend class LinuxSocketFd;
@@ -118,7 +119,6 @@
   void SetTask (std::string path, std::string value);
   static void TaskSwitch (enum Task::SwitchType type, void *context);
   static void ScheduleTaskTrampoline (void *context);
-  void ScheduleTask (EventImpl *event);
   void EventTrampoline (void (*fn)(void *context),
                         void *context, void (*pre_fn)(void),
                         Ptr<EventIdHolder> event);
diff -r 9f12d65beb55 utils/setenv.zsh
--- a/utils/setenv.zsh	Thu Mar 29 13:55:58 2012 +0900
+++ b/utils/setenv.zsh	Thu Mar 29 13:58:16 2012 +0900
@@ -6,8 +6,9 @@
 LD_LIBRARY_PATH="$BASE/ns-3-dce/build/lib:$BASE/build/lib:$BASE/build/bin:$BASE/ns-3-dce/build/bin:.:/usr/local/mpi/gcc/openmpi-1.4.3/lib/"
 PKG_CONFIG_PATH="$BASE/build/lib/pkgconfig"
 PATH="$BASE/build/bin:$BASE/build/sbin:/home/tazaki/hgworks/ns-3-dce-thehajime/build/bin:/home/tazaki/hgworks/ns-3-dce-thehajime/build/sbin:$PATH"
-PYTHONPATH=$BASE/ns-3-dev/build/debug/bindings/python:$BASE/ns-3-dev/src/visualizer:$BASE/pybindgen-0.15.0.795:$BASE/build/lib/python2.6/site-packages/
-export LD_LIBRARY_PATH PKG_CONFIG_PATH PATH PYTHONPATH
+DCE_PATH="$BASE/ns-3-dce/build/bin_dce"
+PYTHONPATH=$BASE/ns-3-dev/build/debug/bindings/python:$BASE/ns-3-dev/src/visualizer:$BASE/pybindgen-0.15.0.795:$BASE/build/lib/python2.6/site-packages/:$BASE/ns-3-dce
+export LD_LIBRARY_PATH PKG_CONFIG_PATH PATH PYTHONPATH DCE_PATH
 cd $BASE/ns-3-dce
 
 
diff -r 9f12d65beb55 wscript
--- a/wscript	Thu Mar 29 13:55:58 2012 +0900
+++ b/wscript	Thu Mar 29 13:58:16 2012 +0900
@@ -35,6 +35,7 @@
     conf.check(header_name='sys/stat.h', define_name='HAVE_SYS_STAT_H', mandatory=False)
     conf.check(header_name='dirent.h', define_name='HAVE_DIRENT_H', mandatory=False)
 
+    conf.env.append_value('CXXFLAGS', '-I/usr/include/python2.6')
     conf.env.append_value('LINKFLAGS', '-pthread')
     conf.env.append_value('LINKFLAGS', '-Wl,--dynamic-linker=' +
                              os.path.abspath ('../build/lib/ldso'))
@@ -186,6 +187,8 @@
                     ['unix-client', []],
                     ['udp-echo-server', []],
                     ['udp-echo-client', []],
+                    ['idl-server', []],
+                    ['idl-client', []],
                     ]
     for name,lib in dce_examples:
         module.add_example(**dce_kw(target = 'bin/' + name, 
@@ -289,6 +292,23 @@
                        target='bin/dce-fga-crawdad',
                        source=['example/dce-fga-crawdad.cc'])
 
+    module.add_example(**dce_kw(target = 'bin_dce/idecho-s', 
+                                source = ['example/himalis/idecho-s.cc'],
+                                cflags = ['-fPIC -I../ns-3-linux/net-next2.6/include']))
+
+    
+    module.add_example(**dce_kw(target = 'bin_dce/idecho-c', 
+                                source = ['example/himalis/idecho-c.cc'],
+                                cflags = ['-fPIC -I../ns-3-linux/net-next2.6/include']))
+
+    module.add_example(needed = ['core',  'dce', 'csma', 'point-to-point','visualizer'],
+                       target='bin/dce-himalis-simple',
+                       source=['example/dce-himalis-simple.cc'])
+
+    module.add_example(needed = ['core',  'dce', 'csma', 'point-to-point','visualizer'],
+                       target='bin/dce-himalis-handoff',
+                       source=['example/dce-himalis-handoff.cc'])
+
 def build(bld):
     build_netlink(bld)
 
@@ -389,6 +409,7 @@
         'helper/dce-application-helper.h',
         'helper/quagga-helper.h',
         'helper/mip6d-helper.h',
+        'helper/himalis-helper.h',
         ]
     module_source = module_source + kernel_source
     module_headers = module_headers + kernel_headers
@@ -398,7 +419,7 @@
                                   headers=module_headers,
                                   use=uselib,
                                   includes=kernel_includes,
-                                  lib=['dl'])
+                                  lib=['dl', 'python2.6'])
 #                                  lib=['dl','efence'])
     build_dce_tests(module, bld.env['KERNEL_STACK'])
     build_dce_examples(module)