From 0f11a5208f48ff352476f7ce6a791fda77c63f38 Mon Sep 17 00:00:00 2001
From: Fabian Mauchle
Date: Sun, 31 Jan 2010 15:17:09 -0500
Subject: [PATCH 01/12] Fix bug 747: Listening TCP socket closes on RST
---
src/internet-stack/tcp-socket-impl.cc | 25 +++++++------------------
1 file changed, 7 insertions(+), 18 deletions(-)
diff --git a/src/internet-stack/tcp-socket-impl.cc b/src/internet-stack/tcp-socket-impl.cc
index 58ef5cb65..28ae5958c 100644
--- a/src/internet-stack/tcp-socket-impl.cc
+++ b/src/internet-stack/tcp-socket-impl.cc
@@ -677,16 +677,6 @@ TcpSocketImpl::ForwardUp (Ptr packet, Ipv4Address ipv4, uint16_t port)
TcpHeader tcpHeader;
packet->RemoveHeader (tcpHeader);
- if (tcpHeader.GetFlags () & TcpHeader::RST)
- { // Got an RST, just shut everything down
- NotifyErrorClose();
- CancelAllTimers();
- m_endPoint->SetDestroyCallback(MakeNullCallback());
- 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 @@ Actions_t TcpSocketImpl::ProcessEvent (Events_t e)
// class intended to be a singleton; see simulation-singleton.h
SA stateAction = SimulationSingleton::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 @@ bool TcpSocketImpl::ProcessPacketAction (Actions_t a, Ptr p,
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)
From 78a78ba642796a9184184f104d68bbf7d21c5d41 Mon Sep 17 00:00:00 2001
From: Josh Pelkey
Date: Sun, 31 Jan 2010 15:59:26 -0500
Subject: [PATCH 02/12] Bug 788: OLSR_NEIGH_HOLD_TIME should be 3 times
OLSR_REFRESH_INTERVAL
---
src/routing/olsr/olsr-routing-protocol.cc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/routing/olsr/olsr-routing-protocol.cc b/src/routing/olsr/olsr-routing-protocol.cc
index 5c3873703..45d9e91ce 100644
--- a/src/routing/olsr/olsr-routing-protocol.cc
+++ b/src/routing/olsr/olsr-routing-protocol.cc
@@ -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.
From 5f7d08d7b330d45b99ad80a2f920440bec9bf8da Mon Sep 17 00:00:00 2001
From: Josh Pelkey
Date: Sun, 31 Jan 2010 16:19:23 -0500
Subject: [PATCH 03/12] Update release notes and changes for ns-3.8
---
CHANGES.html | 20 ++++++++++++++++++++
RELEASE_NOTES | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 70 insertions(+)
diff --git a/CHANGES.html b/CHANGES.html
index 3c7157cde..5aa200adf 100644
--- a/CHANGES.html
+++ b/CHANGES.html
@@ -43,6 +43,26 @@ the cracks, unfortunately. If you, as a user, can suggest improvements
to this file based on your experience, please contribute a patch or drop
us a note on ns-developers mailing list.
+
+Changes from ns-3.7 to ns-3.8
+
+
+Changes to build system:
+
+New API:
+
+
+
+Changes to existing API:
+
+
+Changed behavior:
+
+
+
Changes from ns-3.6 to ns-3.7
diff --git a/RELEASE_NOTES b/RELEASE_NOTES
index 850888710..d0ddea175 100644
--- a/RELEASE_NOTES
+++ b/RELEASE_NOTES
@@ -9,6 +9,56 @@ http://www.nsnam.org including tutorials: http://www.nsnam.org/tutorials.html
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
===========
From ca62de0e8d093d41f3222b1a85bc6ce5f70215f2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Antti=20M=C3=A4kel=C3=A4?=
Date: Sun, 31 Jan 2010 20:38:35 -0800
Subject: [PATCH 04/12] [bug 789] Globalrouting externalroutes to use the new
GetRootExitDirections()
---
.../global-route-manager-impl.cc | 39 ++++++++++---------
1 file changed, 21 insertions(+), 18 deletions(-)
diff --git a/src/routing/global-routing/global-route-manager-impl.cc b/src/routing/global-routing/global-route-manager-impl.cc
index 513e004c8..39c55b435 100644
--- a/src/routing/global-routing/global-route-manager-impl.cc
+++ b/src/routing/global-routing/global-route-manager-impl.cc
@@ -1637,11 +1637,6 @@ GlobalRouteManagerImpl::SPFAddASExternal (GlobalRoutingLSA *extlsa, SPFVertex *v
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 +1657,28 @@ GlobalRouteManagerImpl::SPFAddASExternal (GlobalRoutingLSA *extlsa, SPFVertex *v
}
Ptr 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
From fc09faa916cdf35e704e41b2964c37921b1c587d Mon Sep 17 00:00:00 2001
From: Tom Henderson
Date: Sun, 31 Jan 2010 20:45:28 -0800
Subject: [PATCH 05/12] Remove deprecated, non-exported API from class
SPFVertex
---
.../global-route-manager-impl.cc | 47 -----
.../global-route-manager-impl.h | 177 ------------------
2 files changed, 224 deletions(-)
diff --git a/src/routing/global-routing/global-route-manager-impl.cc b/src/routing/global-routing/global-route-manager-impl.cc
index 39c55b435..9051a640b 100644
--- a/src/routing/global-routing/global-route-manager-impl.cc
+++ b/src/routing/global-routing/global-route-manager-impl.cc
@@ -222,53 +222,6 @@ SPFVertex::GetDistanceFromRoot (void) const
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)
{
diff --git a/src/routing/global-routing/global-route-manager-impl.h b/src/routing/global-routing/global-route-manager-impl.h
index 4befa1d6a..46aebbe52 100644
--- a/src/routing/global-routing/global-route-manager-impl.h
+++ b/src/routing/global-routing/global-route-manager-impl.h
@@ -255,183 +255,6 @@ public:
*/
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.
From 627da1a2cbb31fff7461f9d8ce9c4495ca83d2d9 Mon Sep 17 00:00:00 2001
From: Mathieu Lacage
Date: Mon, 1 Feb 2010 08:04:41 +0100
Subject: [PATCH 06/12] enforce that style conforms to our coding style
---
utils/check-style.py | 439 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 439 insertions(+)
create mode 100755 utils/check-style.py
diff --git a/utils/check-style.py b/utils/check-style.py
new file mode 100755
index 000000000..2544e3091
--- /dev/null
+++ b/utils/check-style.py
@@ -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)
From 4811680d2a4416cd20795f9284c067d703042de2 Mon Sep 17 00:00:00 2001
From: Mathieu Lacage
Date: Mon, 1 Feb 2010 08:28:11 +0100
Subject: [PATCH 07/12] avoid copying bytes one after the other.
---
src/common/buffer.cc | 32 ++++++++++++++++++++++++++++++++
src/common/buffer.h | 2 ++
src/common/packet.cc | 9 +--------
3 files changed, 35 insertions(+), 8 deletions(-)
diff --git a/src/common/buffer.cc b/src/common/buffer.cc
index 7f1ee2f5f..cc1f107d3 100644
--- a/src/common/buffer.cc
+++ b/src/common/buffer.cc
@@ -726,6 +726,38 @@ Buffer::CopyData(std::ostream *os, uint32_t size) const
}
}
+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.
******************************************************/
diff --git a/src/common/buffer.h b/src/common/buffer.h
index 4d542251f..33d32b9d2 100644
--- a/src/common/buffer.h
+++ b/src/common/buffer.h
@@ -487,6 +487,8 @@ public:
*/
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 ();
diff --git a/src/common/packet.cc b/src/common/packet.cc
index 244c26e6f..8f48811a7 100644
--- a/src/common/packet.cc
+++ b/src/common/packet.cc
@@ -350,14 +350,7 @@ Packet::PeekData (void) const
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
From 54c4309174dbf5a9f421bf276976cae633dd86d7 Mon Sep 17 00:00:00 2001
From: Mathieu Lacage
Date: Mon, 1 Feb 2010 08:32:34 +0100
Subject: [PATCH 08/12] add missing doxygen
---
src/common/packet.h | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/src/common/packet.h b/src/common/packet.h
index 0fdff7efb..cf0883400 100644
--- a/src/common/packet.h
+++ b/src/common/packet.h
@@ -202,7 +202,6 @@ private:
class Packet : public SimpleRefCount
{
public:
- Ptr Copy (void) const;
/**
* Create an empty packet with a new uid (as returned
@@ -346,8 +345,23 @@ public:
*/
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 Copy (void) const;
+
/**
* A packet is allocated a new uid when it is created
* empty or with zero-filled payload.
@@ -377,6 +391,14 @@ public:
*/
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;
/**
From 668e97a7dc46c50ae953f2fe57e3a0ddaecc0377 Mon Sep 17 00:00:00 2001
From: "Gustavo J. A. M. Carneiro"
Date: Mon, 1 Feb 2010 13:04:34 +0000
Subject: [PATCH 09/12] Upgrade to a newer pybindgen version with support for
multiple-inheritance
---
bindings/python/wscript | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bindings/python/wscript b/bindings/python/wscript
index 5bb703dea..8ca543b19 100644
--- a/bindings/python/wscript
+++ b/bindings/python/wscript
@@ -15,7 +15,7 @@ import Build
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)
From fa398a074e02ec59edf419fbf423dc6d80d7663f Mon Sep 17 00:00:00 2001
From: "Gustavo J. A. M. Carneiro"
Date: Mon, 1 Feb 2010 13:04:45 +0000
Subject: [PATCH 10/12] Rescan python bindings
---
.../apidefs/gcc-ILP32/ns3_module_common.py | 5 ++
.../gcc-ILP32/ns3_module_internet_stack.py | 80 +++++++++++++++++
.../apidefs/gcc-ILP32/ns3_module_stats.py | 87 +++++++++++++++++++
.../apidefs/gcc-ILP32/ns3_module_wifi.py | 7 +-
.../apidefs/gcc-LP64/ns3_module_common.py | 5 ++
.../gcc-LP64/ns3_module_internet_stack.py | 80 +++++++++++++++++
.../apidefs/gcc-LP64/ns3_module_stats.py | 87 +++++++++++++++++++
.../apidefs/gcc-LP64/ns3_module_wifi.py | 7 +-
8 files changed, 356 insertions(+), 2 deletions(-)
diff --git a/bindings/python/apidefs/gcc-ILP32/ns3_module_common.py b/bindings/python/apidefs/gcc-ILP32/ns3_module_common.py
index 0af5e4294..7c6c2b706 100644
--- a/bindings/python/apidefs/gcc-ILP32/ns3_module_common.py
+++ b/bindings/python/apidefs/gcc-ILP32/ns3_module_common.py
@@ -216,6 +216,11 @@ def register_Ns3Buffer_methods(root_module, cls):
'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',
diff --git a/bindings/python/apidefs/gcc-ILP32/ns3_module_internet_stack.py b/bindings/python/apidefs/gcc-ILP32/ns3_module_internet_stack.py
index 4783572d1..d88638c46 100644
--- a/bindings/python/apidefs/gcc-ILP32/ns3_module_internet_stack.py
+++ b/bindings/python/apidefs/gcc-ILP32/ns3_module_internet_stack.py
@@ -59,6 +59,8 @@ def register_types(module):
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 @@ def register_types(module):
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 @@ def register_methods(root_module):
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 @@ def register_methods(root_module):
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 @@ def register_Ns3Ipv6ExtensionHeader_methods(root_module, cls):
[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 @@ def register_Ns3Ipv6ExtensionAHHeader_methods(root_module, cls):
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')])
diff --git a/bindings/python/apidefs/gcc-ILP32/ns3_module_stats.py b/bindings/python/apidefs/gcc-ILP32/ns3_module_stats.py
index cb6915c12..43d9aae49 100644
--- a/bindings/python/apidefs/gcc-ILP32/ns3_module_stats.py
+++ b/bindings/python/apidefs/gcc-ILP32/ns3_module_stats.py
@@ -13,8 +13,12 @@ def register_types(module):
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 [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 @@ def register_methods(root_module):
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 @@ def register_Ns3DataOutputInterface_methods(root_module, cls):
visibility='protected', is_virtual=True)
return
+def register_Ns3MinMaxAvgTotalCalculator__Unsigned_int_methods(root_module, cls):
+ ## basic-data-calculators.h: ns3::MinMaxAvgTotalCalculator::MinMaxAvgTotalCalculator(ns3::MinMaxAvgTotalCalculator const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::MinMaxAvgTotalCalculator< unsigned int > const &', 'arg0')])
+ ## basic-data-calculators.h: ns3::MinMaxAvgTotalCalculator::MinMaxAvgTotalCalculator() [constructor]
+ cls.add_constructor([])
+ ## basic-data-calculators.h: void ns3::MinMaxAvgTotalCalculator::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::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::getCount() const [member function]
+ cls.add_method('getCount',
+ 'long int',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getMax() const [member function]
+ cls.add_method('getMax',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getMean() const [member function]
+ cls.add_method('getMean',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getMin() const [member function]
+ cls.add_method('getMin',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getSqrSum() const [member function]
+ cls.add_method('getSqrSum',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getStddev() const [member function]
+ cls.add_method('getStddev',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getSum() const [member function]
+ cls.add_method('getSum',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getVariance() const [member function]
+ cls.add_method('getVariance',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: void ns3::MinMaxAvgTotalCalculator::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 @@ def register_Ns3OmnetDataOutput_methods(root_module, cls):
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 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 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')])
diff --git a/bindings/python/apidefs/gcc-ILP32/ns3_module_wifi.py b/bindings/python/apidefs/gcc-ILP32/ns3_module_wifi.py
index 836625a43..f07add6c9 100644
--- a/bindings/python/apidefs/gcc-ILP32/ns3_module_wifi.py
+++ b/bindings/python/apidefs/gcc-ILP32/ns3_module_wifi.py
@@ -46,7 +46,7 @@ def register_types(module):
## wifi-mode.h: ns3::WifiMode [class]
module.add_class('WifiMode')
## wifi-mode.h: ns3::WifiMode::ModulationType [enumeration]
- module.add_enum('ModulationType', ['BPSK', 'DBPSK', 'DQPSK', 'QAM', 'UNKNOWN'], outer_class=root_module['ns3::WifiMode'])
+ module.add_enum('ModulationType', ['BPSK', 'QPSK', 'DBPSK', 'DQPSK', 'QAM', 'UNKNOWN'], outer_class=root_module['ns3::WifiMode'])
## wifi-mode.h: ns3::WifiModeFactory [class]
module.add_class('WifiModeFactory')
## wifi-phy.h: ns3::WifiPhyListener [class]
@@ -1093,6 +1093,11 @@ def register_Ns3WifiModeFactory_methods(root_module, cls):
'ns3::WifiMode',
[param('std::string', 'uniqueName'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('uint32_t', 'phyRate'), param('uint8_t', 'constellationSize'), param('ns3::WifiPhyStandard', 'standard')],
is_static=True)
+ ## wifi-mode.h: static ns3::WifiMode ns3::WifiModeFactory::CreateQpsk(std::string uniqueName, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, uint32_t phyRate, ns3::WifiPhyStandard standard) [member function]
+ cls.add_method('CreateQpsk',
+ 'ns3::WifiMode',
+ [param('std::string', 'uniqueName'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('uint32_t', 'phyRate'), param('ns3::WifiPhyStandard', 'standard')],
+ is_static=True)
return
def register_Ns3WifiPhyListener_methods(root_module, cls):
diff --git a/bindings/python/apidefs/gcc-LP64/ns3_module_common.py b/bindings/python/apidefs/gcc-LP64/ns3_module_common.py
index 0af5e4294..7c6c2b706 100644
--- a/bindings/python/apidefs/gcc-LP64/ns3_module_common.py
+++ b/bindings/python/apidefs/gcc-LP64/ns3_module_common.py
@@ -216,6 +216,11 @@ def register_Ns3Buffer_methods(root_module, cls):
'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',
diff --git a/bindings/python/apidefs/gcc-LP64/ns3_module_internet_stack.py b/bindings/python/apidefs/gcc-LP64/ns3_module_internet_stack.py
index 4783572d1..d88638c46 100644
--- a/bindings/python/apidefs/gcc-LP64/ns3_module_internet_stack.py
+++ b/bindings/python/apidefs/gcc-LP64/ns3_module_internet_stack.py
@@ -59,6 +59,8 @@ def register_types(module):
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 @@ def register_types(module):
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 @@ def register_methods(root_module):
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 @@ def register_methods(root_module):
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 @@ def register_Ns3Ipv6ExtensionHeader_methods(root_module, cls):
[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 @@ def register_Ns3Ipv6ExtensionAHHeader_methods(root_module, cls):
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')])
diff --git a/bindings/python/apidefs/gcc-LP64/ns3_module_stats.py b/bindings/python/apidefs/gcc-LP64/ns3_module_stats.py
index cb6915c12..43d9aae49 100644
--- a/bindings/python/apidefs/gcc-LP64/ns3_module_stats.py
+++ b/bindings/python/apidefs/gcc-LP64/ns3_module_stats.py
@@ -13,8 +13,12 @@ def register_types(module):
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 [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 @@ def register_methods(root_module):
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 @@ def register_Ns3DataOutputInterface_methods(root_module, cls):
visibility='protected', is_virtual=True)
return
+def register_Ns3MinMaxAvgTotalCalculator__Unsigned_int_methods(root_module, cls):
+ ## basic-data-calculators.h: ns3::MinMaxAvgTotalCalculator::MinMaxAvgTotalCalculator(ns3::MinMaxAvgTotalCalculator const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::MinMaxAvgTotalCalculator< unsigned int > const &', 'arg0')])
+ ## basic-data-calculators.h: ns3::MinMaxAvgTotalCalculator::MinMaxAvgTotalCalculator() [constructor]
+ cls.add_constructor([])
+ ## basic-data-calculators.h: void ns3::MinMaxAvgTotalCalculator::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::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::getCount() const [member function]
+ cls.add_method('getCount',
+ 'long int',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getMax() const [member function]
+ cls.add_method('getMax',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getMean() const [member function]
+ cls.add_method('getMean',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getMin() const [member function]
+ cls.add_method('getMin',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getSqrSum() const [member function]
+ cls.add_method('getSqrSum',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getStddev() const [member function]
+ cls.add_method('getStddev',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getSum() const [member function]
+ cls.add_method('getSum',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: double ns3::MinMaxAvgTotalCalculator::getVariance() const [member function]
+ cls.add_method('getVariance',
+ 'double',
+ [],
+ is_const=True, is_virtual=True)
+ ## basic-data-calculators.h: void ns3::MinMaxAvgTotalCalculator::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 @@ def register_Ns3OmnetDataOutput_methods(root_module, cls):
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 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 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')])
diff --git a/bindings/python/apidefs/gcc-LP64/ns3_module_wifi.py b/bindings/python/apidefs/gcc-LP64/ns3_module_wifi.py
index 836625a43..f07add6c9 100644
--- a/bindings/python/apidefs/gcc-LP64/ns3_module_wifi.py
+++ b/bindings/python/apidefs/gcc-LP64/ns3_module_wifi.py
@@ -46,7 +46,7 @@ def register_types(module):
## wifi-mode.h: ns3::WifiMode [class]
module.add_class('WifiMode')
## wifi-mode.h: ns3::WifiMode::ModulationType [enumeration]
- module.add_enum('ModulationType', ['BPSK', 'DBPSK', 'DQPSK', 'QAM', 'UNKNOWN'], outer_class=root_module['ns3::WifiMode'])
+ module.add_enum('ModulationType', ['BPSK', 'QPSK', 'DBPSK', 'DQPSK', 'QAM', 'UNKNOWN'], outer_class=root_module['ns3::WifiMode'])
## wifi-mode.h: ns3::WifiModeFactory [class]
module.add_class('WifiModeFactory')
## wifi-phy.h: ns3::WifiPhyListener [class]
@@ -1093,6 +1093,11 @@ def register_Ns3WifiModeFactory_methods(root_module, cls):
'ns3::WifiMode',
[param('std::string', 'uniqueName'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('uint32_t', 'phyRate'), param('uint8_t', 'constellationSize'), param('ns3::WifiPhyStandard', 'standard')],
is_static=True)
+ ## wifi-mode.h: static ns3::WifiMode ns3::WifiModeFactory::CreateQpsk(std::string uniqueName, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, uint32_t phyRate, ns3::WifiPhyStandard standard) [member function]
+ cls.add_method('CreateQpsk',
+ 'ns3::WifiMode',
+ [param('std::string', 'uniqueName'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('uint32_t', 'phyRate'), param('ns3::WifiPhyStandard', 'standard')],
+ is_static=True)
return
def register_Ns3WifiPhyListener_methods(root_module, cls):
From c20ea3edb3e4e30b1d345f8ec885e644f6713b56 Mon Sep 17 00:00:00 2001
From: "Gustavo J. A. M. Carneiro"
Date: Mon, 1 Feb 2010 14:27:08 +0000
Subject: [PATCH 11/12] Upgrade waf from 1.5.9 to 1.5.11
---
bindings/python/wscript | 2 +-
src/wscript | 4 ++--
waf | Bin 86338 -> 88387 bytes
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/bindings/python/wscript b/bindings/python/wscript
index 8ca543b19..41e3a6407 100644
--- a/bindings/python/wscript
+++ b/bindings/python/wscript
@@ -346,7 +346,7 @@ class all_ns3_headers_taskgen(TaskGen.task_gen):
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)
diff --git a/src/wscript b/src/wscript
index 7b2b298ad..22b343d0e 100644
--- a/src/wscript
+++ b/src/wscript
@@ -138,7 +138,7 @@ class ns3header_taskgen(TaskGen.task_gen):
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])
@@ -243,7 +243,7 @@ class ns3moduleheader_taskgen(TaskGen.task_gen):
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
diff --git a/waf b/waf
index 65ab0a8e387f84b3765ad21b1e37c7657490182c..d99146fa4fdc035321b304f0f7e566e4f89b0269 100755
GIT binary patch
delta 85384
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