[Ns-developers] Bug 215 (Name List)

craigdo@ee.washington.edu craigdo at ee.washington.edu
Tue Jan 20 01:17:02 PST 2009


Hi All,

I've been playing with an object naming service for ns-3.4 to finally put
bug 215 out of its misery.  I have something that seems to be coming
together nicely, so I want to share the direction I'm headed in and see if
there are any comments.

The quickest intro seems to be by example.  I have an example file in the
repo http://code.nsnam.org/craigdo/ns-3-215 that shows how to use the naming
facility.  It's based on the trusty udp-echo example and is called names.cc
if you want to take a look.

Here's how you name objects in the root of the name space

  NodeContainer n;
  n.Create (4);

  //
  // We're going to use the zeroth node in the container as the client, and
  // the first node as the server.  Add some "human readable" names for
these
  // nodes.  The first parameter specifies the root of the "/Names" name
space
  // as the destination, so these will go into the name system as
"/Names/client"
  // and "/Names/server".
  //
  Names::Name ("/Names", "client", n.Get (0));
  Names::Name ("/Names", "server", n.Get (1));

Tom wanted to have multiple "eth0" names in the system, so here's how you
would name the devices associated with the client and server above as both
being "eth0."

  NetDeviceContainer d = csma.Install (n);

  //
  // Add some human readable names for the devices we'll be interested in.
  // We add the names to the name space "under" the nodes we created above.
  // This has the effect of making "/Names/client/eth0" and
"/Names/server/eth0"
  // Note that the first parameter must reference a previously named object,
  // and we have, in fact, already named objects "/Names/client" and
  // "/Names/server"
  //
  Names::Name ("/Names/client", "eth0", d.Get (0));
  Names::Name ("/Names/server", "eth0", d.Get (1));

You can look up named objects, of course.  Here I install the server app on
the node defined by its name and ditto for the client.

  ApplicationContainer apps = server.Install (Names::Find<Node>
("/Names/server"));
  apps = client.Install (Names::Find<Node> ("/Names/client"));

Of course, this is all integrated into the Config system, so you can mix and
match named objects and attributes in your paths:

  Config::Connect ("/Names/client/eth0/Rx", MakeCallback (&RxEvent));

This is all modeled as a kind of a run-time analog of the Attribute system.
For example, in the call

  Names::Name ("/Names/server", "eth0", d.Get (1));

you can think of it as dynamically adding an Object pointer attribute named
"eth0" to the Object named "/Names/server" and setting the attribute to the
specified value (a Ptr<Object> returned from the Get (1).

See the files src/core/object-names.{h.cc} in the repo mentioned above for
details.  The changes required to hook the config path are trivial given the
model.

Comments?

Regards,

-- Craig




More information about the Ns-developers mailing list