branch merge
authorCraig Dowell <craigdo@ee.washington.edu>
Mon, 01 Feb 2010 13:10:31 -0800
changeset 6038 f1926441567b
parent 6037 fedfb1cedb9b (current diff)
parent 5943 afda15a818fa (diff)
child 6039 c4006544d0b8
branch merge
CHANGES.html
bindings/python/apidefs/gcc-ILP32/ns3_module_common.py
bindings/python/apidefs/gcc-ILP32/ns3_module_internet_stack.py
bindings/python/apidefs/gcc-ILP32/ns3_module_node.py
bindings/python/apidefs/gcc-ILP32/ns3_module_stats.py
bindings/python/apidefs/gcc-LP64/ns3_module_common.py
bindings/python/apidefs/gcc-LP64/ns3_module_internet_stack.py
bindings/python/apidefs/gcc-LP64/ns3_module_node.py
bindings/python/apidefs/gcc-LP64/ns3_module_stats.py
src/test/perf/perf-pcap.cc
src/wscript
--- a/RELEASE_NOTES	Mon Feb 01 08:29:57 2010 -0800
+++ b/RELEASE_NOTES	Mon Feb 01 13:10:31 2010 -0800
@@ -9,6 +9,56 @@
 Consult the file CHANGES.html for more detailed information about changed
 API and behavior across ns-3 releases.
 
+Release 3.8
+===========
+
+Availability
+------------
+This release is not yet available.
+
+Supported platforms
+-------------------
+ns-3.8 has been tested on the following platforms:
+  - linux x86 gcc 4.4.0, 4.3.2, 4.2, 4.1.1, 4.1 and 3.4.6 (debug and optimized)
+  - linux x86_64 gcc 4.4.0, 4.3.2, 4.2.4, 4.2.3, 4.2.1, 4.1.3, 3.4.6 (debug and optimized)
+  - MacOS X ppc gcc 4.0.x and 4.2.x (debug and optimized)
+  - cygwin gcc 3.4.4 (debug only), gcc 4.3.2 (debug and optimized)
+
+Unofficially supported platform
+-------------------
+- mingw gcc 3.4.5 (debug only)
+
+Not all ns-3 options are available on all platforms; consult the
+wiki for more information:
+http://www.nsnam.org/wiki/index.php/Installation
+
+New user-visible features
+-------------------------
+  a) 
+
+  b) 
+    
+  c) 
+
+API changes from ns-3.7
+-----------------------
+API changes for this release are documented in the file CHANGES.html. 
+
+Bugs fixed
+----------
+The following lists many of the bugs that were fixed since ns-3.7, in
+many cases referencing the Bugzilla bug number
+   - bug 747 - Listening TCP socket closes on RST
+   - bug 788 - OLSR_NEIGH_HOLD_TIME should be 3 times OLSR_REFRESH_INTERVAL 
+
+Known issues
+------------
+ns-3 builds have been known to fail on the following platforms:
+  - gcc 3.3 and earlier
+  - optimized builds on gcc 3.4.4 and 3.4.5
+  - optimized builds on linux x86 gcc 4.0.x
+
+
 Release 3.7
 ===========
 
--- a/bindings/python/apidefs/gcc-ILP32/ns3_module_common.py	Mon Feb 01 08:29:57 2010 -0800
+++ b/bindings/python/apidefs/gcc-ILP32/ns3_module_common.py	Mon Feb 01 13:10:31 2010 -0800
@@ -222,6 +222,11 @@
                    'void', 
                    [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
                    is_const=True)
+    ## buffer.h: uint32_t ns3::Buffer::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
     ## buffer.h: ns3::Buffer ns3::Buffer::CreateFragment(uint32_t start, uint32_t length) const [member function]
     cls.add_method('CreateFragment', 
                    'ns3::Buffer', 
--- a/bindings/python/apidefs/gcc-ILP32/ns3_module_internet_stack.py	Mon Feb 01 08:29:57 2010 -0800
+++ b/bindings/python/apidefs/gcc-ILP32/ns3_module_internet_stack.py	Mon Feb 01 13:10:31 2010 -0800
@@ -59,6 +59,8 @@
     module.add_class('Icmpv6TooBig', parent=root_module['ns3::Icmpv6Header'])
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionHeader [class]
     module.add_class('Ipv6ExtensionHeader', parent=root_module['ns3::Header'])
+    ## ipv6-extension-header.h: ns3::Ipv6ExtensionHopByHopHeader [class]
+    module.add_class('Ipv6ExtensionHopByHopHeader', parent=[root_module['ns3::Ipv6ExtensionHeader'], root_module['ns3::OptionField']])
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionRoutingHeader [class]
     module.add_class('Ipv6ExtensionRoutingHeader', parent=root_module['ns3::Ipv6ExtensionHeader'])
     ## ipv6-option-header.h: ns3::Ipv6OptionHeader [class]
@@ -101,6 +103,8 @@
     module.add_enum('RxStatus', ['RX_OK', 'RX_CSUM_FAILED', 'RX_ENDPOINT_CLOSED', 'RX_ENDPOINT_UNREACH'], outer_class=root_module['ns3::Ipv4L4Protocol'])
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionAHHeader [class]
     module.add_class('Ipv6ExtensionAHHeader', parent=root_module['ns3::Ipv6ExtensionHeader'])
+    ## ipv6-extension-header.h: ns3::Ipv6ExtensionDestinationHeader [class]
+    module.add_class('Ipv6ExtensionDestinationHeader', parent=[root_module['ns3::Ipv6ExtensionHeader'], root_module['ns3::OptionField']])
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionESPHeader [class]
     module.add_class('Ipv6ExtensionESPHeader', parent=root_module['ns3::Ipv6ExtensionHeader'])
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionFragmentHeader [class]
@@ -231,6 +235,7 @@
     register_Ns3Icmpv6TimeExceeded_methods(root_module, root_module['ns3::Icmpv6TimeExceeded'])
     register_Ns3Icmpv6TooBig_methods(root_module, root_module['ns3::Icmpv6TooBig'])
     register_Ns3Ipv6ExtensionHeader_methods(root_module, root_module['ns3::Ipv6ExtensionHeader'])
+    register_Ns3Ipv6ExtensionHopByHopHeader_methods(root_module, root_module['ns3::Ipv6ExtensionHopByHopHeader'])
     register_Ns3Ipv6ExtensionRoutingHeader_methods(root_module, root_module['ns3::Ipv6ExtensionRoutingHeader'])
     register_Ns3Ipv6OptionHeader_methods(root_module, root_module['ns3::Ipv6OptionHeader'])
     register_Ns3Ipv6OptionHeaderAlignment_methods(root_module, root_module['ns3::Ipv6OptionHeader::Alignment'])
@@ -249,6 +254,7 @@
     register_Ns3Ipv4L3Protocol_methods(root_module, root_module['ns3::Ipv4L3Protocol'])
     register_Ns3Ipv4L4Protocol_methods(root_module, root_module['ns3::Ipv4L4Protocol'])
     register_Ns3Ipv6ExtensionAHHeader_methods(root_module, root_module['ns3::Ipv6ExtensionAHHeader'])
+    register_Ns3Ipv6ExtensionDestinationHeader_methods(root_module, root_module['ns3::Ipv6ExtensionDestinationHeader'])
     register_Ns3Ipv6ExtensionESPHeader_methods(root_module, root_module['ns3::Ipv6ExtensionESPHeader'])
     register_Ns3Ipv6ExtensionFragmentHeader_methods(root_module, root_module['ns3::Ipv6ExtensionFragmentHeader'])
     register_Ns3Ipv6ExtensionLooseRoutingHeader_methods(root_module, root_module['ns3::Ipv6ExtensionLooseRoutingHeader'])
@@ -1481,6 +1487,43 @@
                    [param('uint8_t', 'nextHeader')])
     return
 
+def register_Ns3Ipv6ExtensionHopByHopHeader_methods(root_module, cls):
+    ## ipv6-extension-header.h: ns3::Ipv6ExtensionHopByHopHeader::Ipv6ExtensionHopByHopHeader(ns3::Ipv6ExtensionHopByHopHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6ExtensionHopByHopHeader const &', 'arg0')])
+    ## ipv6-extension-header.h: ns3::Ipv6ExtensionHopByHopHeader::Ipv6ExtensionHopByHopHeader() [constructor]
+    cls.add_constructor([])
+    ## ipv6-extension-header.h: uint32_t ns3::Ipv6ExtensionHopByHopHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ipv6-extension-header.h: ns3::TypeId ns3::Ipv6ExtensionHopByHopHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-extension-header.h: uint32_t ns3::Ipv6ExtensionHopByHopHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-extension-header.h: static ns3::TypeId ns3::Ipv6ExtensionHopByHopHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-extension-header.h: void ns3::Ipv6ExtensionHopByHopHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-extension-header.h: void ns3::Ipv6ExtensionHopByHopHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    return
+
 def register_Ns3Ipv6ExtensionRoutingHeader_methods(root_module, cls):
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionRoutingHeader::Ipv6ExtensionRoutingHeader(ns3::Ipv6ExtensionRoutingHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Ipv6ExtensionRoutingHeader const &', 'arg0')])
@@ -2616,6 +2659,43 @@
                    is_const=True, is_virtual=True)
     return
 
+def register_Ns3Ipv6ExtensionDestinationHeader_methods(root_module, cls):
+    ## ipv6-extension-header.h: ns3::Ipv6ExtensionDestinationHeader::Ipv6ExtensionDestinationHeader(ns3::Ipv6ExtensionDestinationHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6ExtensionDestinationHeader const &', 'arg0')])
+    ## ipv6-extension-header.h: ns3::Ipv6ExtensionDestinationHeader::Ipv6ExtensionDestinationHeader() [constructor]
+    cls.add_constructor([])
+    ## ipv6-extension-header.h: uint32_t ns3::Ipv6ExtensionDestinationHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ipv6-extension-header.h: ns3::TypeId ns3::Ipv6ExtensionDestinationHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-extension-header.h: uint32_t ns3::Ipv6ExtensionDestinationHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-extension-header.h: static ns3::TypeId ns3::Ipv6ExtensionDestinationHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-extension-header.h: void ns3::Ipv6ExtensionDestinationHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-extension-header.h: void ns3::Ipv6ExtensionDestinationHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    return
+
 def register_Ns3Ipv6ExtensionESPHeader_methods(root_module, cls):
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionESPHeader::Ipv6ExtensionESPHeader(ns3::Ipv6ExtensionESPHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Ipv6ExtensionESPHeader const &', 'arg0')])
--- a/bindings/python/apidefs/gcc-ILP32/ns3_module_node.py	Mon Feb 01 08:29:57 2010 -0800
+++ b/bindings/python/apidefs/gcc-ILP32/ns3_module_node.py	Mon Feb 01 13:10:31 2010 -0800
@@ -4723,11 +4723,6 @@
                    'int', 
                    [], 
                    is_const=True)
-    ## packetbb.h: void ns3::PbbPacket::SerializePacketTlv(ns3::Buffer::Iterator & start) const [member function]
-    cls.add_method('SerializePacketTlv', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator &', 'start')], 
-                   is_const=True, visibility='protected')
     return
 
 def register_Ns3PbbTlv_methods(root_module, cls):
--- a/bindings/python/apidefs/gcc-ILP32/ns3_module_stats.py	Mon Feb 01 08:29:57 2010 -0800
+++ b/bindings/python/apidefs/gcc-ILP32/ns3_module_stats.py	Mon Feb 01 13:10:31 2010 -0800
@@ -13,8 +13,12 @@
     module.add_class('DataCollector', parent=root_module['ns3::Object'])
     ## data-output-interface.h: ns3::DataOutputInterface [class]
     module.add_class('DataOutputInterface', parent=root_module['ns3::Object'])
+    ## basic-data-calculators.h: ns3::MinMaxAvgTotalCalculator<unsigned int> [class]
+    module.add_class('MinMaxAvgTotalCalculator', template_parameters=['unsigned int'], parent=[root_module['ns3::DataCalculator'], root_module['ns3::StatisticalSummary']])
     ## omnet-data-output.h: ns3::OmnetDataOutput [class]
     module.add_class('OmnetDataOutput', parent=root_module['ns3::DataOutputInterface'])
+    ## packet-data-calculators.h: ns3::PacketSizeMinMaxAvgTotalCalculator [class]
+    module.add_class('PacketSizeMinMaxAvgTotalCalculator', parent=root_module['ns3::MinMaxAvgTotalCalculator< unsigned int >'])
     ## sqlite-data-output.h: ns3::SqliteDataOutput [class]
     module.add_class('SqliteDataOutput', parent=root_module['ns3::DataOutputInterface'])
     ## time-data-calculators.h: ns3::TimeMinMaxAvgTotalCalculator [class]
@@ -116,7 +120,9 @@
     register_Ns3DataCalculator_methods(root_module, root_module['ns3::DataCalculator'])
     register_Ns3DataCollector_methods(root_module, root_module['ns3::DataCollector'])
     register_Ns3DataOutputInterface_methods(root_module, root_module['ns3::DataOutputInterface'])
+    register_Ns3MinMaxAvgTotalCalculator__Unsigned_int_methods(root_module, root_module['ns3::MinMaxAvgTotalCalculator< unsigned int >'])
     register_Ns3OmnetDataOutput_methods(root_module, root_module['ns3::OmnetDataOutput'])
+    register_Ns3PacketSizeMinMaxAvgTotalCalculator_methods(root_module, root_module['ns3::PacketSizeMinMaxAvgTotalCalculator'])
     register_Ns3SqliteDataOutput_methods(root_module, root_module['ns3::SqliteDataOutput'])
     register_Ns3TimeMinMaxAvgTotalCalculator_methods(root_module, root_module['ns3::TimeMinMaxAvgTotalCalculator'])
     register_Ns3CounterCalculator__Unsigned_int_methods(root_module, root_module['ns3::CounterCalculator< unsigned int >'])
@@ -364,6 +370,67 @@
                    visibility='protected', is_virtual=True)
     return
 
+def register_Ns3MinMaxAvgTotalCalculator__Unsigned_int_methods(root_module, cls):
+    ## basic-data-calculators.h: ns3::MinMaxAvgTotalCalculator<unsigned int>::MinMaxAvgTotalCalculator(ns3::MinMaxAvgTotalCalculator<unsigned int> const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MinMaxAvgTotalCalculator< unsigned int > const &', 'arg0')])
+    ## basic-data-calculators.h: ns3::MinMaxAvgTotalCalculator<unsigned int>::MinMaxAvgTotalCalculator() [constructor]
+    cls.add_constructor([])
+    ## basic-data-calculators.h: void ns3::MinMaxAvgTotalCalculator<unsigned int>::Output(ns3::DataOutputCallback & callback) const [member function]
+    cls.add_method('Output', 
+                   'void', 
+                   [param('ns3::DataOutputCallback &', 'callback')], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: void ns3::MinMaxAvgTotalCalculator<unsigned int>::Update(unsigned int const i) [member function]
+    cls.add_method('Update', 
+                   'void', 
+                   [param('unsigned int const', 'i')])
+    ## basic-data-calculators.h: long int ns3::MinMaxAvgTotalCalculator<unsigned int>::getCount() const [member function]
+    cls.add_method('getCount', 
+                   'long int', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getMax() const [member function]
+    cls.add_method('getMax', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getMean() const [member function]
+    cls.add_method('getMean', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getMin() const [member function]
+    cls.add_method('getMin', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getSqrSum() const [member function]
+    cls.add_method('getSqrSum', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getStddev() const [member function]
+    cls.add_method('getStddev', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getSum() const [member function]
+    cls.add_method('getSum', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getVariance() const [member function]
+    cls.add_method('getVariance', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: void ns3::MinMaxAvgTotalCalculator<unsigned int>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
 def register_Ns3OmnetDataOutput_methods(root_module, cls):
     ## omnet-data-output.h: ns3::OmnetDataOutput::OmnetDataOutput(ns3::OmnetDataOutput const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::OmnetDataOutput const &', 'arg0')])
@@ -381,6 +448,26 @@
                    visibility='protected', is_virtual=True)
     return
 
+def register_Ns3PacketSizeMinMaxAvgTotalCalculator_methods(root_module, cls):
+    ## packet-data-calculators.h: ns3::PacketSizeMinMaxAvgTotalCalculator::PacketSizeMinMaxAvgTotalCalculator(ns3::PacketSizeMinMaxAvgTotalCalculator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketSizeMinMaxAvgTotalCalculator const &', 'arg0')])
+    ## packet-data-calculators.h: ns3::PacketSizeMinMaxAvgTotalCalculator::PacketSizeMinMaxAvgTotalCalculator() [constructor]
+    cls.add_constructor([])
+    ## packet-data-calculators.h: void ns3::PacketSizeMinMaxAvgTotalCalculator::FrameUpdate(std::string path, ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address realto) [member function]
+    cls.add_method('FrameUpdate', 
+                   'void', 
+                   [param('std::string', 'path'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'realto')])
+    ## packet-data-calculators.h: void ns3::PacketSizeMinMaxAvgTotalCalculator::PacketUpdate(std::string path, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('PacketUpdate', 
+                   'void', 
+                   [param('std::string', 'path'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## packet-data-calculators.h: void ns3::PacketSizeMinMaxAvgTotalCalculator::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
 def register_Ns3SqliteDataOutput_methods(root_module, cls):
     ## sqlite-data-output.h: ns3::SqliteDataOutput::SqliteDataOutput(ns3::SqliteDataOutput const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::SqliteDataOutput const &', 'arg0')])
--- a/bindings/python/apidefs/gcc-LP64/ns3_module_common.py	Mon Feb 01 08:29:57 2010 -0800
+++ b/bindings/python/apidefs/gcc-LP64/ns3_module_common.py	Mon Feb 01 13:10:31 2010 -0800
@@ -222,6 +222,11 @@
                    'void', 
                    [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
                    is_const=True)
+    ## buffer.h: uint32_t ns3::Buffer::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
     ## buffer.h: ns3::Buffer ns3::Buffer::CreateFragment(uint32_t start, uint32_t length) const [member function]
     cls.add_method('CreateFragment', 
                    'ns3::Buffer', 
--- a/bindings/python/apidefs/gcc-LP64/ns3_module_internet_stack.py	Mon Feb 01 08:29:57 2010 -0800
+++ b/bindings/python/apidefs/gcc-LP64/ns3_module_internet_stack.py	Mon Feb 01 13:10:31 2010 -0800
@@ -59,6 +59,8 @@
     module.add_class('Icmpv6TooBig', parent=root_module['ns3::Icmpv6Header'])
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionHeader [class]
     module.add_class('Ipv6ExtensionHeader', parent=root_module['ns3::Header'])
+    ## ipv6-extension-header.h: ns3::Ipv6ExtensionHopByHopHeader [class]
+    module.add_class('Ipv6ExtensionHopByHopHeader', parent=[root_module['ns3::Ipv6ExtensionHeader'], root_module['ns3::OptionField']])
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionRoutingHeader [class]
     module.add_class('Ipv6ExtensionRoutingHeader', parent=root_module['ns3::Ipv6ExtensionHeader'])
     ## ipv6-option-header.h: ns3::Ipv6OptionHeader [class]
@@ -101,6 +103,8 @@
     module.add_enum('RxStatus', ['RX_OK', 'RX_CSUM_FAILED', 'RX_ENDPOINT_CLOSED', 'RX_ENDPOINT_UNREACH'], outer_class=root_module['ns3::Ipv4L4Protocol'])
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionAHHeader [class]
     module.add_class('Ipv6ExtensionAHHeader', parent=root_module['ns3::Ipv6ExtensionHeader'])
+    ## ipv6-extension-header.h: ns3::Ipv6ExtensionDestinationHeader [class]
+    module.add_class('Ipv6ExtensionDestinationHeader', parent=[root_module['ns3::Ipv6ExtensionHeader'], root_module['ns3::OptionField']])
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionESPHeader [class]
     module.add_class('Ipv6ExtensionESPHeader', parent=root_module['ns3::Ipv6ExtensionHeader'])
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionFragmentHeader [class]
@@ -231,6 +235,7 @@
     register_Ns3Icmpv6TimeExceeded_methods(root_module, root_module['ns3::Icmpv6TimeExceeded'])
     register_Ns3Icmpv6TooBig_methods(root_module, root_module['ns3::Icmpv6TooBig'])
     register_Ns3Ipv6ExtensionHeader_methods(root_module, root_module['ns3::Ipv6ExtensionHeader'])
+    register_Ns3Ipv6ExtensionHopByHopHeader_methods(root_module, root_module['ns3::Ipv6ExtensionHopByHopHeader'])
     register_Ns3Ipv6ExtensionRoutingHeader_methods(root_module, root_module['ns3::Ipv6ExtensionRoutingHeader'])
     register_Ns3Ipv6OptionHeader_methods(root_module, root_module['ns3::Ipv6OptionHeader'])
     register_Ns3Ipv6OptionHeaderAlignment_methods(root_module, root_module['ns3::Ipv6OptionHeader::Alignment'])
@@ -249,6 +254,7 @@
     register_Ns3Ipv4L3Protocol_methods(root_module, root_module['ns3::Ipv4L3Protocol'])
     register_Ns3Ipv4L4Protocol_methods(root_module, root_module['ns3::Ipv4L4Protocol'])
     register_Ns3Ipv6ExtensionAHHeader_methods(root_module, root_module['ns3::Ipv6ExtensionAHHeader'])
+    register_Ns3Ipv6ExtensionDestinationHeader_methods(root_module, root_module['ns3::Ipv6ExtensionDestinationHeader'])
     register_Ns3Ipv6ExtensionESPHeader_methods(root_module, root_module['ns3::Ipv6ExtensionESPHeader'])
     register_Ns3Ipv6ExtensionFragmentHeader_methods(root_module, root_module['ns3::Ipv6ExtensionFragmentHeader'])
     register_Ns3Ipv6ExtensionLooseRoutingHeader_methods(root_module, root_module['ns3::Ipv6ExtensionLooseRoutingHeader'])
@@ -1481,6 +1487,43 @@
                    [param('uint8_t', 'nextHeader')])
     return
 
+def register_Ns3Ipv6ExtensionHopByHopHeader_methods(root_module, cls):
+    ## ipv6-extension-header.h: ns3::Ipv6ExtensionHopByHopHeader::Ipv6ExtensionHopByHopHeader(ns3::Ipv6ExtensionHopByHopHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6ExtensionHopByHopHeader const &', 'arg0')])
+    ## ipv6-extension-header.h: ns3::Ipv6ExtensionHopByHopHeader::Ipv6ExtensionHopByHopHeader() [constructor]
+    cls.add_constructor([])
+    ## ipv6-extension-header.h: uint32_t ns3::Ipv6ExtensionHopByHopHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ipv6-extension-header.h: ns3::TypeId ns3::Ipv6ExtensionHopByHopHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-extension-header.h: uint32_t ns3::Ipv6ExtensionHopByHopHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-extension-header.h: static ns3::TypeId ns3::Ipv6ExtensionHopByHopHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-extension-header.h: void ns3::Ipv6ExtensionHopByHopHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-extension-header.h: void ns3::Ipv6ExtensionHopByHopHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    return
+
 def register_Ns3Ipv6ExtensionRoutingHeader_methods(root_module, cls):
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionRoutingHeader::Ipv6ExtensionRoutingHeader(ns3::Ipv6ExtensionRoutingHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Ipv6ExtensionRoutingHeader const &', 'arg0')])
@@ -2616,6 +2659,43 @@
                    is_const=True, is_virtual=True)
     return
 
+def register_Ns3Ipv6ExtensionDestinationHeader_methods(root_module, cls):
+    ## ipv6-extension-header.h: ns3::Ipv6ExtensionDestinationHeader::Ipv6ExtensionDestinationHeader(ns3::Ipv6ExtensionDestinationHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6ExtensionDestinationHeader const &', 'arg0')])
+    ## ipv6-extension-header.h: ns3::Ipv6ExtensionDestinationHeader::Ipv6ExtensionDestinationHeader() [constructor]
+    cls.add_constructor([])
+    ## ipv6-extension-header.h: uint32_t ns3::Ipv6ExtensionDestinationHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ipv6-extension-header.h: ns3::TypeId ns3::Ipv6ExtensionDestinationHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-extension-header.h: uint32_t ns3::Ipv6ExtensionDestinationHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-extension-header.h: static ns3::TypeId ns3::Ipv6ExtensionDestinationHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-extension-header.h: void ns3::Ipv6ExtensionDestinationHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-extension-header.h: void ns3::Ipv6ExtensionDestinationHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    return
+
 def register_Ns3Ipv6ExtensionESPHeader_methods(root_module, cls):
     ## ipv6-extension-header.h: ns3::Ipv6ExtensionESPHeader::Ipv6ExtensionESPHeader(ns3::Ipv6ExtensionESPHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Ipv6ExtensionESPHeader const &', 'arg0')])
--- a/bindings/python/apidefs/gcc-LP64/ns3_module_node.py	Mon Feb 01 08:29:57 2010 -0800
+++ b/bindings/python/apidefs/gcc-LP64/ns3_module_node.py	Mon Feb 01 13:10:31 2010 -0800
@@ -4723,11 +4723,6 @@
                    'int', 
                    [], 
                    is_const=True)
-    ## packetbb.h: void ns3::PbbPacket::SerializePacketTlv(ns3::Buffer::Iterator & start) const [member function]
-    cls.add_method('SerializePacketTlv', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator &', 'start')], 
-                   is_const=True, visibility='protected')
     return
 
 def register_Ns3PbbTlv_methods(root_module, cls):
--- a/bindings/python/apidefs/gcc-LP64/ns3_module_stats.py	Mon Feb 01 08:29:57 2010 -0800
+++ b/bindings/python/apidefs/gcc-LP64/ns3_module_stats.py	Mon Feb 01 13:10:31 2010 -0800
@@ -13,8 +13,12 @@
     module.add_class('DataCollector', parent=root_module['ns3::Object'])
     ## data-output-interface.h: ns3::DataOutputInterface [class]
     module.add_class('DataOutputInterface', parent=root_module['ns3::Object'])
+    ## basic-data-calculators.h: ns3::MinMaxAvgTotalCalculator<unsigned int> [class]
+    module.add_class('MinMaxAvgTotalCalculator', template_parameters=['unsigned int'], parent=[root_module['ns3::DataCalculator'], root_module['ns3::StatisticalSummary']])
     ## omnet-data-output.h: ns3::OmnetDataOutput [class]
     module.add_class('OmnetDataOutput', parent=root_module['ns3::DataOutputInterface'])
+    ## packet-data-calculators.h: ns3::PacketSizeMinMaxAvgTotalCalculator [class]
+    module.add_class('PacketSizeMinMaxAvgTotalCalculator', parent=root_module['ns3::MinMaxAvgTotalCalculator< unsigned int >'])
     ## sqlite-data-output.h: ns3::SqliteDataOutput [class]
     module.add_class('SqliteDataOutput', parent=root_module['ns3::DataOutputInterface'])
     ## time-data-calculators.h: ns3::TimeMinMaxAvgTotalCalculator [class]
@@ -116,7 +120,9 @@
     register_Ns3DataCalculator_methods(root_module, root_module['ns3::DataCalculator'])
     register_Ns3DataCollector_methods(root_module, root_module['ns3::DataCollector'])
     register_Ns3DataOutputInterface_methods(root_module, root_module['ns3::DataOutputInterface'])
+    register_Ns3MinMaxAvgTotalCalculator__Unsigned_int_methods(root_module, root_module['ns3::MinMaxAvgTotalCalculator< unsigned int >'])
     register_Ns3OmnetDataOutput_methods(root_module, root_module['ns3::OmnetDataOutput'])
+    register_Ns3PacketSizeMinMaxAvgTotalCalculator_methods(root_module, root_module['ns3::PacketSizeMinMaxAvgTotalCalculator'])
     register_Ns3SqliteDataOutput_methods(root_module, root_module['ns3::SqliteDataOutput'])
     register_Ns3TimeMinMaxAvgTotalCalculator_methods(root_module, root_module['ns3::TimeMinMaxAvgTotalCalculator'])
     register_Ns3CounterCalculator__Unsigned_int_methods(root_module, root_module['ns3::CounterCalculator< unsigned int >'])
@@ -364,6 +370,67 @@
                    visibility='protected', is_virtual=True)
     return
 
+def register_Ns3MinMaxAvgTotalCalculator__Unsigned_int_methods(root_module, cls):
+    ## basic-data-calculators.h: ns3::MinMaxAvgTotalCalculator<unsigned int>::MinMaxAvgTotalCalculator(ns3::MinMaxAvgTotalCalculator<unsigned int> const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MinMaxAvgTotalCalculator< unsigned int > const &', 'arg0')])
+    ## basic-data-calculators.h: ns3::MinMaxAvgTotalCalculator<unsigned int>::MinMaxAvgTotalCalculator() [constructor]
+    cls.add_constructor([])
+    ## basic-data-calculators.h: void ns3::MinMaxAvgTotalCalculator<unsigned int>::Output(ns3::DataOutputCallback & callback) const [member function]
+    cls.add_method('Output', 
+                   'void', 
+                   [param('ns3::DataOutputCallback &', 'callback')], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: void ns3::MinMaxAvgTotalCalculator<unsigned int>::Update(unsigned int const i) [member function]
+    cls.add_method('Update', 
+                   'void', 
+                   [param('unsigned int const', 'i')])
+    ## basic-data-calculators.h: long int ns3::MinMaxAvgTotalCalculator<unsigned int>::getCount() const [member function]
+    cls.add_method('getCount', 
+                   'long int', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getMax() const [member function]
+    cls.add_method('getMax', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getMean() const [member function]
+    cls.add_method('getMean', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getMin() const [member function]
+    cls.add_method('getMin', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getSqrSum() const [member function]
+    cls.add_method('getSqrSum', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getStddev() const [member function]
+    cls.add_method('getStddev', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getSum() const [member function]
+    cls.add_method('getSum', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator<unsigned int>::getVariance() const [member function]
+    cls.add_method('getVariance', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## basic-data-calculators.h: void ns3::MinMaxAvgTotalCalculator<unsigned int>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
 def register_Ns3OmnetDataOutput_methods(root_module, cls):
     ## omnet-data-output.h: ns3::OmnetDataOutput::OmnetDataOutput(ns3::OmnetDataOutput const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::OmnetDataOutput const &', 'arg0')])
@@ -381,6 +448,26 @@
                    visibility='protected', is_virtual=True)
     return
 
+def register_Ns3PacketSizeMinMaxAvgTotalCalculator_methods(root_module, cls):
+    ## packet-data-calculators.h: ns3::PacketSizeMinMaxAvgTotalCalculator::PacketSizeMinMaxAvgTotalCalculator(ns3::PacketSizeMinMaxAvgTotalCalculator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketSizeMinMaxAvgTotalCalculator const &', 'arg0')])
+    ## packet-data-calculators.h: ns3::PacketSizeMinMaxAvgTotalCalculator::PacketSizeMinMaxAvgTotalCalculator() [constructor]
+    cls.add_constructor([])
+    ## packet-data-calculators.h: void ns3::PacketSizeMinMaxAvgTotalCalculator::FrameUpdate(std::string path, ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address realto) [member function]
+    cls.add_method('FrameUpdate', 
+                   'void', 
+                   [param('std::string', 'path'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'realto')])
+    ## packet-data-calculators.h: void ns3::PacketSizeMinMaxAvgTotalCalculator::PacketUpdate(std::string path, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('PacketUpdate', 
+                   'void', 
+                   [param('std::string', 'path'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## packet-data-calculators.h: void ns3::PacketSizeMinMaxAvgTotalCalculator::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
 def register_Ns3SqliteDataOutput_methods(root_module, cls):
     ## sqlite-data-output.h: ns3::SqliteDataOutput::SqliteDataOutput(ns3::SqliteDataOutput const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::SqliteDataOutput const &', 'arg0')])
--- a/bindings/python/wscript	Mon Feb 01 08:29:57 2010 -0800
+++ b/bindings/python/wscript	Mon Feb 01 13:10:31 2010 -0800
@@ -15,7 +15,7 @@
 import Utils
 
 ## https://launchpad.net/pybindgen/
-REQUIRED_PYBINDGEN_VERSION = (0, 12, 0, 710)
+REQUIRED_PYBINDGEN_VERSION = (0, 13, 0, 744)
 REQUIRED_PYGCCXML_VERSION = (0, 9, 5)
 
 
@@ -346,7 +346,7 @@
                         all_headers_inputs.append(node)
         assert all_headers_inputs
         all_headers_outputs = [self.path.find_or_declare("everything.h")]
-        task = self.create_task('gen_everything_h', self.env)
+        task = self.create_task('gen_everything_h', env=self.env)
         task.set_inputs(all_headers_inputs)
         task.set_outputs(all_headers_outputs)
 
--- a/src/common/buffer.cc	Mon Feb 01 08:29:57 2010 -0800
+++ b/src/common/buffer.cc	Mon Feb 01 13:10:31 2010 -0800
@@ -726,6 +726,38 @@
     }
 }
 
+uint32_t 
+Buffer::CopyData (uint8_t *buffer, uint32_t size) const
+{
+  uint32_t originalSize = size;
+  if (size > 0)
+    {
+      uint32_t tmpsize = std::min (m_zeroAreaStart-m_start, size);
+      memcpy (buffer, (const char*)(m_data->m_data + m_start), tmpsize);
+      buffer += tmpsize;
+      if (size > tmpsize) 
+        { 
+          size -= m_zeroAreaStart-m_start;
+          tmpsize = std::min (m_zeroAreaEnd - m_zeroAreaStart, size);
+          uint32_t left = tmpsize;
+          while (left > 0)
+            {
+              uint32_t toWrite = std::min (left, g_zeroes.size);
+              memcpy (buffer, g_zeroes.buffer, toWrite);
+              left -= toWrite;
+              buffer += toWrite;
+            }
+          if (size > tmpsize)
+            {
+              size -= tmpsize;
+              tmpsize = std::min (m_end - m_zeroAreaEnd, size);
+              memcpy (buffer, (const char*)(m_data->m_data + m_zeroAreaStart), tmpsize);
+            }
+        }
+    }
+  return originalSize - size;
+}
+
 /******************************************************
  *            The buffer iterator below.
  ******************************************************/
--- a/src/common/buffer.h	Mon Feb 01 08:29:57 2010 -0800
+++ b/src/common/buffer.h	Mon Feb 01 13:10:31 2010 -0800
@@ -487,6 +487,8 @@
    */
   void CopyData (std::ostream *os, uint32_t size) const;
 
+  uint32_t CopyData (uint8_t *buffer, uint32_t size) const;
+
   Buffer (Buffer const &o);
   Buffer &operator = (Buffer const &o);
   Buffer ();
--- a/src/common/packet.cc	Mon Feb 01 08:29:57 2010 -0800
+++ b/src/common/packet.cc	Mon Feb 01 13:10:31 2010 -0800
@@ -350,14 +350,7 @@
 uint32_t 
 Packet::CopyData (uint8_t *buffer, uint32_t size) const
 {
-  Buffer::Iterator i = m_buffer.Begin ();
-  uint32_t cur = 0;
-  while (!i.IsEnd () && cur < size)
-    {
-      buffer[cur] = i.ReadU8 ();
-      cur++;
-    }
-  return cur;
+  return m_buffer.CopyData (buffer, size);
 }
 
 void
--- a/src/common/packet.h	Mon Feb 01 08:29:57 2010 -0800
+++ b/src/common/packet.h	Mon Feb 01 13:10:31 2010 -0800
@@ -202,7 +202,6 @@
 class Packet : public SimpleRefCount<Packet>
 {
 public:
-  Ptr<Packet> Copy (void) const;
 
   /**
    * Create an empty packet with a new uid (as returned
@@ -346,9 +345,24 @@
    */
   uint32_t CopyData (uint8_t *buffer, uint32_t size) const;
 
+  /**
+   * \param os pointer to output stream in which we want
+   *        to write the packet data.
+   * \param size the maximum number of bytes we want to write
+   *        in the output stream.
+   */
   void CopyData(std::ostream *os, uint32_t size) const;
 
   /**
+   * \returns a COW copy of the packet.
+   *
+   * The returns packet will behave like an independent copy of
+   * the original packet, even though they both share the
+   * same datasets internally.
+   */
+  Ptr<Packet> Copy (void) const;
+
+  /**
    * A packet is allocated a new uid when it is created
    * empty or with zero-filled payload.
    *
@@ -377,6 +391,14 @@
    */
   void Print (std::ostream &os) const;
 
+  /**
+   * \returns an iterator which points to the first 'item'
+   * stored in this buffer. Note that this iterator will point
+   * to an empty array of items if you don't call EnablePrinting
+   * or EnableChecking before.
+   *
+   * \sa EnablePrinting EnableChecking
+   */
   PacketMetadata::ItemIterator BeginItem (void) const;
 
   /**
--- a/src/internet-stack/tcp-socket-impl.cc	Mon Feb 01 08:29:57 2010 -0800
+++ b/src/internet-stack/tcp-socket-impl.cc	Mon Feb 01 13:10:31 2010 -0800
@@ -677,16 +677,6 @@
   TcpHeader tcpHeader;
   packet->RemoveHeader (tcpHeader);
 
-  if (tcpHeader.GetFlags () & TcpHeader::RST)
-    { // Got an RST, just shut everything down
-      NotifyErrorClose();
-      CancelAllTimers();
-      m_endPoint->SetDestroyCallback(MakeNullCallback<void>());
-      m_tcp->DeAllocate (m_endPoint);
-      m_endPoint = 0;
-      return;
-    }
-      
   if (tcpHeader.GetFlags () & TcpHeader::ACK)
     {
       Time m = m_rtt->AckSeq (tcpHeader.GetAckNumber () );
@@ -721,14 +711,7 @@
   // class intended to be a singleton; see simulation-singleton.h
   SA stateAction = SimulationSingleton<TcpStateMachine>::Get ()->Lookup (m_state,e);
   NS_LOG_LOGIC ("TcpSocketImpl::ProcessEvent stateAction " << stateAction.action);
-  // debug
-  if (stateAction.action == RST_TX)
-    {
-      NS_LOG_LOGIC ("TcpSocketImpl " << this << " sending RST from state "
-              << saveState << " event " << e);
-      SendRST();
-      return NO_ACT;
-    }
+
   bool needCloseNotify = (stateAction.state == CLOSED && m_state != CLOSED 
     && e != TIMEOUT);
   m_state = stateAction.state;
@@ -925,6 +908,12 @@
 
   switch (a)
   {
+    case RST_TX:
+      {
+        NS_LOG_LOGIC ("TcpSocketImpl " << this << " Action RST_TX");
+        SendRST();
+        return NO_ACT;
+      }
     case ACK_TX:
       NS_LOG_LOGIC ("TcpSocketImpl " << this <<" Action ACK_TX");
       if(tcpHeader.GetFlags() & TcpHeader::FIN)
--- a/src/node/packetbb.h	Mon Feb 01 08:29:57 2010 -0800
+++ b/src/node/packetbb.h	Mon Feb 01 13:10:31 2010 -0800
@@ -631,7 +631,6 @@
   bool operator!= (const PbbPacket &other) const;
 
 protected:
-  void SerializePacketTlv (Buffer::Iterator &start) const;
 
 private:
   PbbTlvBlock m_tlvList;
--- a/src/routing/global-routing/global-route-manager-impl.cc	Mon Feb 01 08:29:57 2010 -0800
+++ b/src/routing/global-routing/global-route-manager-impl.cc	Mon Feb 01 13:10:31 2010 -0800
@@ -222,53 +222,6 @@
   return m_distanceFromRoot;
 }
 
-void 
-SPFVertex::SetOutgoingInterfaceId (int32_t id)
-{
-  NS_LOG_FUNCTION (id);
-
-  // always maintain only one output interface index when using setter/getter methods
-  m_rootOif = id;
-}
-
-uint32_t 
-SPFVertex::GetOutgoingInterfaceId (void) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  return m_rootOif;
-}
-
-//void 
-//SPFVertex::MergeOutgoingInterfaceId (const SPFVertex* v)
-//{
-//  NS_LOG_FUNCTION (v);
-//
-//  NS_LOG_LOGIC ("Before merge, list of root out-going interfaces = " << m_rootOif);
-//  // combine the two lists first, and then remove any duplicated after
-//  m_rootOif.insert (m_rootOif.end (), 
-//    v->m_rootOif.begin (), v->m_rootOif.end ());
-//  // remove duplication
-//  m_rootOif.sort ();
-//  m_rootOif.unique ();
-//  NS_LOG_LOGIC ("After merge, list of root out-going interfaces = " << m_rootOif);
-//}
-
-  void 
-SPFVertex::SetNextHop (Ipv4Address nextHop)
-{
-  NS_LOG_FUNCTION (nextHop);
-
-  // always maintain only one nexthop when using setter/getter methods
-  m_nextHop = nextHop;
-}
-
-  Ipv4Address
-SPFVertex::GetNextHop (void) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  return m_nextHop;
-}
-
   void
 SPFVertex::SetParent (SPFVertex* parent)
 {
@@ -1637,11 +1590,6 @@
           Ipv4Address tempip = extlsa->GetLinkStateId ();
           tempip = tempip.CombineMask (tempmask);
 
-          NS_LOG_LOGIC (" Node " << node->GetId () <<
-              " add route to " << tempip <<
-              " with mask " << tempmask <<
-              " using next hop " << v->GetNextHop () <<
-              " via interface " << v->GetOutgoingInterfaceId ());
 //
 // Here's why we did all of that work.  We're going to add a host route to the
 // host address found in the m_linkData field of the point-to-point link
@@ -1662,20 +1610,28 @@
             }
           Ptr<Ipv4GlobalRouting> gr = router->GetRoutingProtocol ();
           NS_ASSERT (gr);
-          if (v->GetOutgoingInterfaceId () >= 0)
+          // walk through all next-hop-IPs and out-going-interfaces for reaching
+          // the stub network gateway 'v' from the root node
+          for (uint32_t i = 0; i < v->GetNRootExitDirections (); i++)
             {
-              gr->AddASExternalRouteTo (tempip, tempmask, v->GetNextHop (), v->GetOutgoingInterfaceId ());
-              NS_LOG_LOGIC ("Node " << node->GetId () <<
-                  " add network route to " << tempip <<
-                  " using next hop " << v->GetNextHop () <<
-                  " via interface " << v->GetOutgoingInterfaceId ());
-            }
-          else
-            {
-              NS_LOG_LOGIC ("Node " << node->GetId () <<
-                  " NOT able to add network route to " << tempip <<
-                  " using next hop " << v->GetNextHop () <<
-                  " since outgoing interface id is negative");
+              SPFVertex::NodeExit_t exit = v->GetRootExitDirection (i);
+              Ipv4Address nextHop = exit.first;
+              int32_t outIf = exit.second;
+              if (outIf >= 0)
+                {
+                  gr->AddASExternalRouteTo (tempip, tempmask, nextHop, outIf);
+                  NS_LOG_LOGIC ("(Route " << i << ") Node " << node->GetId () <<
+                    " add external network route to " << tempip <<
+                    " using next hop " << nextHop <<
+                    " via interface " << outIf);
+                }
+              else
+                {
+                  NS_LOG_LOGIC ("(Route " << i << ") Node " << node->GetId () <<
+                    " NOT able to add network route to " << tempip <<
+                    " using next hop " << nextHop <<
+                    " since outgoing interface id is negative");
+                }
             }
           return;
         } // if
--- a/src/routing/global-routing/global-route-manager-impl.h	Mon Feb 01 08:29:57 2010 -0800
+++ b/src/routing/global-routing/global-route-manager-impl.h	Mon Feb 01 13:10:31 2010 -0800
@@ -256,183 +256,6 @@
   void SetDistanceFromRoot (uint32_t distance);
 
 /**
- * \deprecated Use GetRootExitDirection instead
- *
- * @brief Get the interface ID that should be used to begin forwarding packets
- * from the root SPFVertex to "this" SPFVertex.
- * @internal
- *
- * Each router node in the simulation is associated with an SPFVertex object.
- * When calculating routes, each of these routers is, in turn, chosen as the 
- * "root" of the calculation and routes to all of the other routers are
- * eventually saved in the routing tables of each of the chosen nodes.
- *
- * The "Root" vertex is then the SPFVertex representing the router that is
- * having its routing tables set.  The "this" SPFVertex is the vertex that
- * represents the host or network to which a route is being calculated from 
- * the root.  The outgoing interface that we're asking for is the interface
- * index on the root node that should be used to start packets along the
- * path to "this" vertex.
- *
- * When initializing the root SPFVertex, the interface ID is determined by
- * examining the Global Router Link Records of the Link State Advertisement
- * generated by the root node's GlobalRouter.  These interfaces are used to 
- * forward packets off of the root's network down those links.  As other 
- * vertices are discovered which are further away from the root, they will 
- * be accessible down one of the paths begun by a Global Router Link Record.
- * 
- * To forward packets to these hosts or networks, the root node must begin
- * the forwarding process by sending the packets to the interface of that
- * first hop.  This means that the first hop address and interface ID must
- * be the same for all downstream SPFVertices.  We call this "inheriting"
- * the interface and next hop.
- *
- * In this method, the root node is asking, "which of my local interfaces
- * should I use to get a packet to the network or host represented by 'this'
- * SPFVertex."
- *
- * @see GlobalRouter
- * @see GlobalRoutingLSA
- * @see GlobalRoutingLinkRecord
- * @returns The interface index to use when forwarding packets to the host
- * or network represented by "this" SPFVertex.
- */
-  uint32_t GetOutgoingInterfaceId (void) const NS_DEPRECATED;
-
-/**
- * \deprecated Use SetRootExitDirection instead
- *
- * @brief Set the interface ID that should be used to begin forwarding packets
- * from the root SPFVertex to "this" SPFVertex.
- * @internal
- *
- * Each router node in the simulation is associated with an SPFVertex object.
- * When calculating routes, each of these routers is, in turn, chosen as the 
- * "root" of the calculation and routes to all of the other routers are
- * eventually saved in the routing tables of each of the chosen nodes.
- *
- * The "Root" vertex is then the SPFVertex representing the router that is
- * having its routing tables set.  The "this" SPFVertex is the vertex that
- * represents the host or network to which a route is being calculated from 
- * the root.  The outgoing interface that we're asking for is the interface
- * index on the root node that should be used to start packets along the
- * path to "this" vertex.
- *
- * When initializing the root SPFVertex, the interface ID is determined by
- * examining the Global Router Link Records of the Link State Advertisement
- * generated by the root node's GlobalRouter.  These interfaces are used to 
- * forward packets off of the root's network down those links.  As other 
- * vertices are discovered which are further away from the root, they will 
- * be accessible down one of the paths begun by a Global Router Link Record.
- * 
- * To forward packets to these hosts or networks, the root node must begin
- * the forwarding process by sending the packets to the interface of that
- * first hop.  This means that the first hop address and interface ID must
- * be the same for all downstream SPFVertices.  We call this "inheriting"
- * the interface and next hop.
- *
- * In this method, we are letting the root node know which of its local
- * interfaces it should use to get a packet to the network or host represented
- * by "this" SPFVertex.
- *
- * @see GlobalRouter
- * @see GlobalRoutingLSA
- * @see GlobalRoutingLinkRecord
- * @param id The interface index to use when forwarding packets to the host or
- * network represented by "this" SPFVertex.
- */
-  void SetOutgoingInterfaceId (int32_t id) NS_DEPRECATED;
-
-/**
- * \deprecated Use GetRootExitDirection instead
- *
- * @brief Get the IP address that should be used to begin forwarding packets 
- * from the root SPFVertex to "this" SPFVertex.
- * @internal
- *
- * Each router node in the simulation is associated with an SPFVertex object.
- * When calculating routes, each of these routers is, in turn, chosen as the 
- * "root" of the calculation and routes to all of the other routers are
- * eventually saved in the routing tables of each of the chosen nodes.
- *
- * The "Root" vertex is then the SPFVertex representing the router that is
- * having its routing tables set.  The "this" SPFVertex is the vertex that
- * represents the host or network to which a route is being calculated from 
- * the root.  The IP address that we're asking for is the address on the 
- * remote side of a link off of the root node that should be used as the
- * destination for packets along the path to "this" vertex.
- *
- * When initializing the root SPFVertex, the IP address used when forwarding
- * packets is determined by examining the Global Router Link Records of the
- * Link State Advertisement generated by the root node's GlobalRouter.  This
- * address is used to forward packets off of the root's network down those
- * links.  As other vertices / nodes are discovered which are further away
- * from the root, they will be accessible down one of the paths via a link
- * described by one of these Global Router Link Records.
- * 
- * To forward packets to these hosts or networks, the root node must begin
- * the forwarding process by sending the packets to a first hop router down
- * an interface.  This means that the first hop address and interface ID must
- * be the same for all downstream SPFVertices.  We call this "inheriting"
- * the interface and next hop.
- *
- * In this method, the root node is asking, "which router should I send a
- * packet to in order to get that packet to the network or host represented 
- * by 'this' SPFVertex."
- *
- * @see GlobalRouter
- * @see GlobalRoutingLSA
- * @see GlobalRoutingLinkRecord
- * @returns The IP address to use when forwarding packets to the host
- * or network represented by "this" SPFVertex.
- */
-  Ipv4Address GetNextHop (void) const NS_DEPRECATED;
-
-/**
- * \deprecated Use SetRootExitDirection instead
- *
- * @brief Set the IP address that should be used to begin forwarding packets 
- * from the root SPFVertex to "this" SPFVertex.
- * @internal
- *
- * Each router node in the simulation is associated with an SPFVertex object.
- * When calculating routes, each of these routers is, in turn, chosen as the 
- * "root" of the calculation and routes to all of the other routers are
- * eventually saved in the routing tables of each of the chosen nodes.
- *
- * The "Root" vertex is then the SPFVertex representing the router that is
- * having its routing tables set.  The "this" SPFVertex is the vertex that
- * represents the host or network to which a route is being calculated from 
- * the root.  The IP address that we're asking for is the address on the 
- * remote side of a link off of the root node that should be used as the
- * destination for packets along the path to "this" vertex.
- *
- * When initializing the root SPFVertex, the IP address used when forwarding
- * packets is determined by examining the Global Router Link Records of the
- * Link State Advertisement generated by the root node's GlobalRouter.  This
- * address is used to forward packets off of the root's network down those
- * links.  As other vertices / nodes are discovered which are further away
- * from the root, they will be accessible down one of the paths via a link
- * described by one of these Global Router Link Records.
- * 
- * To forward packets to these hosts or networks, the root node must begin
- * the forwarding process by sending the packets to a first hop router down
- * an interface.  This means that the first hop address and interface ID must
- * be the same for all downstream SPFVertices.  We call this "inheriting"
- * the interface and next hop.
- *
- * In this method we are telling the root node which router it should send
- * should I send a packet to in order to get that packet to the network or
- * host represented by 'this' SPFVertex."
- *
- * @see GlobalRouter
- * @see GlobalRoutingLSA
- * @see GlobalRoutingLinkRecord
- * @param nextHop The IP address to use when forwarding packets to the host
- * or network represented by "this" SPFVertex.
- */
-  void SetNextHop (Ipv4Address nextHop) NS_DEPRECATED;
-/**
  * @brief Set the IP address and outgoing interface index that should be used 
  * to begin forwarding packets from the root SPFVertex to "this" SPFVertex.
  * @internal
--- a/src/routing/olsr/olsr-routing-protocol.cc	Mon Feb 01 08:29:57 2010 -0800
+++ b/src/routing/olsr/olsr-routing-protocol.cc	Mon Feb 01 13:10:31 2010 -0800
@@ -72,7 +72,7 @@
 /********** Holding times **********/
 
 /// Neighbor holding time.
-#define OLSR_NEIGHB_HOLD_TIME	(Scalar (3) * m_helloInterval)
+#define OLSR_NEIGHB_HOLD_TIME	(Scalar (3) * OLSR_REFRESH_INTERVAL)
 /// Top holding time.
 #define OLSR_TOP_HOLD_TIME	(Scalar (3) * m_tcInterval)
 /// Dup holding time.
--- a/src/test/perf/perf-pcap.cc	Mon Feb 01 08:29:57 2010 -0800
+++ b/src/test/perf/perf-pcap.cc	Mon Feb 01 13:10:31 2010 -0800
@@ -16,6 +16,7 @@
 
 #include <iostream>
 #include <fstream>
+#include <limits>
 
 #include "ns3/simulator-module.h"
 #include "ns3/node-module.h"
@@ -29,38 +30,56 @@
 
 bool g_passheader = true;
 bool g_addheader = true;
+
+RadiotapHeader g_header;
+
 Time g_t(0.);
 
-static void
-WritePacket (Ptr<PcapFileObject> file, Ptr<const Packet>   packet)
+void
+PerfPcapNew (Ptr<PcapFileObject> file, Ptr<Packet> p, uint32_t n)
 {
   if (g_passheader)
     {
-      RadiotapHeader header;
-      header.SetTsft (0);
-      header.SetFrameFlags (RadiotapHeader::FRAME_FLAG_SHORT_PREAMBLE);
-      header.SetRate (0);
-      header.SetChannelFrequencyAndFlags (0, 0);
-
-      file->Write (g_t, header, packet);
-      return;
-    }
-
-  if (g_addheader)
-    {
-      RadiotapHeader header;
-      header.SetTsft (0);
-      header.SetFrameFlags (RadiotapHeader::FRAME_FLAG_SHORT_PREAMBLE);
-      header.SetRate (0);
-      header.SetChannelFrequencyAndFlags (0, 0);
-
-      Ptr<Packet> p = packet->Copy ();
-      p->AddHeader (header);
-      file->Write (g_t, p);
+      for (uint32_t i = 0; i < n; ++i)
+        {
+          if (g_passheader)
+            {
+              file->Write (g_t, g_header, p);
+            }
+        }
     }
   else
     {
-      file->Write (g_t, packet);
+      for (uint32_t i = 0; i < n; ++i)
+        {
+          if (g_addheader)
+            {
+              Ptr<Packet> pc = p->Copy ();
+              pc->AddHeader (g_header);
+              file->Write (g_t, pc);
+            }
+          else
+            {
+              file->Write (g_t, p);
+            }
+        }
+    }
+}
+
+void
+PerfPcapOld (PcapWriter &pcapWriter, Ptr<Packet> p, uint32_t n)
+{
+
+  for (uint32_t i = 0; i < n; ++i)
+    {
+      if (g_addheader)
+        {
+          pcapWriter.WriteWifiMonitorPacket (p, 0, 0, 0, true, false, 0., 0.);
+        }
+      else
+        {
+          pcapWriter.WritePacket (p);
+        }
     }
 }
 
@@ -68,17 +87,19 @@
 main (int argc, char *argv[])
 {
   uint32_t n = 100000;
+  uint32_t iter = 50;
   bool oldstyle = false;
 
   CommandLine cmd;
   cmd.AddValue ("addheader", "Add a header to the traces to trigger a deep copy", g_addheader);
   cmd.AddValue ("passheader", "Pass header as reference instead of adding it", g_passheader);
   cmd.AddValue ("n", "How many packets to write (defaults to 100000", n);
+  cmd.AddValue ("iter", "How many times to run the test looking for a min (defaults to 20)", iter);
   cmd.AddValue ("oldstyle", "run the old style pcap writer stuff if true", oldstyle);
   cmd.Parse (argc, argv);
 
-  uint64_t et;
-
+  uint64_t result = std::numeric_limits<uint64_t>::max ();
+  
   if (oldstyle)
     {
       PcapWriter pcapWriter;
@@ -87,50 +108,48 @@
 
       Ptr<Packet> p = Create<Packet> (1024);
 
-      //NS_LOG_UNCOND ("timing old style pcap file write of 1K packet");
-      //NS_LOG_UNCOND ("g_addheader = " << g_addheader);
-      //NS_LOG_UNCOND ("g_passheader = " << g_passheader);
-      //NS_LOG_UNCOND ("n = " << n);
-
-      SystemWallClockMs ms;
-      ms.Start ();
-
-      for (uint32_t i = 0; i < n; ++i)
+      //
+      // This will probably run on a machine doing other things.  Run it some
+      // relatively large number of times and try to find a minimum, which
+      // will hopefully represent a time when it runs free of interference.
+      //
+      for (uint32_t i = 0; i < iter; ++i)
         {
-          if (g_addheader)
-            {
-              pcapWriter.WriteWifiMonitorPacket (p, 0, 0, 0, true, false, 0., 0.);
-            }
-          else
-            {
-              pcapWriter.WritePacket (p);
-            }
+          SystemWallClockMs ms;
+          ms.Start ();
+          PerfPcapOld (pcapWriter, p, n);
+          uint64_t et = ms.End ();
+          result = std::min (result, et);
+          std::cout << "."; std::cout.flush ();
         }
-
-      et = ms.End ();
+      std::cout << std::endl;
     }
   else
     {
       PcapHelper pcapHelper;
-      Ptr<PcapFileObject> file = pcapHelper.CreateFile ("perf-pcap.pcap", "w", PcapHelper::DLT_IEEE802_11_RADIO);
-
+      Ptr<PcapFileObject> file = pcapHelper.CreateFile ("perf-pcap.pcap", "w", PcapHelper::DLT_IEEE802_11_RADIO);  
       Ptr<Packet> p = Create<Packet> (1024);
 
-      //NS_LOG_UNCOND ("timing new style pcap file write of 1K packet");
-      //NS_LOG_UNCOND ("g_addheader = " << g_addheader);
-      //NS_LOG_UNCOND ("g_passheader = " << g_passheader);
-      //NS_LOG_UNCOND ("n = " << n);
-
-      SystemWallClockMs ms;
-      ms.Start ();
+      g_header.SetTsft (0);
+      g_header.SetFrameFlags (RadiotapHeader::FRAME_FLAG_SHORT_PREAMBLE);
+      g_header.SetRate (0);
+      g_header.SetChannelFrequencyAndFlags (0, 0);
 
-      for (uint32_t i = 0; i < n; ++i)
+      //
+      // This will probably run on a machine doing other things.  Run it some
+      // relatively large number of times and try to find a minimum, which
+      // will hopefully represent a time when it runs free of interference.
+      //
+      for (uint32_t i = 0; i < iter; ++i)
         {
-          WritePacket (file, p);
+          SystemWallClockMs ms;
+          ms.Start ();
+          PerfPcapNew (file, p, n);
+          uint64_t et = ms.End ();
+          result = std::min (result, et);
+          std::cout << "."; std::cout.flush ();
         }
-
-      et = ms.End ();
+      std::cout << std::endl;
     }
-
-  //NS_LOG_UNCOND ("elapsed time = " << et);
+  std::cout << "perf-pcap: " << result << "ms" << std::endl;
 }
--- a/src/wscript	Mon Feb 01 08:29:57 2010 -0800
+++ b/src/wscript	Mon Feb 01 13:10:31 2010 -0800
@@ -140,7 +140,7 @@
                 raise Utils.WafError("source ns3 header file %s not found" % (filename,))
             dst_node = ns3_dir_node.find_or_declare(os.path.basename(filename))
             assert dst_node is not None
-            task = self.create_task('ns3header', self.env)
+            task = self.create_task('ns3header', env=self.env)
             task.set_inputs([src_node])
             task.set_outputs([dst_node])
 
@@ -245,7 +245,7 @@
         module_obj = self.bld.name_to_obj("ns3-" + self.module, self.env)
         assert module_obj is not None
         all_headers_outputs = [ns3_dir_node.find_or_declare("%s-module.h" % self.module)]
-        task = self.create_task('gen_ns3_module_header', self.env)
+        task = self.create_task('gen_ns3_module_header', env=self.env)
         task.set_inputs(all_headers_inputs)
         task.set_outputs(all_headers_outputs)
         task.module = self.module
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/utils/check-style.py	Mon Feb 01 13:10:31 2010 -0800
@@ -0,0 +1,439 @@
+#!/usr/bin/env python
+
+import os
+import subprocess
+import tempfile
+import sys
+import filecmp
+import optparse
+import shutil
+import difflib
+import re
+
+def hg_modified_files():
+    files = os.popen ('hg st -nma')
+    return [filename.strip() for filename in files]
+
+def copy_file(filename):
+    [tmp,pathname] = tempfile.mkstemp()
+    src = open(filename, 'r')
+    dst = open(pathname, 'w')
+    for line in src:
+        dst.write(line)
+    dst.close()
+    src.close()
+    return pathname
+
+# generate a temporary configuration file
+def uncrustify_config_file(level):
+    level2 = """
+nl_collapse_empty_body=False
+nl_if_brace=Add
+nl_brace_else=Add
+nl_elseif_brace=Add
+nl_else_brace=Add
+nl_while_brace=Add
+nl_do_brace=Add
+nl_for_brace=Add
+nl_brace_while=Add
+nl_switch_brace=Add
+nl_after_case=True
+nl_namespace_brace=Remove
+nl_after_brace_open=True
+nl_class_leave_one_liners=False
+nl_enum_leave_one_liners=False
+nl_func_leave_one_liners=False
+nl_if_leave_one_liners=False
+nl_class_colon=Ignore
+nl_after_access_spec=1
+nl_after_semicolon=True
+pos_class_colon=Lead
+pos_class_comma=Trail
+pos_bool=Lead
+nl_class_init_args=Add
+nl_template_class=Add
+nl_class_brace=Add
+# does not work very well
+nl_func_type_name=Ignore
+nl_func_scope_name=Ignore
+nl_func_type_name_class=Ignore
+nl_func_proto_type_name=Ignore
+# function\\n(
+nl_func_paren=Remove
+nl_fdef_brace=Add
+nl_struct_brace=Add
+nl_enum_brace=Add
+nl_union_brace=Add
+mod_full_brace_do=Add
+mod_full_brace_for=Add
+mod_full_brace_if=Add
+mod_full_brace_while=Add
+mod_full_brace_for=Add
+mod_remove_extra_semicolon=True
+# max code width
+#code_width=128
+#ls_for_split_full=True
+#ls_func_split_full=True
+"""
+    level1 = """
+# extra spaces here and there
+sp_func_proto_paren=Add
+sp_func_def_paren=Add
+sp_func_call_paren=Add
+sp_brace_typedef=Add
+sp_enum_assign=Add
+sp_before_sparen=Add
+sp_after_semi_for=Add
+sp_arith=Add
+sp_assign=Add
+sp_compare=Add
+sp_cmt_cpp_start=Add
+sp_func_class_paren=Add
+sp_after_type=Add
+sp_type_func=Add
+sp_angle_paren=Add
+"""
+    level0 = """
+sp_after_semi_for=Ignore
+sp_before_sparen=Ignore
+sp_type_func=Ignore
+sp_after_type=Ignore
+nl_class_leave_one_liners=True
+nl_enum_leave_one_liners=True
+nl_func_leave_one_liners=True
+nl_assign_leave_one_liners=True
+#nl_collapse_empty_body=False
+nl_getset_leave_one_liners=True
+nl_if_leave_one_liners=True
+nl_fdef_brace=Ignore
+# finally, indentation configuration
+indent_with_tabs=0
+indent_namespace=false
+indent_columns=2
+indent_brace=2
+indent_case_brace=2
+indent_class=true
+indent_class_colon=True
+# alignment
+indent_align_assign=False
+align_left_shift=True
+# comment reformating disabled
+cmt_reflow_mode=1 # do not touch comments at all
+cmt_indent_multi=False # really, do not touch them
+"""
+    [tmp,pathname] = tempfile.mkstemp()
+    dst = open(pathname, 'w')
+    dst.write(level0)
+    if level >= 1:
+        dst.write(level1)
+    if level >= 2:
+        dst.write(level2)
+    dst.close()
+    return pathname
+
+class PatchChunkLine:
+    SRC = 1
+    DST = 2
+    BOTH = 3
+    def __init__(self):
+        self.__type = 0
+        self.__line = ''
+    def set_src(self,line):
+        self.__type = self.SRC
+        self.__line = line
+    def set_dst(self,line):
+        self.__type = self.DST
+        self.__line = line
+    def set_both(self,line):
+        self.__type = self.BOTH
+        self.__line = line
+    def append_to_line(self, s):
+        self.__line = self.__line + s
+    def line(self):
+        return self.__line
+    def is_src(self):
+        return self.__type == self.SRC or self.__type == self.BOTH
+    def is_dst(self):
+        return self.__type == self.DST or self.__type == self.BOTH
+    def write(self, f):
+        if self.__type == self.SRC:
+            f.write('-%s\n' % self.__line)
+        elif self.__type == self.DST:
+            f.write('+%s\n' % self.__line)
+        elif self.__type == self.BOTH:
+            f.write(' %s\n' % self.__line)
+        else:
+            raise Exception('invalid patch')
+    
+
+class PatchChunk:
+    def __init__(self, src_pos, dst_pos):
+        self.__lines = []
+        self.__src_pos = int(src_pos)
+        self.__dst_pos = int(dst_pos)
+    def src_start(self):
+        return self.__src_pos
+    def add_line(self,line):
+        self.__lines.append(line)
+    def src(self):
+        src = []
+        for line in self.__lines:
+            if line.is_src():
+                src.append(line)
+        return src
+    def dst(self):
+        dst = []
+        for line in self.__lines:
+            if line.is_dst():
+                dst.append(line)
+        return dst
+    def src_len(self):
+        return len(self.src())
+    def dst_len(self):
+        return len(self.dst())
+    def write(self,f):
+        f.write('@@ -%d,%d +%d,%d @@\n' % (self.__src_pos, self.src_len(),
+                                           self.__dst_pos, self.dst_len()))
+        for line in self.__lines:
+            line.write(f)
+
+class Patch:
+    def __init__(self):
+        self.__src = ''
+        self.__dst = ''
+        self.__chunks = []
+    def add_chunk(self, chunk):
+        self.__chunks.append(chunk)
+    def chunks(self):
+        return self.__chunks
+    def set_src(self,src):
+        self.__src = src
+    def set_dst(self,dst):
+        self.__dst = dst
+    def apply(self,filename):
+        # XXX: not implemented
+        return
+    def write(self,f):
+        f.write('--- %s\n' % self.__src )
+        f.write('+++ %s\n' % self.__dst )
+        for chunk in self.__chunks:
+            chunk.write(f)
+
+def parse_patchset(generator):
+    src_file = re.compile('^--- (.*)$')
+    dst_file = re.compile('^\+\+\+ (.*)$')
+    chunk_start = re.compile('^@@ -([0-9]+),([0-9]+) \+([0-9]+),([0-9]+) @@')
+    src = re.compile('^-(.*)$')
+    dst = re.compile('^\+(.*)$')
+    both = re.compile('^ (.*)$')
+    patchset = []
+    current_patch = None
+    for line in generator:
+        m = src_file.search(line)
+        if m is not None:
+            current_patch = Patch()
+            patchset.append(current_patch)
+            current_patch.set_src(m.group(1))
+            continue
+        m = dst_file.search(line)
+        if m is not None:
+            current_patch.set_dst(m.group(1))
+            continue
+        m = chunk_start.search(line)
+        if m is not None:
+            current_chunk = PatchChunk(m.group(1), m.group(3))
+            current_patch.add_chunk(current_chunk)
+            continue
+        m = src.search(line)
+        if m is not None:
+            l = PatchChunkLine()
+            l.set_src(m.group(1))
+            current_chunk.add_line(l)
+            continue
+        m = dst.search(line)
+        if m is not None:
+            l = PatchChunkLine()
+            l.set_dst(m.group(1))
+            current_chunk.add_line(l)
+            continue
+        m = both.search(line)
+        if m is not None:
+            l = PatchChunkLine()
+            l.set_both(m.group(1))
+            current_chunk.add_line(l)
+            continue
+        raise Exception()
+    return patchset
+
+def remove_trailing_whitespace_changes(patch_generator):
+    whitespace = re.compile('^(.*)([ \t]+)$')
+    patchset = parse_patchset(patch_generator)
+    for patch in patchset:
+        for chunk in patch.chunks():
+            src = chunk.src()
+            dst = chunk.dst()
+            try:
+                for i in range(0,len(src)):
+                    s = src[i]
+                    d = dst[i]
+                    m = whitespace.search(s.line())
+                    if m is not None and m.group(1) == d.line():
+                        d.append_to_line(m.group(2))
+            except:
+                return patchset
+    return patchset
+
+
+def indent(source, debug, level):
+    output = tempfile.mkstemp()[1]
+    # apply uncrustify
+    cfg = uncrustify_config_file(level)
+    if debug:
+        sys.stderr.write('original file=' + source + '\n')
+        sys.stderr.write('uncrustify config file=' + cfg + '\n')
+        sys.stderr.write('temporary file=' + output + '\n')
+    try:
+        uncrust = subprocess.Popen(['uncrustify', '-c', cfg, '-f', source, '-o', output],
+                                   stdin = subprocess.PIPE,
+                                   stdout = subprocess.PIPE,
+                                   stderr = subprocess.PIPE)
+        (out, err) = uncrust.communicate('')
+        if debug:
+            sys.stderr.write(out)
+            sys.stderr.write(err)
+    except OSError:
+        raise Exception ('uncrustify not installed')
+    # generate a diff file
+    src = open(source, 'r')
+    dst = open(output, 'r')
+    diff = difflib.unified_diff(src.readlines(), dst.readlines(), 
+                                fromfile=source, tofile=output)
+    src.close()
+    dst.close()
+    if debug:
+        initial_diff = tempfile.mkstemp()[1]
+        sys.stderr.write('initial diff file=' + initial_diff + '\n')
+        tmp = open(initial_diff, 'w')
+        tmp.writelines(diff)
+        tmp.close()
+    final_diff = tempfile.mkstemp()[1]
+    if level < 3:
+        patchset = remove_trailing_whitespace_changes(diff);
+        dst = open(final_diff, 'w')
+        if len(patchset) != 0:
+            patchset[0].write(dst)
+        dst.close()
+    else:
+        dst = open(final_diff, 'w')
+        dst.writelines(diff)
+        dst.close()
+            
+            
+    # apply diff file
+    if debug:
+        sys.stderr.write('final diff file=' + final_diff + '\n')
+    shutil.copyfile(source,output)
+    patch = subprocess.Popen(['patch', '-p1', '-i', final_diff, output],
+                             stdin = subprocess.PIPE,
+                             stdout = subprocess.PIPE,
+                             stderr = subprocess.PIPE)
+    (out, err) = patch.communicate('')
+    if debug:
+        sys.stderr.write(out)
+        sys.stderr.write(err)
+    return output
+ 
+
+
+def indent_files(files, diff=False, debug=False, level=0, inplace=False):
+    output = []
+    for f in files:
+        dst = indent(f, debug=debug, level=level)
+        output.append([f,dst])
+
+    # First, copy to inplace
+    if inplace:
+        for src,dst in output:
+            shutil.copyfile(dst,src)
+        return True
+
+    # now, compare
+    failed = []
+    for src,dst in output:
+        if filecmp.cmp(src,dst) == 0:
+            failed.append([src, dst])
+    if len(failed) > 0:
+        if not diff:
+            print 'Found %u badly indented files:' % len(failed)
+            for src,dst in failed:
+                print '  ' + src
+        else:
+            for src,dst in failed:
+                s = open(src, 'r').readlines()
+                d = open(dst, 'r').readlines()
+                for line in difflib.unified_diff(s, d, fromfile=src, tofile=dst):
+                    sys.stdout.write(line)
+        return False
+    return True
+
+def run_as_hg_hook(ui, repo, **kwargs):
+    # hack to work around mercurial < 1.3 bug
+    from mercurial import lock, error
+    lock.LockError = error.LockError
+    # actually do the work
+    files = hg_modified_files()
+    if not indent_files(files, inplace=False):
+        return True
+    return False
+
+def run_as_main():
+    parser = optparse.OptionParser()
+    parser.add_option('--debug', action='store_true', dest='debug', default=False,
+                      help='Output some debugging information')
+    parser.add_option('-l', '--level', type='int', dest='level', default=0,
+                      help="Level of style conformance: higher levels include all lower levels. "
+                      "level=0: re-indent only. level=1: add extra spaces. level=2: insert extra newlines and "
+                      "extra braces around single-line statements. level=3: remove all trailing spaces")
+    parser.add_option('--check-hg-hook', action='store_true', dest='hg_hook', default=False, 
+                      help='Get the list of files to check from mercurial\'s list of modified '
+                      'and added files and assume that the script runs as a pretxncommit mercurial hook')
+    parser.add_option('--check-hg', action='store_true', dest='hg', default=False,
+                      help="Get the list of files to check from mercurial\'s list of modified and added files")
+    parser.add_option('-f', '--check-file', action='store', dest='file', default='',
+                      help="Check a single file")
+    parser.add_option('--diff', action='store_true', dest='diff', default=False,
+                      help="Generate a diff on stdout of the indented files")
+    parser.add_option('-i', '--in-place', action='store_true', dest='in_place', default=False,
+                      help="Indent the input files in-place")
+    (options,args) = parser.parse_args()
+    debug = options.debug
+    if options.hg_hook:
+        files = hg_modified_files()
+        if not indent_files(files, debug=options.debug,
+                            level=options.level,
+                            inplace=False):
+            sys.exit(1)
+    elif options.hg:
+        files = hg_modified_files()
+        indent_files(files, diff=options.diff, 
+                     debug=options.debug,
+                     level=options.level,
+                     inplace=options.in_place)
+    elif options.file != '':
+        file = options.file
+        if not os.path.exists(file) or \
+                not os.path.isfile(file):
+            print 'file %s does not exist' % file
+            sys.exit(1)
+        indent_files([file], diff=options.diff, 
+                     debug=options.debug,
+                     level=options.level,
+                     inplace=options.in_place)
+    sys.exit(0)
+
+if __name__ == '__main__':
+#    try:
+        run_as_main()
+#    except Exception, e:
+#        sys.stderr.write(str(e) + '\n')
+#        sys.exit(1)
Binary file waf has changed