Sync with ns-3-dev
authorRaj Bhattacharjea <raj.b@gatech.edu>
Mon, 23 Feb 2009 23:56:27 -0500
changeset 4236 6ef5bba17bf9
parent 4235 c070d2fca46d (current diff)
parent 4208 ef9ae8962bbb (diff)
child 4237 f086b7b943b8
Sync with ns-3-dev
bindings/python/ns3_module_core.py
bindings/python/ns3_module_helper.py
bindings/python/ns3_module_node.py
bindings/python/ns3_module_simulator.py
examples/second.cc
examples/third.cc
--- a/bindings/python/ns3_module_core.py	Mon Feb 23 23:49:17 2009 -0500
+++ b/bindings/python/ns3_module_core.py	Mon Feb 23 23:56:27 2009 -0500
@@ -45,6 +45,8 @@
     module.add_class('IntToType', template_parameters=['6'])
     ## int-to-type.h: ns3::IntToType<6>::v_e [enumeration]
     module.add_enum('v_e', ['value'], outer_class=root_module['ns3::IntToType< 6 >'])
+    ## names.h: ns3::Names [class]
+    module.add_class('Names')
     ## object-base.h: ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True)
     ## object-factory.h: ns3::ObjectFactory [class]
@@ -225,6 +227,7 @@
     register_Ns3IntToType__4_methods(root_module, root_module['ns3::IntToType< 4 >'])
     register_Ns3IntToType__5_methods(root_module, root_module['ns3::IntToType< 5 >'])
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
+    register_Ns3Names_methods(root_module, root_module['ns3::Names'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
     register_Ns3RandomVariable_methods(root_module, root_module['ns3::RandomVariable'])
@@ -446,6 +449,58 @@
     cls.add_copy_constructor()
     return
 
+def register_Ns3Names_methods(root_module, cls):
+    ## names.h: ns3::Names::Names(ns3::Names const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Names const &', 'arg0')])
+    ## names.h: ns3::Names::Names() [constructor]
+    cls.add_constructor([])
+    ## names.h: static bool ns3::Names::Add(std::string name, ns3::Ptr<ns3::Object> obj) [member function]
+    cls.add_method('Add', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::Ptr< ns3::Object >', 'obj')], 
+                   is_static=True)
+    ## names.h: static bool ns3::Names::Add(std::string path, std::string name, ns3::Ptr<ns3::Object> object) [member function]
+    cls.add_method('Add', 
+                   'bool', 
+                   [param('std::string', 'path'), param('std::string', 'name'), param('ns3::Ptr< ns3::Object >', 'object')], 
+                   is_static=True)
+    ## names.h: static bool ns3::Names::Add(ns3::Ptr<ns3::Object> context, std::string name, ns3::Ptr<ns3::Object> object) [member function]
+    cls.add_method('Add', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Object >', 'context'), param('std::string', 'name'), param('ns3::Ptr< ns3::Object >', 'object')], 
+                   is_static=True)
+    ## names.h: static bool ns3::Names::Rename(std::string oldpath, std::string newname) [member function]
+    cls.add_method('Rename', 
+                   'bool', 
+                   [param('std::string', 'oldpath'), param('std::string', 'newname')], 
+                   is_static=True)
+    ## names.h: static bool ns3::Names::Rename(std::string path, std::string oldname, std::string newname) [member function]
+    cls.add_method('Rename', 
+                   'bool', 
+                   [param('std::string', 'path'), param('std::string', 'oldname'), param('std::string', 'newname')], 
+                   is_static=True)
+    ## names.h: static bool ns3::Names::Rename(ns3::Ptr<ns3::Object> context, std::string oldname, std::string newname) [member function]
+    cls.add_method('Rename', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Object >', 'context'), param('std::string', 'oldname'), param('std::string', 'newname')], 
+                   is_static=True)
+    ## names.h: static std::string ns3::Names::FindName(ns3::Ptr<ns3::Object> object) [member function]
+    cls.add_method('FindName', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::Object >', 'object')], 
+                   is_static=True)
+    ## names.h: static std::string ns3::Names::FindPath(ns3::Ptr<ns3::Object> object) [member function]
+    cls.add_method('FindPath', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::Object >', 'object')], 
+                   is_static=True)
+    ## names.h: static void ns3::Names::Delete() [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h: ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -2004,7 +2059,7 @@
     module.add_function('TypeNameGet', 
                         'std::string', 
                         [], 
-                        template_parameters=['long long'])
+                        template_parameters=['long'])
     ## type-name.h: extern std::string ns3::TypeNameGet() [free function]
     module.add_function('TypeNameGet', 
                         'std::string', 
@@ -2024,7 +2079,7 @@
     module.add_function('TypeNameGet', 
                         'std::string', 
                         [], 
-                        template_parameters=['unsigned long long'])
+                        template_parameters=['unsigned long'])
     ## type-name.h: extern std::string ns3::TypeNameGet() [free function]
     module.add_function('TypeNameGet', 
                         'std::string', 
--- a/bindings/python/ns3_module_helper.py	Mon Feb 23 23:49:17 2009 -0500
+++ b/bindings/python/ns3_module_helper.py	Mon Feb 23 23:56:27 2009 -0500
@@ -37,6 +37,8 @@
     module.add_class('PointToPointHelper', allow_subclassing=False)
     ## static-multicast-route-helper.h: ns3::StaticMulticastRouteHelper [class]
     module.add_class('StaticMulticastRouteHelper', allow_subclassing=False)
+    ## tap-bridge-helper.h: ns3::TapBridgeHelper [class]
+    module.add_class('TapBridgeHelper', allow_subclassing=False)
     ## udp-echo-helper.h: ns3::UdpEchoClientHelper [class]
     module.add_class('UdpEchoClientHelper', allow_subclassing=False)
     ## udp-echo-helper.h: ns3::UdpEchoServerHelper [class]
@@ -110,6 +112,7 @@
     register_Ns3PacketSocketHelper_methods(root_module, root_module['ns3::PacketSocketHelper'])
     register_Ns3PointToPointHelper_methods(root_module, root_module['ns3::PointToPointHelper'])
     register_Ns3StaticMulticastRouteHelper_methods(root_module, root_module['ns3::StaticMulticastRouteHelper'])
+    register_Ns3TapBridgeHelper_methods(root_module, root_module['ns3::TapBridgeHelper'])
     register_Ns3UdpEchoClientHelper_methods(root_module, root_module['ns3::UdpEchoClientHelper'])
     register_Ns3UdpEchoServerHelper_methods(root_module, root_module['ns3::UdpEchoServerHelper'])
     register_Ns3V4PingHelper_methods(root_module, root_module['ns3::V4PingHelper'])
@@ -124,6 +127,8 @@
     cls.add_constructor([])
     ## application-container.h: ns3::ApplicationContainer::ApplicationContainer(ns3::Ptr<ns3::Application> application) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::Application >', 'application')])
+    ## application-container.h: ns3::ApplicationContainer::ApplicationContainer(std::string name) [constructor]
+    cls.add_constructor([param('std::string', 'name')])
     ## application-container.h: __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Application>*,std::vector<ns3::Ptr<ns3::Application>, std::allocator<ns3::Ptr<ns3::Application> > > > ns3::ApplicationContainer::Begin() const [member function]
     cls.add_method('Begin', 
                    '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Application > const, std::vector< ns3::Ptr< ns3::Application > > >', 
@@ -152,6 +157,10 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::Ptr< ns3::Application >', 'application')])
+    ## application-container.h: void ns3::ApplicationContainer::Add(std::string name) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'name')])
     ## application-container.h: void ns3::ApplicationContainer::Start(ns3::Time start) [member function]
     cls.add_method('Start', 
                    'void', 
@@ -247,11 +256,31 @@
                    'ns3::NetDeviceContainer', 
                    [param('ns3::Ptr< ns3::Node >', 'node')], 
                    is_const=True)
+    ## csma-helper.h: ns3::NetDeviceContainer ns3::CsmaHelper::Install(std::string name) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('std::string', 'name')], 
+                   is_const=True)
     ## csma-helper.h: ns3::NetDeviceContainer ns3::CsmaHelper::Install(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::CsmaChannel> channel) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::CsmaChannel >', 'channel')], 
                    is_const=True)
+    ## csma-helper.h: ns3::NetDeviceContainer ns3::CsmaHelper::Install(ns3::Ptr<ns3::Node> node, std::string channelName) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('std::string', 'channelName')], 
+                   is_const=True)
+    ## csma-helper.h: ns3::NetDeviceContainer ns3::CsmaHelper::Install(std::string nodeName, ns3::Ptr<ns3::CsmaChannel> channel) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('std::string', 'nodeName'), param('ns3::Ptr< ns3::CsmaChannel >', 'channel')], 
+                   is_const=True)
+    ## csma-helper.h: ns3::NetDeviceContainer ns3::CsmaHelper::Install(std::string nodeName, std::string channelName) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('std::string', 'nodeName'), param('std::string', 'channelName')], 
+                   is_const=True)
     ## csma-helper.h: ns3::NetDeviceContainer ns3::CsmaHelper::Install(ns3::NodeContainer const & c) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -262,6 +291,11 @@
                    'ns3::NetDeviceContainer', 
                    [param('ns3::NodeContainer const &', 'c'), param('ns3::Ptr< ns3::CsmaChannel >', 'channel')], 
                    is_const=True)
+    ## csma-helper.h: ns3::NetDeviceContainer ns3::CsmaHelper::Install(ns3::NodeContainer const & c, std::string channelName) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::NodeContainer const &', 'c'), param('std::string', 'channelName')], 
+                   is_const=True)
     ## csma-helper.h: void ns3::CsmaHelper::InstallStar(ns3::Ptr<ns3::Node> hub, ns3::NodeContainer spokes, ns3::NetDeviceContainer & hubDevices, ns3::NetDeviceContainer & spokeDevices) [member function]
     cls.add_method('InstallStar', 
                    'void', 
@@ -325,6 +359,11 @@
                    'ns3::NetDeviceContainer', 
                    [param('ns3::Ptr< ns3::Node >', 'node')], 
                    is_const=True)
+    ## emu-helper.h: ns3::NetDeviceContainer ns3::EmuHelper::Install(std::string nodeName) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('std::string', 'nodeName')], 
+                   is_const=True)
     ## emu-helper.h: ns3::NetDeviceContainer ns3::EmuHelper::Install(ns3::NodeContainer const & c) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -336,6 +375,11 @@
 def register_Ns3InternetStackHelper_methods(root_module, cls):
     ## internet-stack-helper.h: ns3::InternetStackHelper::InternetStackHelper() [constructor]
     cls.add_constructor([])
+    ## internet-stack-helper.h: void ns3::InternetStackHelper::Install(std::string nodeName) const [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('std::string', 'nodeName')], 
+                   is_const=True)
     ## internet-stack-helper.h: void ns3::InternetStackHelper::Install(ns3::Ptr<ns3::Node> node) const [member function]
     cls.add_method('Install', 
                    'void', 
@@ -437,6 +481,10 @@
     cls.add_method('PushReferenceMobilityModel', 
                    'void', 
                    [param('ns3::Ptr< ns3::Object >', 'reference')])
+    ## mobility-helper.h: void ns3::MobilityHelper::PushReferenceMobilityModel(std::string referenceName) [member function]
+    cls.add_method('PushReferenceMobilityModel', 
+                   'void', 
+                   [param('std::string', 'referenceName')])
     ## mobility-helper.h: void ns3::MobilityHelper::PopReferenceMobilityModel() [member function]
     cls.add_method('PopReferenceMobilityModel', 
                    'void', 
@@ -451,6 +499,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Node >', 'node')], 
                    is_const=True)
+    ## mobility-helper.h: void ns3::MobilityHelper::Install(std::string nodeName) const [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('std::string', 'nodeName')], 
+                   is_const=True)
     ## mobility-helper.h: void ns3::MobilityHelper::Install(ns3::NodeContainer container) const [member function]
     cls.add_method('Install', 
                    'void', 
@@ -483,6 +536,8 @@
     cls.add_constructor([])
     ## net-device-container.h: ns3::NetDeviceContainer::NetDeviceContainer(ns3::Ptr<ns3::NetDevice> dev) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::NetDevice >', 'dev')])
+    ## net-device-container.h: ns3::NetDeviceContainer::NetDeviceContainer(std::string devName) [constructor]
+    cls.add_constructor([param('std::string', 'devName')])
     ## net-device-container.h: ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & a, ns3::NetDeviceContainer const & b) [constructor]
     cls.add_constructor([param('ns3::NetDeviceContainer const &', 'a'), param('ns3::NetDeviceContainer const &', 'b')])
     ## net-device-container.h: __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::NetDevice>*,std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > > ns3::NetDeviceContainer::Begin() const [member function]
@@ -521,6 +576,8 @@
     cls.add_constructor([])
     ## node-container.h: ns3::NodeContainer::NodeContainer(ns3::Ptr<ns3::Node> node) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## node-container.h: ns3::NodeContainer::NodeContainer(std::string nodeName) [constructor]
+    cls.add_constructor([param('std::string', 'nodeName')])
     ## node-container.h: ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b) [constructor]
     cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b')])
     ## node-container.h: ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b, ns3::NodeContainer const & c) [constructor]
@@ -561,6 +618,10 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## node-container.h: void ns3::NodeContainer::Add(std::string nodeName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'nodeName')])
     ## node-container.h: static ns3::NodeContainer ns3::NodeContainer::GetGlobal() [member function]
     cls.add_method('GetGlobal', 
                    'ns3::NodeContainer', 
@@ -595,6 +656,10 @@
     cls.add_method('Install', 
                    'void', 
                    [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## olsr-helper.h: void ns3::OlsrHelper::Install(std::string nodeName) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('std::string', 'nodeName')])
     ## olsr-helper.h: void ns3::OlsrHelper::InstallAll() [member function]
     cls.add_method('InstallAll', 
                    'void', 
@@ -648,6 +713,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Node >', 'node')], 
                    is_const=True)
+    ## packet-socket-helper.h: void ns3::PacketSocketHelper::Install(std::string nodeName) const [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('std::string', 'nodeName')], 
+                   is_const=True)
     ## packet-socket-helper.h: void ns3::PacketSocketHelper::Install(ns3::NodeContainer c) const [member function]
     cls.add_method('Install', 
                    'void', 
@@ -730,6 +800,18 @@
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::Ptr< ns3::Node >', 'a'), param('ns3::Ptr< ns3::Node >', 'b')])
+    ## point-to-point-helper.h: ns3::NetDeviceContainer ns3::PointToPointHelper::Install(ns3::Ptr<ns3::Node> a, std::string bName) [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::Ptr< ns3::Node >', 'a'), param('std::string', 'bName')])
+    ## point-to-point-helper.h: ns3::NetDeviceContainer ns3::PointToPointHelper::Install(std::string aName, ns3::Ptr<ns3::Node> b) [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('std::string', 'aName'), param('ns3::Ptr< ns3::Node >', 'b')])
+    ## point-to-point-helper.h: ns3::NetDeviceContainer ns3::PointToPointHelper::Install(std::string aNode, std::string bNode) [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('std::string', 'aNode'), param('std::string', 'bNode')])
     ## point-to-point-helper.h: void ns3::PointToPointHelper::InstallStar(ns3::Ptr<ns3::Node> hub, ns3::NodeContainer spokes, ns3::NetDeviceContainer & hubDevices, ns3::NetDeviceContainer & spokeDevices) [member function]
     cls.add_method('InstallStar', 
                    'void', 
@@ -740,14 +822,38 @@
 def register_Ns3StaticMulticastRouteHelper_methods(root_module, cls):
     ## static-multicast-route-helper.h: ns3::StaticMulticastRouteHelper::StaticMulticastRouteHelper() [constructor]
     cls.add_constructor([])
-    ## static-multicast-route-helper.h: void ns3::StaticMulticastRouteHelper::AddMulticastRoute(ns3::Ptr<ns3::Node> arg0, ns3::Ipv4Address source, ns3::Ipv4Address group, ns3::Ptr<ns3::NetDevice> input, ns3::NetDeviceContainer output) [member function]
+    ## static-multicast-route-helper.h: void ns3::StaticMulticastRouteHelper::AddMulticastRoute(ns3::Ptr<ns3::Node> n, ns3::Ipv4Address source, ns3::Ipv4Address group, ns3::Ptr<ns3::NetDevice> input, ns3::NetDeviceContainer output) [member function]
+    cls.add_method('AddMulticastRoute', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'n'), param('ns3::Ipv4Address', 'source'), param('ns3::Ipv4Address', 'group'), param('ns3::Ptr< ns3::NetDevice >', 'input'), param('ns3::NetDeviceContainer', 'output')])
+    ## static-multicast-route-helper.h: void ns3::StaticMulticastRouteHelper::AddMulticastRoute(std::string n, ns3::Ipv4Address source, ns3::Ipv4Address group, ns3::Ptr<ns3::NetDevice> input, ns3::NetDeviceContainer output) [member function]
     cls.add_method('AddMulticastRoute', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'arg0'), param('ns3::Ipv4Address', 'source'), param('ns3::Ipv4Address', 'group'), param('ns3::Ptr< ns3::NetDevice >', 'input'), param('ns3::NetDeviceContainer', 'output')])
+                   [param('std::string', 'n'), param('ns3::Ipv4Address', 'source'), param('ns3::Ipv4Address', 'group'), param('ns3::Ptr< ns3::NetDevice >', 'input'), param('ns3::NetDeviceContainer', 'output')])
+    ## static-multicast-route-helper.h: void ns3::StaticMulticastRouteHelper::AddMulticastRoute(ns3::Ptr<ns3::Node> n, ns3::Ipv4Address source, ns3::Ipv4Address group, std::string inputName, ns3::NetDeviceContainer output) [member function]
+    cls.add_method('AddMulticastRoute', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'n'), param('ns3::Ipv4Address', 'source'), param('ns3::Ipv4Address', 'group'), param('std::string', 'inputName'), param('ns3::NetDeviceContainer', 'output')])
+    ## static-multicast-route-helper.h: void ns3::StaticMulticastRouteHelper::AddMulticastRoute(std::string nName, ns3::Ipv4Address source, ns3::Ipv4Address group, std::string inputName, ns3::NetDeviceContainer output) [member function]
+    cls.add_method('AddMulticastRoute', 
+                   'void', 
+                   [param('std::string', 'nName'), param('ns3::Ipv4Address', 'source'), param('ns3::Ipv4Address', 'group'), param('std::string', 'inputName'), param('ns3::NetDeviceContainer', 'output')])
     ## static-multicast-route-helper.h: void ns3::StaticMulticastRouteHelper::SetDefaultMulticastRoute(ns3::Ptr<ns3::Node> n, ns3::Ptr<ns3::NetDevice> nd) [member function]
     cls.add_method('SetDefaultMulticastRoute', 
                    'void', 
                    [param('ns3::Ptr< ns3::Node >', 'n'), param('ns3::Ptr< ns3::NetDevice >', 'nd')])
+    ## static-multicast-route-helper.h: void ns3::StaticMulticastRouteHelper::SetDefaultMulticastRoute(ns3::Ptr<ns3::Node> n, std::string ndName) [member function]
+    cls.add_method('SetDefaultMulticastRoute', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'n'), param('std::string', 'ndName')])
+    ## static-multicast-route-helper.h: void ns3::StaticMulticastRouteHelper::SetDefaultMulticastRoute(std::string nName, ns3::Ptr<ns3::NetDevice> nd) [member function]
+    cls.add_method('SetDefaultMulticastRoute', 
+                   'void', 
+                   [param('std::string', 'nName'), param('ns3::Ptr< ns3::NetDevice >', 'nd')])
+    ## static-multicast-route-helper.h: void ns3::StaticMulticastRouteHelper::SetDefaultMulticastRoute(std::string nName, std::string ndName) [member function]
+    cls.add_method('SetDefaultMulticastRoute', 
+                   'void', 
+                   [param('std::string', 'nName'), param('std::string', 'ndName')])
     ## static-multicast-route-helper.h: void ns3::StaticMulticastRouteHelper::JoinMulticastGroup(ns3::Ptr<ns3::Node> n, ns3::Ipv4Address source, ns3::Ipv4Address group) [member function]
     cls.add_method('JoinMulticastGroup', 
                    'void', 
@@ -767,6 +873,11 @@
                    'ns3::ApplicationContainer', 
                    [param('ns3::Ptr< ns3::Node >', 'node')], 
                    is_const=True)
+    ## udp-echo-helper.h: ns3::ApplicationContainer ns3::UdpEchoClientHelper::Install(std::string nodeName) const [member function]
+    cls.add_method('Install', 
+                   'ns3::ApplicationContainer', 
+                   [param('std::string', 'nodeName')], 
+                   is_const=True)
     ## udp-echo-helper.h: ns3::ApplicationContainer ns3::UdpEchoClientHelper::Install(ns3::NodeContainer c) const [member function]
     cls.add_method('Install', 
                    'ns3::ApplicationContainer', 
@@ -787,6 +898,11 @@
                    'ns3::ApplicationContainer', 
                    [param('ns3::Ptr< ns3::Node >', 'node')], 
                    is_const=True)
+    ## udp-echo-helper.h: ns3::ApplicationContainer ns3::UdpEchoServerHelper::Install(std::string nodeName) const [member function]
+    cls.add_method('Install', 
+                   'ns3::ApplicationContainer', 
+                   [param('std::string', 'nodeName')], 
+                   is_const=True)
     ## udp-echo-helper.h: ns3::ApplicationContainer ns3::UdpEchoServerHelper::Install(ns3::NodeContainer c) const [member function]
     cls.add_method('Install', 
                    'ns3::ApplicationContainer', 
@@ -890,6 +1006,10 @@
     cls.add_method('SetChannel', 
                    'void', 
                    [param('ns3::Ptr< ns3::YansWifiChannel >', 'channel')])
+    ## yans-wifi-helper.h: void ns3::YansWifiPhyHelper::SetChannel(std::string channelName) [member function]
+    cls.add_method('SetChannel', 
+                   'void', 
+                   [param('std::string', 'channelName')])
     ## yans-wifi-helper.h: void ns3::YansWifiPhyHelper::Set(std::string name, ns3::AttributeValue const & v) [member function]
     cls.add_method('Set', 
                    'void', 
--- a/bindings/python/ns3_module_node.py	Mon Feb 23 23:49:17 2009 -0500
+++ b/bindings/python/ns3_module_node.py	Mon Feb 23 23:56:27 2009 -0500
@@ -109,6 +109,8 @@
     module.add_class('Channel', parent=root_module['ns3::Object'])
     ## drop-tail-queue.h: ns3::DropTailQueue [class]
     module.add_class('DropTailQueue', parent=root_module['ns3::Queue'])
+    ## drop-tail-queue.h: ns3::DropTailQueue::Mode [enumeration]
+    module.add_enum('Mode', ['ILLEGAL', 'PACKETS', 'BYTES'], outer_class=root_module['ns3::DropTailQueue'])
     ## ethernet-header.h: ns3::EthernetHeader [class]
     module.add_class('EthernetHeader', parent=root_module['ns3::Header'])
     ## ethernet-trailer.h: ns3::EthernetTrailer [class]
@@ -2296,6 +2298,14 @@
                    is_static=True)
     ## drop-tail-queue.h: ns3::DropTailQueue::DropTailQueue() [constructor]
     cls.add_constructor([])
+    ## drop-tail-queue.h: void ns3::DropTailQueue::SetMode(ns3::DropTailQueue::Mode mode) [member function]
+    cls.add_method('SetMode', 
+                   'void', 
+                   [param('ns3::DropTailQueue::Mode', 'mode')])
+    ## drop-tail-queue.h: ns3::DropTailQueue::Mode ns3::DropTailQueue::GetMode() [member function]
+    cls.add_method('GetMode', 
+                   'ns3::DropTailQueue::Mode', 
+                   [])
     ## drop-tail-queue.h: bool ns3::DropTailQueue::DoEnqueue(ns3::Ptr<ns3::Packet> p) [member function]
     cls.add_method('DoEnqueue', 
                    'bool', 
--- a/bindings/python/ns3_module_simulator.py	Mon Feb 23 23:49:17 2009 -0500
+++ b/bindings/python/ns3_module_simulator.py	Mon Feb 23 23:56:27 2009 -0500
@@ -1330,6 +1330,43 @@
     cls.add_copy_constructor()
     return
 
+def register_Ns3Ns2CalendarScheduler_methods(root_module, cls):
+    ## ns2-calendar-scheduler.h: ns3::Ns2CalendarScheduler::Ns2CalendarScheduler(ns3::Ns2CalendarScheduler const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ns2CalendarScheduler const &', 'arg0')])
+    ## ns2-calendar-scheduler.h: static ns3::TypeId ns3::Ns2CalendarScheduler::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ns2-calendar-scheduler.h: ns3::Ns2CalendarScheduler::Ns2CalendarScheduler() [constructor]
+    cls.add_constructor([])
+    ## ns2-calendar-scheduler.h: void ns3::Ns2CalendarScheduler::Insert(ns3::Scheduler::Event const & ev) [member function]
+    cls.add_method('Insert', 
+                   'void', 
+                   [param('ns3::Scheduler::Event const &', 'ev')], 
+                   is_virtual=True)
+    ## ns2-calendar-scheduler.h: bool ns3::Ns2CalendarScheduler::IsEmpty() const [member function]
+    cls.add_method('IsEmpty', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ns2-calendar-scheduler.h: ns3::Scheduler::Event ns3::Ns2CalendarScheduler::PeekNext() const [member function]
+    cls.add_method('PeekNext', 
+                   'ns3::Scheduler::Event', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ns2-calendar-scheduler.h: ns3::Scheduler::Event ns3::Ns2CalendarScheduler::RemoveNext() [member function]
+    cls.add_method('RemoveNext', 
+                   'ns3::Scheduler::Event', 
+                   [], 
+                   is_virtual=True)
+    ## ns2-calendar-scheduler.h: void ns3::Ns2CalendarScheduler::Remove(ns3::Scheduler::Event const & ev) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Scheduler::Event const &', 'ev')], 
+                   is_virtual=True)
+    return
+
 def register_Ns3RealtimeSimulatorImpl_methods(root_module, cls):
     ## realtime-simulator-impl.h: static ns3::TypeId ns3::RealtimeSimulatorImpl::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bindings/python/ns3_module_tap_bridge.py	Mon Feb 23 23:56:27 2009 -0500
@@ -0,0 +1,235 @@
+from pybindgen import Module, FileCodeSink, param, retval, cppclass
+
+def register_types(module):
+    root_module = module.get_root()
+    
+    ## tap-bridge.h: ns3::TapBridge [class]
+    module.add_class('TapBridge', parent=root_module['ns3::NetDevice'])
+    
+    ## Register a nested module for the namespace Config
+    
+    nested_module = module.add_cpp_namespace('Config')
+    register_types_ns3_Config(nested_module)
+    
+    
+    ## Register a nested module for the namespace TimeStepPrecision
+    
+    nested_module = module.add_cpp_namespace('TimeStepPrecision')
+    register_types_ns3_TimeStepPrecision(nested_module)
+    
+    
+    ## Register a nested module for the namespace internal
+    
+    nested_module = module.add_cpp_namespace('internal')
+    register_types_ns3_internal(nested_module)
+    
+    
+    ## Register a nested module for the namespace olsr
+    
+    nested_module = module.add_cpp_namespace('olsr')
+    register_types_ns3_olsr(nested_module)
+    
+
+def register_types_ns3_Config(module):
+    root_module = module.get_root()
+    
+
+def register_types_ns3_TimeStepPrecision(module):
+    root_module = module.get_root()
+    
+
+def register_types_ns3_internal(module):
+    root_module = module.get_root()
+    
+
+def register_types_ns3_olsr(module):
+    root_module = module.get_root()
+    
+
+def register_methods(root_module):
+    register_Ns3TapBridge_methods(root_module, root_module['ns3::TapBridge'])
+    return
+
+def register_Ns3TapBridge_methods(root_module, cls):
+    ## tap-bridge.h: ns3::TapBridge::TapBridge(ns3::TapBridge const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TapBridge const &', 'arg0')])
+    ## tap-bridge.h: static ns3::TypeId ns3::TapBridge::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## tap-bridge.h: ns3::TapBridge::TapBridge() [constructor]
+    cls.add_constructor([])
+    ## tap-bridge.h: ns3::Ptr<ns3::NetDevice> ns3::TapBridge::GetBridgedNetDevice() [member function]
+    cls.add_method('GetBridgedNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [])
+    ## tap-bridge.h: void ns3::TapBridge::SetBridgedNetDevice(ns3::Ptr<ns3::NetDevice> bridgedDevice) [member function]
+    cls.add_method('SetBridgedNetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'bridgedDevice')])
+    ## tap-bridge.h: void ns3::TapBridge::Start(ns3::Time tStart) [member function]
+    cls.add_method('Start', 
+                   'void', 
+                   [param('ns3::Time', 'tStart')])
+    ## tap-bridge.h: void ns3::TapBridge::Stop(ns3::Time tStop) [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [param('ns3::Time', 'tStop')])
+    ## tap-bridge.h: void ns3::TapBridge::SetName(std::string const name) [member function]
+    cls.add_method('SetName', 
+                   'void', 
+                   [param('std::string const', 'name')], 
+                   is_virtual=True)
+    ## tap-bridge.h: std::string ns3::TapBridge::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: void ns3::TapBridge::SetIfIndex(uint32_t const index) [member function]
+    cls.add_method('SetIfIndex', 
+                   'void', 
+                   [param('uint32_t const', 'index')], 
+                   is_virtual=True)
+    ## tap-bridge.h: uint32_t ns3::TapBridge::GetIfIndex() const [member function]
+    cls.add_method('GetIfIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: ns3::Ptr<ns3::Channel> ns3::TapBridge::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: ns3::Address ns3::TapBridge::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: bool ns3::TapBridge::SetMtu(uint16_t const mtu) [member function]
+    cls.add_method('SetMtu', 
+                   'bool', 
+                   [param('uint16_t const', 'mtu')], 
+                   is_virtual=True)
+    ## tap-bridge.h: uint16_t ns3::TapBridge::GetMtu() const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: bool ns3::TapBridge::IsLinkUp() const [member function]
+    cls.add_method('IsLinkUp', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: void ns3::TapBridge::SetLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetLinkChangeCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## tap-bridge.h: bool ns3::TapBridge::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: ns3::Address ns3::TapBridge::GetBroadcast() const [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: bool ns3::TapBridge::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: ns3::Address ns3::TapBridge::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv4Address', 'multicastGroup')], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: bool ns3::TapBridge::IsPointToPoint() const [member function]
+    cls.add_method('IsPointToPoint', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: bool ns3::TapBridge::IsBridge() const [member function]
+    cls.add_method('IsBridge', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: bool ns3::TapBridge::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_virtual=True)
+    ## tap-bridge.h: bool ns3::TapBridge::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('SendFrom', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_virtual=True)
+    ## tap-bridge.h: ns3::Ptr<ns3::Node> ns3::TapBridge::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: void ns3::TapBridge::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_virtual=True)
+    ## tap-bridge.h: bool ns3::TapBridge::NeedsArp() const [member function]
+    cls.add_method('NeedsArp', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: void ns3::TapBridge::SetReceiveCallback(ns3::Callback<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    cls.add_method('SetReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_virtual=True)
+    ## tap-bridge.h: void ns3::TapBridge::SetPromiscReceiveCallback(ns3::Callback<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::Address const&, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    cls.add_method('SetPromiscReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_virtual=True)
+    ## tap-bridge.h: bool ns3::TapBridge::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: ns3::Address ns3::TapBridge::GetMulticast(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_const=True, is_virtual=True)
+    ## tap-bridge.h: void ns3::TapBridge::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## tap-bridge.h: void ns3::TapBridge::ReceiveFromBridgedDevice(ns3::Ptr<ns3::NetDevice> device, ns3::Ptr<const ns3::Packet> packet, uint16_t protocol, ns3::Address const & src, ns3::Address const & dst, ns3::NetDevice::PacketType packetType) [member function]
+    cls.add_method('ReceiveFromBridgedDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'protocol'), param('ns3::Address const &', 'src'), param('ns3::Address const &', 'dst'), param('ns3::NetDevice::PacketType', 'packetType')], 
+                   visibility='protected')
+    return
+
+def register_functions(root_module):
+    module = root_module
+    register_functions_ns3_Config(module.get_submodule('Config'), root_module)
+    register_functions_ns3_TimeStepPrecision(module.get_submodule('TimeStepPrecision'), root_module)
+    register_functions_ns3_internal(module.get_submodule('internal'), root_module)
+    register_functions_ns3_olsr(module.get_submodule('olsr'), root_module)
+    return
+
+def register_functions_ns3_Config(module, root_module):
+    return
+
+def register_functions_ns3_TimeStepPrecision(module, root_module):
+    return
+
+def register_functions_ns3_internal(module, root_module):
+    return
+
+def register_functions_ns3_olsr(module, root_module):
+    return
+
--- a/bindings/python/ns3modulegen.py	Mon Feb 23 23:49:17 2009 -0500
+++ b/bindings/python/ns3modulegen.py	Mon Feb 23 23:56:27 2009 -0500
@@ -86,6 +86,7 @@
     ns3modulegen_core_customizations.Simulator_customizations(root_module)
     ns3modulegen_core_customizations.CommandLine_customizations(root_module)
     ns3modulegen_core_customizations.TypeId_customizations(root_module)
+    ns3modulegen_core_customizations.add_std_ofstream(root_module)
 
 
     for local_module in LOCAL_MODULES:
@@ -141,6 +142,10 @@
             root_module.classes.remove(root_module['ns3::%s' % clsname])
         root_module.enums.remove(root_module['ns3::RealtimeSimulatorImpl::SynchronizationMode'])
 
+    if 'TapBridge' not in enabled_features:
+        for clsname in ['TapBridge', 'TapBridgeHelper']:
+            root_module.classes.remove(root_module['ns3::%s' % clsname])
+
     root_module.generate(out, '_ns3')
 
     out.close()
--- a/bindings/python/ns3modulegen_core_customizations.py	Mon Feb 23 23:49:17 2009 -0500
+++ b/bindings/python/ns3modulegen_core_customizations.py	Mon Feb 23 23:56:27 2009 -0500
@@ -530,3 +530,20 @@
                                      flags=["METH_VARARGS", "METH_KEYWORDS", "METH_STATIC"])
 
 
+def add_std_ofstream(module):
+    module.add_include('<fstream>')
+    ostream = module.add_class('ostream', foreign_cpp_namespace='::std')
+    ostream.set_cannot_be_constructed("abstract base class")
+    ofstream = module.add_class('ofstream', foreign_cpp_namespace='::std', parent=ostream)
+    ofstream.add_enum('openmode', [
+            ('app', 'std::ios_base::app'),
+            ('ate', 'std::ios_base::ate'),
+            ('binary', 'std::ios_base::binary'),
+            ('in', 'std::ios_base::in'),
+            ('out', 'std::ios_base::out'),
+            ('trunc', 'std::ios_base::trunc'),
+            ])
+    ofstream.add_constructor([Parameter.new("const char *", 'filename'),
+                              Parameter.new("::std::ofstream::openmode", 'mode', default_value="std::ios_base::out")])
+    ofstream.add_method('close', None, [])
+
--- a/bindings/python/ns3modulegen_generated.py	Mon Feb 23 23:49:17 2009 -0500
+++ b/bindings/python/ns3modulegen_generated.py	Mon Feb 23 23:56:27 2009 -0500
@@ -20,17 +20,18 @@
 import ns3_module_contrib
 import ns3_module_point_to_point
 import ns3_module_stats
+import ns3_module_tap_bridge
 import ns3_module_internet_stack
 import ns3_module_wifi
 import ns3_module_csma
 import ns3_module_emu
 import ns3_module_bridge
+import ns3_module_onoff
 import ns3_module_packet_sink
 import ns3_module_v4ping
 import ns3_module_global_routing
-import ns3_module_onoff
+import ns3_module_udp_echo
 import ns3_module_olsr
-import ns3_module_udp_echo
 import ns3_module_helper
 
 def module_init():
@@ -128,6 +129,17 @@
         ns3_module_stats__local.register_types(module)
     
     root_module.end_section('ns3_module_stats')
+    root_module.begin_section('ns3_module_tap_bridge')
+    ns3_module_tap_bridge.register_types(module)
+    
+    try:
+        import ns3_module_tap_bridge__local
+    except ImportError:
+        pass
+    else:
+        ns3_module_tap_bridge__local.register_types(module)
+    
+    root_module.end_section('ns3_module_tap_bridge')
     root_module.begin_section('ns3_module_internet_stack')
     ns3_module_internet_stack.register_types(module)
     
@@ -183,6 +195,17 @@
         ns3_module_bridge__local.register_types(module)
     
     root_module.end_section('ns3_module_bridge')
+    root_module.begin_section('ns3_module_onoff')
+    ns3_module_onoff.register_types(module)
+    
+    try:
+        import ns3_module_onoff__local
+    except ImportError:
+        pass
+    else:
+        ns3_module_onoff__local.register_types(module)
+    
+    root_module.end_section('ns3_module_onoff')
     root_module.begin_section('ns3_module_packet_sink')
     ns3_module_packet_sink.register_types(module)
     
@@ -216,17 +239,17 @@
         ns3_module_global_routing__local.register_types(module)
     
     root_module.end_section('ns3_module_global_routing')
-    root_module.begin_section('ns3_module_onoff')
-    ns3_module_onoff.register_types(module)
+    root_module.begin_section('ns3_module_udp_echo')
+    ns3_module_udp_echo.register_types(module)
     
     try:
-        import ns3_module_onoff__local
+        import ns3_module_udp_echo__local
     except ImportError:
         pass
     else:
-        ns3_module_onoff__local.register_types(module)
+        ns3_module_udp_echo__local.register_types(module)
     
-    root_module.end_section('ns3_module_onoff')
+    root_module.end_section('ns3_module_udp_echo')
     root_module.begin_section('ns3_module_olsr')
     ns3_module_olsr.register_types(module)
     
@@ -238,17 +261,6 @@
         ns3_module_olsr__local.register_types(module)
     
     root_module.end_section('ns3_module_olsr')
-    root_module.begin_section('ns3_module_udp_echo')
-    ns3_module_udp_echo.register_types(module)
-    
-    try:
-        import ns3_module_udp_echo__local
-    except ImportError:
-        pass
-    else:
-        ns3_module_udp_echo__local.register_types(module)
-    
-    root_module.end_section('ns3_module_udp_echo')
     root_module.begin_section('ns3_module_helper')
     ns3_module_helper.register_types(module)
     
@@ -393,6 +405,17 @@
         ns3_module_stats__local.register_methods(root_module)
     
     root_module.end_section('ns3_module_stats')
+    root_module.begin_section('ns3_module_tap_bridge')
+    ns3_module_tap_bridge.register_methods(root_module)
+    
+    try:
+        import ns3_module_tap_bridge__local
+    except ImportError:
+        pass
+    else:
+        ns3_module_tap_bridge__local.register_methods(root_module)
+    
+    root_module.end_section('ns3_module_tap_bridge')
     root_module.begin_section('ns3_module_internet_stack')
     ns3_module_internet_stack.register_methods(root_module)
     
@@ -448,6 +471,17 @@
         ns3_module_bridge__local.register_methods(root_module)
     
     root_module.end_section('ns3_module_bridge')
+    root_module.begin_section('ns3_module_onoff')
+    ns3_module_onoff.register_methods(root_module)
+    
+    try:
+        import ns3_module_onoff__local
+    except ImportError:
+        pass
+    else:
+        ns3_module_onoff__local.register_methods(root_module)
+    
+    root_module.end_section('ns3_module_onoff')
     root_module.begin_section('ns3_module_packet_sink')
     ns3_module_packet_sink.register_methods(root_module)
     
@@ -481,17 +515,17 @@
         ns3_module_global_routing__local.register_methods(root_module)
     
     root_module.end_section('ns3_module_global_routing')
-    root_module.begin_section('ns3_module_onoff')
-    ns3_module_onoff.register_methods(root_module)
+    root_module.begin_section('ns3_module_udp_echo')
+    ns3_module_udp_echo.register_methods(root_module)
     
     try:
-        import ns3_module_onoff__local
+        import ns3_module_udp_echo__local
     except ImportError:
         pass
     else:
-        ns3_module_onoff__local.register_methods(root_module)
+        ns3_module_udp_echo__local.register_methods(root_module)
     
-    root_module.end_section('ns3_module_onoff')
+    root_module.end_section('ns3_module_udp_echo')
     root_module.begin_section('ns3_module_olsr')
     ns3_module_olsr.register_methods(root_module)
     
@@ -503,17 +537,6 @@
         ns3_module_olsr__local.register_methods(root_module)
     
     root_module.end_section('ns3_module_olsr')
-    root_module.begin_section('ns3_module_udp_echo')
-    ns3_module_udp_echo.register_methods(root_module)
-    
-    try:
-        import ns3_module_udp_echo__local
-    except ImportError:
-        pass
-    else:
-        ns3_module_udp_echo__local.register_methods(root_module)
-    
-    root_module.end_section('ns3_module_udp_echo')
     root_module.begin_section('ns3_module_helper')
     ns3_module_helper.register_methods(root_module)
     
@@ -617,6 +640,17 @@
         ns3_module_stats__local.register_functions(root_module)
     
     root_module.end_section('ns3_module_stats')
+    root_module.begin_section('ns3_module_tap_bridge')
+    ns3_module_tap_bridge.register_functions(root_module)
+    
+    try:
+        import ns3_module_tap_bridge__local
+    except ImportError:
+        pass
+    else:
+        ns3_module_tap_bridge__local.register_functions(root_module)
+    
+    root_module.end_section('ns3_module_tap_bridge')
     root_module.begin_section('ns3_module_internet_stack')
     ns3_module_internet_stack.register_functions(root_module)
     
@@ -672,6 +706,17 @@
         ns3_module_bridge__local.register_functions(root_module)
     
     root_module.end_section('ns3_module_bridge')
+    root_module.begin_section('ns3_module_onoff')
+    ns3_module_onoff.register_functions(root_module)
+    
+    try:
+        import ns3_module_onoff__local
+    except ImportError:
+        pass
+    else:
+        ns3_module_onoff__local.register_functions(root_module)
+    
+    root_module.end_section('ns3_module_onoff')
     root_module.begin_section('ns3_module_packet_sink')
     ns3_module_packet_sink.register_functions(root_module)
     
@@ -705,17 +750,17 @@
         ns3_module_global_routing__local.register_functions(root_module)
     
     root_module.end_section('ns3_module_global_routing')
-    root_module.begin_section('ns3_module_onoff')
-    ns3_module_onoff.register_functions(root_module)
+    root_module.begin_section('ns3_module_udp_echo')
+    ns3_module_udp_echo.register_functions(root_module)
     
     try:
-        import ns3_module_onoff__local
+        import ns3_module_udp_echo__local
     except ImportError:
         pass
     else:
-        ns3_module_onoff__local.register_functions(root_module)
+        ns3_module_udp_echo__local.register_functions(root_module)
     
-    root_module.end_section('ns3_module_onoff')
+    root_module.end_section('ns3_module_udp_echo')
     root_module.begin_section('ns3_module_olsr')
     ns3_module_olsr.register_functions(root_module)
     
@@ -727,17 +772,6 @@
         ns3_module_olsr__local.register_functions(root_module)
     
     root_module.end_section('ns3_module_olsr')
-    root_module.begin_section('ns3_module_udp_echo')
-    ns3_module_udp_echo.register_functions(root_module)
-    
-    try:
-        import ns3_module_udp_echo__local
-    except ImportError:
-        pass
-    else:
-        ns3_module_udp_echo__local.register_functions(root_module)
-    
-    root_module.end_section('ns3_module_udp_echo')
     root_module.begin_section('ns3_module_helper')
     ns3_module_helper.register_functions(root_module)
     
--- a/bindings/python/wscript	Mon Feb 23 23:49:17 2009 -0500
+++ b/bindings/python/wscript	Mon Feb 23 23:56:27 2009 -0500
@@ -15,7 +15,7 @@
 import Utils
 
 ## https://launchpad.net/pybindgen/
-REQUIRED_PYBINDGEN_VERSION = (0, 9, 0, 605)
+REQUIRED_PYBINDGEN_VERSION = (0, 10, 0, 626)
 REQUIRED_PYGCCXML_VERSION = (0, 9, 5)
 
 
--- a/doc/manual/manual.texi	Mon Feb 23 23:49:17 2009 -0500
+++ b/doc/manual/manual.texi	Mon Feb 23 23:56:27 2009 -0500
@@ -10,7 +10,7 @@
 four forms:
 @itemize @bullet
 @item @uref{http://www.nsnam.org/doxygen/index.html,,ns-3 Doxygen/Manual}:  Documentation of the public APIs of the simulator
-@item @uref{http://www.nsnam.org/tutorial/index.html,,ns-3 Tutorial}
+@item @uref{http://www.nsnam.org/docs/tutorial/tutorial.html,,ns-3 Tutorial}
 @item Reference Manual (this document)
 @item @uref{http://www.nsnam.org/wiki/index.php,, ns-3 wiki}
 @end itemize
@@ -27,7 +27,7 @@
 Primary documentation for the @command{ns-3} project is available in
 four forms:
 @itemize @bullet
-@item @uref{http://www.nsnam.org/tutorial/index.html,,ns-3 Tutorial}
+@item @uref{http://www.nsnam.org/docs/tutorial/tutorial.html,,ns-3 Tutorial}
 @item @uref{http://www.nsnam.org/doxygen/index.html,,ns-3 Doxygen}:  Documentation of the public APIs of the simulator
 @item Reference Manual (this document)
 @item @uref{http://www.nsnam.org/wiki/index.php,, ns-3 wiki}
--- a/doc/tutorial/tweaking.texi	Mon Feb 23 23:49:17 2009 -0500
+++ b/doc/tutorial/tweaking.texi	Mon Feb 23 23:56:27 2009 -0500
@@ -272,21 +272,19 @@
   ~/repos/ns-3-dev > ./waf --run scratch/first
   Entering directory `/home/craigdo/repos/ns-3-dev/build'
   Compilation finished successfully
-  0ns UdpEchoServerApplication:UdpEchoServer()
-  0ns UdpEchoClientApplication:UdpEchoClient()
-  1000000000ns UdpEchoServerApplication:StartApplication()
-  2000000000ns UdpEchoClientApplication:StartApplication()
-  2000000000ns UdpEchoClientApplication:ScheduleTransmit()
-  2000000000ns UdpEchoClientApplication:Send()
-  2000000000ns UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
-  2003686400ns UdpEchoServerApplication:HandleRead(): Received 1024 bytes 
-    from 10.1.1.1
-  2003686400ns UdpEchoServerApplication:HandleRead(): Echoing packet
-  2007372800ns UdpEchoClientApplication:HandleRead(0x62c8c0, 0x62d020)
-  2007372800ns UdpEchoClientApplication:HandleRead(): Received 1024 bytes 
-    from 10.1.1.2
-  10000000000ns UdpEchoServerApplication:StopApplication()
-  10000000000ns UdpEchoClientApplication:StopApplication()
+  0s UdpEchoServerApplication:UdpEchoServer()
+  0s UdpEchoClientApplication:UdpEchoClient()
+  1s UdpEchoServerApplication:StartApplication()
+  2s UdpEchoClientApplication:StartApplication()
+  2s UdpEchoClientApplication:ScheduleTransmit()
+  2s UdpEchoClientApplication:Send()
+  2s UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
+  2.00369s UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
+  2.00369s UdpEchoServerApplication:HandleRead(): Echoing packet
+  2.00737s UdpEchoClientApplication:HandleRead(0x62c8c0, 0x62d020)
+  2.00737s UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
+  10s UdpEchoServerApplication:StopApplication()
+  10s UdpEchoClientApplication:StopApplication()
   UdpEchoClientApplication:DoDispose()
   UdpEchoServerApplication:DoDispose()
   UdpEchoClientApplication:~UdpEchoClient()
@@ -295,7 +293,7 @@
 @end verbatim
 
 You can see that the constructor for the UdpEchoServer was called at a 
-simulation time of 0 nanoseconds.  This is actually happening before the 
+simulation time of 0 seconds.  This is actually happening before the 
 simulation starts.  The same for the UdpEchoClient constructor.
 
 Recall that the @code{first.cc} script started the echo server application at
--- a/examples/second.cc	Mon Feb 23 23:49:17 2009 -0500
+++ b/examples/second.cc	Mon Feb 23 23:56:27 2009 -0500
@@ -36,14 +36,21 @@
 int 
 main (int argc, char *argv[])
 {
-  LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
-  LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
+  bool verbose = true;
 
   uint32_t nCsma = 3;
   CommandLine cmd;
   cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
+  cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);
+
   cmd.Parse (argc,argv);
 
+  if (verbose)
+    {
+      LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
+      LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
+    }
+
   NodeContainer p2pNodes;
   p2pNodes.Create (2);
 
--- a/examples/third.cc	Mon Feb 23 23:49:17 2009 -0500
+++ b/examples/third.cc	Mon Feb 23 23:56:27 2009 -0500
@@ -40,16 +40,24 @@
 int 
 main (int argc, char *argv[])
 {
-  LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
-  LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
+
+  bool verbose = true;
 
   uint32_t nCsma = 3;
   uint32_t nWifi = 3;
   CommandLine cmd;
   cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
   cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi);
+  cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);
+
   cmd.Parse (argc,argv);
 
+  if (verbose)
+    {
+      LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
+      LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
+    }
+
   NodeContainer p2pNodes;
   p2pNodes.Create (2);
 
--- a/examples/wifi-ap.py	Mon Feb 23 23:49:17 2009 -0500
+++ b/examples/wifi-ap.py	Mon Feb 23 23:56:27 2009 -0500
@@ -154,9 +154,13 @@
   #   Config::Connect ("/NodeList/*/DeviceList/*/Phy/Tx", MakeCallback (&PhyTxTrace));
   #   Config::Connect ("/NodeList/*/DeviceList/*/Phy/State", MakeCallback (&PhyStateTrace));
 
+    ascii = ns3.ofstream("wifi-ap.tr")
+    ns3.YansWifiPhyHelper.EnableAsciiAll(ascii)
+
     ns3.Simulator.Run()
 
     ns3.Simulator.Destroy()
+    ascii.close()
 
     return 0
 
--- a/regression.py	Mon Feb 23 23:49:17 2009 -0500
+++ b/regression.py	Mon Feb 23 23:56:27 2009 -0500
@@ -37,6 +37,30 @@
     tests.sort()
     return tests
 
+def diff(dir1, dir2, verbose):
+    import filecmp
+    comp = filecmp.dircmp(dir1, dir2)
+    differ = (comp.left_only or comp.right_only or comp.diff_files)
+    if differ:
+        if verbose:
+            comp.report()
+            import difflib
+            for diff_fname in comp.diff_files:
+                if not (diff_fname.endswith(".tr") or diff_fname.endswith(".mob")):
+                    print "The different file %r does not sound like a text file, not compared." % (diff_fname,)
+                diff_file1 = open(os.path.join(dir1, diff_fname), "rt").readlines()
+                diff_file2 = open(os.path.join(dir2, diff_fname), "rt").readlines()
+                diff = difflib.unified_diff(diff_file1, diff_file2)
+                count = 0
+                print "Differences in file %r" % (diff_fname,)
+                for line in diff:
+                    print line
+                    count += 1
+                    if count > 100:
+                        break
+        return 1
+    else:
+        return 0
 
 class regression_test_task(Task.TaskBase):
     after = 'cc cxx cc_link cxx_link'
@@ -136,17 +160,7 @@
                 print >> sys.stderr, ex
                 return 1
 
-        if Options.options.verbose:
-            #diffCmd = "diff traces " + refTestDirName + " | head"
-            diffCmd = subprocess.Popen([self.env['DIFF'], trace_output_path, reference_traces_path],
-                                       stdout=subprocess.PIPE)
-            headCmd = subprocess.Popen("head", stdin=diffCmd.stdout)
-            rc2 = headCmd.wait()
-            diffCmd.stdout.close()
-            rc1 = diffCmd.wait()
-            rc = rc1 or rc2
-        else:
-            rc = subprocess.Popen([self.env['DIFF'], trace_output_path, reference_traces_path], stdout=dev_null()).wait()
+        rc = diff(trace_output_path, reference_traces_path, Options.options.verbose)
         if rc:
             print "----------"
             print "Traces differ in test: ", self.test_name
@@ -154,6 +168,8 @@
             print "Traces in directory: " + trace_output_path
             print "Run the following command for details:"
             print "\tdiff -u %s %s" % (reference_traces_path, trace_output_path)
+            if not Options.options.verbose:
+                print "Or re-run regression testing with option -v"
             print "----------"
         return rc
 
--- a/regression/tests/test-second.py	Mon Feb 23 23:49:17 2009 -0500
+++ b/regression/tests/test-second.py	Mon Feb 23 23:56:27 2009 -0500
@@ -1,4 +1,6 @@
 #! /usr/bin/env python
 
-"""Generic trace-comparison-type regression test."""
+"""Compare that Second generates correct traces."""
 
+arguments = ["--verbose=0"]
+
--- a/regression/tests/test-third.py	Mon Feb 23 23:49:17 2009 -0500
+++ b/regression/tests/test-third.py	Mon Feb 23 23:56:27 2009 -0500
@@ -1,4 +1,6 @@
 #! /usr/bin/env python
 
-"""Generic trace-comparison-type regression test."""
+"""Compare that Third generates correct traces."""
 
+arguments = ["--verbose=0"]
+
--- a/src/core/callback.cc	Mon Feb 23 23:49:17 2009 -0500
+++ b/src/core/callback.cc	Mon Feb 23 23:56:27 2009 -0500
@@ -35,4 +35,55 @@
 
 ATTRIBUTE_CHECKER_IMPLEMENT (Callback);
 
+#if (__GNUC__ >= 3)
+
+#include <stdlib.h>
+#include <cxxabi.h>
+#include "log.h"
+
+std::string
+CallbackBase::Demangle(const std::string& mangled)
+{
+    int status;
+    char* demangled = abi::__cxa_demangle(mangled.c_str(),
+                                          NULL, NULL, &status);
+
+    std::string ret;
+    if (status == 0) {
+        NS_ASSERT(demangled);
+        ret = demangled;
+    }
+    else if (status == -1) {
+        NS_LOG_UNCOND("Callback demangling failed: Memory allocation failure occured.");
+        ret = mangled;
+    }
+    else if (status == -2) {
+        NS_LOG_UNCOND("Callback demangling failed: Mangled name is not a valid under the C++ ABI mangling rules.");
+        ret = mangled;
+    }
+    else if (status == -3) {
+        NS_LOG_UNCOND("Callback demangling failed: One of the arguments is invalid.");
+        ret = mangled;
+    }
+    else {
+        NS_LOG_UNCOND("Callback demangling failed: status " << status);
+        ret = mangled;
+    }
+
+    if (demangled) {
+        free(demangled);
+    }
+    return ret;
+}
+
+#else
+
+std::string
+CallbackBase::Demangle(const std::string& mangled)
+{
+    return mangled;
+}
+
+#endif
+
 } // namespace ns3
--- a/src/core/callback.h	Mon Feb 23 23:49:17 2009 -0500
+++ b/src/core/callback.h	Mon Feb 23 23:56:27 2009 -0500
@@ -340,6 +340,8 @@
 protected:
   CallbackBase (Ptr<CallbackImplBase> impl) : m_impl (impl) {}
   Ptr<CallbackImplBase> m_impl;
+
+  static std::string Demangle(const std::string& mangled);
 };
 
 /**
@@ -476,9 +478,9 @@
   void DoAssign (Ptr<const CallbackImplBase> other) {
     if (!DoCheckType (other))
       {
-        NS_FATAL_ERROR ("Incompatible types. (feed to \"c++filt -t\")"
-                        " got=" << typeid (*other).name () << 
-                        ", expected=" << typeid (CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *).name ());
+        NS_FATAL_ERROR ("Incompatible types. (feed to \"c++filt -t\" if needed)" << std::endl <<
+                        "got=" << Demangle ( typeid (*other).name () ) << std::endl <<
+                        "expected=" << Demangle ( typeid (CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *).name () ));
       }
     m_impl = const_cast<CallbackImplBase *> (PeekPointer (other));
   }
--- a/src/devices/bridge/bridge-net-device.cc	Mon Feb 23 23:49:17 2009 -0500
+++ b/src/devices/bridge/bridge-net-device.cc	Mon Feb 23 23:56:27 2009 -0500
@@ -370,22 +370,30 @@
 BridgeNetDevice::Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber)
 {
   NS_LOG_FUNCTION_NOARGS ();
-  for (std::vector< Ptr<NetDevice> >::iterator iter = m_ports.begin ();
-         iter != m_ports.end (); iter++)
-    {
-      Ptr<NetDevice> port = *iter;
-      port->SendFrom (packet, m_address, dest, protocolNumber);
-    }
-
-  return true;
+  return SendFrom (packet, m_address, dest, protocolNumber);
 }
 
 bool 
 BridgeNetDevice::SendFrom (Ptr<Packet> packet, const Address& src, const Address& dest, uint16_t protocolNumber)
 {
   NS_LOG_FUNCTION_NOARGS ();
+  Mac48Address dst = Mac48Address::ConvertFrom (dest); 
+
+  // try to use the learned state if data is unicast
+  if (!dst.IsGroup ())
+    {
+      Ptr<NetDevice> outPort = GetLearnedState (dst);
+      if (outPort != NULL) 
+        {
+          outPort->SendFrom (packet, src, dest, protocolNumber);
+          return true;
+        }
+    }
+
+  // data was not unicast or no state has been learned for that mac
+  // address => flood through all ports.
   for (std::vector< Ptr<NetDevice> >::iterator iter = m_ports.begin ();
-         iter != m_ports.end (); iter++)
+       iter != m_ports.end (); iter++)
     {
       Ptr<NetDevice> port = *iter;
       port->SendFrom (packet, src, dest, protocolNumber);
--- a/src/devices/csma/csma-net-device.cc	Mon Feb 23 23:49:17 2009 -0500
+++ b/src/devices/csma/csma-net-device.cc	Mon Feb 23 23:56:27 2009 -0500
@@ -411,10 +411,15 @@
 {
   NS_LOG_FUNCTION_NOARGS ();
 
+  //
+  // This function is called to start the process of transmitting a packet.  We 
+  // expect that a Ptr to the packet to be transmitted has been placed in 
+  // m_currentPkt.
+
   NS_LOG_LOGIC ("m_currentPkt=" << m_currentPkt);
   NS_LOG_LOGIC ("UID is " << m_currentPkt->GetUid ());
+
   //
-  // This function is called to start the process of transmitting a packet.
   // We need to tell the channel that we've started wiggling the wire and
   // schedule an event that will be executed when it's time to tell the 
   // channel that we're done wiggling the wire.
@@ -487,20 +492,43 @@
 {
   NS_LOG_FUNCTION_NOARGS ();
 
+  //
+  // When we started transmitting the current packet, it was placed in 
+  // m_currentPkt.  So we had better find one there.
+  //
+  NS_ASSERT_MSG (m_currentPkt != 0, "CsmaNetDevice::TransmitAbort(): m_currentPkt zero");
+  NS_LOG_LOGIC ("m_currentPkt=" << m_currentPkt);
   NS_LOG_LOGIC ("Pkt UID is " << m_currentPkt->GetUid () << ")");
 
   //
-  // Since we were transmitting a packet, that packet had better be on the transmit queue.
+  // Hit the drop trace source.
+  //
+  // XXX Should there be a separate transmit drop trace?
   //
-  m_currentPkt = m_queue->Dequeue ();
-  NS_ASSERT_MSG (m_currentPkt != 0, "No Packet on queue during CsmaNetDevice::TransmitAbort()");
+  m_dropTrace (m_currentPkt);
 
-  //
-  // The last one failed.  Let's try to transmit the next one (if there)
+  // 
+  // We're done with that one, so reset the backoff algorithm and ready the
+  // transmit state machine.
   //
   m_backoff.ResetBackoffTime ();
   m_txMachineState = READY;
-  TransmitStart ();
+
+  //
+  // If there is another packet on the input queue, we need to start trying to 
+  // get that out.  If the queue is empty we just wait until someone puts one
+  // in.
+  //
+  if (m_queue->IsEmpty ())
+    {
+      return;
+    }
+  else
+    {
+      m_currentPkt = m_queue->Dequeue ();
+      NS_ASSERT_MSG (m_currentPkt != 0, "CsmaNetDevice::TransmitAbort(): IsEmpty false but no Packet on queue?");
+      TransmitStart ();
+    }
 }
 
   void
@@ -514,11 +542,18 @@
   // schedule an event that will be executed when it's time to re-enable
   // the transmitter after the interframe gap.
   //
-  NS_ASSERT_MSG (m_txMachineState == BUSY, "Must be BUSY if transmitting");
+  NS_ASSERT_MSG (m_txMachineState == BUSY, "CsmaNetDevice::transmitCompleteEvent(): Must be BUSY if transmitting");
   NS_ASSERT (m_channel->GetState () == TRANSMITTING);
   m_txMachineState = GAP;
 
+  //
+  // When we started transmitting the current packet, it was placed in 
+  // m_currentPkt.  So we had better find one there.
+  //
+  NS_ASSERT_MSG (m_currentPkt != 0, "CsmaNetDevice::TransmitCompleteEvent(): m_currentPkt zero");
+  NS_LOG_LOGIC ("m_currentPkt=" << m_currentPkt);
   NS_LOG_LOGIC ("Pkt UID is " << m_currentPkt->GetUid () << ")");
+
   m_channel->TransmitEnd (); 
 
   NS_LOG_LOGIC ("Schedule TransmitReadyEvent in " << m_tInterframeGap.GetSeconds () << "sec");
@@ -536,10 +571,18 @@
   // gap has passed.  If there are pending transmissions, we use this opportunity
   // to start the next transmit.
   //
-  NS_ASSERT_MSG (m_txMachineState == GAP, "Must be in interframe gap");
+  NS_ASSERT_MSG (m_txMachineState == GAP, "CsmaNetDevice::TransmitReadyEvent(): Must be in interframe gap");
   m_txMachineState = READY;
 
   //
+  // When we started transmitting the current packet, it was placed in 
+  // m_currentPkt.  So we had better find one there.
+  //
+  NS_ASSERT_MSG (m_currentPkt != 0, "CsmaNetDevice::TransmitCompleteEvent(): m_currentPkt zero");
+  NS_LOG_LOGIC ("m_currentPkt=" << m_currentPkt);
+  NS_LOG_LOGIC ("Pkt UID is " << m_currentPkt->GetUid () << ")");
+
+  //
   // Get the next packet from the queue for transmitting
   //
   if (m_queue->IsEmpty ())
--- a/src/helper/mobility-helper.cc	Mon Feb 23 23:49:17 2009 -0500
+++ b/src/helper/mobility-helper.cc	Mon Feb 23 23:56:27 2009 -0500
@@ -46,12 +46,7 @@
 {
   m_position = allocator;
 }
-void 
-MobilityHelper::SetPositionAllocator (std::string allocatorName)
-{
-  Ptr<PositionAllocator> allocator = Names::Find<PositionAllocator> (allocatorName);
-  m_position = allocator;
-}
+
 void 
 MobilityHelper::SetPositionAllocator (std::string type,
                                       std::string n1, const AttributeValue &v1,
--- a/src/helper/mobility-helper.h	Mon Feb 23 23:49:17 2009 -0500
+++ b/src/helper/mobility-helper.h	Mon Feb 23 23:56:27 2009 -0500
@@ -50,13 +50,6 @@
    * \param allocator allocate initial node positions
    */
   void SetPositionAllocator (Ptr<PositionAllocator> allocator);
-  /**
-   * Set the position allocator which will be used to allocate the initial 
-   * position of every node initialized during MobilityModel::Install.
-   *
-   * \param allocator allocate initial node positions
-   */
-  void SetPositionAllocator (std::string allocatorName);
 
   /**
    * \param type the type of mobility model to use.
--- a/src/node/drop-tail-queue.cc	Mon Feb 23 23:49:17 2009 -0500
+++ b/src/node/drop-tail-queue.cc	Mon Feb 23 23:56:27 2009 -0500
@@ -17,6 +17,7 @@
  */
 
 #include "ns3/log.h"
+#include "ns3/enum.h"
 #include "ns3/uinteger.h"
 #include "drop-tail-queue.h"
 
@@ -31,10 +32,22 @@
   static TypeId tid = TypeId ("ns3::DropTailQueue")
     .SetParent<Queue> ()
     .AddConstructor<DropTailQueue> ()
-    .AddAttribute ("MaxPackets", "The maximum number of packets accepted by this DropTailQueue.",
+    .AddAttribute ("Mode", 
+                   "Whether to use Bytes (see MaxBytes) or Packets (see MaxPackets) as the maximum queue size metric.",
+                   EnumValue (PACKETS),
+                   MakeEnumAccessor (&DropTailQueue::SetMode),
+                   MakeEnumChecker (BYTES, "Bytes",
+                                    PACKETS, "Packets"))
+    .AddAttribute ("MaxPackets", 
+                   "The maximum number of packets accepted by this DropTailQueue.",
                    UintegerValue (100),
                    MakeUintegerAccessor (&DropTailQueue::m_maxPackets),
                    MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("MaxBytes", 
+                   "The maximum number of bytes accepted by this DropTailQueue.",
+                   UintegerValue (100 * 65535),
+                   MakeUintegerAccessor (&DropTailQueue::m_maxBytes),
+                   MakeUintegerChecker<uint32_t> ())
     ;
   
   return tid;
@@ -52,19 +65,45 @@
   NS_LOG_FUNCTION_NOARGS ();
 }
 
+  void 
+DropTailQueue::SetMode (enum Mode mode)
+{
+  NS_LOG_FUNCTION (mode);
+  m_mode = mode;
+}
+
+  DropTailQueue::Mode
+DropTailQueue::GetMode (void)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  return m_mode;
+}
+  
 bool 
 DropTailQueue::DoEnqueue (Ptr<Packet> p)
 {
   NS_LOG_FUNCTION (this << p);
 
-  if (m_packets.size () >= m_maxPackets)
+  if (m_mode == PACKETS && (m_packets.size () >= m_maxPackets))
     {
-      NS_LOG_LOGIC ("Queue full -- droppping pkt");
+      NS_LOG_LOGIC ("Queue full (at max packets) -- droppping pkt");
       Drop (p);
       return false;
     }
 
+  if (m_mode == BYTES && (m_bytesInQueue + p->GetSize () >= m_maxBytes))
+    {
+      NS_LOG_LOGIC ("Queue full (packet would exceed max bytes) -- droppping pkt");
+      Drop (p);
+      return false;
+    }
+
+  m_bytesInQueue += p->GetSize ();
   m_packets.push(p);
+
+  NS_LOG_LOGIC ("Number packets " << m_packets.size ());
+  NS_LOG_LOGIC ("Number bytes " << m_bytesInQueue);
+
   return true;
 }
 
@@ -81,9 +120,13 @@
 
   Ptr<Packet> p = m_packets.front ();
   m_packets.pop ();
+  m_bytesInQueue -= p->GetSize ();
 
   NS_LOG_LOGIC ("Popped " << p);
 
+  NS_LOG_LOGIC ("Number packets " << m_packets.size ());
+  NS_LOG_LOGIC ("Number bytes " << m_bytesInQueue);
+
   return p;
 }
 
@@ -100,6 +143,9 @@
 
   Ptr<Packet> p = m_packets.front ();
 
+  NS_LOG_LOGIC ("Number packets " << m_packets.size ());
+  NS_LOG_LOGIC ("Number bytes " << m_bytesInQueue);
+
   return p;
 }
 
--- a/src/node/drop-tail-queue.h	Mon Feb 23 23:49:17 2009 -0500
+++ b/src/node/drop-tail-queue.h	Mon Feb 23 23:56:27 2009 -0500
@@ -44,14 +44,41 @@
 
   virtual ~DropTailQueue();
 
+  /**
+   * Enumeration of the modes supported in the class.
+   *
+   */
+  enum Mode {
+    ILLEGAL,     /**< Mode not set */
+    PACKETS,     /**< Use number of packets for maximum queue size */
+    BYTES,       /**< Use number of bytes for maximum queue size */  
+  };
+
+  /**
+   * Set the operating mode of this device.
+   *
+   * \param mode The operating mode of this device.
+   *
+   */
+  void SetMode (DropTailQueue::Mode mode);
+
+  /**
+   * Get the encapsulation mode of this device.
+   *
+   * \returns The encapsulation mode of this device.
+   */
+  DropTailQueue::Mode  GetMode (void);
+
 private:
   virtual bool DoEnqueue (Ptr<Packet> p);
   virtual Ptr<Packet> DoDequeue (void);
   virtual Ptr<const Packet> DoPeek (void) const;
 
-private:
   std::queue<Ptr<Packet> > m_packets;
   uint32_t m_maxPackets;
+  uint32_t m_maxBytes;
+  uint32_t m_bytesInQueue;
+  Mode     m_mode;
 };
 
 }; // namespace ns3
--- a/wscript	Mon Feb 23 23:49:17 2009 -0500
+++ b/wscript	Mon Feb 23 23:56:27 2009 -0500
@@ -256,9 +256,6 @@
         conf.env['NS3_ENABLED_MODULES'] = ['ns3-'+mod for mod in
                                            Options.options.enable_modules.split(',')]
 
-    # we cannot run regression tests without diff
-    conf.find_program('diff', var='DIFF')
-
     # for suid bits
     conf.find_program('sudo', var='SUDO')
 
@@ -464,9 +461,6 @@
             Options.options.compile_targets = os.path.basename(program_name)
 
     if Options.options.regression or Options.options.regression_generate:
-        if not env['DIFF']:
-            raise Utils.WafError("Cannot run regression tests: the 'diff' program is not installed.")
-
         regression_traces = env['REGRESSION_TRACES']
         if not regression_traces:
             raise Utils.WafError("Cannot run regression tests: reference traces directory not given"