TcpNewReno is introduced in RFC 2582. The most recent RFC on this is the RFC 6582. Since its introduction, Tcp NewReno is the RECOMMENDED algorithm by the Internet Engineering Task Force. The main difference between Reno and New Reno is in the Fast retransmit algorithm, in order to recover more quickly when multiple packet losses occur in a single window. NewReno introduces the concept of Partial acknowledgments. Since the intention is to merge fast retransmit and fast recovery into TcpSocketBase, there isn't the possibility to maintain TcpReno as separate class. However, its behavior could be introduced again with one conditional attribute in TcpSocketBase itself.
356 lines
14 KiB
Python
356 lines
14 KiB
Python
## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
|
import os
|
|
import sys
|
|
|
|
from waflib import Options, Logs, Utils, Task
|
|
|
|
|
|
# Required NSC version
|
|
NSC_RELEASE_NAME = "nsc-0.5.3"
|
|
|
|
|
|
def options(opt):
|
|
opt.add_option('--with-nsc',
|
|
help=('Use Network Simulation Cradle, given by the indicated path,'
|
|
' to allow the use of real-world network stacks'),
|
|
default='', dest='with_nsc')
|
|
opt.add_option('--disable-nsc',
|
|
help=('Disable Network Simulation Cradle support'),
|
|
dest='disable_nsc', default=False, action="store_true")
|
|
|
|
def configure(conf):
|
|
conf.env['ENABLE_NSC'] = False
|
|
|
|
if Options.options.disable_nsc:
|
|
conf.report_optional_feature("nsc", "Network Simulation Cradle", False,
|
|
"disabled by user request")
|
|
return
|
|
|
|
# checks for flex and bison, which is needed to build NSCs globaliser
|
|
# TODO: how to move these checks into the allinone scripts?
|
|
#def check_nsc_buildutils():
|
|
# import flex
|
|
# import bison
|
|
# conf.check_tool('flex bison')
|
|
# conf.check(lib='fl', mandatory=True)
|
|
|
|
# Check for the location of NSC
|
|
lib_to_check = 'liblinux2.6.26.so'
|
|
if Options.options.with_nsc:
|
|
if os.path.isdir(Options.options.with_nsc):
|
|
conf.msg("Checking for NSC location", ("%s (given)" % Options.options.with_nsc))
|
|
conf.env['WITH_NSC'] = os.path.abspath(Options.options.with_nsc)
|
|
else:
|
|
# bake.py uses ../../build, while ns-3-dev uses ../nsc,
|
|
# and ns-3 release uses ../NSC_RELEASE_NAME
|
|
nsc_bake_build_dir = os.path.join('..', '..', 'build')
|
|
nsc_bake_lib_dir = os.path.join(nsc_bake_build_dir, 'lib')
|
|
nsc_dir = os.path.join('..', "nsc")
|
|
nsc_release_dir = os.path.join('..', NSC_RELEASE_NAME)
|
|
if os.path.exists(os.path.join(nsc_bake_lib_dir, lib_to_check)):
|
|
conf.msg("Checking for NSC location",("%s (guessed)" % nsc_bake_build_dir))
|
|
conf.env['WITH_NSC'] = os.path.abspath(nsc_bake_build_dir)
|
|
elif os.path.isdir(nsc_dir):
|
|
conf.msg("Checking for NSC location",("%s (guessed)" % nsc_dir))
|
|
conf.env['WITH_NSC'] = os.path.abspath(nsc_dir)
|
|
elif os.path.isdir(nsc_release_dir):
|
|
conf.msg("Checking for NSC location", ("%s (guessed)" % nsc_release_dir))
|
|
conf.env['WITH_NSC'] = os.path.abspath(nsc_release_dir)
|
|
del nsc_bake_build_dir
|
|
del nsc_bake_lib_dir
|
|
del nsc_dir
|
|
del nsc_release_dir
|
|
|
|
if not conf.env['WITH_NSC']:
|
|
conf.msg("Checking for NSC location", False)
|
|
conf.report_optional_feature("nsc", "Network Simulation Cradle", False,
|
|
"NSC not found (see option --with-nsc)")
|
|
return
|
|
|
|
if Options.platform in ['linux', 'freebsd']:
|
|
arch = os.uname()[4]
|
|
else:
|
|
arch = None
|
|
ok = False
|
|
if arch in ('amd64', 'x86_64', 'i686', 'i586', 'i486', 'i386'):
|
|
conf.env['NSC_ENABLED'] = True
|
|
conf.env.append_value('CXXDEFINES', 'NETWORK_SIMULATION_CRADLE')
|
|
conf.check_nonfatal(mandatory=True, lib='dl', define_name='HAVE_DL', uselib_store='DL')
|
|
ok = True
|
|
conf.msg('Checking for NSC supported architecture ' + (arch or ''), ok)
|
|
|
|
if not ok:
|
|
conf.env['NSC_ENABLED'] = False
|
|
conf.report_optional_feature("nsc", "Network Simulation Cradle", False,
|
|
"architecture %r not supported" % arch)
|
|
return
|
|
|
|
found = False
|
|
for path in ['.', 'lib', 'lib64', 'linux-2.6.26']:
|
|
if os.path.exists(os.path.join(conf.env['WITH_NSC'], path, lib_to_check)):
|
|
# append the NSC kernel dir to the module path so that this dir
|
|
# will end up in the LD_LIBRARY_PATH, thus allowing the NSC NS-3
|
|
# module to find the necessary NSC shared libraries.
|
|
found = True
|
|
conf.env.append_value('NS3_MODULE_PATH',
|
|
os.path.abspath(os.path.join(conf.env['WITH_NSC'], path)))
|
|
if not found:
|
|
conf.env['NSC_ENABLED'] = False
|
|
conf.report_optional_feature("nsc", "Network Simulation Cradle", False,
|
|
"NSC library %s is missing: NSC has not been built?" % lib_to_check)
|
|
else:
|
|
conf.report_optional_feature("nsc", "Network Simulation Cradle", True, "")
|
|
|
|
|
|
def build(bld):
|
|
# bridge and mpi dependencies are due to global routing
|
|
obj = bld.create_ns3_module('internet', ['bridge', 'mpi', 'network', 'core'])
|
|
obj.source = [
|
|
'model/ip-l4-protocol.cc',
|
|
'model/udp-header.cc',
|
|
'model/tcp-header.cc',
|
|
'model/ipv4-interface.cc',
|
|
'model/ipv4-l3-protocol.cc',
|
|
'model/ipv4-end-point.cc',
|
|
'model/udp-l4-protocol.cc',
|
|
'model/tcp-l4-protocol.cc',
|
|
'model/arp-header.cc',
|
|
'model/arp-cache.cc',
|
|
'model/arp-l3-protocol.cc',
|
|
'model/udp-socket-impl.cc',
|
|
'model/ipv4-end-point-demux.cc',
|
|
'model/udp-socket-factory-impl.cc',
|
|
'model/tcp-socket-factory-impl.cc',
|
|
'model/pending-data.cc',
|
|
'model/rtt-estimator.cc',
|
|
'model/ipv4-raw-socket-factory-impl.cc',
|
|
'model/ipv4-raw-socket-impl.cc',
|
|
'model/icmpv4.cc',
|
|
'model/icmpv4-l4-protocol.cc',
|
|
'model/loopback-net-device.cc',
|
|
'model/ndisc-cache.cc',
|
|
'model/ipv6-interface.cc',
|
|
'model/icmpv6-header.cc',
|
|
'model/ipv6-l3-protocol.cc',
|
|
'model/ipv6-end-point.cc',
|
|
'model/ipv6-end-point-demux.cc',
|
|
'model/ipv6-raw-socket-factory-impl.cc',
|
|
'model/ipv6-raw-socket-impl.cc',
|
|
'model/ipv6-autoconfigured-prefix.cc',
|
|
'model/ipv6-extension.cc',
|
|
'model/ipv6-extension-header.cc',
|
|
'model/ipv6-extension-demux.cc',
|
|
'model/ipv6-option.cc',
|
|
'model/ipv6-option-header.cc',
|
|
'model/ipv6-option-demux.cc',
|
|
'model/icmpv6-l4-protocol.cc',
|
|
'model/tcp-socket-base.cc',
|
|
'model/tcp-rfc793.cc',
|
|
'model/tcp-tahoe.cc',
|
|
'model/tcp-newreno.cc',
|
|
'model/tcp-westwood.cc',
|
|
'model/tcp-rx-buffer.cc',
|
|
'model/tcp-tx-buffer.cc',
|
|
'model/tcp-option.cc',
|
|
'model/tcp-option-rfc793.cc',
|
|
'model/tcp-option-winscale.cc',
|
|
'model/tcp-option-ts.cc',
|
|
'model/ipv4-packet-info-tag.cc',
|
|
'model/ipv6-packet-info-tag.cc',
|
|
'model/ipv4-interface-address.cc',
|
|
'model/ipv4-address-generator.cc',
|
|
'model/ipv4-header.cc',
|
|
'model/ipv4-route.cc',
|
|
'model/ipv4-routing-protocol.cc',
|
|
'model/udp-socket.cc',
|
|
'model/udp-socket-factory.cc',
|
|
'model/tcp-socket.cc',
|
|
'model/tcp-socket-factory.cc',
|
|
'model/ipv4.cc',
|
|
'model/ipv4-raw-socket-factory.cc',
|
|
'model/ipv6-header.cc',
|
|
'model/ipv6-interface-address.cc',
|
|
'model/ipv6-route.cc',
|
|
'model/ipv6.cc',
|
|
'model/ipv6-raw-socket-factory.cc',
|
|
'model/ipv6-routing-protocol.cc',
|
|
'model/ipv4-list-routing.cc',
|
|
'model/ipv6-list-routing.cc',
|
|
'helper/ipv4-list-routing-helper.cc',
|
|
'helper/ipv6-list-routing-helper.cc',
|
|
'model/ipv4-static-routing.cc',
|
|
'model/ipv4-routing-table-entry.cc',
|
|
'model/ipv6-static-routing.cc',
|
|
'model/ipv6-routing-table-entry.cc',
|
|
'helper/ipv4-static-routing-helper.cc',
|
|
'helper/ipv6-static-routing-helper.cc',
|
|
'model/global-router-interface.cc',
|
|
'model/global-route-manager.cc',
|
|
'model/global-route-manager-impl.cc',
|
|
'model/candidate-queue.cc',
|
|
'model/codel-queue.cc',
|
|
'model/ipv4-global-routing.cc',
|
|
'helper/ipv4-global-routing-helper.cc',
|
|
'helper/internet-stack-helper.cc',
|
|
'helper/internet-trace-helper.cc',
|
|
'helper/ipv4-address-helper.cc',
|
|
'helper/ipv4-interface-container.cc',
|
|
'helper/ipv4-routing-helper.cc',
|
|
'helper/ipv6-address-helper.cc',
|
|
'helper/ipv6-interface-container.cc',
|
|
'helper/ipv6-routing-helper.cc',
|
|
'model/ipv6-address-generator.cc',
|
|
'model/ipv4-packet-probe.cc',
|
|
'model/ipv6-packet-probe.cc',
|
|
'model/ipv6-pmtu-cache.cc',
|
|
'model/ripng.cc',
|
|
'model/ripng-header.cc',
|
|
'helper/ripng-helper.cc',
|
|
]
|
|
|
|
internet_test = bld.create_ns3_module_test_library('internet')
|
|
internet_test.source = [
|
|
'test/global-route-manager-impl-test-suite.cc',
|
|
'test/ipv4-address-generator-test-suite.cc',
|
|
'test/ipv4-address-helper-test-suite.cc',
|
|
'test/ipv4-list-routing-test-suite.cc',
|
|
'test/ipv4-packet-info-tag-test-suite.cc',
|
|
'test/ipv4-raw-test.cc',
|
|
'test/ipv4-header-test.cc',
|
|
'test/ipv4-fragmentation-test.cc',
|
|
'test/ipv4-forwarding-test.cc',
|
|
'test/error-channel.cc',
|
|
'test/ipv4-test.cc',
|
|
'test/ipv4-static-routing-test-suite.cc',
|
|
'test/ipv4-global-routing-test-suite.cc',
|
|
'test/ipv6-extension-header-test-suite.cc',
|
|
'test/ipv6-list-routing-test-suite.cc',
|
|
'test/ipv6-packet-info-tag-test-suite.cc',
|
|
'test/ipv6-test.cc',
|
|
'test/ipv6-raw-test.cc',
|
|
'test/tcp-test.cc',
|
|
'test/tcp-timestamp-test.cc',
|
|
'test/tcp-wscaling-test.cc',
|
|
'test/tcp-option-test.cc',
|
|
'test/tcp-header-test.cc',
|
|
'test/udp-test.cc',
|
|
'test/ipv6-address-generator-test-suite.cc',
|
|
'test/ipv6-dual-stack-test-suite.cc',
|
|
'test/ipv6-fragmentation-test.cc',
|
|
'test/ipv6-forwarding-test.cc',
|
|
'test/ipv6-ripng-test.cc',
|
|
'test/ipv6-address-helper-test-suite.cc',
|
|
'test/rtt-test.cc',
|
|
'test/codel-queue-test-suite.cc',
|
|
]
|
|
privateheaders = bld(features='ns3privateheader')
|
|
privateheaders.module = 'internet'
|
|
privateheaders.source = [
|
|
'model/tcp-option-winscale.h',
|
|
'model/tcp-option-ts.h',
|
|
'model/tcp-option-rfc793.h',
|
|
]
|
|
headers = bld(features='ns3header')
|
|
headers.module = 'internet'
|
|
headers.source = [
|
|
'model/udp-header.h',
|
|
'model/tcp-header.h',
|
|
'model/tcp-option.h',
|
|
'model/icmpv4.h',
|
|
'model/icmpv6-header.h',
|
|
# used by routing
|
|
'model/ipv4-interface.h',
|
|
'model/ipv4-l3-protocol.h',
|
|
'model/ipv6-l3-protocol.h',
|
|
'model/ipv6-extension.h',
|
|
'model/ipv6-extension-demux.h',
|
|
'model/ipv6-extension-header.h',
|
|
'model/ipv6-option-header.h',
|
|
'model/arp-l3-protocol.h',
|
|
'model/udp-l4-protocol.h',
|
|
'model/tcp-l4-protocol.h',
|
|
'model/icmpv4-l4-protocol.h',
|
|
'model/ip-l4-protocol.h',
|
|
'model/arp-header.h',
|
|
'model/arp-cache.h',
|
|
'model/icmpv6-l4-protocol.h',
|
|
'model/ipv6-interface.h',
|
|
'model/ndisc-cache.h',
|
|
'model/loopback-net-device.h',
|
|
'model/ipv4-packet-info-tag.h',
|
|
'model/ipv6-packet-info-tag.h',
|
|
'model/ipv4-interface-address.h',
|
|
'model/ipv4-address-generator.h',
|
|
'model/ipv4-header.h',
|
|
'model/ipv4-route.h',
|
|
'model/ipv4-routing-protocol.h',
|
|
'model/udp-socket.h',
|
|
'model/udp-socket-factory.h',
|
|
'model/tcp-socket.h',
|
|
'model/tcp-socket-factory.h',
|
|
'model/ipv4.h',
|
|
'model/ipv4-raw-socket-factory.h',
|
|
'model/ipv4-raw-socket-impl.h',
|
|
'model/ipv6-header.h',
|
|
'model/ipv6-interface-address.h',
|
|
'model/ipv6-route.h',
|
|
'model/ipv6.h',
|
|
'model/ipv6-raw-socket-factory.h',
|
|
'model/ipv6-routing-protocol.h',
|
|
'model/ipv4-list-routing.h',
|
|
'model/ipv6-list-routing.h',
|
|
'helper/ipv4-list-routing-helper.h',
|
|
'helper/ipv6-list-routing-helper.h',
|
|
'model/ipv4-static-routing.h',
|
|
'model/ipv4-routing-table-entry.h',
|
|
'model/ipv6-static-routing.h',
|
|
'model/ipv6-routing-table-entry.h',
|
|
'helper/ipv4-static-routing-helper.h',
|
|
'helper/ipv6-static-routing-helper.h',
|
|
'model/global-router-interface.h',
|
|
'model/global-route-manager.h',
|
|
'model/global-route-manager-impl.h',
|
|
'model/candidate-queue.h',
|
|
'model/codel-queue.h',
|
|
'model/ipv4-global-routing.h',
|
|
'helper/ipv4-global-routing-helper.h',
|
|
'helper/internet-stack-helper.h',
|
|
'helper/internet-trace-helper.h',
|
|
'helper/ipv4-address-helper.h',
|
|
'helper/ipv4-interface-container.h',
|
|
'helper/ipv4-routing-helper.h',
|
|
'helper/ipv6-address-helper.h',
|
|
'helper/ipv6-interface-container.h',
|
|
'helper/ipv6-routing-helper.h',
|
|
'model/ipv6-address-generator.h',
|
|
'model/tcp-rfc793.h',
|
|
'model/tcp-tahoe.h',
|
|
'model/tcp-newreno.h',
|
|
'model/tcp-westwood.h',
|
|
'model/tcp-socket-base.h',
|
|
'model/tcp-tx-buffer.h',
|
|
'model/tcp-rx-buffer.h',
|
|
'model/rtt-estimator.h',
|
|
'model/ipv4-packet-probe.h',
|
|
'model/ipv6-packet-probe.h',
|
|
'model/ipv6-pmtu-cache.h',
|
|
'model/ripng.h',
|
|
'model/ripng-header.h',
|
|
'helper/ripng-helper.h',
|
|
]
|
|
|
|
if bld.env['NSC_ENABLED']:
|
|
obj.source.append ('model/nsc-tcp-socket-impl.cc')
|
|
obj.source.append ('model/nsc-tcp-l4-protocol.cc')
|
|
obj.source.append ('model/nsc-tcp-socket-factory-impl.cc')
|
|
obj.source.append ('model/nsc-sysctl.cc')
|
|
headers.source.append('model/nsc-tcp-l4-protocol.h')
|
|
obj.use.append('DL')
|
|
internet_test.use.append('DL')
|
|
|
|
if (bld.env['ENABLE_EXAMPLES']):
|
|
bld.recurse('examples')
|
|
|
|
bld.ns3_python_bindings()
|
|
|