## -*- 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 Utils.unversioned_sys_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', 'traffic-control', '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/arp-queue-disc-item.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-socket-state.cc', 'model/tcp-highspeed.cc', 'model/tcp-hybla.cc', 'model/tcp-vegas.cc', 'model/tcp-congestion-ops.cc', 'model/tcp-westwood.cc', 'model/tcp-scalable.cc', 'model/tcp-veno.cc', 'model/tcp-bic.cc', 'model/tcp-yeah.cc', 'model/tcp-ledbat.cc', 'model/tcp-illinois.cc', 'model/tcp-htcp.cc', 'model/tcp-lp.cc', 'model/tcp-rx-buffer.cc', 'model/tcp-tx-buffer.cc', 'model/tcp-tx-item.cc', 'model/tcp-rate-ops.cc', 'model/tcp-option.cc', 'model/tcp-option-rfc793.cc', 'model/tcp-option-winscale.cc', 'model/tcp-option-ts.cc', 'model/tcp-option-sack-permitted.cc', 'model/tcp-option-sack.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-queue-disc-item.cc', 'model/ipv4-packet-filter.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/tcp-recovery-ops.cc', 'model/tcp-prr-recovery.cc', 'model/ipv4.cc', 'model/ipv4-raw-socket-factory.cc', 'model/ipv6-header.cc', 'model/ipv6-queue-disc-item.cc', 'model/ipv6-packet-filter.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/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', 'model/rip.cc', 'model/rip-header.cc', 'helper/rip-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/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-sack-permitted-test.cc', 'test/tcp-wscaling-test.cc', 'test/tcp-option-test.cc', 'test/tcp-header-test.cc', 'test/tcp-ecn-test.cc', 'test/tcp-general-test.cc', 'test/tcp-error-model.cc', 'test/tcp-slow-start-test.cc', 'test/tcp-cong-avoid-test.cc', 'test/tcp-fast-retr-test.cc', 'test/tcp-rto-test.cc', 'test/tcp-highspeed-test.cc', 'test/tcp-hybla-test.cc', 'test/tcp-vegas-test.cc', 'test/tcp-scalable-test.cc', 'test/tcp-veno-test.cc', 'test/tcp-bic-test.cc', 'test/tcp-yeah-test.cc', 'test/tcp-illinois-test.cc', 'test/tcp-htcp-test.cc', 'test/tcp-lp-test.cc', 'test/tcp-ledbat-test.cc', 'test/tcp-zero-window-test.cc', 'test/tcp-pkts-acked-test.cc', 'test/tcp-rtt-estimation.cc', 'test/tcp-bytes-in-flight-test.cc', 'test/tcp-advertised-window-test.cc', 'test/tcp-classic-recovery-test.cc', 'test/tcp-prr-recovery-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/tcp-tx-buffer-test.cc', 'test/tcp-rx-buffer-test.cc', 'test/tcp-endpoint-bug2211.cc', 'test/tcp-datasentcb-test.cc', 'test/tcp-rate-ops-test.cc', 'test/ipv4-rip-test.cc', 'test/tcp-close-test.cc', 'test/icmp-test.cc', ] privateheaders = bld(features='ns3privateheader') privateheaders.module = 'internet' privateheaders.source = [ ] headers = bld(features='ns3header') headers.module = 'internet' headers.source = [ 'model/udp-header.h', 'model/tcp-header.h', 'model/tcp-option.h', 'model/tcp-option-winscale.h', 'model/tcp-option-ts.h', 'model/tcp-option-sack-permitted.h', 'model/tcp-option-sack.h', 'model/tcp-option-rfc793.h', 'model/icmpv4.h', 'model/icmpv6-header.h', # used by routing 'model/ipv4-interface.h', 'model/ipv4-l3-protocol.h', 'model/ipv4-end-point.h', 'model/ipv4-end-point-demux.h', 'model/ipv6-l3-protocol.h', 'model/ipv6-extension.h', 'model/ipv6-extension-demux.h', 'model/ipv6-extension-header.h', 'model/ipv6-option.h', 'model/ipv6-option-header.h', 'model/ipv6-end-point.h', 'model/ipv6-end-point-demux.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/arp-queue-disc-item.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-queue-disc-item.h', 'model/ipv4-packet-filter.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-queue-disc-item.h', 'model/ipv6-packet-filter.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/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-highspeed.h', 'model/tcp-hybla.h', 'model/tcp-vegas.h', 'model/tcp-congestion-ops.h', 'model/tcp-westwood.h', 'model/tcp-scalable.h', 'model/tcp-veno.h', 'model/tcp-bic.h', 'model/tcp-yeah.h', 'model/tcp-illinois.h', 'model/tcp-htcp.h', 'model/tcp-lp.h', 'model/tcp-ledbat.h', 'model/tcp-socket-base.h', 'model/tcp-socket-state.h', 'model/tcp-tx-buffer.h', 'model/tcp-tx-item.h', 'model/tcp-rate-ops.h', 'model/tcp-rx-buffer.h', 'model/tcp-recovery-ops.h', 'model/tcp-prr-recovery.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', 'model/rip.h', 'model/rip-header.h', 'helper/rip-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()