bwctl_1.5.4+dfsg1.orig/ 0000775 0000765 0000771 00000000000 12560414557 011617 5 ustar bwctl_1.5.4+dfsg1.orig/doc/ 0000775 0000765 0000771 00000000000 12560414557 012364 5 ustar bwctl_1.5.4+dfsg1.orig/doc/bwctld.conf.man 0000664 0000765 0000771 00000045254 12560414557 015276 0 ustar .lf 1 bwctld.conf.ms .\" The first line of this file must contain the '"[e][r][t][v] line .\" to tell man to run the appropriate filter "t" for table. .\" .\" $Id: bwctld.conf.man 493 2008-10-09 16:27:47Z aaron $ .\" .\"###################################################################### .\"# # .\"# Copyright (C) 2004 # .\"# Internet2 # .\"# All Rights Reserved # .\"# # .\"###################################################################### .\" .\" File: bwctld.8 .\" .\" Author: Jeff Boote .\" Internet2 .\" .\" Date: Thu Feb 12 15:44:09 MST 2004 .\" .\" Description: .\" .TH bwctld.conf 5 "$Date: 2008\-10\-09 12:27:47 \-0400 (Thu, 09 Oct 2008) $" .SH NAME bwctld.conf \- \fBB\fRand\fBw\fRidth \fBC\fRon\fBt\fRro\fBl\fR \fBd\fRaemon configuration file .SH DESCRIPTION The \fBbwctld.conf\fR file is the configuration file for the bwctld(8) program. It is used to configure the basic operation of the server. For example, what addresses and ports it should listen on, where it should send error messages, and where it should save files. .PP The policy rules for \fBbwctld\fR are configured using the \fBbwctld.limits\fR file; the details for configuring those policies are described in the bwctld.limits(5) manual page. .PP .lf 1 bwctld_conf_opts.man .\" The first line of this file must contain the '"[e][r][t][v] line .\" to tell man to run the appropriate filter "t" for table. .\" .\" $Id: bwctlrc.man 493 2008-10-09 16:27:47Z aaron $ .\" .\"###################################################################### .\"# # .\"# Copyright (C) 2004 # .\"# Internet2 # .\"# All Rights Reserved # .\"# # .\"###################################################################### .\" .\" File: bwctlrc.8 .\" .\" Author: Jeff Boote and Aaron Brown .\" Internet2 .\" .\" Date: Tue Jan 06 07:44:09 EST 2009 .\" .\" Description: .\" .PP The format of this file is: .RS .IP \(bu Comment lines are any line where the first non-whitespace character is '#'. These lines are counted for the purposes of returning line numbers in error messages but are otherwise ignored by the spawned \fBbwctld\fR. .IP \(bu Lines may be continued using the semi-standard '\\' character followed immediately by a newline character. This is the only valid place for the '\\' character. If it is found elsewhere, a syntax error is reported. .IP \(bu Blank lines are treated as comment lines. .IP \(bu All other lines are used to set configuration options. The format of these lines is an initial keyword followed by a variable list of arguments, separated by whitespace. .RE .SH CONFIGURATION OPTIONS .TP .BI access_priority " priority" Syslog \fIpriority\fR to log access messages. .RS .IP Default: LOG_INFO .RE .TP .B allow_unsync Directs \fBbwctld\fR to continue accepting valid requests for throughput tests when the system clock is not synchronized. \fBbwctld\fR prefers to have an NTP synchronized system clock to ensure the two endpoints of the test are actually agreeing to the same scheduled time window for test execution. This option is used to bypass this requirement for systems that either do not have the NTP system calls, or prefer not to configure NTP. .RS .PP Note: if the difference between the system clocks on the two endpoints is too great, the eventual throughput test will fail when the endpoints attempt to run the test at different times. The threshold for this difference is controlled using the \fIsync_fuzz\fR option. (If you set allow_unsync, you should set \fIsync_fuzz\fR to a reasonable value for your system.) .PP .IP Default: unset (set if the operating system does have the NTP system calls) .RE .TP .BI auth_mode " authmode" Specify the authentication modes the server is willing to use for communication. \fIauth_mode\fR should be set as a character string, with any or all of the characters "AEO". The modes are: .RS .IP \fBA\fR [\fBA\fR]uthenticated. This mode encrypts the control connection. .IP \fBE\fR [\fBE\fR]ncrypted. This mode encrypts the control connection. If the test supports encryption, this mode will additionally encrypt the test stream. (Encryption of the test stream is not currently supported, so this mode is currently identical to authenticated.) .IP \fBO\fR [\fBO\fR]pen. No encryption of any kind is done. .PP The server can specify all the modes with which it is willing to communicate. The most strict mode that both the server and the client are willing to use will be selected. .IP Default: "AEO" .RE .TP .BI bottleneck_capacity " bottleneckcapacity" This value is used in the algorithm to dynamically set the TCP send/recv window sizes. This option is likely to be removed in the future once a dynamic \fIbottleneck_capacity\fR algorithm is incorporated into the code. (This option only really works when the local NIC is the bottleneck.) If this option is not specified, the dynamic window calculation requested by the \fB\-W\fR option to \fBbwctl\fR is not done and the advisory value is used. .RS .IP Default: unset .RE .TP .BI control_timeout " controltimeout" Number of seconds to wait for protocol messages before timing out. This value should be significantly larger than what typical users specify for the \fB\-I\fR flag of \fBbwctl\fR or \fBbwctl\fR will have to open a new control connection for each new test it requests. .RS .IP Default: 7200 (Picked to be the same as the default for TCP keepalive) .RE .TP .BI die_by " dieby" Number of seconds to wait for child processes to gracefully terminate before killing them with \fBSIGKILL\fR. This is in response to the master process receiving \fBSIGTERM\fR or \fBSIGHUP\fR. .RS .IP Default: 5 .RE .TP .BI disable_iperf Prevent \fBbwctl\fR from executing \fBIperf\fR tests .RS .IP Default: unset .RE .TP .BI disable_iperf3 Prevent \fBbwctl\fR from executing \fBIperf3\fR tests .RS .IP Default: unset .RE .TP .BI disable_nuttcp Prevent \fBbwctl\fR from executing \fBNuttcp\fR tests .RS .IP Default: unset .RE .TP .BI disable_owamp Prevent \fBbwctl\fR from executing \fBOwamp\fR tests .RS .IP Default: unset .RE .TP .BI disable_ping Prevent \fBbwctl\fR from executing \fBPing\fR tests .RS .IP Default: unset .RE .TP .BI disable_tracepath Prevent \fBbwctl\fR from executing \fBTracepath\fR tests .RS .IP Default: unset .RE .TP .BI disable_traceroute Prevent \fBbwctl\fR from executing \fBTraceroute\fR tests .RS .IP Default: unset .RE .TP .BI facility " facility" Syslog \fIfacility\fR to log messages. .RS .IP Default: LOG_DAEMON .RE .TP .BI group " group" Specifies the gid the \fBbwctld\fR process should run as. \fIgroup\fR can be specified using a valid group name on the system or by using \-gid. This option is only used if \fBbwctld\fR is started as root. .RS .IP Default: unset .RE .TP .BI iperf_cmd " iperfcmd" The path to the \fBIperf\fR command on the system. If the \fIiperf_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctld\fR environment will be searched to find the \fBIperf\fR executable. .RS .IP Default: iperf .RE .TP .BI iperf_port " iperfport" The port number(s) that \fBIperf\fR receivers will use. Currently, \fBbwctld\fR simply cycles through this range linearly. \fIiperf_port\fR can be specified as a single valid port number or as a range as \fIlow\fR\-\fIhigh\fR. The range must be specified as two valid port numbers with the '\-' character separating them. Whitespace is not allowed within the \fIiperf_port\fR. For example, \fB"5001\-5004"\fR would be valid, but \fB"5001 \- 5004"\fR would be invalid. .RS .PP This value should be set to a range because it can take a few minutes for a port to become free after a test has run. If the port is not free when the next test starts, the test will fail. If set to a range, the daemon will cycle through them when starting tests, decreasing the chance that a port will still be open when the test starts. For best results, ensure that this range is different from that of nuttcp_port and thrulay_port. .PP .IP Default: unset .RE .TP .BI iperf3_port " iperf3port" The port number(s) that \fBIperf3\fR receivers will use. Currently, \fBbwctld\fR simply cycles through this range linearly. \fIiperf3_port\fR can be specified as a single valid port number or as a range as \fIlow\fR\-\fIhigh\fR. The range must be specified as two valid port numbers with the '\-' character separating them. Whitespace is not allowed within the \fIiperf3_port\fR. For example, \fB"5001\-5004"\fR would be valid, but \fB"5001 \- 5004"\fR would be invalid. .RS .PP This value should be set to a range because it can take a few minutes for a port to become free after a test has run. If the port is not free when the next test starts, the test will fail. If set to a range, the daemon will cycle through them when starting tests, decreasing the chance that a port will still be open when the test starts. For best results, ensure that this range is different from that of nuttcp_port and thrulay_port. .PP .IP Default: unset .RE .TP .B log_location Directs the \fBbwctld\fR process to report source code file and line number information with error messages. This is a particularly useful option to set when sending in messages as part of a bug report. .RS .IP Default: unset .RE .TP .BI nuttcp_cmd " nuttcpcmd" The path to the \fBNuttcp\fR command on the system. If the \fInuttcp_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBNuttcp\fR executable. .RS .IP Default: nuttcp .RE .TP .BI nuttcp_port " nuttcpport" The port number(s) that \fBNuttcp\fR receivers will use. Currently, \fBbwctld\fR simply cycles through this range linearly. \fInuttcp_port\fR can be specified as a single valid port number or as a range as \fIlow\fR\-\fIhigh\fR. The range must be specified as two valid port numbers with the '\-' character separating them. Whitespace is not allowed within the \fInuttcp_port\fR. For example, \fB"5001\-5004"\fR would be valid, but \fB"5001 \- 5004"\fR would be invalid. .RS .PP This value should be set to a range because it can take a few minutes for a port to become free after a test has run. If the port is not free when the next test starts, the test will fail. If set to a range, the daemon will cycle through them when starting tests, decreasing the chance that a port will still be open when the test starts. For best results, ensure that this range is different from that of iperf_port and thrulay_port. .PP .IP Default: unset .RE .TP .BI owamp_cmd " owampcmd" The path to the \fBowping\fR command on the system. If the \fIowamp_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBowping\fR executable. .RS .IP Default: owping .RE .TP .BI owamp_server_cmd " owampservercmd" The path to the \fBowampd\fR command on the system. If the \fIowamp_server_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBowampd\fR executable. .RS .IP Default: owampd .RE .TP .BI owamp_port " owampport" The port number(s) that \fBOwamp\fR receivers will use. Currently, \fBbwctld\fR simply cycles through this range linearly. \fIowamp_port\fR must be specified as a range as \fIlow\fR\-\fIhigh\fR. The range must be specified as two valid port numbers with the '\-' character separating them. Whitespace is not allowed within the \fIowamp_port\fR. For example, \fB"5001\-5004"\fR would be valid, but \fB"5001 \- 5004"\fR would be invalid. .RS .PP This value must be set to a range because it is used for both the \fBOwamp\fR communication and test ports. .PP .IP Default: unset .RE .TP .BI peer_port " 0 | lowport\-highport" Specify the port range that will be used on the local host for peer connections to other .B bwctld servers. These connections are used to verify clock timing between the servers and to exchange test results. This is a required part of the protocol used by .B BWCTL to run tests. However, this option allows system administrators to limit these connections to a specific port range, which should allow .B BWCTL to work in a firewall environment. This option can be specified in two ways. First, as a 0, which would indicate that .B bwctld should allow the system to pick the port (ephemeral). Second, as a range. .I lowport must be a smaller value than .I highport and both numbers must be valid port values. (16-bit unsigned integer values) .RS .IP Default: 0 .RE .TP .BI ping_cmd " pingcmd" The path to the \fBping\fR command on the system. If the \fIping_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBping\fR executable. .RS .IP Default: ping .RE .TP .BI ping6_cmd " ping6cmd" The path to the \fBping6\fR command on the system. If the \fIping6_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBping6\fR executable. .RS .IP Default: ping6 .RE .TP .BI post_hook " /path/to/script" Specifies a script to run after each bwctl session has finished. These hooks can be used to save the results into a database, track usage or any number of other tasks. You can specify as many hooks as you want by including multiple post_hook entries. .TP .BI priority " priority" Syslog \fIpriority\fR to log error messages. .RS .IP Default: LOG_ERR .RE .TP .B root_folly Disables the checks that disable \fBbwctld\fR if it is run with \fIroot\fR permissions. There are legitimate reasons to run \fBbwctld\fR as root, but it is risky. Forcing this additional option will make it less likely root permissions are accidently used. .RS .IP Default: unset .RE .TP .BI src_node " nodename:port" Specify the address and port on which \fBbwctld\fR will listen for requests. \fInodename\fR can be specified using a DNS name or using the textual representation of the address. It is possible to set the source address without setting the \fIport\fR by simply leaving off the ':' and \fIport\fR specification. If an IPv6 address is specified, note that the accepted format contains \fInodename\fR in square brackets as: [fe80::fe9f:62d8]. This ensures the port number is distinct from the address specification. .RS .IP Default: \fInodename\fR is wildcarded as any currently available address .br \fIport\fR is 4823 .RE .TP .BI sync_fuzz " syncfuzz" This value is added to the NTP error estimates to increase the tolerance of \fBbwctld\fR to incomplete NTP configurations, or if the NTP system calls are not available. If NTP is unavailable to \fBbwctld\fR it assumes the clock is accurate to within one second plus the value of \fIsync_fuzz\fR. This option is specified as a floating point number in seconds. For example, to indicate that the system is synchronized within one second, you could specify this option as 1.0. .RS .PP Practically, this option is used to determine the size of the time window buffer before and after each throughput test. .IP Default: 0.0 .RE .TP .BI test_port " testport" The port number(s) that receivers of all test types will use, unless otherwise set using one of the other port variables. Currently, \fBbwctld\fR simply cycles through this range linearly. \fItest_port\fR must be specified as a range as \fIlow\fR\-\fIhigh\fR. The range must be specified as two valid port numbers with the '\-' character separating them. Whitespace is not allowed within the \fItest_port\fR. For example, \fB"5001\-5004"\fR would be valid, but \fB"5001 \- 5004"\fR would be invalid. .RS .PP This value must be set to a range because it is used for both the \fBOwamp\fR communication and test ports. .PP .IP Default: 5001-5900 .RE .TP .BI thrulay_port " thrulayport" The port number(s) that \fBThrulay\fR receivers will use. Currently, \fBbwctld\fR simply cycles through this range linearly. \fIthrulay_port\fR can be specified as a single valid port number or as a range as \fIlow\fR\-\fIhigh\fR. The range must be specified as two valid port numbers with the '\-' character separating them. Whitespace is not allowed within the \fIthrulay_port\fR. For example, \fB"5001\-5004"\fR would be valid, but \fB"5001 \- 5004"\fR would be invalid. .RS .PP This value should be set to a range because it can take a few minutes for a port to become free after a test has run. If the port is not free when the next test starts, the test will fail. If set to a range, the daemon will cycle through them when starting tests, decreasing the chance that a port will still be open when the test starts. For best results, ensure that this range is different from that of iperf_port and nuttcp_port. .PP .IP Default: unset .RE .TP .BI tracepath_cmd " tracepathcmd" The path to the \fBtracepath\fR command on the system. If the \fItracepath_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBtracepath\fR executable. .RS .IP Default: tracepath .RE .TP .BI tracepath6_cmd " tracepath6cmd" The path to the \fBtracepath6\fR command on the system. If the \fItracepath6_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBtracepath6\fR executable. .RS .IP Default: tracepath6 .RE .TP .BI traceroute_cmd " traceroutecmd" The path to the \fBtraceroute\fR command on the system. If the \fItraceroute_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBtraceroute\fR executable. .RS .IP Default: traceroute .RE .TP .BI traceroute6_cmd " traceroute6cmd" The path to the \fBtraceroute6\fR command on the system. If the \fItraceroute6_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBtraceroute6\fR executable. .RS .IP Default: traceroute6 .RE .TP .BI user " user" Specifies the uid the \fBbwctld\fR process should run as. \fIuser\fR can be specified using a valid user name on the system or by using \-uid. This option is only used if \fBbwctld\fR is started as root. If the given \fIuser\fR has \fIroot\fR permissions, the \fIroot_folly\fR option must also be specified. .RS .IP Default: unset .RE .TP .BI var_dir " vardir" Directory path where the bwctld.pid file will be placed. .RS .IP Default: Current directory .RE .lf 38 bwctld.conf.ms .RE .SH SEE ALSO bwctl(1), bwctld(8), bwctld.limits(5), bwctld.keys(5), and the \%http://software.internet2.edu/bwctl/ web site. .PP For details on \fBIperf3\fR, see the \%https://github.com/esnet/iperf web site. .PP For details on \fBIperf\fR, see the \%http://sourceforge.net/projects/iperf web site. .PP For details on \fBNuttcp\fR, see the \%http://www.wcisd.hpc.mil/nuttcp/Nuttcp\-HOWTO.html web site. .PP For details on \fBOwamp\fR, see the \%http://software.internet2.edu/owamp web site. .SH ACKNOWLEDGMENTS This material is based in part on work supported by the National Science Foundation (NSF) under Grant No. ANI-0314723. Any opinions, findings, and conclusions or recommendations expressed in this material are those of the author(s) and do not necessarily reflect the views of the NSF. bwctl_1.5.4+dfsg1.orig/doc/bwctld.man.html 0000664 0000765 0000771 00000017211 12560414557 015305 0 ustar
Aside from actually running network measurement tests, the main function of bwctld is to determine which tests are allowable based upon the policy restrictions configured by the system administrator.
bwctld was designed to be run as a stand-alone daemon process. It uses the classic accept/fork model of handling new requests.
Most of the command line options for bwctld have analogous options in the bwctld.conf file. The command line takes precedence.
The server can specify all the modes with which it is willing to communicate. The most strict mode that both the server and the client are willing to use will be selected.
For details on Iperf3, see the https://github.com/esnet/iperf web site.
For details on Iperf, see the http://sourceforge.net/projects/iperf web site.
For details on Nuttcp, see the http://www.wcisd.hpc.mil/nuttcp/Nuttcp-HOWTO.html web site.
For details on Owamp, see the http://software.internet2.edu/owamp web site.
bwctl works by contacting a bwctld daemon on both the receiving host and the sending host. bwctld manages and schedules the resources of the host it runs on. In the case where only one of the receiving host or sending host is specified, bwctl assumes the local host is the other endpoint. bwctl will attempt to contact a local bwctld if it can. If there is no local bwctld running, bwctl assumes the local host does not require policy controls and will execute the bwctld functionality required to run the test directly.
If cases where bwctl is directly running the test on the host, there are several configuration options that are shared with bwctld. Those configuration options can be set using the bwctlrc(5) configuration file in a way very similar to the way they are specified in the bwctld.conf(5) file.
The bwctl, bwping and bwtraceroute clients are used to request the desired type of throughput, latency or traceroute test. Furthermore, it requests when the test is wanted. bwctld on each endpoint either responds with a tentative reservation or a test denied message. Once bwctl is able to get a matching reservation from both bwctld processes (one for each host involved in the test), it confirms the reservation. Then, the bwctld processes run the test and return the results. The results are returned to the client from both sides of the test from the respective bwctld processes. Additionally, the bwctld processes share the results from their respective side of the test with each other.
BWCTL (bwctl and bwctld) is used to enable non-specific network measurement tests to hosts without having to give full user accounts on the given systems. Users want the ability to run throughput tests to determine the achievable or available bandwidth between a pair of hosts. It is often useful to test to multiple points along a network path to determine the network characteristics along that path. Typically, users who want to do this path decomposition have to directly contact the network/system administrators who control the hosts along the path. The administrator needs to either run half of the test for the user or give them a user account on the host. Also, network paths of interest are typically controlled by multiple administrators. These hurdles have made this kind of testing difficult in practice.
BWCTL was designed to help with this problem. It allows an administrator to configure a given host as an Iperf, Iperf3, Nuttcp, or Owamp endpoint. The endpoint can be a packet sender (e.g. Iperf client) or a packet receiver (e.g. Iperf server). It can be shared by multiple users without concern that those users will interfere with each other. Specific policy limits can be applied to specific users, and individual tests are scheduled so they will not interfere with each other. Additionally, full user accounts are not required for the users running the tests.
BWCTL allows the administrator to classify incoming connections based upon a user name and AES key combination or, alternatively, based upon an IP/netmask. Once the connection is classified, the bwctld can determine the exact type and intensities of througput tests that will be allowed. More information on the policy controls can be found in the bwctld(8) man page.
BWCTL makes use of a distributed scheduling algorithm. Each host maintains a schedule independently. As a client requests a test, the two endpoints are contacted and each bwctld server responds with the first available open schedule slot. This enables on-demand tests to co-exist with regularly scheduled tests since regularly scheduled tests are implemented by having the client request tests on regular intervals. Different priorities can be implemented using the event_horizon configuration directive to bwctld. (By allowing clients that implement regularly scheduled tests to reserve their time slots further into the future.)
Allowing different authentication methods for each connection should allow a client to use different authentication methods with different servers which should in turn allow cross-domain tests to occur more easily.
The format for authmethod is:
authmode [authscheme schemeopts]
The client can specify all the modes with which it is willing to communicate. The most strict mode that both the server and the client are willing to use will be selected.
authscheme and schemeopts are only needed if authenticated communication (A or E modes of authmode) is wanted with sendhost and recvhost.
At least one of the -c or -s options must be specified. If one of them is not specified, it is assumed to be the local host.
authmethod is a specifically ordered list of keywords that is only needed if authenticated communication is wanted with recvhost. These keywords are used to describe the type of communication and authentication that should be used to contact the recvhost. If recvhost and sendhost share the same authentication methods and identities, it is possible to specify the authmethod for both recvhost and sendhost using the -A argument. An authmethod specified with the -c option will override an authmethod specified with the -A argument for communication with the recvhost.
The format for authmethod and a description of the currently available authentication methods are described with the -A argument.
At least one of the -c or -s options must be specified. If one of them is not specified, it is assumed to be the local.
authmethod is a specifically ordered list of keywords that is only needed if authenticated communication is wanted with sendhost. These keywords are used to describe the type of communication and authentication that should be used to contact the sendhost. If recvhost and sendhost share the same authentication methods and identities, it is possible to specify the authmethod for both recvhost and sendhost using the -A argument. An authmethod specified with the -s option will override an authmethod specified with the -A argument for communication with the sendhost.
The format for authmethod and a description of the currently available authentication methods are described with the -A argument.
|
If two systems do NOT have a close enough notion of time, then the throughput test will eventually fail because one endpoint of the test will attempt to run at a different time than the other.
If the operating system supports the NTP system calls, and the system clock is determined to be unsynchronized, error messages will still be reported depending upon the value of the -e flag.
When calculating the time errors, this value will be aded in to account for the difference. The maximum time offset can be bounded on the server side, using the max_time_error directive, to prevent a denial of service attack. If set, the server will reject any requests to test with a peer that has too high a timestamp error.
bwctl Environment Variable | use | default |
BWCTLRC | Config file | ~/.bwctlrc |
BWCTL_DEBUG_TIMEOFFSET | Offset | 0.0(seconds) |
bwctl -c somehost.example.com
bwctl -x -c somehost.example.com
bwctl -x -c somehost.example.com -s otherhost.example.com
bwctl -t 30 -T iperf -s somehost.example.com
bwctl -I 3600 -R 10 -t 10 -u -b 10m -s somehost.example.com
bwctl -s somehost.example.com AE AESKEY someuser
bwping --no_endpoint -N 30 -i 0.5 --ttl 150 -c somehost.example.com
bwtraceroute -T tracepath -E -c somehost.example.com
For details on Iperf3, see the https://github.com/esnet/iperf web site.
For details on Iperf, see the http://sourceforge.net/projects/iperf web site.
For details on Nuttcp, see the http://www.wcisd.hpc.mil/nuttcp/Nuttcp-HOWTO.html web site.
For details on Owamp, see the http://software.internet2.edu/owamp web site.
BWCTL uses three different sets of ports:
For example, to enable this on a typical Red Hat Enterprise Linux system, you would need to add the following line to /etc/sysconfig/iptables:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 4823 -j ACCEPT
This should be added somewhere after the line that allows ESTABLISHED and RELATED connections through.
This does not use the system-config-securitylevel script from Redhat. I have not been able to get that to do all the things I needed.
If you specified peer_port as 9910-9950, you would then need to enable this range in your firewall configuration. (If you do not specify a range, BWCTL will only work reliably if you have open access for the entire ephemeral port range.)
On a typical Red Hat Enterprise Linux system, you would need to add the following line to /etc/sysconfig/iptables given this range:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9910:9950 -j ACCEPT
This should be added somewhere after the line that allows ESTABLISHED and RELATED connections through.
This does not use the system-config-securitylevel script from Redhat. I have not been able to get that to do all the things I needed.
If you specified iperf_port as 5001-5004, you would then need to enable this range in your firewall configuration. If you allow UDP tests (in your bwctld.limits file), you will need to open up the UDP ports. Likewise for TCP. The default is 5001 for TCP and UDP tests, and you will only be able to test if you open the ports specified.
On a typical Red Hat Enterprise Linux system, you would need to add the following lines to /etc/sysconfig/iptables given this range:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5001:5004 -j ACCEPT -A RH-Firewall-1-INPUT -m udp -p ucp --dport 5001:5004 -j ACCEPT
This should be added somewhere after the line that allows ESTABLISHED and RELATED connections through.
This does not use the system-config-securitylevel script from Redhat. I have not been able to get that to do all the things I needed.
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -p 50 -j ACCEPT -A RH-Firewall-1-INPUT -p 51 -j ACCEPT -A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # ssh -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT # bwctld listen port (src_node) -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 4823 -j ACCEPT # bwctld peer_ports -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9910:9950 -j ACCEPT # bwctl/iperf_port -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5001 -j ACCEPT -A RH-Firewall-1-INPUT -m udp -p ucp --dport 5001 -j ACCEPT # reject anything that has not matched -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited COMMITbwctl_1.5.4+dfsg1.orig/doc/bwctld_conf_opts.man 0000664 0000765 0000771 00000041132 12560414557 016413 0 ustar .\" The first line of this file must contain the '"[e][r][t][v] line .\" to tell man to run the appropriate filter "t" for table. .\" .\" $Id: bwctlrc.man 493 2008-10-09 16:27:47Z aaron $ .\" .\"###################################################################### .\"# # .\"# Copyright (C) 2004 # .\"# Internet2 # .\"# All Rights Reserved # .\"# # .\"###################################################################### .\" .\" File: bwctlrc.8 .\" .\" Author: Jeff Boote and Aaron Brown .\" Internet2 .\" .\" Date: Tue Jan 06 07:44:09 EST 2009 .\" .\" Description: .\" .PP The format of this file is: .RS .IP \(bu Comment lines are any line where the first non-whitespace character is '#'. These lines are counted for the purposes of returning line numbers in error messages but are otherwise ignored by the spawned \fBbwctld\fR. .IP \(bu Lines may be continued using the semi-standard '\\' character followed immediately by a newline character. This is the only valid place for the '\\' character. If it is found elsewhere, a syntax error is reported. .IP \(bu Blank lines are treated as comment lines. .IP \(bu All other lines are used to set configuration options. The format of these lines is an initial keyword followed by a variable list of arguments, separated by whitespace. .RE .SH CONFIGURATION OPTIONS .TP .BI access_priority " priority" Syslog \fIpriority\fR to log access messages. .RS .IP Default: LOG_INFO .RE .TP .B allow_unsync Directs \fBbwctld\fR to continue accepting valid requests for throughput tests when the system clock is not synchronized. \fBbwctld\fR prefers to have an NTP synchronized system clock to ensure the two endpoints of the test are actually agreeing to the same scheduled time window for test execution. This option is used to bypass this requirement for systems that either do not have the NTP system calls, or prefer not to configure NTP. .RS .PP Note: if the difference between the system clocks on the two endpoints is too great, the eventual throughput test will fail when the endpoints attempt to run the test at different times. The threshold for this difference is controlled using the \fIsync_fuzz\fR option. (If you set allow_unsync, you should set \fIsync_fuzz\fR to a reasonable value for your system.) .PP .IP Default: unset (set if the operating system does have the NTP system calls) .RE .TP .BI auth_mode " authmode" Specify the authentication modes the server is willing to use for communication. \fIauth_mode\fR should be set as a character string, with any or all of the characters "AEO". The modes are: .RS .IP \fBA\fR [\fBA\fR]uthenticated. This mode encrypts the control connection. .IP \fBE\fR [\fBE\fR]ncrypted. This mode encrypts the control connection. If the test supports encryption, this mode will additionally encrypt the test stream. (Encryption of the test stream is not currently supported, so this mode is currently identical to authenticated.) .IP \fBO\fR [\fBO\fR]pen. No encryption of any kind is done. .PP The server can specify all the modes with which it is willing to communicate. The most strict mode that both the server and the client are willing to use will be selected. .IP Default: "AEO" .RE .TP .BI bottleneck_capacity " bottleneckcapacity" This value is used in the algorithm to dynamically set the TCP send/recv window sizes. This option is likely to be removed in the future once a dynamic \fIbottleneck_capacity\fR algorithm is incorporated into the code. (This option only really works when the local NIC is the bottleneck.) If this option is not specified, the dynamic window calculation requested by the \fB\-W\fR option to \fBbwctl\fR is not done and the advisory value is used. .RS .IP Default: unset .RE .TP .BI control_timeout " controltimeout" Number of seconds to wait for protocol messages before timing out. This value should be significantly larger than what typical users specify for the \fB\-I\fR flag of \fBbwctl\fR or \fBbwctl\fR will have to open a new control connection for each new test it requests. .RS .IP Default: 7200 (Picked to be the same as the default for TCP keepalive) .RE .TP .BI die_by " dieby" Number of seconds to wait for child processes to gracefully terminate before killing them with \fBSIGKILL\fR. This is in response to the master process receiving \fBSIGTERM\fR or \fBSIGHUP\fR. .RS .IP Default: 5 .RE .TP .BI disable_iperf Prevent \fBbwctl\fR from executing \fBIperf\fR tests .RS .IP Default: unset .RE .TP .BI disable_iperf3 Prevent \fBbwctl\fR from executing \fBIperf3\fR tests .RS .IP Default: unset .RE .TP .BI disable_nuttcp Prevent \fBbwctl\fR from executing \fBNuttcp\fR tests .RS .IP Default: unset .RE .TP .BI disable_owamp Prevent \fBbwctl\fR from executing \fBOwamp\fR tests .RS .IP Default: unset .RE .TP .BI disable_ping Prevent \fBbwctl\fR from executing \fBPing\fR tests .RS .IP Default: unset .RE .TP .BI disable_tracepath Prevent \fBbwctl\fR from executing \fBTracepath\fR tests .RS .IP Default: unset .RE .TP .BI disable_traceroute Prevent \fBbwctl\fR from executing \fBTraceroute\fR tests .RS .IP Default: unset .RE .TP .BI facility " facility" Syslog \fIfacility\fR to log messages. .RS .IP Default: LOG_DAEMON .RE .TP .BI group " group" Specifies the gid the \fBbwctld\fR process should run as. \fIgroup\fR can be specified using a valid group name on the system or by using \-gid. This option is only used if \fBbwctld\fR is started as root. .RS .IP Default: unset .RE .TP .BI iperf_cmd " iperfcmd" The path to the \fBIperf\fR command on the system. If the \fIiperf_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctld\fR environment will be searched to find the \fBIperf\fR executable. .RS .IP Default: iperf .RE .TP .BI iperf_port " iperfport" The port number(s) that \fBIperf\fR receivers will use. Currently, \fBbwctld\fR simply cycles through this range linearly. \fIiperf_port\fR can be specified as a single valid port number or as a range as \fIlow\fR\-\fIhigh\fR. The range must be specified as two valid port numbers with the '\-' character separating them. Whitespace is not allowed within the \fIiperf_port\fR. For example, \fB"5001\-5004"\fR would be valid, but \fB"5001 \- 5004"\fR would be invalid. .RS .PP This value should be set to a range because it can take a few minutes for a port to become free after a test has run. If the port is not free when the next test starts, the test will fail. If set to a range, the daemon will cycle through them when starting tests, decreasing the chance that a port will still be open when the test starts. For best results, ensure that this range is different from that of nuttcp_port and thrulay_port. .PP .IP Default: unset .RE .TP .BI iperf3_port " iperf3port" The port number(s) that \fBIperf3\fR receivers will use. Currently, \fBbwctld\fR simply cycles through this range linearly. \fIiperf3_port\fR can be specified as a single valid port number or as a range as \fIlow\fR\-\fIhigh\fR. The range must be specified as two valid port numbers with the '\-' character separating them. Whitespace is not allowed within the \fIiperf3_port\fR. For example, \fB"5001\-5004"\fR would be valid, but \fB"5001 \- 5004"\fR would be invalid. .RS .PP This value should be set to a range because it can take a few minutes for a port to become free after a test has run. If the port is not free when the next test starts, the test will fail. If set to a range, the daemon will cycle through them when starting tests, decreasing the chance that a port will still be open when the test starts. For best results, ensure that this range is different from that of nuttcp_port and thrulay_port. .PP .IP Default: unset .RE .TP .B log_location Directs the \fBbwctld\fR process to report source code file and line number information with error messages. This is a particularly useful option to set when sending in messages as part of a bug report. .RS .IP Default: unset .RE .TP .BI nuttcp_cmd " nuttcpcmd" The path to the \fBNuttcp\fR command on the system. If the \fInuttcp_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBNuttcp\fR executable. .RS .IP Default: nuttcp .RE .TP .BI nuttcp_port " nuttcpport" The port number(s) that \fBNuttcp\fR receivers will use. Currently, \fBbwctld\fR simply cycles through this range linearly. \fInuttcp_port\fR can be specified as a single valid port number or as a range as \fIlow\fR\-\fIhigh\fR. The range must be specified as two valid port numbers with the '\-' character separating them. Whitespace is not allowed within the \fInuttcp_port\fR. For example, \fB"5001\-5004"\fR would be valid, but \fB"5001 \- 5004"\fR would be invalid. .RS .PP This value should be set to a range because it can take a few minutes for a port to become free after a test has run. If the port is not free when the next test starts, the test will fail. If set to a range, the daemon will cycle through them when starting tests, decreasing the chance that a port will still be open when the test starts. For best results, ensure that this range is different from that of iperf_port and thrulay_port. .PP .IP Default: unset .RE .TP .BI owamp_cmd " owampcmd" The path to the \fBowping\fR command on the system. If the \fIowamp_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBowping\fR executable. .RS .IP Default: owping .RE .TP .BI owamp_server_cmd " owampservercmd" The path to the \fBowampd\fR command on the system. If the \fIowamp_server_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBowampd\fR executable. .RS .IP Default: owampd .RE .TP .BI owamp_port " owampport" The port number(s) that \fBOwamp\fR receivers will use. Currently, \fBbwctld\fR simply cycles through this range linearly. \fIowamp_port\fR must be specified as a range as \fIlow\fR\-\fIhigh\fR. The range must be specified as two valid port numbers with the '\-' character separating them. Whitespace is not allowed within the \fIowamp_port\fR. For example, \fB"5001\-5004"\fR would be valid, but \fB"5001 \- 5004"\fR would be invalid. .RS .PP This value must be set to a range because it is used for both the \fBOwamp\fR communication and test ports. .PP .IP Default: unset .RE .TP .BI peer_port " 0 | lowport\-highport" Specify the port range that will be used on the local host for peer connections to other .B bwctld servers. These connections are used to verify clock timing between the servers and to exchange test results. This is a required part of the protocol used by .B BWCTL to run tests. However, this option allows system administrators to limit these connections to a specific port range, which should allow .B BWCTL to work in a firewall environment. This option can be specified in two ways. First, as a 0, which would indicate that .B bwctld should allow the system to pick the port (ephemeral). Second, as a range. .I lowport must be a smaller value than .I highport and both numbers must be valid port values. (16-bit unsigned integer values) .RS .IP Default: 0 .RE .TP .BI ping_cmd " pingcmd" The path to the \fBping\fR command on the system. If the \fIping_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBping\fR executable. .RS .IP Default: ping .RE .TP .BI ping6_cmd " ping6cmd" The path to the \fBping6\fR command on the system. If the \fIping6_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBping6\fR executable. .RS .IP Default: ping6 .RE .TP .BI post_hook " /path/to/script" Specifies a script to run after each bwctl session has finished. These hooks can be used to save the results into a database, track usage or any number of other tasks. You can specify as many hooks as you want by including multiple post_hook entries. .TP .BI priority " priority" Syslog \fIpriority\fR to log error messages. .RS .IP Default: LOG_ERR .RE .TP .B root_folly Disables the checks that disable \fBbwctld\fR if it is run with \fIroot\fR permissions. There are legitimate reasons to run \fBbwctld\fR as root, but it is risky. Forcing this additional option will make it less likely root permissions are accidently used. .RS .IP Default: unset .RE .TP .BI src_node " nodename:port" Specify the address and port on which \fBbwctld\fR will listen for requests. \fInodename\fR can be specified using a DNS name or using the textual representation of the address. It is possible to set the source address without setting the \fIport\fR by simply leaving off the ':' and \fIport\fR specification. If an IPv6 address is specified, note that the accepted format contains \fInodename\fR in square brackets as: [fe80::fe9f:62d8]. This ensures the port number is distinct from the address specification. .RS .IP Default: \fInodename\fR is wildcarded as any currently available address .br \fIport\fR is 4823 .RE .TP .BI sync_fuzz " syncfuzz" This value is added to the NTP error estimates to increase the tolerance of \fBbwctld\fR to incomplete NTP configurations, or if the NTP system calls are not available. If NTP is unavailable to \fBbwctld\fR it assumes the clock is accurate to within one second plus the value of \fIsync_fuzz\fR. This option is specified as a floating point number in seconds. For example, to indicate that the system is synchronized within one second, you could specify this option as 1.0. .RS .PP Practically, this option is used to determine the size of the time window buffer before and after each throughput test. .IP Default: 0.0 .RE .TP .BI test_port " testport" The port number(s) that receivers of all test types will use, unless otherwise set using one of the other port variables. Currently, \fBbwctld\fR simply cycles through this range linearly. \fItest_port\fR must be specified as a range as \fIlow\fR\-\fIhigh\fR. The range must be specified as two valid port numbers with the '\-' character separating them. Whitespace is not allowed within the \fItest_port\fR. For example, \fB"5001\-5004"\fR would be valid, but \fB"5001 \- 5004"\fR would be invalid. .RS .PP This value must be set to a range because it is used for both the \fBOwamp\fR communication and test ports. .PP .IP Default: 5001-5900 .RE .TP .BI thrulay_port " thrulayport" The port number(s) that \fBThrulay\fR receivers will use. Currently, \fBbwctld\fR simply cycles through this range linearly. \fIthrulay_port\fR can be specified as a single valid port number or as a range as \fIlow\fR\-\fIhigh\fR. The range must be specified as two valid port numbers with the '\-' character separating them. Whitespace is not allowed within the \fIthrulay_port\fR. For example, \fB"5001\-5004"\fR would be valid, but \fB"5001 \- 5004"\fR would be invalid. .RS .PP This value should be set to a range because it can take a few minutes for a port to become free after a test has run. If the port is not free when the next test starts, the test will fail. If set to a range, the daemon will cycle through them when starting tests, decreasing the chance that a port will still be open when the test starts. For best results, ensure that this range is different from that of iperf_port and nuttcp_port. .PP .IP Default: unset .RE .TP .BI tracepath_cmd " tracepathcmd" The path to the \fBtracepath\fR command on the system. If the \fItracepath_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBtracepath\fR executable. .RS .IP Default: tracepath .RE .TP .BI tracepath6_cmd " tracepath6cmd" The path to the \fBtracepath6\fR command on the system. If the \fItracepath6_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBtracepath6\fR executable. .RS .IP Default: tracepath6 .RE .TP .BI traceroute_cmd " traceroutecmd" The path to the \fBtraceroute\fR command on the system. If the \fItraceroute_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBtraceroute\fR executable. .RS .IP Default: traceroute .RE .TP .BI traceroute6_cmd " traceroute6cmd" The path to the \fBtraceroute6\fR command on the system. If the \fItraceroute6_cmd\fR does not contain a '/' character, then the PATH of the \fBbwctl\fR environment will be searched to find the \fBtraceroute6\fR executable. .RS .IP Default: traceroute6 .RE .TP .BI user " user" Specifies the uid the \fBbwctld\fR process should run as. \fIuser\fR can be specified using a valid user name on the system or by using \-uid. This option is only used if \fBbwctld\fR is started as root. If the given \fIuser\fR has \fIroot\fR permissions, the \fIroot_folly\fR option must also be specified. .RS .IP Default: unset .RE .TP .BI var_dir " vardir" Directory path where the bwctld.pid file will be placed. .RS .IP Default: Current directory .RE bwctl_1.5.4+dfsg1.orig/doc/bwctl_ntp_conf.html 0000664 0000765 0000771 00000004747 12560414557 016267 0 ustar
BWCTL works best when the clocks of the clients and servers are synchronized. If the hosts are not synchronized, they might try to begin tests at different times.
NTP is a protocol used to synchronize a computer's clock to clocks available over a network. The NTP software is available for, and often times, included with many operating systems. Most Unix systems use the reference implementation of the software, and the example included with this howto is geared to that version.
ntp.org has some advice for selecting NTP servers. However, there are some general rules of thumb to follow for NTP configuration. The NTP configuration should include between 4 and 7 NTP clocks with which it will try to synchronize. By including this number of servers, the NTP software can make better decisions about which clocks are accurate and who it should trust for time data. The NTP servers should be in close proximity to the host, though this is not a hard requirement. Ideally, the network paths to the servers should differ as much as possible from each other.
There are a large number of public NTP servers. There's a list available at http://support.ntp.org/bin/view/Servers/WebHome.
Internet2 maintains a set of NTP servers that can be used if the host is connected to the Internet2 network.
# /etc/ntp.conf, configuration for ntpd logfile /var/log/ntpd driftfile /var/lib/ntp/ntp.drift statistics loopstats peerstats clockstats filgen loopstats file loopstats type day enable filgen peerstats file peerstats type day enable filgen clockstats file clockstats type day enable server owamp.chic.net.internet2.edu iburst server owamp.hous.net.internet2.edu iburst server owamp.kans.net.internet2.edu iburst server owamp.losa.net.internet2.edu iburst server owamp.newy.net.internet2.edu iburstbwctl_1.5.4+dfsg1.orig/doc/bwctl_arch.png 0000664 0000765 0000771 00000164203 12560414557 015210 0 ustar ‰PNG IHDR è êCd÷ pHYs .# .#x¥?v IDATxœìw˜]UÕÿ×Úû”Ûïô’ÉÔR¡EPDHQT@õU±¼¾‚]_Q_õ§HGPP¤©IH! éɤOïíÎí휳÷úýq§%™Zfîp>Ož'wÎÝgïuïÝç{öY{íµ‘ˆÀÆÆÆÆ&{`cm€Í;Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,Ãn›,CkŽKš»"w‡6v¥ZR".I޵EÙC¦1G‘£lŠwÅ7ÖÙ¼Ÿô'7š{7w‡Ú£©”%h¬íÉD¦LËóœY–wʤ\…eÙ6„;j†V÷¾øŸöG;I7d€ p¬íÊHešƒ¹Åg/9¿ôÊBGÙXeó^Ù׿wKÃã»Û»ciô@Hûšxd$Dá>MUè½i^õ’ãʼZèa$×7émÁ·¬ÿùîðFŽ "C [²ßD$Y%ΪOWãüÒ+ÇÚ"›w‰ úÃúº»Öík'€3 ´¯‰wà™¿:göéeùcmÐQ1®…{Y×SÝû£°Ù§2}¬m™8Xd¨è¸¼â¦ÏÔ|“cÖ1l2$-ñÝå;þøvϲüq)Js\w/žwé´Ò±6åÈŒ_á^Ùýüow}Ã)[\Þw$I úTåW¯›rûXÛbóHùµ×¶Þ³±Á–ìI9õáŸ<þµ{œþüM±Ý÷î»3m«öCˆÏ´Þ»²ûù±¶ÅæðHm˽›!ÛfÒ²†¡¤ñ¥ÛCñ±6åŒÇ Èz¬é÷½éÅVí,)âÿjþSÄìk[lŽŠÖHâÇ«÷س<$œíë‰ü߆z!Ç©+"Ãxî¡·ßî{]a¶j°hL¯‹n[ÑýÜXbsTü߆úÖþ0[¶?`þ×-Ûû"cmÇáwÂ-I¼Ý÷zÜŠàø³mâÁ‘/ízÒ’æXbszâé—zì±ö± !eXÖ¶Œµ‡c܉cÔmêÓ#96 ò–øÞæøÞ±6Äælïì Dmïö1‚`YK_ÊcmÇ!wý lÚâõÇa“ÒuÑmcm…ÍØÝµÒ¦=â>F vÅRÍ‘ÄXÛqHÆ>öí„=ÿrl@@KZ½éޱ6Äæ4‡¶wûØ5¬Þ„1Öv’q'ÜIküÞå&$D2e÷à'›˜aµ .)SÖøMˆ4î„›ììQDz¿ól@Ž×…r"·‹a ·Íá±…ÛÆÆÆ&˰…ÛÆÆÆ&˰…ÛÆÆÆ&˰…ÛÆÆÆ&˰…ûpÁÀ̲E–¤¡•Tõ9\.ıіI™ t@66ÙÍPÜÈáØ¤¡Ë†8x3ÄQƒÑ…QÕcêÄÂî)¬U `Èæç-šæ;@rä7Nýá'&ßH@øÙºiÚOP’¸yúOÿkÖïU¦ ²>>ùó7Nû‘Æt ¢Ú3{nîiUbÀ$ÉÁH#»“Úd#ú¬®pD ¢ª÷e™¿,y~Uá¿?yj¥Ï†uÖäü]_<ÿ´²<0¬‹ý;o<÷âšb0EuŽë—ž|vEéՔ󦔔y@€ € ã;3ßxÀn Irh÷aw¹¹—ˆtæü”\0éABAí“_ZX°˜ˆˆ¨3ÙÔ—îD zµãñ=Ï"[ÑóüO ²1jCé^ RHq~é§n˜òC9Liœ_zÕÍÓâR<’„‚ÚЮS’Àާ¶—*)CÈuª*c äE5Å_rR™Ç¦8srþgÍ,ti@L™;z#i!€c]üŽ•;BqPXk4ùÓÕ{jû¢À0-d{43, *õ8¼xþÙ• D‰ÛñÈÇOº`J11Ä¡Ñ:ÀˆÑ½MVlüAƒ€>5 "fÐÉ]ߟsOClÇýû~"HÒÝq+Š€†LýfÇ×$I†\‚|±ýaÜéomß+ ¨17–€Æt|y÷3 @*Ókú?Ž<%â2=Y†L_7å{Už¿ÞqKÒŠ» aÊñ»ÊÖæÃ‰ÎYŽ[íOš¦i]6«ìÎ3g~ò©uu=‘`Úl¦, ðïi¹¡;”6AåºB:C€ œwÄ’ßÚ ÆúâéG¶4çÀYG4õe; ÞŠŸòвPÚÆHe,-$Hšìw¼|åß]^ûÜÞNÆ™GS¢¦e«w†¯pH"@DüÂÔ À];¿nÈô³÷%gÜ"㉖ÿ‡€9 Ĭ ‡^hÌ1T§¶RC™)³Â@„Ȧ¾Ôþ()LU™¶-øV{¢>%’–4¯ªºÍ§äþqÏí™]}pTw¹Í1‚ èÄRÿýô™çßÞÚZ×üÙ[{û(lM[`MKpS–L™itr«Ê(¯Gx\,I]± îxúê§ÖC`,œ6ïßÖTÛ€ ŸóñOœrëkÛÖ· }È3·|¸„;³Í¹Â4‹ÌË&±Ü5õÿíýžIÖÆÀò”Hpä´¶ïÌ䕹ÏþùÁªÓì§òƒ}š£’9ÌQYxU¦)LmŒíÊÓŠ„´ãK*n =˺žbÈ% †Ìκes,238)õ8ÿ²øÄŸ®Þ½¡½¿1œ¸o[ck$ Û#ÉÇ·5Âú3Ñ-GŸv<:Fž;¸f8eÞµz(R¦XÙ¥ ˜^à¹i^õ/×ì퉧އ¦³“‘p‘_+¨pOßÞ`ÈtRÄ»R- j•=Ï Cû ?h†Fèùò®§ˆ1®¢–§©L“@**ziÐ쵤‰¶vÛ|Àœ^QÐK5ãQk$‘öÄÓ¿_·xà