get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/113081/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 113081,
    "url": "https://patches.dpdk.org/api/patches/113081/?format=api",
    "web_url": "https://patches.dpdk.org/project/dts/patch/20220620023550.64779-1-chenyux.huang@intel.com/",
    "project": {
        "id": 3,
        "url": "https://patches.dpdk.org/api/projects/3/?format=api",
        "name": "DTS",
        "link_name": "dts",
        "list_id": "dts.dpdk.org",
        "list_email": "dts@dpdk.org",
        "web_url": "",
        "scm_url": "git://dpdk.org/tools/dts",
        "webscm_url": "http://git.dpdk.org/tools/dts/",
        "list_archive_url": "https://inbox.dpdk.org/dts",
        "list_archive_url_format": "https://inbox.dpdk.org/dts/{}",
        "commit_url_format": ""
    },
    "msgid": "<20220620023550.64779-1-chenyux.huang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20220620023550.64779-1-chenyux.huang@intel.com",
    "date": "2022-06-20T02:35:50",
    "name": "unpack tclclient.tgz and tgen.tgz",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": false,
    "hash": "616e840725a9d6a5f7c241890206125d86c3233a",
    "submitter": {
        "id": 2491,
        "url": "https://patches.dpdk.org/api/people/2491/?format=api",
        "name": "Huang, ChenyuX",
        "email": "chenyux.huang@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dts/patch/20220620023550.64779-1-chenyux.huang@intel.com/mbox/",
    "series": [
        {
            "id": 23626,
            "url": "https://patches.dpdk.org/api/series/23626/?format=api",
            "web_url": "https://patches.dpdk.org/project/dts/list/?series=23626",
            "date": "2022-06-20T02:35:50",
            "name": "unpack tclclient.tgz and tgen.tgz",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/23626/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/113081/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/113081/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dts-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 470FEA0093;\n\tMon, 20 Jun 2022 04:36:07 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 010D84067C;\n\tMon, 20 Jun 2022 04:36:07 +0200 (CEST)",
            "from mga05.intel.com (mga05.intel.com [192.55.52.43])\n by mails.dpdk.org (Postfix) with ESMTP id 505C840150\n for <dts@dpdk.org>; Mon, 20 Jun 2022 04:36:03 +0200 (CEST)",
            "from fmsmga007.fm.intel.com ([10.253.24.52])\n by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 19 Jun 2022 19:36:00 -0700",
            "from unknown (HELO localhost.localdomain) ([10.239.252.107])\n by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 19 Jun 2022 19:35:54 -0700"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1655692564; x=1687228564;\n h=from:to:cc:subject:date:message-id:mime-version:\n content-transfer-encoding;\n bh=VAjWf1zNdMyGmDqtajEzvBk9hlybSb78Yfp06eojlpk=;\n b=YhJHI4aUiBNoKQc0LKtUTKBxDpYPBQkl0u7U4MLNHWvm4WiKfC7kz5g5\n appthFN59Fo4g2F67usTZNkP2P+bgTtNIPQA0SrXBr+Q6drdOk3LV8H6W\n YcRv7Xkix0Txk7gWrmanYoOSmtN339uor06k5s4SJq6+jGOMGPWcqFO9N\n i+20ocgiOUwOmyps07zJK10O4iHX74jC3UPzVXh+NP3490DqhYUMe1Nd3\n Z2RcyFMOafbfDXJYlxCKqxx6if97/J0Vfa+VrxlTlVwWVjWIU42x9wSzO\n CofvNtYPG0Oiooq3BQYMKIwjULfwymS7nBbl2dgXJvgAL81/kyAvEk3Ev Q==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6400,9594,10380\"; a=\"366111283\"",
            "E=Sophos;i=\"5.92,306,1650956400\"; d=\"scan'208\";a=\"366111283\"",
            "E=Sophos;i=\"5.92,306,1650956400\"; d=\"scan'208\";a=\"590958420\""
        ],
        "From": "ChenYu Huang <chenyux.huang@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "lijuan.tu@intel.com, qingx.sun@intel.com, junx.dong@intel.com,\n daxuex.gao@intel.com",
        "Subject": "[PATCH] unpack tclclient.tgz and tgen.tgz",
        "Date": "Mon, 20 Jun 2022 10:35:50 +0800",
        "Message-Id": "<20220620023550.64779-1-chenyux.huang@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=y",
        "Content-Transfer-Encoding": "quoted-printable",
        "X-BeenThere": "dts@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "test suite reviews and discussions <dts.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dts>,\n <mailto:dts-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dts/>",
        "List-Post": "<mailto:dts@dpdk.org>",
        "List-Help": "<mailto:dts-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dts>,\n <mailto:dts-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dts-bounces@dpdk.org"
    },
    "content": "From: Daxue Gao <daxuex.gao@intel.com>\n\nExtract ixia dependances for better review and understanding in repo.\n\nSigned-off-by: Daxue Gao <daxuex.gao@intel.com>\n---\n dep/tclclient.tgz                             |  Bin 199327 -> 0 bytes\n dep/tclclient/IxiaWish.tcl                    |  133 +\n .../ixTcl1.0/Dap/dapconfiguration.tcl         |  217 ++\n dep/tclclient/ixTcl1.0/Dap/ixDapConfig.tcl    | 1702 +++++++++\n dep/tclclient/ixTcl1.0/Generic/actions.tcl    | 3241 +++++++++++++++++\n .../ixTcl1.0/Generic/addressTableUtils.tcl    |  117 +\n dep/tclclient/ixTcl1.0/Generic/calculate.tcl  |  527 +++\n .../ixTcl1.0/Generic/chassisUtils.tcl         |  239 ++\n .../ixTcl1.0/Generic/clientUtils.tcl          |  319 ++\n dep/tclclient/ixTcl1.0/Generic/constants.tcl  |  131 +\n .../ixTcl1.0/Generic/conversions.tcl          |  275 ++\n .../ixTcl1.0/Generic/dataValidation.tcl       | 1855 ++++++++++\n .../ixTcl1.0/Generic/defineCommand.tcl        |  441 +++\n dep/tclclient/ixTcl1.0/Generic/defineTest.tcl |  161 +\n .../ixTcl1.0/Generic/dhcpExchange.tcl         | 2605 +++++++++++++\n .../ixTcl1.0/Generic/dialogUtils.tcl          |  230 ++\n .../ixTcl1.0/Generic/eventHandler.tcl         |  124 +\n .../ixTcl1.0/Generic/featureUtils.tcl         |  324 ++\n .../ixTcl1.0/Generic/fileTransferClient.tcl   |  538 +++\n dep/tclclient/ixTcl1.0/Generic/ftp.tcl        |  154 +\n .../ixTcl1.0/Generic/highLevelAPI.tcl         | 2642 ++++++++++++++\n dep/tclclient/ixTcl1.0/Generic/interface.tcl  |  262 ++\n .../ixTcl1.0/Generic/interfaceTableUtils.tcl  |  850 +++++\n dep/tclclient/ixTcl1.0/Generic/ipV6Utils.tcl  | 1479 ++++++++\n .../ixTcl1.0/Generic/ixFileUtils.tcl          |  158 +\n dep/tclclient/ixTcl1.0/Generic/ixGraph.tcl    |  982 +++++\n dep/tclclient/ixTcl1.0/Generic/log.tcl        |  177 +\n .../ixTcl1.0/Generic/logCollector.tcl         |  162 +\n dep/tclclient/ixTcl1.0/Generic/map.tcl        |  383 ++\n dep/tclclient/ixTcl1.0/Generic/miiUtils.tcl   |  619 ++++\n dep/tclclient/ixTcl1.0/Generic/miscCmds.tcl   |  992 +++++\n dep/tclclient/ixTcl1.0/Generic/multiUser.tcl  |  402 ++\n .../ixTcl1.0/Generic/packetBuilder.tcl        |  922 +++++\n dep/tclclient/ixTcl1.0/Generic/parseArgs.tcl  |   87 +\n dep/tclclient/ixTcl1.0/Generic/platform.tcl   |   88 +\n dep/tclclient/ixTcl1.0/Generic/random.tcl     |  109 +\n .../ixTcl1.0/Generic/scriptmateBackCompat.tcl |   65 +\n dep/tclclient/ixTcl1.0/Generic/socket.tcl     |  718 ++++\n dep/tclclient/ixTcl1.0/Generic/statistics.tcl | 1222 +++++++\n .../ixTcl1.0/Generic/stringUtils.tcl          |  632 ++++\n .../ixTcl1.0/Generic/switchLearn.tcl          | 2030 +++++++++++\n dep/tclclient/ixTcl1.0/Generic/tclServer.tcl  |  458 +++\n .../ixTcl1.0/Generic/testCmdControl.tcl       |  538 +++\n dep/tclclient/ixTcl1.0/Generic/trafficMix.tcl |  329 ++\n .../ixTcl1.0/Generic/utilWrappers.tcl         |  357 ++\n dep/tclclient/ixTcl1.0/Generic/utils.tcl      | 2319 ++++++++++++\n dep/tclclient/ixTcl1.0/Generic/vlanUtils.tcl  |  327 ++\n dep/tclclient/ixTcl1.0/Generic/xmlUtils.tcl   |  241 ++\n dep/tclclient/ixTcl1.0/ixInit.tcl             |   65 +\n dep/tclclient/ixTcl1.0/ixTclHal.tcl           |  192 +\n dep/tclclient/ixTcl1.0/ixTclHalSetup.tcl      |  400 ++\n dep/tclclient/ixTcl1.0/ixTclSetup.tcl         |  244 ++\n dep/tclclient/ixTcl1.0/ixiaDCB.tcl            |  588 +++\n dep/tclclient/ixTcl1.0/ixiaPing6.tcl          |  140 +\n dep/tclclient/ixTcl1.0/ixiarc.tcl             |   60 +\n dep/tclclient/ixTcl1.0/pkgIndex.tcl           |   54 +\n dep/tclclient/ixTcl1.0/tclIndex               |  836 +++++\n dep/tgen.tgz                                  |  Bin 134392 -> 0 bytes\n dep/tgen/Pktgen.lua                           |  276 ++\n dep/tgen/PktgenGUI.lua                        |  113 +\n dep/tgen/tgen                                 |  Bin 0 -> 300314 bytes\n framework/project_dpdk.py                     |    3 +\n 62 files changed, 35854 insertions(+)\n delete mode 100644 dep/tclclient.tgz\n create mode 100644 dep/tclclient/IxiaWish.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Dap/dapconfiguration.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Dap/ixDapConfig.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/actions.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/addressTableUtils.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/calculate.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/chassisUtils.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/clientUtils.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/constants.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/conversions.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/dataValidation.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/defineCommand.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/defineTest.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/dhcpExchange.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/dialogUtils.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/eventHandler.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/featureUtils.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/fileTransferClient.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/ftp.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/highLevelAPI.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/interface.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/interfaceTableUtils.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/ipV6Utils.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/ixFileUtils.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/ixGraph.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/log.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/logCollector.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/map.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/miiUtils.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/miscCmds.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/multiUser.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/packetBuilder.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/parseArgs.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/platform.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/random.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/scriptmateBackCompat.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/socket.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/statistics.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/stringUtils.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/switchLearn.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/tclServer.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/testCmdControl.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/trafficMix.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/utilWrappers.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/utils.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/vlanUtils.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/Generic/xmlUtils.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/ixInit.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/ixTclHal.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/ixTclHalSetup.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/ixTclSetup.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/ixiaDCB.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/ixiaPing6.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/ixiarc.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/pkgIndex.tcl\n create mode 100644 dep/tclclient/ixTcl1.0/tclIndex\n delete mode 100644 dep/tgen.tgz\n create mode 100644 dep/tgen/Pktgen.lua\n create mode 100644 dep/tgen/PktgenGUI.lua\n create mode 100755 dep/tgen/tgen",
    "diff": "diff --git a/dep/tclclient.tgz b/dep/tclclient.tgz\ndeleted file mode 100644\nindex 96038ffcbf3bef07fab73fc6348c5b6caa73d28a..0000000000000000000000000000000000000000\nGIT binary patch\nliteral 0\nHcmV?d00001\n\nliteral 199327\n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\n\ndiff --git a/dep/tclclient/IxiaWish.tcl b/dep/tclclient/IxiaWish.tcl\nnew file mode 100644\nindex 00000000..9c70420c\n--- /dev/null\n+++ b/dep/tclclient/IxiaWish.tcl\n@@ -0,0 +1,133 @@\n+# BSD LICENSE\r\n+#\r\n+# Copyright (c) 2014, Ixia All rights reserved.\r\n+#\r\n+# Redistribution and use in source and binary forms, with or without\r\n+# modification, are permitted provided that the following conditions\r\n+# are met:\r\n+#\r\n+# * Redistributions of source code must retain the above copyright\r\n+#   notice, this list of conditions and the following disclaimer.\r\n+# * Redistributions in binary form must reproduce the above copyright\r\n+#   notice, this list of conditions and the following disclaimer in\r\n+#   the documentation and/or other materials provided with the\r\n+#   distribution.\r\n+# * Neither the name of the copyright holder nor the names of its\r\n+#   contributors may be used to endorse or promote products derived\r\n+#   from this software without specific prior written permission.\r\n+#\r\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n+\r\n+# IxiaWish.tcl sets up the Tcl environment to use the correct multiversion-compatible \r\n+# applications, as specified by Application Selector.\r\n+\r\n+# Note: this file must remain compatible with tcl 8.3, because it will be sourced by scriptgen\r\n+namespace eval ::ixiaInstall:: {\r\n+    # For debugging, you can point this to an alternate location.  It should\r\n+    # point to a directory that contains the \"TclScripts\" subdirectory.\r\n+    set tclDir\t\t\"/root\"\r\n+\r\n+    # For debugging, you can point this to an alternate location.  It should\r\n+    # point to a directory that contains the IxTclHal.dll\r\n+\tset ixosTclDir\t\"/root\"\r\n+\r\n+    set tclLegacyDir [file join $tclDir \"../..\"]\r\n+\r\n+    # Calls appinfo to add paths to IxOS dependencies (such as IxLoad or IxNetwork).\r\n+    proc ixAddPathsFromAppinfo {installdir} {\r\n+        package require registry\r\n+        \r\n+        set installInfoFound false\r\n+        foreach {reg_path} [list \"HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Ixia Communications\\\\AppInfo\\\\InstallInfo\" \"HKEY_CURRENT_USER\\\\SOFTWARE\\\\Ixia Communications\\\\AppInfo\\\\InstallInfo\"] {\r\n+            if { [ catch {registry get $reg_path \"HOMEDIR\"} r] == 0 } {\r\n+                set appinfo_path $r\r\n+                set installInfoFound true\r\n+                break\r\n+            }\r\n+        }\r\n+        # If the registy information was not found in either place, warn the user\r\n+        if { [string equal $installInfoFound \"false\"] } {        \r\n+            return -code error \"Could not find AppInfo registry entry\"\r\n+        }   \r\n+         \r\n+        # Call appinfo to get the list of all dependencies:\r\n+        regsub -all \"\\\\\\\\\" $appinfo_path \"/\" appinfo_path      \r\n+        set appinfo_executable [file attributes \"$appinfo_path/Appinfo.exe\" -shortname]\r\n+        set appinfo_command \"|$appinfo_executable --app-path \\\"$installdir\\\" --get-dependencies\"\r\n+        set appinfo_handle [open $appinfo_command r+ ]\r\n+        set appinfo_session {}\r\n+\r\n+        while { [gets $appinfo_handle line] >= 0 } {\r\n+            # Keep track of the output to report in the error message below\r\n+            set appinfo_session \"$appinfo_session $line\\n\"\r\n+            \r\n+            regsub -all \"\\\\\\\\\" $line \"/\" line\r\n+            regexp \"^(.+):\\ (.*)$\" $line all app_name app_path\r\n+            # If there is a dependency listed, add the path.\r\n+            if {![string equal $app_path \"\"] } {\r\n+                # Only add it if it's not already present:\r\n+                if { -1 == [lsearch -exact $::auto_path $app_path ] } {\r\n+                    lappend ::auto_path $app_path\r\n+                    lappend ::auto_path [file join $app_path \"TclScripts/lib\"]\r\n+                    append ::env(PATH) [format \":%s\" $app_path]                    \r\n+                }\r\n+            }\r\n+        }\r\n+        \r\n+        # If appinfo returned a non-zero result, this catch block will trigger.\r\n+        # In that case, show what we tried to do, and the resulting response.\r\n+        if { [catch {close $appinfo_handle} r] != 0} {\r\n+            return -code error \"Appinfo error, \\\"$appinfo_command\\\" returned: $appinfo_session\"\r\n+        }        \r\n+    }\r\n+\r\n+    # Adds all needed Ixia paths\r\n+    proc ixAddPaths {installdir} {\r\n+        set ::env(IXTCLHAL_LIBRARY) [file join $installdir \"ixTcl1.0\"]\r\n+        set ::env(IXIA_VERSION) \"6.20\" \r\n+        lappend ::auto_path $installdir\r\n+        #lappend ::auto_path [file join $installdir \"TclScripts/lib\"]\r\n+        lappend ::auto_path [file join $installdir \"ixTcl1.0\"]\r\n+        #if { [catch {::ixiaInstall::ixAddPathsFromAppinfo $installdir} result] } {\r\n+            # Not necessarily fatal\r\n+        #    puts [format \"WARNING!!! Unable to add paths from Appinfo: %s\" $result]\r\n+        #}\r\n+        append ::env(PATH) \":${installdir}\"\r\n+        \r\n+        # Fall back to the old locations, in case a non-multiversion-aware \r\n+        # IxLoad or IxNetwork is installed.\r\n+        #lappend ::auto_path [file join $installdir \"../../TclScripts/lib\"]\r\n+        #append ::env(PATH) [format \";%s\" [file join $installdir \"../..\"]]\r\n+\r\n+\t#\tif {![string equal $::ixiaInstall::tclDir $::ixiaInstall::ixosTclDir]} {\r\n+\t#\t\tappend ::env(PATH) [format \";%s\" $::ixiaInstall::ixosTclDir]\r\n+\t#\t}\t\t\t\r\n+    }\r\n+}\r\n+::ixiaInstall::ixAddPaths $::ixiaInstall::tclDir\r\n+\r\n+catch {\r\n+    # Try to set things up for Wish.  \r\n+    # This section will not run in IxExplorer or IxTclInterpreter, hence the catch block.\r\n+    if {[lsearch [package names] \"Tk\"] >= 0} {\r\n+        console show\r\n+        wm iconbitmap . [file join $::ixiaInstall::tclDir \"ixos.ico\"]\r\n+        \r\n+        # It is not easy to tell ActiveState wish from the Ixia-compiled wish.\r\n+        # The tcl_platform variable shows one difference: ActiveState implements threading\r\n+        if {![info exists ::tcl_platform(threaded)]} {           \r\n+            # Activestate prints this on its own, otherwise, we add it here:\r\n+            puts -nonewline \"(TclScripts) 1 % \"\r\n+        }        \r\n+    }\r\n+}\r\ndiff --git a/dep/tclclient/ixTcl1.0/Dap/dapconfiguration.tcl b/dep/tclclient/ixTcl1.0/Dap/dapconfiguration.tcl\nnew file mode 100644\nindex 00000000..3122079b\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Dap/dapconfiguration.tcl\n@@ -0,0 +1,217 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 5.20\n+#   \n+#   File: dapconfiguration.tcl\n+#\n+#   This file contains the configuration parameters for running ixDapConfig::main.\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t11-14-02\tDebby Stopp\n+#\n+########################################################################################\n+\n+source ixDapConfig.tcl\n+logOn ixDapConfig.log\n+\n+##\n+#  Application name\n+#       Need to set the exact name of the application to be downloaded to each port\n+##\n+set applicationName      \"\"\n+\n+\n+##\n+#  Startup procedure/executable\n+#       If there's a startup procedure that needs to be excuted after downloading, put the name\n+#       of that executable here. The entire patch to the executable must be specified in the startupProcedureExe.\n+#       No action taken if variable is set to \"\"\n+##\n+set startupProcedureExe  \"\"\n+\n+\n+##\n+#  Specify login name to use for taking ownership of ports.\n+#  Ownership is *mandatory* for this application.\n+##\n+ixDapLogin \"ixDapConfig\"\n+\n+\n+##\n+# Chassis list\n+#    Put chassis ip OR DNS host name; put in order of usage.\n+#    First chassis == ID 1, second chassis == ID 2, etc... \n+##\n+ixDapConfig::setChassisList {loopback}\n+\n+\n+##\n+# Port array & ip stuff - Configure port interface details \n+#                         <portId, macAddress, ipAddress, gateway, mask, enableVlan, vlanId>\n+#   NOTE: \n+#       portID == {<chassisID> <cardID> <portID>}\n+##\n+ixDapAddPortInterface   -portId         {1 1 1} \\\n+                        -macAddress     \"00 de bb 01 01 01\" \\\n+                        -ipAddress      \"198.18.1.100\" \\\n+                        -gateway        \"198.18.1.1\" \\\n+                        -mask           \"255.255.255.0\" \\\n+                        -enableVlan     false \\\n+                        -vlanId         101\n+\n+ixDapAddPortInterface   -portId         {1 1 1} \\\n+                        -macAddress     \"00 de bb 01 02 01\" \\\n+                        -ipAddress      \"198.18.2.100\" \\\n+                        -gateway        \"198.18.2.1\" \\\n+                        -mask           \"255.255.255.0\" \\\n+                        -enableVlan     false \\\n+                        -vlanId         101\n+\n+ixDapAddPortInterface   -portId         {1 1 1} \\\n+                        -macAddress     \"00 de bb 01 03 01\" \\\n+                        -ipAddress      \"198.18.3.100\" \\\n+                        -gateway        \"198.18.3.1\" \\\n+                        -mask           \"255.255.255.0\" \\\n+                        -enableVlan     false \\\n+                        -vlanId         101\n+\n+ixDapAddPortInterface   -portId         {1 1 2} \\\n+                        -macAddress     \"00 de bb 01 01 02\" \\\n+                        -ipAddress      \"198.18.1.102\" \\\n+                        -gateway        \"198.18.1.1\" \\\n+                        -mask           \"255.255.255.0\" \\\n+                        -enableVlan     true \\\n+                        -vlanId         102\n+\n+ixDapAddPortInterface   -portId         {1 1 3} \\\n+                        -macAddress     \"00 de bb 01 01 03\" \\\n+                        -ipAddress      \"198.18.1.103\" \\\n+                        -gateway        \"198.18.1.1\" \\\n+                        -mask           \"255.255.255.0\" \\\n+                        -enableVlan     false \\\n+                        -vlanId         103\n+\n+ixDapAddPortInterface   -portId         {1 1 4} \\\n+                        -macAddress     \"00 de bb 01 01 04\" \\\n+                        -ipAddress      \"198.18.1.104\" \\\n+                        -gateway        \"198.18.1.1\" \\\n+                        -mask           \"255.255.255.0\" \\\n+                        -enableVlan     false \\\n+                        -vlanId         104\n+\n+\n+##\n+#  Config test network topology - Add route table details \n+#                         <portId, target(net or host), ipAddress, gateway, mask>\n+##\n+ixDapAddRouteTable      -portId         {1 1 1} \\\n+                        -target         \"net\" \\\n+                        -ipAddress      \"198.20.0.0\" \\\n+                        -gateway        \"198.18.2.1\" \\\n+                        -mask           \"255.255.0.0\"\n+\n+ixDapAddRouteTable      -portId         {1 1 1} \\\n+                        -target         \"host\" \\\n+                        -ipAddress      \"198.20.1.100\" \\\n+                        -gateway        \"198.18.3.1\" \\\n+                        -mask           \"255.255.255.255\"\n+\n+##\n+#  Config port filter - Add port filter details \n+#                       <reset, port list, action, filter type, type valueList>\n+##\n+ixDapAddPortFilter      -reset      true \\\n+                        -portList   {{1 1 1} {1 1 2}} \\\n+                        -action     \"enable\" \\\n+                        -type       \"ip-protocols\" \\\n+                        -valueList  {4 17}\n+\n+ixDapAddPortFilter      -reset      false \\\n+                        -portList   {{1 1 1}} \\\n+                        -action      \"disable\" \\\n+                        -type       \"udp-ports\" \\\n+                        -valueList  {22-23 25}\n+\n+ixDapAddPortFilter      -reset      false \\\n+                        -portList   {{1 1 1}} \\\n+                        -action      \"enable\" \\\n+                        -type       \"tcp-ports\" \\\n+                        -valueList  {22-23 25}\n+\n+##\n+# alternatively, set port list via loop:\n+##\n+#set firstChassisId   1\n+#set lastChassisId    1\n+#set firstCardId      3\n+#set lastCardId       3\n+#set firstPortId      5\n+#set lastPortId       8\n+#set ipAddress        \"198.18.1.100\"\n+#set gateway          \"198.18.1.1\"\n+#set mask             \"255.255.255.0\"\n+#set incrSubnetByte   3\n+#\n+#for {set chassis $firstChassisId} {$chassis <= $lastChassisId} {incr chassis} {\n+#    for {set card $firstCardId} {$card <= $lastCardId} {incr card} {\n+#        for {set port $firstPortId} {$port <= $lastPortId} {incr port} {\n+#            set macAddress [format \"00 de bb %02x %02x %02x\" $chassis $card $port]\n+#            ixDapConfigPort $chassis $card $port $macAddress $ipAddress $gateway $mask\n+#            set ipAddress [incrIpField $ipAddress $incrSubnetByte]\n+#            set gateway   [incrIpField $gateway   $incrSubnetByte]\n+#        }\n+#    }\n+#}\n+\n+#########################################################################################\n+# end of user configuration stuff\n+########################################################################################\n+\n+########################################################################################\n+# execute config/download app here\n+########################################################################################\n+if {![ixDapConfig::main -appName $applicationName]} {\n+    if {$startupProcedureExe != \"\"} {\n+        if [catch {exec $startupProcedureExe &} error] {\n+            logMsg $error\n+        }\n+    }\n+\n+    logMsg \"\\n*** Setup now complete!!! ***\"\n+}\n+\n+\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Dap/ixDapConfig.tcl b/dep/tclclient/ixTcl1.0/Dap/ixDapConfig.tcl\nnew file mode 100644\nindex 00000000..7971be46\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Dap/ixDapConfig.tcl\n@@ -0,0 +1,1702 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 5.20\n+#   \n+#   File: ixDapConfig.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t11-14-02\tDebby Stopp\n+#\n+########################################################################################\n+\n+package req IxTclServices\n+\n+namespace eval ixDapConfig {\n+    variable chassisList\n+    variable tclServer   \"\"\n+    variable userName    \"ixDapConfig\"\n+           \n+    variable appName\n+    variable defaultPortGroupId 1126\n+\n+    if [info exists interfaceArray] {\n+        unset interfaceArray\n+    }    \n+    variable interfaceArray\n+    variable interfacePortIdIndex       0 \n+    variable interfaceMacAddressIndex   1 \n+    variable interfaceIpAddressIndex    2\n+    variable interfaceGwIndex           3\n+    variable interfaceMaskIndex         4\n+    variable interfaceEnableVlanIndex   5\n+    variable interfaceVlanIdIndex       6\n+\n+    if [info exists routeArray] {\n+        unset routeArray\n+    }\n+    variable routeArray\n+    variable routePortIdIndex           0\n+    variable routeTargetIndex           1 \n+    variable routeIpAddressIndex        2 \n+    variable routeGwIndex               3\n+    variable routeMaskIndex             4\n+\n+    if [info exists filterArray] {\n+        unset filterArray\n+    }\n+    variable filterArray\n+    variable filterResetIndex           0\n+    variable filterPortListIndex        1 \n+    variable filterActionIndex          2 \n+    variable filterTypeIndex            3\n+    variable filterValueListIndex       4\n+\n+    variable logCmd    logMsg\n+    variable errorCmd  errorMsg\n+}\n+\n+proc ixDapConfigPort {chassis card port macAddress ipAddress gateway mask {enableVlan false} {vlanId 0}} \\\n+{\n+    set retCode [ixDapAddPortInterface -portId [list $chassis $card $port] -macAddress $macAddress \\\n+                 -ipAddress $ipAddress -gateway $gateway -mask $mask  -enableVlan $enableVlan -vlanId $vlanId]\n+    return $retCode\n+}\n+\n+proc ixDapAddPortInterface {args} \\\n+{\n+    set retCode [::ixDapConfig::addInterfaceToArray $args]\n+    return $retCode\n+}\n+\n+proc ixDapAddRouteTable {args} \\\n+{\n+    set retCode [::ixDapConfig::addRouteToArray $args]\n+    return $retCode\n+}\n+\n+proc ixDapAddPortFilter {args} \\\n+{\n+    set retCode [::ixDapConfig::addFilterToArray $args]\n+    return $retCode\n+}\n+\n+proc ixDapBaseIpAddresses {args} \\\n+{\n+    set retCode $::TCL_ERROR\n+    if {[ixConnectToChassis $args] == $::TCL_OK} {\n+        set retCode [::ixDapConfig::validateBaseIpAddresses $args]\n+    }\n+\n+    return $retCode\n+}\n+\n+proc ixDapCleanUp       {}                                         {return [::ixDapConfig::cleanUp]}\n+proc ixDapSetBaseIp     {chassisName ipAddress {mask 255.255.0.0}} {return [::ixDapConfig::setBaseIp $chassisName $ipAddress $mask]}\n+proc ixDapAddRoute      {destination mask interface}               {return [::ixDapConfig::addRoute  $destination $mask $interface]}\n+proc ixDapDelRoute      {destination}                              {return [::ixDapConfig::delRoute  $destination]}\n+\n+proc ixDapLogin         {userName}                                 {return [::ixDapConfig::login $userName]}\n+\n+proc ixDapConfig::Log {msg} {\n+    variable logCmd; eval [concat $logCmd [list $msg]]\n+}\n+proc ixDapConfig::Error {msg} { \n+    variable errorCmd; eval [concat $errorCmd [list $msg]] \n+}\n+\n+\n+########################################################################\n+# Procedure: init\n+#\n+# This initializes the ixDapConfig namespace\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::init {{appName \"\"}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if {$appName != \"\"} {\n+        setAppName $appName\n+    } else {\n+        set retCode $::TCL_ERROR\n+        Error \"No application name configured - check \\\"applicationName\\\"\"\n+    } \n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: login\n+#\n+# This procedure logins the current user name; login will be enforced\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::login {{newUserName \"ixDapConfig\"}} \\\n+{\n+    variable userName\n+\n+    if {$newUserName != \"\"} {\n+        set userName $newUserName\n+    }\n+    ixLogin $userName\n+}\n+\n+\n+########################################################################\n+# Procedure: printVersion\n+#\n+# This prints version info\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::printVersion {} \\\n+{\n+    set versionString [format \"\\n\\t%s\\n\\t%s\\n\\t%s\\n\\n\" \\\n+                              [version cget -installVersion] \\\n+                              [version cget -productVersion] \\\n+                              [version cget -copyright] ]\n+    Log $versionString\n+}\n+\n+\n+########################################################################\n+# Procedure: viewRoutes\n+#\n+# This procedure prints the current route config \"route print\"\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::viewRoutes {baseIpAddressList} \\\n+{\n+    set routeWindow .routeWindow\n+\n+    # we need to create a new one\n+    if [winfo exists $routeWindow] {\n+        catch {::destroy $routeWindow}\n+    }\n+\n+    toplevel $routeWindow -class Dialog\n+    wm withdraw $routeWindow\n+    wm title $routeWindow \"Route View\"\n+    wm resizable $routeWindow 0 0\n+\n+    set routeText [exec route print]\n+    set height    [regsub -all \"\\n\" $routeText \"\\n\" temp]\n+    set width     [string length [lindex $routeText 0]]\n+\n+    set routeTextBox [createViewFrame $baseIpAddressList .routeWindow $height $width]\n+    \n+    $routeTextBox insert end $routeText\n+\n+    wm deiconify $routeWindow\n+}\n+\n+\n+########################################################################\n+# Procedure: addRoute\n+#\n+# This procedure adds a route config \"route add\"\n+#\n+# Arguments(s):\n+#   destination - destination ip address, ie., 10.0.0.0\n+#   mask        - associated mask, ie., 255.255.0.0\n+#   interface   - to route through\n+#\n+########################################################################\n+proc ixDapConfig::addRoute {destination mask interface} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    catch {exec route delete $destination}\n+    if [catch {exec route add -p $destination mask $mask $interface} error] {\n+        Log $error\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: delRoute\n+#\n+# This procedure deletes a route config \"route delete\"\n+#\n+# Arguments(s):\n+#   destination - destination ip address, ie., 10.0.0.0\n+#\n+########################################################################\n+proc ixDapConfig::delRoute {destination} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    catch {exec route delete $destination}\n+\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure:    ixDapConfig::createViewFrame\n+#\n+# Description:  Create frame for viewing stuff\n+#\n+# Arguments:    none\n+#\n+# Returns:      TCL_OK:     success\n+#\n+##################################################################################\n+proc ixDapConfig::createViewFrame { baseIpAddressList parent {height 25} {width 80} {xpad 3} {ypad 2}} \\\n+{\n+    \n+    option add *font ansi\n+    incr width $xpad\n+    incr height $ypad\n+\n+    set width  [expr ($width < 80)  ? $width : 80]\n+    set height [expr ($height < 50) ? $height : 50]\n+\n+    set labelFrame [frame $parent.routeViewFrame] \n+    set infoLabelFrame $labelFrame\n+\n+    grid $labelFrame     -row 0 -column 0 -padx 0 -pady 10 -sticky w\n+\n+    set numBaseIp [llength $baseIpAddressList]\n+    if {$numBaseIp <= 1} {\n+        set text1 \"The Ixia port's management address is\"\n+        set text2 \"Please ensure that your PC has a route to this network.\"\n+    } else {\n+        set text1 \"The Ixia ports' management addresses are\"\n+        set text2 \"Please ensure that your PC has routes to these networks.\"\n+    }\n+\n+    set labelIndex 0\n+    set infoLabel$labelIndex \\\n+        [label $labelFrame.infoLabel$labelIndex -text $text1 -font {ansi 8} -width 92]\n+    grid [set infoLabel$labelIndex] -row $labelIndex -column 0 -padx 6 -pady 0  -sticky w\n+\n+    foreach baseIp $baseIpAddressList {\n+        incr labelIndex        \n+        set infoLabel$labelIndex \\\n+            [label $labelFrame.infoLabel$labelIndex -text \"\\t - $baseIp/16\" -font {ansi 8} -width 92]\n+        grid [set infoLabel$labelIndex] -row $labelIndex -column 0 -padx 6 -pady 0  -sticky w\n+    }\n+\n+    incr labelIndex\n+    set infoLabel$labelIndex \\\n+        [label $labelFrame.infoLabel$labelIndex -text $text2 -font {ansi 8} -width 92]\n+    grid [set infoLabel$labelIndex] -row $labelIndex -column 0 -padx 6 -pady 0  -sticky w\n+\n+    set routeFrame [frame $parent.routeFrame]\n+\n+    # Create a list widget to contain all the route\n+    set widgets(routeText) [text $routeFrame.routeText \\\n+            -height $height -width $width -wrap none -font {courier 8} -xscrollcommand \"$routeFrame.xScroll set\" \\\n+            -yscrollcommand \"$routeFrame.yScroll set\"]\n+\n+    set xScroll [scrollbar $routeFrame.xScroll -orient horizontal \\\n+            -command \"$widgets(routeText) xview\"]\n+    set yScroll [scrollbar $routeFrame.yScroll -orient vertical \\\n+            -command \"$widgets(routeText) yview\"]\n+\n+    grid $widgets(routeText) -row 1 -column 0 -sticky news\n+    grid $xScroll            -row 2 -column 0 -sticky we\n+    grid $yScroll            -row 1 -column 1 -sticky ns\n+    grid rowconfigure        $routeFrame 1 -weight 1\n+    grid columnconfigure     $routeFrame 0 -weight 1\n+\n+    grid $infoLabelFrame -row 0 -column 0 -padx 16 -pady 10 -sticky w -columnspan 2\n+    grid $routeFrame     -row 1 -column 0 -padx 20 -pady 10 -sticky wens\n+    grid columnconfigure $parent 0 -weight 1\n+    grid rowconfigure    $parent 1 -weight 1\n+    grid columnconfigure $parent 1 -weight 1\n+\n+    Log \"\\n*** Please check the Route View window and make sure a route exist for the following network address.\\n\"\n+    Log \" Network Address: \\{$baseIpAddressList\\} \"\n+    return $widgets(routeText)\n+}\n+\n+\n+########################################################################\n+# Procedure: setAppName\n+#\n+# This sets the appName for the ixDapConfig namespace\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::setAppName {userAppName} \\\n+{\n+    variable appName\n+    \n+    set appName $userAppName\n+}\n+\n+\n+########################################################################\n+# Procedure: setChassisList\n+#\n+# This sets the chassisList for the ixDapConfig namespace\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::setChassisList {userChassisList {userTclServer \"\"}} \\\n+{\n+    variable chassisList\n+    variable tclServer\n+\n+    set retCode $::TCL_OK\n+\n+    set chassisList $userChassisList\n+    set tclServer   $userTclServer\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: getBaseIpAddressList\n+#\n+# This gets the chassis baseIpAddressList. Once error getting any one of\n+# chassis, reset baseIpAddressList to empty which means error happened.\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::getBaseIpAddressList {} \\\n+{\n+    variable chassisList\n+\n+    set baseIpAddressList [list]\n+\n+    foreach chassis $chassisList {\n+        if {![chassis get $chassis]} {\n+            lappend baseIpAddressList [chassis cget -baseIpAddress]\n+        } else {\n+            Error \"Error getting chassis $chassis\"\n+            set baseIpAddressList [list]\n+            break\n+        }\n+    }\n+\n+    return $baseIpAddressList\n+}\n+\n+\n+########################################################################\n+# Procedure: addInterfaceToArray\n+#\n+# This procedure add interface to interfaceArray\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::addInterfaceToArray {args} \\\n+{\n+    variable      interfaceArray\n+\n+    set retCode   $::TCL_OK\n+\n+    set portId     none\n+    set macAddress \"00 00 00 00 00 00\"\n+    set ipAddress  \"0.0.0.0\"\n+    set mask       \"0.0.0.0\"\n+    set gateway    \"0.0.0.0\"\n+    set enableVlan false\n+    set vlanId     0\n+\n+    set arraySize [array size interfaceArray]\n+    foreach arg [lindex $args 0] {\n+        if {[regexp {^-[a-zA-Z].+} $arg]} {\n+            #\n+            # Current argument is preceeded by '-'.\n+            #\n+            switch -- $arg {\n+                \"-portId\"      -\n+                \"-macAddress\"  -\n+                \"-ipAddress\"   -\n+                \"-mask\"        -\n+                \"-gateway\"     -\n+                \"-enableVlan\"   -\n+                \"-vlanId\"       {\n+                    set currentOption [string trimleft $arg -]\n+                    set currentAction getValue\n+                }\n+                default {\n+                    Error \"Invalid option \\\"$arg\\\"\"\n+                    set retCode $::TCL_ERROR\n+                    break\n+                }\n+            }\n+        } else {\n+            if {[info exists currentAction]} {\n+                switch $currentAction {\n+                    \"getValue\" {\n+                        switch $currentOption {\n+                            portId {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                            macAddress {\n+                                set $currentOption $arg\n+                            }\n+                            ipAddress  {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                            mask      {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                            gateway   {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                            enableVlan   {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                            vlanId   {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                        }\n+                        catch {unset currentOption}\n+                        catch {unset currentAction}\n+                    }\n+                    default {\n+                        set retCode $::TCL_ERROR\n+                        break\n+                    }\n+                }\n+            } else {\n+                set retCode $::TCL_ERROR\n+                break\n+            }\n+        }\n+    }\n+\n+    if {$retCode == $::TCL_OK && $portId != \"none\"} {\n+        set interfaceArray($arraySize) \\\n+            [list $portId $macAddress $ipAddress $gateway $mask $enableVlan $vlanId]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: getInterfacePortList\n+#\n+# This procedure gets the port list to use w/this application\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::getInterfacePortList {{unique 1}} \\\n+{\n+    variable interfaceArray\n+    variable interfacePortIdIndex\n+\n+    set portList [list]\n+    foreach {index interface} [array get interfaceArray] {\n+        set port [lindex $interface $interfacePortIdIndex]\n+        if {$unique == $::true} {\n+            if {[lsearch $portList $port] == -1} {\n+                lappend portList [join [split $port ',']]\n+            }\n+        } else {\n+            lappend portList [join [split $port ',']]\n+        }\n+    }\n+\n+    return [lnumsort $portList]\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: getSortListFromArray\n+#\n+# This procedure gets sort list from array like {0 caa 1 bbb 2 abc}\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::getSortListFromArray {arrayName} \\\n+{\n+    variable $arrayName\n+\n+    set itemList {}\n+\n+    set arraySize [array get $arrayName]\n+\n+    foreach {index args} [array get $arrayName] {\n+        if {[llength $itemList] == 0} {\n+            lappend itemList $index $args\n+        } else {\n+            set insertIndex 0\n+            foreach {tempIndex tempArgs} $itemList {\n+                if {$index < $tempIndex} {\n+                    set itemList [linsert $itemList $insertIndex $index $args]\n+                } else {\n+                    set insertIndex [expr $insertIndex + 2]\n+                    if {[llength $itemList] == [expr $insertIndex]} {\n+                        set itemList [linsert $itemList $insertIndex $index $args]\n+                    }                         \n+                }\n+            }\n+        }\n+    }\n+    \n+    return $itemList\n+}\n+\n+########################################################################\n+# Procedure: removeInterfaceFromArray\n+#\n+# This procedure remove interface from interfaceArray\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::removeInterfaceFromArray {c l p} \\\n+{\n+    variable interfaceArray\n+    variable interfacePortIdIndex\n+\n+    foreach {index interface} [array get interfaceArray] {\n+        set myPort [lindex $interface $interfacePortIdIndex]\n+        if {$c == [lindex $myPort 0] && $l == [lindex $myPort 1] && $p == [lindex $myPort 2]} {\n+            unset interfaceArray($index)\n+        }\n+    }\n+}\n+\n+\n+########################################################################\n+# Procedure: addRouteToArray\n+#\n+# This procedure add route to routeArray\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::addRouteToArray {args} \\\n+{\n+    variable routeArray\n+\n+    set retCode         $::TCL_OK\n+    set portId          none\n+    set target          \"net\"\n+    set ipAddress       \"0.0.0.0\"\n+    set gateway         \"0.0.0.0\"\n+    set mask            \"0.0.0.0\"\n+\n+    set arraySize [array size routeArray]\n+    foreach arg [lindex $args 0] {\n+        if {[regexp {^-[a-zA-Z].+} $arg]} {\n+            #\n+            # Current argument is preceeded by '-'.\n+            #\n+            switch -- $arg {\n+                \"-portId\"           -\n+                \"-target\"           -\n+                \"-ipAddress\"        -\n+                \"-mask\"             -\n+                \"-gateway\"          {\n+                    set currentOption [string trimleft $arg -]\n+                    set currentAction getValue\n+                }\n+                default {\n+                    Error \"Invalid option \\\"$arg\\\"\"\n+                    set retCode $::TCL_ERROR\n+                    break\n+                }\n+            }\n+        } else {\n+            if {[info exists currentAction]} {\n+                switch $currentAction {\n+                    \"getValue\" {\n+                        switch $currentOption {\n+                            portId {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                            target {\n+                                set $currentOption $arg\n+\t\t\t\t            }                                \n+                            ipAddress  {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                            mask      {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                            gateway   {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                        }\n+                        catch {unset currentOption}\n+                        catch {unset currentAction}\n+                    }\n+                    default {\n+                        set retCode $::TCL_ERROR\n+                        break\n+                    }\n+                }\n+            } else {\n+                set retCode $::TCL_ERROR\n+                break\n+            }\n+        }\n+    }\n+\n+    if {$retCode == $::TCL_OK && $portId != \"none\"} {\n+        set routeArray($arraySize) [list $portId $target $ipAddress $gateway $mask]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: addFilterToArray\n+#\n+# This procedure add filter to filterArray\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::addFilterToArray {args} \\\n+{\n+    variable filterArray\n+\n+    set retCode   $::TCL_OK\n+\n+    set reset       false \n+    set action      enable\n+    set portList    none\n+    set type        none\n+    set valueList   none\n+\n+    set arraySize [array size filterArray]\n+    foreach arg [lindex $args 0] {\n+        if {[regexp {^-[a-zA-Z].+} $arg]} {\n+            #\n+            # Current argument is preceeded by '-'.\n+            #\n+            switch -- $arg {\n+                \"-reset\"        -\n+                \"-action\"       -\n+                \"-portList\"     -\n+                \"-type\"         -\n+                \"-valueList\"    {\n+                    set currentOption [string trimleft $arg -]\n+                    set currentAction getValue\n+                }\n+                default {\n+                    Error \"Invalid option \\\"$arg\\\"\"\n+                    set retCode $::TCL_ERROR\n+                    break\n+                }\n+            }\n+        } else {\n+            if {[info exists currentAction]} {\n+                switch $currentAction {\n+                    \"getValue\" {\n+                        switch $currentOption {\n+                            reset {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                            action {\n+                                set $currentOption $arg\n+                            }\n+                            portList  {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                            type      {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                            valueList   {\n+                                set $currentOption $arg\n+\t\t\t\t            }\n+                        }\n+                        catch {unset currentOption}\n+                        catch {unset currentAction}\n+                    }\n+                    default {\n+                        set retCode $::TCL_ERROR\n+                        break\n+                    }\n+                }\n+            } else {\n+                set retCode $::TCL_ERROR\n+                break\n+            }\n+        }\n+    }\n+\n+    if {$retCode == $::TCL_OK && $portList != \"none\"} {\n+        set filterArray($arraySize) [list $reset $portList $action $type $valueList]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: getValueFromList\n+#\n+# This procedure gets value from itemList by passing index\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::getValueFromList {itemList index} \\\n+{\n+    set retValue \"\"\n+\n+    if {$index < [llength $itemList]} {\n+        set retValue [lindex $itemList $index]\n+    }\n+\n+    return $retValue           \n+}\n+\n+\n+########################################################################\n+# Procedure: isSubnetOverlapped\n+#\n+# This procedure checks for overlapping subnets, should be eventually\n+# be moved into main code for 3.70.\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::isSubnetOverlapped {ipAddr1 mask1 ipAddr2 mask2} \\\n+{\n+    set retCode $::false\n+\n+    set resultMask      [expr [ip2num $mask1] & [ip2num $mask2]]\n+    set range1Subnet    [expr [ip2num $ipAddr1] & $resultMask]\n+    set range2Subnet    [expr [ip2num $ipAddr2] & $resultMask]\n+\n+    if {$range1Subnet == $range2Subnet} {\n+        set retCode $::true\n+    } \n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: setBaseIp\n+#\n+# This procedure sets a new base IP address on the chassis\n+#\n+# Arguments(s):\n+#   chassisName - name or ID of chassis\n+#   ipAddress   - base ip address to use\n+#   mask        - mask to use w/base ip address\n+#\n+# Return:\n+#   returns TCL_OK if successful\n+#\n+########################################################################\n+proc ixDapConfig::setBaseIp {chassisName ipAddress {mask 255.255.0.0}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if [chassis get $chassisName] {\n+        if [ixConnectToChassis $chassisName] {\n+            Error \"Error - invalid chassis $chassisName specified.\"\n+            return $::TCL_ERROR\n+        }\n+    }\n+    \n+    chassis config -baseIpAddress   $ipAddress\n+    chassis config -baseAddressMask $mask\n+    if [chassis setBaseIp $chassisName] {\n+        Error \"Unable to set base IP address $ipAddress/$mask.\"\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: validateBaseIpAddresses\n+#\n+# This procedure validates & checks for overlapping ip addresses among\n+# all base ip address in all chassis in chain\n+#\n+# Arguments(s):\n+#\n+# Return:\n+#   returns TCL_OK if all valid base ip address & no overlap\n+#\n+########################################################################\n+proc ixDapConfig::validateBaseIpAddresses {chassisList} \\\n+{\n+    set currentBaseIp \"\"\n+    set currentMask   \"\"\n+    set overlapping   $::false\n+\n+    Log \"\\n**************************************************************\"\n+    foreach myChassis $chassisList {\n+        if [chassis get $myChassis] {\n+            Error \"Error getting chassis $myChassis\"\n+            set retCode $::TCL_ERROR\n+            break\n+        }\n+        set nextBaseIp [chassis cget -baseIpAddress]\n+        set nextMask   [chassis cget -baseAddressMask]\n+        Log \"Chassis $myChassis base IP Address == $nextBaseIp/$nextMask\"\n+        if {$currentBaseIp != \"\" } {\n+            if [isSubnetOverlapped $currentBaseIp $currentMask $nextBaseIp $nextMask] {\n+                set overlapping $::true\n+                break\n+            }\n+        }\n+        set currentBaseIp $nextBaseIp\n+        set currentMask   $nextMask\n+    }\n+\n+    Log \"**************************************************************\\n\"\n+\n+    if {$overlapping} {\n+        Log \"----> WARNING: Overlapping base ip address configuration detected in your chassis chain!!!\"\n+        Log \"      Please verify base ip address configuration on all chassis in chain\"\n+        Log \"      To modify/update the base ip address of a chassis, use the following command:\\n\"\n+        Log \" ixDapSetBaseIp <chassisNameOrId> <baseIpAddress>\\n\\n\"\n+    }\n+\n+    return [expr $overlapping?$::TCL_ERROR:$::TCL_OK]\n+}\n+\n+\n+########################################################################\n+# Procedure: setupPortInterfaces\n+#\n+# This procedure adds the interfaces for the ixDapConfig\n+#\n+# Arguments(s): write    - write to hardware, default is write\n+#\n+########################################################################\n+proc ixDapConfig::setupPortInterfaces {PortList {write write}} \\\n+{\n+    upvar $PortList portList\n+\n+    variable interfaceArray\n+    variable interfacePortIdIndex\n+    variable interfaceMacAddressIndex\n+    variable interfaceIpAddressIndex\n+    variable interfaceGwIndex\n+    variable interfaceMaskIndex\n+    variable interfaceEnableVlanIndex\n+    variable interfaceVlanIdIndex\n+\n+    set retCode $::TCL_OK\n+\n+    Log \"\" ;# empty line\n+    ip setDefault\n+    set configedPortList {}\n+    set interfaceList [getSortListFromArray interfaceArray]\n+\n+    if [interfaceTable::setDefault portList] {\n+        Error \"Error setting interface table to default\"\n+        set retCode $::TCL_ERROR\n+        break\n+    }\n+\n+    foreach {index interface} $interfaceList {\n+        set myPort      [getValueFromList $interface $interfacePortIdIndex]\n+        set macAddress  [getValueFromList $interface $interfaceMacAddressIndex]\n+        set ipAddress   [getValueFromList $interface $interfaceIpAddressIndex]\n+        set gateway     [getValueFromList $interface $interfaceGwIndex]\n+        set mask        [getValueFromList $interface $interfaceMaskIndex]\n+        set enableVlan  [getValueFromList $interface $interfaceEnableVlanIndex]\n+        set vlanId      [getValueFromList $interface $interfaceVlanIdIndex]\n+\n+        set c [lindex $myPort 0]\n+        set l [lindex $myPort 1]\n+        set p [lindex $myPort 2]\n+        if {[lsearch $configedPortList $myPort] != -1} {\n+            continue\n+        } else {\n+            lappend configedPortList $myPort\n+        }\n+\n+        if [port get $c $l $p] {\n+            Error \"Error getting port $c $l $p\"\n+            set retCode $::TCL_ERROR\n+            break\n+        }\n+\n+        port config -MacAddress $macAddress\n+\n+        if {$enableVlan == \"true\"} {\n+            # protocol cget -enable802dot1qTag is for all ports in configArp\n+            # once one of ports is vlan enabled, we need to config enable802dot1qTag true\n+            protocol config -enable802dot1qTag true\n+            vlan config -vlanID $vlanId\n+            if [vlanUtils::setPortTagged $c $l $p] {\n+                Error \"Error setting vlan tag for port $c $l $p\"\n+                set retCode $::TCL_ERROR\n+                break\n+            }            \n+            if [vlan set $c $l $p] {\n+                Error \"Error setting vlan for port $c $l $p\"\n+                set retCode $::TCL_ERROR\n+                break\n+            }                \n+        } else {\n+            if [vlanUtils::setPortUntagged $c $l $p] {\n+                Error \"Error unsetting vlan tag for port $c $l $p\"\n+                set retCode $::TCL_ERROR\n+                break\n+            }\n+            if [vlan set $c $l $p] {\n+                Error \"Error setting vlan for port $c $l $p\"\n+                set retCode $::TCL_ERROR\n+                break\n+            }                \n+        }\n+        \n+        if [port set $c $l $p] {\n+            Error \"Error setting port $c $l $p\"\n+            set retCode $::TCL_ERROR\n+            break\n+        }\n+\n+        ip config -sourceIpAddr  $ipAddress\n+        ip config -destDutIpAddr $gateway\n+        ip config -sourceIpMask  $mask\n+\n+        if [ip set $c $l $p] {\n+            Error \"Error setting ip $c $l $p\"\n+            set retCode $::TCL_ERROR\n+            break\n+        }\n+        Log \"Adding an interface on port $c $l $p: MAC:$macAddress, IP:$ipAddress, GW:$gateway, Mask:$mask, Vlan Enable:$enableVlan, Vlan Id:$vlanId\"\n+    }\n+\n+    if {$retCode == $::TCL_OK} {\n+        set retCode [configureArp configedPortList configedPortList nowrite]\n+    }\n+\n+    if {$retCode == $::TCL_OK} {\n+        set configedPortList {}\n+        foreach {index interface} [array get interfaceArray] {\n+            set myPort [getValueFromList $interface $interfacePortIdIndex]\n+            if {[lsearch $configedPortList $myPort] == -1} {\n+                lappend configedPortList $myPort\n+                continue\n+            } else {\n+                set retCode [addPortInterface $interface $write]\n+            }\n+        }\n+    }\n+\n+    if {$retCode == $::TCL_OK && $write == \"write\"} {\n+        if [writeConfigToHardware configedPortList] {\n+            Error \"Error writing ports to hardware\"\n+            set retCode $::TCL_ERROR\n+        }\n+    }\n+\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: addPortInterface\n+#\n+# This procedure add one interface\n+#\n+# Arguments(s): write - write to hardware, default is write\n+#\n+########################################################################\n+proc ixDapConfig::addPortInterface {interface {write write}} \\\n+{\n+    variable interfaceArray\n+    variable interfacePortIdIndex\n+    variable interfaceMacAddressIndex\n+    variable interfaceIpAddressIndex\n+    variable interfaceGwIndex\n+    variable interfaceMaskIndex\n+    variable interfaceEnableVlanIndex\n+    variable interfaceVlanIdIndex\n+\n+    set retCode $::TCL_OK\n+                            \n+    set myPort      [getValueFromList $interface $interfacePortIdIndex]\n+    set macAddress  [getValueFromList $interface $interfaceMacAddressIndex]\n+    set ipAddress   [getValueFromList $interface $interfaceIpAddressIndex]\n+    set gateway     [getValueFromList $interface $interfaceGwIndex]\n+    set mask        [getValueFromList $interface $interfaceMaskIndex]\n+    set enableVlan  [getValueFromList $interface $interfaceEnableVlanIndex]\n+    set vlanId      [getValueFromList $interface $interfaceVlanIdIndex]\n+    set maskWidth   [getIpV4MaskWidth $mask]\n+\n+    set c [lindex $myPort 0]\n+    set l [lindex $myPort 1]\n+    set p [lindex $myPort 2]\n+    set portList [list $myPort]\n+\n+    # Add multiple interfaces into protocol interface table\n+    if [interfaceTable  select  $c $l $p] {\n+        Error \"Error seleting port $c $l $p\"\n+        set retCode $::TCL_ERROR\n+        break\n+    }\n+\n+    interfaceEntry  clearAllItems     addressTypeIpV4\n+    interfaceEntry  clearAllItems     addressTypeIpV6\n+    interfaceIpV4   setDefault        \n+    interfaceIpV4   config  -ipAddress          $ipAddress\n+    interfaceIpV4   config  -gatewayIpAddress   $gateway\n+    interfaceIpV4   config  -maskWidth          $maskWidth\n+    if {[interfaceEntry  addItem addressTypeIpV4]} {\n+        Error \"Error adding item into interfaceEntry\"\n+        set retCode $::TCL_ERROR\n+        break\n+    }\n+\n+    interfaceEntry  setDefault        \n+    interfaceEntry  config  -enable             true\n+    interfaceEntry  config  -description        [interfaceTable::formatEntryDescription $c $l $p]\n+    interfaceEntry  config  -macAddress         $macAddress\n+    interfaceEntry  config  -enableVlan         $enableVlan\n+    interfaceEntry  config  -vlanId             $vlanId\n+    if {[interfaceTable  addInterface]} {\n+        Error \"Unable to add interface to Interface Table for port $c $l $p\"\n+        set retCode $::TCL_ERROR\n+        break\n+    }\n+    interfaceEntry  clearAllItems     addressTypeIpV4\n+    interfaceEntry  clearAllItems     addressTypeIpV6\n+\n+    Log \"Adding an interface on port $c $l $p: MAC:$macAddress, IP:$ipAddress, GW:$gateway, Mask:$mask, VLAN Enable:$enableVlan, VLAN ID:$vlanId\"\n+    \n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: setupRouteTable\n+#\n+# This procedure setup port routing table\n+#\n+# Arguments(s): None\n+#\n+########################################################################\n+proc ixDapConfig::setupRouteTable {} \\\n+{\n+    variable           routeArray\n+    variable           routePortIdIndex\n+    variable           routeTargetIndex\n+    variable           routeIpAddressIndex\n+    variable           routeGwIndex\n+    variable           routeMaskIndex\n+\n+    set retCode        $::TCL_OK\n+    set configPortList [getInterfacePortList]\n+                            \n+    Log \"\" ;# empty line\n+    set routeList [getSortListFromArray routeArray]\n+    foreach {index route} $routeList {\n+        set myPort          [getValueFromList $route $routePortIdIndex]\n+        set target          [getValueFromList $route $routeTargetIndex]\n+        set ipAddress       [getValueFromList $route $routeIpAddressIndex]\n+        set gateway         [getValueFromList $route $routeGwIndex]\n+        set mask            [getValueFromList $route $routeMaskIndex]\n+\n+        set c [lindex $myPort 0]\n+        set l [lindex $myPort 1]\n+        set p [lindex $myPort 2]\n+        set portList [list $myPort]\n+\n+        if {[lsearch $configPortList $myPort] == -1} {\n+            Log \"Port $myPort doesn't exist. Ignore adding a route on port $c $l $p:Target:$target, IP:$ipAddress, GW:$gateway, Mask:$mask\"\n+        } else {\n+            # delete a route if it exists before adding it\n+            managePcpuCommand portList [format \"route del -%s %s gw %s netmask %s\" $target $ipAddress $gateway $mask]\n+            set errorInfo \"\"\n+            if [managePcpuCommand portList [format \"route add -%s %s gw %s netmask %s\" $target $ipAddress $gateway $mask]] {\n+                Error \"Error adding a route for port $c $l $p:Target:$target, IP:$ipAddress, GW:$gateway, Mask:$mask\"\n+                set retCode $::TCL_ERROR\n+                break\n+            } else {\n+                Log \"Adding a route on port $c $l $p:Target:$target, IP:$ipAddress, GW:$gateway, Mask:$mask\"\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: setupPortFilters\n+#\n+# This procedure sets up filter on ports\n+#\n+# Arguments(s): None\n+#\n+########################################################################\n+proc ixDapConfig::setupPortFilters {} \\\n+{\n+    variable           filterArray\n+    variable           filterResetIndex\n+    variable           filterPortListIndex\n+    variable           filterActionIndex\n+    variable           filterTypeIndex\n+    variable           filterValueListIndex\n+\n+    set retCode        $::TCL_OK\n+    set configPortList [getInterfacePortList]\n+    \n+    Log \"\" ;# empty line\n+    set filterList [getSortListFromArray filterArray]\n+    foreach {index filter} $filterList {\n+        set reset       [getValueFromList $filter $filterResetIndex]\n+        set portList    [getValueFromList $filter $filterPortListIndex]\n+        set action      [getValueFromList $filter $filterActionIndex]\n+        set type        [getValueFromList $filter $filterTypeIndex]\n+        set valueList   [getValueFromList $filter $filterValueListIndex]\n+\n+        set removePortList {}\n+        set newPortList    {}\n+        foreach myPort $portList {\n+            if {[lsearch $configPortList $myPort] == -1} {\n+                lappend removePortList $myPort\n+            } else {\n+                lappend newPortList $myPort\n+            }\n+        }\n+\n+        if {[llength $removePortList] != 0} {\n+            Log \"Port $removePortList doesn't exist. Ignore adding a filter on port $removePortList: Reset:$reset, Action:$action, Type:$type, ValueList:$valueList\"\n+        }\n+        if {[llength $newPortList] != 0} {\n+            # Add a route on portList\n+            if {$reset == \"true\"} {\n+                if [managePcpuCommand newPortList \"filter --reset\"] {\n+                    Error \"Error resetting filter for port $newPortList\"\n+                    set retCode $::TCL_ERROR\n+                    break\n+                } else {\n+                    Log \"Resetting filter on port $newPortList\"\n+                }\n+            }   \n+\n+            if [manageFilter newPortList $action $type $valueList] {\n+                Error \"Error adding filter on port $newPortList: Reset:$reset, Action:$action, Type:$type, ValueList:$valueList\"\n+                set retCode $::TCL_ERROR\n+                break\n+            } else {\n+                Log \"Adding a filter on port $newPortList: Reset:$reset, Action:$action, Type:$type, ValueList:$valueList\"\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: manageFilter\n+#\n+# This procedure manage filter IP protocol pcpu command excuted on the ports\n+#\n+# Arguments(s): PortList   - port list\n+#               action     - enable or disable\n+#               type       - ip-protocols or icmp-types or udp-ports or tcp-ports\n+#               valueList  - type value list something like {1 2 3} \n+#\n+########################################################################\n+proc ixDapConfig::manageFilter {PortList action type valueList} \\\n+{\n+    upvar $PortList portList\n+\n+    set retCode $::TCL_OK\n+    set action  [string tolower $action]\n+    set type    [string tolower  $type]\n+\n+    if {$action != \"enable\" && $action != \"disable\"} {\n+        Error \"Valid action value is enable or disable\"\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    if {$type != \"ip-protocols\" && $type != \"icmp-types\" && \\\n+        $type != \"udp-ports\" && $type != \"tcp-ports\"} {\n+        Error \"Valid type value is ip-protocols, icmp-types, udp-ports or tcp-ports\"\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    if {$retCode == $::TCL_OK} {\n+        set pcpuCommand [format \"filter --%s-%s=%s\" $action $type [join $valueList ,]]\n+        set retCode [managePcpuCommand portList $pcpuCommand]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: managePcpuCommand\n+#\n+# This procedure manage pcpu command excuted on the ports\n+#\n+# Arguments(s): PortList      - port list\n+#               pcpuCommand   - pcpuCommand in string such as ls\n+#\n+########################################################################\n+proc ixDapConfig::managePcpuCommand {PortList pcpuCommand} \\\n+{\n+    upvar $PortList portList\n+    return [issuePcpuCommand portList $pcpuCommand]\n+}\n+\n+\n+########################################################################\n+# Procedure: downloadPackage\n+#\n+# This procedure downloads the package to the ports\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::downloadPackage {portList} \\\n+{\n+    return [managePackage $portList downloadPackage]\n+}\n+\n+\n+########################################################################\n+# Procedure: deletePackage\n+#\n+# This procedure deletes downloaded package on the ports\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::deletePackage {portList} \\\n+{ \n+    return [managePackage $portList deletePackage -noverbose]\n+}\n+\n+\n+########################################################################\n+# Procedure: managePackage\n+#\n+# This procedure is a utility for manager the package <download/delete>\n+#\n+# Arguments(s):\n+#    portList\n+#    action    - downloadPackage | deletePackage\n+#\n+########################################################################\n+proc ixDapConfig::managePackage {portList action {verbose -verbose}} \\\n+{ \n+    variable defaultPortGroupId\n+    variable appName\n+    set retCode $::TCL_OK\n+\n+    # need a portgroup\n+    portGroup destroy $defaultPortGroupId\n+    if [portGroup create $defaultPortGroupId] {\n+        Error \"Error creating port group $defaultPortGroupId\"\n+        set retCode $::TCL_ERROR\n+        return $retCode\n+    }\n+\n+    foreach port $portList {\n+        scan $port \"%d %d %d\" c l p\n+        if [portGroup add $defaultPortGroupId $c $l $p] {\n+            Error \"Error adding port $c $l $p to port group $defaultPortGroupId\"\n+            set retCode $::TCL_ERROR\n+            break\n+        }\n+    }\n+    \n+    if {$retCode == $::TCL_OK} {\n+        switch $action {\n+            \"downloadPackage\" {\n+                if {$verbose == \"-verbose\"} {\n+                    Log \"\\nDownloading application $appName on port list...\"\n+                }\n+                if [serviceManager $action $appName $defaultPortGroupId] {\n+                    # Get failed portList\n+                    set failedPorts [list]\n+                    foreach port $portList {\n+                        scan $port \"%d %d %d\" c l p\n+                        set installedPackages    [split [serviceManager getInstalledPackages $c $l $p] ,]\n+                        if {[lsearch $installedPackages $appName] < 0} {\n+                            lappend failedPorts [list $c $l $p]\n+                        }\n+                    }\n+                    Error \"Error downloading package $appName on port $failedPorts\"\n+                    set retCode $::TCL_ERROR\n+                } else {\n+                    if {$verbose == \"-verbose\"} {\n+                        Log \"Download complete\"\n+                    }\n+                }\n+            }\n+            \"deletePackage\" {\n+                if {$verbose == \"-verbose\"} {\n+                    Log \"\\nDeleting application $appName on port list...\"\n+                }\n+                serviceManager $action $appName $defaultPortGroupId\n+                set retCode $::TCL_OK\n+            }\n+        }\n+    }\n+\n+    portGroup destroy $defaultPortGroupId\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: pingBaseIpAddress\n+#\n+# This procedure ping chassis base Ip address.\n+#\n+# Arguments(s): retryTime: default value is 1\n+#\n+########################################################################\n+proc ixDapConfig::pingBaseIpAddress {{retryTime 1}} \\\n+{\n+    variable chassisList\n+    \n+    set retCode $::TCL_OK\n+\n+    foreach chassis $chassisList {\n+        if {![chassis get $chassis]} {\n+            set baseIpAddress [chassis cget -baseIpAddress]\n+            regsub -all \".0$\" $baseIpAddress \".1\" baseIpAddress\n+            set i 1\n+\t        Log \"\"  ;# empty line\n+            while {$i <= $retryTime} {\n+\t        Log \"Pinging $baseIpAddress for chassis $chassis - $i of $retryTime ...\"\n+                set replyMsg    \"Reply from $baseIpAddress\"\n+                set pingResults [eval {exec ping $baseIpAddress}]\n+                if [regexp $replyMsg $pingResults] {\n+                    break\n+                } else {\n+                    if {$i == $retryTime} { \n+                        Error \"Error pinging $baseIpAddress for chassis $chassis\"\n+                        set retCode $::TCL_ERROR\n+                        break\n+                    }\n+                }\n+                incr i\n+            }\n+        } else {\n+            Error \"Error getting chassis $chassis\"\n+            set retCode $::TCL_ERROR\n+        }\n+\n+        if {$retCode} {\n+            break\n+        } else {\n+\t        Log \"Ping to $baseIpAddress for chassis $chassis is successful\"\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: cleanUp\n+#\n+# This procedure clean up global array.\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc ixDapConfig::cleanUp {} \\\n+{\n+    variable interfaceArray\n+    variable routeArray\n+    variable filterArray\n+\n+    if [info exists interfaceArray] {\n+        unset interfaceArray\n+    }\n+\n+    if [info exists routeArray] {\n+        unset routeArray\n+    }\n+    \n+    if [info exists filterArray] {\n+        unset filterArray\n+    }\n+\n+    return $::TCL_OK\n+}\n+\n+\n+########################################################################\n+# Procedure: main\n+#\n+# The main procedure for the ixDapConfig package\n+#\n+# Options:\n+#\n+#\n+#\t-appName _name_of_application_to_download_\n+#\n+#\t\tname of application to download\n+#\n+#\t-setFactoryDefaults _boolean_\n+#\t\treset all the ports to factory defaults as part of the download\n+#\t\tprocess.\n+#\n+#\t-checkLinkState _boolean_\n+#\n+#\t\tcheck the link state of the target ports prior to\n+#\t\tstarting the download process. if the link state is\n+#\t\tdown on any of the target ports, the download process is\n+#\t\tstopped and $::TCL_ERROR is returned\n+#\n+#\t-deletePackage _boolean_\n+#\n+#\t\tdelete downloaded package before downloading package\n+#\n+#\t-verbose _boolean_\n+#\t\tbe more verbose when logging status messages\n+#\n+#   The following options may merit removal\n+#   since the application could employ them reasonably outside of main ??\n+#\n+#\t-hideMainWindow _boolean_\n+#\t\tHide the main Tk window \".\"\n+#\n+#\t-pingBaseIpAddress _boolean_\n+#\n+#\t\tping the base ip addresses of all the chassis\n+#\t\tthat are part of the download process. If \n+#\t\tif any of the chassis do not repsoned to the ping\n+#\t\tthen pop up a routeview window and return $::TCL_ERROR\n+#\n+# Logging and Error messages:\n+#\n+#\tBy default, logging and error messages are generated via the std.\n+#\tixia API functions 'logMsg' and 'errorMsg'. These can be overridden\n+#\tby resetting the namespace varibles \n+#\t\tixDapConfig::logCmd\n+#\tand \n+#\t\tixDapConfig::errorCmd\n+#\n+#\tShould be functions that allow one to set these variables ??\n+#\n+# Return Values:\n+#\n+#\t$::TCL_ERROR on success\n+#\t$::TCL_OK on error\n+#\n+########################################################################\n+proc ixDapConfig::main {args} \\\n+{\n+    variable chassisList\n+    variable tclServer   \"\"\n+    \n+    set retCode          $::TCL_OK\n+\n+    #\n+    # option defaults\n+    #\n+    array set opts [list                 \\\n+\t    -hideMainWindow         $::true  \\\n+    \t-appName                \"\"       \\\n+\t    -setFactoryDefaults     $::true  \\\n+\t    -checkLinkState         $::false \\\n+        -deletePackage          $::true  \\\n+\t    -pingBaseIpAddress      $::true  \\\n+\t    -verbose                $::true  \\\n+    ]\n+    \n+    if {![string match \"-*\" [lindex $args 0]]} {\n+    \tset opts(-appName) [lindex $args 0]\n+\t    array set opts [lrange $args 1 end]\n+    } else {\n+\t    if {[llength $args] == 1} {\n+\t        # Allow option pairs to be passed as a single list\n+\t        set args [lindex $args 0]\n+\t    }\n+\t    array set opts $args\n+    }\n+\n+    if {$opts(-hideMainWindow)} {\n+    \twm withdraw .\n+    }\n+\n+    if {$opts(-verbose)} {\n+\t    printVersion\n+    }\n+\n+    if [init $opts(-appName)] {\n+        return $::TCL_ERROR\n+    }\n+\n+\n+    #****************************************************************\n+    # Delete all chassis from the chain before connecting to them\n+    # This is a bug workaround somewhere for something \n+    # downstream. See Debby Stopp for details\n+    #****************************************************************\n+    if {[info commands chassisChain] != \"\"} {\n+        chassisChain removeAll\n+    }\n+    if [ixProxyConnect $tclServer $chassisList] {\n+        return $::TCL_ERROR\n+    }\n+    #****************************************************************\n+    \n+    # Login is mandatory for this application... \n+    if {[session cget -userName] == \"\"} {\n+        ixDapConfig::login\n+    }\n+\n+    Log \"Validating chassis base IP addresses...\"\n+    if [validateBaseIpAddresses $chassisList] {\n+        return $::TCL_ERROR\n+    }\n+\n+    set portIndex 0\n+    set portList  [getInterfacePortList]\n+    foreach myPort $portList {\n+        scan $myPort \"%d %d %d\" c l p\n+        \n+        if {![port isValidFeature $c $l $p $::portFeatureLocalCPU]} {\n+            Log \"PortCPU not supported on port $c $l $p - removing port from list\"\n+            set portList [lreplace $portList $portIndex $portIndex]\n+            removeInterfaceFromArray $c $l $p\n+        } else {\n+            incr portIndex\n+        }\n+    }\n+\n+    set portIndex 0\n+    foreach myPort $portList {\n+        scan $myPort \"%d %d %d\" c l p\n+        if [ixPortTakeOwnership $c $l $p] {\n+            set portList [lreplace $portList $portIndex $portIndex]\n+            removeInterfaceFromArray $c $l $p\n+        } else {\n+            incr portIndex\n+        }\n+    }\n+\n+    if {[llength $portList] == 0} {\n+        Log \"No ports in port list\"\n+        return $::TCL_ERROR\n+    }\n+   \n+    if {$opts(-setFactoryDefaults)} {\n+        Log \"Setting factory defaults on all ports in port list...\"\n+        if [setFactoryDefaults $portList] {\n+            Error \"Error setting factory defaults on one or more ports\"\n+            return $::TCL_ERROR\n+        }\n+\n+        if [ixWritePortsToHardware portList] {\n+            Error \"Error writing ports to hardware\"\n+            return $::TCL_ERROR\n+        }\n+    }\n+\n+    if {$opts(-checkLinkState)} {\n+        if [ixCheckLinkState portList] {\n+            return $::TCL_ERROR\n+        }\n+    }\n+\n+    if [setupPortInterfaces portList] {\n+        return $::TCL_ERROR\n+    }\n+\n+    if [setupRouteTable] {\n+        return $::TCL_ERROR\n+    }\n+\n+    if [setupPortFilters] {\n+        return $::TCL_ERROR\n+    }\n+\n+\n+    if {$opts(-deletePackage)} {\n+        if [deletePackage $portList] {\n+            return $::TCL_ERROR\n+        }\n+    }\n+\n+    if [downloadPackage $portList] {\n+        return $::TCL_ERROR\n+    }\n+\n+    # Ping chassis base ip address. If failed after retryTime, launch viewRoutes.\n+    if {$opts(-pingBaseIpAddress)} {\n+        set retryTime 3\n+        if {[pingBaseIpAddress $retryTime]} {\n+\t        set retCode $::TCL_ERROR\n+            # Move viewRoutes gui here and make it behind wish console\n+            # If baseIpAddressList is empty, we don't show viewRoutes gui.\n+            set baseIpAddressList [getBaseIpAddressList]\n+            if {[llength $baseIpAddressList] > 0 } {\n+                viewRoutes [getBaseIpAddressList]\n+                console hide\n+                console show\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+\n+\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/actions.tcl b/dep/tclclient/ixTcl1.0/Generic/actions.tcl\nnew file mode 100644\nindex 00000000..409153f6\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/actions.tcl\n@@ -0,0 +1,3241 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: actions.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t12-30-1998\tDS\n+#\n+# Description: This file contains common procs used for specific actions,\n+#              such as startTx, stopTx, etc\n+#\n+##################################################################################\n+\n+\n+########################################################################\n+# Procedure: clearStatsAndTransmit\n+#\n+# This command clears the stat counters, starts capture & starts transmit\n+#\n+# Arguments(s):\n+#   TxRxArray       - array of ports to transmit, ie. one2oneArray\n+#   duration        - approximate time of transmit\n+#   staggeredStart  - if set to 'staggeredStart' the transmit will be staggered\n+#   calcAvgRates    - \"yes\" if we want to get the rates while transmitting\n+#   avgRateArray    - array containing the average running rate for tx/rx ports\n+#\n+########################################################################\n+proc clearStatsAndTransmit {TxRxArray duration {staggeredStart notStaggeredStart} {calcAvgRates no} \\\n+                            {AvgRateArray \"\"} {calcQosRates no} {QosRateArray \"\"} {calcTxRxRates no} \\\n+\t\t\t\t\t\t\t{delay delay}} \\\n+{\n+    upvar $TxRxArray\t\ttxRxArray\n+\tupvar $AvgRateArray\t\tarArray\n+\tupvar $QosRateArray\t\tqosRateArray\n+\n+    set txPorts [getTxPorts txRxArray]\n+    \n+    if {[advancedTestParameter cget -primeDut] == $::true} {\n+\t\tstartTx txRxArray $staggeredStart\n+        after 2000\n+\t\tstopTx txRxArray\n+    }\n+\n+    set retCode [prepareToTransmit txRxArray]\n+\n+\tif {$retCode == 0} {\n+\t\tset retCode [startTx txRxArray $staggeredStart]\n+\t}\n+\n+    if {$retCode == 0 && $delay == \"delay\"} {     \n+\t    if {$duration > 0} {\n+\t        logMsg \"Transmitting frames for $duration seconds\"\n+        } else {\n+\t        logMsg \"Transmitting frames for < 1 second\"\n+        }\n+       \n+\t    if {$calcAvgRates == \"yes\"} {\n+            if {$calcQosRates == \"yes\" && $calcTxRxRates == \"no\" } {\n+                upvar $QosRateArray qosAvgRateArray\n+                set retCode [collectRates txRxArray arArray $duration qosRate qosAvgRateArray ]\n+            } elseif { $calcQosRates == \"yes\" && $calcTxRxRates == \"yes\" } {\n+                upvar $QosRateArray qrArray\n+\t\t\t\t# Note: We need to get rid of this method when we get rid of cable modem suite              \n+                set retCode [getRunRatePerSecond txRxArray arArray qrArray $duration]\n+\n+            } else {\n+                set retCode [collectRates txRxArray arArray $duration]\n+            }\n+        } else {\n+\t        # Wait for all frames to be transmitted, print msg to screen while waiting..\n+            if [writeWaitForTransmit $duration] {\n+\t            if [stopTx txPorts] {\n+\t\t            errorMsg \"Error stopping Tx on one or more ports.\"\n+                    set retCode 1\n+\t            }\n+                set ::ixStopTest 1\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: transmitAndCollectRxRatesPerSecond\n+#\n+# This command starts transmit and collecting those receive rates we want\n+#\n+# Arguments(s):\n+#   TxRxArray       - array of ports to transmit, ie. one2oneArray\n+#\tRateArray\t\t- array of rates we want\n+#\targs\t\t\t- list of stat names we want to get rate of\n+#   duration        - approximate time of transmit\n+#   staggeredStart  - if set to 'staggeredStart' the transmit will be staggered\n+#\n+########################################################################\n+proc transmitAndCollectRxRatesPerSecond {TxRxArray RxRateArray rxRateArgs duration {staggeredStart notStaggeredStart}} \\\n+{\n+    upvar $TxRxArray    txRxArray\n+\tupvar $RxRateArray\trxRateArray\n+    \n+    set retCode\t\t[prepareToTransmit txRxArray]\n+\n+\tif {$retCode == 0} {\n+\t\tset retCode [startTx txRxArray $staggeredStart]\n+\t}\n+\n+\tif {$duration > 0} {\n+\t\tlogMsg \"Transmitting frames for $duration seconds\"\n+    } else {\n+\t\tlogMsg \"Transmitting frames for < 1 second\"\n+    }\n+   \n+\tset retCode [collectRxRatesPerSecond txRxArray rxRateArray $rxRateArgs $duration]\n+\n+\t# Wait for all frames to be transmitted, print msg to screen while waiting..\n+\tif [writeWaitForTransmit $duration] {\n+\t\tif [stopTx txRxArray] {\n+\t\t\terrorMsg \"Error stopping Tx on one or more ports.\"\n+\t\t\tset retCode 1\n+\t\t}\n+\t}\n+   \n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: collectRxRatesPerSecond\n+#\n+# This command starts transmit and collecting those receive rates we want\n+#\n+# Arguments(s):\n+#   TxRxArray       - array of ports to transmit\n+#\tRxRateArray\t\t- array of receive rates we want\n+#\trxRateArgs\t\t- list of stat names we want to get receive rate of\n+#   duration        - approximate time of transmit\n+#\n+########################################################################\n+proc collectRxRatesPerSecond {TxRxArray RxRateArray rxRateArgs duration} \\\n+{\n+    upvar $TxRxArray    txRxArray\n+\tupvar $RxRateArray\trxRateArray\n+\n+    set retCode             0\n+    set count               0\n+\n+    set rxPortList  [getRxPorts txRxArray]\n+ \n+    if [createDialog \"Transmit Status\"] {\n+        set cmd logMsg\n+    } else {\n+        set cmd writeDialog\n+    }\n+\n+    set timeStart   [clock seconds]\n+    set getStatTime 0\n+\n+    for {set timeCtr 1} {$timeCtr <= $duration} {incr timeCtr} {\n+        $cmd  \"Transmitted $timeCtr of $duration seconds\"\n+        mpincr count\t\t\t\t\n+        if [getRunningRate $rxPortList rxRateArray $rxRateArgs $count] {\n+            set retCode 1\n+        }\n+        set getStatTime [mpexpr [clock seconds] - $timeStart]\n+        if {$getStatTime <= $timeCtr} {\n+    \t\tafter 1000\n+        }\n+    }\n+    debugMsg \"rxRateArray: [array get rxRateArray]\"\n+\n+    incr timeCtr -1\n+    if {$duration != $timeCtr} {\n+        logMsg \"******* Test terminated by user after $timeCtr seconds\"\n+    }\n+\n+    logMsg \"Done transmitting for $duration seconds...\\n\"\n+\n+    # destroy the dialog box if it is created\n+    if {$cmd == \"writeDialog\"} {\n+        destroyDialog\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: prepareToTransmit\n+#\n+# This command stops current transmision, clears the stat counters.\n+#\n+# Arguments(s):\n+#   TxRxArray       - array of ports to transmit, ie. one2oneArray\n+#\n+########################################################################\n+proc prepareToTransmit {TxRxArray} \\\n+{\n+    upvar $TxRxArray txRxArray\n+   \n+    set retCode $::TCL_OK\n+\n+    set allPorts    [getAllPorts txRxArray]\n+    set rxPorts     [getRxPorts txRxArray]\n+\n+\tif [stopTx allPorts] {\n+\t\terrorMsg \"Error stopping Tx on one or more ports.\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+    if {$retCode == $::TCL_OK} {\n+        set retCode [checkAllTransmitDone txRxArray]\n+    }\n+\n+    set commandList [list resetStatistics clearTimeStamp]\n+    if [issuePortGroupCommand $commandList allPorts] {\n+\t    errorMsg \"Error: Unable to issue port group commands: $commandList\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+    set commandList [list startCapture startPacketGroups]\n+    if [issuePortGroupCommand $commandList rxPorts] {\n+\t    errorMsg \"Error: Unable to issue port group commands: $commandList\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+    return $retCode\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: writeWaitForTransmit\n+#\n+# This command writes the transmit msg to a little text box\n+#\n+########################################################################\n+proc writeWaitForTransmit {duration {destroy destroy}} \\\n+{\n+    set retCode [writeWaitMessage \"Transmit Status\" \"Transmitting\" $duration $destroy]\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: writeWaitForPause\n+#\n+# This command writes the pause msg to a little text box\n+#\n+########################################################################\n+proc writeWaitForPause {dialogName duration {destroy destroy}} \\\n+{\n+    set retCode [writeWaitMessage $dialogName \"Pausing\" $duration $destroy]\n+\n+    return $retCode\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: writeWaitMessage\n+#\n+# This command writes the msg to a little text box\n+#\n+########################################################################\n+proc writeWaitMessage {dialogName messageType duration {destroy destroy}} \\\n+{\n+    global ixStopTest\n+\n+    set retCode 0\n+\n+    debugMsg \"Begin $messageType for $duration seconds...\\n\"\n+    \n+    set messageProc  writeDialog\n+\n+    if {$duration <= 1 || [createDialog $dialogName]} {\n+        set messageProc  ixPuts\n+    }\n+\n+    set currentTime [clock seconds]\n+\tfor {set timeCtr 1} {$timeCtr <= $duration && $ixStopTest != 1} {incr timeCtr} {\n+    \t$messageProc \"$messageType $timeCtr of $duration seconds\"\t\n+\n+        while {[expr {[clock seconds] - $currentTime}] < 1} {\n+            update\n+            after 20\n+        }\n+        set currentTime   [clock seconds]\n+\t}\n+\n+    incr timeCtr -1\n+\n+    if {$duration != $timeCtr} {\n+        $messageProc \"******* Test terminated by user after $timeCtr seconds\"\n+        set retCode 1\n+    } else {\n+        if {$duration < 1 } {\n+            logMsg \"Done after < 1 second.\\n\"\n+        } else {\n+            logMsg \"Done after $duration seconds.\\n\"\n+        }\n+    }\n+\n+    if {$messageProc == \"writeDialog\" && $destroy == \"destroy\"} {\n+        destroyDialog\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: issuePortGroupCommand\n+#\n+# This command builds a port group & issues the specified command, then\n+# destroys the port group when it's done\n+#\n+########################################################################\n+proc issuePortGroupCommand {command TxRxList {verbose noVerbose} {LastTimestamp \"\"} {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxList         txRxList\n+    upvar $LastTimestamp    lastTimestamp\n+\n+    return [issuePortGroupMethod txRxList lastTimestamp -method setCommand -commandList $command  -groupId $groupId -$verbose -$create -$destroy]\n+}\n+\n+\n+########################################################################\n+# Procedure: getPortGroupObject\n+#\n+# This command builds a port group & issues the specified command, then\n+# destroys the port group when it's done\n+#\n+########################################################################\n+proc getPortGroupObject {object TxRxList {verbose noVerbose} {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxList         txRxList\n+\n+    set lastTimestamp \"\"\n+    return [issuePortGroupMethod txRxList lastTimestamp -method get -commandList $object -groupId $groupId -$verbose   -$create -$destroy]\n+}\n+\n+\n+########################################################################\n+# Procedure: issuePortGroupMethod\n+#\n+# This command builds a port group & issues the specified command, then\n+# destroys the port group when it's done\n+#\n+# Argument(s):\n+#\tPortArray\t   either list of ports or array of ports\n+#   args           options include:\n+#                   -method              <portGroup method to be called>\n+#                   -commandList         <list of commands to be executed>\n+#                   -verbose             <turn on messages>\n+#                   -noVerbose           <turn off messages, default>\n+#                   -groupId             <groupId, default == 1126>\n+#                   -create/-noCreate    <default = create, optionally create/don't create portGroup>\n+#                   -destroy/-noDestroy  <default = destroy, optionally leave portGroup around when done>\n+#                   -duration            <scheduled transmit duration, default == 0>        \n+#\n+########################################################################\n+proc issuePortGroupMethod { PortArray LastTimestamp args } \\\n+{\n+\tupvar $PortArray        portArray\n+    upvar $LastTimestamp    lastTimestamp\n+\n+\tset retCode\t$::TCL_OK\n+\n+    # default some vars here...\n+    set method          setCommand\n+    set commandList     [list]\n+    set verbose         $::true\n+    set groupId         710\n+    set create          $::true\n+    set destroy         $::true\n+    set duration        0\n+    set command         none\n+    set finalCommandList [list]\n+\n+    foreach arg [join $args] {\n+        # just go ahead & remove the '-', makes things easier\n+        set dash [expr [regsub -all {^-} $arg \"\" arg]?\"-\":\"\"]\n+\n+        if { $arg == \"commandList\" } {\n+            set $command $arg\n+            set command  commandList\n+            continue\n+        } else {\n+            if { $command == \"commandList\" } {\n+                if { $dash == \"\" && [lsearch $finalCommandList $arg] <= 0 } {\n+                    lappend finalCommandList  $arg\n+                    set command  commandList\n+                    set $command $finalCommandList\n+                    continue\n+                } else {   \n+                    set $command $finalCommandList\n+                    set command  none\n+                }\n+            } \n+        }\n+\n+        switch $command {\n+            method -\n+            groupId -\n+            duration -\n+            noDestroy {\n+                set $command $arg\n+                set command  none\n+            }\n+\n+            none {\n+                switch $arg {\n+                    method {\n+                        set command method\n+                    }\n+                    duration {\n+                        set command duration\n+                    }\n+                    groupId {\n+                        set command groupId\n+                    }\n+                    verbose {\n+                        set verbose $::true\n+                    }\n+                    noVerbose -\n+                    noverbose {\n+                        set verbose $::false\n+                    }\n+                    create {\n+                        set create $::true\n+                    }\n+                    nocreate -\n+                    noCreate {\n+                        set create $::false\n+                    }\n+                    destroy {\n+                        set destroy $::true\n+                    }\n+                    nodestroy -\n+                    noDestroy {\n+                        set destroy $::false\n+                    }\n+                    default {\n+                        errorMsg \"Parameter not supported: $dash$arg\"\n+                        set retCode $::TCL_ERROR\n+                    }\n+                }\n+            }\n+            default {\n+                errorMsg \"Error in parameters: $args\"\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+    }\n+    #logMsg \"\\n method:$method, verbose:$verbose, groupId:$groupId, duration:$duration, \\\n+    #        create:$create, destroy:$destroy, commandList:$commandList\\n\"\n+\n+\n+    if [llength $portArray] {\n+        set verbose \"-$verbose\"\n+        if {$create == $::true} {\n+            debugMsg \"issuePortGroupCommand: create port group $groupId\"\n+            if [portGroup create $groupId] {\n+                errorMsg $verbose \"Error creating port group $groupId\"\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+\n+        if {$retCode == 0} {\n+            set tx_l 0\n+            set tx_p 0\n+\t        foreach tx_port $portArray {\n+\t\t        if {[scan $tx_port \"%d %d %d\" tx_c tx_l tx_p] != 3} {\n+\t\t\t\t\terrorMsg $verbose \"Error in input port array: $tx_port\"\n+\t\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t\t} else {\n+\t\t\t\t\tif [portGroup add $groupId $tx_c $tx_l $tx_p] {\n+\t\t\t\t\t\terrorMsg $verbose \"Error adding [getPortId $tx_c $tx_l $tx_p] to Tx Port Group.\"\n+\t\t\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t        }\n+\n+            foreach command $commandList {\n+                switch $method {\n+                    setCommand {\n+\t\t\t\t\t\tdebugMsg \"issuePortGroupCommand: method:$method, Command -$command, portArray -$portArray\"\n+\t\t\t\t\t\t\n+\t\t\t\t\t\t# We don't want to change the original return values ($::TCL_OK/$::TCL_ERROR) of issuePortGroupMethod.\n+\t\t\t\t\t\tset retVal\t[portGroup $method $groupId $command]\n+\n+\t\t\t\t\t\tswitch $retVal \\\n+\t\t\t\t\t\t\t$::ixTcl_notLicensed {\n+\t\t\t\t\t\t\t\terrorMsg \"Error setting command $command for port group $groupId - ixTcl_notLicensed\"\n+\t\t\t\t\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t\t\t\t\t}\\\n+\t\t\t\t\t\t\t$::ixTcl_notAvailable   {               \n+\t\t\t\t\t\t\t\terrorMsg \"Error setting command $command for port group $groupId - ixTcl_notAvailable\"\n+\t\t\t\t\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t\t\t\t\t}\\\n+\t\t\t\t\t\t\t$::ixTcl_generalError   {               \n+\t\t\t\t\t\t\t\terrorMsg \"Error setting command $command for port group $groupId - ixTcl_generalError\"\n+\t\t\t\t\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t\t\t\t\t}\\\n+\t\t\t\t\t\t\t$::ixTcl_ok -\\\n+\t\t\t\t\t\t\tdefault {\n+\t\t\t\t\t\t\t}\n+                \n+                        set lastTimestamp   [portGroup cget -lastTimestamp]\n+                    }\n+                    get {\n+\t                    if {[portGroup $method $groupId $command]} {\n+\t\t                    errorMsg $verbose \"Error getting $method $command for port group $groupId\"\n+\t\t                    set retCode $::TCL_ERROR\n+\t                    }\n+                    }\n+                    clearScheduledTransmitTime {\n+                        if {[portGroup $method $groupId]} {\n+\t\t                    errorMsg $verbose \"Error $method for port group $groupId\"\n+\t\t                    set retCode $::TCL_ERROR\n+\t                    }\n+                    }\n+\n+                    setScheduledTransmitTime {\n+                        if {[portGroup $method $groupId $duration]} {\n+\t\t                    errorMsg $verbose \"Error $method for port group $groupId\"\n+\t\t                    set retCode $::TCL_ERROR\n+\t                    }\n+                    }\n+                }\n+            }\n+        }\n+\n+        if {$destroy == $::true} {\n+            debugMsg \"issuePortGroupCommand: destroy port group $groupId\"\n+            if [portGroup destroy $groupId] {\n+                errorMsg $verbose \"Error destroying port group $groupId\"\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+    } else {\n+        set retCode $::TCL_ERROR\n+    }\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: startTx\n+#\n+# This command arms each Tx port & then sends out a pulse to the master\n+# to begin transmitting\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to start\n+#                     transmit on\n+#\n+########################################################################\n+proc startTx {TxRxArray {staggeredStart notStaggeredStart} {FirstTimestamp \"\"} {groupId 710} {create create} {destroy destroy}} \\\n+{\n+    global ixgFirstTimeStamp\n+\n+\tupvar $TxRxArray        txRxArray\n+    upvar $FirstTimestamp   firstTimestamp\n+\n+\tset retCode\t        $::TCL_OK\n+    set firstTimestamp  0\n+\n+    set txRxList    [getTxPorts txRxArray]\n+\n+    if {$staggeredStart == \"notStaggeredStart\" || $staggeredStart == \"false\"} {\n+        set command  startTransmit\n+    } else {\n+        set command staggeredStartTransmit\n+    }\n+\n+    if [issuePortGroupCommand $command txRxList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error starting Transmission for port group\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+    set ixgFirstTimeStamp   $firstTimestamp\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: startStaggeredTx\n+#\n+# This command arms each Tx port & then sends out a pulse to the master\n+# to begin transmitting\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to start\n+#                     transmit on\n+#\n+########################################################################\n+proc startStaggeredTx {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray        txRxArray\n+\n+\treturn [startTx txRxArray staggeredStart firstTimeStamp $groupId $create $destroy]\n+}\n+\n+\n+########################################################################\n+# Procedure: stopTx\n+#\n+# This command arms each Tx port & then sends out a pulse to the master\n+# to stop transmitting\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to stop\n+#                     transmit on\n+#\n+########################################################################\n+proc stopTx {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode\t$::TCL_OK\n+\n+    set txRxList    [getTxPorts txRxArray]\n+    if [issuePortGroupCommand stopTransmit txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error stopping Transmission on port group\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: startPortTx\n+#\n+# This command starts Tx on a single port; it will also stop transmit &\n+# zero stats on this port before transmitting.\n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc startPortTx {chassis lm port {FirstTimestamp \"\"} {groupId 710} {create create} {destroy destroy}} \\\n+{\n+    upvar $FirstTimestamp   firstTimestamp\n+\tset retCode\t$::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand startTransmit portList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error starting Transmission on port $chassis,$lm,$port\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+    if [info exists firstTimestamp] {\n+        debugMsg \"startPortTx on port $chassis,$lm,$port: firstTimestamp = $firstTimestamp\"\n+\t}\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: stopPortTx\n+#\n+# This command stops Tx on a single port\n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc stopPortTx {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode\t$::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand stopTransmit portList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error stopping Transmission on port $chassis,$lm,$port\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: startCapture\n+#\n+# This command turns on capture for each Rx port\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to start\n+#                     capture on\n+#\n+########################################################################\n+proc startCapture {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode 0\n+\n+    set txRxList    [getRxPorts txRxArray]\n+    if [issuePortGroupCommand startCapture txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error starting Capture for port group\"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: startPrbsCapture\n+#\n+# This command turns on capture and Packet Groups for each Rx port\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to start\n+#                     capture on\n+#\n+########################################################################\n+proc startPrbsCapture {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode 0\n+\n+    set txRxList    [getRxPorts txRxArray]\n+    if [issuePortGroupCommand startPrbsCapture txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error starting PRBS metric collection for port group\"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: stopCapture\n+#\n+# This command stops capture for each Rx port\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to stop\n+#                     capture on\n+#\n+########################################################################\n+proc stopCapture {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode 0\n+\n+    set txRxList    [getRxPorts txRxArray]\n+    if [issuePortGroupCommand stopCapture txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error stopping Capture for port group\"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+########################################################################\n+# Procedure: stopPrbsCapture\n+#\n+# This command stops capture and Packet Groups for each Rx port\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to stop\n+#                     capture on\n+#\n+########################################################################\n+proc stopPrbsCapture {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode 0\n+\n+    set txRxList    [getRxPorts txRxArray]\n+    if [issuePortGroupCommand stopPrbsCapture txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error stopping PRBS metric collection for port group\"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+########################################################################\n+# Procedure: clearPrbsCapture\n+#\n+# This command clears PRBS capture for each Rx port\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to stop\n+#                     capture on\n+#\n+########################################################################\n+proc clearPrbsCapture {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode 0\n+\n+    set txRxList    [getRxPorts txRxArray]\n+    if [issuePortGroupCommand clearPrbsCapture txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error clearing PRBS capture for port group\"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: startPortCapture\n+#\n+# This command starts capture on a single port;\n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc startPortCapture {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode\t0\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand startCapture portList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error starting Capture on port $chassis,$lm,$port\"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: startPortPrbsCapture\n+#\n+# This command starts capture and Packet Groups on a single port;\n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc startPortPrbsCapture {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode\t0\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand startPrbsCapture portList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error starting PRBS metric collection on port $chassis,$lm,$port\"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: stopPortCapture\n+#\n+# This command stops capture on a single port\n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t1 if OK, 0 if port not configured\n+#\n+########################################################################\n+proc stopPortCapture {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode\t0\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand stopCapture portList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error stopping Capture on port $chassis,$lm,$port\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+########################################################################\n+# Procedure: stopPortPrbsCapture\n+#\n+# This command stops capture and Packet Groups on a single port\n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t1 if OK, 0 if port not configured\n+#\n+########################################################################\n+proc stopPortPrbsCapture {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode\t0\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand stopPrbsCapture portList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error stopping PRBS metric collection on port $chassis,$lm,$port\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: clearPortPrbsCapture\n+#\n+# This command clears PRBS capture on a single port\n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t1 if OK, 0 if port not configured\n+#\n+########################################################################\n+proc clearPortPrbsCapture {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode\t0\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand clearPrbsCapture portList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error clearing PRBS capture on port $chassis,$lm,$port\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+########################################################################\n+# Procedure: startPacketGroups\n+#\n+# This command arms each Rx port & then sends out a pulse to the master\n+# to initiate packetGroup stats\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to start\n+#                     capturing latency stats on\n+#\n+########################################################################\n+proc startPacketGroups {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode $::TCL_OK\n+\n+    set txRxList    [getRxPorts txRxArray]\n+\n+    if [issuePortGroupCommand startPacketGroups txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error starting packetGroup stats for port group\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: stopPacketGroups\n+#\n+# This command arms each Rx port & then sends out a pulse to the master\n+# to stop packetGroup stats\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to stop\n+#                     capturing latency stats on\n+#\n+########################################################################\n+proc stopPacketGroups {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode $::TCL_OK\n+\n+    set txRxList    [getRxPorts txRxArray]\n+    if [issuePortGroupCommand stopPacketGroups txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error stopping packetGroup stats for port group\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: startPortPacketGroups\n+#\n+# This command starts packetGroup stats on a single port\n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc startPortPacketGroups {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode $::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand startPacketGroups portList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error starting packetGroup stats on port $chassis,$lm,$port\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+########################################################################\n+# Procedure: stopPortPacketGroups\n+#\n+# This command stops packetGroup stats on a single port\n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc stopPortPacketGroups {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode $::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand stopPacketGroups portList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error stopping packetGroup stats on port $chassis,$lm,$port\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\treturn $retCode\n+}\n+\n+########################################################################\n+# Procedure: clearPacketGroups\n+#\n+# This command arms each Rx port & then sends out a pulse to the master\n+# to clear packetGroup stats\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to stop\n+#                     capturing latency stats on\n+#\n+########################################################################\n+proc clearPacketGroups {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode $::TCL_OK\n+\n+    set txRxList    [getRxPorts txRxArray]\n+    if [issuePortGroupCommand clearPacketGroups txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error clearing packetGroup stats for port group\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+########################################################################\n+# Procedure: clearPortPacketGroups\n+#\n+# This command clears packetGroup stats on a single port\n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc clearPortPacketGroups {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode $::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand clearPacketGroups portList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error clearing packetGroup stats on port $chassis,$lm,$port\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: startCollisions\n+#\n+# This command arms each Rx port & then sends out a pulse to the master\n+# to initiate collisions\n+#\n+# Arguments:\n+#   TxRxArray\t- either array or list containing ports to start collisions\n+#\n+########################################################################\n+proc startCollisions {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode\t0\n+\n+    set rxPortList    [getRxPorts txRxArray]\n+\n+    if [issuePortGroupCommand collisionStart rxPortList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error starting collisions stats for port group\"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: stopCollisions\n+#\n+# This command arms each Rx port & then sends out a pulse to the master\n+# to stop collisions\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to stop collisions\n+#\n+########################################################################\n+proc stopCollisions {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode\t0\n+\n+    set rxPortList    [getRxPorts txRxArray]\n+    if [issuePortGroupCommand collisionStop rxPortList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error stopping collisions stats for port group\"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: startPortCollisions\n+#\n+# This command starts collisions on a single port\n+#\n+# Arguments(s):\n+#\tc\t- chassis\n+#\tl\t- card\n+#\tp\t- port\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc startPortCollisions {c l p {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode\t0\n+\n+    set portList    [list [list $c $l $p]]\n+\t\n+\tif [startCollisions portList $groupId $create $destroy] {\n+\t\terrorMsg \"Error starting collisions stats on port [getPortId $c $l $p]\"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+########################################################################\n+# Procedure: stopPortCollisions\n+#\n+# This command stops collisions on a single port\n+#\n+# Arguments(s):\n+#\tc\t- chassis\n+#\tl\t- card\n+#\tp\t- port\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc stopPortCollisions {c l p {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode\t0\n+\n+    set portList    [list [list $c $l $p]]\n+    if [stopCollisions portList $groupId $create $destroy] {\n+\t    errorMsg \"Error stopping collisions stats on port [getPortId $c $l $p]\"\n+\t\tset retCode 1\n+\t}\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: zeroStats\n+#\n+# This command zeros all stats\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to zero\n+#                     stats on\n+#\n+########################################################################\n+proc zeroStats {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode $::TCL_OK\n+\n+\tlogMsg \"Resetting Statistics ...\"\n+\n+    set txRxList    [getAllPorts txRxArray]\n+    if [issuePortGroupCommand resetStatistics txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error resetting stats for port group\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: zeroPortStats\n+#\n+# This command zeros all stats on this port\n+#\n+# Argument(s):\n+#\tchassis\t\tchassis ID\n+#\tlm\t\t\tLoad Module number\n+#\tport\t\tport number\n+#\n+########################################################################\n+proc zeroPortStats {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode $::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand resetStatistics portList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error resetting stats on port $chassis,$lm,$port\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: clearPerStreamTxStats\n+#\n+# This command zeros all stream Tx stats on all ports\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to zero\n+#                     stats on\n+#\n+########################################################################\n+proc clearPerStreamTxStats {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode $::TCL_OK\n+\n+    set txRxList    [getAllPorts txRxArray]\n+    if [issuePortGroupCommand clearPerStreamTxStats txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error clearing per stream Tx stats for port group\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: clearPerStreamTxPortStats\n+#\n+# This command zeros all stream Tx stats on this port\n+#\n+# Argument(s):\n+#\tchassis\t\tchassis ID\n+#\tlm\t\t\tLoad Module number\n+#\tport\t\tport number\n+#\n+########################################################################\n+proc clearPerStreamTxPortStats {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode $::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand clearPerStreamTxStats portList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error clearing per stream Tx stats on port $chassis,$lm,$port\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+########################################################################\n+# Procedure: clearPcsLaneStatistics\n+#\n+# This command zeros all pcs data lane stats on all ports\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to zero\n+#                     stats on\n+#\n+########################################################################\n+proc clearPcsLaneStatistics {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode $::TCL_OK\n+\n+    set txRxList    [getAllPorts txRxArray]\n+    if [issuePortGroupCommand clearPcsLaneStats txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error clearing pcs lane stats for port group\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: clearPcsLanePortStatistics\n+#\n+# This command zeros all pcs data lane stats on this ports\n+#\n+# Argument(s):\n+#\tchassis\t\tchassis ID\n+#\tlm\t\t\tLoad Module number\n+#\tport\t\tport number\n+#\n+########################################################################\n+proc clearPcsLanePortStatistics {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tset retCode $::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand clearPcsLaneStats portList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error clearing pcs lane stats on port $chassis,$lm,$port\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: clearTimeStamp\n+#\n+# This command synchronizes the timestamp value among all chassis\n+#\n+# Arguments:\n+#   TxRxArray   - either array or list containing ports to clear/synchronize\n+#                 time stamp on\n+#\n+########################################################################\n+proc clearTimeStamp {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray txRxArray\n+\n+\tset retCode\t0\n+\n+    set txRxList    [getAllPorts txRxArray]\n+    if [issuePortGroupCommand clearTimeStamp txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error clearing the time stamp for port group \"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: flushAddressTable\n+#\n+# This command writes MII in order to flush the address table. Note:\n+# this may not work with all DUTs.\n+#\n+# Arguments(s):\n+#   PortMap     one2oneArray, one2manyArray, many2oneArray or many2manyArray\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc flushAddressTable { PortMap {checkLink yes}} \\\n+{\n+\tupvar $PortMap portMap\n+\n+    set retCode $::TCL_OK\n+\n+    set portList  [getAllPorts portMap]\n+\n+    changePortLoopback portList $::true verbose\n+    checkLinkState portMap portsToRemove messageOff\n+    changePortLoopback portList $::false verbose\n+\n+\t# check the link state of all ports; if down, remove from list\n+    if {$checkLink == \"yes\"} {\n+\t    if [checkLinkState portList portsToRemove noMessage] {\n+            if { [llength $portsToRemove] >0 && [advancedTestParameter cget -removePortOnLinkDown] == \"true\" } {\n+                set retCode [removePorts portList $portsToRemove]\n+            } else {\n+                set errMsg   \"Link down on one or more ports\"\n+                set retCode $::TCL_ERROR\n+            }\n+\t    }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: enableArpResponse\n+#\n+# This command gets the MAC & IP addresses for that port, sets up the\n+# address table and enables the arp response engine for all ports in\n+# the portlist\n+#\n+# Arguments(s):\n+#   mapType - either oneIpToOneMAC or manyIpToOneMAC\n+#   PortMap - list or array of ports, ie. ixgSortMap\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc enableArpResponse { mapType PortMap {write nowrite}} \\\n+{\n+    upvar $PortMap   portMap\n+    set retCode 0\n+\n+    set portList    [getAllPorts portMap]\n+    foreach myport $portList {\n+\t\tscan $myport \"%d %d %d\" c l p\n+\n+        if [enablePortArpResponse $mapType $c $l $p nowrite] {\n+            set retCode 1\n+        }\n+    }\n+\n+    if {$retCode == 0 && $write == \"write\"} {\n+        set retCode [writeConfigToHardware portMap]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: enablePortArpResponse\n+#\n+# This command gets the MAC & IP addresses for that port, sets up the\n+# address table and enables the arp response engine for the specified port\n+#\n+# Arguments(s):\n+#   mapType - either oneIpToOneMAC or manyIpToOneMAC\n+#   chassis\n+#   lm\n+#   port\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc enablePortArpResponse { mapType chassis lm port {write write}} \\\n+{\n+    set retCode 0\n+\n+    protocolServer config -enableArpResponse true\n+\n+    if [protocolServer set $chassis $lm $port] {\n+        errorMsg \"Error setting protocol server on $chassis $lm $port\"\n+        set retCode 1\n+    }\n+\n+    if {$write == \"write\" && $retCode == 0} {\n+        if [protocolServer write $chassis $lm $port] {\n+            errorMsg \"Error writing protocol server on $chassis $lm $port\"\n+            set retCode 1\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: disableArpResponse\n+#\n+# This command disables the arp response engine for all ports in\n+# the portlist\n+#\n+# Arguments(s):\n+#   PortMap - list or array of ports, ie. ixgSortMap\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc disableArpResponse { PortMap {write nowrite}} \\\n+{\n+    upvar $PortMap   portMap\n+    set retCode 0\n+\n+    set portList    [getAllPorts portMap]\n+    foreach myport $portList {\n+\t\tscan $myport \"%d %d %d\" c l p\n+\n+        if [disablePortArpResponse $c $l $p nowrite] {\n+            set retCode 1\n+        }\n+    }\n+\n+    if {$retCode == 0 && $write == \"write\"} {\n+        set retCode [writeConfigToHardware portMap]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: disablePortArpResponse\n+#\n+# This command disables the arp response engine for the specified port\n+#\n+# Arguments(s):\n+#   chassis\n+#   lm\n+#   port\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc disablePortArpResponse {chassis lm port {write write}} \\\n+{\n+    set retCode 0\n+\n+    if [protocolServer get $chassis $lm $port] {\n+        errorMsg \"Error getting protocol server on $chassis $lm $port\"\n+        set retCode 1\n+    }\n+\n+    protocolServer config -enableArpResponse false\n+\n+    if [protocolServer set $chassis $lm $port] {\n+        errorMsg \"Error setting protocol server on $chassis $lm $port\"\n+        set retCode 1\n+    }\n+\n+    if {$write == \"write\" && $retCode == 0} {\n+        if [protocolServer write $chassis $lm $port] {\n+            errorMsg \"Error writing protocol server on $chassis $lm $port\"\n+            set retCode 1\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: transmitArpRequest\n+#\n+# This command transmits an Arp request via the protocol server.\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to transmit\n+#                     arp request on\n+#\n+########################################################################\n+proc transmitArpRequest {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray        txRxArray\n+\n+\tset retCode\t0\n+\n+    set txRxList    [getTxPorts txRxArray]\n+    if [issuePortGroupCommand transmitArpRequest txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error transmitting arp request for port group\"\n+\t\tset retCode 1\n+\t}\n+\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: transmitPortArpRequest\n+#\n+# This command transmits an Arp request via the protocol server on a\n+# single port\n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc transmitPortArpRequest {chassis lm port} \\\n+{\n+\tset retCode\t0\n+\n+    if [arpServer sendArpRequest $chassis $lm $port] {\n+\t    errorMsg \"Error transmitting arp request on port $chassis,$lm,$port\"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: clearArpTable\n+#\n+# This command clears the arp table via the protocol server.\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to clear\n+#                     arp table on\n+#\n+########################################################################\n+proc clearArpTable {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+\tupvar $TxRxArray        txRxArray\n+\n+\tset retCode\t0\n+\n+    set txRxList    [getTxPorts txRxArray]\n+    if [issuePortGroupCommand clearArpTable txRxList noVerbose lastTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error clearing arp for port group\"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: clearPortArpTable\n+#\n+# This command clears the arp table on a single port\n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc clearPortArpTable {chassis lm port} \\\n+{\n+\tset retCode\t0\n+\n+    if [arpServer clearArpTable $chassis $lm $port] {\n+\t    errorMsg \"Error clearing arp table on port $chassis,$lm,$port\"\n+\t\tset retCode 1\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: setDataIntegrityMode\n+#\n+# This command sets all the RX ports in the list or array to data \n+# integrity mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc setDataIntegrityMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [changePortReceiveMode txRxArray $::portRxDataIntegrity $write]\n+}\n+\n+########################################################################\n+# Procedure: setPrbsMode\n+#\n+# This command sets all the RX ports in the list or array to data \n+# integrity mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc setPrbsMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [changePortReceiveMode txRxArray $::portRxModePrbs $write]\n+}\n+\n+########################################################################\n+# Procedure: setPacketGroupMode\n+#\n+# This command sets all the RX ports in the list or array to packet\n+# group mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc setPacketGroupMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [changePortReceiveMode txRxArray $::portPacketGroup $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: setWidePacketGroupMode\n+#\n+# This command sets all the RX ports in the list or array to wide packet\n+# group mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc setWidePacketGroupMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [changePortReceiveMode txRxArray $::portRxModeWidePacketGroup $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: setCaptureMode\n+#\n+# This command sets all the RX ports in the list or array to capture\n+# mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc setCaptureMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [changePortReceiveMode txRxArray $::portCapture $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: setTcpRoundTripFlowMode\n+#\n+# This command sets all the RX ports in the list or array to round trip\n+# tcp flow mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of TX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc setTcpRoundTripFlowMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+    global portRxTcpRoundTrip\n+\n+    return [changePortReceiveMode txRxArray $portRxTcpRoundTrip $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: setPacketStreamMode\n+#\n+# This command sets all the TX ports in the list or array to packet\n+# stream mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of TX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc setPacketStreamMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+    global portTxPacketStreams\n+\n+    return [changePortTransmitMode txRxArray $portTxPacketStreams $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: setPacketFlowMode\n+#\n+# This command sets all the TX ports in the list or array to packet\n+# flow mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of TX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc setPacketFlowMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+    set retCode [changePortTransmitMode txRxArray $::portTxPacketFlows $write]\n+    switch $retCode \"\n+        $::TCL_OK -\n+        $::ixTcl_unsupportedFeature {\n+            set retCode $::TCL_OK\n+        }\n+    \"\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: setAdvancedStreamSchedulerMode\n+#\n+# This command sets all the TX ports in the list or array to use the\n+# advanced scheduler\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of TX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc setAdvancedStreamSchedulerMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+    set retCode [changePortTransmitMode txRxArray $::portTxModeAdvancedScheduler $write]\n+    switch $retCode \"\n+        $::TCL_OK -\n+        $::ixTcl_unsupportedFeature {\n+            set retCode $::TCL_OK\n+        }\n+    \"\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: setFirstLastTimestampMode\n+#\n+# This command sets all the TX ports in the list or array to PG TimeStamp\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of TX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc setFirstLastTimestampMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+    global portRxFirstTimeStamp\n+\n+    return [changePortReceiveMode txRxArray $portRxFirstTimeStamp $write]\n+}\n+\n+########################################################################\n+# Procedure: setDataIntegrityMode\n+#\n+# This command sets all the TX ports in the list or array to Data integrity\n+# Mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of TX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc setDataIntegrityMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+    global portRxDataIntegrity\n+\n+    return [changePortReceiveMode txRxArray $portRxDataIntegrity $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: setSequenceCheckingMode\n+#\n+# This command sets all the TX ports in the list or array to Sequence\n+# Checking Mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of TX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc setSequenceCheckingMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [changePortReceiveMode txRxArray $::portRxSequenceChecking $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: changePortTransmitMode\n+#\n+# This command sets all the TX ports in the list or array to the\n+# specified transmit mode & optionally writes it to hw\n+#\n+#   NOTE:  This proc does not affect oc12 cards because transmit modes\n+#          are not yet supported on those cards.\n+#\n+#   NOTE:  For OC48, if the transmit mode is specifed as \"packetFlows\", \n+#          this proc will download the advancedScheduler fpga.\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of TX ports to change\n+#   transmitMode    - either portTxPacketStreams or portTxPacketFlows\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc changePortTransmitMode {TxRxArray transmitMode {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode 0\n+    set infoFlag 1\n+\n+\tforeach tx_port [getTxPorts txRxArray] {\n+\t\tscan $tx_port \"%d %d %d\" tx_c tx_l tx_p\n+        \n+        # Check if the transmit mode is valid for the port, if it is not valid, just do nothing.\n+        # Some tests use packetFlow mode, but it is not available for 10100DPM, OC48 and oc192\n+        # (only packetStream & AdvancedScheduler modes applicable to 10100DPM, OC48 and oc192),\n+        # in this case we still use packetStream mode.\n+       \n+        set retCode [port setTransmitMode $transmitMode $tx_c $tx_l $tx_p]\n+\n+        switch $retCode {\n+            0 {\n+                lappend modList [list $tx_c $tx_l $tx_p]\n+            }\n+            1 {\n+                errorMsg \"Error setting port [getPortId $tx_c $tx_l $tx_p]\"\n+                continue\n+            }\n+            100 {\n+                errorMsg \"Port [getPortId $tx_c $tx_l $tx_p] is unavailable, check ownership.\"\n+                continue\n+            }\n+            101 {\n+                # Note: we won't print out this warning msg temporarily.\n+                # logMsg \"!WARNING:[getTxRxModeString $transmitMode ] not supported on port\\\n+                #        [getPortId $tx_c $tx_l $tx_p], actual transmit rate may vary from configured rate.\"\n+\n+                set infoFlag 0\n+                continue\n+            }\n+            200 {\n+                set retCode 0\n+                continue\n+            }\n+        }\n+\t}\n+\n+    if {$write == \"write\" && [info exists modList]} {\n+        logMsg \"Changing TX port mode - downloading FPGA, please wait ...\"\n+        set retCode [writePortsToHardware modList -noProtocolServer]\n+    } else {\n+        if {$infoFlag} {\n+            logMsg \"Configuring TX port mode to [getTxRxModeString $transmitMode]\"\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: changePortReceiveMode\n+#\n+# This command sets all the RX ports in the list or array to the\n+# specified Receive mode & optionally writes it to hw\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   receiveMode     -\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc changePortReceiveMode {TxRxArray receiveMode {write nowrite} {verbose yes} } \\\n+{\n+    upvar $TxRxArray txRxArray\n+    set retCode 0\n+\n+    set txRxList    [getRxPorts txRxArray]\n+\n+    # Checking link state here because if the link is coming up or not quite up yet when we do\n+    # the port set, then the port gets set all wrong...\n+    \n+#    checkLinkState txRxList portsToRemove noMessage\n+\n+\tforeach rx_port $txRxList {\n+\t\tscan $rx_port \"%d %d %d\" rx_c rx_l rx_p\n+\t\tset retCode [port setReceiveMode $receiveMode $rx_c $rx_l $rx_p]\n+\n+\t\tswitch $retCode {\n+\t\t    0 {\n+\t\t        lappend modList [list $rx_c $rx_l $rx_p]\n+\t\t    }\n+\t\t    1 {\n+\t\t        errorMsg \"Error setting port [getPortId $rx_c $rx_l $rx_p]\"\n+\t\t        continue\n+\t\t    }\n+\t\t    100 {\n+\t\t        errorMsg \"Port [getPortId $rx_c $rx_l $rx_p] is unavailable, check ownership.\"\n+\t\t        continue\n+\t\t    }\n+\t\t    101 {\n+\t\t        errorMsg \"!WARNING:[getTxRxModeString $receiveMode RX] mode not supported on port \\\n+                        [getPortId $rx_c $rx_l $rx_p]\"\n+\t\t        continue\n+\t\t    }\n+\t\t    200 {\n+                set retCode 0\n+\t\t        continue\n+\t\t    }\n+\t\t}\n+    }\n+\n+    if {$write == \"write\" && [info exists modList]} {\n+        logMsg \"Changing RX port mode - downloading FPGA, please wait ...\"\n+        if [writePortsToHardware modList -noProtocolServer] {\n+            set retCode 1\n+        }\n+        set retCode [checkLinkState modList]\n+    } else {\n+        if {$verbose == \"yes\" } {\n+            logMsg \"Configuring RX port mode to [getTxRxModeString $receiveMode RX]\"\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: writeToHardware\n+#\n+# This command writes into hardware.\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc writeToHardware {PortArray args} \\\n+{\n+    upvar $PortArray portArray\n+    ixProfile\n+    set retCode $::TCL_OK\n+\n+    set portList    [getAllPorts portArray]\n+\n+    # default some vars here...\n+    set method  write\n+    set verbose $::true\n+    set groupId 1126\n+    set create  $::true\n+    set destroy $::true\n+\n+    # this one is *new*, set to false to avoid stopping the protocol server \n+    # when you really just want to write all streams + filters...\n+    # default is to write protocolServer to support backwards compatibility\n+    set writeProtocolServer $::true\n+\n+    set command none\n+    foreach arg [join $args] {\n+        # just go ahead & remove the '-', makes things easier\n+        set dash [expr [regsub -all {^-} $arg \"\" arg]?\"-\":\"\"]\n+        switch $command {\n+            method -\n+            groupId -\n+            noDestroy {\n+                set $command $arg\n+                set command  none\n+            }\n+            none {\n+                switch $arg {\n+                    method {\n+                        set command method\n+                    }\n+                    protocolServer -\n+                    writeProtocolServer {\n+                        set writeProtocolServer $::true\n+                    }\n+                    noProtocolServer -                       \n+                    noWriteProtocolServer {\n+                        set writeProtocolServer $::false\n+                    }\n+                    verbose {\n+                        set verbose $::true\n+                    }\n+                    noVerbose -\n+                    noverbose {\n+                        set verbose $::false\n+                    }\n+                    groupId {\n+                        set command groupId\n+                    }\n+                    create {\n+                        set create $::true\n+                    }\n+                    nocreate -\n+                    noCreate {\n+                        set create $::false\n+                    }\n+                    destroy {\n+                        set destroy $::true\n+                    }\n+                    nodestroy -\n+                    noDestroy {\n+                        set destroy $::false\n+                    }\n+                    default {\n+                        errorMsg \"Parameter not supported: $dash$arg\"\n+                        set retCode $::TCL_ERROR\n+                    }\n+                }\n+            }\n+            default {\n+                errorMsg \"Error in parameters: $args\"\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+    }\n+    debugMsg \"method:$method, writeProtocolServer:$writeProtocolServer, verbose:$verbose, groupId:$groupId, create:$create, destroy:$destroy\"\n+\n+    if [llength $portList] {\n+        if {$create} {\n+            portGroup destroy $groupId\n+            if [portGroup create $groupId] {\n+                errorMsg \"Error creating port group $groupId\"\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+\n+        if {$retCode == 0} {\n+            if [catch {\n+\t            foreach tx_port $portList {\n+\t\t            scan $tx_port \"%d %d %d\" tx_c tx_l tx_p\n+\n+                    if [portGroup add $groupId $tx_c $tx_l $tx_p] {\n+                        errorMsg \"Error adding [getPortId $tx_c $tx_l $tx_p] to port group\"\n+                        set retCode $::TCL_ERROR\n+                    }\n+\t            }\n+\n+                if {$verbose} {\n+                    ixPuts \"--->Writing configuration to hardware...\"\n+                }\n+\t            if [portGroup $method $groupId $writeProtocolServer] {\n+\t\t            errorMsg \"Error writing configuration for port group $groupId\"\n+\t\t            set retCode $::TCL_ERROR\n+\t            }\n+\n+                if {$verbose} {\n+                    ixPuts \"    done writing configuration to hardware...\"\n+                }\n+            } error] {\n+                errorMsg $error\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+        if {$destroy} {\n+            if [portGroup destroy $groupId] {\n+                errorMsg \"Error destroying port group\"\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+    } else {\n+        errorMsg \"No ports in port list/map\"\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    ixProfile\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: writeToHardwareAsChunks\n+#\n+# This command writes the ports, including speed, etc into hardware. It\n+# differs from writeConfigToHardware because this command writes all\n+# the phy as well as the configuration.\n+#\n+# Argument(s):\n+#\tPortArray\t   either list of ports or array of ports\n+#   action         write | writeConfig\n+#   args           options include:\n+#                   -verbose             <turn on messages>\n+#                   -noVerbose           <turn off messages, default>\n+#                   -writeProtocolServer <stops protocol server & writes \n+#                                         all associated objects, default>\n+#                   -noProtocolServer    <no effect on protocol server,\n+#                                         doesn't update protocol server objects>\n+#                   -groupId             <groupId, default == 1126>\n+#                   -create/-noCreate    <default = create, optionally create/don't create portGroup\n+#                   -destroy/-noDestroy  <default = destroy, optionally leave portGroup around when done>        \n+#\n+########################################################################\n+proc writeToHardwareAsChunks {PortArray action args} \\\n+{\n+    upvar $PortArray portArray\n+\n+##############\n+##  funky workaround to avoid sending too much crap at once to the server\n+##############\n+    set retCode $::TCL_OK\n+\n+    set chunkSize [advancedTestParameter cget -portWriteChunkSize]\n+    set allPorts  [getAllPorts portArray]\n+    set from      0\n+\n+    if {[llength $allPorts]} {\n+\n+\t\tif {$chunkSize > 0} {\n+\t\t\tset to   [expr $chunkSize - 1]\n+\t\t} else {\n+\t\t\tset to   [llength $allPorts]\n+\t\t}\n+\t\tset actionGroup [lrange $allPorts $from $to]\n+\t\tset myArgs [concat $args \"-noVerbose\"]\n+\t\n+\t\twhile {$actionGroup != \"\"} {\n+\t\t\tif {$to >= [llength $allPorts]} {\n+\t\t\t\tset myArgs $args\n+\t\t\t}\n+\t\t\tif [writeToHardware actionGroup [join [list -method $action [join $myArgs]]]] {\n+\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t}\n+\t\t\tif {$chunkSize > 0} {\n+\t\t\t\tincr from $chunkSize\n+\t\t\t\tincr to   $chunkSize\n+\n+\t\t\t\tset actionGroup [lrange $allPorts $from $to]\n+\t\t\t} else {\n+\t\t\t\tset actionGroup \"\"\n+\t\t\t}\n+\t\t}\n+\t} else {\n+        errorMsg \"No ports in port list/map\"\n+        set retCode $::TCL_ERROR\n+    } \t\n+    \n+    return $retCode    \n+}\n+\n+\n+\n+########################################################################\n+# Procedure: writePortsToHardware\n+#\n+# This command writes the ports, including speed, etc into hardware. It\n+# differs from writeConfigToHardware because this command writes all\n+# the phy as well as the configuration.\n+#\n+# Argument(s):\n+#\tPortArray\t   either list of ports or array of ports\n+#   args           options include:\n+#                   -verbose             <turn on messages>\n+#                   -noVerbose           <turn off messages, default>\n+#                   -writeProtocolServer <stops protocol server & writes \n+#                                         all associated objects, default>\n+#                   -noProtocolServer    <no effect on protocol server,\n+#                                         doesn't update protocol server objects>\n+#                   -groupId             <groupId, default == 1126>\n+#                   -create/-noCreate    <default = create, optionally create/don't create portGroup\n+#                   -destroy/-noDestroy  <default = destroy, optionally leave portGroup around when done>        \n+#\n+########################################################################\n+proc writePortsToHardware {PortArray args} \\\n+{\n+    upvar $PortArray portArray\n+\n+    return [writeToHardwareAsChunks portArray write [join $args]]\n+}\n+\n+\n+########################################################################\n+# Procedure: writeConfigToHardware\n+#\n+# This command writes the port array into hardware\n+#\n+# Argument(s):\n+#\tPortArray\t   either list of ports or array of ports\n+#   args           options include:\n+#                   -verbose             <turn on messages>\n+#                   -noVerbose           <turn off messages, default>\n+#                   -writeProtocolServer <stops protocol server & writes \n+#                                         all associated objects, default>\n+#                   -noProtocolServer    <no effect on protocol server,\n+#                                         doesn't update protocol server objects>\n+#                   -groupId             <groupId, default == 1126>\n+#                   -create/-noCreate    <default = create, optionally create/don't create portGroup\n+#                   -destroy/-noDestroy  <default = destroy, optionally leave portGroup around when done>        \n+#\n+########################################################################\n+proc writeConfigToHardware {PortArray args} \\\n+{\n+    upvar $PortArray portArray\n+\n+    return [writeToHardwareAsChunks portArray writeConfig [join $args]]\n+}\n+\n+\n+########################################################################\n+# Procedure: resetSequenceIndex\n+#\n+# This command reset the sequence index\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc resetSequenceIndex {TxRxArray { groupId 710 } {create create} {destroy destroy}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+    set txRxList [getRxPorts txRxArray]\n+    if [issuePortGroupCommand resetSequenceIndex txRxList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error reseting the sequence index for port group\"\n+\t    set retCode $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: resetPortSequenceIndex\n+#\n+# This command reset sequence index on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc resetPortSequenceIndex {chassis lm port {FirstTimestamp \"\"} {groupId 710} {create create} {destroy destroy}} \\\n+{\n+    upvar $FirstTimestamp   firstTimestamp\n+    set retCode $::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand resetSequenceIndex portList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error reseting the sequence index on port $chassis,$lm,$port\"\n+\t    set retCode $::TCL_ERROR\n+\t}\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: loadPoePulse\n+#\n+# This command loads the poe pulse\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc loadPoePulse {TxRxArray { groupId 710 } {create create} {destroy destroy}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+    set txRxList [getAllPorts txRxArray]\n+    if [issuePortGroupCommand loadPoePulse txRxList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error loading the poe pulse for port group\"\n+\t    set retCode $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: loadPortPoEPulse\n+#\n+# This command loads the poe pulse on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc loadPortPoePulse {chassis lm port} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    return [loadPoePulse portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: armPoeTrigger\n+#\n+# This command arms the poe trigger\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc armPoeTrigger {TxRxArray { groupId 710 } {create create} {destroy destroy}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+    set txRxList [getAllPorts txRxArray]\n+    if [issuePortGroupCommand armPoeTrigger txRxList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error arming the poe trigger for port group\"\n+\t    set retCode $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: armPortPoeTrigger\n+#\n+# This command arms the poe trigger on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc armPortPoeTrigger {chassis lm port} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    return [armPoeTrigger portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: abortPoeArm\n+#\n+# This command aborts the poe arm\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc abortPoeArm {TxRxArray { groupId 710 } {create create} {destroy destroy}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+    set txRxList [getAllPorts txRxArray]\n+    if [issuePortGroupCommand abortPoeArm txRxList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error aborting the poe arm for port group\"\n+\t    set retCode $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: abortPortPoeArm\n+#\n+# This command aborts the poe arm on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc abortPortPoeArm {chassis lm port} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    return [abortPoeArm portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: resetSequenceIndex\n+#\n+# This command reset the sequence index\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc resetSequenceIndex {TxRxArray { groupId 710 } {create create} {destroy destroy}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode 0\n+\n+    set txRxList [getRxPorts txRxArray]\n+    if [issuePortGroupCommand resetSequenceIndex txRxList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error reseting the sequence index for port group\"\n+\t    set retCode 1\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: resetPortSequenceIndex\n+#\n+# This command reset sequence index on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc resetPortSequenceIndex {chassis lm port {FirstTimestamp \"\"} {groupId 710} {create create} {destroy destroy}} \\\n+{\n+    upvar $FirstTimestamp   firstTimestamp\n+\tset retCode\t0\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand resetSequenceIndex portList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error reseting the sequence index on port $chassis,$lm,$port\"\n+\t\tset retCode 1\n+\t}\n+    if [info exists firstTimestamp] {\n+        debugMsg \"resetPortSequenceIndex on port $chassis,$lm,$port: firstTimestamp = $firstTimestamp\"\n+\t}\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: loadPoEPulse\n+#\n+# This command loads the poe pulse\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc loadPoEPulse {TxRxArray { groupId 710 } {create create} {destroy destroy}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+    set txRxList [getAllPorts txRxArray]\n+    if [issuePortGroupCommand loadPoEPulse txRxList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error loading the poe pulse for port group\"\n+\t    set retCode $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: loadPortPoEPulse\n+#\n+# This command loads the poe pulse on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc loadPortPoEPulse {chassis lm port {FirstTimestamp \"\"} {groupId 710} {create create} {destroy destroy}} \\\n+{\n+    upvar $FirstTimestamp   firstTimestamp\n+    set retCode $::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    if [issuePortGroupCommand loadPoEPulse portList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error loading the poe pulse on port $chassis,$lm,$port\"\n+\t    set retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+\n+\n+########################################################################\n+# Procedure: restartAutoNegotiation\n+#\n+# This command restarts auto negotiation OR restarts PPP negotiation\n+#\n+# Argument(s):\n+#\tTxRxArray\t    List of ports or array of ports\n+#\n+#   Results :       0 : No error found\n+#                   1 : Error found\n+#\n+########################################################################\n+proc restartAutoNegotiation {TxRxArray {groupId 710} {create create} {destroy destroy}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+    set txRxList [getAllPorts txRxArray]\n+    if [issuePortGroupCommand restartAutoNegotiate txRxList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error restarting auto negotiation\"\n+\t    set retCode $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: rebootLocalCpu\n+#\n+# This command reboots the local Cpu on a port list\n+#\n+# Argument(s):\n+#\tPortArray\t- either list of ports or array of ports\n+#\n+# Return:\n+#\t0 if OK, 1 if action failed\n+#\n+########################################################################\n+proc rebootLocalCpu {TxRxArray { groupId 710 } {create create} {destroy destroy}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode\t\t$::TCL_OK\n+    set txRxList\t[getAllPorts txRxArray]\n+\n+    foreach portItem $txRxList {\n+        scan $portItem \"%d %d %d\" chassId cardId portId\n+\n+\t\tset retValue [port isValidFeature $chassId $cardId $portId portFeatureLocalCPU]\n+\n+\t\tswitch $retValue {\n+\t\t    1 {\n+\t\t        lappend cpuPortList [list $chassId $cardId $portId]\n+\t\t    }\n+\t\t    0 {\n+\t\t        errorMsg \"!WARNING: portFeatureLocalCPU is not supported on port [getPortId $chassId $cardId $portId]\"\n+\t\t        continue\n+\t\t    }\n+\t\t}\n+\t}\n+\n+\tif {[info exists cpuPortList]} {\n+\t\tlogMsg \"Rebooting port cpu, please wait ...\"\n+\t\tif [issuePortGroupCommand rebootLocalCPU cpuPortList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t\t\terrorMsg \"Error rebooting local cpu for port group\"\n+\t\t\tset retCode $::TCL_ERROR\n+\t\t}\n+\t}\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: rebootPortLocalCpu\n+#\n+# This command reboots the local Cpu on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if action failed\n+#\n+########################################################################\n+proc rebootPortLocalCpu {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    set portList\t[list [list $chassis $lm $port]]\n+    return  [rebootLocalCpu portList $groupId $create $destroy] \n+}\n+\n+\n+########################################################################\n+# Procedure: simulatePhysicalInterfaceDown\n+#\n+# This command simulates physical interface down on a port list\n+#\n+# Argument(s):\n+#\tPortArray\t- either list of ports or array of ports\n+#\n+# Return:\n+#\t0 if OK, 1 if action failed\n+#\n+########################################################################\n+proc simulatePhysicalInterfaceDown {TxRxArray { groupId 710 } {create create} {destroy destroy}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode\t\t$::TCL_OK\n+    set txRxList\t[getAllPorts txRxArray]\n+\n+    foreach portItem $txRxList {\n+        scan $portItem \"%d %d %d\" chassId cardId portId\n+\n+\t\tset retValue [port isValidFeature $chassId $cardId $portId portFeatureSimulateCableDisconnect]\n+\n+\t\tswitch $retValue {\n+\t\t    1 {\n+\t\t        lappend newPortList [list $chassId $cardId $portId]\n+\t\t    }\n+\t\t    0 {\n+\t\t        errorMsg \"!WARNING: portFeatureSimulateCableDisconnect is not supported on port [getPortId $chassId $cardId $portId]\"\n+\t\t        continue\n+\t\t    }\n+\t\t}\n+\t}\n+\n+\tif {[info exists newPortList]} {\n+\t\tlogMsg \"Simulating physical interface down, please wait ...\"\n+\t\tif [issuePortGroupCommand simulatePhysicalInterfaceDown newPortList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t\t\terrorMsg \"Error simulating physical interface down for port group\"\n+\t\t\tset retCode $::TCL_ERROR\n+\t\t}\n+\t}\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: simulatePortPhysicalInterfaceDown\n+#\n+# This command simulates physical interface down on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if action failed\n+#\n+########################################################################\n+proc simulatePortPhysicalInterfaceDown {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    set portList\t[list [list $chassis $lm $port]]\n+    return  [simulatePhysicalInterfaceDown portList $groupId $create $destroy] \n+}\n+\n+\n+\n+########################################################################\n+# Procedure: simulatePhysicalInterfaceUp\n+#\n+# This command simulates physical interface up on a port list\n+#\n+# Argument(s):\n+#\tPortArray\t- either list of ports or array of ports\n+#\n+# Return:\n+#\t0 if OK, 1 if action failed\n+#\n+########################################################################\n+proc simulatePhysicalInterfaceUp {TxRxArray { groupId 710 } {create create} {destroy destroy}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode\t\t$::TCL_OK\n+    set txRxList\t[getAllPorts txRxArray]\n+\n+    foreach portItem $txRxList {\n+        scan $portItem \"%d %d %d\" chassId cardId portId\n+\n+\t\tset retValue [port isValidFeature $chassId $cardId $portId portFeatureSimulateCableDisconnect]\n+\n+\t\tswitch $retValue {\n+\t\t    1 {\n+\t\t        lappend newPortList [list $chassId $cardId $portId]\n+\t\t    }\n+\t\t    0 {\n+\t\t        errorMsg \"!WARNING: portFeatureSimulateCableDisconnect is not supported on port [getPortId $chassId $cardId $portId]\"\n+\t\t        continue\n+\t\t    }\n+\t\t}\n+\t}\n+\n+\tif {[info exists newPortList]} {\n+\t\tlogMsg \"Simulating physical interface up, please wait ...\"\n+\t\tif [issuePortGroupCommand simulatePhysicalInterfaceUp newPortList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t\t\terrorMsg \"Error simulating physical interface up for port group\"\n+\t\t\tset retCode $::TCL_ERROR\n+\t\t}\n+\t}\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: simulatePortPhysicalInterfaceUp\n+#\n+# This command simulates physical interface up on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if action failed\n+#\n+########################################################################\n+proc simulatePortPhysicalInterfaceUp {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    set portList\t[list [list $chassis $lm $port]]\n+    return  [simulatePhysicalInterfaceUp portList $groupId $create $destroy] \n+}\n+\n+\n+\n+########################################################################\n+# Procedure: startAtmOamTransmit\n+#\n+# This command starts the atm oam transmit\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc startAtmOamTransmit {TxRxArray { groupId 710 } {create create} {destroy destroy}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+    set txRxList [getAllPorts txRxArray]\n+    if [issuePortGroupCommand startAtmOamTx txRxList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error starting Atm Oam transmit for port group\"\n+\t    set retCode $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: startPortAtmOamTransmit\n+#\n+# This command starts the atm oam transmit on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc startPortAtmOamTransmit {chassis lm port} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    return [startAtmOamTransmit portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: stopAtmOamTransmit\n+#\n+# This command starts the atm oam transmit\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc stopAtmOamTransmit {TxRxArray { groupId 710 } {create create} {destroy destroy}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+    set txRxList [getAllPorts txRxArray]\n+    if [issuePortGroupCommand stopAtmOamTx txRxList noVerbose firstTimestamp $groupId $create $destroy] {\n+\t    errorMsg \"Error stoping Atm Oam transmit for port group\"\n+\t    set retCode $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: stopPortAtmOamTransmit\n+#\n+# This command starts the atm oam transmit on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc stopPortAtmOamTransmit {chassis lm port} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    set portList    [list [list $chassis $lm $port]]\n+    return [stopAtmOamTransmit portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: setScheduledTransmitTime\n+#\n+# This command builds a port group, sets/clears the scheduled transmit\n+# time and destroys the port group when it's done\n+#\n+########################################################################\n+proc setScheduledTransmitTime {TxRxArray duration {groupId 710}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set txRxList        [getTxPorts txRxArray]\n+    set object          [list noCommand]\n+    set lastTimestamp   \"\"\n+\n+    if { $duration } {\n+        return [issuePortGroupMethod txRxList lastTimestamp -method setScheduledTransmitTime -duration $duration \\\n+                -commandList $object -groupId $groupId -noVerbose  -create -destroy ]\n+    } else {\n+        return [issuePortGroupMethod txRxList lastTimestamp -method clearScheduledTransmitTime \\\n+                -commandList $object -groupId $groupId -noVerbose  -create -destroy ]\n+\n+    }\n+}\n+\n+########################################################################\n+# Procedure: setAutoInstrumentationMode\n+#\n+# This command sets all the RX ports in the list or array to packet\n+# group mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc setAutoDetectInstrumentationMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+\tset retCode $::TCL_OK\n+\n+    set portList\t\t[getRxPorts txRxArray]\n+\tset validPortList\t[list]\n+\n+\tforeach portItem $portList {\n+\t\tscan $portItem \"%d %d %d\" chassId cardId portId\n+\n+\t\tif {[port isValidFeature $chassId $cardId $portId $::portFeatureAutoDetectRx]} {\n+\t\t\tif {[port get $chassId $cardId $portId]} {\n+\t\t\t\terrorMsg \"Error getting port [getPortId $chassId $cardId $portId].\"\n+\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t\tbreak\n+\t\t\t}\n+\n+\t\t\tif {[port isValidFeature $chassId $cardId $portId $::portFeatureRxWidePacketGroups]} {\n+\t\t\t\tset receiveMode\t[expr ($::portRxModeWidePacketGroup | $::portRxDataIntegrity | $::portRxSequenceChecking)]\n+\t\t\t} else {\t\t\t\t\n+\t\t\t\tset receiveMode\t[expr ($::portPacketGroup | $::portRxDataIntegrity | $::portRxSequenceChecking)]\n+\t\t\t}\t\t\t\n+\t\t\t \n+\t\t\tport config -receiveMode\t\t\t\t\t$receiveMode\n+\t\t\tport config -enableAutoDetectInstrumentation $::true\n+\n+\t\t\tif {[port set $chassId $cardId $portId]} {\n+\t\t\t\terrorMsg \"Error setting port [getPortId $chassId $cardId $portId].\"\n+\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t\tbreak\n+\t\t\t}\n+\t\t\tlappend validPortList [list $chassId $cardId $portId]\n+\t\t}\n+\t}\n+\n+    if {$write == \"write\" && [llength $validPortList]} {\n+        logMsg \"Changing RX port mode to [getTxRxModeString $receiveMode RX] - please wait ...\"\n+        if [writePortsToHardware validPortList -noProtocolServer] {\n+            set retCode 1\n+        }\n+        set retCode [checkLinkState validPortList]\n+    } else {\n+\t\tlogMsg \"Configuring RX port mode to [getTxRxModeString $receiveMode RX]\"\n+    }\n+\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure: enablePortIntrinsicLatencyAdjustment\n+#\n+# This command enables the  Intrinsic Latency Adjustment on the ports\n+# that support the feature\n+#\n+# Arguments(s):\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc enablePortIntrinsicLatencyAdjustment { chassId cardId portId enable {write nowrite}} \\\n+{\n+    set portList [list [list $chassId $cardId $portId]]\n+\n+    return [enableIntrinsicLatencyAdjustment portList $enable $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: enableIntrinsicLatencyAdjustment\n+#\n+# This command enables the  Intrinsic Latency Adjustment on the ports\n+# that support the feature\n+#\n+# Arguments(s):\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc enableIntrinsicLatencyAdjustment { TxRxArray enable {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+\tset retCode $::TCL_OK\n+\n+    set portList\t\t[getAllPorts txRxArray]\n+\tset validPortList\t[list]\n+\n+\tif { $enable } {\n+\t\tset messageStr\t\"enabling\"\n+\t} else {\n+\t\tset messageStr\t\"disabling\"\n+\t}\n+\n+\tforeach portItem $portList {\n+\t\tscan $portItem \"%d %d %d\" chassId cardId portId\n+\n+\t\tset retCode\t[ixUtils enableIntrinsicLatencyAdjustment $chassId $cardId $portId $enable]\n+\t\tif { $retCode != $::TCL_OK } {\n+\t\t\tlogMsg \"Error $messageStr of intrinsic latency adjustment for $chassId $cardId $portId\"\n+\t\t} else {\n+\t\t\tlappend validPortList [list $chassId $cardId $portId]\n+\t\t}\t\t\t\n+\t}\n+\n+\tif { [llength $validPortList] } {\n+\t\tif {$write == \"write\" } {\n+\t\t\tlogMsg \"Enabling intrinsic latency adjustment on port(s) - please wait ...\"\n+\t\t\tif {[writeConfigToHardware validPortList -noProtocolServer]} {\n+\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t}\n+\t\t} else {\n+\t\t\tlogMsg \"Configured $messageStr of intrinsic latency adjustment for port $chassId $cardId $portId\"\n+\t\t}\n+\t} else {\n+\t\tlogMsg \"No valid ports in the list for intrinsic latency feature.\"\n+\t}\n+\n+\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure: isIntrinsicLatencyAdjustmentEnabled\n+#\n+# This command enables the  Intrinsic Latency Adjustment on the ports\n+# that support the feature\n+#\n+# Arguments(s):\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc isIntrinsicLatencyAdjustmentEnabled { chassId cardId portId } \\\n+{\n+    return [ixUtils isIntrinsicLatencyAdjustmentEnabled $chassId $cardId $portId]\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/addressTableUtils.tcl b/dep/tclclient/ixTcl1.0/Generic/addressTableUtils.tcl\nnew file mode 100644\nindex 00000000..188ca8a8\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/addressTableUtils.tcl\n@@ -0,0 +1,117 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: addressTableUtils.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t04/05/2000\tDS\n+#\n+# Description: This file contains common procs used for ipAddressTable\n+#              manipulation\n+#\n+##################################################################################\n+\n+\n+########################################################################\n+# Procedure: ipAddressSetDefault\n+#\n+# This command sets the ipAddressTable & iAddressTableItem to defaults\n+#\n+#\n+########################################################################\n+proc ipAddressSetDefault {} \\\n+{\n+    ipAddressTable setDefault\n+    ipAddressTableItem setDefault\n+}\n+\n+\n+########################################################################\n+# Procedure: updateIpAddressTable\n+#\n+# This command updates the ipAddressTable w/current ip & port objects\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#\n+########################################################################\n+proc updateIpAddressTable {chassis card port {write nowrite}} \\\n+{\n+    set retCode 0\n+\n+    if [ip get $chassis $card $port] {\n+        errorMsg \"Error getting ip on port $chassis $card $port\"\n+        set retCode 1\n+    }\n+\n+    if [port get $chassis $card $port] {\n+        errorMsg \"Error getting port $chassis $card $port\"\n+        set retCode 1\n+    }\n+\n+    ipAddressTableItem config -fromIpAddress            [ip cget -sourceIpAddr]\n+    ipAddressTableItem config -gatewayIpAddress         [ip cget -destDutIpAddr]\n+    ipAddressTableItem config -fromMacAddress           [port cget -MacAddress]\n+    ipAddressTableItem config -numAddresses             [port cget -numAddresses]\n+\n+    if [ipAddressTableItem set] {\n+        errorMsg \"Error setting ipAddressTableItem\"\n+        set retCode 1\n+    }\n+\n+    if [ipAddressTable addItem] {\n+        errorMsg \"Error adding item to ipAddressTable\"\n+        set retCode 1\n+    }\n+\n+    ipAddressTable config -defaultGateway               [ipAddressTableItem cget -gatewayIpAddress]\n+    if [ipAddressTable set $chassis $card $port] {\n+        errorMsg \"Error setting ipAddressTable on port $chassis $card $port\"\n+        set retCode 1\n+    }\n+\n+    if {$write == \"write\" && $retCode == 0} {\n+        if [protocolServer write $chassis $card $port] {\n+            errorMsg \"Error writing protocol server on $chassis $card $port\"\n+            set retCode 1\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/calculate.tcl b/dep/tclclient/ixTcl1.0/Generic/calculate.tcl\nnew file mode 100644\nindex 00000000..4dbdcdf2\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/calculate.tcl\n@@ -0,0 +1,527 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: calculate.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t12-30-1998\tDS\n+#\n+# Description: This file contains common procs used for calculating things\n+#\n+##################################################################################\n+\n+\n+########################################################################\n+# Procedure: mpincr\n+#\n+# This command uses mpexpr stuff to overlay the Tcl incr for use w/\n+# 64-bit numbers.\n+#\n+########################################################################\n+proc mpincr {Value {incrAmt 1}} \\\n+{\n+    upvar $Value value\n+\n+    set value [mpexpr $value + $incrAmt]\n+    return $value\n+}\n+\n+########################################################################\n+# Procedure: calculatePercentLossExact\n+#\n+# This command calculates the percent loss based on tx/rx frames -\n+#    returns *exact* percent loss (not prettied up)\n+#\n+# Arguments(s):\n+#   txFrames    - number of transmitted frames\n+#   rxFrames    - number of received frames\n+#\n+########################################################################\n+proc calculatePercentLossExact {txFrames rxFrames} \\\n+{\n+    set loss 0.00\n+\n+\tif [catch {mpexpr double($txFrames-$rxFrames)/$txFrames * 100.} loss] {\n+        set loss    100.00\n+    }\n+\n+    if {$loss < 0.} {\n+        set loss 0.00\n+    }\n+\n+    return $loss\n+}\n+\n+\n+########################################################################\n+# Procedure: calculatePercentLoss\n+#\n+# This command calculates the percent loss based on tx/rx frames &\n+# returns a formatted string of the form \"%6.2f\"\n+#\n+# Arguments(s):\n+#   txFrames    - number of transmitted frames\n+#   rxFrames    - number of received frames\n+#\n+########################################################################\n+proc calculatePercentLoss {txFrames rxFrames} \\\n+{\n+    set loss                [calculatePercentLossExact $txFrames $rxFrames]\n+\tset percentLossFormat   [advancedTestParameter cget -percentLossFormat]\n+    set loss                [formatNumber $loss $percentLossFormat]\n+\n+    # check to see if we received more frames than we transmitted\n+\t# Since 32 bit counter (mpexpr) is used here, if we get a 32 bit long number (in binary) whose most \n+\t# significant bit is 1, it will be recognized as a negtive number. So we use regexp\n+    # to determinde wheather $txFrames - $rxFrames is a negative number.\n+    if { [regexp {^-[0-9]+$} [mpexpr $txFrames - $rxFrames]] } {\n+        set loss  \"$loss - NOTE: Received more frames than tx'd\"\n+    }\n+\t#if {[mpexpr $txFrames-$rxFrames] < 0} {\n+    #    set loss  \"$loss - NOTE: Received more frames than tx'd\"\n+    #}\n+\n+    return $loss\n+}\n+\n+\n+########################################################################\n+# Procedure: calculatePercentThroughput\n+#\n+# This command calculates the percent throughput based on tx/rx frames &\n+# returns a formatted string of the form \"%6.2f\"\n+#\n+# Arguments(s):\n+#   tputRate    - throughput rate\n+#   maxRate     - max throughput rate\n+#\n+########################################################################\n+proc calculatePercentThroughput {tputRate maxRate} \\\n+{\n+    set thruput 0.00\n+\n+\tif [catch {mpexpr ($tputRate*100.)/$maxRate} thruput] {\n+        set thruput    0.\n+    }\n+\n+    return  [format \"%6.2f\" $thruput]\n+}\n+\n+\n+########################################################################\n+# Procedure: calculateDuration\n+#\n+# This command calculates the approximate transmit time\n+#\n+# Arguments(s):\n+#   numTxFrames - total number of frames to transmit\n+#   frameRate   - transmit rate\n+#   numFrames   - the 'numFrame' value set to stream config -numFrames\n+#   loopcount   - the loopcount\n+#\n+########################################################################\n+proc calculateDuration {numTxFrames frameRate {numFrames 1} {loopcount 1}} \\\n+{\n+    set duration 0\n+\n+    if {$frameRate > 0} {\n+        if [catch {mpexpr $numTxFrames/$frameRate} duration] {\n+            if [catch {mpexpr $numFrames/$frameRate * $loopcount} duration] {\n+                logMsg \"******* WARNING:::: duration is longer than 4294967295 seconds!!!\"\n+                set duration 4294967295\n+            }\n+        }\n+    } else {\n+        logMsg \"****** WARNING:::: frameRate is set to 0, duration set to 0\"\n+    }\n+\n+    return $duration\n+}\n+\n+\n+########################################################################\n+# Procedure: calculateTotalBursts\n+#\n+# This command calculates the number of bursts for the specified duration,\n+#\n+# Arguments(s):\n+#   framerate   - in pps\n+#   ifg         - in nanoseconds\n+#   burstsize   - in fps\n+#   ibg         - inter burst gap, in nanoseconds\n+#   duration    - duration to calculate number of bursts over\n+#\n+# Returns:\n+#   total number of bursts per this duration\n+#\n+########################################################################\n+proc calculateTotalBursts {framerate ifg burstsize ibg {duration 1}} \\\n+{\n+    set megabits    1000000.\n+    set nanoseconds 1000000000.\n+\n+    if [catch {mpexpr $burstsize*((1./$framerate)* $nanoseconds)} packetTime] {\n+        errorMsg \"****** Error calculating packet time: $packetTime, packet time set to 0\"\n+        set packetTime  0\n+    }\n+\n+    if [catch {mpexpr round(($duration*$nanoseconds)/(($packetTime - $ifg) + $ibg))} numBursts] {\n+        errorMsg \"****** Error calculating numBursts: $numBursts, numBursts set to 0\"\n+        set numBursts  0\n+    }\n+\n+    return $numBursts\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: calculateAvgLatency\n+#\n+# This command calculates the average latency of the latencies in the \n+# array\n+#\n+# Arguments(s):\n+#\tLatencyArray\t- array containing latency values\n+#\n+########################################################################\n+proc calculateAvgLatency {LatencyArray} \\\n+{\n+\tif [info exists LatencyArray] {\n+\t\tupvar $LatencyArray latencyArray\n+\t} else {\n+\t\treturn 0\n+\t}\n+\n+\tset avgLatency\t0\n+\n+    set count\t[llength [array names latencyArray]]\n+\tforeach txMap [lsort [array names latencyArray]] {\n+        if {$latencyArray($txMap) == 0} {\n+            mpincr count -1\n+        }\n+\t}\n+\n+\tif {$count > 0} {\n+        foreach txMap [lsort [array names latencyArray]] {\n+            if {$latencyArray($txMap) != 0} {               \n+                if [catch {mpexpr round($avgLatency + ((double($latencyArray($txMap)))/$count))} temp] {\n+                    logMsg \"******* ERROR::: Port $txMap - $temp\"\n+                } else {\n+                    set avgLatency  $temp\n+                }\n+            }\n+\t\t}\n+    }\n+\n+\treturn $avgLatency\n+}\n+\n+\n+########################################################################\n+# Procedure: calculateLoopCounterFromTxFrames\n+#\n+# This command calculates the loopcounter based on the numFrame parameter\n+# used for stream.  Note that numFrame is a 24-bit number; if numFrame is\n+# greater than 24 bits than loopcount must be used in conjuction.\n+#\n+# Arguments(s):\n+#   totalFrames     - total number of frames to transmit\n+#\n+# Return:\n+#   loopcount\n+#\n+########################################################################\n+proc calculateLoopCounterFromTxFrames {totalFrames} \\\n+{\n+    upvar $totalFrames  numFrames\n+\n+    set loopcount   1\n+\n+    if [catch {expr $numFrames & 0xffffff}] {\n+        # bigger than 32 bit number\n+        set loopcount   1\n+        set numLength   [string length $numFrames]\n+        while {$numLength > 9} {\n+            set numFrames   [string range $numFrames 0 [expr $numLength - 2]]\n+            set numLength   [string length $numFrames]\n+            mpincr loopcount\n+        }\n+        mpincr loopcount -1\n+        set loopcount   [mpexpr round(pow(10,$loopcount))]\n+    } else {\n+        set temp   $numFrames\n+        while {[mpexpr $temp & 0xffffff] != $temp && $loopcount < 10} {\n+            set temp [mpexpr $numFrames >> 1]\n+            mpincr loopcount\n+        }\n+        set numFrames   [mpexpr $numFrames/$loopcount]\n+    }\n+\n+    return $loopcount\n+}\n+\n+\n+########################################################################\n+# Procedure: calculateStreamNumFrames\n+#\n+# This command calculates the stream numFrames value. Assumes a max \n+# numFrame value of 0xffffffff.\n+#\n+# Arguments(s):\n+#   framerate   - fps\n+#   duration    - seconds\n+#\n+# Return:\n+#   numFrames; throws an exception if the duration gets modified.\n+#\n+########################################################################\n+proc calculateStreamNumFrames {framerate Duration {maxNumFrames 0xffffffff}} \\\n+{\n+    upvar $Duration duration\n+\n+    set numFrames [mpexpr $framerate * $duration]\n+    if {[isNegative [mpexpr $maxNumFrames - $numFrames]]} {\n+        set duration   [mpexpr $maxNumFrames/$framerate]\n+\n+        errorMsg \"Error - selected duration $duration is too long - change to max duration of $duration\"\n+        set numFrames [mpexpr $framerate * $duration]\n+\n+        return -code error -errorinfo $numFrames\n+    }\n+\n+    return $numFrames\n+}\n+\n+\n+########################################################################\n+# Procedure: getTransmitTime\n+#\n+# This command calculates the total transmit time for the current stream\n+# configuration from the pulse startTx time - the last frame captured.\n+# If no frames were captured, it returns the original duration.\n+#\n+# Arguments(s):\n+#   PortArray           - array of ports\n+#   originalDuration    - original duration of test\n+#\n+# Returns:\n+#   test duration calculated from captured frame or original duration\n+#   if no frames captured.\n+#\n+########################################################################\n+proc getTransmitTime {PortArray originalDuration {DurationArray \"\"} {Warnings \"\"}} \\\n+{\n+    upvar $PortArray         portArray\n+    upvar $DurationArray     durationArray\n+    upvar $Warnings          warnings\n+\n+    set errorCode   0\n+    set duration    $originalDuration\n+    catch {unset durationArray}\n+\n+    requestStats portArray\n+\n+    # get the test duration\n+    foreach txMap [array names portArray] {\n+        scan $txMap \"%d,%d,%d\" tx_c tx_l tx_p\n+\n+        # initialize array\n+        set durationArray($tx_c,$tx_l,$tx_p)   $originalDuration\n+    \n+        if [statList get $tx_c $tx_l $tx_p] {\n+\t        errorMsg \"Error getting Tx statistics for [getPortId $tx_c $tx_l $tx_p]\"\n+            set errorCode 1\n+            continue\n+        }\n+        if [catch {mpexpr [statList cget -transmitDuration]/1000000000.} tempDuration] {\n+            if [catch {getDurationFromCapture portArray $tx_c $tx_l $tx_p $duration} tempDuration] {\n+                set errorCode 1\n+                continue\n+            }\n+\n+        }\n+\n+        if {$tempDuration < $originalDuration} {\n+            set duration $originalDuration\n+        }\n+\n+        lappend durationList $duration\n+        set durationArray($tx_c,$tx_l,$tx_p) $duration\n+    }\n+\n+    if {($errorCode == 1) && ($warnings != \"\")} {\n+        set warnings \"\\n\\n***** Warning *****\\n\\\n+                      Instrumented packets were dropped by the DUT and the rate\\n\\\n+                      cannot be reliably measured on one or more ports.\\n\\n\\\n+                      To reliably measure rate, change the tolerance for dropped\\n\\\n+                      packets to zero.\\n\"\n+    }\n+\n+    if [info exists durationList] {\n+        set duration    [lindex [lnumsort $durationList] 0]\n+    }\n+    if [info exists durationArray] {\n+        debugMsg \"getTransmitTime: [array get durationArray]\"\n+    }\n+ \n+    return $duration\n+}\n+\n+\n+########################################################################\n+# Procedure: getDurationFromCapture\n+#\n+# This command calculates the total transmit time using the capture buffer.\n+# If no frames were captured, it returns the original duration.\n+#\n+# Arguments(s):\n+#   originalDuration    - original duration of test\n+#\n+# Returns:\n+#   test duration calculated from captured frame or original duration\n+#   if no frames captured.\n+#\n+########################################################################\n+proc getDurationFromCapture {PortArray tx_c tx_l tx_p  originalDuration} \\\n+{\n+    upvar $PortArray         portArray\n+\n+    set maxDuration 0\n+    foreach rxMap $portArray($tx_c,$tx_l,$tx_p) {\n+        scan $rxMap \"%d %d %d\" rx_c rx_l rx_p\n+\n+        if [capture get $rx_c $rx_l $rx_p] {\n+            set errorMessage \"Error getting capture data on [getPortId $rx_c $rx_l $rx_p]\"\n+            set errorCode 1\n+            continue\n+        }\n+        set numCapPackets   [capture cget -nPackets]\n+\n+        # get first packet\n+        if [captureBuffer get $rx_c $rx_l $rx_p] {\n+            set errorMessage \"Error getting capture buffer for [getPortId $rx_c $rx_l $rx_p]\"\n+            set errorCode 1\n+            continue\n+        }\n+\n+        if [captureBuffer getframe 1] {\n+            set errorMessage \"Error getting frame from capture buffer for [getPortId $rx_c $rx_l $rx_p]\"\n+            set errorCode 1\n+            continue\n+        }\n+        set firstTimeStamp  [captureBuffer cget -fir]\n+        debugMsg \"firstTimeStamp:$firstTimeStamp\"\n+        debugMsg \"ixgFirstTimeStamp:$::ixgFirstTimeStamp\"\n+\n+        if [captureBuffer get $rx_c $rx_l $rx_p $numCapPackets $numCapPackets] {\n+            set errorMessage \"Error getting capture buffer for [getPortId $rx_c $rx_l $rx_p]\"\n+            set errorCode 1\n+            continue\n+        }\n+        if [captureBuffer getframe 1] {\n+            set errorMessage \"Error getting frame from capture buffer for [getPortId $rx_c $rx_l $rx_p]\"\n+            set errorCode 1\n+            continue\n+        }\n+        set duration    [mpexpr ([captureBuffer cget -timestamp] - $firstTimeStamp)/1000000000.]\n+        debugMsg \"duration:$duration\"\n+\n+        if {$duration < $originalDuration || $numCapPackets < [mpexpr $originalDuration * 2]} {\n+            set duration $originalDuration\n+        }\n+        # get the max transmit time for TX ports that have more than one RX ports\n+        if {$duration > $maxDuration} {\n+            set maxDuration    $duration\n+        }\n+    }\n+\n+    if {$errorCode == 1} {\n+\t\treturn -code error -errorinfo $errorMessage\n+    } else {\n+        return $maxDuration\n+    }\n+}\n+ \n+namespace eval ixMath { \n+\n+########################################################################\n+# Procedure: min\n+#\n+# This command calculates the minimum value\n+#\n+# Arguments(s):\n+########################################################################\n+proc min {x y} \\\n+{\n+    return [mpexpr ($x < $y) ? $x : $y ]\n+}\n+\n+\n+########################################################################\n+# Procedure: max\n+#\n+# This command calculates the maximum value\n+#\n+# Arguments(s):\n+########################################################################\n+proc max {x y} \\\n+{\n+    return [mpexpr ($x > $y) ? $x : $y ]\n+}\n+\n+};# ixMath Namespace end\n+\n+########################################################################\n+# Procedure: maxArray\n+#\n+# This command calculates the maximum value of an array.\n+#\n+# Arguments(s):\n+########################################################################\n+proc maxArray {NumArray} \\\n+{\n+\tupvar $NumArray numArray\n+\n+\tset maxNum 0\n+\tfor {set index 0} {$index < [llength [array names numArray]]} {incr index} {\n+\t\tset item [lindex [lnumsort [array names numArray]] $index]\n+\t\tset maxNum [ixMath::max $maxNum $numArray($item)]\n+\t}\n+\n+\treturn $maxNum\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/chassisUtils.tcl b/dep/tclclient/ixTcl1.0/Generic/chassisUtils.tcl\nnew file mode 100644\nindex 00000000..5db3a95f\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/chassisUtils.tcl\n@@ -0,0 +1,239 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: chassisUtils.tcl\n+#   Copyright ©  IXIA.\n+#   All Rights Reserved.\n+#\n+#       Revision Log:\n+#       10/16/2000      DS      Genesis\n+#\n+# Description: This file contains general chassis management/connection procs.\n+#\n+##################################################################################\n+\n+\n+########################################################################################\n+# Procedure: connectToChassis\n+#\n+# Description: Attempts to connect to all chassis given in the list\n+#\n+# Arguments: chassisList - A list of chassis names\n+#            cableLength - Optional.  A corresponding list of cable lengths for the given chassis\n+#            chassisIdList - Optional.  A corresponding list of chassis id numbers for the given chassis\n+#            chassisSeqList - Optional.  A corresponding list of sequence numbers for the given chassis\n+#\n+# Returns: A return code of 0 for success and different integers representing errors\n+########################################################################################\n+proc connectToChassis {chassisList {cableLengthList cable3feet} {chassisIdList \"\"} {chassisSeqList \"\"}} \\\n+{\n+    set retCode 0\n+\n+    # If either of the id list or sequence list contains less items than the chassis list, \n+    # we will recreate these lists on our own starting from the number 1 until there are \n+    # enough items in the lists.\n+    set numChassis [llength $chassisList]\n+    if {[llength $chassisIdList] < $numChassis} {\n+        catch {unset chassisIdList}\n+        for {set id 1} {$id <= $numChassis} {incr id} {\n+            lappend chassisIdList $id\n+        }\n+    }\n+\n+    if {[llength $chassisSeqList] < $numChassis} {\n+        catch {unset chassisSeqList}\n+        for {set sequence 1} {$sequence <= $numChassis} {incr sequence} {\n+            lappend chassisSeqList $sequence\n+        }\n+    }\n+\n+    # If the cable length list contains only one item, then that value will be used for all lengths.\n+    # If the list is greater than one, but less than the number of chassis, then cable3feet will be used\n+    # to complete the list.\n+    if {([llength $cableLengthList] == 1) && ($numChassis != 1)} {\n+        set cableLength $cableLengthList\n+        catch {unset cableLengthList}\n+        foreach item $chassisList {\n+            lappend cableLengthList $cableLength\n+        }\n+    } elseif {[llength $cableLengthList] < $numChassis} {\n+        while {[llength $cableLengthList] < $numChassis} {\n+            lappend cableLengthList \"cable3feet\"\n+        }\n+    }\n+\n+    foreach chassis $chassisList chassisId $chassisIdList sequence $chassisSeqList cableLength $cableLengthList {\n+        logMsg \"Connecting to Chassis $chassisId: $chassis ...\"\n+\n+        # Connect may not work the first time. So try a few times until a connect succeeds\n+        set maxConnectRetries [advancedTestParameter cget -maxConnectRetries]\n+        if {$maxConnectRetries < 1} {\n+            set maxConnectRetries 1\n+        }\n+\n+        set retAddCode 1\n+        for {set connectNum 1} {$connectNum <= $maxConnectRetries && $retAddCode != 0} {incr connectNum} {\n+\n+            set connectChassisFlag [getConnectChassisFlag]\n+\n+            if { ![string compare $connectChassisFlag \"stop\"] } {\n+                #\n+                # Progress dialog is canceled. Connecting to chassis should stop.\n+                #\n+                setConnectChassisFlag \"continue\"\n+                set retAddCode 4\n+                break\n+            }\n+\n+            set retAddCode [chassis add $chassis]\n+            switch $retAddCode \"\n+                $::TCL_OK {\n+                    continue\n+                }\n+                $::ixTcl_versionMismatch {\n+                    # if it is a version mismatch, do not bother going any further...\n+                    logMsg \\\"Error: Version mismatch between IxServer and Tcl Client\\\"\n+                    ixPuts $::ixErrorInfo\n+                    chassis del $chassis                    \n+                    break\n+                }\n+                $::ixTcl_HardwareConflict {\n+                    # if it is a serial number conflict, do not bother going any further...\n+                    chassis del $chassis\n+                    logMsg \\\"Error: Hardware conflict detected. Please call customer support!\\\"\n+                    break\n+                }\n+                default {                                  \n+                    chassis del $chassis\n+                    logMsg \\\"Error connecting to chassis. Retrying $connectNum of $maxConnectRetries retries ..\\\"\n+                    after 20\n+                    update\n+                }\n+            \"\n+        }\n+\n+        # dump out here if there was an error connecting to one of the chassis\n+        switch $retAddCode \"\n+            $::TCL_OK {\n+            }\n+            $::TCL_ERROR {\n+                logMsg \\\"Error connecting to chassis $chassis\\\"\n+                return $retAddCode\n+            }\n+            $::ixTcl_chassisTimeout {\n+                logMsg \\\"Timeout connecting to chassis $chassis. Try Again!\\\"\n+                return $retAddCode\n+            }\n+            4 {\n+                logMsg \\\"Connection was interrupted by user!\\\"\n+                return $retAddCode\n+            }\n+            default {\n+                return $retAddCode\n+            }\n+        \"\n+\n+        chassis config -name        $chassis\n+        chassis config -id          $chassisId\n+        chassis config -sequence    $sequence\n+        chassis config -cableLength $cableLength\n+\n+        if {[chassis set $chassis]} {\n+            errorMsg \"Error setting chassis $chassis\"\n+            return $::TCL_ERROR\n+        }\n+    }\n+\n+    # after connecting to all chassis, broadcast the topology of each chassis\n+    # to all other chassis\n+    chassisChain broadcastTopology\n+\n+    # now we need to verify that it is a valid chain (ie., there is at least one master)\n+    if {[chassisChain validChain]} {\n+        errorMsg \"Error: Chassis chain is not valid - check for master chassis in chain\"\n+        set retCode $::ixTcl_invalidChassisChain\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: setConnectChassisFlag\n+#\n+# Description: Set the value that indicates whether connecting to chassis should continue.\n+#\n+# Argument(s): value - \"continue\" or \"stop\".\n+#\n+# Return:      Nothing\n+#\n+########################################################################################\n+proc setConnectChassisFlag {value} \\\n+{\n+    global ixgChassisContinueFlag\n+\n+    switch $value {\n+        \"continue\" -\n+        \"stop\" {\n+            set ixgChassisContinueFlag $value\n+        }\n+        default {\n+            set ixgChassisContinueFlag \"continue\"\n+        }\n+    }\n+}\n+\n+\n+########################################################################################\n+# Procedure: getConnectChassisFlag\n+#\n+# Description: Get the value that indicates whether connecting to chassis should continue.\n+#\n+# Argument(s): None.\n+#\n+# Return:      \"continue\" or \"stop\".\n+#\n+########################################################################################\n+proc getConnectChassisFlag {} \\\n+{\n+    global ixgChassisContinueFlag\n+\n+    if { [info exists ixgChassisContinueFlag] } {\n+        set retCode $ixgChassisContinueFlag\n+    } else {\n+        set retCode \"continue\"\n+    }\n+\n+    return $retCode\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/clientUtils.tcl b/dep/tclclient/ixTcl1.0/Generic/clientUtils.tcl\nnew file mode 100644\nindex 00000000..a8be073a\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/clientUtils.tcl\n@@ -0,0 +1,319 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: clientUtils.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#    Revision Log:\n+#    Date           Author                 Comments\n+#    -----------    -------------------    --------------------------------------------\n+#    10/25/2000     ds                      initial release\n+#\n+# Description:  This file contains utilities for the client side of the Tcl proxy\n+#\n+##################################################################################\n+\n+\n+########################################################################################\n+# Procedure:    clientOpen\n+#\n+# Description:  Open a connection to the ixTclServer.\n+#                \n+# Input:        server:        host name of server\n+#               port:        port id of service\n+#\n+# Output:       socket handle\n+#\n+########################################################################################\n+proc clientOpen {host port} \\\n+{\n+    if [catch {socket $host $port} socketId] {\n+        errorMsg \"Error: $socketId\"\n+        set socketId {}\n+    }\n+\n+    return $socketId\n+}\n+\n+\n+########################################################################################\n+# Procedure:    clientClose\n+#\n+# Description:  Close connection from the client side.\n+#                \n+# Input:        socketId:    client-side socket\n+#\n+# Output:        0 if successful\n+#                1 if error while attempting to close socket\n+#\n+########################################################################################\n+proc clientClose {socketId} \\\n+{\n+    set retCode 0\n+\n+    if [catch {close $socketId}] {\n+        set retCode 1\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure:    clientSend\n+#\n+# Description:  Send a command from the client side.\n+#                \n+# Input:        socketId:    client-side socket\n+#                args:        TCL command to evaluate\n+#\n+# Returns:        Success:    TCL Return result\n+#               Failure:    {}\n+#\n+# Remarks:  TCL procs can embed i/o.\n+#\n+########################################################################################\n+proc clientSend {socketId args} \\\n+{\n+    set retCode   1\n+    set retResult 0\n+\n+    #\n+    # send data over the socket\n+    #\n+    set buf [lindex $args 0]\n+\n+    #   \n+    #   Return buffer is formatted as follows:\n+    #\n+    #   0 to final lf/cr -> Tcl Standard Output\n+    #   final character  -> Tcl Return Code (TCL_OK, TCL_ERROR)\n+    #   \n+    if [catch { puts $socketId $buf ; \n+                flush $socketId ; \n+                #\n+                # read the reply\n+                #  the reply may have the format \n+                #       sOutput/r/nsTclResult/r/n    -- i/o output followed by TCL result\n+                #                                                 /r/n -delimited\n+                #       sTclresult/r/nsTclResultCode -- simple TCL result\n+                #       null                         -- no TCL result available\n+                \n+                vwait tclServer::buffer\n+                set retBuffer $tclServer::buffer\n+                \n+                set indexOfLastCrlf [string last \"\\r\\n\" $retBuffer]\n+                if {$indexOfLastCrlf != -1 } {\n+                    set lenBuffer [string length $retBuffer]\n+                    set indexOfPenultimateCrlf [string last \"\\r\\n\" [string range $retBuffer 0 [expr $indexOfLastCrlf -1]]]\n+                    if {$indexOfPenultimateCrlf != -1 } {\n+                        set retResult [string range $retBuffer [expr $indexOfPenultimateCrlf + 2] $lenBuffer]\n+                    } else {\n+                        set length    [string length $retBuffer]\n+                        set retCode   [string index $retBuffer [incr length -1]]\n+                        set retResult [string range $retBuffer 0 [incr length -1]]\n+                    }\n+                } else {\n+                    set length    [string length $retBuffer]\n+                    set retCode   [string index $retBuffer [incr length -1]]\n+                    set retResult [string range $retBuffer 0 [incr length -1]]\n+                }\n+            } \n+    ] {\n+        errorMsg $::errorInfo\n+        tclServer::disconnectTclServer\n+        set retResult 1\n+    }\n+\n+    #\n+    # Force an error if the command returned TCL_ERROR.\n+    #   Can't use the constant TCL_ERROR here since it is not defined at\n+    #   this point in execution.\n+    #\n+    if {$retCode == 1} {\n+        set retCommand [list error $retResult $retResult]\n+    } else {\n+        set retCommand [list return $retResult]\n+    }\n+\n+    eval $retCommand\n+}\n+\n+########################################################################################\n+# Procedure:    remoteDefine\n+#\n+# Description:     Create a proc to proxy over a ixTclHal command.\n+#                \n+# Input:        commandList\n+#\n+# Output:        0 if successful\n+#                1 if error\n+#\n+########################################################################################\n+proc remoteDefine { commandList } \\\n+{\n+    foreach procName $commandList {\n+        eval [format   \"proc %s {args} \\\n+                        {\\\n+                            global ixTclSvrHandle; \\\n+                            if \\[catch { eval \\\"clientSend \\$ixTclSvrHandle {%s \\$args}\\\" } result\\] {error \\$result \\$result}; \\\n+\t                        if  {\\$result != \\\"\\\"} {if \\[catch { eval \\\"clientSend \\$ixTclSvrHandle {set ixErrorInfo}\\\" } ::ixErrorInfo] {error \\$::ixErrorInfo \\$::ixErrorInfo}}; \\\n+                            return \\$result \\\n+                        }\" \\\n+        $procName $procName]\n+    }\n+    return 0\n+}\n+\n+########################################################################################\n+# Procedure:    getConstantsValue\n+#\n+# Description:     Get the list of constants from ixTclServer.\n+#                \n+# Input:        serverSocket\n+#\n+# Output:        0 if successful\n+#                1 if error\n+#\n+########################################################################################\n+proc getConstantsValue {serverSocket} \\\n+{\n+    set retCode 0\n+\n+    set constList  [clientSend $serverSocket {array get ixConstants}]\n+    if {[llength $constList] > 0} {\n+        foreach {constName constVal} $constList {\n+            global $constName\n+            # The catch prevents the error message from flowing back on windows\n+            catch {set $constName $constVal}\n+        }\n+    } else {\n+        set retCode 1\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure:    ixMasterSet\n+#\n+# Description:     No clue what this is here for, but I'm leaving it for backwards compatibility\n+#\n+# Input:\n+#\n+########################################################################################\n+proc ixMasterSet {name element op} \\\n+{\n+    upvar ${name}($element) master\n+    tclServer::connectToTclServer $master errMsg\n+}\n+\n+########################################################################################\n+# Procedure:    redefineCommand\n+#\n+# Description:     Redefine the specified command to make its methods import and export work \n+#               for UNIX client.\n+#\n+# Input:        command - name of the command to be redefined.\n+#\n+########################################################################################\n+proc redefineCommand {command} \\\n+{\n+    set commandOld ${command}Old\n+\n+    if { [info command $command] != \"\" } {\n+        if { [info command $commandOld] == \"\" } {\n+            rename $command $commandOld\n+        }\n+    }\n+    eval [format \"proc %s {args} \\\n+          { \\\n+              set cmdLine %s ; \\\n+              set path \\[file dirname \\[lindex \\$args 1\\]\\] ;\\\n+              set fileName \\[file tail \\[lindex \\$args 1\\]\\] ;\\ \n+              if { \\$path == \\\".\\\" } { \\\n+                append cmdLine \\\" \\$args\\\"; set path \\$fileName } else { \\\n+                append cmdLine \\\" \\[lindex \\$args 0\\] \\$fileName \\[lindex \\$args 2\\] \\[lindex \\$args 3\\] \\[lindex \\$args 4\\] \\\" }\\\n+\n+              switch \\[lindex \\$args 0\\] { \\\n+                  import { \\\n+                      doFileTransfer \\\"put\\\" \\[lindex \\$args 1\\] \\$fileName ; \\\n+                      eval \\$cmdLine; \\\n+                  } \\\n+                  export { \\\n+                      set retCode \\[eval \\$cmdLine\\]; \\\n+                      if \\{\\$retCode == 0\\} \\{ \\\n+                          doFileTransfer \\\"get\\\" \\$fileName \\[lindex \\$args 1\\]; \\\n+                          fileTransferClient::deleteFile \\[tclServer::getTclServerName\\] 4500 \\$fileName \\                       \n+                          \n+                      \\} else \\{ \\\n+                          return \\$retCode; \\\n+                       \\} \\\n+                  } \\\n+                  default { \\\n+                      eval \\$cmdLine; \\\n+                  } \\\n+               } \\\n+           }\" \\\n+    $command $commandOld]\n+}\n+\n+########################################################################################\n+# Procedure:    doFileTransfer\n+#\n+# Description:     Transfer files between client and chassis.\n+#\n+# Input:        action    - Has to be either put or get.\n+#                            \n+# Unix doesn't need the full path of the file, that is why it is based on the direction \n+# if it is put or get, we have to pass in two filenames, one for source the other for\n+# destination  \n+#               filename1  - Name of the file to be transfered.\n+#               filename2  - Name of the file to be transfered. \n+#\n+########################################################################################\n+proc doFileTransfer {action filename1 filename2 {port 4500}} \\\n+{\n+    set retCode 1\n+\n+    if [tclServer::isTclServerConnected] {\n+        set retCode [fileTransferClient::${action}File [tclServer::getTclServerName] $port \"$filename1\" \"$filename2\"]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/constants.tcl b/dep/tclclient/ixTcl1.0/Generic/constants.tcl\nnew file mode 100644\nindex 00000000..d8bdc441\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/constants.tcl\n@@ -0,0 +1,131 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: constants.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t12-30-1998\tHardev Soor\n+#\n+# Description: This file contains common constants\n+#\n+##################################################################################\n+\n+# -----------------------------------------------------\n+# Hardcoded from HAL so that the connection TclSvrConnect \n+# can be made after the package require ->  if using UNIX\n+# -----------------------------------------------------\n+\n+# protocol mapping\n+set kProtocol(0)\t\t\t\tmac\n+set kProtocol(4)\t\t\t\tip\n+set kProtocol(5)\t\t\t\tudp\n+set kProtocol(6)        \t\ttcp\n+set kProtocol(7)\t\t\t\tipx\n+set kProtocol(31)\t\t\t\tipV6\n+\n+# IP address class mapping\n+set kIpAddrClass(0)     \t\tclassA\n+set kIpAddrClass(1)     \t\tclassB\n+set kIpAddrClass(2)     \t\tclassC\n+set kIpAddrClass(3)     \t\tclassD\n+set kIpAddrClass(4)     \t\tnoClass\n+\n+\n+# some generic frame constants\n+set kFirSize\t\t\t6\n+set kCrcSize\t\t\t4\n+set kUdfSize\t\t\t4\n+\n+\n+# duplex mode mapping\n+set kDuplexMode(0)\t\thalf\n+set kDuplexMode(1)\t\tfull\n+\n+# levels of storing results\n+set kResultLevel(test)      test\n+set kResultLevel(iter)      iter\n+set kResultLevel(port)      port\n+set kResultLevel(portCat)   portCat\n+set kResultLevel(portItem)  portItem\n+\n+# IPX constants\n+set kSapOperation(request)                      1\n+set kSapOperation(response)                     2    ;# General Service Response\n+set kSapOperation(getNearestServerRequest)      3\n+set kSapOperation(getNearestServerResponse)     4\n+set kSapServiceType(unknown)                    {00 00}\n+set kSapServiceType(printQueue)                 {00 03}\n+set kSapServiceType(fileServer)                 {00 04}\n+set kSapServiceType(jobServer)                  {00 05}\n+set kSapServiceType(printServer)                {00 07}\n+set kSapServiceType(archiveServer)              {00 09}\n+set kSapServiceType(remoteBridgeServer)         {00 24}\n+set kSapServiceType(advertisingPrintServer)     {00 47}\n+set kRIPXOperation(request)                     1\n+set kRIPXOperation(response)                    2\n+set kBroadcastMacAddress                        {ff ff ff ff ff ff}\n+set kSapSocket                                  0x452\n+set kRipSocket                                  0x453\n+set kHeaderLength(ip)\t                        20\n+set kHeaderLength(ipV6)\t                        40\n+set\tkHeaderLength(udp)                      \t8\n+set\tkHeaderLength(rip)\t                        4\n+set\tkHheaderLength(icmp)                    \t8\n+set kIPXHeaderLength\t                    \t30\n+\n+if {![info exists TCL_OK]} {\n+    set TCL_OK      0\n+    set TCL_ERROR   1\n+}\n+\n+\n+### Mii constants for 10ge ###\n+set miiPreemphasisNone      0   ;# 0x0000\n+set miiPreemphasis18        1   ;# 0x4000 \n+set miiPreemphasis38        2   ;# 0x8000\n+set miiPreemphasis75        3   ;# 0xC000\n+ \n+\n+set miiLossOfSignal160mv    0   ;# 0x0000\n+set miiLossOfSignal240mv    1   ;# 0x0010\n+set miiLossOfSignal200mv    2   ;# 0x0020\n+set miiLossOfSignal120mv    3   ;# 0x0030\n+set miiLossOfSignal80mv     4   ;# 0x0040\n+\n+set miiRecoveredClock       0 \n+set miiLocalRefClock        1   \n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/conversions.tcl b/dep/tclclient/ixTcl1.0/Generic/conversions.tcl\nnew file mode 100644\nindex 00000000..2e78ed98\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/conversions.tcl\n@@ -0,0 +1,275 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: conversions.tcl\n+#\n+# Copyright ©  IXIA\n+# All Rights Reserved.\n+#\n+# Description: This file contains some utility procs for running the cable modem\n+#              and ATP tests.\n+#\n+# Revision Log:\n+#\n+# Date\t\t    Author\t\t\t\tComments\n+# -----------\t-------------------\t--------------------------------------------\n+# 2000/05/01\tDS\t                Genesis (for cable modem testing)\n+# 2000/10/02\tD. Heins-Gelder\t\tMoved rate converters to Generic/converstions.tcl\n+#\n+##################################################################################\n+\n+\n+\n+########################################################################################\n+# getPercentMaxRate\n+#\n+# Description:  Helper procedure which derives the percentMaxRate based on the\n+#               user selected rate type (ie: percentMaxMate, kbps or fps)\n+#\n+# Input:        chassis card port\n+#               framesize       : \n+#               rateType        : \n+#               rate            :\n+#               loss            : default is NULL\n+#\n+# Output:       retCode         : 0 if invalid chassis-card-port, else\n+#                                 percentMaxRate\n+#\n+########################################################################################\n+proc getPercentMaxRate {chassis card port framesize rateType rate {preambleSize 8}} \\\n+{\n+    set percentMaxRate  0\n+\n+    if [port get $chassis $card $port] {\n+        errorMsg \"Error getting $chassis $card $port\"\n+    } else {\n+\n+        switch $rateType {\n+            percentMaxRate {\n+                set percentMaxRate  $rate\n+            }\n+            kbpsRate {\n+                set percentMaxRate [calculatePercentMaxRate $chassis $card $port [mpexpr $rate*1000./($framesize * 8.)] $framesize $preambleSize]\n+            }\n+            fpsRate {\n+                set percentMaxRate [calculatePercentMaxRate $chassis $card $port $rate $framesize $preambleSize]\n+            }\n+            default {\n+                set percentMaxRate  0.\n+            }\n+        }\n+    }\n+    \n+    return [format %.6f $percentMaxRate]\n+}\n+\n+\n+########################################################################################\n+########################################################################################\n+#           Rate converters\n+#           Note - these things live in the cablemodem.tcl file because they are really\n+#                  only applicable to cablemodems.  Also, note that the getMaxFPS\n+#                  proc will probably fall apart w/PoS implementations.\n+########################################################################################\n+########################################################################################\n+#\n+#\n+#     Conversion formulae implemented in code (checked by David Selenkow 5/4/2000)\n+#\n+# Given rate=%maxRate, then:                                        as found in:\n+#   percentMaxRate  = rate                                      convertPercentMaxRate\n+#   kbps            = (maxFPS*(rate/100)*framesize*8) / 1000    convertKbpsRate\n+#   fps             = (rate/100)*maxFPS                         convertFpsRate\n+#\n+# Given rate = kpbs, then:     \n+#   percentMaxRate  = ((rate*1000)/(framesize*8*maxFPS)) * 100  convertPercentMaxRate \n+#   kpbs            = rate                                      convertKpbsRate\n+#   fps             = (rate*1000)/(framesize*8)                 convertFpsRate\n+#\n+# Given rate=fps, then          \n+#   percentMaxRate  = (rate/maxFPS)*100                         convertPercentMaxRate\n+#   kbps            = (rate*framesize*8) / 1000                 convertKbpsRate\n+#   fps             = rate                                      convertFpsRate\n+\n+########################################################################################\n+\n+\n+\n+########################################################################################\n+# Procedure: getMaxFPS\n+#\n+# Description: Get the max fps rate based on speed/framesize, assuming a 96 bit minimum\n+#              gap (802.3)\n+#\n+########################################################################################\n+proc getMaxFPS {speed framesize {preambleSize 8}} \\\n+{\n+   set expr    [unixCludgeGetExpr]\n+\n+   set minimumGap            96    ;# bits \n+    if [catch {$expr round((double($speed) * 1000000.) / (double($minimumGap) + (($preambleSize + $framesize)*8.)))} maxFps] {\n+        set maxFps 0\n+    }\n+\n+    return $maxFps\n+}\n+\n+\n+########################################################################################\n+# Procedure: convertPercentMaxRate\n+#\n+# Description: Converts to the % rate based on speed/framesize, assuming a 96 bit\n+#              minimum gap (802.3)\n+#\n+########################################################################################\n+proc convertPercentMaxRate {framesize rateType rate speed {preambleSize 8}} \\\n+{\n+    set expr    [unixCludgeGetExpr]\n+\n+    set maxRate [getMaxFPS $speed $framesize $preambleSize]\n+\n+    if {[isValidPartialFloat $framesize] && [isValidPartialFloat $rate] && [isValidPartialFloat $speed] && \\\n+            [isValidPartialFloat $preambleSize]} {\n+        switch $rateType {\n+            percentMaxRate {\n+                set percentMaxRate  $rate\n+            }\n+            kbpsRate {\n+                if [catch {$expr ($rate*1000./($framesize * 8. * $maxRate))*100.} percentMaxRate] {\n+                    set percentMaxRate 1.0\n+                }\n+            }\n+            fpsRate {\n+                if [catch {$expr (($rate*100.)/$maxRate)} percentMaxRate] {\n+                    set percentMaxRate 1.0\n+                }\n+            }\n+            default {\n+                set percentMaxRate 1.0\n+            }\n+        }\n+    } else {\n+        set percentMaxRate 1.0\n+    }\n+    return [format %.6f $percentMaxRate]\n+}\n+\n+\n+########################################################################################\n+# Procedure: convertKbpsRate\n+#\n+# Description: Converts to the kbps rate based on speed/framesize, assuming a 96 bit\n+#              minimum gap (802.3)\n+#\n+########################################################################################\n+proc convertKbpsRate {framesize rateType rate speed {preambleSize 8}} \\\n+{\n+    set expr    [unixCludgeGetExpr]\n+\n+    set kbpsRate 1.0\n+\n+    if {[isValidPartialFloat $framesize] && [isValidPartialFloat $rate] && [isValidPartialFloat $speed] && \\\n+            [isValidPartialFloat $preambleSize]} {\n+        switch $rateType {\n+            percentMaxRate {\n+                set maxRate [getMaxFPS $speed $framesize $preambleSize]\n+                set kbpsRate [$expr (($maxRate*($rate/100.)) * $framesize * 8.) / 1000.]\n+            }\n+            kbpsRate {\n+                set kbpsRate $rate\n+            }\n+            fpsRate {\n+                set kbpsRate [$expr ($rate * $framesize * 8.)/1000.]\n+            }\n+        }\n+    }\n+    return [format %.6f $kbpsRate]\n+}\n+\n+\n+########################################################################################\n+# Procedure: convertFpsRate\n+#\n+# Description: Converts to the max fps rate based on speed/framesize, assuming a 96 bit\n+#              minimum gap (802.3)\n+#\n+########################################################################################\n+proc convertFpsRate {framesize rateType rate speed {preambleSize 8}} \\\n+{\n+    set expr    [unixCludgeGetExpr]\n+\n+    set fpsRate 1.0\n+\n+    if {[isValidPartialFloat $framesize] && [isValidPartialFloat $rate] && [isValidPartialFloat $speed] && \\\n+            [isValidPartialFloat $preambleSize]} {\n+        switch $rateType {\n+            percentMaxRate {\n+                set maxRate [getMaxFPS $speed $framesize $preambleSize]\n+                if {[catch {$expr ($rate/100.)*$maxRate} fpsRate]} {\n+                    set fpsRate 1.0\n+                }\n+            }\n+            kbpsRate {\n+                if {[catch {$expr ($rate/($framesize * 8.))*1000.} fpsRate]} {\n+                    set fpsRate 1.0\n+                }\n+            }\n+            fpsRate {\n+                set fpsRate $rate\n+            }\n+        }\n+    }\n+    return [format %.6f $fpsRate]\n+}\n+\n+\n+########################################################################\n+# Procedure: generateFullList\n+#\n+# Helper proc to generate the full list for the burstsize\n+#\n+########################################################################\n+proc generateFullList { originalList {burstsize 10} } \\\n+{\n+    set maxFramesize  0\n+    foreach item $originalList {\n+        for {set i 1} { $i <= 10} {incr i} {\n+            lappend fullFrameSizeList $item\n+        }\n+    }\n+\n+    return $fullFrameSizeList\n+}\n+\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/dataValidation.tcl b/dep/tclclient/ixTcl1.0/Generic/dataValidation.tcl\nnew file mode 100644\nindex 00000000..9dccfdd5\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/dataValidation.tcl\n@@ -0,0 +1,1855 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: dataValidation.tcl\n+#\n+# Copyright ©  IXIA\n+# All Rights Reserved.\n+#\n+# Description: This file contains the namespace and its procedures that verify\n+#              IXIA test parameters when a new test is started.\n+#\n+# Revision Log:\n+#\n+# Date\t\t    Author\t\t\t\tComments\n+# -----------\t-------------------\t-------------------------------------------\n+# 2001/04/24\tScott Si\t        Created\n+#\n+###############################################################################\n+\n+namespace eval dataValidation {} \\\n+{\n+    #\n+    # All the following ARRAYs are indexed by the name of TCL variable of IXIA\n+    # test, such as numIterations (number of iterations) and percentMaxRate\n+    # (max percent rate).\n+    #\n+    variable typeArray\n+    variable validValuesArray\n+    variable validRangeArray\n+    variable validateProcArray\n+    variable helpArray\n+\n+    #\n+    # typePattern defines the valid types for all the test parameters, which\n+    # are the following.\n+    #     {integer, integerList, double, boolean, string, stringList, ipaddress, imixlist, macaddress, portlist}\n+    #\n+    variable typePattern {^integer$|^integerList$|^double$|^boolean$|^string$|^stringList$|^ipaddress$|^imixlist$|^macaddress$|^portlist$}\n+\n+    #\n+    # booleanPattern defines the valid values for all the test parameters that is of\n+    # the type boolean. The valide value must be one of the following.\n+    #     {ture false yes no 1 0}\n+    #\n+    variable booleanPattern {^true$|^false$|^yes$|^no$|^1$|^0$}\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::initialize\n+#\n+# Description:  Initialize rules for data validation. This function should be\n+#               invoked when a new test is selected.\n+#\n+# Input:        None\n+#\n+# Output:       None.\n+#\n+###############################################################################\n+proc dataValidation::initialize {} \\\n+{\n+    variable typeArray\n+    variable validValuesArray\n+    variable validRangeArray\n+    variable validateProcArray\n+    variable helpArray\n+\n+    variable errorString \"\"\n+\n+    catch {unset typeArray        }\n+    catch {unset validValuesArray }\n+    catch {unset validRangeArray  }\n+    catch {unset validateProcArray}\n+    catch {unset helpArray        }\n+\n+    #\n+    # The following parameters are kept by the global array testConf.\n+    #\n+    setParameter -parameter hostname              -type stringList\n+    setParameter -parameter cableLength           -type stringList  -validValues {cable3feet cable6feet cable9feet cable12feet cable15feet cable18feet cable21feet cable24feet}\n+    setParameter -parameter chassisID             -type integerList -validRange  {0 NULL}\n+    setParameter -parameter chassisSequence       -type integerList -validRange  {1 NULL}\n+    set speedList [list 10 100 1000 usb oc3 oc12 stm1c stm4c oc48 stm16c oc192 stm64c \"WAN (Sonet)\" \"WAN (SDH)\" 10000 9294 Copper10 Copper100 Copper1000 Fiber1000]\n+\n+    setParameter -parameter speed                 -type string     -validValues $speedList -validateProc dataValidation::validatePortSpeed\n+    setParameter -parameter RxPortSpeed           -type string     -validValues $speedList -validateProc dataValidation::validatePortSpeed\n+    setParameter -parameter TxPortSpeed           -type string     -validValues $speedList -validateProc dataValidation::validatePortSpeed\n+    setParameter -parameter serverSpeed           -type string     -validValues $speedList -validateProc dataValidation::validatePortSpeed\n+    setParameter -parameter clientSpeed           -type string     -validValues $speedList -validateProc dataValidation::validatePortSpeed\n+    setParameter -parameter PPPnegotiation        -type boolean\n+    setParameter -parameter autoMapGeneration     -type boolean\n+    setParameter -parameter autonegotiate         -type boolean\n+    setParameter -parameter duplex                -type string     -validValues {full half}\n+    setParameter -parameter incrIpAddrByteNum     -type integer    -validValues {1 2 3 4}\n+    setParameter -parameter mapDirection          -type string     -validValues {unidirectional bidirectional}\n+    setParameter -parameter sonetRxCRC            -type string     -validValues {sonetCrc16 sonetCrc32}\n+    setParameter -parameter sonetTxCRC            -type string     -validValues {sonetCrc16 sonetCrc32}\n+    setParameter -parameter supportsPOS           -type boolean\n+    setParameter -parameter useMagicNumber        -type boolean\n+    setParameter -parameter useRecoveredClock     -type boolean\n+    setParameter -parameter dataScrambling        -type boolean\n+    setParameter -parameter enable802dot1qTag     -type boolean\n+    setParameter -parameter enableISLtag          -type boolean\n+    setParameter -parameter firstDestDUTIpAddress -type ipaddress  \n+    setParameter -parameter firstSrcIpxSocket     -type string\n+    setParameter -parameter ethernetType          -type string     -validValues {noType ethernetII}\n+    setParameter -parameter hdlcHeader            -type string     -validValues {ppp cisco}\n+    setParameter -parameter maxPercentRate        -type double     -validRange  {0.0001 100}\n+    setParameter -parameter responseTime          -type integer    -validRange  {0 NULL}\n+    setParameter -parameter protocolName          -type string     -validValues {mac ip ipV6 ipx}\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::setParameter\n+#\n+# Description:  Create an entry in the data validation database.\n+#\n+# Input:        args - arguments that define the name, type, values, and command\n+#                      for a test parameter in the following format.\n+#\n+#                      -parameter   $name   \\\n+#                      -type        $type   \\\n+#                      -validValues $values \\\n+#                      -validRange  $range  \\\n+#                      -command     $command\n+#\n+# Output:       status of the procedure\n+#\n+###############################################################################\n+proc dataValidation::setParameter {args} \\\n+{\n+    variable typeArray\n+    variable validValuesArray\n+    variable validRangeArray\n+    variable validateProcArray\n+    variable helpArray\n+\n+    variable typePattern\n+\n+    set retCode $::TCL_OK\n+\n+    #\n+    # This one is different in that the args could contain multiple -validateProc.\n+    #\n+    set validateProcArg {}\n+\n+    foreach arg $args {\n+\n+        if {[regexp {^-[a-zA-Z].+} $arg]} {\n+            #\n+            # Current argument is preceeded by '-'.\n+            #\n+\n+            # Remove the preceeding '-'.\n+            regsub {^-} $arg \"\" option\n+\n+            switch $option {\n+                parameter     -\n+                type          -\n+                validValues   -\n+                validRange    -\n+                validateProc  -\n+                help {\n+                    set currentOption $option\n+                    set currentAction getValue\n+                }\n+                default {\n+                    set retCode $::TCL_ERROR\n+                    break\n+                }\n+            }\n+        } else {\n+            if {[info exists currentAction]} {\n+                switch $currentAction {\n+                    \"getValue\" {\n+                        if {$currentOption == \"validateProc\"} {\n+                            lappend ${currentOption}Arg $arg\n+                        } else {\n+                            set ${currentOption}Arg $arg\n+                        }\n+\n+                        unset currentOption\n+                        unset currentAction\n+                    }\n+                    default {\n+                        set retCode $::TCL_ERROR\n+                        break\n+                    }\n+                }\n+            } else {\n+                set retCode $::TCL_ERROR\n+                break\n+            }\n+        }\n+    }\n+\n+    if {$retCode == $::TCL_OK} {\n+        #\n+        # Parameter name, and parameter type are mandatory when setting a test parameter.\n+        #\n+        if {[info exists parameterArg] == 0} {\n+        \n+            set retCode $::TCL_ERROR\n+        \n+        } elseif {[info exists typeArg] == 0} {\n+\n+            set retCode $::TCL_ERROR\n+\n+        } elseif {[info exists validValuesArg] && [info exists validRangeArg]} {\n+\n+            set retCode $::TCL_ERROR\n+\n+        }\n+    }\n+\n+    if {$retCode == $::TCL_ERROR} {\n+        errorMsg \"Invalid arguments: \\\"$args\\\".\"\n+        return $retCode\n+    }\n+\n+    if {[info exists typeArg]} {\n+        set typeArray($parameterArg) $typeArg\n+    }\n+\n+    if {[info exists validValuesArg] && ($validValuesArg != \"\")} {\n+        set validValuesArray($parameterArg) $validValuesArg\n+    }\n+\n+    if {[info exists validRangeArg]} {\n+        set validRangeArray($parameterArg) $validRangeArg\n+    }\n+\n+    if {[info exists validateProcArg]} {\n+        set validateProcArray($parameterArg) $validateProcArg\n+    }\n+\n+    if {[info exists helpArg]} {\n+        set helpArray($parameterArg) $helpArg\n+    }\n+\n+    return $retCode\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::getParameter\n+#\n+# Description:  Retrieve properties of test parameter(s).\n+#\n+# Input:        args - arguments of the following format\n+#                      (-parameter parameter) (-type) (-validValues) (-validRange) (-help)\n+#\n+# Output:       Prints out all the rules if no arguments specified.\n+#               Returns the rules for a parameter if only the parameter name \n+#               is specified. \n+#               Retruns the property if both the parameter name and the \n+#               property name are specified.\n+#\n+###############################################################################\n+proc dataValidation::getParameter {args} \\\n+{\n+    variable typeArray\n+    variable validValuesArray\n+    variable validRangeArray\n+    variable validateProcArray\n+    variable helpArray\n+    variable command\n+\n+    set retCode $::TCL_OK\n+\n+    set numArgs [llength $args]\n+\n+    switch $numArgs {\n+        0 {\n+            #\n+            # No arguments. Show everything.\n+            #\n+            showRules\n+        }\n+        2 {\n+            #\n+            # Has to be {-parameter $name}. Will return everything in a list of the\n+            # format {{$type} {$value} {$command}}. Primarily for find out the\n+            # general information the parameter about a parameter.\n+            #\n+            if {[lindex $args 0] == \"-parameter\"} {\n+                set argName [lindex $args 1]\n+                set retCode \"\"\n+                if [info exists typeArray($argName)] {\n+                    append retCode \"-parameter $argName -type $typeArray($argName) \"\n+\n+                    if [info exists validValuesArray($argName)] {\n+                        append retCode \"-validValues [list $validValuesArray($argName)] \"\n+                    }\n+                    if [info exists validRangeArray($argName)] {\n+                        append retCode \"-validRange [list $validRangeArray($argName)] \"\n+                    }\n+                    if [info exists validateProcArray($argName)] {\n+                        append retCode \"-validateProc $validateProcArray($argName)\"\n+                    }\n+                    if [info exists helpArray($argName)] {\n+                        append retCode \"-help $helpArray($argName)\"\n+                    }\n+                }\n+            } else {\n+                errorMsg \"Invalid format \\\"$args\\\".\"\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+        3 {\n+            #\n+            # Has to be \"-parameter $name -{type|validValues|validRange|validateProc|help}\". \n+            # Will return exactly what the caller wants.\n+            #\n+            if {[lindex $args 0] == \"-parameter\"} {\n+                set argName [lindex $args 1]\n+\n+                if [info exists typeArray($argName)] {\n+                    #\n+                    # The specified parameter name exists.\n+                    #\n+                    set property [string trimleft [lindex $args 2] -]\n+\n+                    if {$property == \"type\"} {\n+\n+                        set retCode $typeArray($argName)\n+\n+                    } elseif {$property == \"validValues\"} {\n+                        \n+                        if [info exists validValuesArray($argName)] {\n+                            set retCode $validValuesArray($argName)\n+                        } else {\n+                            set retCode \"\"\n+                        }\n+                    } elseif {$property == \"validRange\"} {\n+                        \n+                        if [info exists validRangeArray($argName)] {\n+                            set retCode $validRangeArray($argName)\n+                        } else {\n+                            set retCode \"\"\n+                        }\n+                    } elseif {$property == \"validateProc\"} {\n+\n+                        if [info exists validateProcArray($argName)] {\n+                            set retCode $validateProcArray($argName)\n+                        } else {\n+                            set retCode \"\"\n+                        }\n+                    } elseif {$property == \"help\"} {\n+\n+                        if [info exists helpArray($argName)] {\n+                            set retCode $helpArray($argName)\n+                        } else {\n+                            set retCode \"\"\n+                        }\n+                    } else {\n+                        errorMsg \"Invalid type \\\"$args\\\".\"\n+                        set retCode $::TCL_ERROR\n+                    }\n+                } else {\n+                    #\n+                    # The specified parameter name does not exist.\n+                    #\n+                    debugMsg \"The parameter \\\"$argName\\\" does not exist.\"\n+                }\n+            } else {\n+                errorMsg \"Invalid format \\\"$args\\\".\"\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+        default {\n+            #\n+            # Error.\n+            #\n+            errorMsg \"Invalid format \\\"$args\\\".\"\n+            set retCode $::TCL_ERROR\n+        }\n+    }\n+    \n+    return $retCode\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::showRules\n+#\n+# Description:  This command displays the data validation database.\n+#\n+# Input:        None\n+#\n+# Output:       None\n+#\n+###############################################################################\n+proc dataValidation::showRules {} \\\n+{    \n+    variable typeArray\n+    variable validValuesArray\n+    variable validRangeArray\n+    variable validateProcArray\n+    variable helpArray\n+    variable command\n+\n+    ixPuts \"========================================================================\"\n+    ixPuts [format \"%-24s %-10s %-80s %-s\" \"Parameter\" \"Type\" \"Values\" \"ValidateProc\"]\n+    ixPuts \"========================================================================\"\n+\n+    foreach name [lsort [array name typeArray]] {\n+\n+        set rule [format \"%-24s %-10s\" $name $typeArray($name)]\n+        \n+        if [info exists validValuesArray($name)] {\n+            append rule [format \" %-80s\" $validValuesArray($name)]\n+        }\n+        if [info exists validRangeArray($name)] {\n+            append rule [format \" %-80s\" $validRangeArray($name)]\n+        }\n+        if [info exists validateProcArray($name)] {\n+            append rule [format \" %-30s\" $validateProcArray($name)]\n+        }\n+        if [info exists helpArray($name)] {\n+            append rule [format \" %-30s\" $helpArray($name)]\n+        }\n+\n+        ixPuts $rule\n+    }\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::parseValues\n+#\n+# Description:  This command makes sure that the validateValues or validateRange\n+#               comply with the given type. (NEED TO BE MODIFIED)\n+#\n+# Input:        \n+#\n+# Output:       \n+#\n+###############################################################################\n+proc dataValidation::parseValues {type values} \\\n+{\n+    if {[llength $values] != 2} {\n+        errorMsg \"Wrong format for values \\\"$values\\\".\"\n+        return $::TCL_ERROR\n+    }\n+\n+    set retCode $::TCL_OK\n+\n+    set valueProperty [lindex $values 0]\n+\n+    switch $valueProperty {\n+        enum {\n+            set valueList [lindex $values 1]\n+            set retCode   [areValuesOfTheType $type $valueList]\n+        }\n+        range {\n+            set valueRange [lindex $values 1]\n+\n+            if {[llength $valueRange] != 2} {\n+                errorMsg \"Invalid range \\\"$valueRange\\\".\"\n+                set retCode $::TCL_ERROR\n+            } else {\n+                set lowerLimit [lindex $valueRange 0]\n+                set upperLimit [lindex $valueRange 1]\n+\n+                if {($type == \"integer\") || ($type == \"double\")} {\n+\n+                    if {($lowerLimit != \"NULL\") && ($upperLimit != \"NULL\")} {\n+                        if {([areValuesOfTheType $type $valueRange] == $::TCL_OK) &&\n+                            ($lowerLimit >= $upperLimit)} {\n+                            errorMsg \"Invalid range \\\"$valueRange\\\".\"\n+                            set retCode $::TCL_ERROR\n+                        }\n+                    } elseif {$lowerLimit == \"NULL\"} {\n+                        if {[areValuesOfTheType $type $upperLimit] != $::TCL_OK} {\n+                            errorMsg \"Invalid range \\\"$valueRange\\\".\"\n+                            set retCode $::TCL_ERROR\n+                        }\n+                    } elseif {$upperLimit == \"NULL\"} {\n+                        if {[areValuesOfTheType $type $lowerLimit] != $::TCL_OK} {\n+                            errorMsg \"Invalid range \\\"$valueRange\\\".\"\n+                            set retCode $::TCL_ERROR\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        default {\n+            errorMsg \"Wrong value property for values \\\"$values\\\".\"\n+            set retCode $::TCL_ERROR\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+###############################################################################\n+#\n+# dataValidation::isPortList\n+#\n+# Description:  Find out if the given value is a valid port list.\n+#\n+# Input:        value to be checked.\n+#\n+# Output:       1 if yes.\n+#               0 otherwise.\n+#\n+###############################################################################\n+proc dataValidation::isPortList {value} \\\n+{\n+    foreach args $value {\n+        foreach arg $args {\n+            if {$arg >=0 && [isInteger $arg]} {\n+                return 1\n+            } else {\n+                return 0\n+            }\n+        }\n+    }\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::isString\n+#\n+# Description:  Find out if the given value is a valid IP addresss.\n+#\n+# Input:        value to be checked.\n+#\n+# Output:       1 if yes.\n+#               0 otherwise.\n+#\n+###############################################################################\n+proc dataValidation::isString {value} \\\n+{\n+#   return [regexp {^[a-zA-Z].+} $value]\n+    return 1\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::isInteger\n+#\n+# Description:  Find out if the given value is a valid IP addresss.\n+#\n+# Input:        value to be checked.\n+#\n+# Output:       1 if yes.\n+#               0 otherwise.\n+#\n+###############################################################################\n+proc dataValidation::isInteger {value} \\\n+{\n+    return [regexp {^[-]?[0-9]+$} $value]\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::isDouble\n+#\n+# Description:  Find out if the given value is a valid IP addresss.\n+#\n+# Input:        value to be checked\n+#\n+# Output:       1 if yes.\n+#               0 otherwise.\n+#\n+###############################################################################\n+proc dataValidation::isDouble {value} \\\n+{\n+    set retCode 0\n+\n+    if { [string length $value] > 0 } { \n+        set retCode [regexp {^-?[0-9]*\\.?[0-9]*$} $value]\n+    } \n+    return $retCode\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::areValuesOfTheType\n+#\n+# Description:  Find out if all the given values are of the given type.\n+#\n+# Input:        type  - integer, double, string, ipaddress, or portlist\n+#               value - list of values to be checked\n+#\n+# Output:       TCL_OK    if no error\n+#               TCL_ERROR otherwise\n+#\n+###############################################################################\n+proc dataValidation::areValuesOfTheType {type value} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if {[llength $value] == 0} {\n+        set retCode $::TCL_ERROR\n+\t    return $retCode\n+    }\n+\n+    set flagList 0\n+        \n+    switch $type {\n+        integer   { set function isInteger        }\n+        double    { set function isDouble         }\n+        string    { set function isString         }\n+        ipaddress { set function isIpAddressValid }\n+        portlist  { set function portlist         }\n+        integerList {\n+            set function isInteger\n+            set flagList 1\n+        }\n+        stringList {\n+            set function isString\n+            set flagList 1\n+        }\n+        default   {\n+            errorMsg \"Invalid type \\\"$type\\\".\"\n+            return $::TCL_ERROR\n+        }\n+    }\n+\n+    if { $flagList == 1 } {\n+\n+        foreach item $value {\n+            if {[eval {$function $item}] == 0} {\n+            set retCode $::TCL_ERROR\n+                break\n+            }\n+        }\n+\n+    } else {\n+\n+        if {[eval {$function $value}] == 0} {\n+            set retCode $::TCL_ERROR\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::validateTest\n+#\n+# Description:  This command is invoked to validate the test parameters of the\n+#               given test command.\n+#\n+# Input: \n+#   cmd     - test command\n+#          \n+#\n+# Output:       TCL_OK    if no error\n+#               TCL_ERROR otherwise       \n+#\n+###############################################################################\n+proc dataValidation::validateTest {cmd {method cget}} \\\n+{\n+    set retCode   $::TCL_OK\n+    \n+    catch {$cmd $method} paramList\n+    foreach param [lsort [join $paramList]] {\n+        if {$param == \"-this\"} {\n+            continue\n+        }\n+        if {[string index $param 0] == \"-\"} {\n+            set param   [string trim $param -]\n+            if [validateCommandParameter $cmd $param] {\n+                ixPuts \"Invalid value specified for parameter -$param :[$cmd cget -$param], \\\n+                        Valid value(s):[getValidValueString $cmd $param]\"\n+                set retCode   $::TCL_ERROR\n+            }\n+        }\n+    }\n+    return $retCode    \n+}\n+\n+###############################################################################\n+#\n+# dataValidation::getValidValueString\n+#\n+# Description:  This command is \n+#\n+# Input:        \n+#   cmd     - test command\n+#   param   - command parameter\n+#\n+# Output:       \n+#\n+###############################################################################\n+proc dataValidation::getValidValueString {cmd param} \\\n+{\n+    set retCode   $::TCL_OK\n+\n+ \n+    return $retCode    \n+}\n+\n+###############################################################################\n+#\n+# dataValidation::validateTestConfParameter\n+#\n+# Description:  This command validate the the specified parameter of testConf.\n+#\n+# Input:        parameter - name of the parameter\n+#               value     - value of the parameter\n+#\n+# Output:       TCL_OK if no error.\n+#               TCL_ERROR otherwise.\n+#\n+###############################################################################\n+proc dataValidation::validateTestConfParameter {parameter value} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    switch $parameter {\n+        hdlcHeader        -\n+        duplex            -\n+        speed             -\n+        TxPortSpeed       -\n+        RxPortSpeed       -\n+        useMagicNumber    -\n+        sonetRxCRC        -\n+        sonetTxCRC        -\n+        dataScrambling    -\n+        useRecoveredClock -\n+        autonegotiate     -\n+        PPPnegotiation {\n+\n+            #\n+            # The values of these parameters could be in a list of pairs (value interface).\n+            #\n+\n+            # checking speed for 10GE WAN/OC192.\n+            if {$parameter == \"speed\" && (($value == \"WAN (Sonet)\") || ($value == \"WAN (SDH)\"))} {\n+                set retCode $::TCL_OK\n+            } elseif {$parameter == \"speed\" && (($value == \"Copper10\") || ($value == \"Copper100\") || \\\n+                    ($value == \"Copper1000\") || ($value == \"Fiber1000\"))} {\n+                set retCode $::TCL_OK\n+            } else {\n+                foreach elemOfValue $value {\n+                    set currValue [lindex $elemOfValue 0]\n+                    set retCode [doValidateTestConfParameter $parameter $currValue]\n+                    if {$retCode != $::TCL_OK} {\n+                        break\n+                    }\n+                }\n+            }\n+        }\n+        default {\n+            set retCode [doValidateTestConfParameter $parameter $value]\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::doValidateTestConfParameter\n+#\n+# Description:  This command performs the validation of the specified parameter of testConf.\n+#\n+# Input:        parameter - name of the parameter\n+#               value     - value of the parameter\n+#\n+# Output:       TCL_OK if no error.\n+#               TCL_ERROR otherwise.\n+#\n+###############################################################################\n+proc dataValidation::doValidateTestConfParameter {parameter value} \\\n+{\n+    variable booleanPattern\n+\n+    set retCode $::TCL_OK\n+\n+    set parameterType [getParameter -parameter $parameter -type]\n+    if {$parameterType == \"\"} {\n+        return $::TCL_ERROR\n+    }\n+\n+    switch $parameterType {\n+        boolean {\n+            if {[regexp $booleanPattern $value] == 0} {\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+        integer -\n+        double {\n+            set retCode [areValuesOfTheType $parameterType $value]\n+            if {$retCode == $::TCL_OK} {\n+                set retCode [validateNumber \"testConfig\" $parameter $value]\n+            } \n+        }\n+        integerList {\n+            set retCode [areValuesOfTheType $parameterType $value]        \n+            if {$retCode == $::TCL_OK} {\n+                foreach valueOfList $value {\n+                    set retCode [validateNumber \"testConfig\" $parameter $valueOfList]\n+                    if { $retCode == $::TCL_ERROR } {\n+                        break\n+                    }\n+                }\n+            } \n+        }\n+        string {\n+            set validValues [getParameter -parameter $parameter -validValues]\n+            if {$validValues != \"\"} {\n+                if {[lsearch $validValues $value] == -1} {\n+                    set retCode $::TCL_ERROR\n+                }\n+            }\n+        }\n+        stringList {\n+            set validValues [getParameter -parameter $parameter -validValues]\n+            if {$validValues != \"\"} {\n+                foreach valueOfList $value {\n+                    if {[lsearch $validValues $valueOfList] == -1} {\n+                        set retCode $::TCL_ERROR\n+                    }\n+                }\n+            }\n+        }\n+        ipaddress {\n+            if {[testConfig::getTestConfItem protocolName] == \"ip\"} {\n+                if {![isIpAddressValid $value]} {\n+                    set retCode $::TCL_ERROR\n+                }\n+            }\n+        }        \n+        portlist {\n+            if {[isPortList $value] == 0} {\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+        default {\n+        }\n+    }\n+\n+    if {[getParameter -parameter $parameter -validateProc] != \"\"} {\n+        foreach validateProc [getParameter -parameter $parameter -validateProc] {\n+            if {[info command \"::$validateProc\"] != \"\"} {\n+                set cmdLine \"::$validateProc $value\"\n+            } elseif {[info command \"[namespace current]::$validateProc\"] != \"\"} {\n+                set cmdLine \"$validateProc $value\"\n+            }\n+\n+            if {[info exists cmdLine]} {\n+\n+                set result [eval $cmdLine]\n+\n+                if {$result != $::TCL_OK} {\n+\n+                    if { $result == $::TCL_ERROR } {\n+            \n+                        setErrorString \"Failed on $validateProc.\"\n+            \n+                    } else {\n+    \n+                        # If result is neither TCL_OK nor TCL_ERROR, it must contain a string of \n+                        # error message.\n+                        #\n+                        setErrorString $result\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::validateCommandParameter\n+#\n+# Description:  This command validate the parameters of the specified command.\n+#\n+# Input:        command   - name of the test commmand\n+#               parameter - name of the parameter\n+#               value     - value of the parameter\n+#\n+# Output:       TCL_OK if no error.\n+#               TCL_ERROR otherwise.\n+#\n+###############################################################################\n+proc dataValidation::validateCommandParameter {command parameter {value \"\"}} \\\n+{\n+    variable booleanPattern\n+    set retCode $::TCL_OK\n+\n+    set value         [$command cget    -$parameter]\n+    set parameterType [$command getType -$parameter]\n+\n+    if {$parameterType == \"\"} {\n+        return $::TCL_ERROR\n+    }\n+\n+    switch $parameterType {\n+        boolean {\n+            if {[regexp -nocase $booleanPattern $value] == 0} {\n+                set retCode $::TCL_ERROR\n+            }\n+\n+        }\n+        integer -\n+        double {\n+            set retCode [areValuesOfTheType $parameterType $value]\n+            if {$retCode == $::TCL_OK} {\n+                set retCode [validateNumber $command $parameter $value]\n+            } \n+        }\n+        integerList {\n+            set retCode [areValuesOfTheType $parameterType $value]        \n+            if {$retCode == $::TCL_OK} {\n+                foreach valueOfList $value {\n+                    set retCode [validateNumber $command $parameter $valueOfList]\n+                    if { $retCode == $::TCL_ERROR } {\n+                        break\n+                    }\n+                }\n+            } \n+        }\n+        string {\n+            set validValues [$command getValidValues -$parameter]\n+            if {$validValues != \"\"} {\n+                if {[lsearch $validValues $value] == -1} {\n+                    set retCode $::TCL_ERROR\n+                }\n+            }\n+        }\n+        stringList {\n+            set validValues [$command getValidValues -$parameter]\n+            if {$validValues != \"\"} {\n+                foreach valueOfList $value {\n+                    if {[lsearch $validValues $valueOfList] == -1} {\n+                        set retCode $::TCL_ERROR\n+                        break\n+                    }\n+                }\n+            }\n+        }\n+        ipaddress {\n+            if {[testConfig::getTestConfItem protocolName] == \"ip\"} {\n+                if {![isIpAddressValid $value]} {\n+                    set retCode $::TCL_ERROR\n+                }\n+            }\n+        }\n+        portlist {\n+            if {[isPortList $value] == 0} {\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+        default {\n+        }\n+    }\n+\n+    if {[$command getValidateProc -$parameter] != \"\"} {\n+        foreach validateProc [$command getValidateProc -$parameter] {\n+            if {[info command \"::$validateProc\"] != \"\"} {\n+                set cmdLine \"::$validateProc $value\"\n+            } elseif {[info command \"[namespace current]::$validateProc\"] != \"\"} {\n+                set cmdLine \"$validateProc $value\"\n+            }\n+\n+            if {[info exists cmdLine]} {\n+\n+                set result [eval $cmdLine]\n+\n+                if {$result != $::TCL_OK} {\n+\n+                    if { $result == $::TCL_ERROR } {\n+\n+                        setErrorString \"Failed on $validateProc.\"\n+            \n+                    } else {\n+    \n+                        # If result is neither TCL_OK nor TCL_ERROR, it must contain a string of \n+                        # error message.\n+                        #\n+                        setErrorString $result\n+                        set retCode $::TCL_ERROR\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::setErrorString\n+#\n+# Description:  \n+#\n+# Input:        \n+#\n+# Output:       \n+#\n+###############################################################################\n+proc dataValidation::setErrorString {line} {\n+    variable errorString\n+\n+    set errorString $line\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::getErrorString\n+#\n+# Description:  \n+#\n+# Input:        \n+#\n+# Output:       \n+#\n+###############################################################################\n+proc dataValidation::getErrorString {} {\n+    variable errorString\n+\n+    set retVal $errorString\n+    set errorString \"\"\n+\n+    return $retVal\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::isDataInRange\n+#\n+# Description:  This command finds out if a given value is in the specified range.\n+#\n+# Input:        data - data to be checked.\n+#               range - the range to be checked against. Must be in the format of \n+#                       {lowerLimit, upperLimit}.\n+#\n+# Output:       TCL_OK if yes. TCL_ERROR otherwise.\n+#\n+###############################################################################\n+proc dataValidation::isDataInRange {data range} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    set lowerLimit [lindex $range 0]\n+    set upperLimit [lindex $range 1]\n+\n+    if {    (($lowerLimit != \"NULL\") && ($data < $lowerLimit)) || \\\n+            (($upperLimit != \"NULL\") && ($data > $upperLimit))} {\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::validatePortSpeed\n+#\n+# Description:  \n+#\n+# Input:        \n+#\n+# Output:       \n+#\n+###############################################################################\n+proc dataValidation::validatePortSpeed {args} \\\n+{\n+    # puts \"validating speed $args\"\n+    return $::TCL_OK\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::getProtocol\n+#\n+# Description:  This command finds out available protocols.\n+#\n+# Input:        \n+#\n+# Output: protocol list      \n+#\n+###############################################################################\n+proc dataValidation::getProtocol {} \\\n+{\n+    set protocolTable [imix cget -protocolTable]\n+    set protocolList {}\n+    foreach list $protocolTable {\n+        lappend protocolList [lindex $list 0]\n+    }\n+\n+    return $protocolList\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::checkIdentical\n+#\n+# Description:  This command finds out if a given value is identical to others.\n+#               If it isn't, then add it to list.\n+#\n+# Input:        list      - available list\n+#               args      - args to be checked.    \n+#\n+# Output:       list      \n+#\n+###############################################################################\n+proc dataValidation::checkIdentical {list value} \\\n+{\n+    set length [llength $list]\n+\tset different 0\n+\n+\tif {$length == 0} {\n+\t\tlappend list $value\n+\t\tincr length\n+\t}\n+\n+\tfor {set index 0} {$index < $length} {incr index} {\n+\t\tif {$value != [lindex $list $index]} {\n+\t\t\tif {$index == [expr $length - 1]} {\n+\t\t\t\tset different 1\n+\t\t\t}\n+\t\t\tcontinue\n+\t\t} else {\n+\t\t\tbreak\n+\t\t}\n+\t}\n+\n+\tif {$different == 1} {\n+\t\tlappend list $value\n+\t}\n+\n+\treturn $list\n+\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::checkMatched\n+#\n+# Description:  This command finds out if a given value is match to list.\n+#\n+# Input:    list    - available list\n+#           value   - value to be checked.   \n+#\n+# Output:  TCL_OK if yes. TCL_ERROR otherwise.      \n+#\n+###############################################################################\n+proc dataValidation::checkMatched {list value} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    foreach arg $list {\n+        if {$arg == $value } {\n+            break\n+        } elseif {$arg != $value && $arg == [lindex $list end]} {\n+            set retCode $::TCL_ERROR\n+        }\n+    }\n+            \n+    return $retCode\n+\n+}\n+\n+\n+###############################################################################\n+#\n+# dataValidation::frameSizeProtocolSame\n+#\n+# Description:  This command finds out if both frame size and protocol are same.\n+#\n+# Input:  args - args to be checked.      \n+#\n+# Output: TCL_OK if no. TCL_ERROR otherwise.     \n+#\n+###############################################################################\n+proc dataValidation::frameSizeProtocolSame {args} \\\n+{\n+    set retCode $::TCL_OK\n+    set imixList [lindex $args 0]\n+    debugMsg \"imixList: $imixList\"\n+    set argsLength [llength $imixList]\n+    set frameSizeProtocolList {}\n+\n+    foreach arg $imixList {\n+        set length [llength [lindex $arg 0]]\n+        if {$length == 1} {\n+            lappend frameSizeProtocolList [lindex $arg 0]\n+            lappend frameSizeProtocolList UDP\n+        } else {\n+            lappend frameSizeProtocolList [lindex [lindex $arg 0] 0]\n+            lappend frameSizeProtocolList [lindex [lindex $arg 0] 1]\n+        }\n+    }\n+\n+    debugMsg \"frameSizeProtocolList:$frameSizeProtocolList\"\n+\n+    for {set index1 0} {$index1 < [expr 2 * $argsLength]} {incr index1 0} {\n+        set frameSize1 [lindex $frameSizeProtocolList $index1]\n+        incr index1\n+        set protocol1 [lindex $frameSizeProtocolList $index1]\n+        incr index1\n+        for {set index2 $index1} {$index2 < [expr 2 * $argsLength]} {incr index2 0} {\n+            set frameSize2 [lindex $frameSizeProtocolList $index2]\n+            incr index2\n+            set protocol2 [lindex $frameSizeProtocolList $index2]\n+            incr index2\n+\n+            if {$frameSize1 == $frameSize2} {\n+                if {[stringCompare -nocase $protocol1 $protocol2] == 0} {\n+                    logMsg \"Invalid for both frame size $frameSize1 and $frameSize2 have same protocols\"\n+                    set retCode $::TCL_ERROR\n+                    break\n+                }\n+            }\n+        }\n+        if {$retCode == $::TCL_ERROR} {\n+            break\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+###############################################################################\n+#\n+# dataValidation::validateImixList\n+#\n+# Description:  This command finds out if a given imixList is valid.\n+#\n+# Input:  args - args to be checked. For example:\n+#                set list  {{{80     tcp           }         20} \\\n+#                           { 74                             20} \\\n+#                           {{570    udp           }         20} \\\n+#                           {{81     aaa           }         20} \\\n+#                           {570                             20}}     \n+#\n+# Output: TCL_OK if yes. TCL_ERROR otherwise.     \n+#\n+###############################################################################\n+proc dataValidation::validateImixList {args} \\\n+{\n+\tset retCode $::TCL_OK\n+    set sum 0\n+    set bandwidthList {}\n+\n+    set imixList [lindex $args 0]\n+    debugMsg \"imixList= $imixList\"\n+\n+    if [frameSizeProtocolSame $imixList] {\n+        set retCode $::TCL_ERROR \n+        return $retCode\n+    } \n+\n+    foreach arg $imixList { \n+        debugMsg \"--------------------------------------------\"\n+        debugMsg \"arg:$arg\"\n+        for {set index2 0} {$index2 < 2} {incr index2} {\n+            switch $index2 {\n+                0 {\n+                    set subArg [lindex $arg 0]\n+                    set len3 [llength $subArg]\n+                    for {set index3 0} {$index3 < $len3} {incr index3} {\n+                        set parameter [lindex $subArg $index3]\n+                        switch $index3 {\n+                            0 {\n+                                debugMsg \"********** fs:$parameter ***********\"\n+                                if {[isInteger $parameter] == 0} {\n+                                    debugMsg \"fs:$parameter invalid which isnot an integer\"\n+                                    set retCode $::TCL_ERROR\n+                                } elseif {$parameter < 0} {\n+                                    debugMsg \"fs:$parameter invalid which is less than 0\"\n+                                    set retCode $::TCL_ERROR\n+                                } elseif {$parameter <70} {\n+                                    set protocol [lindex $subArg 1]\n+                                    debugMsg \"subArg=$subArg\"\n+                                    debugMsg \"protocol:$protocol\"\n+                                    if {[stringCompare -nocase \"Ethernet\" $protocol] == 0} {\n+                                        debugMsg \"fs:$parameter invalid which is less than 70 while using Ethernet\"\n+                                        set retCode $::TCL_ERROR\n+                                    }\n+                                }\n+                            }\n+                            1 {\n+                                debugMsg \"********** protocol:$parameter ***********\"\n+                                set protocolList [getProtocol]\n+                                if {[checkMatched $protocolList $parameter] == 1} {\n+                                    debugMsg \"protocol:$parameter invalid which doesnot match your protocol list\"\n+                                    set retCode $::TCL_ERROR\n+                                }                             \n+                            }\n+                            2 {\n+                                debugMsg \"********** precedence:$parameter ***********\"\n+                                if {[isInteger $parameter] == 0} {\n+                                    debugMsg \"precedence:$parameter invalid which isnot an integer\"\n+                                    set retCode $::TCL_ERROR\n+                                } elseif {$parameter < 0} {\n+                                    debugMsg \"precedence:$parameter invalid which is less than 0\"\n+                                    set retCode $::TCL_ERROR\n+                                }                                   \n+                            }\n+                        }\n+                    }\n+\n+                }\n+                1 {\n+                    set parameter [lindex $arg 1]\n+                    debugMsg \"********** %bandwidth:$parameter ***********\"\n+                    if {[isDouble $parameter] == 0} {\n+                        debugMsg \"%bandwidth:$parameter invalid which isnot an integer or double\"\n+                        set retCode $::TCL_ERROR\n+                    } elseif {$parameter < 0} {\n+                        debugMsg \"%bandwidth:$parameter invalid which is less than 0\"\n+                        set retCode $::TCL_ERROR\n+                    } elseif {[expr $sum + $parameter] > 100} {\n+                        debugMsg \"%bandwidth:$parameter invalid which is more than [expr 100 - $sum]\"\n+                        set retCode $::TCL_ERROR\n+                    } else {\n+                        set sum [expr $sum + $parameter]\n+                    }\n+                }\n+            }\n+        }\n+ \n+    }  \n+    debugMsg \"--------------------------------------------\"\n+\n+\treturn $retCode\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::validateProtocolTable\n+#\n+# Description:  This command finds out if a given protocolTable List is valid.\n+#\n+# Input:   args: - protocolTable List. For example:\n+#                  protocolTable {{ tcp          tcp        0         0   } \\\n+#                                 { http         tcp        1053     80   } \\\n+#                                 { ftp          tcp        1054     21   } \\\n+#                                 { dns          udp        1055     22   } \\\n+#                                 { telnet       tcp        1056     23   } \\\n+#                                 { test1        egp        1057     24   } \\\n+#                                 { test2        icmp       1058     25   }}      \n+#\n+# Output:  TCL_OK if yes. TCL_ERROR otherwise.     \n+#\n+###############################################################################\n+proc dataValidation::validateProtocolTable {args} \\\n+{\n+    set retCode $::TCL_OK\n+    debugMsg \"protocol table: args= $args\"\n+    set argsList [lindex $args 0]\n+    set len [llength $argsList]\n+    set yourProtocolList {}\n+    set standardProtocolList {http telnet ftp tcp udp icmp bgp ospf rsvp rvp ethernet}\n+\n+    foreach arg $argsList { \n+        debugMsg \"--------------------------------------------\"\n+        debugMsg \"arg:$arg\"\n+        for {set index 0} {$index < $len} {incr index} {\n+            set parameter [lindex $arg $index]\n+            switch $index {\n+                0 {\n+                    debugMsg \"********** your protocol:$parameter **********\"\n+                    set length [llength $yourProtocolList]\n+                    set yourProtocolList [checkIdentical $yourProtocolList $parameter]\n+                    if {$length == [llength $yourProtocolList]} { \n+                        debugMsg \"yourProtocol:$parameter invalid which is identical to others\"\n+                        set retCode $::TCL_ERROR\n+                    }\n+                }\n+                1 {\n+                    debugMsg \"********** protocol:$parameter ***********\"\n+                    if {[checkMatched $standardProtocolList $parameter] == 1} {\n+                        debugMsg \"Protocol:$parameter invalid which is not a standard protocol\"\n+                        set retCode $::TCL_ERROR\n+                    }\n+                }\n+                2 {\n+                    debugMsg \"********** srcPort:$parameter ***********\"\n+                    if {[isInteger $parameter] == 0} {\n+                        debugMsg \"srcPort:$parameter invalid which isnot an integer\"\n+                        set retCode $::TCL_ERROR\n+                    } elseif {$parameter < 0} {\n+                        debugMsg \"srcPort:$parameter invalid which is less than 0\"\n+                        set retCode $::TCL_ERROR\n+                    }\n+                      \n+                    \n+                }\n+                3 {\n+                    debugMsg \"********** destPort:$parameter **********\"\n+                    if {[isInteger $parameter] == 0} {\n+                        debugMsg \"destPort:$parameter invalid which isnot an integer\"\n+                        set retCode $::TCL_ERROR\n+                    } elseif {$parameter < 0} {\n+                        debugMsg \"destPort:$parameter invalid which is less than 0\"\n+                        set retCode $::TCL_ERROR\n+                    }\n+                }\n+            }\n+     \n+        }\n+    }\n+    debugMsg \"--------------------------------------------\"\n+\n+\treturn $retCode\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::validateCmFlowMix\n+#\n+# Description:  \n+#\n+# Input:        \n+#\n+# Output:       \n+#\n+###############################################################################\n+proc dataValidation::validateCmFlowMix {args} \\\n+{\n+}\n+\n+###############################################################################\n+#\n+# dataValidation::validateRunType\n+#\n+# Description:  \n+#\n+# Input:        \n+#\n+# Output:       \n+#\n+###############################################################################\n+proc dataValidation::validateRunType {args} \\\n+{\n+}\n+\n+\n+###############################################################################\n+#\n+# dataValidation::validateNumber\n+#\n+# Description:  Validates a number that can be either integer or double.\n+#\n+# Input:  command   - name of the test commmand\n+#         parameter - name of the parameter\n+#         value     - value of the parameter\n+#\n+# Output: TCL_OK if yes. TCL_ERROR otherwise.     \n+#\n+###############################################################################\n+proc dataValidation::validateNumber {command parameter value} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    set enumOrRange \"\"\n+    if { $command == \"testConfig\" } {\n+        set validValue [getParameter -parameter $parameter -validValues]\n+    } else {\n+        set validValue [$command getValidValues -$parameter]\n+    }\n+\n+    if {$validValue != \"\"} {\n+        set enumOrRange enum\n+    } else {\n+        if { $command == \"testConfig\" } {\n+            set validValue [getParameter -parameter $parameter -validValues]\n+        } else {\n+            set validValue [$command getValidRange -$parameter]\n+        }\n+\n+        if {$validValue != \"\"} {\n+            set enumOrRange range\n+        }\n+    }\n+                \n+    if {$enumOrRange == \"enum\"} {\n+        foreach elemOfValue $value {\n+            if {[lsearch $validValue $elemOfValue] == -1} {\n+                set retCode $::TCL_ERROR\n+                break\n+            }\n+        }\n+    } elseif {$enumOrRange == \"range\"} {\n+        foreach elemOfValue $value {\n+            set retCode [isDataInRange $elemOfValue $validValue]\n+                if {$retCode == $::TCL_ERROR} {\n+                break\n+            }\n+        }\n+    }\n+    \n+\treturn $retCode\n+}\n+\n+\n+###############################################################################\n+#\n+# dataValidation::checkErrFrameFrameErrorList\n+#\n+# Description:  This command validates frame error list for 2889 error frame test.\n+#\n+# Input:        framesize\n+#\n+# Output:       TCL_OK, if no error\n+#               Error string, otherwise\n+#\n+###############################################################################\n+proc dataValidation::checkErrFrameFrameErrorList { frameErrorList } \\\n+{\n+ \n+    set retCode $::TCL_OK\n+\n+    if { [llength $frameErrorList] == 0 } {\n+\n+        set retCode \"frameErrorList must not be empty.\\nAt least one type of the frame sizes\\nhave to be selected.\"\n+\n+    } else {\n+\n+        set frameSizeCount 0\n+\n+        foreach item $frameErrorList {\n+            switch $item {\n+                undersize {\n+                    incr frameSizeCount [llength [errframe cget -undersizeList]]\n+                }\n+                oversize {\n+                    incr frameSizeCount [llength [errframe cget -oversizeList]]\n+                }\n+                default {\n+                    incr frameSizeCount [llength [errframe cget -framesizeList]]\n+                }\n+            }\n+        }\n+\n+        if { $frameSizeCount == 0 } {\n+            set retCode \"No valid frame sizes were selected\\n\\\n+                         for current framesize option(s)\"\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+###############################################################################\n+#\n+# dataValidation::checkCmatsIpAndMacAddress\n+#\n+# Description:  This command validates address of Cmats test.\n+#               The address of cableModem command can be either IP address and\n+#               MAC address. The last bit of the first byte has to be on if it\n+#               is MAC address. \n+#\n+# Input:        address\n+#\n+# Output:       TCL_OK, if no error\n+#               Error string, otherwise\n+#\n+###############################################################################\n+proc dataValidation::checkCmatsIpAndMacAddress { address } \\\n+{\n+    global currContext\n+\n+    set retCode $::TCL_OK\n+\n+    if {![isIpAddressValid $address]} {\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    if { $retCode == $::TCL_ERROR } {\n+\n+        # The address is not IP address. Let's see if it is MAC address.\n+\n+        if { [isMacAddressValid $address] == $::TCL_OK } {\n+    \n+            if { $currContext(testSubCat) == \"eth01McastUpstream\" || \\\n+                    $currContext(testSubCat) == \"eth01McastDownstream\" } {\n+\n+                # The last bit of the first byte has to be on.\n+\n+                set firstByte [lindex [split $address] 0]\n+                if { [expr 0x$firstByte & 01] == 1 } {\n+                    set retCode $::TCL_OK\n+                }\n+\n+            } else {\n+                set retCode $::TCL_OK\n+            }\n+        }\n+    }\n+\n+    if { $retCode == $::TCL_ERROR } {\n+        set retCode \"Valid IP or MAC address.\"\n+\n+        if { $currContext(testSubCat) == \"eth01McastUpstream\" || \\\n+                $currContext(testSubCat) == \"eth01McastDownstream\" } {\n+            append retCode \"The last bit of the first byte has to be on for MAC address.\"\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure: dataValidation::isValidMulticastIp\n+#\n+# Description: \n+#   Helper proc to check if ipAddress is a valid IP by making sure it falls in the\n+#   range (224.0.0.0 - 239.255.255.255).\n+#\n+# Arguments(s):\n+#   ipAddress - IP address\n+#\n+# Returns:\n+#   $::TCL_OK, if is valid unicast IP address\n+#   Valid range, otherwise\n+#\n+##################################################################################\n+proc dataValidation::isValidMulticastIp {ipAddress} \\\n+{\n+    set retCode \"\\(224.0.0.0 - 239.255.255.255\\)\"\n+\n+    if {[isIpAddressValid $ipAddress]} {\n+\n+        set multicastIpStartNum [ip2num \"224.0.0.0\"]\n+        set multicastIpEndNum   [ip2num \"239.255.255.255\"]\n+        set ipNum               [ip2num $ipAddress]\n+\n+        if { ($ipNum >= $multicastIpStartNum) && ($ipNum <= $multicastIpEndNum) } {\n+            set retCode $::TCL_OK\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure: dataValidation::isValidUnicastIp\n+#\n+# Description: \n+#   Helper proc to check if ipAddress accomplied with the following\n+#       1) it is not 0.x.x.x\n+#       2) it is not 255.255.255.255\n+#       3) it is not loopback address (127.x.x.x)\n+#       4) it is not multicast address (224.0.0.0 - 239.255.255.255, i.e first 4 bits not 1110)\n+#       5) it is not reserved for future use (240.0.0.0 - 247.255.255.255)\n+#       6) it is invalid when it is < 1.0.0.0 or >= 224.0.0.0 on port\n+#\n+# Arguments(s):\n+#   ipAddress - IP address\n+#\n+# Returns:\n+#   $::true     if is valid unicast IP address\n+#   $::false    if is not valid unicast IP address\n+#\n+##################################################################################\n+proc dataValidation::isValidUnicastIp {ipAddress} \\\n+{\n+    set valid $::false\n+\n+    if {[isIpAddressValid $ipAddress]} {\n+        set valid $::true\n+\n+        set multicastIpStartNum [ip2num \"224.0.0.0\"]\n+        set ipNum               [ip2num $ipAddress]\n+        \n+        if {([lindex [split $ipAddress .] 0] == 127) || ([lindex [split $ipAddress .] 0] == 255) || \\\n+            ([lindex [split $ipAddress .] 0] == 0)} {\n+            set valid $::false\n+        }\n+                \n+        if { [mpexpr $ipNum >= $multicastIpStartNum] } {\n+            set valid $::false\n+        }\n+    }\n+\n+    return $valid\n+}\n+\n+##################################################################################\n+# Procedure: dataValidation::isOverlappingIpAddress\n+#\n+# Description: \n+#   Helper proc to check if IP addresses are overlapping\n+#\n+# Arguments(s):\n+#   ipAddress1  - ipAddress to compare to\n+#   mask1       - net mask\n+#   ipAddress2  - ipAddress to compare to\n+#   mask2       - net mask\n+#\n+# Returns:\n+#   $::true     - if overlapping\n+#   $::false    - if not overlapping\n+#\n+##################################################################################\n+proc dataValidation::isOverlappingIpAddress {ipAddress1 count1 ipAddress2 count2} \\\n+{\n+    set overlap $::false\n+\n+    set firstIp1 [ip2num $ipAddress1]\n+    set lastIp1  [mpexpr $firstIp1 + $count1 - 1]\n+\n+    set firstIp2 [ip2num $ipAddress2]\n+    set lastIp2  [mpexpr $firstIp2 + $count2 - 1] \n+ \n+    if {($firstIp1 <= $firstIp2 && $firstIp2 <= $lastIp1) || \\\n+        ($firstIp1 <= $lastIp2 && $lastIp2 <= $lastIp1)} {\n+        set overlap $::true\n+    }           \n+\n+    if {($firstIp2 <= $firstIp1 && $firstIp1 <= $lastIp2) || \\\n+        ($firstIp2 <= $lastIp1 && $lastIp1 <= $lastIp2)} {\n+        set overlap $::true\n+    } \n+\n+    return $overlap\n+}\n+\n+##################################################################################\n+# Procedure: dataValidation::isSameSubnet\n+#\n+# Description: \n+#   Helper proc to check if ports in two different user profiles are in the same subnet.\n+#   Note that all ports in one user porfile are in the same subnet.\n+#\n+# Arguments(s):\n+#   ipAddr1 - ipAddress to compare to\n+#   mask1   - net mask\n+#   ipAddr2 - ipAddress to compare to\n+#   mask2   - net mask\n+#\n+# Returns:\n+#   $::true if in same subnet\n+#   $::false if not in same subnet\n+#\n+##################################################################################\n+proc dataValidation::isSameSubnet {ipAddr1 mask1 ipAddr2 mask2} \\\n+{\n+    set retCode $::true\n+\n+    set range1Subnet    [num2ip [expr [ip2num $ipAddr1] & [ip2num $mask1]]]\n+    set range2Subnet    [num2ip [expr [ip2num $ipAddr2] & [ip2num $mask2]]]\n+\n+    if {[string compare $range1Subnet $range2Subnet] != 0} {\n+        set retCode $::false\n+    } \n+\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure: dataValidation::isValidNetMask\n+#\n+# Description: \n+#   Helper proc to check if net mask is valid. i.e. In binary form, the mask must \n+#   have consecutive 1's followed by consecutive 0's\n+#\n+# Arguments(s):\n+#   mask - net mask\n+#\n+# Returns:\n+#   $::true     - if valid mask\n+#   $::false    - if not valid mask\n+#\n+##################################################################################\n+proc dataValidation::isValidNetMask {mask} \\\n+{\n+    set valid $::false\n+\n+    if {[isIpAddressValid $mask]} {\n+        set numMask [ip2num $mask]\n+\n+        if {![catch {expr fmod(0x80000000, ($numMask ^ 0xffffffff) +1)} value] && $value == 0} {\n+            set valid $::true\n+        }            \n+    }\n+\n+    return $valid\n+}\n+\n+##################################################################################\n+# Procedure: dataValidation::isValidHostPart\n+#\n+# Description: \n+#   Helper proc to check if ipAddress is valid within the net mask\n+#               The host bits cannot be all 0s or 1s\n+#\n+# Arguments(s):\n+#   ipAddress - IP address, net mask\n+#\n+# Returns:\n+#   $::true     if is valid IP address within net mask\n+#   $::false    if is not valid IP address within net mask\n+#\n+##################################################################################\n+proc dataValidation::isValidHostPart {ipAddress mask} \\\n+{\n+    set valid $::false\n+\n+    if {[isValidUnicastIp $ipAddress] && [isValidNetMask $mask]} {\n+\n+        set ipNum       [ip2num $ipAddress]\n+        set maskNum     [ip2num $mask]\n+\n+        set valid  [expr ((1 + $ipNum) & (~$maskNum)) > 1]\n+    }\n+\n+    return $valid\n+}\n+\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/defineCommand.tcl b/dep/tclclient/ixTcl1.0/Generic/defineCommand.tcl\nnew file mode 100644\nindex 00000000..43732bad\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/defineCommand.tcl\n@@ -0,0 +1,441 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: defineCommand.tcl\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+# Revision Log:\n+# 12-13-1999\tDS\tGenesis\n+#\n+# Description: This file contains the commands for all the tests. When a new test\n+# is added, create a new proc for that test here.\n+#\n+##################################################################################\n+\n+\n+\n+########################################################################################\n+# Namespace: defineCommand\n+#\n+# Description: This namespace is used to initialize the defineCommand commands\n+#\n+########################################################################################\n+namespace eval defineCommand {} \\\n+{\n+    variable commands\n+    variable commandList\n+    \n+    set      commandList               {}\n+    set      commands(config)          {}\n+    set      commands(cget)            {}\n+    set      commands(show)            {}\n+    set      commands(setDefault)      {}\n+\n+    set      commands(getType)         {}\n+    set      commands(getValidRange)   {}\n+    set      commands(getValidValues)  {}\n+    set      commands(getValidateProc) {}\n+    set      commands(getHelp)         {}\n+}\n+\n+########################################################################################\n+# Procedure: initializeDefineCommand\n+#\n+# Description: This command is used to initialize the defineCommand commands\n+#\n+########################################################################################\n+proc initializeDefineCommand {} \\\n+{\n+    defineCommand::initialize\n+}\n+\n+########################################################################################\n+# Procedure: defineCommand::initialize\n+#\n+# Description: This command is used to initialize the defineCommand commands\n+#\n+########################################################################################\n+proc defineCommand::initialize {} \\\n+{\n+    set retCode 0\n+\n+    # once we get this one registered, then we can use its methods\n+    registerCommand defineCommand\n+    registerMethod defineCommand registerCommand\n+    registerMethod defineCommand registerMethod\n+\n+    # now that we have registered the registerMethod, we can use it for the other methods\n+    defineCommand registerMethod defineCommand isRegistered\n+    defineCommand registerMethod defineCommand registerParameter\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: defineCommand::isRegistered\n+#\n+# Description: This command checks to see if a command is registered\n+#\n+########################################################################################\n+proc defineCommand::isRegistered {testCmd} \\\n+{\n+    set retCode 0\n+\n+    if [catch {$testCmd exists} retCode] {\n+        set retCode 0\n+    }\n+    return [expr $retCode]\n+}\n+\n+########################################################################################\n+# Procedure: defineCommand::getAllRegisteredCommands\n+#\n+# Description: This command gets the Tcl command list\n+#\n+########################################################################################\n+proc defineCommand::getAllRegisteredCommands { } \\\n+{\n+    set retCode 0\n+\n+    variable commandList\n+\n+    return $commandList\n+}\n+\n+########################################################################################\n+# Procedure: defineCommand::registerCommand\n+#\n+# Description: This command registers a new Tcl command\n+#\n+########################################################################################\n+proc defineCommand::registerCommand {testCmd} \\\n+{\n+    set retCode 0\n+\n+    global   defineCommandParms\n+    variable commands\n+    variable commandList\n+\n+\n+    if [isRegistered $testCmd] {\n+        debugMsg \"registerCommand: $testCmd is already registered\"\n+        set retCode 1\n+    } else {\n+\n+        lappend commandList $testCmd\n+\n+        set parmArray   [format %sParms $testCmd]\n+        set methodArray [format %sMethods $testCmd]\n+        global $parmArray $methodArray\n+       \n+        #define namespace for testCmd\n+        #NOTE: Not defined variable here, may define them in proc testCmd::setDefault later.\n+        #      Defined results and dataVerify namespaces twice in two files. \n+        #      Defined tclClient and advancedTestParameter namespaces which we may not need.\n+        #      We need modify those later.\n+        namespace eval ::$testCmd {} {\n+        }\n+         \n+        # assign global parms automatically on registration\n+        foreach parm [array names defineCommandParms] {\n+            set ${parmArray}($parm)   $defineCommandParms($parm)\n+        }\n+        foreach command [array names commands] {\n+            set ${methodArray}($command)    $commands($command)\n+        }\n+        set cmdLine \"proc ::$testCmd \\{\\{method_name \\{\\}\\} \\{args \\{\\}\\}\\} \\{return \\[parseCmd $testCmd \\$method_name args\\]\\}\"\n+        eval $cmdLine\n+\n+        # create the default set of methods\n+        foreach command [array names commands] {\n+            registerMethod $testCmd $command\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure:   defineCommand::registerMethod\n+#\n+# Description: This command registers a new method for this Tcl command\n+#\n+# Arguments:   \n+#\n+# Results:     0 if succeeded. 1 otherwise.\n+#\n+########################################################################################\n+proc defineCommand::registerMethod {testCmd method {parameterList {}}} \\\n+{\n+    set retCode 0\n+\n+    if {![isRegistered $testCmd]} {\n+        puts \"$testCmd is not yet registered, registering method failed.\"\n+        set retCode 1\n+    } else {\n+        set methodArray [format %sMethods $testCmd]\n+\n+        global $methodArray\n+\n+        set method_name [format \"%s_%s\" $testCmd $method]\n+\n+        if [info exists ${methodArray}($method)] {\n+            foreach parm $parameterList {\n+                if {[lsearch [eval set ${methodArray}($method)] $parm] == -1} {\n+                    lappend ${methodArray}($method) $parm\n+                }\n+            }\n+        } else {\n+            set ${methodArray}($method)     $parameterList\n+        }\n+\n+        if [catch {info body $method_name}] {\n+            if {$method == \"setDefault\"} {\n+                set defaultArray    [format %sDefaultVals $testCmd]\n+                set cmdLine \"proc \\:\\:$testCmd\\:\\:$method \\{\\{args \\{\\}\\}\\} \\{global $defaultArray; \\\n+                        foreach name \\[array names ${defaultArray}\\] { \\\n+                        $testCmd config -\\$name  \\$${defaultArray}(\\$name); \\\n+                    }; \\\n+                    return 0\\}\"\n+                eval $cmdLine\n+            }\n+        }\n+    }\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: defineCommand::registerParameter\n+#\n+# Description: This command registers a new parameter for this Tcl command\n+#\n+# Arguments:   args - must be in the following format.\n+#                       -command      command      \\\n+#                       -parameter    parameter    \\\n+#                       -type         type         \\\n+#                       -defaultValue defaultValue \\\n+#                       -validValues  validValues  \\\n+#                       -validRange   validRange   \\\n+#                       -validateProc validateProc \\\n+#                       -access       access\n+#                     where -command, -parameter, and -type are mandatory.\n+#\n+# Results:     0 if succeeded. 1 otherwise.\n+#\n+########################################################################################\n+proc defineCommand::registerParameter {args} \\\n+{\n+    set retCode 0\n+    \n+    #\n+    # If the argument comes in as a list. Take away the curly braces around it.\n+    #\n+    if {[regexp {^\\{} $args]} {\n+        regsub -all {(^{|}$)} $args \"\" args\n+    }\n+\n+    #\n+    # This one is different in that the args could contain multiple -validateProc.\n+    #\n+    set validateProcArg {}\n+\n+    foreach arg $args {\n+\n+        if {[regexp {^-[a-zA-Z].+} $arg]} {\n+            #\n+            # Current argument is preceeded by '-'.\n+            #\n+            switch -- $arg {\n+                \"-command\"       -\n+                \"-parameter\"     -\n+                \"-type\"          -\n+                \"-defaultValue\"  -\n+                \"-validValues\"   -\n+                \"-validRange\"    -\n+                \"-validateProc\"  -\n+                \"-access\"        -\n+                \"-help\" {\n+                    set currentOption [string trimleft $arg -]\n+                    set currentAction getValue\n+                }\n+                default {\n+                    set retCode 1\n+                    break\n+                }\n+            }\n+        } else {\n+            if {[info exists currentAction]} {\n+                switch $currentAction {\n+                    \"getValue\" {\n+                        if {$currentOption == \"validateProc\"} {\n+                            lappend ${currentOption}Arg $arg\n+                        } else {\n+                            set ${currentOption}Arg $arg\n+                        }\n+\n+                        unset currentOption\n+                        unset currentAction\n+                    }\n+                    default {\n+                        set retCode 1\n+                        break\n+                    }\n+                }\n+            } else {\n+                set retCode 1\n+                break\n+            }\n+        }\n+    }\n+\n+    if {$retCode == 0} {\n+        #\n+        # Test command name, parameter name, and parameter type are mandatory when\n+        # registring a test parameter.\n+        #\n+        if {[info exists commandArg] == 0} {\n+\n+            set retCode 1\n+        \n+        } elseif {[info exists parameterArg] == 0} {\n+        \n+            set retCode 1\n+        \n+        } elseif {[info exists typeArg] == 0} {\n+\n+            set retCode 1\n+\n+        } elseif {[info exists validValuesArg] && [info exists validRangeArg]} {\n+\n+            set retCode 1\n+\n+        }\n+    }\n+\n+    if {$retCode == 1} {\n+        puts \"Invalid arguments: \\\"$args\\\".\"\n+        return $retCode\n+    }\n+\n+    if {![isRegistered $commandArg]} {\n+        puts \"$commandArg is not yet registered, registering parameter failed.\"\n+        set retCode 1\n+    } else {\n+\n+        if {[info exists defaultValueArg] == 0} {\n+            set defaultValueArg 0\n+        }\n+\n+        #\n+        # $parmArray         - contains the values defined by the option -parameter\n+        # $methodArray       - contains the values defined by the option -command\n+        # $validateArray     - contains the values defined by the option -validValues\n+        # $defaultArray      - contains the values defined by the option -defaultValue\n+        # $validRangeArray   - contains the values defined by the option -validRange\n+        # $validateProcArray - contains the values defined by the option -validateProc\n+        # $typeArray         - contains the values defined by the option -type\n+        # $helpArray         - contains the values defined by the option -help\n+        #\n+        set parmArray         ${commandArg}Parms\n+        set methodArray       ${commandArg}Methods\n+        set validateArray     ${commandArg}ConfigVals\n+        set defaultArray      ${commandArg}DefaultVals\n+        set validRangeArray   ${commandArg}ValidRange\n+        set validateProcArray ${commandArg}ValidateProc\n+        set typeArray         ${commandArg}Type\n+        set helpArray         ${commandArg}Help\n+\n+        global $parmArray $methodArray $validateArray $defaultArray\n+        global $validRangeArray $validateProcArray $typeArray $helpArray\n+\n+        foreach parm $parameterArg {\n+            set ${parmArray}($parm)    $defaultValueArg\n+            set ${defaultArray}($parm) $defaultValueArg\n+        }\n+\n+        if {[info exists access] == 0} {\n+            set access rw\n+        }\n+\n+        switch $access {\n+            r {\n+                defineCommand registerMethod $commandArg cget   $parameterArg\n+            }\n+            w {\n+                defineCommand registerMethod $commandArg config $parameterArg\n+            }\n+            wr -\n+            default {\n+                defineCommand registerMethod $commandArg cget   $parameterArg\n+                defineCommand registerMethod $commandArg config $parameterArg\n+            }\n+        }\n+\n+        if {[info exists validValuesArg] && ($validValuesArg != \"\")} {\n+            foreach parm $parameterArg {\n+                set ${validateArray}($parm) $validValuesArg\n+            }\n+        }\n+\n+        if {[info exists validRangeArg]} {\n+            foreach parm $parameterArg {\n+                set ${validRangeArray}($parm) $validRangeArg\n+            }\n+        }\n+\n+        if {[info exists validateProcArg]} {\n+            foreach parm $parameterArg {\n+                set ${validateProcArray}($parm) $validateProcArg\n+            }\n+        }\n+\n+        if {[info exists typeArg]} {\n+            foreach parm $parameterArg {\n+                set ${typeArray}($parm) $typeArg\n+            }\n+        }\n+\n+        if {[info exists helpArg]} {\n+            foreach parm $parameterArg {\n+                set ${helpArray}($parm) $helpArg\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/defineTest.tcl b/dep/tclclient/ixTcl1.0/Generic/defineTest.tcl\nnew file mode 100644\nindex 00000000..bb1db43f\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/defineTest.tcl\n@@ -0,0 +1,161 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: defineTest.tcl\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+# Revision Log:\n+# 12-13-1999\tDS\tGenesis\n+#\n+# Description: This file contains the commands for all the tests. When a new test\n+# is added, create a new proc for that test here.\n+#\n+##################################################################################\n+\n+namespace eval defineTest {} \\\n+{\n+    variable defaultParms\n+    variable defaultParmType\n+    variable defaultCommands\n+\n+#   moved parameter:numtrials to proc defineTest::registerCommand.\n+#   set defaultParms(numtrials)\t\t        1\n+    set defaultParms(duration)\t\t        20\n+    set defaultParms(waitResidual)\t\t    2\n+    set defaultParms(testName) \t\t        \"\"\n+    set defaultParms(framesize)\t\t        64\n+    set defaultParms(framesizeList)\t\t    {}\n+\n+\n+#   set defaultParmType(numtrials)\t        integer\n+    set defaultParmType(duration)\t        integer\n+    set defaultParmType(waitResidual)\t    integer\n+    set defaultParmType(testName) \t        string\n+    set defaultParmType(framesize) \t        integer\n+    set defaultParmType(framesizeList)      integerList\n+\n+    set defaultCommands(config)             [array names defaultParms]\n+    set defaultCommands(cget)               [array names defaultParms]\n+    set defaultCommands(registerResultVars) {}\n+    set defaultCommands(start)              {}\n+}\n+\n+########################################################################################\n+# Procedure: initializeDefineTest\n+#\n+# Description: This command is used to initialize the defineTest commands\n+#\n+########################################################################################\n+proc initializeDefineTest {} \\\n+{\n+    defineTest::initialize\n+}\n+\n+########################################################################################\n+# Procedure: defineTest::initialize\n+#\n+# Description: This command is used to initialize the defineTest commands\n+#\n+########################################################################################\n+proc defineTest::initialize {} \\\n+{\n+    set retCode 0\n+\n+    defineCommand registerCommand defineTest\n+    defineCommand registerMethod  defineTest registerCommand\n+    defineCommand registerMethod  defineTest registerParameter\n+    defineCommand registerMethod  defineTest registerTest\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: defineTest::registerCommand\n+#\n+# Description: This command registers a new Tcl test command\n+#\n+########################################################################################\n+proc defineTest::registerCommand {testCmd} \\\n+{\n+    variable defaultParms\n+    variable defaultParmType\n+    variable defaultCommands\n+\n+    set retCode 0\n+\n+    defineCommand registerCommand $testCmd\n+\n+    # assign global parms automatically on registration\n+    foreach parm [array names defaultParms] {\n+        defineCommand registerParameter -command $testCmd -parameter $parm -defaultValue $defaultParms($parm) -type $defaultParmType($parm)\n+    }\n+\n+    defineTest registerParameter -command $testCmd -parameter numtrials      -defaultValue 1                 -type integer -validRange  {1 NULL}\n+    defineTest registerParameter -command $testCmd -parameter staggeredStart -defaultValue notStaggeredStart -type string  -validValues {staggeredStart notStaggeredStart true false}\n+    defineTest registerParameter -command $testCmd -parameter framesize      -defaultValue 64                -type integer \n+    defineTest registerParameter -command $testCmd -parameter framesizeList  -defaultValue {}                -type integerList\n+\n+    foreach method [array names defaultCommands] {\n+        defineCommand registerMethod $testCmd $method $defaultCommands($method)\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: defineTest::registerParameter\n+#\n+# Description: This command registers a new parameter for this Tcl test command\n+#\n+########################################################################################\n+proc defineTest::registerParameter {args} \\\n+{\n+    return [defineCommand registerParameter $args]\n+}\n+\n+\n+########################################################################################\n+# Procedure: defineTest::registerTest \n+#\n+# Description: This command registers a new test (start command) for this Tcl command\n+#\n+########################################################################################\n+proc defineTest::registerTest  {testCmd testSubCmd {testSubCmdParameterList \"\"}} \\\n+{\n+    return [defineCommand registerMethod $testCmd start $testSubCmd]\n+}\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/dhcpExchange.tcl b/dep/tclclient/ixTcl1.0/Generic/dhcpExchange.tcl\nnew file mode 100644\nindex 00000000..2b52ea7c\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/dhcpExchange.tcl\n@@ -0,0 +1,2605 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: dhcpExchange.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t12-02-1998\tDebby Stopp\n+#\n+# Description: This file contains procedures that send out DHCP exchange messages and\n+#   conforms to the DHCP specifications RFC 2131 and RFC 1533 with the following\n+#   exceptions:\n+#\n+#       Timers 1 & 2 not implemented in a port by port fashion\n+#       Lease expiration not handled in a port by port fashion\n+#       Release not implemented.\n+#\n+########################################################################################\n+\n+set nullIP       \"0.0.0.0\"\n+set broadcastIP  \"255.255.255.255\"\n+\n+#\n+#   Wrappers routines for dhcpClient namespace procedures\n+#\n+proc dhcpSetState               {chassis card port newState}        {dhcpClient::SetState $chassis $card $port $newState}\n+proc dhcpGetState               {chassis card port}                 {dhcpClient::GetState $chassis $card $port}\n+proc dhcpSetLease               {chassis card port lease}           {dhcpClient::SetLease $chassis $card $port $lease}\n+proc dhcpGetLease               {chassis card port}                 {dhcpClient::GetLease $chassis $card $port}\n+proc dhcpSetIP                  {chassis card port ip}              {dhcpClient::SetIP $chassis $card $port $ip}\n+proc dhcpGetIP                  {chassis card port}                 {dhcpClient::GetIP $chassis $card $port}\n+proc dhcpSetServer              {chassis card port server}          {dhcpClient::SetServer $chassis $card $port $server}\n+proc dhcpGetServer              {chassis card port}                 {dhcpClient::GetServer $chassis $card $port}\n+proc dhcpGetTimer               {timer}                             {dhcpClient::GetTimer $timer}\n+proc dhcpStartTimers            {lease {timer1 0} {timer2 0}}       {dhcpClient::StartTimers $lease $timer1 $timer2}\n+proc dhcpStartTimer             {timer lease}                       {dhcpClient::StartTimer $timer $lease}\n+proc dhcpStopTimers             {}                                  {dhcpClient::StopTimers}\n+proc dhcpStopTimer              {timer}                             {dhcpClient::StopTimer $timer}\n+proc dhcpSetStreamRegion        {region}                            {dhcpClient::SetStreamRegion $region}\n+proc dhcpGetStreamRegion        {}                                  {dhcpClient::GetStreamRegion}\n+proc dhcpSetPortList            {portList}                          {dhcpClient::SetPortList $portList}\n+proc dhcpGetPortList            {}                                  {dhcpClient::GetPortList}\n+proc dhcpStop                   {}                                  {dhcpClient::Stop}\n+proc dhcpStopPort               {chassis card port {release false}} {dhcpClient::StopPort $chassis $card $port $release}\n+proc dhcpEnableStateMachine     {{stateList dhcpClient::stateList} \\\n+                                 {eventList dhcpClient::eventList} \\\n+                                 {actionList dhcpClient::actionList}} \\\n+                                                                    {dhcpClient::Initialize $stateList $eventList $actionList}\n+proc dhcpDisableStateMachine    {{stateList dhcpClient::stateList} \\\n+                                 {eventList dhcpClient::eventList} \\\n+                                 {actionList {}}}                   {dhcpClient::Initialize $stateList $eventList $actionList}\n+\n+\n+namespace eval dhcpClient {\n+variable debugLevel\n+#set debugLevel [list default state]\n+#set debugLevel [list default]\n+set debugLevel [list]\n+#\n+#   Public Procedures:  dhcpEnableStateMachine  (dhcpClient::Initialize)\n+#                       dhcpDisableStateMachine (dhcpClient::Initialize)\n+#                       dhcpStop                (dhcpClient::Stop)\n+#                       dhcpSetState            (dhcpClient::SetState)\n+#                       dhcpGetState            (dhcpClient::GetState)\n+#                       dhcpSetLease            (dhcpClient::SetLease)   \n+#                       dhcpGetLease            (dhcpClient::GetLease)\n+#                       dhcpGetTimer            (dhcpClient::GetTimer)\n+#                       dhcpStartTimers         (dhcpClient::StartTimers)\n+#                       dhcpStartTimer          (dhcpClient::StartTimer)\n+#                       dhcpStopTimers          (dhcpClient::StopTimers)\n+#                       dhcpStopTimer           (dhcpClient::StopTimer)\n+#                       dhcpSetIP               (dhcpClient::SetIP)\n+#                       dhcpGetIP               (dhcpClient::GetIP)\n+#                       dhcpSetServer           (dhcpClient::SetServer)\n+#                       dhcpGetServer           (dhcpClient::GetServer)\n+#                       dhcpSetStreamRegion     (dhcpClient::SetStreamRegion)\n+#                       dhcpGetStreamRegion     (dhcpClient::GetStreamRegion)\n+#                       dhcpSetPortList         (dhcpClient::SetPortList)\n+#                       dhcpGetPortList         (dhcpClient::GetPortList)\n+#\t\t\t\t\t\t\t\t\t\t\t\t dhcpClient::GetStateNames\n+#\t\t\t\t\t\t\t\t\t\t\t\t dhcpClient::GetStateCodes\n+#\t\t\t\t\t\t\t\t\t\t\t\t dhcpClient::GetStateName\n+#\t\t\t\t\t\t\t\t\t\t\t\t dhcpClient::ValidState\n+#\t\t\t\t\t\t\t\t\t\t\t\t dhcpClient::GetEventCodes\n+#\t\t\t\t\t\t\t\t\t\t\t\t dhcpClient::GetEventName\n+#\t\t\t\t\t\t\t\t\t\t\t\t dhcpClient::ValidEvent\n+#\t\t\t\t\t\t\t\t\t\t\t\t dhcpClient::debug\n+\n+#\n+#   Private Procedures: dhcpClient::StateLookup\n+#                       dhcpClient::InitStateTable\n+#                       dhcpClient::ActionNull\n+#                       dhcpClient::ActionRenew\n+#                       dhcpClient::ActionRebound\n+#\n+#   Private Variables:  dhcpClient::dhcpLeaseRecord\n+#                       dhcpClient::stateList\n+#                       dhcpClient::eventList\n+#                       dhcpClient::actionList\n+#                       dhcpClient::streamRegion\n+#                       dhcpClient::portList\n+#                       \n+#\n+#   DHCP Stream Building.\n+#\n+#   When a DHCP lease needs to renew, the client must interrupt it's current\n+#       activities and send a renewal request.  This disrrupts the current\n+#       stream construct in region 0.  Rather than use region 0, DHCP streams\n+#       are constructed in region 1 and an asynchonous transmission is used for \n+#       the renewal process.\n+#\n+variable    streamRegion\n+set         streamRegionMax 7\n+set         streamRegionMin 0\n+\n+variable    portList\n+#   \n+#   DHCP timers.\n+#\n+#   Following the DHCP negotiation, the client has (hopefully) been supplied\n+#       with: IP address, lease duration, and a DHCP server ID.  Each of\n+#       these items are necessary for renewal of the IP lease.\n+#\n+#       Three time periods are associated with any given lease:\n+#           Timer1 = lease * .50\n+#           Timer2 = lease * .875\n+#           Expiration = lease\n+#\n+#       At the expiry of timer1, a dhcp Client tries to renew from current server\n+#       At the expiry of timer2, a dhcp Client tries to rebind from any server\n+#       At the expiry of lease,  a dhcp Client returns to the Init state and starts discovery.\n+#\n+#       However, IXIA is not attempting to implement a DHCP client state \n+#           machine, and simply needs the insure that a renewal or rebind \n+#           request maintains an IP address so that performance testing may \n+#           resume.  A single timer, rather than a timer for each port, initiates \n+#           the renewal process for ALL ports.\n+#\n+variable dhcpLeaseRecord\n+# dhcpLeaseRecord(timer1)       = identification of TCL timer (after), timer 1\n+# dhcpLeaseRecord(timer2)       = identification of TCL timer (after), timer 2\n+# dhcpLeaseRecord(leaseExpire)  = identification of TCL timer (after), lease expiration\n+# dhcpLeaseRecord(c,l,p,state)  = dhcp state for this port\n+# dhcpLeaseRecord(c,l,p,lease)  = duration of lease\n+# dhcpLeaseRecord(c,l,p,ip)     = leased IP address\n+# dhcpLeaseRecord(c,l,p,server) = dhcp server for leased IP address\n+#\n+#\n+#   DHCP States:    A state table allows the dhcpClient to respond to \n+#                   background events (ie timers), the following are valid states:\n+#\n+#   Valid states:\n+#       idle:       Entered after client initially boots or lease expires\n+#       select:     Entered when client broadcasts for an IP address\n+#       request:    Entered when client has accepted an IP lease offer\n+#       bound:      Entered when client & server have agreed upon lease\n+#       renew:      Entered when timer1 expires\n+#       rebind:     Entered when/if timer2 expires\n+#\n+variable state\n+set state(idle)     0\n+set state(select)   1\n+set state(request)  2\n+set state(bound)    3\n+set state(renew)    4\n+set state(rebind)   5\n+\n+#\n+#\n+#   DHCP State Table.\n+#\n+#   The table is organized by state/event.  For each state, and for each\n+#       potential event, there is a corresponding action.  If no action \n+#       is desired for a particular event, the table element should\n+#       contain a referance to the NULL routine.\n+#\n+#       Currently this table is only being used with the renew & rebind \n+#       states.\n+#\n+#       Example:    State/\n+#                   Event       Time Out            SomeEvent\n+#\n+#                   idle        dhcpActionNull      dhcpActionNull\n+#                   select      dhcpActionNull      dhcpDoSomething\n+#                   request     dhcpActionNull      dhcpDoSomething\n+#                   bound       dhcpActionRenew     dhcpDoSomething\n+#                   renew       dhcpActionRebind    dhcpDoSomething\n+#                   rebind      dhcpActionInit      dhcpDoSomething\n+#\n+#       The stateList contains a list of all known states.\n+#       The eventList contains a list of all potential events.\n+#       The actionList contains a list of all possible actions for each\n+#           state.  Note that an action *must* be listed for each event.\n+#\n+#\n+#   IXIA's DHCP Client:\n+#\n+#   This is not a true DHCP client implementation (the DHCP Client state\n+#       machine belongs in the protocol server).  IXIA requires\n+#       DHCP only for the establishment of IP address so that performance\n+#       testing may ensue.  Therefore, when timer1 expires, for any port, \n+#       the assumption is made that all port timers are about to expire and\n+#       all ports are 'renewed' at that time.\n+#\n+variable stateTable\n+variable stateList\n+set stateList [list $state(idle) $state(select) $state(request) \\\n+                    $state(bound) $state(renew) $state(rebind)]\n+#\n+# Known events\n+variable event\n+set event(timeOut)  1\n+#\n+variable eventList\n+set eventList [list $event(timeOut)]\n+#\n+# Action list by state.\n+#   The # of actions per state must equal the size of the eventList.\n+#   Set actionList [list] to disable the state machine.\n+#\n+#                         TimeOut      \n+#                         ------------ \n+variable action\n+set action(idle)    [list ActionNull  ]\n+set action(select)  [list ActionNull  ]\n+set action(request) [list ActionNull  ]\n+set action(bound)   [list ActionRenew ]\n+set action(renew)   [list ActionRebind]\n+set action(rebind)  [list ActionInit  ]\n+\n+variable actionList\n+set actionList      [list $action(idle) $action(select) $action(request) \\\n+                          $action(bound) $action(renew) $action(rebind)]  \n+\n+#   DHCP Option Parameter List.\n+#    \n+#   When the dhcp client issues a message, it has the option of specifying a \n+#       list of configuration parameters it is interested in recieving from the\n+#       dhcp server.  The parameter list must be identical in all commands, except\n+#       dhcpRelease where no parameter list is specified.  Refer to section 9.6 of\n+#       RFC 1533.\n+variable paramRequestList\n+\n+\n+#   DHCP Magic Cookie\n+#       As defined in RFC 2131 (section 3), the first 4 bytes of option data\n+#       are always the dhcp magic cookie: 99,130, 83, 99.\n+variable magicCookie\n+set magicCookie {63 82 53 63}\n+\n+#   DHCP Start Time\n+#       The time that the dhcp process was started.\n+variable startTime\n+\n+}\n+## End of DhcpClient namespace\n+\n+########################################################################################\n+# Procedure: DHCPdiscoverIP\n+#\n+# Description: This procedure uses the DHCP protocol to get an IP address for each\n+#              client\n+#\n+# Argument(s):\n+#\tPortList  list of ports, ie, ixgSortMap\n+#   startState: The state to start in, default is state(discover):\n+#               0 = discover    (issue discover message)\n+#               1 = offer       (rx offer)\n+#               2 = request     (issue request)\n+#               3 = ack         (rx ack)\n+#               4 = done        (dhcp exchange complete)\n+#\n+########################################################################################\n+proc DHCPdiscoverIP {PortList {startState 0} {stateMachine disable}} \\\n+{\n+    global dhcpAck dhcpNak dhcpOffer\n+\n+  \tupvar $PortList portList\n+\n+    set retCode 0\n+\n+    # Initialize state variables\n+    set state(discover) 0\n+    set state(offer)    1\n+    set state(request)  2\n+    set state(ack)      3\n+    set state(done)     4\n+\n+\n+    # Save the port list.\n+    set discoverList [getAllPorts portList]\n+    dhcpSetPortList  $discoverList\n+\n+    # Enable/Disable state machine for IP renewal\n+    if {$startState == $state(discover)} {\n+        if {$stateMachine == \"enable\"} {\n+            dhcpEnableStateMachine\n+        } else {\n+            dhcpDisableStateMachine\n+        }\n+    }\n+\n+    set discoverRetries 1\n+    set maxRetries      3\n+    set NAKCounter      0\n+    set currState       $startState\n+\n+    # Start DHCP State Machine.\n+    while {$currState != $state(done)} {\n+        switch $currState { \n+            0 {\n+                if [send_DHCP_discover $discoverList] {\n+                    errorMsg \"Error sending discover frames. Discover failed.\"\n+                    set currState   $state(done)\n+                    set retCode     1\n+                } else {\n+                    incr currState\n+                }\n+            }\n+\n+            1 {\n+                if [get_DHCP_offer discoverList] {\n+                    if {$discoverRetries < $maxRetries} {\n+                        incr discoverRetries\n+                        set currState   $state(discover)\n+                        errorMsg \"Discover failed on one or more ports, retrying discover $discoverRetries of $maxRetries times...\"\n+                    } else {\n+                        errorMsg \"Error receiving offer frames. Discover failed.\"\n+                        set currState   $state(done)\n+                        set retCode     1\n+                    }\n+                } else {\n+                    incr currState\n+                }\n+            }\n+\n+            2 {\n+                set requestList [getAllPorts portList]\n+                if [send_DHCP_request $requestList] {\n+                    errorMsg \"Error sending request frames. Discover/Renew failed.\"\n+                    set currState   $state(done)\n+                    set retCode     1\n+                } else {\n+                    set currState $state(ack)\n+                }\n+            }\n+\n+            3 {\n+                if [get_DHCP_ack $requestList command] {\n+                    errorMsg \"Error receiving ack frames. Discover failed.\\n\"\n+                    set currState   $state(done)\n+                    set retCode     1\n+                } else {\n+                    if {$command == $dhcpAck} {\n+                        set NAKCounter 0\n+                        set currState $state(done)\n+                    }\n+                    if {$command == $dhcpNak} {\n+                        set discoverList $requestList\n+                        incr NAKCounter \n+                        if {$NAKCounter >= 3} {\n+                            set currState $state(done)\n+                        } else {\n+                            set currState $state(discover)\n+                        }\n+                    }\n+                }\n+            }\n+\n+            default {\n+                errorMsg \"Error - invalid state $currState\"\n+                set retCode 1\n+                break\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: send_DHCP_discover\n+#\n+# Description: This command sends a DHCP discover frame (client broadcast to locate\n+#              available servers)\n+#\n+# Argument(s):\n+#   portList    list of ports to tx dhcp discover frames to\n+#\n+########################################################################################\n+proc send_DHCP_discover {portList} \\\n+{\n+    return [sendDhcpPacket $portList dhcpDiscover]\n+}\n+\n+\n+########################################################################################\n+# Procedure: get_DHCP_offer\n+#\n+# Description: This command gets a DHCP offer frame sent from the DUT\n+#\n+# Argument(s):\n+#   PortList    list of ports to tx dhcp discover frames to, removes ports from the\n+#               portList if they received an offer.\n+#\n+########################################################################################\n+proc get_DHCP_offer {PortList} \\\n+{\n+\tupvar $PortList portList\n+\n+    global dhcpOffer\n+\n+\tset retCode $::TCL_OK\n+\n+\tset wait    [learn cget -dhcpWaitTime]\n+\n+    foreach portMap [lnumsort $portList] {\n+\t\tscan $portMap \"%d %d %d\" chassis lm port\n+\n+        if  {[get_DHCP_packet $chassis $lm $port dhcpOffer $wait] == $dhcpOffer} {\n+            if [ip get $chassis $lm $port] {\n+\t\t\t\terrorMsg \"Error getting ip on port $chassis $lm $port\"\n+\t\t\t\tcontinue\n+            }\n+            ip config -sourceIpAddr     [dhcp cget -yourIpAddr]\n+\n+\t\t\tset msg\t\"DHCP Gateway\"\n+\t\t\tif {![dhcp getOption dhcpGateways]} {\n+\t\t\t    if {[dhcp cget -optionDataLength] != 4} {\n+\t\t\t\t    errorMsg \"Invalid IP address in $msg option\"\n+\t\t\t\t    continue\n+\t\t\t    }\n+\n+                ip config -destDutIpAddr  [dhcp cget -optionData]\n+\t\t\t}\n+\n+\t\t\tset msg \"DHCP Server Identifer\"\n+\t\t\tif {![dhcp getOption dhcpSvrIdentifier]} {\n+\t\t\t    if {[dhcp cget -optionDataLength] != 4} {\n+\t\t\t\t    errorMsg \"Invalid IP address in $msg option\"\n+\t\t\t\t    continue\n+\t\t\t    }\n+\n+                dhcp config -serverIpAddr   [dhcp cget -optionData]\n+                if [dhcp set $chassis $lm $port] {\n+                    errorMsg \"Error setting dhcp on port $chassis $lm $port\"\n+\t\t            continue\n+\t            }\n+            }\n+\n+            ip config -ipProtocol       udp\n+            if [ip set $chassis $lm $port] {\n+                errorMsg \"Error setting ip on port $chassis $lm $port\"\n+                continue\n+\t        }\n+\n+            set indx [lsearch $portList [list $chassis $lm $port]]\n+            if {$indx != -1} {\n+                set portList [lreplace $portList $indx $indx]\n+            }\n+            logMsg \"Got DHCP OFFER on $chassis,$lm,$port, offered IP: [dhcp cget -yourIpAddr]\"\n+        }\n+    }\n+    logMsg \"\"\n+\n+    if {[llength $portList] > 0} {\n+        set retCode $::TCL_ERROR\n+    }\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: send_DHCP_request\n+#\n+# Description: This command sends a DHCP request frame to the DUT\n+#\n+# Argument(s):\n+#   portList    list of ports to tx dhcp request frames to\n+#\n+########################################################################################\n+proc send_DHCP_request {portList} \\\n+{\n+    return [sendDhcpPacket $portList dhcpRequest]\n+}\n+\n+\n+########################################################################################\n+# Procedure: get_DHCP_ack\n+#\n+# Description: This command gets a DHCP ack frame sent from the DUT\n+#\n+# Argument(s):\n+#   portList    list of ports to tx dhcp request frames to\n+#\n+########################################################################################\n+proc get_DHCP_ack {portList command} \\\n+{\n+    global dhcpAck dhcpNak\n+\tvariable dhcpClient::state\n+\n+    upvar $command Command\n+\n+\tset retCode 0\n+\n+    ipAddressSetDefault\n+\n+    foreach portMap [lnumsort $portList] {\n+\t\tscan $portMap \"%d %d %d\" chassis lm port\n+\n+        #   Get the dhcp packet.\n+        set messageType [get_DHCP_packet $chassis $lm $port [list dhcpAck dhcpNak]]\n+        if  {$messageType != $dhcpAck && \\\n+             $messageType != $dhcpNak} {\n+            set retCode 1\n+            continue\n+        }\n+\n+\n+        # Reset the timers.\n+        dhcpStopTimer timer1\n+        dhcpStopTimer timer2\n+        dhcpStopTimer leaseExpire\n+\n+        #   Handle DHCP ACK.\n+        if {$messageType == $dhcpAck} {\n+            \n+            set Command $dhcpAck\n+\n+            #   Collect & validate the dhcp server id.\n+            if  [dhcp getOption dhcpSvrIdentifier] {\n+                errorMsg \"DHCP Server Identifier option not found in dhcpAck frame\"\n+                set retCode 1\n+                continue\n+            }\n+            set dhcpSvrIdentifier [dhcp cget -optionData]\n+            \n+            if {[dhcp cget -optionDataLength] != 4} {\n+                errorMsg \"Invalid IP address in DHCP Server ID option\"\n+                set retCode 1\n+                continue\n+            }\n+            \n+            \n+            #   Collect and validate the lease duration.\n+            if  [dhcp getOption dhcpIPAddrLeaseTime] {\n+                errorMsg \"DHCP IP Lease Duration option not found in dhcpAck frame\"\n+                set retCode 1\n+                continue\n+            }\n+            set dhcpIPAddrLeaseTime [dhcp cget -optionData]\n+\n+            set dhcpRenewalTimeValue 0\n+            if {![dhcp getOption dhcpRenewalTimeValue]} {\n+                set dhcpRenewalTimeValue [dhcp cget -optionData]\n+            }\n+            set dhcpRebindingTimeValue 0\n+            if {![dhcp getOption dhcpRebindingTimeValue]} {\n+                set dhcpRebindingTimeValue [dhcp cget -optionData]\n+            }\n+\n+            \n+            # Set IP address into ip configuration.\n+            if [ip get $chassis $lm $port] {\n+\t\t    \terrorMsg \"Error getting ip on port $chassis $lm $port\"\n+\t\t    \tset retCode 1\n+\t\t    \tcontinue\n+            }\n+            ip config -sourceIpAddr     [dhcp cget -yourIpAddr]\n+            \n+                \n+\t\t    set msg\t\"DHCP Gateway\"\n+\t\t    if {![dhcp getOption dhcpGateways]} {\n+\t\t    \tif {[dhcp cget -optionDataLength] != 4} {\n+\t\t    \t\terrorMsg \"Invalid IP address in $msg option\"\n+\t\t    \t\tset retCode 1\n+\t\t    \t\tcontinue\n+\t\t    \t}\n+            \n+                ip config -destDutIpAddr  [dhcp cget -optionData]\n+\t\t    }\n+            \n+\t\t    set msg \"DHCP Server Identifer\"\n+\t\t    if  {![dhcp getOption dhcpSvrIdentifier]} {\n+\t\t    \tif {[dhcp cget -optionDataLength] != 4} {\n+\t\t    \t\terrorMsg \"Invalid IP address in $msg option\"\n+\t\t    \t\tset retCode 1\n+\t\t    \t\tcontinue\n+\t\t    \t}\n+                set dhcpSvrIdentifier [dhcp cget -optionData]\n+                dhcp config -serverIpAddr  $dhcpSvrIdentifier\n+                if [dhcp set $chassis $lm $port] {\n+                    errorMsg \"Error setting dhcp on port $chassis $lm $port\"\n+\t\t            set retCode 1\n+\t\t            continue\n+\t            }\n+            }\n+            \n+            ip config -ipProtocol       udp\n+            if [ip set $chassis $lm $port] {\n+                errorMsg \"Error setting ip on port $chassis $lm $port\"\n+\t\t        set retCode 1\n+\t\t        continue\n+\t        }\n+            logMsg \"Got DHCP ACK on $chassis,$lm,$port, allocated IP: [ip cget -sourceIpAddr] \\\n+                    from server $dhcpSvrIdentifier\"\n+            \n+            # add the new ip address to the ipAddressTable\n+            ipAddressSetDefault\n+            if [updateIpAddressTable $chassis $lm $port] {\n+                set retCode 1\n+                continue\n+            }\n+\n+# TBD.\n+#           interfaceTable::setDefault\n+#  \t        set protocolName    [getProtocolName [protocol cget -name]]\n+#           switch $protocolName {\n+#               ip {\n+#                   set protocolList $::ipV4\n+#                   if {[interfaceTable::configurePort $chassis $lm $port $protocolList]} {\n+#                       set retCode $::TCL_ERROR\n+#                       continue\n+#                   }\n+#               }\n+#               ipV6 {\n+#                   set protocolList $::ipV6                \n+#                   if {[interfaceTable::configurePort $chassis $lm $port $protocolList]} {\n+#                       set retCode $::TCL_ERROR\n+#                       continue\n+#                   }\n+#               }\n+#            }\n+#            \n+            #   \n+            #   This could be a renewal of this IP address, if so, it will\n+            #       already have a lease record with timers running.  Stop any\n+            #       associated timers.\n+            #\n+            \n+               \n+            #   Create/Update dhcpLeaseRecord and start lease timers.\n+            dhcpSetIP       $chassis $lm $port [dhcp cget -yourIpAddr]\n+            dhcpSetServer   $chassis $lm $port $dhcpSvrIdentifier\n+            dhcpSetLease    $chassis $lm $port $dhcpIPAddrLeaseTime\n+            dhcpSetState    $chassis $lm $port $dhcpClient::state(bound)\n+\n+        }\n+\n+        # Handle dhcpNAK.\n+        if {$messageType == $dhcpNak} {\n+            set dhcpError \"\"\n+            if ![dhcp getOption dhcpMessage] {\n+                set dhcpError [dhcp cget -optionData]\n+            }\n+            logMsg \"Got DHCP NAK on $chassis,$lm,$port, allocated. $dhcpError\"\n+\n+            dhcpStopPort $chassis $lm $port\n+            set Command $dhcpNak\n+        }\n+    }\n+\n+    if {$messageType == $dhcpAck} {\n+        dhcpStartTimers \\\n+            $dhcpIPAddrLeaseTime $dhcpRenewalTimeValue $dhcpRebindingTimeValue \n+    }\n+        \n+\n+    logMsg \"\"\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: send_DHCP_release\n+#\n+# Description: Given a portMap, sends a dhcpRelease to the DUT.\n+#\n+# Argument(s):\n+#   chassis\n+#   lm\n+#   port\n+#\n+# Output:       retCode     : 0 if okay, else\n+#                             1 if failure\n+#\n+########################################################################################\n+proc send_DHCP_release {portList} \\\n+{\n+    set retCode     [sendDhcpPacket $portList dhcpRelease]\n+\n+    return $retCode\n+}\n+\n+\n+\n+########################################################################################\n+############                    DHCP Utility Procedures                      ###########\n+########################################################################################\n+\n+\n+########################################################################################\n+# Procedure: setupUDPbootp\n+#\n+# Description: This procedure sets up the UDP bootp ports\n+#\n+# Argument(s):\n+#\tchassis\n+#   lm\n+#   port\n+#\n+########################################################################################\n+proc setupUDPbootp {chassis lm port} \\\n+{\n+    set retCode 0\n+\n+    udp setDefault\n+    udp config -sourcePort  bootpClientPort\n+    udp config -destPort    bootpServerPort\n+    if [udp set $chassis $lm $port] {\n+        errorMsg \"Error setting udp on port $chassis $lm $port\"\n+\t    set retCode 1\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: setupDhcpBroadcastIP\n+#\n+# Description: This procedure sets up broadcast IP addr for destination & null IP for \n+#              source (don't know what our IP address is at this point).\n+#\n+# Argument(s):\n+#\tchassis\n+#   lm\n+#   port\n+#   address     : defaults to broadcast,\n+#\n+########################################################################################\n+proc setupDhcpBroadcastIP {chassis lm port} \\\n+{\n+    global nullIP\n+    global broadcastIP\n+\n+    set retCode 0\n+\n+    #ip setDefault\n+    if [ip get $chassis $lm $port] {\n+\t\terrorMsg \"Error getting ip on port $chassis $lm $port\"\n+\t\tset retCode 1\n+    }\n+    ip config -sourceIpAddr $nullIP\n+    ip config -destIpAddr   $broadcastIP\n+    ip config -ipProtocol   udp\n+    ip config -ttl          128\n+    ip config -identifier   512\n+    if [ip set $chassis $lm $port] {\n+        errorMsg \"Error setting ip on port $chassis $lm $port\"\n+\t\tset retCode 1\n+\t}\n+\n+    return $retCode\n+}\n+\n+########################################################################################\n+# Procedure: setupDhcpUnicastIP\n+#\n+# Description: This procedure sets up a unicast IP addr for destination\n+#\n+# Argument(s):\n+#\tchassis\n+#   lm\n+#   port\n+#   sourceIpAddr:   source Ip Address\n+#   destIpAddr:     destination Ip Address\n+#\n+########################################################################################\n+proc setupDhcpUnicastIP {chassis lm port sourceIpAddr destIpAddr} \\\n+{\n+\n+    set retCode 0\n+\n+    #ip setDefault\n+    if [ip get $chassis $lm $port] {\n+\t\terrorMsg \"Error getting ip on port $chassis $lm $port\"\n+\t\tset retCode 1\n+    }\n+    ip config -sourceIpAddr $sourceIpAddr\n+    ip config -destIpAddr   $destIpAddr\n+    ip config -ipProtocol   udp\n+    ip config -ttl          128\n+    ip config -identifier   512\n+    if [ip set $chassis $lm $port] {\n+        errorMsg \"Error setting ip on port $chassis $lm $port\"\n+\t\tset retCode 1\n+\t}\n+\n+    return $retCode\n+}\n+\n+\n+\n+\n+########################################################################################\n+# Procedure: setupDefaultDhcpParameters\n+#\n+# Description: This procedure sets up the default DHCP parameters for discover & request\n+#\n+# Argument(s):\n+#\tchassis\n+#   lm\n+#   port\n+#   transactionID   - transaction ID\n+#   txSA            - mac address of the chassis lm port\n+#\n+########################################################################################\n+proc setupDefaultDhcpParameters {chassis lm port transactionID txSA {clientIpAddr \"0.0.0.0\"}} \\\n+{\n+    global nullIP\n+\n+    dhcp setDefault\n+    dhcp config -opCode           $::dhcpBootRequest\n+    dhcp config -clientIpAddr     $clientIpAddr\n+    dhcp config -yourIpAddr       $nullIP\n+    dhcp config -serverIpAddr     $nullIP\n+    dhcp config -relayAgentIpAddr $nullIP\n+    dhcp config -clientHwAddr     $txSA\n+    dhcp config -transactionID    $transactionID\n+    dhcp config -seconds          [dhcpClient::getStartTime]\n+}    \n+\n+\n+########################################################################################\n+# Procedure: setDhcpOptions\n+#\n+# Description: This procedure sets the options specified in the optionList\n+#\n+# Argument(s):\n+#   OptionList  - list of options & data to set using dhcp setOption; data must be in\n+#                 in the appropriate byte format before passing through to this proc\n+#\n+########################################################################################\n+proc setDhcpOptions {OptionList} \\\n+{\n+\tupvar $OptionList optionList\n+    set retCode 0\n+\n+    # make sure there's an 'end' at the back end of each set of options\n+    lappend optionList dhcpEnd dhcpEnd\n+\n+    foreach {option data} $optionList {\n+        dhcp config -optionData       $data\n+        if [dhcp setOption $option] {\n+            errorMsg \"Error setting DHCP option <$option>\"\n+            set retCode 1\n+            continue\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: sendDhcpPacket\n+#\n+# Description: This procedure sends a Dhcp packet to each Tx port in the map\n+#\n+# Argument(s):  portList:   list of ports to send DHCP packets: {{c l p} {c l p}}\n+#               opcode:     operation to perform:   dhcpDiscover\n+#                                                   dhcpRequest\n+#                                                   dhcpRelease\n+#\n+# Returns:      0 if successful, else\n+#               1 if failure\n+#\n+########################################################################################\n+proc sendDhcpPacket {portList opcode} \\\n+{\n+    set retCode     0\n+\n+    # save original protocol config\n+    set tempApp     [protocol cget -appName]\n+    set tempName    [protocol cget -name]\n+    protocol config -appName    Dhcp\n+    protocol config -name       ip\n+\n+    foreach portMap [lnumsort $portList] {\n+\t\tscan $portMap \"%d %d %d\" c l p\n+\n+        # Temporary workaround (DHCP was consumed by Protocol Server)\n+        if [protocolServer get $c $l $p] {\n+            errorMsg \"Error getting protocolServer on port [getPortId $c $l $p]\"\n+            set retCode 1\n+            continue\n+        }\n+\n+        set enableArp   [protocolServer cget -enableArpResponse]\n+        if {$enableArp} {\n+            protocolServer config -enableArpResponse    false\n+            if [protocolServer set $c $l $p] {\n+                errorMsg \"Error setting protocolServer on port [getPortId $c $l $p]\"\n+                set retCode 1\n+            }\n+        }\n+\n+        if [buildDhcpPacket $c $l $p $opcode] {\n+            errorMsg \"Error building dhcp packet for port [getPortId $c $l $p]\"\n+            set retCode 1\n+            continue\n+        }\n+    }\n+\n+    # now put back original protocol config\n+    protocol config -appName    $tempApp\n+    protocol config -name       $tempName\n+\n+    # if this port was *ever* in packetGroup mode, change it or we won't be able to capture... \n+    if [setCaptureMode portList write] {\n+\t\treturn -code error\n+    }\n+\n+    if {![writeConfigToHardware portList] && ![zeroStats portList] && ![startCapture portList]} {\n+        logMsg \"\"\n+        foreach portMap [lnumsort $portList] {\n+\t\t    scan $portMap \"%d %d %d\" c l p\n+\n+\t        logMsg \"----->Sending $opcode frame from [getPortId $c $l $p] to DHCP server.\"\n+\n+\t        if [startPortTx $c $l $p] {\n+\t\t        errorMsg \"Error starting Tx on port [getPortId $c $l $p]\"\n+\t\t        set retCode 1\n+\t        }\n+        }\n+        logMsg \"\"\n+        if {[learn cget -waitTime] > 1000} {\n+            logMsg \"Waiting on DHCP response for [expr [learn cget -waitTime]/1000] second(s)...\"\n+        }\n+\t    after [learn cget -waitTime]\n+\n+    } else {\n+        set retCode 1\n+    }\n+\n+    # Temporary workaround (DHCP was consumed by Protocol Server)\n+    # If arp was enabled in the first place, reenable it here...\n+    if {$enableArp} {\n+        foreach portMap [lnumsort $portList] {\n+\t\t    scan $portMap \"%d %d %d\" c l p\n+\n+            if [protocolServer get $c $l $p] {\n+                errorMsg \"Error getting protocolServer on port [getPortId $c $l $p]\"\n+                set retCode 1\n+                continue\n+            }\n+\n+            protocolServer config -enableArpResponse    true\n+            if [protocolServer set $c $l $p] {\n+                errorMsg \"Error setting protocolServer on port [getPortId $c $l $p]\"\n+                set retCode 1\n+            }\n+        }\n+    }\n+       \n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: buildDhcpPacket\n+#\n+# Description: This procedure builds a Dhcp packet\n+#\n+# Argument(s):\n+#\tchassis\n+#   lm\n+#   port\n+#   opcode      opcode, ie, dhcpDiscover, dhcpRequest, dhcpRelease\n+#            } else if {$state == $dhcpClient::state(rebind)} {\n+#            if {$state == $dhcpClient::state(renew)} {\n+#\n+########################################################################################\n+proc buildDhcpPacket {chassis lm port opcode} \\\n+{\n+\n+    global nullIP broadcastIP \n+    variable dhcpClient::state\n+\n+\tset retCode 0\n+\n+    set clientIpAddr $nullIP\n+    set txAddress    $nullIP\n+\n+    set ethernetType [protocol cget -ethernetType]\n+    protocol config -ethernetType $::noType\n+\n+    set destMacAddress $::kBroadcastMacAddress\n+\n+    udf setDefault\n+    dhcp setDefault\n+    filter setDefault\n+    stream setDefault\n+    filterPallette setDefault\n+\n+    dhcpSetStreamRegion 0\n+\n+    # delete any existing streams first\n+    if [port reset $chassis $lm $port] {\n+        errorMsg \"Error deleting streams on port $chassis $lm $port\"\n+        set retCode 1\n+    }\n+\n+\t# set the stream parameters.\n+\tset preambleSize\t\t8\n+\tset framesize\t\t\t[learn cget -framesize]\n+\n+\tset streamName          $opcode\n+    append streamName \"Stream\"\n+\n+    disableUdfs {1 2 3 4}\n+\n+    stream config -region    [dhcpGetStreamRegion]\n+    stream config -rateMode  usePercentRate\n+    stream config -name\t\t $streamName\n+\tstream config -framesize $framesize\n+\tstream config -dma\t\t stopStream\n+\tstream config -numFrames [learn cget -numDHCPframes]\n+\tstream config -fcs\t\t good\n+    stream config -enableIbg false\n+    stream config -enableIsg false\n+    stream config -gapUnit   gapNanoSeconds\n+\n+\tfilter config -captureFilterError   errGoodFrame\n+\tfilter config -captureTriggerError  errGoodFrame\n+\n+\tif [port get $chassis $lm $port] {\n+\t\terrorMsg \"port $chassis $lm $port has not been configured yet\"\n+\t\tset retCode 1\n+\t}\n+\n+\tset txSA\t        [port cget -MacAddress]\n+    set transactionID   [dhcpClient::getTransactionID $port]\n+\n+    set optionList      [list dhcpHostName [format \"IxiaHost_%u.%u.%u\" $chassis $lm $port]]\n+\n+\n+    switch $opcode {\n+        dhcpDiscover {\n+#            set txAddress       $broadcastIP\n+            lappend optionList  dhcpMessageType dhcpDiscover \\\n+                                dhcpClientId $txSA \\\n+                                dhcpParamRequestList [dhcpClient::getParameterRequestList]\n+\n+\n+\t\t\t# Capture Boot Replies with the dhcpMagicCookie\n+#\t\t\tfilter config -captureTriggerPattern pattern1\n+#\t\t\tfilter config -captureFilterPattern  pattern1\n+#\t\t\tfilterPallette config -pattern1 [dhcpClient::getMagicCookie]\n+#\t\t\tfilterPallette config -patternOffset1 {278}\n+\n+\t\t\tfilter config -captureTriggerPattern pattern1AndPattern2\n+\t\t\tfilter config -captureFilterPattern  pattern1AndPattern2\n+\t\t\tfilterPallette config -pattern1 [format \"%02x\" $::dhcpBootReply]\n+\t\t\tfilterPallette config -pattern2 [dhcpClient::getMagicCookie]\n+\t\t\tfilterPallette config -patternOffset1 {42}\n+\t\t\tfilterPallette config -patternOffset2 {278}\n+\n+\t\t\tif [filterPallette set $chassis $lm $port] {\n+\t\t\t\terrorMsg \"Error setting filter pallette on $chassis,$lm,$port\"\n+\t\t\t}\n+        }\n+\n+        dhcpRequest {\n+            if [ip get $chassis $lm $port] {\n+\t\t        errorMsg \"port $chassis $lm $port has not been configured for IP yet\"\n+\t\t        set retCode 1\n+\t        }\n+            set txIP    [ip cget -sourceIpAddr]\n+\n+            # we need to use the same transaction ID for the complete dhcp transaction... if we don't have a dhcp object \n+            # for this port yet, setup a transaction ID for it using a random number, otherwise use the existing transactionID\n+            # in the dhcp object.\n+            if [dhcp get $chassis $lm $port] {\n+\t\t        errorMsg \"Error getting dhcp configuration for port $chassis $lm $port\"\n+\t\t        set retCode 1\n+            } else {\n+                set transactionID   [dhcp cget -transactionID]\n+            }\n+\n+            #\n+            #   Build option list based upon state (these are \n+            #       common to all dhcpRequest messages).\n+            #\n+            lappend optionList  dhcpMessageType dhcpRequest \\\n+                                dhcpParamRequestList [dhcpClient::getParameterRequestList]\n+\n+                                  \n+            set portState [dhcpGetState $chassis $lm $port]\n+            if ![dhcpClient::ValidState $portState] {\n+                set portState 0\n+            }\n+\n+            switch [dhcpClient::GetStateName $portState] {\n+\n+                renew {\n+\n+                    #         \n+                    #   For state Renew, the following are required:\n+                    #       - Server Id is not set\n+                    #       - Requested IP is not set\n+                    #       - ciaddr is set to Client's IP address\n+                    #       - giaddr (dhcpRouter) is not set\n+                    #         \n+                    set clientIpAddr [dhcpGetIP $chassis $lm $port]\n+                    set txAddress  [dhcp cget -serverIpAddr]\n+                    set destMacAddress [port cget -DestMacAddress]\n+\n+                    lappend optionList dhcpClientId $txSA \n+                }\n+                \n+                \n+                rebind {\n+                    #         \n+                    #   For state Rebind, the following are required:\n+                    #       - Server Id is not set\n+                    #       - Requested IP is not set\n+                    #       - ciaddr is set to Client's IP address\n+                    #         \n+                    set clientIpAddr    [dhcpGetIP $chassis $lm $port]\n+                    lappend optionList  dhcpClientId $txSA \\\n+                                        dhcpRouter [ip cget -destDutIpAddr] \\\n+                                        dhcpSvrIdentifier $nullIP \\\n+                                        dhcpRequestedIPAddr $nullIP \n+                \n+                }\n+                \n+                default {\n+                    #         \n+                    #   For states Select, the following are required:\n+                    #       - Server Id is set to address supplied in offer\n+                    #       - Requested IP is set to address supplied in offer\n+                    #       - ciaddr is not set\n+                    #       - giaddr is set to relay agent\n+                    #         \n+                    lappend optionList  dhcpClientId $txSA \\\n+                                        dhcpRequestedIPAddr $txIP \\\n+                                        dhcpRouter [ip cget -destDutIpAddr] \\\n+                                        dhcpSvrIdentifier [dhcp cget -serverIpAddr]\n+                }\n+            }\n+\t\t\t# Capture Boot Replies\n+\t\t\tfilter config -captureTriggerPattern pattern1\n+\t\t\tfilter config -captureFilterPattern  pattern1\n+\t\t\tfilterPallette config -pattern1 [format \"%02x\" $::dhcpBootReply]\n+\t\t\tfilterPallette config -patternOffset1 {42}\n+\n+\t\t\tif [filterPallette set $chassis $lm $port] {\n+\t\t\t\terrorMsg \"Error setting filter pallette on $chassis,$lm,$port\"\n+\t\t\t}\n+\n+        }\n+        dhcpRelease {\n+\n+            # Collect the IP configuration on this port.\n+            if [ip get $chassis $lm $port] {\n+\t\t        errorMsg \"port $chassis $lm $port has not been configured for IP yet\"\n+\t\t        set retCode 1\n+\t        }\n+            set txIP    [ip cget -sourceIpAddr]\n+            # Collect the current DHCP configuration on this port.\n+            if [dhcp get $chassis $lm $port] {\n+\t\t        errorMsg \"Error getting dhcp configuration for port $chassis $lm $port\"\n+\t\t        set retCode 1\n+            }\n+\n+\n+            # Build DHCP packet.\n+            set clientIpAddr    [dhcpGetIP $chassis $lm $port]\n+            set serverIpAddr    [dhcp cget -serverIpAddr]\n+            set txAddress       $serverIpAddr\n+            set destMacAddress  [port cget -DestMacAddress]\n+\n+\n+\n+            lappend optionList  dhcpMessageType dhcpRelease \\\n+                                dhcpClientId $txSA \\\n+                                dhcpSvrIdentifier $serverIpAddr\n+        }                                 \n+        default {\n+            errorMsg \"Unsupported packet type\"\n+            return 1\n+        }\n+    }\n+\n+    if {$txAddress != $nullIP} {\n+        setupDhcpUnicastIP $chassis $lm $port $txIP $txAddress\n+    } else {\n+        setupDhcpBroadcastIP $chassis $lm $port\n+    }\n+\n+    setupUDPbootp $chassis $lm $port\n+    setupDefaultDhcpParameters $chassis $lm $port $transactionID $txSA $clientIpAddr\n+\n+    setDhcpOptions optionList\n+\n+    if [dhcp set $chassis $lm $port] {\n+        errorMsg \"Error setting DHCP on port $chassis $lm $port\"\n+        set retCode 1\n+    }\n+\n+\tset speed\t[port cget -speed]\n+    \n+\tstream config -da\t\t$destMacAddress\n+\tstream config -numDA\t1\n+\n+  \tstream config -sa\t\t$txSA\n+\tstream config -numSA\t1\n+\n+    stream config -frameSizeType    sizeAuto\n+\tif [stream set $chassis $lm $port 1] {\n+\t\terrorMsg \"Error setting stream 1, port $chassis,$lm,$port for $opcode frames\"\n+\t\tset retCode 1\n+\t}\n+\n+    # since we set this for autoframe size calc, get the calculated framesize to use\n+    # in calculating the IFG.\n+    set framesize [stream cget -framesize]\n+    set learnPercentRate             [expr double([learn cget -rate])/[calculateMaxRate $chassis $lm $port $framesize]*100.]\n+    stream config -percentPacketRate $learnPercentRate\n+\n+\tif [stream set $chassis $lm $port 1] {\n+\t\terrorMsg \"Error setting stream 1, port $chassis,$lm,$port for $opcode frames\"\n+\t\tset retCode 1\n+\t}\n+\n+\t# set the filter parameters for receiving the DHCP response\n+    filter config -captureTriggerDA         any\n+    filter config -captureFilterDA          any\n+\tfilter config -captureFilterEnable\t\ttrue\n+\tfilter config -captureTriggerEnable\t\ttrue\n+\tif [filter set $chassis $lm $port] {\n+\t\terrorMsg \"Error setting filters on $chassis,$lm,$port\"\n+\t\tset retCode 1\n+\t}\n+\n+    protocol config -ethernetType $ethernetType\n+\n+    return $retCode\n+}\n+\n+\n+\n+########################################################################################\n+# Procedure: get_DHCP_packet\n+#\n+# Description: This command gets a DHCP packet sent from the DUT & fills the dhcp command\n+#              memory using dhcp decode $packet\n+#\n+# Argument(s):\n+#\tchassis\n+#   lm\n+#   port\n+#   messageType -   name of DHCP message type to search.  Note that this can be a list\n+#                   of message types, ie [list dhcpAck dhcpNak]\n+#\n+#   Output:         First message type (of messageType list) found in buffer:\n+#                       0 if no match, else\n+#                       dhcpMessageType (as defined in Dhcp.hpp)\n+#\n+########################################################################################\n+proc get_DHCP_packet {chassis lm port messageType {wait 0}} \\\n+{\n+    set retCode 0\n+\n+\t# Wait till data in capture buffer, or timer expires.\n+\tset expire [expr [clock seconds] + $wait]\n+\twhile {$expire > [clock seconds]} {\n+\t\tif {![stat get statCaptureFilter $chassis $lm $port]} {\n+\t\t    if {[stat cget -counterVal] > 0} {\n+\t\t       break\n+\t\t    }\n+\t    }\n+\t}\n+\n+    # make sure there's something there to look at first!\n+    if {[captureBuffer get $chassis $lm $port 1 1000]} {\n+\t\terrorMsg \"Error getting capture data on $chassis,$lm,$port\"\n+\t\treturn 0\n+\t}\n+\n+    # You have to have the transactionID before we can process any further...\n+    if [dhcp get $chassis $lm $port] {\n+        errorMsg \"Error getting DHCP on port $chassis $lm $port\"\n+        return 0\n+    }\n+    set transactionID   [dhcp cget -transactionID]\n+\n+\tset found 0\n+    set nPackets [captureBuffer cget -numFrames]\n+\tfor {set nFrame 1} {$nFrame <= $nPackets} {incr nFrame} {\n+\t\tif [captureBuffer getframe $nFrame] {\n+\t\t\terrorMsg \"Error getting frame $nFrame from capture buffer for $chassis,$lm,$port\"\n+\t\t\tcontinue\n+\t\t}\n+\t\tset capframe\t[captureBuffer cget -frame]\n+        if [dhcp decode $capframe $chassis $lm $port] {\n+            continue\n+        }\n+\n+\t\t# What is the message type?\n+        if {![dhcp getOption dhcpMessageType]} {\n+            set dhcpMessageType [dhcp cget -optionData]\n+        }\n+\n+        #   The transaction ID must match.\n+        if {[dhcp cget -transactionID] == $transactionID} {\n+\n+            # The message type must match one in the list of message types.\n+            foreach item $messageType {\n+                global $item\n+                upvar $item MessageType\n+                if {$dhcpMessageType == $MessageType} {\n+\t\t\t        set found 1\n+                    set retCode $MessageType\n+\t\t\t        break\n+                }\n+            }\n+        }\n+        # Break out of packet search loop.\n+        if $found {\n+            break\n+        }\n+\n+\t}\n+\n+\tif {$found == 0} {\n+\t\tlogMsg \"No $messageType frames received on $chassis $lm $port\"\n+\t} else {\n+        set destinationAddr [lrange $capframe 6 11]        \n+\t\tif [port get $chassis $lm $port] {\n+\t\t\terrorMsg \"Error getting port $chassis,$lm,$port\"\n+\t\t\tset retCode 0\n+\t\t}\n+\t\tport config -DestMacAddress\t$destinationAddr\n+\t\tif [port set $chassis $lm $port] {\n+\t\t\terrorMsg \"Error setting port on $chassis,$lm,$port\"\n+\t\t\tset retCode 0\n+\t\t}\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+\n+########################################################################################\n+# Procedure:    dhcpInitialize\n+#\n+# Description:  Setup dhcpClient initial settings.\n+#\n+# Input:        eventList: list of potential events\n+#               stateList: list of all known states\n+#               actionList: list of list of actions per state per event (can be an\n+#                   empty list if state machine is to be disabled.\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::Initialize {   {stateList dhcpClient::stateList} \\\n+                                {eventList dhcpClient::eventList} \\\n+                                {actionList dhcpClient::actionList}} \\\n+{\n+\tdebug\n+    variable dhcpLeaseRecord\n+\n+    if [info exists dhcpLeaseRecord] {\n+        unset dhcpLeaseRecord\n+    }\n+\n+    # Initialize state table.\n+    InitStateTable $stateList $eventList $actionList\n+\n+    # Set default stream region.\n+    SetStreamRegion 0\n+\n+    # Create the default parameter request list used by dhcpDiscover & dhcpRequest.\n+    clearParameterRequestList\n+    setParameterRequestList dhcpSubnetMask\n+    setParameterRequestList dhcpDomainName\n+    setParameterRequestList dhcpGateways\n+    setParameterRequestList dhcpNetBIOSNameSvr\n+    setParameterRequestList dhcpNetBIOSNodeType\n+    setParameterRequestList dhcpNetBIOSScope\n+    setParameterRequestList dhcpDomainNameServer\n+\n+    # Record dhcp start-time.\n+    setStartTime [clock seconds]\n+\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpStop\n+#\n+# Description:  Cancel any outstanding timers, remove dhcpLeaseRecord, release all\n+#               IP addresses that are currently leased.\n+#\n+# Input:        None\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::Stop {} \\\n+{\n+\tdebug \n+    variable dhcpLeaseRecord\n+\n+    foreach port [GetPortList] {\n+        scan $port \"%d %d %d\" c l p\n+        StopPort $c $l $p true\n+    }\n+    SetPortList {}\n+    catch {unset dhcpLeaseRecord}\n+\n+    StopTimer timer1\n+    StopTimer timer2\n+    StopTimer leaseExpire\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpStopPort\n+#\n+# Description:  Release IP address, unset dhcpLeaseRecord for a single port.\n+#\n+# Input:        chassis\n+#               card\n+#               port\n+#               release:    true if IP address should be released, default is false\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::StopPort {chassis card port {release false}} \\\n+{\n+\tdebug\n+    variable dhcpLeaseRecord\n+\n+    if {$release == \"true\"} {\n+        set portList [list [list $chassis $card $port]]\n+        send_DHCP_release $portList\n+    }\n+\n+    catch {unset dhcpLeaseRecord($chassis,$card,$port,ip)}\n+    catch {unset dhcpLeaseRecord($chassis,$card,$port,server)}\n+    catch {unset dhcpLeaseRecord($chassis,$card,$port,lease)}\n+    catch {unset dhcpLeaseRecord($chassis,$card,$port,state)}\n+\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpSetState\n+#\n+# Description:  Store the current state of dhcp process.\n+#\n+# Input:        chassis-card-port\n+#               state: discover, offer, request, ack, bound, renew, rebind, idle\n+#\n+# Output:       0, success, else\n+#               1, failure (invalid state) \n+#\n+########################################################################################\n+proc dhcpClient::SetState {chassis card port newState} \\\n+{\n+\n+\tdebug\n+\n+    variable dhcpLeaseRecord\n+\n+    # Valid state?\n+\tif ![ValidState $newState] {\n+        return 1\n+    }\n+            \n+    set dhcpLeaseRecord($chassis,$card,$port,state) $newState\n+\n+    return 0\n+}\n+\n+\n+########################################################################################\n+# Procedure:    dhcpGetState\n+#\n+# Description:  Get the current state for the given port.\n+#\n+# Input:        chassis\n+#               card:\n+#               port:\n+#               lease:  duration of lease\n+#\n+# Output:       state (possible states are: idle, discover, offer, request, ack,\n+#                   done, renew, rebind)\n+#\n+########################################################################################\n+proc dhcpClient::GetState {chassis card port} \\\n+{\n+    variable dhcpLeaseRecord\n+\n+    if [info exists dhcpLeaseRecord($chassis,$card,$port,state)] {\n+        return $dhcpLeaseRecord($chassis,$card,$port,state)\n+    }\n+\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpSetLease\n+#\n+# Description:  Set the DHCP lease.\n+#\n+# Input:        chassis\n+#               card:\n+#               port:\n+#               lease:  duration of lease\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::SetLease {chassis card port lease} \\\n+{\n+\tdebug\n+    variable dhcpLeaseRecord\n+\n+    #   Store the lease\n+    set dhcpLeaseRecord($chassis,$card,$port,lease) $lease\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpGetLease\n+#\n+# Description:  Return the value of the lease for a given port\n+#\n+# Input:        chassis\n+#               card:\n+#               port:\n+#\n+# Output:       lease\n+#\n+########################################################################################\n+proc dhcpClient::GetLease {chassis card port} \\\n+{\n+\tdebug\n+    variable dhcpLeaseRecord\n+\n+    if [info exists dhcpLeaseRecord($chassis,$card,$port,lease)] {\n+        return $dhcpLeaseRecord($chassis,$card,$port,lease)\n+    }\n+\n+}\n+\n+\n+########################################################################################\n+# Procedure:    dhcpStartTimers\n+#\n+# Description:  Start DHCP timers.\n+#\n+# Input:        lease:  duration of lease\n+#\n+# Output:       0 if successful, else\n+#               1\n+#\n+########################################################################################\n+proc dhcpClient::StartTimers {lease {timer1 0 } {timer2 0}} \\\n+{\n+\tdebug\n+    variable dhcpLeaseRecord\n+\n+    set returnCode 0\n+\n+    # If timers already running, don't restart.        \n+    if [info exist dhcpLeaseRecord(timer1)] {\n+        if {$dhcpLeaseRecord(timer1) != \"\"} {\n+            return 1\n+        }\n+    }\n+\n+    # Start timer 1\n+    if [StartTimer timer1 $lease $timer1] {\n+        set returnCode 1\n+    }\n+\n+    # Start timer 2\n+    if [StartTimer timer2 $lease $timer2] {\n+        set returnCode 1\n+    }\n+\n+    # Start lease timer\n+    if [StartTimer leaseExpire $lease] {\n+        set returnCode 1\n+    }\n+\n+\n+    return $returnCode  \n+}\n+\n+\n+########################################################################################\n+# Procedure:    dhcpStopTimers\n+#\n+# Description:  Stop DHCP timers.\n+#\n+# Input:        lease:  duration of lease\n+#\n+# Output:       0 if successful, else\n+#               1\n+#\n+########################################################################################\n+proc dhcpClient::StopTimers {} \\\n+{\n+\tdebug\n+    set returnCode 0\n+\n+    # Stop timer 1\n+    if [StopTimer timer1] {\n+        set returnCode 1\n+    }\n+\n+    # Stop timer 2\n+    if [StopTimer timer2] {\n+        set returnCode 1\n+    }\n+\n+    # Stop lease timer\n+    if [StopTimer leaseExpire] {\n+        set returnCode 1\n+    }\n+\n+    return $returnCode\n+}\n+\n+\n+########################################################################################\n+# Procedure:    dhcpStartTimer\n+#\n+# Description:  Initiate DHCP timers based upon the value supplied by the server.\n+#                   TIMER 1 will expire at (lease * .50)\n+#                   TIMER 2 will expire at (lease * .875)\n+#\n+# Input:        timer:  timer1, timer2 or leaseExpire\n+#\n+# Output:       0 if successful, else\n+#               1\n+#\n+########################################################################################\n+proc dhcpClient::StartTimer {timer lease {value 0}} \\\n+{\n+\tdebug\n+    variable dhcpLeaseRecord\n+    variable event\n+\n+    # Initiate timers\n+    switch $timer {\n+\n+        timer1 {\n+            if $value {\n+                set timerValue $value\n+            } else {\n+                set timerValue [expr round([mpexpr $lease * .50])]\n+            }\n+        }\n+\n+        timer2 {\n+            if $value {\n+                set timerValue $value\n+            } else {\n+                set timerValue [expr round([mpexpr $lease * .875])]\n+            }\n+        }\n+\n+        leaseExpire {\n+            set timerValue $lease\n+        }\n+\n+        default {\n+            return 1\n+        }\n+\n+    }\n+\n+    # Start the timer, set the timer Id into the lease record.\n+    set portList [lindex [GetPortList] 0]\n+    scan $portList \"%d %d %d\" c l p\n+    set dhcpLeaseRecord($timer) \\\n+        [after [expr 1000 * $timerValue] \\\n+        [namespace current]::StateLookup $c $l $p $event(timeOut)]\n+\n+\n+    return 0\n+        \n+}\n+\n+########################################################################################\n+# Procedure:    dhcpStopTimer\n+#\n+# Description:  Cancels a given DHCP timer for a given port.\n+#\n+# Input:        timer:  timer1, timer2 or leaseExpire\n+#\n+#\n+# Output:       0 if successful, else\n+#               1\n+#\n+########################################################################################\n+proc dhcpClient::StopTimer {timer} \\\n+{\n+\tdebug\n+    variable dhcpLeaseRecord\n+\n+    switch $timer {\n+\n+        timer1 -\n+        timer2 -\n+        leaseExpire {\n+            if {[dhcpGetTimer $timer] != \"\"} {\n+                after cancel [dhcpGetTimer $timer]\n+                set dhcpLeaseRecord($timer) \"\"\n+            }\n+        }\n+\n+        default {\n+            return 1\n+        }\n+    }\n+\n+    return 0\n+        \n+}\n+\n+\n+########################################################################################\n+# Procedure:    dhcpGetTimer\n+#\n+# Description:  Return the value of the timer id for a given port\n+#\n+# Input:        timer:  timer1, timer2 or leaseExpire\n+#\n+# Output:       timer Id \n+#\n+########################################################################################\n+proc dhcpClient::GetTimer {timer} \\\n+{\n+\tdebug\n+    variable dhcpLeaseRecord\n+    set returnValue 0\n+\n+    switch $timer {\n+\n+        timer1 -\n+        timer2 -\n+        leaseExpire {\n+            if [info exists dhcpLeaseRecord($timer)] {\n+                set returnValue $dhcpLeaseRecord($timer)\n+            }\n+        }\n+\n+        default {\n+            set returnValue 0\n+        }\n+    }\n+\n+    return $returnValue\n+\n+}\n+\n+\n+########################################################################################\n+# Procedure:    dhcpSetIP\n+#\n+# Description:  Set the DHCP IP address as offered by the dhcp server for a given\n+#                   port.\n+#\n+# Input:        chassis\n+#               card:\n+#               port:\n+#               ip:     IP address\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::SetIP {chassis card port ip} \\\n+{\n+\tdebug\n+    variable dhcpLeaseRecord\n+\n+    #   Store the IP address\n+    set dhcpLeaseRecord($chassis,$card,$port,ip) $ip\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpGetIP\n+#\n+# Description:  Return the leased IP address for a given port\n+#\n+# Input:        chassis\n+#               card:\n+#               port:\n+#\n+# Output:       lease\n+#\n+########################################################################################\n+proc dhcpClient::GetIP {chassis card port} \\\n+{\n+\tdebug\n+    variable dhcpLeaseRecord\n+\n+    if [info exists dhcpLeaseRecord($chassis,$card,$port,ip)] {\n+        return $dhcpLeaseRecord($chassis,$card,$port,ip)\n+    }\n+\n+}\n+\n+\n+########################################################################################\n+# Procedure:    dhcpSetServer\n+#\n+# Description:  Set the DHCP Server address for a given port.\n+#\n+# Input:        chassis\n+#               card:\n+#               port:\n+#               server: server address (that which offered the lease)\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::SetServer {chassis card port server} \\\n+{\n+\tdebug\n+    variable dhcpLeaseRecord\n+\n+    #   Store the server address\n+    set dhcpLeaseRecord($chassis,$card,$port,server) $server\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpGetServer\n+#\n+# Description:  Return the address of the dhcp server which leased this port an\n+#                   IP address.\n+#\n+# Input:        chassis\n+#               card:\n+#               port:\n+#\n+# Output:       server address\n+#\n+########################################################################################\n+proc dhcpClient::GetServer {chassis card port} \\\n+{\n+\tdebug\n+    variable dhcpLeaseRecord\n+\n+    if [info exists dhcpLeaseRecord($chassis,$card,$port,server)] {\n+        return $dhcpLeaseRecord($chassis,$card,$port,server)\n+    }\n+\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpSetStreamRegion\n+#\n+# Description:  Set the region that DHCP streams are build within.\n+#\n+# Input:        Region: 0 is default, else 1-7\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::SetStreamRegion {{region 0}} \\\n+{\n+\tdebug\n+\n+    variable streamRegion\n+    variable streamRegionMax\n+    variable streamRegionMin\n+\n+    if {$region <= $streamRegionMax && \\\n+        $region >= $streamRegionMin} {\n+        set streamRegion $region\n+    }\n+\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpGetStreamRegion\n+#\n+# Description:  Returns the region that DHCP streams are build within.\n+#\n+# Input:        None\n+#\n+# Output:       region #\n+#\n+########################################################################################\n+proc dhcpClient::GetStreamRegion {} \\\n+{\n+\tdebug\n+    variable streamRegion\n+\n+    if [info exists streamRegion] {\n+        return $streamRegion\n+    }\n+\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpSetPortList\n+#\n+# Description:  Store the list of ports working with DHCP addresses\n+#\n+# Input:        ports:  {{c l p} {c l p} ...}\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::SetPortList {ports} \\\n+{\n+\tdebug\n+    variable portList\n+    set portList $ports\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpGetPortList\n+#\n+# Description:  Returns the list of ports using DHCP addresses.\n+#\n+# Input:        None\n+#\n+# Output:       region #\n+#\n+########################################################################################\n+proc dhcpClient::GetPortList {} \\\n+{\n+    variable portList\n+\n+    if [info exists portList] {\n+        return $portList\n+    }\n+\n+}\n+\n+\n+########################################################################################\n+# Procedure:    dhcpInitStateTable\n+#\n+# Description:  Set the DHCP state table to it's initial value (all events in all\n+#                   state are set to the NULL routine).\n+#\n+# Input:        eventList: list of potential events\n+#               stateList: list of all known states\n+#               actionList: list of list of actions per state per event (can be an\n+#                   empty list if state machine is to be disabled.\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::InitStateTable { stateList eventList {actionList {}} } \\\n+{\n+\tdebug\n+    variable stateTable\n+\n+    upvar $stateList StateList\n+    upvar $eventList EventList\n+    if [catch \"upvar $actionList ActionList\"] {\n+        set ActionList [list]\n+    }\n+\n+    # Empty state list? If so, exit.\n+    if {[llength $StateList] == 0} {\n+        return\n+    }\n+\n+    # Empty event list? If so, exit.\n+    if {[llength $EventList] == 0} {\n+        return\n+    }\n+\n+    if [info exists stateTable] {\n+        unset stateTable\n+    }\n+\n+    # Empty Action List?  If so, fill stateTable with the NULL routine.\n+    if {[llength $ActionList] == 0} {\n+        foreach state $StateList {\n+            foreach event $EventList {\n+                set stateTable($state,$event) [namespace current]::ActionNull\n+            }\n+        }\n+\n+    # Otherwise, fill the stateTable w/given list of action routines.\n+    } else {\n+        set ActionList [join $ActionList]\n+        set i 0\n+\n+        foreach state $StateList {\n+            foreach event $EventList {\n+                set stateTable($state,$event) [lindex $ActionList $i]\n+                incr i\n+            }\n+        }\n+    }\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::StateLookup\n+#\n+# Description:  Perform state table lookup, execute action routine.\n+#\n+# Input:        event:  event that resulted in this procedure call\n+#               port:   port that event occurred on\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::StateLookup {chassis card port event} \\\n+{ \n+\tdebug\n+    variable stateTable\n+\n+\tif ![ValidEvent $event] {\n+\t\treturn\n+\t}\n+\n+    set state [GetState $chassis $card $port]\n+\tif [ValidState $state] {\n+\t\teval $stateTable($state,$event) [list [list $chassis $card $port]]\n+\t}\n+}\n+\n+\n+\n+########################################################################################\n+#\n+#   DHCP State Machine - Action Routines\n+#\n+#   The following routines perform actions as a result of a background\n+#       event.  Based on the state and the event, and action is looked-up and\n+#       executed.\n+#\n+########################################################################################\n+\n+########################################################################################\n+# Procedure:    dhcpClient::ActionNull\n+#\n+# Description:  Place holder for events which don't require handling.\n+#\n+# Input:        None\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::ActionNull {port} \\\n+{ \n+\tdebug\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::ActionRenew\n+#\n+# Description:  Perform 'renew' behavior as defined in the DHCP RFC for all\n+#               ports in the port list.\n+#                   - Set state = renew\n+#                   - Request lease extension from the current dhcp server\n+#\n+#               The occurance of this action indicates that in a bound state\n+#               a timeOut occurred indicating that it is time to renew the lease.\n+#\n+# Input:        None\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::ActionRenew {port} \\\n+{ \n+\tdebug\n+    variable state\n+\n+    set portList [GetPortList]\n+    foreach item [lnumsort $portList] {\n+        scan $item \"%d %d %d\" c l p\n+        SetState    $c $l $p $state(renew)\n+    }\n+\n+    dhcpStopTimer timer1\n+    DHCPdiscoverIP portList 2 enable\n+\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::ActionRebind\n+#\n+# Description:  Perform 'rebind' behavior as defined in the DHCP RFC.\n+#                   - Set state = rebind\n+#                   - Request lease extension from the any dhcp server\n+#\n+#               The occurance of this action routine indicates that in state(renew)\n+#               a timeout occurred indicated that no IP addresses were offered for\n+#               renewal from the current dhcp server.\n+#\n+# Input:        None\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::ActionRebind {port} \\\n+{ \n+\tdebug $port\n+    variable state\n+\n+    set portList [GetPortList]\n+    foreach item [lnumsort $portList] {\n+        scan $item \"%d %d %d\" c l p\n+        SetState    $c $l $p $state(rebind)\n+    }\n+\n+    dhcpStopTimer timer2\n+    DHCPdiscoverIP portList 2 enable\n+\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::ActionInit\n+#\n+# Description:  Perform 'discovery' behavior as defined in the DHCP RFC.\n+#                   - Set state = idle\n+#                   - Send discover message\n+#\n+#               The occurance of this action routine indicates that in state(rebind)\n+#               a timeout occurred indicating that the IP lease expired.\n+#\n+# Input:        None\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::ActionInit {port} \\\n+{ \n+\n+\tdebug $port\n+\n+    #   Release all ports, turn off timers.\n+    set portList [GetPortList]\n+    dhcpStop\n+\n+    #   Restart IP acquisition with Discovery.\n+    DHCPdiscoverIP portList 0 enable\n+}\n+\n+\n+########################################################################################\n+# Procedure:    dhcpClient::GetStateNames\n+#\n+# Description:  Returns a list of textual state names.\n+#\n+# Input:        None\n+#\n+# Output:       List of state names\n+#\n+########################################################################################\n+proc dhcpClient::GetStateNames {} \\\n+{\n+\tvariable state\n+\treturn [array names state]\n+}\n+\t\t\t\t\t\t\t\t\t\t\t\t\t \n+########################################################################################\n+# Procedure:    dhcpClient::GetStateName\n+#\n+# Description:  Given a state code, return a textual state name.\n+#\n+# Input:        stateCode:\tstate code (refer to dhcpClient::state)\n+#\n+# Output:       state name\n+#\n+########################################################################################\n+proc dhcpClient::GetStateName {stateCode} \\\n+{\n+\tvariable state\n+\tset retValue \"\"\n+\n+\tforeach {name value} [array get state] {\n+\t\tset stateNames($value) $name\n+\t}\n+\n+\tif [info exists stateNames($stateCode)] {\n+\t\tset retValue $stateNames($stateCode)\n+\t}\n+\n+\treturn $retValue\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::GetStateCodes\n+#\n+# Description:  Returns a list of state codes.\n+#\n+# Input:        None\n+#\n+# Output:       List of state codes\n+#\n+########################################################################################\n+proc dhcpClient::GetStateCodes {} \\\n+{\n+\tvariable state\n+\n+\tset states [list]\n+\tforeach {name value} [array get state] {\n+\t\tlappend states $value\n+\t}\n+\n+\treturn $states\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::ValidState\n+#\n+# Description:  True/False: Is the given state code a valid member of the list\n+#\t\t\t\t\tof state codes (dhcpClient::state)\n+#\n+# Input:        stateCode:\tstate code\n+#\n+# Output:       1 if valid, else\n+#\t\t\t\t0\n+#\n+########################################################################################\n+proc dhcpClient::ValidState {stateCode} \\\n+{\n+\tif {[lsearch [GetStateCodes] $stateCode] < 0} {\n+\t\treturn 0\n+\t}\n+\treturn 1\n+}\n+\n+\n+########################################################################################\n+# Procedure:    dhcpClient::GetEventName\n+#\n+# Description:  Given a event code, return a textual event name.\n+#\n+# Input:        eventCode:\tevent code (refer to dhcpClient::event)\n+#\n+# Output:       event name\n+#\n+########################################################################################\n+proc dhcpClient::GetEventName {eventCode} \\\n+{\n+\tvariable event\n+\tset retValue \"\"\n+\n+\tforeach {name value} [array get event] {\n+\t\tset eventNames($value) $name\n+\t}\n+\n+\tif [info exists eventNames($eventCode)] {\n+\t\tset retValue $eventNames($eventCode)\n+\t}\n+\n+\treturn $retValue\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::GetEventCodes\n+#\n+# Description:  Returns a list of event codes (dhcpClient::event).\n+#\n+# Input:        None\n+#\n+# Output:       List of event codes\n+#\n+########################################################################################\n+proc dhcpClient::GetEventCodes {} \\\n+{\n+\tvariable event\n+\n+\tset events [list]\n+\tforeach {name value} [array get event] {\n+\t\tlappend events $value\n+\t}\n+\n+\treturn $events\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::ValidEvent\n+#\n+# Description:  True/False: Is the given event code a valid member of the list\n+#\t\t\t\t\tof event codes (dhcpClient::event)\n+#\n+# Input:        eventCode:\tevent code\n+#\n+# Output:       1 if valid, else\n+#\t\t\t\t0\n+#\n+########################################################################################\n+proc dhcpClient::ValidEvent {eventCode} \\\n+{\n+\tif {[lsearch [GetEventCodes] $eventCode] < 0} {\n+\t\treturn 0\n+\t}\n+\treturn 1\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::getTransactionID\n+#\n+# Description:  Derive a unique transaction id, given a port id by adding the \n+#               the port # to the current system time in 'clicks'.\n+#\n+# Input:        port:   port id\n+#\n+# Output:       transaction id\n+#\n+########################################################################################\n+proc dhcpClient::getTransactionID {port} \\\n+{\n+    return [expr [clock clicks] + $port]\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::clearParameterRequestList\n+#\n+# Description:  Empty parameter request list.\n+#\n+# Input:        None\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::clearParameterRequestList {} \\\n+{\n+    variable paramRequestList\n+    set paramRequestList [list]\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::getParameterRequestList\n+#\n+# Description:  Return the values currently set into the list of requested DHCP \n+#                   options.  DHCP options are described in RFC 1533.\n+#\n+# Input:        None\n+#\n+# Output:       dhcpClient::paramRequestList\n+#\n+########################################################################################\n+proc dhcpClient::getParameterRequestList {} \\\n+{\n+    variable paramRequestList\n+    return $paramRequestList\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::setParameterRequestList\n+#\n+# Description:  Set the list of requested DHCP options.  DHCP options are described\n+#                   in RFC 1533, the parameter request list is described in section\n+#                   9.6 of RFC 1533.\n+#\n+# Input:        option: name of dhcp option (refer to Tcl Development Guide - DHCP,\n+#                       for a list of valid options or RFC 1533).\n+#\n+# Output:       0 if okay, else\n+#               1\n+#\n+########################################################################################\n+proc dhcpClient::setParameterRequestList {option} \\\n+{\n+    variable paramRequestList\n+    set retCode 1\n+    \n+    switch $option {\n+        dhcpPad -\n+        dhcpEnd -\n+        dhcpSubnetMask -\n+        dhcpTimeOffset -\n+        dhcpGateways -\n+        dhcpTimeServer -\n+        dhcpNameServer -\n+        dhcpDomainNameServer -\n+        dhcpLogServer -\n+        dhcpCookieServer -\n+        dhcpLPRServer -\n+        dhcpImpressServer -\n+        dhcpResourceLocationServer -\n+        dhcpHostName -\n+        dhcpBootFileSize -\n+        dhcpMeritDumpFile -\n+        dhcpDomainName -\n+        dhcpSwapServer -\n+        dhcpRootPath -\n+        dhcpExtensionPath -\n+        dhcpIpForwardingEnable -\n+        dhcpPolicyFilter -\n+        dhcpMaxDatagramReassemblySize -\n+        dhcpDefaultIpTTL -\n+        dhcpPathMTUAgingTimeout -\n+        dhcpPathMTUPlateauTable -\n+        dhcpInterfaceMTU -\n+        dhcpAllSubnetsAreLocal -\n+        dhcpBroadcastAddress -\n+        dhcpPerformMaskDiscovery -\n+        dhcpMaskSupplier -\n+        dhcpPerformRouterDiscovery -\n+        dhcpRouterSolicitAddr -\n+        dhcpStaticRoute -\n+        dhcpTrailerEncapsulation -\n+        dhcpARPCacheTimeout -\n+        dhcpEthernetEncapsulation -\n+        dhcpTCPDefaultTTL -\n+        dhcpTCPKeepAliveInterval -\n+        dhcpTCPKeepGarbage -\n+        dhcpNISDomain -\n+        dhcpNISServer -\n+        dhcpMTPServer -\n+        dhcpVendorSpecificInfo -\n+        dhcpNetBIOSNameSvr -\n+        dhcpNetBIOSDatagramDistSvr -\n+        dhcpNetBiosNodeType -\n+        dhcpNetBIOSScope -\n+        dhcpXWINSysFontSvr -\n+        dhcpRequestedIPAddr -\n+        dhcpIPAddrLeaseTime -\n+        dhcpOptionOverload -\n+        dhcpTFTPSvrName -\n+        dhcpBOOTFileName -\n+        dhcpMessageType -\n+        dhcpSvrIdentifier -\n+        dhcpParamRequestList -\n+        dhcpMessage -\n+        dhcpMaxMessageSize -\n+        dhcpRenerwalTimeValue -\n+        dhcpRebindingTimeValue -\n+        dhcpVendorClassId -\n+        dhcpClientId -\n+        dhcpXWinSysDisplayMgr -\n+        dhcpNISplusDomain -\n+        dhcpNISplusServer -\n+        dhcpMobileIPHomeAgent -\n+        dhcpSMTPSvr -\n+        dhcpPOP3Svr -\n+        dhcpNNTPSvr -\n+        dhcpWWWSvr -\n+        dhcpDefaultFingerSvr -\n+        dhcpDefaulttIRCSvr -\n+        dhcpStreetTalkSvr -\n+        dhcpSTDASvr {\n+            if {[lsearch $paramRequestList $option] < 0} {\n+                set paramRequestList [lappend paramRequestList $option]\n+            }\n+            set retCode 0\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::getMagicCookie\n+#\n+# Description:  Return the dhcp magic cookie (defined in dhcpClient namespace)\n+#\n+# Input:        None\n+#\n+# Output:       magic cookie (hex value)\n+#\n+########################################################################################\n+proc dhcpClient::getMagicCookie {} \\\n+{\n+    variable magicCookie\n+    return $magicCookie\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::setStartTime\n+#\n+# Description:  Record the start of dhcp processing.\n+#\n+# Input:        seconds:    start time in seconds\n+#\n+# Output:       None\n+#\n+########################################################################################\n+proc dhcpClient::setStartTime {seconds} \\\n+{\n+    variable startTime\n+    set startTime $seconds\n+}\n+\n+########################################################################################\n+# Procedure:    dhcpClient::getStartTime\n+#\n+# Description:  Return the start time of dhcp processing in seconds.\n+#\n+# Input:        None\n+#\n+# Output:       start time.\n+#\n+########################################################################################\n+proc dhcpClient::getStartTime {} \\\n+{\n+    variable startTime\n+    return $startTime\n+}\n+\n+\n+\n+\n+########################################################################################\n+# Procedure:    dhcpClient::debug\n+#\n+# Description:  Depending upon the list of items contained in variable \n+#\t\t\t\tdhcpClient::debugLevel, debug information is built and\n+#\t\t\t\tprinted.\n+#\n+# Input:        args:\tlist of arguments, these are added to debug output\n+#\n+# Output:       Printable debug information\n+#\n+########################################################################################\n+proc dhcpClient::debug {args} \\\n+{\n+\tvariable debugLevel\n+\tif {[string length $debugLevel] == 0} {\n+\t\treturn\n+\t}\n+\n+\tset output \"\"\n+\tforeach item $debugLevel {\n+\n+\t\tswitch $item {\n+\n+\t\t\tstate {\t\t\n+\t\t\t\tset stateName \"\"\n+\t\t\t\tset port [lindex [GetPortList] 0]\n+\t\t\t\tif {[string length $port] > 0} {\n+\t\t\t\t\tscan $port \"%d %d %d\" c l p\n+\t\t\t\t\tset stateName [GetStateName [GetState $c $l $p]]\n+\t\t\t\t}\n+\t\t\t\tappend output \"State: $stateName \"\n+\t\t\t}\n+\n+\t\t\tdefault {\t\t\t\n+\t\t\t\tset procedure [info level [expr [info level]-1]]\n+\t\t\t\tset arguments [info args [lindex $procedure 0]]\n+\t\t\t\tset defaultInfo [string toupper [lindex $procedure 0]]\n+\t\t\t\tset procedure [lreplace $procedure 0 0]\n+\t\t\t\t\n+\t\t\t\tfor {set i 0} {$i < [llength $procedure]} {incr i} {\n+\t\t\t\t\tset defaultInfo [lappend defaultInfo [lindex $arguments $i] \\\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t [lindex $procedure $i]]\n+\t\t\t\t}\n+\t\t\t\tappend output \"$defaultInfo \"\n+\t\t\t}\n+\t\t}\n+\t}\n+\tappend output \"$args\"\n+\n+\terrorMsg \"$output\"\n+}\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/dialogUtils.tcl b/dep/tclclient/ixTcl1.0/Generic/dialogUtils.tcl\nnew file mode 100644\nindex 00000000..6458219b\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/dialogUtils.tcl\n@@ -0,0 +1,230 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: dialogUtils.tcl\n+#    Copyright ©  IXIA\n+#    All Rights Reserved.\n+#\n+#    Revision Log:\n+#    03-12-2001    DS    Genesis\n+#\n+# Description: Contains miscellaneous dialog for transmit/pause dialog procedures.\n+#\n+##################################################################################\n+\n+proc createDialog {dialogName {window textDialog}} \\\n+{\n+    dialogUtils::create $dialogName $window\n+}\n+\n+proc writeDialog {dialogText {window textDialog}} \\\n+{\n+    dialogUtils::writeText $dialogText $window\n+}\n+\n+proc destroyDialog {{window textDialog}} \\\n+{\n+    dialogUtils::destroy $window\n+}\n+\n+\n+#######################################################################\n+#\n+# Procedure:    dialogUtils\n+# Description:  \n+# Argument(s):\n+# Results:\n+#\n+#######################################################################\n+namespace eval dialogUtils {} \\\n+{\n+    variable state  [advancedTestParameter cget -dialogState]\n+}\n+\n+########################################################################\n+# Procedure: dialogUtils::init\n+#\n+# Description: This command doesn't do anything, just want to source this  \n+# file when it is called.\n+#\n+########################################################################\n+proc dialogUtils::init {} \\\n+{\n+}\n+\n+########################################################################\n+# Procedure: dialogUtils::create\n+#\n+# This command creates a dialog box of name \"dialogName\"\n+#\n+########################################################################\n+proc dialogUtils::create {dialogName window} \\\n+{\n+    variable state\n+\n+    set retCode $::TCL_OK\n+\n+    set window .$window\n+\n+    if {$state != \"destroyedByUser\"} {\n+        if [regexp -nocase wish [file tail [info nameofexecutable]]] {\n+\n+            if {[winfo exists $window] == 0} {\n+                toplevel     $window -class Dialog\n+                wm resizable $window 0 1\n+                wm withdraw  $window\n+                wm title     $window $dialogName\n+\n+                text $window.text -width 40 -wrap word -yscrollcommand \"$window.textScroll set\"\n+\n+                # unix didn't look nice, so just set a different font here..\n+                if {[isUNIX]} {\n+                    createNamedFont application arial 7\n+                    $window.text config -font application\n+                }\n+\n+                scrollbar $window.textScroll -command \"$window.text yview\"\n+\n+                grid $window.text       -row 0 -column 0 -sticky snew\n+                grid $window.textScroll -row 0 -column 1 -sticky sn\n+                grid rowconfigure    $window 0 -weight 1\n+                grid columnconfigure $window 0 -weight 1\n+\n+                wm geometry  $window 270x100+100+100\n+                wm protocol  $window WM_DELETE_WINDOW \"dialogUtils::destroyedByUser $window\"\n+\n+                if {$state == \"normal\"} {\n+                    wm deiconify $window\n+                } else {\n+                    wm iconify $window\n+                }\n+            } else {\n+                $window.text delete 0.0 end\n+            }\n+        }\n+    }\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: dialogUtils::writeText\n+#\n+# This command writes to a dialog box of name \"window\"\n+#\n+########################################################################\n+proc dialogUtils::writeText {dialogText window} \\\n+{\n+    set window .$window\n+\n+    if [catch {\n+            $window.text insert end \"$dialogText\\n\"\n+            $window.text see end\n+            update\n+        } err] {\n+        ixPuts $dialogText\n+    }\n+}\n+\n+########################################################################\n+# Procedure: dialogUtils::getWindowState\n+#\n+# This command gets the state the dialog box of name \"window\"\n+#\n+########################################################################\n+proc dialogUtils::getWindowState {window} \\\n+{\n+    set windowState .$window\n+\n+    if [catch {wm state $windowState} state] {\n+        set state   destroyedByUser\n+    }\n+\n+    return $state\n+}\n+\n+########################################################################\n+# Procedure: dialogUtils::setWindowState\n+#\n+# This command sets the state variable for the dialog box\n+#\n+########################################################################\n+proc dialogUtils::setWindowState {newState} \\\n+{\n+    variable state\n+\n+    set state $newState\n+\n+    return $state\n+}\n+\n+\n+########################################################################\n+# Procedure: dialogUtils::saveWindowState\n+#\n+# This command save the static state to bring the dialog back up in next time\n+#\n+########################################################################\n+proc dialogUtils::saveWindowState {window} \\\n+{    \n+    setWindowState [getWindowState $window]\n+}\n+\n+\n+########################################################################\n+# Procedure: dialogUtils::destroyedByUser\n+#\n+# This command destroys the dialog box of name \"window\"\n+#\n+########################################################################\n+proc dialogUtils::destroyedByUser {window} \\\n+{\n+    catch {::destroy $window}\n+    setWindowState destroyedByUser\n+}\n+\n+\n+########################################################################\n+# Procedure: dialogUtils::destroy\n+#\n+# This command destroys the dialog box of name \"dialogName\"\n+#\n+########################################################################\n+proc dialogUtils::destroy {window} \\\n+{    \n+    saveWindowState $window\n+\n+    set window .$window\n+    catch {::destroy $window}\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/eventHandler.tcl b/dep/tclclient/ixTcl1.0/Generic/eventHandler.tcl\nnew file mode 100644\nindex 00000000..9a7dc1a1\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/eventHandler.tcl\n@@ -0,0 +1,124 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: eventHandler.tcl\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#       Revision Log:\n+#       04-25-2000      DS      Genesis\n+#\n+# Description: The procedures in this file are used for handling events \n+#           \n+#       NOTE:  THIS FILE NEEDS TO BE MOVED INTO SM LAND AS IT'S NOT USED\n+#              BY IXTCLHAL GENERIC PROCS!!!\n+#\n+##################################################################################\n+\n+\n+#################################################################################\n+# Procedure:    setStopTestFlag\n+#\n+# Description:  Set the global variable ixStopTest to the given value.\n+#\n+# Argument(s):  The new value for ixStopTest.\n+#\n+# Output:\n+#################################################################################\n+proc setStopTestFlag { value } \\\n+{\n+    global ixStopTest\n+\n+    set ixStopTest $value\n+}\n+\n+\n+#################################################################################\n+# Procedure:    stopTest\n+#\n+# Description:  Handle the message stopTest that is sent from Scriptmate.\n+#\n+# Argument(s):\n+#\n+# Output:\n+#################################################################################\n+\n+proc stopTest {} \\\n+{\n+    global ixStopTest ixStopAction\n+\n+    set ixStopTest 1\n+    switch $ixStopAction {\n+        0 {\n+            # close pipe & socket\n+            catch { puts       \"closePipe\"   }\n+            catch { putsServer \"closeSocket\" }\n+            destroyDialog\n+            exit\n+        }\n+        default {\n+        }\n+    }\n+    \n+    debugMsg \"The test is being stopped!\"\n+}\n+\n+\n+#################################################################################\n+# Procedure:    isTestStopped\n+#\n+# Description:  Find out if the test is being stopped by looking at the flag ixStopTest.\n+#\n+# Argument(s):\n+#\n+# Output:\n+#################################################################################\n+proc isTestStopped {} {\n+    global ixStopTest\n+    return $ixStopTest\n+}\n+\n+\n+#################################################################################\n+# Procedure:    informServerCurrentTestStopped\n+#\n+# Description:  Send the message \"runningStatus:currentTestStoppedByUser\" to Scriptmate.\n+#\n+# Argument(s):\n+#\n+# Output:\n+#################################################################################\n+proc informServerCurrentTestStopped {} \\\n+{\n+    logMsg \"runningStatus:currentTestStoppedByUser\"\n+}\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/featureUtils.tcl b/dep/tclclient/ixTcl1.0/Generic/featureUtils.tcl\nnew file mode 100644\nindex 00000000..496fc32e\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/featureUtils.tcl\n@@ -0,0 +1,324 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: featureUtils.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t07-31-2002\tDS\tGenesis\n+#\n+# Description: This file contains helper utilities that check for \n+#              specific features on a port or portArray.\n+#\n+########################################################################\n+\n+\n+\n+########################################################################\n+# Procedure: IsPOSPort\n+#\n+# This command checks the port if it is a POS port\n+#\n+########################################################################\n+proc IsPOSPort {c l p} \\\n+{\n+    return [port isActiveFeature $c $l $p $::portFeaturePos]\n+}\n+\n+\n+########################################################################\n+# Procedure: Is10GigEPort\n+#\n+# This command checks the port if it is a 10GigE port\n+#\n+########################################################################\n+proc Is10GigEPort {c l p} \\\n+{\n+    set retCode 0\n+    \n+    set interfaceType [port getInterface $c $l $p]\n+\n+    if {$interfaceType == $::interface10GigE } {\n+        set retCode 1\n+    }\n+\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: IsGigabitPort\n+#\n+# This command checks card type against Gigabit card types\n+#\n+########################################################################\n+proc IsGigabitPort {c l p} \\\n+{\n+    set retCode 0\n+\n+    set interfaceType [port getInterface $c $l $p]\n+    if {$interfaceType == $::interfaceGigabit} {\n+        set retCode 1\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: any10100Ports\n+#\n+# This command check if there are any 10/100 cards in the map.\n+# Returns 1 if there are 10/100 cards in the map.\n+#\n+# Argument(s):\n+#\n+########################################################################\n+proc any10100Ports {TxRxArray} \\\n+{\n+     upvar $TxRxArray txRxArray\n+\n+    return [anyPortsBySpeed txRxArray {10 100}]\n+}\n+\n+\n+########################################################################\n+# Procedure: anyGigPorts\n+#\n+# This command checks if there are any gig cards in the map\n+#\n+# Argument(s):\n+#\n+########################################################################\n+proc anyGigPorts {TxRxArray} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [anyPortsBySpeed txRxArray 1000]\n+}\n+\n+\n+########################################################################\n+# Procedure: anyOc48Ports\n+#\n+# This command checks if there are any oc48 cards in the map\n+#\n+# Argument(s):\n+#\n+########################################################################\n+proc anyOc48Ports {TxRxArray} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [anyPortsByInterface txRxArray interfaceOc48]\n+}\n+\n+\n+########################################################################\n+# Procedure: anyOc192Ports\n+#\n+# This command checks if there are any oc192 cards in the map\n+#\n+# Argument(s):\n+#\n+########################################################################\n+proc anyOc192Ports {TxRxArray} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [anyPortsByInterface txRxArray interfaceOc192]\n+}\n+\n+\n+########################################################################\n+# Procedure: anyPortsByInterface\n+#\n+# This command checks if there are any ports of that interface type\n+#\n+# Argument(s):\n+#\n+########################################################################\n+proc anyPortsByInterface {TxRxArray interface} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    global $interface\n+\n+    set retCode 0\n+    \n+    foreach portMap [getAllPorts txRxArray] {\n+        scan $portMap \"%d %d %d\" c l p\n+        if {[port getInterface $c $l $p] == [set $interface]} {\n+            set retCode 1\n+            break\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: anyPortsBySpeed\n+#\n+# This command checks if there are any ports of that SPEED(list)\n+#\n+# Argument(s):\n+#\n+########################################################################\n+proc anyPortsBySpeed {TxRxArray speed} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode 0\n+    \n+    foreach portMap [getAllPorts txRxArray] {\n+        scan $portMap \"%d %d %d\" c l p\n+\n+        if {[lsearch $speed [stat getLineSpeed $c $l $p]] >= 0} {\n+            set retCode 1\n+            break\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: supportsProtocolServer\n+#\n+# This command checks if all the ports support protocol server\n+#\n+# Argument(s):\n+#   TxRxArray   - port array or list\n+#\n+# Return:\n+#   TRUE if all ports support protocol server\n+#\n+########################################################################\n+proc supportsProtocolServer {TxRxArray} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [isValidFeature txRxArray $::portFeatureProtocols]\n+}\n+\n+\n+########################################################################\n+# Procedure: supportsPortCPU\n+#\n+# This command checks if all the ports are portCPU-based\n+#\n+# Argument(s):\n+#   TxRxArray   - port array or list\n+#\n+# Return:\n+#   TRUE if all ports are portCPU-based\n+#\n+########################################################################\n+proc supportsPortCPU {TxRxArray} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [isValidFeature txRxArray $::portFeatureLocalCPU]\n+}\n+\n+\n+########################################################################\n+# Procedure:    isValidFeature\n+#\n+# Description:  TRUE/FALSE:  Is a feature valid for the ports in the given \n+#               port array?\n+#\n+# Arguments:    PortArray    array, map or list of ports to check feature on\n+#               featureList  one or more features to validate port against\n+#\n+# Returns:      $::true is valid, else $::false\n+#\n+########################################################################\n+proc isValidFeature {PortArray featureList} \\\n+{\n+    upvar $PortArray portArray\n+\n+    set retCode $::true\n+\n+    foreach portMap [getAllPorts portArray] {\n+        scan $portMap \"%d %d %d\" c l p\n+        \n+        foreach feature $featureList {\n+            if {![port isValidFeature $c $l $p $feature]} {\n+                set retCode $::false\n+                break\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: isPacketFlowMode\n+#\n+# This command checks if the port is in packet flow mode \n+#\n+# Argument(s):\n+#\n+########################################################################\n+proc isPacketFlowMode {c l p} \\\n+{\n+    return [port isActiveFeature $c $l $p $::portFeaturePacketFlows]\n+}\n+\n+\n+########################################################################\n+# Procedure: isAdvancedStreamSchedulerMode\n+#\n+# This command checks if the port is in advanced streams mode \n+#\n+# Argument(s):\n+#\n+########################################################################\n+proc isAdvancedStreamSchedulerMode {c l p} \\\n+{\n+\tif {[port isValidFeature $c $l $p $::portTxModeAdvancedScheduler] || \\\n+\t\t[port isValidFeature $c $l $p $::portTxModeAdvancedSchedulerCoarse]} {\n+\t\treturn 1;\n+\t} else {\n+\t\treturn 0;\n+\t}\n+}\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/fileTransferClient.tcl b/dep/tclclient/ixTcl1.0/Generic/fileTransferClient.tcl\nnew file mode 100644\nindex 00000000..f98b72a8\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/fileTransferClient.tcl\n@@ -0,0 +1,538 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: fileTransferClient.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+# Revision Log:\n+#       5-14-2001       Andy Balogh created\n+#\n+# Description: \n+#\tcommands to transfer files using ixTclServer as the server\n+#\n+#   NOTE:  We use this mechanism because the ixTclServer is not setup\n+#          to be a 'real' fully-functioning FTP server; it really only\n+#          does some simple file transfer stuff.\n+#\n+########################################################################\n+\n+\n+########################################################################\n+# Protocol Description\n+# \n+# bytes  reqd  description\n+# -----  ----  ----------------------------------------\n+#    20  Y     length of transaction\n+#     1  Y     command 0=success, 1=error, 2=getFile, 3=putFile, 4=listDirectory, 5=deleteFile\n+#    20  Y     length of command details\n+# above  Y     command details, error=errorCode\n+#                               getFile=fileName\n+#                               putFile=fileName\n+#                               listDirectory=directory\n+#                               deleteFile=fileName\n+#    20  Y     length of data\n+# above  N     data for the command being executed, \n+#              error=text description of the error, \n+#              getFile=the file data, \n+#              putFile=the file Data, \n+#              listDirectory=the directory listing, \n+#              deleteFile=null\n+#\n+########################################################################\n+namespace eval fileTransferClient {} \\\n+{\n+    variable dataSocket\n+    variable sourceFile\n+    variable destinationFile\n+        \n+    variable transactionSize\n+    variable commandId\n+    variable commandDetailsSize\n+    variable commandDetails\n+    variable dataSize\n+\n+    variable totalBytesRead\n+    variable buffer\n+    variable destinationFileId\n+    variable transferOutcome\n+    variable transferOutcomeDetails\n+\n+    ### name of the log file in case we read more bytes then expected, used below in the method debug\n+    variable debug_file_name\n+}\n+\n+proc ::fileTransferClient::debug { mesg } {\n+    variable debug_file_name\n+    \n+    # Print only explicit messages with debug \"message\"\n+    if {[info exists debug_file_name]} {\n+        set fid [open $debug_file_name \"a+\"]\n+        puts $fid \"$mesg\"\n+        close $fid\n+    } else {\n+        puts \"$mesg\"\n+    }\n+}\n+\n+set fileTransferClient::debug_file_name \"/tmp/ixialog.log\"\n+\n+\n+########################################################################\n+# Procedure: fileTransferClient::openConnectionToTclServer\n+#\n+# Description: This command connects to an ixTclServer\n+#\n+# Argument(s):\n+#    hostname               - hostname of the ixTclServer\n+#    port                   - port number, should be 4500\n+#\n+# Return Values: returns 0-success, 1-error\n+########################################################################\n+proc fileTransferClient::openConnectionToTclServer { hostname {port 4500} } \\\n+{\n+    variable dataSocket\n+    variable commandId\n+\n+    set returnValue 1\n+\n+    catch { set dataSocket [socket $hostname $port] }\n+\n+    if { $dataSocket != \"\" } {\n+        \n+        fconfigure $dataSocket -blocking  0\n+        fconfigure $dataSocket -buffering none\n+        fconfigure $dataSocket -buffersize 8192\n+        \n+        if { $commandId == 2 } {\n+\n+            fconfigure $dataSocket -translation {binary binary}\n+            fconfigure $dataSocket -encoding binary\n+        \n+        } else {\n+\n+            fconfigure $dataSocket -encoding binary\n+            fconfigure $dataSocket -translation {binary binary}\n+        \n+        }\n+\n+        set returnValue 0\n+\n+    }\n+\n+    return $returnValue\n+}\n+\n+\n+########################################################################\n+# Procedure: fileTransferClient::closeTclServerConnection\n+#\n+# Description: This command closes the connection to an ixTclServer\n+#              and optionally closes the destinationFileId if the\n+#              command is a getFile\n+#\n+# Argument(s):\n+#\n+# Return Values: always returns 0\n+########################################################################\n+proc fileTransferClient::closeTclServerConnection {} \\\n+{\n+    variable dataSocket\n+    variable destinationFileId\n+\n+    close $dataSocket\n+\n+    if { $destinationFileId != \"\" } { \n+\n+        close $destinationFileId\n+\n+    }\n+\n+    return 0\n+}\n+\n+\n+########################################################################\n+# Procedure: fileTransferClient::sendTransactionToTclServer\n+#\n+# Description: This command sends a formatted transaction to an ixTclServer\n+#\n+# Argument(s):\n+#\n+# Return Values: returns 0-success, 1-error\n+########################################################################\n+proc fileTransferClient::sendTransactionToTclServer { transaction } \\\n+{\n+    variable dataSocket\n+    variable totalBytesRead 0\n+    variable buffer \"\"\n+    variable transferOutcomeDetails\n+    variable transferOutcome\n+    variable destinationFile\n+    variable transactionSize 0\n+    variable commandSize 0\n+    variable commandDetails \"\"\n+    variable commandDetailsSize 0\n+    variable dataSize -1\n+\n+    set returnValue 1\n+\n+    if { $dataSocket != \"\" } {\n+\n+        fconfigure $dataSocket -blocking  1\n+        set line [puts $dataSocket $transaction]\n+        flush $dataSocket\n+\n+        set totalBytesRead [expr $totalBytesRead + [string length $line] ]\n+        set buffer $line\n+\n+        set returnValue [fileTransferClient::getTransferOutcome]\n+    }\n+\n+    return $returnValue\n+}\n+\n+\n+########################################################################\n+# Procedure: fileTransferClient::sendTransactionToTclServer_ForDelete\n+#\n+# Description: This command sends a formatted transaction to an ixTclServer\n+#\n+# Argument(s):\n+#\n+# Return Values: returns 0-success, 1-error\n+########################################################################\n+proc fileTransferClient::sendTransactionToTclServer_ForDelete { transaction } \\\n+{\n+    variable dataSocket\n+    variable totalBytesRead 0\n+    variable buffer \"\"\n+    variable transferOutcomeDetails\n+    variable transferOutcome\n+    variable destinationFile\n+    variable transactionSize 0\n+    variable commandSize 0\n+    variable commandDetails \"\"\n+    variable commandDetailsSize 0\n+    variable dataSize -1\n+\n+    set returnValue 0\n+\n+    if { $dataSocket != \"\" } {\n+\n+        fconfigure $dataSocket -blocking  1\n+        set line [puts $dataSocket $transaction]\n+        flush $dataSocket\n+\n+        set totalBytesRead [expr $totalBytesRead + [string length $line] ]\n+        set buffer $line\n+        closeTclServerConnection\n+    }\n+\n+    return $returnValue\n+}\n+\n+########################################################################\n+# Procedure: fileTransferClient::getFile\n+#\n+# Description: This command gets a file using ixTclServer as the server\n+#\n+# Argument(s):\n+#    hostname        - hostname of the ixTclServer\n+#    port            - port number, should be 4500\n+#    sourceFile      - name of the file to get, can be absolute or relative\n+#    destinationFile - name of the file that the contents will be saved as\n+#\n+# Return Values: returns 0-success, 1-error\n+########################################################################\n+proc fileTransferClient::getFile { hostname port sourceFile destinationFile } \\\n+{\n+    variable totalBytesRead 0\n+    variable transactionSize 0\n+    variable commandSize 0\n+    variable commandDetails 0\n+    variable destinationFileId \"\"\n+    variable transferOutcomeDetails 0\n+    variable commandId 2\n+    \n+    set returnValue 1\n+\n+    if { [openConnectionToTclServer $hostname $port] == 0 } { \n+\n+        set commandDetails $sourceFile\n+        set commandDetailsSize [format \"%.20d\" [string length $commandDetails]]\n+        set transactionSize [format \"%.20d\" [expr 20 + [string length $commandId] + [string length $commandDetailsSize] + [string length $commandDetails]]]\n+        set transaction $transactionSize$commandId$commandDetailsSize$commandDetails\n+\n+        set destinationFileId [ixFileUtils::open $destinationFile w]\n+        if { $destinationFileId != \"\" } { \n+\n+            fconfigure $destinationFileId -encoding binary\n+            fconfigure $destinationFileId -eofchar { \"\" \"\" }\n+            fconfigure $destinationFileId -translation { lf lf }\n+            \n+            set returnValue [sendTransactionToTclServer $transaction]\n+        \n+        } else { \n+        \n+            closeTclServerConnection\n+\n+            set transferOutcomeDetails \"Unable to open source file\"\n+        }\n+    \n+    } else {\n+\n+        set transferOutcomeDetails \"Unable to open socket\"\n+    }\n+\n+    return $returnValue\n+}\n+\n+########################################################################\n+# Procedure: fileTransferClient::deleteFile\n+#\n+# Description: This command deletes a file using ixTclServer as the server\n+#\n+# Argument(s):\n+#    hostname        - hostname of the ixTclServer\n+#    port            - port number, should be 4500\n+#    sourceFile      - name of the file to delete, can be absolute or relative\n+#\n+# Return Values: returns 0-success, 1-error\n+########################################################################\n+proc fileTransferClient::deleteFile { hostname port sourceFile  } \\\n+{\n+    variable totalBytesRead 0\n+    variable transactionSize 0\n+    variable commandSize 0\n+    variable commandDetails \"\"\n+    variable transferOutcomeDetails 0\n+    variable destinationFileId \"\"\n+    variable commandId 5 \n+    \n+    set returnValue 1\n+\n+    if { [openConnectionToTclServer $hostname $port] == 0 } { \n+\n+        set commandDetails $sourceFile\n+        set commandDetailsSize [format \"%.20d\" [string length $commandDetails]]\n+        set transactionSize [format \"%.20d\" [expr 20 + [string length $commandId] + [string length $commandDetailsSize] + [string length $commandDetails]]]\n+        set transaction $transactionSize$commandId$commandDetailsSize$commandDetails\n+        \n+        set returnValue [sendTransactionToTclServer_ForDelete $transaction]\n+    \n+    } else {\n+\n+        set transferOutcomeDetails \"Unable to open socket\"\n+    }\n+    \n+\n+    return $returnValue\n+}\n+\n+\n+########################################################################\n+# Procedure: fileTransferClient::putFile\n+#\n+# Description: This commands puts a file using ixTclServer as the server\n+#\n+# Argument(s):\n+#    hostname        - hostname of the ixTclServer\n+#    port            - port number, should be 4500\n+#    sourceFile      - name of the file to get, can be absolute or relative\n+#    destinationFile - name of the file that the contents will be saved as\n+#\n+# Return Values: always returns 0\n+########################################################################\n+proc fileTransferClient::putFile { hostname port sourceFile destinationFile } \\\n+{\n+    variable totalBytesRead 0\n+    variable transactionSize 0\n+    variable commandSize 0\n+    variable commandDetails \"\"\n+    variable dataSize -1\n+    variable buffer\n+    variable destinationFileId \"\"\n+    variable transferOutcomeDetails 0\n+    variable commandId 3\n+\n+    set returnValue 1\n+        \n+    if { [openConnectionToTclServer $hostname $port] == 0 } { \n+\n+        set commandDetails $destinationFile\n+        set commandDetailsSize [format \"%.20d\" [string length $commandDetails]]\n+        set dataSize [format \"%.20d\" [file size $sourceFile]] \n+\n+        set sourceFileId [ixFileUtils::open $sourceFile r]\n+\n+        if { $sourceFileId != \"\" } { \n+ \n+            fconfigure $sourceFileId -translation { binary binary }\n+            fconfigure $sourceFileId -encoding binary\n+            set fileData [read -nonewline $sourceFileId]\n+            close $sourceFileId\n+\n+            set transactionSize [format \"%.20d\" [expr 20 + [string length $commandId] + [string length $commandDetailsSize] + [string length $commandDetails] + [string length $dataSize] + [string length $fileData]]]\n+            set transaction $transactionSize$commandId$commandDetailsSize$commandDetails$dataSize$fileData\n+\n+            set returnValue [sendTransactionToTclServer $transaction]\n+\n+        } else {\n+\n+            closeTclServerConnection\n+\n+            set transferOutcomeDetails \"Unable to open source file\"\n+        }\n+\n+    } else {\n+\n+        set transferOutcomeDetails \"Unable to open socket\"\n+    }\n+\n+    return $returnValue\n+}\n+\n+\n+########################################################################\n+# Procedure: fileTransferClient::getTransferOutcome\n+#\n+# Description: This command reads the response from the ixTclServer\n+#\n+# Argument(s):\n+#    dataSocket      - a connected socket \n+#\n+# Return Values: always returns 0\n+########################################################################\n+proc fileTransferClient::getTransferOutcome {} \\\n+{\n+    variable totalBytesRead 0\n+    variable transactionSize 0\n+    variable commandId -1\n+    variable commandDetailsSize -1\n+    variable commandDetails \"\"\n+    variable dataSize -1\n+    variable buffer \"\"\n+    variable destinationFileId\n+    variable transferOutcome\n+    variable transferOutcomeDetails\n+    variable dataSocket\n+    variable hitTime \"\"\n+    \n+    fconfigure $dataSocket -blocking 0\n+\n+    set returnValue 1\n+    set endSocketRead 0\n+\n+    while { $endSocketRead == 0 } {\n+        \n+        set line [read $dataSocket 2048]\n+        set totalBytesRead [expr $totalBytesRead + [string length $line]]\n+        append buffer $line\n+\n+        if { ( $transactionSize == 0 ) && ( [string length $buffer] >= 40 ) } {\n+\n+            set transactionSize [string range $buffer 0 19]\n+            set transactionSize [string trimleft $transactionSize \"0\"]\n+            set transactionSize [expr int( $transactionSize )]\n+                \n+            set commandId [string range $buffer 20 20]\n+\n+            set commandDetailsSize [string range $buffer 21 40]\n+            set commandDetailsSize [string trimleft $commandDetailsSize \"0\"]\n+            set commandDetailsSize [expr int( $commandDetailsSize )]\n+        \n+            set buffer [string range $buffer 41 [string length $buffer]]\n+        \n+        }\n+\n+        if { $commandDetailsSize > 0 && [string length $commandDetails] == 0 && $totalBytesRead >= [expr 41 + $commandDetailsSize] } {\n+            set commandDetails [string range $buffer 0 [expr $commandDetailsSize - 1]]\n+        \n+            set buffer [string range $buffer $commandDetailsSize [string length $buffer]]\n+        }\n+\n+        if { $commandId == 0 && $dataSize == -1 && $commandDetailsSize > 0 } {\n+            set dataSize [string range $buffer 0 19]\n+        \n+            if { [string length $dataSize] > 0 } {\n+    \n+                set dataSize [string trimleft $dataSize \"0\"]\n+                set dataSize [expr int( $dataSize )]\n+                set buffer [string range $buffer 20 [string length $buffer]]\n+    \n+            } else {\n+                set dataSize 0\n+            }\n+        }\n+\n+        if { $transactionSize > 0 && $totalBytesRead >= $transactionSize } { \n+            set endSocketRead 1\n+            if { $totalBytesRead > $transactionSize } {\n+                file delete -- $fileTransferClient::debug_file_name\n+                set hitTime [clock format [clock seconds]]\n+                debug \"In PROC getTransferOutcome : hit endSocketRead\"\n+                debug \"In PROC getTransferOutcome : the time is $hitTime\"\n+                debug \"In PROC getTransferOutcome : totalBytesRead = $totalBytesRead, transactionSize = $transactionSize\"\n+                debug \"In PROC getTransferOutcome : commandId = $commandId, commandDetailsSize = $commandDetailsSize\"\n+                debug \"In PROC getTransferOutcome : commandDetails = $commandDetails\"\n+                debug \"In PROC getTransferOutcome : bytes read are '$buffer'\"\n+            }\n+        }\n+\n+       if { $destinationFileId != \"\" && $dataSize != -1 } {\n+           puts -nonewline $destinationFileId $buffer\n+\t       flush $destinationFileId\n+           set buffer \"\"\n+       }\n+    }\n+    \n+    closeTclServerConnection\n+\n+    if { $totalBytesRead - [expr 41 + $commandDetailsSize] >= $dataSize && $commandId == 0 } {\n+\n+        set transferOutcomeDetails \"SUCCESS\"\n+        set returnValue 0\n+\n+    } else {\n+        set transferOutcomeDetails $commandDetails\n+    }\n+\n+    return $returnValue\n+}\n+\n+\n+\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/ftp.tcl b/dep/tclclient/ixTcl1.0/Generic/ftp.tcl\nnew file mode 100644\nindex 00000000..2241df90\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/ftp.tcl\n@@ -0,0 +1,154 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: ftp.tcl\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tDescription:  This file contains utilities FileTransfer\n+#\n+#\tRevision Log:\n+#\tDate\t\tAuthor\t\t\t\tComments\n+#\t-----------\t-------------------\t--------------------------------------------\n+#   10/25/2000  ds          \t\tinitial release\n+#\n+##################################################################################\n+\n+package require FTP\n+\n+########################################################################################\n+# Procedure:\tputFtpLogWindow\n+#\n+# Description: \tWrite a message to the ftp log window\n+#\t\t\t\t\n+# Input:\t\ttextEntry\n+#\n+########################################################################################\n+proc putFtpLogWindow {textEntry} \\\n+{\n+    logMsg $textEntry\n+}\n+\n+\n+########################################################################################\n+# Procedure:\tixFileSend\n+#\n+# Description: \tFTP protocol stuff... \n+#\n+# Input:\n+#\n+########################################################################################\n+proc ixFileSend {ipAddress filename username password sourceDirectory destDirectory} \\\n+{\n+    set retCode 0\n+\n+    global ftpDone\n+\n+    putFtpLogWindow \"ipAddress=$ipAddress\\nfilename=$filename\\nusername=$username\\npassword=$password\\nsourceDirectory=$sourceDirectory\\ndestDirectory=$destDirectory\"\n+\n+    set retCode 1\n+    if {[file isdirectory $destDirectory]} {\n+        if {![FTP::Open $ipAddress $username $password  -mode passive]} {\n+            putFtpLogWindow\"Error opening FTP session\"\n+            set retCode 2\n+        } else {\n+            if {![FTP::Get $sourceDirectory$filename $destDirectory$filename]} {\n+                putFtpLogWindow \"Error getting file $sourceDirectory$filename\"\n+                set retCode 3\n+            }\n+        }\n+        FTP::Close\n+    } else {\n+        putFtpLogWindow \"Error - invalid destination directory $destDirectory\"\n+        set retCode 4\n+    }\n+\n+    set ftpDone $retCode\n+\n+    if {$ftpDone == 1} {\n+        set retCode 0\n+    } else {\n+        set retCode 1\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure:\tixFileTransferStart\n+#\n+# Description: \tFTP protocol stuff... \n+#\n+# Input:\n+#\n+########################################################################################\n+proc ixFileTransferStart { ipAddress filename username password sourceDirectory destDirectory } \\\n+{\n+    global ixTclSvrHandle ftpDone\n+\n+    set retCode 0\n+\n+    ixFileSend $ipAddress $filename $username $password $sourceDirectory $destDirectory\n+\n+    set ftpDone 0\n+    while {$ftpDone==0} {\n+        ;# Make a time out counter here\n+        ;# probably count to about 100 then\n+        ;# a failure should be returned\n+        set x 0\n+        after 1000 {set x 1}\n+        vwait x\n+    }\n+  \n+    switch $ftpDone {\n+        1 {\n+            ixPuts \"File transfer complete.\"\n+        }\n+        2 {\n+            ixPuts \"Error opening FTP session on $ipAddress, username:$username.\"\n+            set retCode 1\n+        }\n+        3 {\n+            ixPuts \"Error transferring file $sourceDirectory$filename to $destDirectory$filename.\"\n+            set retCode 1\n+        }\n+        4 {\n+            ixPuts \"Error - invalid destination directory $destDirectory\"\n+            set retCode 1\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/highLevelAPI.tcl b/dep/tclclient/ixTcl1.0/Generic/highLevelAPI.tcl\nnew file mode 100644\nindex 00000000..3e822dc6\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/highLevelAPI.tcl\n@@ -0,0 +1,2642 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: highLevelAPI.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#   Revision Log:\n+#   04-28-1998  HS  Genesis\n+#\n+# Description:\n+#   This file contains high level Tcl API commands.\n+#\n+###################################################################################\n+\n+\n+###############################################################################\n+# Procedure:    ixInitialize\n+#\n+# Description: This procedure loads the IXIA Tcl package, sets the name of log\n+#              and debug files, and performs any other initializations, if necessary.\n+#\n+# Argument(s):\n+#    chassisList - List of hostnames or IP addresses of chassis in a chain.\n+#    cableLen    - Optional.  The cable length choice.  If not passed then cable3feet.\n+#    logfilename - Optional.  The name of the file for the test logs output.\n+#                  If not passed, then is blank.\n+#    client      - Optional.  The name of the client.  Defaults to local.  Currently unused\n+#\n+# Returns:\n+#    0 : if no error\n+#    1 : if error connecting to chassis\n+#    2 : if version mismatch\n+#    3 : if chassis timeout occurred\n+#    4 : if connection interrupted by user\n+#    5 : if error connecting to Tcl server\n+###############################################################################\n+proc ixInitialize {chassisList {cableLen cable3feet} {logfilename \"\"} {client local}} \\\n+{\n+    set tclServer [lindex $chassisList 0]\n+    set retCode [ixProxyConnect $tclServer $chassisList $cableLen $logfilename]\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure:   ixConnectToChassis\n+#\n+# Description: This procedure connects to a list of chassis. An ID number is assigned to\n+#              the chassis in sequence starting from 1 in the order that the list is passed.\n+#              The first chassis in the list is assigned as the master chassis.\n+#\n+# Argument(s):\n+#    chassisList - The list of hostnames or IP addresses of chassis in a chain\n+#    cableLength - Optional.  The length of the cables between the chassis.  If not passed in,\n+#                  then uses cable3feet.  Note - may be a list of lengths, one for each chassis\n+#                  in the chassisList.\n+#\n+# Returns:\n+#    0 : if no error\n+#    1 : if error connecting to chassis\n+#    2 : if version mismatch, ixTcl_versionMismatch\n+#    3 : if chassis timeout occurred, ixTcl_chassisTimeout\n+#    4 : if connection interrupted by user\n+########################################################################################\n+proc ixConnectToChassis {chassisList {cableLength cable3feet}} \\\n+{\n+    return [connectToChassis $chassisList $cableLength]\n+}\n+\n+\n+########################################################################################\n+# Procedure:   ixConnectToTclServer\n+#\n+# Description: This procedure connects a unix  \n+#\n+# Argument(s):\n+#    serverName - Ip addr/name of TclServer\n+#\n+# Returns:\n+#    0 - if no error\n+#    1 - if any error found\n+########################################################################################\n+proc ixConnectToTclServer {serverName} \\\n+{\n+    return [tclServer::connectToTclServer $serverName errMsg]\n+}\n+\n+\n+########################################################################################\n+# Procedure:   ixDisconnectTclServer\n+#\n+# Description: This procedure disconnects from the TclServer\n+#\n+# Argument(s): \n+#    serverName - UNUSED.  Still exists for backwards script support\n+#\n+# Returns:\n+########################################################################################\n+proc ixDisconnectTclServer {{serverName \"\"}} \\\n+{\n+    return [tclServer::disconnectTclServer]\n+}\n+\n+\n+########################################################################################\n+# Procedure:   ixGetChassisID\n+#\n+# Description: This procedure gets the chassis ID of the specified chassis name. It is\n+#              useful when multiple chassis are chained together.\n+#\n+# Argument(s):\n+#    chassisName - chassis name for which ID is to be obtained\n+#\n+# Returns:\n+#    -1 - if error found\n+#    chasissID - ID number of the chassis\n+########################################################################################\n+proc ixGetChassisID {chassisName} \\\n+{\n+    if [chassis get $chassisName] {\n+        ixPuts \"Error getting parameters for chassis $chassisName\"\n+        return -1\n+    }\n+    set chassisID [chassis cget -id]\n+    return $chassisID\n+}\n+\n+\n+########################################################################################\n+# Procedure:   ixDisconnectFromChassis\n+#\n+# Description: Disconnects from input chassis or list of chassis; if no arg given, then\n+#              will removeAll.\n+#\n+# Argument(s):\n+#    args - list of chassis to del; if empty, removeAll\n+#\n+# Returns:\n+#    0 - if no error\n+#\n+########################################################################################\n+proc ixDisconnectFromChassis {args} \\\n+{\n+    if {[llength $args] == 0} {\n+        chassisChain removeAll\n+    } else {\n+        foreach host $args {\n+            chassis del $host\n+        }\n+    }\n+    return 0\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixGlobalSetDefault\n+#\n+# Description: This command calls the setDefault for all the stream/port related\n+#              commands as a form of initialization.\n+#\n+# Arguments:   None\n+#\n+# Returns:     Nothing\n+########################################################################\n+proc ixGlobalSetDefault {} \\\n+{\n+    globalSetDefault\n+}\n+\n+\n+########################################################################################\n+# Procedure:   ixStartTransmit\n+#\n+# Description: Starts transmission on the specific ports\n+#\n+# Arguments:\n+#    PortList - Represented in Chassis Card Port and can be a list also, example {1,1,1 1,1,2}\n+#\n+# Returns:\n+########################################################################################\n+proc ixStartTransmit {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [startTx portList]\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixStartPortTransmit\n+#\n+# Description: This command starts Transmit on a single port; it will also stop transmit &\n+#              zero stats on this port before transmitting.\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Return:\n+#    0 if OK, 1 if port not configured\n+########################################################################\n+proc ixStartPortTransmit {chassis lm port} \\\n+{\n+    return [startPortTx $chassis $lm $port]\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixStartStaggeredTransmit\n+#\n+# Description: This command arms each Tx port & then sends out a pulse to the master\n+#              to begin transmitting\n+#\n+# Arguments:\n+#    PortList - Represented in Chassis Card Port and can be a list also, for ex. {1,1,1 1,1,2}\n+#\n+# Returns:\n+########################################################################\n+proc ixStartStaggeredTransmit {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [startStaggeredTx portList]\n+}\n+\n+\n+########################################################################################\n+# Procedure:   ixStopTransmit\n+#\n+# Description: Stops transmission on the specific ports\n+#\n+# Arguments:\n+#    PortList - Represented in Chassis Card Port and can be a list also, for ex. {1,1,1 1,1,2}\n+#\n+# Returns:\n+########################################################################################\n+proc ixStopTransmit {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [stopTx portList]\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixStopPortTransmit\n+#\n+# Description: This command stops Tx on a single port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Return:      0 if OK, 1 if port not configured\n+########################################################################\n+proc ixStopPortTransmit {chassis lm port} \\\n+{\n+    return [stopPortTx $chassis $lm $port]\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixStartCapture\n+#\n+# Description: This command turns on capture for each Rx port\n+#\n+# Arguments:\n+#    PortList - Represented in Chassis Card Port and can be a list also for ex. {1,1,1 1,1,2}\n+#\n+# Returns:\n+########################################################################\n+proc ixStartCapture {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [startCapture portList]\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixStartPrbsCapture\n+#\n+# Description: This command turns on capture and Packet Groups for each Rx port\n+#\n+# Arguments:\n+#    PortList - Represented in Chassis Card Port and can be a list also for ex. {1,1,1 1,1,2}\n+#\n+# Returns:\n+########################################################################\n+proc ixStartPrbsCapture {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [startPrbsCapture portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStopCapture\n+#\n+# This command stops capture for each Rx port\n+#\n+# Arguments:\n+#      PortList  - Represented in Chassis Card Port and can be a list also\n+#                  for ex. {1,1,1 1,1,2}\n+#\n+########################################################################\n+proc ixStopCapture {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [stopCapture portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStopPrbsCapture\n+#\n+# This command stops capture and Packet Groups for each Rx port\n+#\n+# Arguments:\n+#      PortList  - Represented in Chassis Card Port and can be a list also\n+#                  for ex. {1,1,1 1,1,2}\n+#\n+########################################################################\n+proc ixStopPrbsCapture {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [stopPrbsCapture portList]\n+}\n+\n+########################################################################\n+# Procedure: ixClearPrbsCapture\n+#\n+# This command clears PRBS capture for each Rx port\n+#\n+# Arguments:\n+#      PortList  - Represented in Chassis Card Port and can be a list also\n+#                  for ex. {1,1,1 1,1,2}\n+#\n+########################################################################\n+proc ixClearPrbsCapture {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [clearPrbsCapture portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStartPortCapture\n+#\n+# This command starts capture on a single port;\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Return:\n+#    0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixStartPortCapture {chassis lm port} \\\n+{\n+    return [startPortCapture $chassis $lm $port]\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: ixStartPortPrbsCapture\n+#\n+# This command starts capture and Packet Groups on a single port;\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Return:\n+#    0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixStartPortPrbsCapture {chassis lm port} \\\n+{\n+    return [startPortPrbsCapture $chassis $lm $port]\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: ixStopPortCapture\n+#\n+# This command stops capture on a single port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Return:\n+#    1 if OK, 0 if port not configured\n+#\n+########################################################################\n+proc ixStopPortCapture {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+    return [stopPortCapture $chassis $lm $port]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStopPortPrbsCapture\n+#\n+# This command stops capture and Packet Groups on a single port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Return:\n+#    1 if OK, 0 if port not configured\n+#\n+########################################################################\n+proc ixStopPortPrbsCapture {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+    return [stopPortPrbsCapture $chassis $lm $port]\n+}\n+\n+########################################################################\n+# Procedure: ixClearPortPrbsCapture\n+#\n+# This command clears PRBS capture on a single port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Return:\n+#    1 if OK, 0 if port not configured\n+#\n+########################################################################\n+proc ixClearPortPrbsCapture {chassis lm port {groupId 710} {create create} {destroy destroy}} \\\n+{\n+    return [clearPortPrbsCapture $chassis $lm $port]\n+}\n+\n+\n+########################################################################################\n+#  Procedure  :  ixClearStats\n+#\n+#  Description:  Clear statistics counters on the specific ports\n+#\n+#  Arguments  :\n+#      ports     - Represented in Chassis Card Port and can be a list also\n+#                  for ex. {1,1,1 1,1,2}\n+#\n+########################################################################################\n+proc ixClearStats {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [zeroStats portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixClearPortStats\n+#\n+# This command zeros all stats & stops the specified port if transmitting\n+#\n+# Argument(s):\n+#    chassis     chassis ID\n+#    lm          Load Module number\n+#    port        port number\n+#\n+########################################################################\n+proc ixClearPortStats {chassis lm port} \\\n+{\n+    return [zeroPortStats $chassis $lm $port]\n+}\n+\n+########################################################################################\n+#  Procedure  :  ixClearPerStreamTxStats\n+#\n+#  Description:  Clear per stream Tx statistics counters on the portList\n+#\n+#  Arguments  :\n+#      PortList     - Represented in Chassis Card Port and can be a list also\n+#                  for ex. {1,1,1 1,1,2}\n+#\n+########################################################################################\n+proc ixClearPerStreamTxStats {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [clearPerStreamTxStats portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixClearPerStreamTxPortStats\n+#\n+# This command zeros all stream Tx stats on this port\n+#\n+# Argument(s):\n+#    chassis     chassis ID\n+#    lm          Load Module number\n+#    port        port number\n+#\n+########################################################################\n+proc ixClearPerStreamTxPortStats {chassis lm port} \\\n+{\n+    return [clearPerStreamTxPortStats $chassis $lm $port]\n+}\n+\n+\n+########################################################################################\n+# Procedure: ixRequestStats\n+#\n+# Description: This command combines the statGroup w/a portList or map array to request \n+#              stats for a list of ports. statList command must be used to retrieve stats\n+#              after call completion.\n+#\n+# Arguments:\n+#    TxRxArray - either list of ports or array of ports\n+#                     \n+# Returns:\n+#       TCL_OK or TCL_ERROR\n+#\n+########################################################################################\n+proc ixRequestStats {TxRxArray} \\\n+{\n+    upvar $TxRxArray   txRxArray\n+\n+    return [requestStats txRxArray]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixClearTimeStamp\n+#\n+# This command synchronizes the timestamp value among all chassis\n+#\n+# Arguments:\n+#      PortList  - Represented in Chassis Card Port and can be a list also\n+#                  for ex. {1,1,1 1,1,2}\n+#\n+########################################################################\n+proc ixClearTimeStamp {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [clearTimeStamp portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStartPacketGroups\n+#\n+# This command arms each Rx port & then sends out a pulse to the master\n+# to initiate packetGroup stats\n+#\n+# Arguments:\n+#      PortList  - Represented in Chassis Card Port and can be a list also\n+#                  for ex. {1,1,1 1,1,2}\n+#\n+########################################################################\n+proc ixStartPacketGroups {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [startPacketGroups portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStartPortPacketGroups\n+#\n+# This command starts packetGroup stats on a single port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Return:\n+#    0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixStartPortPacketGroups {chassis lm port} \\\n+{\n+    return [startPortPacketGroups $chassis $lm $port]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStopPacketGroups\n+#\n+# This command arms each Rx port & then sends out a pulse to the master\n+# to stop packetGroup stats\n+#\n+# Arguments:\n+#      PortList  - Represented in Chassis Card Port and can be a list also\n+#                  for ex. {1,1,1 1,1,2}\n+#\n+########################################################################\n+proc ixStopPacketGroups {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [stopPacketGroups portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixClearPacketGroups\n+#\n+# This command arms each Rx port & then sends out a pulse to the master\n+# to clear packetGroup stats\n+#\n+# Arguments:\n+#      PortList  - Represented in Chassis Card Port and can be a list also\n+#                  for ex. {1,1,1 1,1,2}\n+#\n+########################################################################\n+proc ixClearPacketGroups {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [clearPacketGroups portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixClearPortPacketGroups\n+#\n+# This command clears packetGroup stats on a single port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Return:\n+#    0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixClearPortPacketGroups {chassis lm port} \\\n+{\n+    return [clearPortPacketGroups $chassis $lm $port]\n+}\n+\n+########################################################################\n+# Procedure:   ixSetScheduledTransmitTime\n+#\n+# Description: This command sets scheduled transmit time on given port list\n+#\n+# Arguments:\n+#    PortList - List of ports; for ex. {{1 1 1} {1 1 2}}\n+#\n+# Returns:\n+########################################################################\n+proc ixSetScheduledTransmitTime {PortList duration } \\\n+{\n+    upvar $PortList portList\n+\n+    return [setScheduledTransmitTime portList $duration]\n+}\n+\n+########################################################################\n+# Procedure:   ixClearScheduledTransmitTime\n+#\n+# Description: This command clears/resets scheduled transmit time on given \n+#              port list\n+#\n+# Arguments:\n+#    PortList - List of ports; for ex. {{1 1 1} {1 1 2}}\n+#\n+# Returns:\n+########################################################################\n+proc ixClearScheduledTransmitTime {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    set duration 0\n+    return [setScheduledTransmitTime portList $duration]\n+}\n+\n+########################################################################\n+# Procedure: ixStopPortPacketGroups\n+#\n+# This command stops packetGroup stats on a single port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Return:\n+#    0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixStopPortPacketGroups {chassis lm port} \\\n+{\n+    return [stopPortPacketGroups $chassis $lm $port]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStartCollisions\n+#\n+# This command arms each Rx port & then sends out a pulse to the master\n+# to initiate collisions\n+#\n+# Arguments:\n+#      PortList  - Represented in Chassis Card Port and can be a list also\n+#                  for ex. {1,1,1 1,1,2}\n+#\n+########################################################################\n+proc ixStartCollisions {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [startCollisions portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStartPortCollisions\n+#\n+# This command starts packetGroup stats on a single port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Return:\n+#    0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixStartPortCollisions {chassis lm port} \\\n+{\n+    return [startPortCollisions $chassis $lm $port]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStopCollisions\n+#\n+# This command arms each Rx port & then sends out a pulse to the master\n+# to stop collisions\n+#\n+# Arguments:\n+#      PortList  - Represented in Chassis Card Port and can be a list also\n+#                  for ex. {1,1,1 1,1,2}\n+#\n+########################################################################\n+proc ixStopCollisions {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [stopCollisions portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStopPortCollisions\n+#\n+# This command stops collisions on a single port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Return:\n+#    0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixStopPortCollisions {chassis lm port} \\\n+{\n+    return [stopPortCollisions $chassis $lm $port]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixLoadPoePulse\n+#\n+# This command loads the poe pulse\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc ixLoadPoePulse {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [loadPoePulse portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixLoadPortPoePulse\n+#\n+# This command loads the poe pulse on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixLoadPortPoePulse {chassis lm port} \\\n+{\n+    return [loadPortPoePulse $chassis $lm $port]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixArmPoeTrigger\n+#\n+# This command arms the poe trigger\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc ixArmPoeTrigger {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [armPoeTrigger portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixArmPortPoeTrigger\n+#\n+# This command arms the poe trigger on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixArmPortPoeTrigger {chassis lm port} \\\n+{\n+    return [armPortPoeTrigger $chassis $lm $port]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixAbortPoeArm\n+#\n+# This command aborts the poe trigger\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc ixAbortPoeArm {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [abortPoeArm portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixAbortPortPoeArm\n+#\n+# This command aborts the poe trigger on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixAbortPortPoeArm {chassis lm port} \\\n+{\n+    return [abortPortPoeArm  $chassis $lm $port]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStartAtmOamTransmit\n+#\n+# This command starts the atm oam transmit\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc ixStartAtmOamTransmit {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [startAtmOamTransmit portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStartPortAtmOamTransmit\n+#\n+# This command starts the atm oam transmit on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixStartPortAtmOamTransmit {chassis lm port} \\\n+{\n+    return [startPortAtmOamTransmit $chassis $lm $port]\n+}\n+\n+########################################################################\n+# Procedure: ixStopAtmOamTransmit\n+#\n+# This command starts the atm oam transmit\n+#\n+# Argument(s):\n+#\tPortArray\t            either list of ports or array of ports\n+#\n+########################################################################\n+proc ixStopAtmOamTransmit {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    return [stopAtmOamTransmit portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixStopPortAtmOamTransmit\n+#\n+# This command starts the atm oam transmit on a single port.\n+# \n+#\n+# Arguments(s):\n+#\tchassis\n+#\tlm\n+#\tport\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixStopPortAtmOamTransmit {chassis lm port} \\\n+{\n+    return [stopPortAtmOamTransmit $chassis $lm $port]\n+}\n+\n+\n+\n+\n+########################################################################################\n+#  Procedure  :  ixCreatePortListWildCard\n+#\n+#  Description:  This commands creates a list of ports in a sorted order based on the\n+# physical slots. It accepts * as a wild card to indicate all cards or all ports on a\n+# card. A wild card cannot be used for chassis ID. Also, if a combination of a list\n+# element containing wild cards and port numbers are passed, then the port list passed\n+# MUST be in a sorted order, otherwise the some of those ports might not make it in the\n+# list. For example,\n+# ixCreatePortListWildCard {1 * *} - all cards and all ports on chassis 1\n+# ixCreatePortListWildCard {{1 1 *} {1 2 1} { 1 2 2}} - all ports on card 1 and\n+#                           ports 1 and 2 on card 2.\n+#\n+#  Arguments  :\n+#      portList         - Represented in Chassis Card Port and can be a list also\n+#      excludePorts     - exclude these ports from the sorted port list\n+#\n+########################################################################################\n+proc ixCreatePortListWildCard {portList {excludePorts {}}} \\\n+{\n+    set retList {}\n+\n+    # If excludePorts is passed as a single list, then put braces around it\n+    if {[llength $excludePorts] == 3 && [llength [lindex $excludePorts 0]] == 1} {\n+        set excludePorts [list $excludePorts]\n+    }\n+\n+    foreach portItem $portList {\n+        scan [join [split $portItem ,]] \"%s %s %s\" ch fromCard fromPort\n+    \n+        set origFromPort    $fromPort\n+\n+        if { $ch == \"*\"} {\n+            errorMsg \"Chassis ID cannot be a wildcard. Enter a valid number\"\n+            return $retList\n+        }\n+\n+        if [chassis getFromID $ch] {\n+            errorMsg \"Chassis ID $ch has not been added to chassis chain.\"\n+            continue\n+        }\n+\n+        set maxCardsInChassis   [chassis cget -maxCardCount]\n+        if { $fromCard == \"*\"} {\n+            set fromCard 1\n+            set toCard   $maxCardsInChassis\n+        } else {\n+            set toCard   $fromCard\n+        }\n+\n+        for {set l $fromCard} {$l <= $toCard} {incr l} {\n+            if [card get $ch $l] {\n+                #errorMsg \"Error getting card $ch $l\"\n+                continue\n+            }\n+\n+            set maxPorts    [card cget -portCount]\n+\n+            if { $origFromPort == \"*\"} {\n+                set fromPort 1\n+                set toPort   $maxPorts\n+            } else {\n+                set toPort   $fromPort\n+            }\n+\n+            for {set p $fromPort} {$p <= $toPort} {incr p} {\n+                if [port get $ch $l $p] {\n+                    continue\n+                }\n+                if {[lsearch $excludePorts \"$ch $l $p\"] == -1 && [lsearch $retList \"$ch $l $p\"] == -1} {\n+                    lappend retList [list $ch $l $p]\n+                }\n+\n+            }\n+        }\n+    }\n+    \n+    if {[llength $retList] == 0} {\n+\t\terrorMsg \"Port list wild card is empty\"\n+\t}\n+\t\n+    return [lnumsort $retList]\n+}\n+\n+\n+########################################################################################\n+#  Procedure  :  ixCreateSortedPortList\n+#\n+#  Description:  This commands creates a list of ports in a sorted order based on the\n+# range of ports passed.\n+#\n+# For example - to add all ports on cards 1 through 5:\n+# ixCreateSortedPortList {{1 1 1} {1 5 4}}\n+#\n+#\n+#  Arguments  :\n+#       portListFrom     - First port\n+#       portListTo       - Last port\n+#\n+########################################################################################\n+proc ixCreateSortedPortList {portListFrom portListTo excludePortList} \\\n+{\n+    scan $portListFrom \"%d %d %d\" fromChassis fromCard fromPort\n+    scan $portListTo \"%d %d %d\" toChassis toCard toPort\n+    set sortMap {}\n+\n+    for {set c $fromChassis} {$c <= $toChassis} {incr c} {\n+        if [chassis get $c] {\n+            errorMsg \"Chassis ID $c has not been added to chassis chain.\"\n+            continue\n+        }\n+\n+        set maxCardsInChassis   [chassis cget -maxCardCount]\n+\n+        if {$c == $fromChassis} {\n+            set firstCard   $fromCard\n+        } else {\n+            set firstCard   1\n+        }\n+        if {$c == $toChassis} {\n+            if {$maxCardsInChassis < $toCard} {\n+                set currLastCard    $maxCardsInChassis\n+            } else {\n+                set currLastCard    $toCard\n+            }\n+        } else {\n+            set currLastCard    $maxCardsInChassis\n+        }\n+\n+        for {set l $firstCard} {$l <= $currLastCard} {incr l} {\n+            if [card get $c $l] {\n+                ixPuts \"Error getting card $l on chassis $c\"\n+                return 1\n+            }\n+            set numports    [card cget -portCount]\n+            if {$numports == 0} {\n+                continue\n+            }\n+\n+            if {($c == $fromChassis) && ($l == $fromCard)} {\n+                set firstPort   $fromPort\n+            } else {\n+                set firstPort   1\n+            }\n+\n+            if {($c == $toChassis) && ($l == $toCard)} {\n+                if {$numports < $toPort} {\n+                    set currLastPort    $numports\n+                } else {\n+                    set currLastPort    $toPort\n+                }\n+            } else {\n+                set currLastPort    [card cget -portCount]\n+            }\n+\n+            for {set p $firstPort} {$p <= $currLastPort} {incr p} {\n+                if {[lsearch $excludePortList \"$c $l $p\"] != -1} {\n+                    continue\n+                }\n+                set sortMap [lappend sortMap [list $c $l $p]]\n+            }\n+        }\n+    }\n+    return $sortMap\n+}\n+\n+\n+########################################################################################\n+#  Procedure : ixPuts\n+#\n+#  Description:  This command is similar to \"puts\" except that it has an update command\n+# so that the output queue gets flushed and the message gets printed immediately. In\n+# Window 95/NT platform, the \"puts\" command does not print the messages rightaway.\n+#\n+#  Arguments :\n+#       args - Message to display\n+#\n+########################################################################################\n+proc ixPuts {args} \\\n+{\n+    catch {\n+        if {[lindex $args 0] == \"-nonewline\"} {\n+            set args [lreplace $args 0 0]\n+            puts -nonewline [logger cget -ioHandle] [join $args \" \"]\n+        } else {\n+            puts [logger cget -ioHandle] [join $args \" \"]\n+        }\n+\n+        # Reported that the update blocks the display on Solaris using wish8.0\n+        # so use update idletasks instead\n+        update\n+    }\n+}\n+\n+\n+########################################################################################\n+#  Procedure  :  ixiaPortSetParms\n+#\n+#  Description:  This procedure sets specific port parameters\n+#\n+#  Arguments  :  chassis - Chassis ID\n+#                card    - Card Number\n+#                port    - Port Number\n+#                parm    - Parameter to be set\n+#                value   - Value to set\n+########################################################################################\n+proc ixiaPortSetParms {chassis card port parm value} \\\n+{\n+   if [port get $chassis $card $port]  {\n+      ixPuts \"Error getting port $chassis $card $port from HAL\"\n+      return 1\n+   }\n+\n+   puts \"port config -$parm $value\"\n+\n+   port config -$parm $value\n+\n+   if [port set $chassis $card $port] {\n+      ixPuts \"Error setting port $chassis $card $port in HAL\"\n+      return 1\n+   }\n+   if [port write $chassis $card $port] {\n+      ixPuts \"Error writing port $chassis $card $port in Hardware\"\n+      return 1\n+   }\n+\n+   return 0\n+}\n+\n+\n+########################################################################################\n+#  Procedure  : ixiaReadWriteMII\n+#\n+#  Description: This procedure will read/write values from/to the MII <register>\n+#               on <ports>.   4 character hex string and Action will be READ or\n+#               WRITE.   register will be a value between 0 and 31\n+#\n+#  Arguments  :\n+#      ports     - Represented in Chassis Card Port and can be a list also\n+#                  for ex. {1,1,1 1,1,2}\n+#      action    - READ or WRITE\n+#      register  - Value between 0 and 31\n+#      code      - 4 character hex string\n+#\n+########################################################################################\n+\n+proc ixiaReadWriteMII {ports action register code} \\\n+{\n+\n+  if {($action != \"READ\") && ($action != \"WRITE\")} {\n+     ixPuts \"Error: Action parameter error use READ or WRITE\"\n+     return 1\n+     }\n+  if {($register < 0) || ($register > 31)} {\n+     ixPuts \"Error: register parameter error - valid range between 0 - 31\"\n+     return 1\n+     }\n+\n+  set retValues {}\n+\n+  foreach prt $ports {\n+     scan $prt \"%d %d %d\" c l p\n+     mii get $c $l $p\n+\n+     if {$action == \"READ\"} {\n+        set val [mii cget -registerValue]\n+        lappend retValues $val\n+        }\n+\n+     mii configure -miiRegister $register\n+     mii configure -registerValue $code\n+     if {$action == \"WRITE\"} {\n+        if [mii set $c $l $p] {\n+           errorMsg \"Error setting Mii [getPortId $c $l $p] in HAL.\"\n+           return 1\n+        }\n+        if [mii write $c $l $p] {\n+           errorMsg \"Error setting Mii [getPortId $c $l $p] in HAL.\"\n+           return 1\n+        }\n+     }\n+  }\n+\n+#\n+#  This procedure is set up to return a list of MII register values for multiple ports\n+#  however if only one port is fed to it then one value will be return.  It works with\n+#  either multiple ports or a single port in the $ports list\n+#\n+  if {$action == \"READ\"} {\n+     return $retValues\n+  } else {\n+     return 0\n+  }\n+}\n+\n+\n+########################################################################################\n+# Procedure: ixTclSvrConnect\n+#\n+# Description: This procedure launches the Tcl Server on the chassis for multi-users.\n+#\n+# Argument(s):\n+#       serverName         name of hostnames or IP address of chassis to connect to\n+#\n+########################################################################################\n+proc ixTclSvrConnect { serverName } \\\n+{\n+    return [tclServer::connectToTclServer $serverName errMsg]\n+}\n+\n+\n+########################################################################################\n+# Procedure: ixTclSvrDisconnect\n+#\n+# Description: This procedure disconnects from the TclServer socket.\n+#\n+#\n+########################################################################################\n+proc ixTclSvrDisconnect {} \\\n+{\n+    return [tclServer::disconnectTclServer]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixEnableArpResponse\n+#\n+# This command gets the MAC & IP addresses for that port, sets up the\n+# address table and enables the arp response engine for all ports in\n+# the portlist\n+#\n+# Arguments(s):\n+#   mapType - either oneIpToOneMAC or manyIpToOneMAC\n+#   PortMap - list or array of ports, ie. ixgSortMap\n+#\n+# Return:\n+#       0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixEnableArpResponse { mapType PortMap } \\\n+{\n+    upvar $PortMap   portMap\n+    return [enableArpResponse $mapType portMap write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixEnablePortArpResponse\n+#\n+# This command gets the MAC & IP addresses for that port, sets up the\n+# address table and enables the arp response engine for the specified port\n+#\n+# Arguments(s):\n+#   mapType - either oneIpToOneMAC or manyIpToOneMAC\n+#   chassis\n+#   lm\n+#   port\n+#\n+# Return:\n+#       0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixEnablePortArpResponse { mapType chassis lm port {write write}} \\\n+{\n+    return [enablePortArpResponse $mapType $chassis $lm $port $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixDisableArpResponse\n+#\n+# This command disables the arp response engine for all ports in\n+# the portlist\n+#\n+# Arguments(s):\n+#   PortMap - list or array of ports, ie. ixgSortMap\n+#\n+# Return:\n+#       0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixDisableArpResponse { PortMap } \\\n+{\n+    upvar $PortMap   portMap\n+\n+    return [disableArpResponse portMap write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixTransmitArpRequest\n+#\n+# This command transmits an Arp request via the protocol server.\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to transmit\n+#                     arp request on\n+#\n+########################################################################\n+proc ixTransmitArpRequest {TxRxArray} \\\n+{\n+    upvar $TxRxArray        txRxArray\n+\n+    return [transmitArpRequest txRxArray]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixClearArpTable\n+#\n+# This command clears the arp table via the protocol server.\n+#\n+# Arguments:\n+#   TxRxArray       - either array or list containing ports to clear\n+#                     arp table on\n+#\n+########################################################################\n+proc ixClearArpTable {TxRxArray} \\\n+{\n+    upvar $TxRxArray        txRxArray\n+\n+    return [clearArpTable txRxArray]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixDisablePortArpResponse\n+#\n+# This command disables the arp response engine for the specified port\n+#\n+# Arguments(s):\n+#   chassis\n+#   lm\n+#   port\n+#\n+# Return:\n+#       0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixDisablePortArpResponse {chassis lm port {write write}} \\\n+{\n+    return [disablePortArpResponse $chassis $lm $port $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixTransmitPortArpRequest\n+#\n+# This command transmits an Arp request via the protocol server on a\n+# single port\n+#\n+# Arguments(s):\n+#       chassis\n+#       lm\n+#       port\n+#\n+# Return:\n+#       0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixTransmitPortArpRequest {chassis lm port} \\\n+{\n+    return [transmitPortArpRequest $chassis $lm $port]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixClearPortArpTable\n+#\n+# This command clears the arp table on a single port\n+#\n+# Arguments(s):\n+#       chassis\n+#       lm\n+#       port\n+#\n+# Return:\n+#       0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixClearPortArpTable {chassis lm port} \\\n+{\n+    return [clearPortArpTable $chassis $lm $port]\n+}\n+\n+########################################################################\n+# Procedure: ixSetPacketGroupMode\n+#\n+# This command sets all the RX ports in the list or array to packet\n+# group mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+# Return:\n+#       0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixSetPacketGroupMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray    txRxArray\n+\n+    return [setPacketGroupMode txRxArray $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetPortPacketGroupMode\n+#\n+# This command sets all the RX ports for this port to packet\n+# group mode\n+#\n+# Arguments(s):\n+#   chassis\n+#   lm\n+#   port\n+#   write           - write port to hw\n+#\n+# Return:\n+#       0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixSetPortPacketGroupMode {chassis lm port {write nowrite}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if [catch {format \"%d,%d,%d\" $chassis $lm $port} txRxArray] {\n+        errorMsg $txRxArray\n+        set retCode $::TCL_ERROR\n+    } else {\n+        set retCode [setPacketGroupMode txRxArray $write]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetAutoDetectInstrumentationMode\n+#\n+# This command sets all the RX ports in the list or array to \n+# all the autoinstrumentation modes PG/DataIntegrity/SequenceChecking\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+# Return:\n+#       0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixSetAutoDetectInstrumentationMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray    txRxArray\n+\n+    return [setAutoDetectInstrumentationMode txRxArray $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetPortAutoDetectInstrumentationMode\n+#\n+# This command sets all the RX ports for this port to \n+# all the autoinstrumentation modes PG/DataIntegrity/SequenceChecking\n+#\n+# Arguments(s):\n+#   chassis\n+#   lm\n+#   port\n+#   write           - write port to hw\n+#\n+# Return:\n+#       0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixSetPortAutoDetectInstrumentationMode {chassis lm port {write nowrite}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if [catch {format \"%d,%d,%d\" $chassis $lm $port} txRxArray] {\n+        errorMsg $txRxArray\n+        set retCode $::TCL_ERROR\n+    } else {\n+        set retCode [setAutoDetectInstrumentationMode txRxArray $write]\n+    }\n+\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure: ixSetWidePacketGroupMode\n+#\n+# This command sets all the RX ports in the list or array to wide packet\n+# group mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+# Return:\n+#       0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixSetWidePacketGroupMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray    txRxArray\n+\n+    return [setWidePacketGroupMode txRxArray $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetPortWidePacketGroupMode\n+#\n+# This command sets all the RX ports for this port to wide packet\n+# group mode\n+#\n+# Arguments(s):\n+#   chassis\n+#   lm\n+#   port\n+#   write           - write port to hw\n+#\n+# Return:\n+#       0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixSetPortWidePacketGroupMode {chassis lm port {write nowrite}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if [catch {format \"%d,%d,%d\" $chassis $lm $port} txRxArray] {\n+        errorMsg $txRxArray\n+        set retCode $::TCL_ERROR\n+    } else {\n+        set retCode [setWidePacketGroupMode txRxArray $write]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetCaptureMode\n+#\n+# This command sets all the RX ports in the list or array to capture\n+# mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc ixSetCaptureMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [setCaptureMode txRxArray $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetPortCaptureMode\n+#\n+# This command sets receive mode for the specified port to capture mode\n+#\n+# Arguments(s):\n+#   chassis\n+#   lm\n+#   port\n+#   write           - write port to hw\n+#\n+########################################################################\n+proc ixSetPortCaptureMode {chassis lm port {write nowrite}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if [catch {format \"%d,%d,%d\" $chassis $lm $port} txRxArray] {\n+        errorMsg $txRxArray\n+        set retCode $::TCL_ERROR\n+    } else {\n+        set retCode [setCaptureMode txRxArray $write]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetTcpRoundTripFlowMode\n+#\n+# This command sets all the RX ports in the list or array to tcp round \n+# trip flow mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc ixSetTcpRoundTripFlowMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [setTcpRoundTripFlowMode txRxArray $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetPortTcpRoundTripFlowMode\n+#\n+# This command sets receive mode for the specified port to tcp round \n+# trip flow mode\n+#\n+# Arguments(s):\n+#   c        - chassis\n+#   l        - card\n+#   p        - port\n+#   write   - write port to hw\n+#\n+########################################################################\n+proc ixSetPortTcpRoundTripFlowMode {c l p {write nowrite}} \\\n+{\n+    set retCode 0\n+\n+    if [catch {format \"%d,%d,%d\" $c $l $p} txRxArray] {\n+        errorMsg \"$txRxArray\"\n+        set retCode 1\n+    } else {\n+        set retCode [setTcpRoundTripFlowMode txRxArray $write]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetDataIntegrityMode\n+#\n+# This command sets all the RX ports in the list or array to Data Integrity \n+# mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc ixSetDataIntegrityMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [setDataIntegrityMode txRxArray $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetPortDataIntegrityMode\n+#\n+# This command sets receive mode for the specified port to Data Integrity \n+# mode\n+#\n+# Arguments(s):\n+#   c        - chassis\n+#   l        - card\n+#   p        - port\n+#   write   - write port to hw\n+#\n+########################################################################\n+proc ixSetPortDataIntegrityMode {c l p {write nowrite}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if [catch {format \"%d,%d,%d\" $c $l $p} txRxArray] {\n+        errorMsg \"$txRxArray\"\n+        set retCode $::TCL_ERROR\n+    } else {\n+        set retCode [setDataIntegrityMode txRxArray $write]\n+    }\n+\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure: ixSetPrbsMode\n+#\n+# This command sets all the RX ports in the list or array to Prbs mode \n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc ixSetPrbsMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [setPrbsMode txRxArray $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetPortPrbsMode\n+#\n+# This command sets receive mode for the specified port to Prbs mode \n+#\n+# Arguments(s):\n+#   c        - chassis\n+#   l        - card\n+#   p        - port\n+#   write   - write port to hw\n+#\n+########################################################################\n+proc ixSetPortPrbsMode {c l p {write nowrite}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if [catch {format \"%d,%d,%d\" $c $l $p} txRxArray] {\n+        errorMsg \"$txRxArray\"\n+        set retCode $::TCL_ERROR\n+    } else {\n+        set retCode [setPrbsMode txRxArray $write]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetSequenceCheckingMode\n+#\n+# This command sets all the TX ports in the list or array to Sequence\n+# Checking Mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of RX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc ixSetSequenceCheckingMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [setSequenceCheckingMode txRxArray $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetPortSequenceCheckingMode\n+#\n+# This command sets receive mode for the specified port to Sequence\n+# Checking Mode\n+#\n+# Arguments(s):\n+#   c        - chassis\n+#   l        - card\n+#   p        - port\n+#   write   - write port to hw\n+#\n+########################################################################\n+proc ixSetPortSequenceCheckingMode {c l p {write nowrite}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if [catch {format \"%d,%d,%d\" $c $l $p} txRxArray] {\n+        errorMsg \"$txRxArray\"\n+        set retCode $::TCL_ERROR\n+    } else {\n+        set retCode [setSequenceCheckingMode txRxArray $write]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetPacketFlowMode\n+#\n+# This command sets all the TX ports in the list or array to packet\n+# flow mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of TX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc ixSetPacketFlowMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [setPacketFlowMode txRxArray $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetPortPacketFlowMode\n+#\n+# This command sets specified port to packet flow mode\n+#\n+# Arguments(s):\n+#   chassis\n+#   lm\n+#   port\n+#   write           - write port to hw\n+#\n+########################################################################\n+proc ixSetPortPacketFlowMode {c l p {write nowrite}} \\\n+{\n+    set retCode 0\n+\n+    if [catch {format \"%d,%d,%d\" $c $l $p} txRxArray] {\n+        logMsg \"ixSetPortPacketFlowMode: $txRxArray\"\n+        set retCode 1\n+    } else {\n+        set retCode [setPacketFlowMode txRxArray $write]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetPacketStreamMode\n+#\n+# This command sets all the TX ports in the list or array to packet\n+# stream mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of TX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc ixSetPacketStreamMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [setPacketStreamMode txRxArray $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetPortPacketStreamMode\n+#\n+# This command sets specified port to packet stream mode\n+#\n+# Arguments(s):\n+#   chassis\n+#   lm\n+#   port\n+#   write           - write port to hw\n+#\n+########################################################################\n+proc ixSetPortPacketStreamMode {chassis lm port {write nowrite}} \\\n+{\n+    set retCode 0\n+\n+    if [catch {format \"%d,%d,%d\" $chassis $lm $port} txRxArray] {\n+        logMsg \"ixSetPortPacketStreamMode: $txRxArray\"\n+        set retCode 1\n+    } else {\n+        set retCode [setPacketStreamMode txRxArray $write]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetAdvancedStreamSchedulerMode\n+#\n+# This command sets all the TX ports in the list or array to packet\n+# flow mode\n+#\n+# Arguments(s):\n+#   TxRxArray       - list or array of TX ports to change\n+#   write           - write ports to hw as they are modified\n+#\n+########################################################################\n+proc ixSetAdvancedStreamSchedulerMode {TxRxArray {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [changePortTransmitMode txRxArray $::portTxModeAdvancedScheduler $write]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixSetPortAdvancedStreamSchedulerMode\n+#\n+# This command sets specified port to packet flow mode\n+#\n+# Arguments(s):\n+#   chassis\n+#   lm\n+#   port\n+#   write           - write port to hw\n+#\n+########################################################################\n+proc ixSetPortAdvancedStreamSchedulerMode {c l p {write nowrite}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if [catch {format \"%d,%d,%d\" $c $l $p} txRxArray] {\n+        errorMsg \"$txRxArray\"\n+        set retCode $::TCL_ERROR\n+    } else {\n+        set retCode [setAdvancedStreamSchedulerMode txRxArray $write]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: ixWritePortsToHardware\n+#\n+# This command writes the ports, including speed, etc into hardware. It\n+# differs from writeConfigToHardware because this command writes all\n+# the phy as well as the configuration.\n+#\n+# Argument(s):\n+#    PortArray      either list of ports or array of ports\n+#    args           options include:\n+#                   -verbose             <turn on messages>\n+#                   -noVerbose           <turn off messages, default>\n+#                   -writeProtocolServer <stops protocol server & writes \n+#                                         all associated objects, default>\n+#                   -noProtocolServer    <no effect on protocol server,\n+#                                         doesn't update protocol server objects>\n+#\n+########################################################################\n+proc ixWritePortsToHardware {PortArray args} \\\n+{\n+    upvar $PortArray portArray\n+\n+    return [writePortsToHardware portArray [join [list -noVerbose $args]]]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixWriteConfigToHardware\n+#\n+# This command writes the port array into hardware\n+#\n+# Argument(s):\n+#    PortArray      either list of ports or array of ports\n+#    args           options include:\n+#                   -verbose             <turn on messages>\n+#                   -noVerbose           <turn off messages, default>\n+#                   -writeProtocolServer <stops protocol server & writes \n+#                                         all associated objects, default>\n+#                   -noProtocolServer    <no effect on protocol server,\n+#                                         doesn't update protocol server objects>\n+#\n+########################################################################\n+proc ixWriteConfigToHardware {PortArray args} \\\n+{\n+    upvar $PortArray portArray\n+\n+    return [writeConfigToHardware portArray [join [list -noVerbose $args]]]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixCheckTransmitDone\n+#\n+# This command polls the TX rate counters & returns when done transmitting\n+#\n+# Argument(s):\n+#    PortArray                either list of ports or array of ports\n+#\n+########################################################################\n+proc ixCheckTransmitDone {PortArray} \\\n+{\n+    upvar $PortArray portArray\n+\n+    return [checkAllTransmitDone portArray]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixCheckPortTransmitDone\n+#\n+# This command polls the TX rate counters & returns the number of frames\n+# transmitted\n+#\n+# Argument(s):\n+#    chassis        chassis ID\n+#    lm            Load Module number\n+#    port        port number\n+#\n+########################################################################\n+proc ixCheckPortTransmitDone {chassis lm port} \\\n+{\n+    return [checkTransmitDone $chassis $lm $port]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixCheckLinkState\n+#\n+# This command checks the link state of all ports in parallel and labels\n+# the ones that are down. Then it polls the links that are down for two\n+# seconds and returns 1 if any port is still down and a 0 if all ports are\n+# up.\n+#\n+# Arguments(s):\n+#    PortArray    array or list of ports, ie, ixgSortMap\n+#\n+########################################################################\n+proc ixCheckLinkState {PortArray {message messageOn}} \\\n+{\n+    upvar $PortArray portArray\n+\n+    return [checkLinkState portArray]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixCheckPPPState\n+#\n+# This command checks the PPP state of all PoS ports in parallel and labels\n+# the ones that are down. Then it polls the links that are down for two\n+# seconds and returns 1 if any port is still down and a 0 if all ports are\n+# up.\n+#\n+# Arguments(s):\n+#    PortArray    array or list of ports, ie, ixgSortMap\n+#\n+########################################################################\n+proc ixCheckPPPState {PortArray {message messageOn}} \\\n+{\n+    upvar $PortArray portArray\n+\n+    return [checkPPPState portArray $message]\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: ixCollectStats\n+#\n+# This command polls the RX counters for the specified stat\n+#\n+# Argument(s):\n+#   rxList          - list of receive ports\n+#   statName        - name of stat to poll (need cget name)\n+#   RxNumFrames     - array containing the returned rx stats\n+#   TotalRxFrames   - total received frames\n+#\n+########################################################################\n+proc ixCollectStats {rxList statName RxNumFrames TotalRxFrames} \\\n+{\n+    upvar $RxNumFrames        rxNumFrames\n+    upvar $TotalRxFrames    totalRxFrames\n+\n+    return [collectStats $rxList $statName rxNumFrames totalRxFrames]\n+}\n+\n+\n+########################################################################################\n+# Procedure:   ixProxyConnect\n+#\n+# Description: This command connects to the proxy server...\n+#\n+# Argument(s):\n+#    tclServer   - The name of the machine that is running an ixTclServer to connect with\n+#    chassisList - The list of hostnames or IP addresses of chassis in a chain\n+#    cableLen    - The choice of the cable length between chassis.  Defaults to cable3feet is not given\n+#    logFilename - The name of the file for the test logs output\n+#\n+# Returns:\n+#    0 : if no error\n+#    1 : if error connecting to chassis\n+#    2 : if version mismatch\n+#    3 : if chassis timeout occurred\n+#    4 : if connection interrupted by user\n+#    5 : if error connecting to Tcl server\n+########################################################################################\n+proc ixProxyConnect {tclServer chassisList {cableLen cable3feet} {logFilename \"\"}} \\\n+{\n+    # Default return code to no error found\n+    set retCode 0\n+\n+    if {[ixTclHal::isCleanUpDone]} {\n+        debugMsg \"ixProxyConnect: package req IxTclHal\"\n+        package req IxTclHal\n+    }\n+\n+    if {[info exists logFilename] && ([string length $logFilename] > 0)} {\n+        logOn $logFilename\n+    }\n+\n+    if {[isUNIX]} {\n+        set retCode [ixConnectToTclServer $tclServer]\n+        if {$retCode == 1} {\n+            # We need to change the return code, because it conflicts with the code from ixConnectToChassis\n+            set retCode 5\n+        }\n+    }\n+    if {$retCode == 0} {\n+        set retCode [ixConnectToChassis $chassisList $cableLen]\n+    }\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: ixResetSequenceIndex \n+#\n+# This command reset the sequence index\n+#\n+# Argument(s):\n+#    PortArray                either list of ports or array of ports\n+#\n+########################################################################\n+proc ixResetSequenceIndex {PortArray} \\\n+{\n+    upvar $PortArray portArray\n+\n+    return [resetSequenceIndex portArray]\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixResetPortSequenceIndex \n+#\n+# Description: This command reset sequence index on a single port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Return:      0 if OK, 1 if port not configured\n+########################################################################\n+proc ixResetPortSequenceIndex  {chassis lm port} \\\n+{\n+    return [resetPortSequenceIndex $chassis $lm $port]\n+}\n+\n+\n+\n+########################################################################\n+# Procedure:   ixRestartAutoNegotiation\n+#\n+# Description: This command restarts auto negotiation\n+#\n+# Arguments:\n+#    TxRxArray - either list of ports or array of ports\n+#                     \n+# Returns:     The return code from restartAutoNegotiation\n+########################################################################\n+proc ixRestartAutoNegotiation {TxRxArray} \\\n+{\n+    upvar $TxRxArray      txRxArray\n+\n+    return [restartAutoNegotiation txRxArray]\n+}\n+\n+########################################################################\n+# Procedure:   ixRestartPortAutoNegotiation\n+#\n+# Description: This command restarts auto negotiation\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Returns:     The return code from restartAutoNegotiation\n+########################################################################\n+proc ixRestartPortAutoNegotiation {chassis lm port} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if [catch {format \"%d,%d,%d\" $chassis $lm $port} txRxArray] {\n+        errorMsg \"$txRxArray\"\n+        set retCode $::TCL_ERROR\n+    } else {\n+        set retCode [restartAutoNegotiation txRxArray]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixRestartPPPNegotiation\n+#\n+# Description: This command restarts PPP negotiation \n+#\n+# Arguments:\n+#    TxRxArray - either list of ports or array of ports\n+#                     \n+# Returns:     The return code from restartAutoNegotiation\n+########################################################################\n+proc ixRestartPPPNegotiation {TxRxArray} \\\n+{\n+    upvar $TxRxArray      txRxArray\n+\n+    set allPorts [getAllPorts txRxArray]\n+\n+    ixStopTransmit allPorts\n+    return [restartAutoNegotiation txRxArray]\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixRestartPortPPPNegotiation\n+#\n+# Description: This command restarts PPP negotiation \n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Returns:     The return code from restartAutoNegotiation\n+########################################################################\n+proc ixRestartPortPPPNegotiation {chassis lm port} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if [catch {format \"%d,%d,%d\" $chassis $lm $port} txRxArray] {\n+        errorMsg \"$txRxArray\"\n+        set retCode $::TCL_ERROR\n+    } else {\n+        ixStopPortTransmit $chassis $lm $port\n+        set retCode [restartAutoNegotiation txRxArray]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixSimulatePhysicalInterfaceUp\n+#\n+# Description: This command simulates physical interface up on a port list\n+#\n+# Arguments:\n+#    TxRxArray - either list of ports or array of ports\n+#                     \n+# Returns:     The return code from simulatePhysicalInterfaceUp\n+########################################################################\n+proc ixSimulatePhysicalInterfaceUp {TxRxArray} \\\n+{\n+    upvar $TxRxArray      txRxArray\n+\n+    return [simulatePhysicalInterfaceUp txRxArray]\n+}\n+\n+\n+\n+########################################################################\n+# Procedure:   ixSimulatePortPhysicalInterfaceUp\n+#\n+# Description: This command simulates physical interface down on a single port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Returns:     The return code from simulatePhysicalInterfaceUp\n+########################################################################\n+proc ixSimulatePortPhysicalInterfaceUp {chassis lm port} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if [catch {format \"%d,%d,%d\" $chassis $lm $port} txRxArray] {\n+        errorMsg \"$txRxArray\"\n+        set retCode $::TCL_ERROR\n+    } else {\n+        set retCode [simulatePhysicalInterfaceUp txRxArray]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixSimulatePhysicalInterfaceDown\n+#\n+# Description: This command simulates physical interface down on a port list\n+#\n+# Arguments:\n+#    TxRxArray - either list of ports or array of ports\n+#                     \n+# Returns:     The return code from simulatePhysicalInterfaceDown\n+########################################################################\n+proc ixSimulatePhysicalInterfaceDown {TxRxArray} \\\n+{\n+    upvar $TxRxArray      txRxArray\n+\n+    return [simulatePhysicalInterfaceDown txRxArray]\n+}\n+\n+\n+\n+########################################################################\n+# Procedure:   ixSimulatePortPhysicalInterfaceDown\n+#\n+# Description: This command simulates physical interface down on a single port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#\n+# Returns:     The return code from simulatePhysicalInterfaceDown\n+########################################################################\n+proc ixSimulatePortPhysicalInterfaceDown {chassis lm port} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if [catch {format \"%d,%d,%d\" $chassis $lm $port} txRxArray] {\n+        errorMsg \"$txRxArray\"\n+        set retCode $::TCL_ERROR\n+    } else {\n+        set retCode [simulatePhysicalInterfaceDown txRxArray]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+\n+##################################################################################\n+# Procedure:   ixIsOverlappingIpAddress  \n+#\n+# Description: Check if IP addresses are overlapping.\n+#\n+# Arguments:   ipAddress1  - first IP address to compare to\n+#              count1      - number of IP addresses starting from ipAddress1 to compare to\n+#              ipAddress2  - first IP address to compare to\n+#              count2      - number of IP addresses starting from ipAddress2 to compare to\n+#\n+# Returns:     1 - $::true\n+#              0 - $::false\n+#\n+##################################################################################\n+proc ixIsOverlappingIpAddress {ipAddress1 count1 ipAddress2 count2} \\\n+{\n+    return [dataValidation::isOverlappingIpAddress $ipAddress1 $count1 $ipAddress2 $count2]\n+}\n+\n+\n+##################################################################################\n+# Procedure:   ixIsSameSubnet   \n+#\n+# Description: Check if ip addresses are in the same subnet.\n+#              Note that all ports in one user porfile should be in same subnet.\n+#\n+# Arguments:   ipAddr1 - ipAddress to compare to\n+#              mask1   - net mask of ipAddr1\n+#              ipAddr2 - ipAddress to compare to\n+#              mask2   - net mask of ipAddr2\n+#\n+# Returns:     1 - $::true\n+#              0 - $::false\n+#\n+##################################################################################\n+proc ixIsSameSubnet {ipAddr1 mask1 ipAddr2 mask2} \\\n+{\n+    return [dataValidation::isSameSubnet $ipAddr1 $mask1 $ipAddr2 $mask2]\n+}\n+\n+\n+##################################################################################\n+# Procedure:   ixIsValidHost   \n+#\n+# Description: Check if the host part of an IP address is not all 0's or all 1's assuming\n+#              its net mask is valid.\n+#\n+# Arguments:   ipAddr - ipAddress\n+#              mask   - net mask\n+#\n+# Returns:     1 - $::true\n+#              0 - $::false\n+#\n+##################################################################################\n+proc ixIsValidHost {ipAddr mask} \\\n+{\n+    return [dataValidation::isValidHostPart $ipAddr $mask]\n+}\n+\n+\n+##################################################################################\n+# Procedure:   ixIsValidNetMask   \n+#\n+# Description: Check if net mask is valid. i.e. In binary form, the mask must \n+#              have consecutive 1's followed by consecutive 0's\n+#\n+# Arguments:   mask - net mask\n+#\n+# Returns:     1 - $::true\n+#              0 - $::false\n+#\n+##################################################################################\n+proc ixIsValidNetMask {mask} \\\n+{\n+    return [dataValidation::isValidNetMask $mask]\n+}\n+\n+\n+##################################################################################\n+# Procedure:   ixIsValidUnicastIp   \n+#\n+# Description: Check if ipAddress accomplied with the following\n+#                   1) it is not 0.0.0.0\n+#                   2) it is not 255.255.255.255\n+#                   3) it is not loopback address (127.x.x.x)\n+#                   4) it is not multicast address \n+#                      (224.0.0.0 - 239.255.255.255, i.e first 4 bits not 1110)\n+#\n+# Arguments:   ipAddr - IP address \n+#\n+# Returns:     1 - $::true\n+#              0 - $::false\n+#\n+##################################################################################\n+proc ixIsValidUnicastIp {ipAddr} \\\n+{\n+    return [dataValidation::isValidUnicastIp $ipAddr]\n+}\n+\n+\n+##################################################################################\n+# Procedure:   ixConvertFromSeconds   \n+#\n+# Description: Convert seconds to hours, minutes, seconds\n+#\n+# Arguments:   seconds\n+#               Hours   - returned\n+#               Minutes - returned\n+#               Seconds - returned\n+#\n+# Returns:     $::TCL_OK or $::TCL_ERROR\n+#\n+##################################################################################\n+proc ixConvertFromSeconds {time Hours Minutes Seconds} \\\n+{\n+    upvar $Hours   hours\n+    upvar $Minutes minutes\n+    upvar $Seconds seconds\n+\n+    return [convertFromSeconds $time hours minutes seconds]\n+}\n+\n+\n+##################################################################################\n+# Procedure:   ixConvertToSeconds   \n+#\n+# Description: Convert time in hours:minutes:seconds format to seconds\n+#\n+# Arguments:   hours    - number of hours of time\n+#              minutes  - number of minutes of time\n+#              seconds  - number of seconds of time\n+#\n+# Returns:     number of seconds\n+#\n+##################################################################################\n+proc ixConvertToSeconds {hours minutes seconds} \\\n+{\n+    return [convertToSeconds $hours $minutes $seconds]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixEnablePortIntrinsicLatencyAdjustment\n+#\n+# This command enables the  Intrinsic Latency Adjustment on the ports\n+# that support the feature\n+#\n+# Arguments(s):\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixEnablePortIntrinsicLatencyAdjustment { chassId cardId portId enable {write nowrite}} \\\n+{\n+\tset portList [list [list $chassId $cardId $portId]]\n+    return [enableIntrinsicLatencyAdjustment portList $enable $write]\n+}\n+\n+########################################################################\n+# Procedure: ixEnableIntrinsicLatencyAdjustment\n+#\n+# This command enables the  Intrinsic Latency Adjustment on the ports\n+# that support the feature\n+#\n+# Arguments(s):\n+#\n+# Return:\n+#\t0 if OK, 1 if port not configured\n+#\n+########################################################################\n+proc ixEnableIntrinsicLatencyAdjustment { TxRxArray enable {write nowrite}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    return [enableIntrinsicLatencyAdjustment txRxArray $enable $write]\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: ixIsIntrinsicLatencyAdjustmentEnabled\n+#\n+# This command returns the true if the  Intrinsic Latency is enabled\n+#\n+# Arguments(s):\n+#\n+# Return:\n+#\t1 if enabled, 0 if not\n+#\n+########################################################################\n+proc ixIsIntrinsicLatencyAdjustmentEnabled { chassId cardId portId} \\\n+{\n+    return [isIntrinsicLatencyAdjustmentEnabled $chassId $cardId $portId]\n+}\n+\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/interface.tcl b/dep/tclclient/ixTcl1.0/Generic/interface.tcl\nnew file mode 100644\nindex 00000000..0e786f41\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/interface.tcl\n@@ -0,0 +1,262 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: interface.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+# Revision Log:\n+# 01-23-1998    DS      Genesis\n+#\n+# Description: This is the main configuration interface file for all the commands.\n+# If new commands or paramters are to be added, only this file needs to be updated.\n+# The actual files containing the commands do not have to be touched.\n+# The \"config\" commands contain all configurable parameters, that is,\n+# read-write. The \"cget parameters\" are read-only. \"cget\" can be used to store\n+# default values which the user cannot change.\n+#\n+# Included in this file are the user config params that are generic for all tests.\n+#\n+##################################################################################\n+\n+\n+##################################################################################\n+\n+# A list containing all the commands. Used to display them when \"help\"\n+# command is given\n+#\n+# **********NOTE*************\n+# Update this list whenever a new command is added or an old one deleted.\n+\n+set allCommands {{Commands              Description} \\\n+                 {--------              ----------------------------------------------------------------------------} \\\n+                 {advancedTestParameter Configure advanced test parameters} \\\n+                 {fastpath              Configure fastpath configuration parameters} \\\n+                 {ipfastpath            Configure ipfastpath configuration parameters (deprecated)} \\\n+                 {learn                 Configure learn frames} \\\n+                 {logger                Configure and enable logging to files} \\\n+                 {map                   Configure the transmit and receive Chassis.Card.Port traffic mapping} \\\n+                 {tclClient             Configure the tclClient parameters} \\\n+                 {testProfile           Configure test parameters} }\n+\n+\n+##################################\n+# COMMAND: advancedTestParameter\n+##################################\n+proc initCommand_zz_advancedTestParameter {} \\\n+{\n+    defineCommand registerCommand   advancedTestParameter\n+\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   dialogState         -defaultValue normal             -validValues {normal iconic destroyedByUser}\n+\n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   maxConnectRetries   -defaultValue 3\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   streamPatternType   -defaultValue repeat             -validValues {incrByte incrWord decrByte decrWord patternTypeRandom repeat nonRepeat}\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   streamDataPattern   -defaultValue x00010203          -validValues {dataPatternRandom allOnes allZeroes xAAAA x5555 x7777 xDDDD xF0F0 x0F0F xFF00FF00 x00FF00FF xFFFF0000 x0000FFFF x00010203 x00010002 xFFFEFDFC xFFFFFFFE userpattern}\n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   streamFrameType     -defaultValue {08 00}\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   streamPattern       -defaultValue {}\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   l2DataProtocol      -defaultValue {native}           -validValues {native ethernetII ip}\n+    \n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   ipProtocol          -defaultValue udp\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   ipFragment          -defaultValue may                -validValues {may dont}\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   ipLastFragment      -defaultValue last               -validValues {last more}\n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   ipFragmentOffset    -defaultValue 0   \n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   ipDelay             -defaultValue normalDelay        -validValues {normalDelay lowDelay}\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   ipThroughput        -defaultValue normalThruput      -validValues {normalThruput highThruput}\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   ipReliability       -defaultValue normalReliability  -validValues {normalReliability highReliability}\n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   ipIdentifier        -defaultValue 0\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   ipCost              -defaultValue normalCost         -validValues {normalCost lowCost}\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   ipOptions           -defaultValue {}\n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   ipTTL               -defaultValue 10              \n+    \n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   ipV6HopLimit        -defaultValue 255              \n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   ipV6FlowLabel       -defaultValue 0              \n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   ipV6TrafficClass    -defaultValue 3\n+    \n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   udpSourcePort       -defaultValue 7\n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   udpDestPort         -defaultValue 7\n+    \n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   tcpSourcePort       -defaultValue 0     \n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   tcpDestPort         -defaultValue 0\n+\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   igmpReportMode      -defaultValue igmpReportToAllWhenQueried  -validValues {igmpReportToOneWhenQueried igmpReportToAllWhenQueried igmpReportToAllUnsolicited}\n+    \n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   ipxPacketType           -defaultValue typeIpx\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   vlanCFI                 -defaultValue resetCFI                -validValues {resetCFI setCFI}\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   removePortOnLinkDown    -defaultValue false\n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   linkStateTimeout        -defaultValue 25\n+    defineCommand registerParameter -command advancedTestParameter -type string  -parameter   savedTerminationOption  -defaultValue return                  -validValues {return exit}\n+    defineCommand registerParameter -command advancedTestParameter -type double  -parameter   percentLossFormat       -defaultValue 7.3\n+    defineCommand registerParameter -command advancedTestParameter -type double  -parameter   defaultFloatFormat      -defaultValue 12.3\n+    defineCommand registerParameter -command advancedTestParameter -type boolean -parameter   verifyAllArpReply       -defaultValue false                    -validValues {true false}\n+    defineCommand registerParameter -command advancedTestParameter -type boolean -parameter   useRxVlanId             -defaultValue true                    \n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   dutDelay                -defaultValue 100\n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   numAddressesPerPort     -defaultValue 1\n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   octetToIncr             -defaultValue 4              \n+    defineCommand registerParameter -command advancedTestParameter -type boolean -parameter   closeAllFilesInCleanUp  -defaultValue false\n+    defineCommand registerParameter -command advancedTestParameter -type boolean -parameter   removeStreamsAtCompletion -defaultValue false\n+    defineCommand registerParameter -command advancedTestParameter -type boolean -parameter   stopProcessesOnEarlyTermination -defaultValue false\n+\n+    defineCommand registerParameter -command advancedTestParameter -type boolean -parameter   primeDut                -defaultValue false\n+    defineCommand registerParameter -command advancedTestParameter -type integer -parameter   portWriteChunkSize      -defaultValue 0               -validRange {0 1000}\n+}\n+\n+\n+##################################\n+# COMMAND: fastpath\n+##################################\n+proc initCommand_zz_fastpath {} \\\n+{\n+    defineCommand registerCommand   fastpath\n+\n+    # rate is in fps\n+    defineCommand registerParameter -command fastpath -parameter    rate              -type integer -defaultValue 100   -validRange {1 2000000000}\n+    defineCommand registerParameter -command fastpath -parameter    numframes         -type integer -defaultValue 10    -validRange {1 2000000000}\n+    defineCommand registerParameter -command fastpath -parameter    framesize         -type integer -defaultValue 64    -validRange {12 2000000000}\n+    defineCommand registerParameter -command fastpath -parameter    enable            -type boolean -defaultValue false\n+    defineCommand registerParameter -command fastpath -parameter    calculateLatency  -type boolean -defaultValue no\n+    defineCommand registerParameter -command fastpath -parameter    waitTime          -type integer -defaultValue 2000  -validRange {1 2000000000}\n+}\n+\n+\n+##################################\n+# COMMAND: ipfastpath\n+##################################\n+proc initCommand_zz_ipfastpath {} \\\n+{\n+    defineCommand registerCommand   ipfastpath\n+\n+    # rate is in fps\n+    defineCommand registerParameter -command ipfastpath -parameter    rate              -type integer -defaultValue 100     -validRange {1 2000000000}\n+    defineCommand registerParameter -command ipfastpath -parameter    numframes         -type integer -defaultValue 10      -validRange {1 2000000000}\n+    defineCommand registerParameter -command ipfastpath -parameter    framesize         -type integer -defaultValue 64      -validRange {12 2000000000}\n+    defineCommand registerParameter -command ipfastpath -parameter    enable            -type boolean -defaultValue false\n+    defineCommand registerParameter -command ipfastpath -parameter    calculateLatency  -type boolean -defaultValue no\n+    defineCommand registerParameter -command ipfastpath -parameter    waitTime          -type integer -defaultValue 2000    -validRange {1 2000000000}\n+}\n+\n+\n+##################################\n+# COMMAND: learn\n+##################################\n+proc initCommand_zz_learn {} \\\n+{\n+    defineCommand registerCommand   learn\n+\n+    defineCommand registerParameter -command learn -parameter when           -type string  -defaultValue oncePerFramesize -validValues {never once oncePerTest oncePerFramesize onIteration onTrial}\n+    defineCommand registerParameter -command learn -parameter rate           -type integer -defaultValue 100            -validRange  {1 2000000000};# fps\n+    defineCommand registerParameter -command learn -parameter numframes      -type integer -defaultValue 10\t\t\t    -validRange  {1 2000000000}\n+    defineCommand registerParameter -command learn -parameter retries        -type integer -defaultValue 20\n+    defineCommand registerParameter -command learn -parameter type           -type string  -defaultValue default        -validValues {default mac ip ipx ipV6}\n+    defineCommand registerParameter -command learn -parameter numDHCPframes  -type integer -defaultValue 1\n+    defineCommand registerParameter -command learn -parameter framesize      -type integer -defaultValue 64             -validRange  {64 2000000000}\n+    defineCommand registerParameter -command learn -parameter removeOnError  -type boolean -defaultValue false\n+    defineCommand registerParameter -command learn -parameter snoopConfig    -type boolean -defaultValue false\n+    defineCommand registerParameter -command learn -parameter duration       -type integer -defaultValue 0\n+    defineCommand registerParameter -command learn -parameter waitTime       -type integer -defaultValue 1000           -validRange  {1 2000000000}\n+    defineCommand registerParameter -command learn -parameter dhcpWaitTime   -type integer -defaultValue 2              -validRange  {1 200}     ;# seconds\n+\n+    # this command has been obsoleted, just around for backwards compatibility\n+    defineCommand registerParameter -command learn -parameter errorAction    -type string  -defaultValue deprecated     -validValues {deprecated continue remove}\n+}\n+\n+\n+##################################\n+# COMMAND: logger\n+# General logger parameters\n+##################################\n+proc initCommand_zz_logger {} \\\n+{\n+    global LOGS_DIR\n+\n+    defineCommand registerCommand   logger\n+\n+    defineCommand registerParameter -command logger -parameter fileBackup  -type boolean -defaultValue false\n+    defineCommand registerParameter -command logger -parameter logFileName -type string  -defaultValue \"defaultFile.log\"\n+    defineCommand registerParameter -command logger -parameter directory   -type string  -defaultValue $LOGS_DIR\n+    defineCommand registerParameter -command logger -parameter startTime   -type string\n+    defineCommand registerParameter -command logger -parameter endTime     -type string\n+    defineCommand registerParameter -command logger -parameter fileID      -type string  -defaultValue stdout -access r\n+    defineCommand registerParameter -command logger -parameter ioHandle    -type string  -defaultValue stdout\n+\n+    defineCommand registerMethod    logger on\n+    defineCommand registerMethod    logger off\n+    defineCommand registerMethod    logger message     priority\n+}\n+\n+\n+##################################\n+# COMMAND: map\n+# Traffic mapping configuration commands\n+##################################\n+proc initCommand_zz_map {} \\\n+{\n+    defineCommand registerCommand   map\n+\n+    defineCommand registerParameter -command map -parameter echo -type boolean -defaultValue false\n+    defineCommand registerParameter -command map -parameter type -type string  -defaultValue one2one                                  -validValues {one2one one2many many2one many2many}\n+\n+    defineCommand registerMethod    map new    {type}\n+    defineCommand registerMethod    map add    {txChassis txLm txPort rxChassis rxLm rxPort}\n+    defineCommand registerMethod    map del    {txChassis txLm txPort rxChassis rxLm rxPort}\n+}\n+\n+\n+##################################\n+# COMMAND: tclClient\n+##################################\n+proc initCommand_zz_tclClient {} \\\n+{\n+    defineCommand registerCommand   tclClient\n+\n+    defineCommand registerParameter -command tclClient -parameter enableStdout  -type boolean -defaultValue false\n+    defineCommand registerParameter -command tclClient -parameter enableResults -type boolean -defaultValue true\n+}\n+\n+\n+##################################\n+# COMMAND: advancedTestParameter\n+##################################\n+proc initCommand_zz_testProfile {} \\\n+{\n+    defineCommand registerCommand   testProfile\n+\n+    defineCommand registerParameter -command testProfile -type string -parameter   chassisChain    -defaultValue {loopback}\n+    defineCommand registerParameter -command testProfile -type string -parameter   serverName      -defaultValue \"\"\n+    defineCommand registerParameter -command testProfile -type string -parameter   chassisID       -defaultValue {1}\n+    defineCommand registerParameter -command testProfile -type string -parameter   syncCableLength -defaultValue {cable3feet}\n+    defineCommand registerParameter -command testProfile -type string -parameter   chassisSequence -defaultValue {1}\n+    defineCommand registerParameter -command testProfile -type string -parameter   timeSource      -defaultValue {tsInternal}\n+    defineCommand registerParameter -command testProfile -type string -parameter   sntpAddress     -defaultValue \"\"\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/interfaceTableUtils.tcl b/dep/tclclient/ixTcl1.0/Generic/interfaceTableUtils.tcl\nnew file mode 100644\nindex 00000000..ecc959d5\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/interfaceTableUtils.tcl\n@@ -0,0 +1,850 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: interfaceTableUtils.tcl\n+#\n+# Copyright ©  IXIA\n+# All Rights Reserved.\n+#\n+# Revision Log:\n+# 2002/07/09\n+#\n+# Description: Utilities for maintaining the Inteface Table.\n+#\n+##################################################################################\n+\n+namespace eval interfaceTable {\n+}\n+\n+########################################################################\n+# Procedure:    setDefault\n+#\n+# Arguments:    None\n+#\n+# Returns:      TCL_OK\n+#\n+########################################################################\n+proc interfaceTable::setDefault {PortArray} \\\n+{\n+    upvar $PortArray portArray\n+\n+    interfaceIpV6       setDefault\n+    interfaceIpV4       setDefault\n+    interfaceEntry      setDefault\n+\n+    foreach portMap [getAllPorts portArray] {\n+        scan $portMap \"%d %d %d\" c l p\n+        interfaceTable select $c $l $p\n+        interfaceTable clearAllInterfaces\n+        interfaceEntry clearAllItems $::addressTypeIpV4\n+        interfaceEntry clearAllItems $::addressTypeIpV6\n+    }\n+\n+    return $::TCL_OK\n+}\n+\n+########################################################################\n+# Procedure:    configurePort\n+#\n+# Description:  Given a port, configure the interface table \n+#               with information stored in the port, ip and ipV6 objects.\n+#\n+# Arguments(s): chassis\n+#               card\n+#               port\n+#               protocolList:   list of protocols to configure (default is all)\n+#               write:          write or noWrite (default)\n+#\n+# Return:       TCL_OK or TCL_ERROR\n+#\n+########################################################################\n+proc interfaceTable::configurePort \"chassis card port {protocolList {$::ipV4 $::ipV6}} {numInterfaces 1} {write nowrite} {reset true}\" \\\n+{\n+    set portList [list [list $chassis $card $port]]\n+    set retCode  [interfaceTable::configure portList $protocolList $numInterfaces $write $reset]\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure:    configure\n+#\n+# Description:  Given a list of ports, configure the interface table \n+#               with information stored in the port, ip and ipV6 objects.\n+#\n+# Arguments(s): portList        list of ports to configure\n+#               protocolList:   list of protocols to configure (default is all)\n+#               write:          write or noWrite (default)\n+#\n+# Return:       TCL_OK or TCL_ERROR\n+#\n+# NOTE:         This currently only builds one ipV6 table entry per port, however\n+#               in future implementations it needs the capability to do multiple\n+#               interfaces per port.\n+#\n+########################################################################\n+proc interfaceTable::configure \"PortList {protocolList {$::ipV4 $::ipV6}} {numInterfaces 1} {write nowrite} {reset true}\" \\\n+{\n+    set retCode $::TCL_OK\n+    \n+    upvar $PortList portList\n+\n+    if {$reset == \"true\"} {\n+        setDefault portList\n+    }\n+\n+    foreach port $portList {\n+\n+        scan $port \"%d %d %d\" c l p\n+        if {[port get $c $l $p]} {\n+            errorMsg \"Error: Unable to get port: $c $l $p\"\n+            set retCode $::TCL_ERROR\n+            break\n+        }\n+\n+        if {![interfaceTable select $c $l $p]} {\n+            if {[addEntry $c $l $p $protocolList $numInterfaces]} {\n+                set retCode $::TCL_ERROR\n+                break\n+            }\n+\n+        } else {\n+            set retCode $::TCL_ERROR\n+            break\n+        }\n+    }\n+\n+    if {$retCode == $::TCL_OK} {\n+        set lowerWrite [string tolower $write]\n+        if {[stringCompare $lowerWrite \"write\"] == 0} {\n+            set retCode [writeConfigToHardware portList]\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: addEntry\n+#\n+# Description:  Build and save an entry into the interface table with \n+#               information stored in the port, ip and ipV6 objects.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+#               protocolList:   list of protocols to configure\n+#\n+# Return:       TCL_OK or TCL_ERROR\n+#\n+########################################################################\n+proc interfaceTable::addEntry \"chassis card port {protocolList {$::ipV4 $::ipV6}} {numInterfaces 1} \" \\\n+{\n+    eval array set protocolFunctions \\{ \\\n+        $::ipV4    interfaceTable::updateItemIpV4 \\\n+        $::ipV6    interfaceTable::updateItemIpV6 \\\n+    \\}\n+\n+    set retCode $::TCL_OK\n+\n+    # If the interface already exists, then update it.\n+    if {![interfaceTable getInterface [interfaceTable::formatEntryDescription $chassis $card $port]]} {\n+        set retCode [updateEntry $chassis $card $port $protocolList]\n+        \n+    # Else, add new interface entry.\n+    } else {\n+\n+        interfaceEntry setDefault\n+        \n+        # Build IPv4/IPv6 Entries.\n+        set message \"\"\n+        \n+        set sourceIpAddr [ip cget -sourceIpAddr]\n+        \n+        # Build & Save General Entry.\n+        \n+        set portMacAddress  [port cget -MacAddress]\n+        interfaceEntry config -description          [formatEntryDescription $chassis $card $port]\n+        interfaceEntry config -macAddress           [port cget -MacAddress]\n+        interfaceEntry config -enable               $::true\n+        \n+        for {set interfaceCount 0 } { $interfaceCount < $numInterfaces} { incr interfaceCount} {\n+        \n+            if {[vlanUtils::isPortTagged $chassis $card $port]} {\n+                if {[protocol cget -enable802dot1qTag]} {\n+                    if {![vlan get $chassis $card $port]} {\n+                        interfaceEntry config -enableVlan       $::true\n+                        interfaceEntry config -vlanId           [vlan cget -vlanID]\n+                    } else {\n+                        errorMsg \"Error getting vlan parameters for $chassis $card $port\"\n+                        set retCode $::TCL_ERROR\n+                    }\n+                }\n+            }\n+            foreach protocol $protocolList {        \n+                if {[info exists protocolFunctions($protocol)]} {\n+                    set retCode [eval $protocolFunctions($protocol) $chassis $card $port message $interfaceCount]\n+                }                    \n+            } \n+        \n+            if {[interfaceTable addInterface ]} {\n+                errorMsg \"Error: Unable to add interface to Interface Table for port: $chassis $card $port.\"\n+                set retCode $::TCL_ERROR\n+            }\n+        \n+            # Don't change the following order, otherwise the configuratin will be lost\n+            interfaceEntry config -description          [formatEntryDescription $chassis $card $port]\n+            interfaceEntry config -enable               $::true\n+            incrMacAddress portMacAddress 1\n+            interfaceEntry config -macAddress           $portMacAddress\n+            set sourceIpAddr [incrIpField $sourceIpAddr 4]\n+            ip config -sourceIpAddr         $sourceIpAddr       \n+        }\n+        \n+        interfaceEntry clearAllItems $::addressTypeIpV4\n+        interfaceEntry clearAllItems $::addressTypeIpV6\n+    }\n+     \n+    return $retCode\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: updateEntry\n+#\n+# Description:  Modify an existing entry and re-save (actually, delete and\n+#               re-add) the entry.\n+#\n+#               In it's current state, this method doesn't handle multiple\n+#               entries per interface.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+#               protocolList:   list of protocols to configure\n+#\n+# Return:       TCL_OK or TCL_ERROR\n+#\n+########################################################################\n+proc interfaceTable::updateEntry \"chassis card port {protocolList {$::ipV4 $::ipV6}}\" \\\n+{\n+    eval array set protocolFunctions \\{ \\\n+        $::ipV4    interfaceTable::updateItemIpV4 \\\n+        $::ipV6    interfaceTable::updateItemIpV6 \\\n+    \\}\n+\n+    set retCode $::TCL_ERROR\n+\n+    foreach protocol $protocolList {        \n+        if {$protocol == $::ipV4} {\n+            set addressType $::addressTypeIpV4\n+            if {![interfaceEntry getFirstItem $addressType]} {\n+                interfaceEntry delItem $addressType [interfaceIpV6 cget -ipAddress]\n+            }\n+        } else {\n+            set addressType $::addressTypeIpV6\n+            if {![interfaceEntry getFirstItem $addressType]} {\n+                interfaceEntry delItem $addressType [interfaceIpV6 cget -ipAddress]\n+            }\n+        }\n+        set retCode [eval $protocolFunctions($protocol) $chassis $card $port message]\n+    }\n+\n+    if {$retCode == $::TCL_OK} {\n+        if {![interfaceTable delInterface]} {\n+            if {[interfaceTable addInterface]} {\n+                set retCode [interfaceTable write]\n+            }\n+        }\n+    }\n+    \n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure:    updateIpItemV4\n+#\n+# Description:  Updates the IPv4 entry of the interface table.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+\n+# Return:       TCL_OK or TCL_ERROR\n+#\n+########################################################################\n+proc interfaceTable::updateItemIpV4 {chassis card port Message {incrByte 0}} \\\n+{               \n+    set retCode $::TCL_OK\n+    \n+    upvar $Message message\n+    set message \"\"\n+\n+    if {![ip get $chassis $card $port]} {\n+        interfaceIpV4 setDefault\n+        set sourceIpAddr [ip cget -sourceIpAddr]\n+        interfaceIpV4 config -ipAddress         [incrIpField $sourceIpAddr 4 $incrByte]\n+        interfaceIpV4 config -gatewayIpAddress  [ip cget -destDutIpAddr]\n+\t\tinterfaceIpV4 config -maskWidth\t\t\t[getIpV4MaskWidth [ip cget -sourceIpMask]]\n+\n+        if {[interfaceEntry addItem $::addressTypeIpV4]} {\n+            set retCode $::TCL_ERROR\n+            set message \"Error: Unable to add IPv4 Item for port $chassis $card $port\"\n+        } \n+\n+     } else {\n+        set retCode $::TCL_ERROR\n+        set message \"Error: Unable to get IP for port $chassis $card $port\"\n+    }\n+        \n+\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure:    updateIpItemV6\n+#\n+# Description:  Updates the IPv6 entry of the interface table.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+#\n+# Return:       TCL_OK or TCL_ERROR\n+#\n+########################################################################\n+proc interfaceTable::updateItemIpV6 {chassis card port Message {numInterfaces 1} } \\\n+{\n+    set retCode $::TCL_OK\n+\n+    upvar $Message message\n+    set message \"\"\n+\n+    if {![ipV6 get $chassis $card $port]} {\n+\n+        interfaceIpV6 setDefault\n+        interfaceIpV6 config -maskWidth        [ipV6 cget -sourceMask]\n+        interfaceIpV6 config -ipAddress        [ipV6 cget -sourceAddr]\n+\n+        if {[interfaceEntry addItem $::addressTypeIpV6]} {\n+            set retCode $::TCL_ERROR\n+            set message \"Error: Unable to add IPv6 Item for port $chassis $card $port\"\n+        }\n+\n+    } else {\n+        set retCode $::TCL_ERROR\n+        set message \"Error: Unable to get IPv6 for port $chassis $card $port\"\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: addEntries\n+#\n+# Description:  Build and save an entries into the interface table with \n+#               information stored in the port, ip V4, and vlan objects.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+#               protocolList:   list of protocols to configure\n+#               numInterfaces   not used.  It is only for compatibility with addEntry proc\n+#\n+# Return:       TCL_OK or TCL_ERROR\n+#\n+########################################################################\n+proc interfaceTable::addMultipleEntry \"chassis card port {protocolList {$::ipV4}} {numInterfaces 1} \" \\\n+{\n+    eval array set protocolFunctions \\{ \\\n+        $::ipV4    interfaceTable::addItemIpV4 \\\n+    \\}\n+\n+    set retCode $::TCL_OK\n+\n+    interfaceEntry setDefault\n+\n+    # Build IPv4/IPv6 Entries.\n+    set message \"\"\n+\n+    set sourceIpAddr [ip cget -sourceIpAddr]\n+    set destDutIpAddr [ip cget -destDutIpAddr]\n+    set octetToIncr [advancedTestParameter cget -octetToIncr]\n+    set incrGateway no\n+\n+    if {[vlanUtils::isPortTagged $chassis $card $port] && [protocol cget -enable802dot1qTag]} {\n+        set vlanSupport 1\n+        if {![vlan get $chassis $card $port]} {\n+            set vlanId  [vlan cget -vlanID]\n+            set numInterfaces [vlan cget -repeat]\n+            set incrGateway yes\n+        } else {\n+            errorMsg \"Error getting vlan parameters for $chassis $card $port\"\n+            set retCode $::TCL_ERROR\n+        }\n+    } else {\n+        set vlanSupport 0\n+        set numInterfaces 1\n+    }\n+\n+    # Build & Save General Entry.\n+    set portMacAddress  [port cget -MacAddress]\n+    interfaceEntry config -description          [formatEntryDescription $chassis $card $port]\n+    interfaceEntry config -macAddress           [port cget -MacAddress]\n+    interfaceEntry config -enable               $::true\n+\n+    for {set interfaceCount 0 } { $interfaceCount < $numInterfaces} { incr interfaceCount} {\n+\n+        if {$vlanSupport} {\n+            interfaceEntry config -enableVlan       $::true\n+            interfaceEntry config -vlanId           $vlanId\n+            incr vlanId                                  \n+        }\n+        foreach protocol $protocolList {        \n+            if {[info exists protocolFunctions($protocol)]} {\n+                set retCode [eval $protocolFunctions($protocol) $chassis $card $port message \\\n+                                                                $octetToIncr $interfaceCount $incrGateway]\n+            }                    \n+        } \n+\n+        if {[interfaceTable addInterface ]} {\n+            errorMsg \"Error: Unable to add interface to Interface Table for port: $chassis $card $port.\"\n+            set retCode $::TCL_ERROR\n+        }\n+\n+        # Don't change the following order, otherwise the configuratin will be lost\n+        interfaceEntry config -description          [formatEntryDescription $chassis $card $port]\n+        interfaceEntry config -enable               $::true\n+        incrMacAddress portMacAddress               1\n+        interfaceEntry config -macAddress           $portMacAddress    \n+    }   \n+    \n+    interfaceEntry clearAllItems $::addressTypeIpV4\n+     \n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure:    interfaceTable\n+#\n+# Description:  Create new IPv4 entry of the interface table.  The IP source and gateway\n+#                address is based on the sourceIpAddr and destDutIpAddr fields of the ip \n+#                command with the adjustments specified by \"octetToIncr\" and \"incrValue\"  \n+#                parameters.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+#               octetToIncr - octet of the IP address to increment\n+#               incrValue    - the number to increment\n+#\n+# Return:       TCL_OK or TCL_ERROR\n+#\n+########################################################################\n+proc interfaceTable::addItemIpV4 {chassis card port Message {octetToIncr 3} {incrValue 0} {incrGateway no}}\\\n+{               \n+    set retCode $::TCL_OK\n+    \n+    upvar $Message message\n+    set message \"\"\n+\n+    if {![ip get $chassis $card $port]} {\n+        interfaceIpV4 setDefault\n+        set sourceIpAddr [ip cget -sourceIpAddr]  \n+        interfaceIpV4 config -ipAddress         [incrIpField $sourceIpAddr $octetToIncr $incrValue]\n+        set destDutIpAddr [ip cget -destDutIpAddr]\n+        if {$incrGateway == \"yes\"} {\n+            interfaceIpV4 config -gatewayIpAddress  [incrIpField $destDutIpAddr $octetToIncr $incrValue]\n+        } else {\n+            interfaceIpV4 config -gatewayIpAddress $destDutIpAddr\n+        }\n+\t\tinterfaceIpV4 config -maskWidth\t\t\t[getIpV4MaskWidth [ip cget -sourceIpMask]]\n+\n+        if {[interfaceEntry addItem $::addressTypeIpV4]} {\n+            set retCode $::TCL_ERROR\n+            set message \"Error: Unable to add IPv4 Item for port $chassis $card $port\"\n+        } \n+\n+     } else {\n+        set retCode $::TCL_ERROR\n+        set message \"Error: Unable to get IP for port $chassis $card $port\"\n+     }       \n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure:    formatEntryDescription\n+#\n+# Description:  TBD.  \n+#\n+#               Currently, this procedure builds a description in the format\n+#               of \"card:port\".  This will need to change later when \n+#               multiple interfaces are allowed per port.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+#               identifier: true/false: Prepend count id to description.\n+#\n+# Return:       Entry Description\n+#\n+########################################################################\n+proc interfaceTable::formatEntryDescription {chassis card port {identifier \"false\"}} \\\n+{\n+    set retValue {}\n+\n+    if {$identifier == \"false\"} {\n+        set retValue [format \"%02d:%02d\" $card $port]\n+#        set retValue [format \"%02d:%02d ProtocolInterface\" $card $port]\n+    } else {\n+        set id [getInterfaceCount $chassis $card $port]\n+        set retValue [format \"%d-%02d:%02d ProtocolInterface\" $id $card $port]\n+    }\n+\n+    return \"$retValue\"\n+}\n+\n+########################################################################\n+# Procedure:    getInterfaceId\n+#\n+# Description:  Given a port # and a MAC address, return the interface id.\n+#               defined for that port.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+#               ipAddress:  Ip address associated with port interface,\n+#                           if null, the id of the first interface is\n+#                           returned.\n+#\n+# Return:       interface id\n+#\n+########################################################################\n+proc interfaceTable::getInterfaceId {chassis card port {macAddress \"\"}} \\\n+{\n+    set retValue 0\n+\n+    if {![interfaceTable select $chassis $card $port]} {\n+\n+        if {[string length $macAddress] == 0} {\n+            if {![interfaceTable getFirstInterface]} {\n+                set retValue [interfaceEntry cget -description]\n+            }\n+\n+        } else {\n+            if {![interfaceTable getFirstInterface]} {\n+                set interfaceMacAddress [interfaceEntry cget -macAddress]\n+                if {[stringCompare $macAddress $interfaceMacAddress] == 0} {\n+                    set retValue [interfaceEntry cget -description]\n+                } else {\n+                    while {![interfaceTable getNextInterface]} {\n+                        set interfaceMacAddress [interfaceEntry cget -macAddress]\n+                        if {[stringCompare $macAddress $interfaceMacAddress] == 0} {\n+                            set retValue [interfaceEntry cget -description]\n+                            break\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    return $retValue\n+}\n+\n+\n+########################################################################\n+# Procedure:    getInterfaceCount\n+#\n+# Description:  Given a port number, return the number of interfaces\n+#               defined for that port.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+#\n+# Return:       # of interfaces\n+#\n+########################################################################\n+proc interfaceTable::getInterfaceCount {chassis card port} \\\n+{\n+    set retValue 0\n+\n+    if {![interfaceTable select $chassis $card $port]} {\n+        if {![interfaceTable getFirstInterface]} {\n+            incr retValue\n+            while {![interfaceTable getNextInterface]} {\n+                incr retValue\n+            }\n+        }\n+    }\n+    return $retValue\n+}\n+\n+########################################################################\n+# Procedure:    enableInterface\n+#\n+# Description:  Given a port number and interface Id, enable the interface.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+#               interfaceId:    See format returned by [formatEntryDescription]\n+#\n+# Return:       ::TCL_OK or ::TCL_ERROR\n+#\n+########################################################################\n+proc interfaceTable::enableInterface {chassis card port interfaceId} \\\n+{\n+    set retCode $::TCL_ERROR\n+\n+    if {![interfaceTable select $chassis $card $port]} {\n+        if {![interfaceTable getInterface $interfaceId]} {\n+            interfaceEntry config -enable true\n+            interfaceTable write\n+            set retCode $::TCL_OK\n+        }\n+    }\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure:    disableInterface\n+#\n+# Description:  Given a port number and interface Id, disable the interface.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+#               interfaceId:    See format returned by [formatEntryDescription]\n+#\n+# Return:       ::TCL_OK or ::TCL_ERROR\n+#\n+########################################################################\n+proc interfaceTable::disableInterface {chassis card port interfaceId} \\\n+{\n+    set retCode $::TCL_ERROR\n+\n+    if {![interfaceTable select $chassis $card $port]} {\n+        if {![interfaceTable getInterface $interfaceId]} {\n+            interfaceEntry config -enable false\n+            interfaceTable write\n+            set retCode $::TCL_OK\n+        }\n+    }\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure:    disableAllInterfaces\n+#\n+# Description:  Given a port number, disable the interfaces on that port.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+#\n+# Return:       ::TCL_OK or ::TCL_ERROR\n+#\n+########################################################################\n+proc interfaceTable::disableAllInterfaces {chassis card port} \\\n+{\n+    set retCode $::TCL_ERROR\n+\n+    if {![interfaceTable select $chassis $card $port]} {\n+        if {![interfaceTable getFirstInterface]} {\n+            interfaceEntry config -enable false\n+            set retCode $::TCL_OK\n+            while {![interfaceTable getNextInterface]} {\n+                interfaceEntry config -enable false\n+            }\n+            interfaceTable write\n+        }\n+    }\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure:    deleteInterface\n+#\n+# Description:  Given a port number and interface Id, disable the interface.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+#               interfaceId:    See format returned by [formatEntryDescription]\n+#\n+# Return:       ::TCL_OK or ::TCL_ERROR\n+#\n+########################################################################\n+proc interfaceTable::deleteInterface {chassis card port interfaceId} \\\n+{\n+    set retCode $::TCL_ERROR\n+\n+    if {![interfaceTable select $chassis $card $port]} {\n+        if {![interfaceTable getInterface $interfaceId]} {\n+            interfaceTable delInterface\n+            interfaceTable write\n+            set retCode $::TCL_OK\n+        }\n+    }\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure:    getEntryList\n+#\n+# Description:  Given a port number and interface Id return a list\n+#               of all entries in that interface.  Really just a debugging\n+#               tool that I left in because I thought if might be useful.\n+#\n+# Arguments(s): chassis \n+#               card\n+#               port\n+#               interfaceId:    See format returned by [formatEntryDescription]\n+#               typeList:       list of address types desired, default is all:\n+#                                   addressTypeIpV4, addressTypeIpV6\n+#\n+# Return:       ::TCL_OK or ::TCL_ERROR\n+#\n+########################################################################\n+proc interfaceTable::getEntryList \"chassis card port interfaceId {typeList {$::addressTypeIpV4 $::addressTypeIpV6}}\" \\\n+{\n+    set interfaceList [list]\n+\n+    if {![interfaceTable select $chassis $card $port]} {\n+\n+        if {![interfaceTable getInterface $interfaceId]} {\n+\n+            foreach typeId $typeList {\n+                if {![interfaceEntry getFirstItem $typeId]} {\n+\n+                    switch $typeId \"\n+                        $::addressTypeIpV4 {\n+                            set command interfaceIpV4\n+                        }\n+                        $::addressTypeIpV6 {\n+                            set command interfaceIpV6\n+                        }\n+                    \"\n+                    lappend interfaceList [eval $command cget -ipAddress]\n+                    while {![interfaceEntry getNextItem $typeId]} {\n+                        lappend interfaceList [eval $command cget -ipAddress]\n+                    }\n+                }                   \n+            }                   \n+        }\n+    }\n+\n+    return $interfaceList\n+}\n+\n+\n+########################################################################\n+# Procedure:    getGatewayList\n+#\n+# Description:  Given a port number, this proc returns a list of all gateway \n+#               entries in that port.  \n+# Arguments(s): chassis \n+#               card\n+#               port\n+#               typeList:       list of address types desired, default is all:\n+#                                   addressTypeIpV4, addressTypeIpV6\n+#\n+# Return:       ::TCL_OK or ::TCL_ERROR\n+#\n+########################################################################\n+proc interfaceTable::getGatewayArray \"GatewayArray portList {typeList {$::addressTypeIpV4 $::addressTypeIpV6}}\" \\\n+{\n+    upvar $GatewayArray gatewayArray\n+\n+    foreach txMap $portList {\n+        scan $txMap \"%d %d %d\" c l p\n+        set gatewayArray($c,$l,$p) [list]\n+\n+        if {![interfaceTable select $c $l $p]} {\n+\n+            if {![interfaceTable getFirstInterface]} {\n+\n+                foreach typeId $typeList {\n+                    if {![interfaceEntry getFirstItem $typeId]} {\n+\n+                        switch $typeId \"\n+                            $::addressTypeIpV4 {\n+                                set command interfaceIpV4\n+                            }\n+                            $::addressTypeIpV6 {\n+                                set command interfaceIpV6\n+                            }\n+                        \"\n+                        lappend gatewayArray($c,$l,$p) [eval $command cget -gatewayIpAddress]\n+            \n+                        while {![interfaceEntry getNextItem $typeId]} {\n+                            lappend gatewayArray($c,$l,$p) [eval $command cget -gatewayIpAddress]\n+                        }\n+                    }                   \n+                }                   \n+            }\n+\n+            while {![interfaceTable getNextInterface]} {\n+                foreach typeId $typeList {\n+                    if {![interfaceEntry getFirstItem $typeId]} {\n+\n+                        switch $typeId \"\n+                            $::addressTypeIpV4 {\n+                                set command interfaceIpV4\n+                            }\n+                            $::addressTypeIpV6 {\n+                                set command interfaceIpV6\n+                            }\n+                        \"\n+                        lappend gatewayArray($c,$l,$p) [eval $command cget -gatewayIpAddress]\n+                        while {![interfaceEntry getNextItem $typeId]} {\n+                            lappend gatewayArray($c,$l,$p) [eval $command cget -gatewayIpAddress]\n+                        }\n+                    }                   \n+                }\n+            }                 \n+        }\n+    }\n+\n+}\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/ipV6Utils.tcl b/dep/tclclient/ixTcl1.0/Generic/ipV6Utils.tcl\nnew file mode 100644\nindex 00000000..50e1d0d4\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/ipV6Utils.tcl\n@@ -0,0 +1,1479 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: ipV6Utils.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#   Description:    This file contains utilities for manipulating IPv6 addresses.\n+#\n+#\tRevision Log:\n+#\tDate\t\tAuthor\t\t\t\tComments\n+#\t-----------\t-------------------\t--------------------------------------------\n+#\t2002/05/16  D. Heins-Gelder     Initial release \n+#\n+##################################################################################\n+\n+#   Procedure List\n+#\n+#    convertAddress\n+#    convertIpToIpV6\n+#    convertIpV6ToIp\n+#    convertIpV6ToMac\n+#    convertMacToIpV6\n+#    convertNoop\n+#    expandAddress\n+#    getAddressFieldOffset\n+#    getAddressFields\n+#    getFieldListByPrefix\n+#    getFieldMask \n+#    getFieldNamesByPrefix \n+#    getFormatPrefix \n+#    getHeaderLength \n+#    getInterfaceId \n+#    getLoopbackAddress\n+#    getMinimumValidFramesize\n+#    getNextLevelAggregateId\n+#    getSiteLevelAggregateId\n+#    getSubnetId\n+#    getTopLevelAggregateId\n+#    host2addr\n+#    incrIpField\n+#    isMixedVersionAddress\n+#    isReservedMCAddress\n+#    isValidAddress\n+#    validateAddress\n+\n+namespace eval ipv6 {\n+\n+    variable ipV6AddressSize            128\n+    variable ipV4AddressSize            32\n+    variable macAddressSize             48\n+\n+    # IPv6 Addresses can be mixed with Ipv4 address as: 66:66:66:66:66:66:444.444.444.444\n+    #   In this case the first 6 segements are the hex V6 address, the lower 4 segment are\n+    #   decimal V4 address (traditional format).  For example: \n+    #\n+    #       fffe:0000:0a3d:0001:0dce:1234:192.168.10.1\n+\n+    # Known IPv6 addresses.\n+    variable addressUnspecified         ::0\n+    variable addressLoopback            ::1\n+    variable addressTest                03ff:e0::00\n+    variable addressUnicastLinkLocal    fe80::00\n+    variable addressUnicastSiteLocal    fec0::00\n+    variable addressIsatap              00005efe\n+\n+    #\n+    # Multicast addresses\n+    #\n+    variable addressMulticast           ff::00\n+    variable addressMulticastAllNodes   [list     \\\n+                                        ff:01::01 \\\n+                                        ff:02::01 ]\n+\n+    variable addressMulticastAllRouters [list   ff:01::02 \\\n+                                                ff:02::02 \\\n+                                                ff:05::02]\n+    # Well known multicast addresses\n+\tvariable reservedMCAddressList\n+    set reservedMCAddressList\t\t\t[list \\\n+                                        ff01:0000:0000:0000:0000:0000:0000:0001 \\\n+                                        ff01:0000:0000:0000:0000:0000:0000:0002 \\\n+                                        ff02:0000:0000:0000:0000:0000:0000:0001 \\\n+                                        ff02:0000:0000:0000:0000:0000:0000:0002 \\\n+                                        ff02:0000:0000:0000:0000:0000:0000:0003 \\\n+\t\t\t\t\t\t\t\t\t\tff02:0000:0000:0000:0000:0000:0000:0004\t\\\n+                                        ff02:0000:0000:0000:0000:0000:0000:0005 \\\n+                                        ff02:0000:0000:0000:0000:0000:0000:0006 \\\n+                                        ff02:0000:0000:0000:0000:0000:0000:0007 \\\n+                                        ff02:0000:0000:0000:0000:0000:0000:0008 \\\n+                                        ff02:0000:0000:0000:0000:0000:0000:0009 \\\n+                                        ff02:0000:0000:0000:0000:0000:0000:000a \\\n+                                        ff02:0000:0000:0000:0000:0000:0000:000b \\\n+                                        ff02:0000:0000:0000:0000:0000:0000:000c \\\n+                                        ff02:0000:0000:0000:0000:0000:0000:000d \\\n+                                        ff02:0000:0000:0000:0000:0000:0000:000e \\\n+\t\t\t\t\t\t\t\t\t\tff02:0000:0000:0000:0000:0000:0001:0001\t\\\n+\t\t\t\t\t\t\t\t\t\tff02:0000:0000:0000:0000:0000:0001:0002\t\\\n+\t\t\t\t\t\t\t\t\t\tff05:0000:0000:0000:0000:0000:0000:0002\t\\\n+\t\t\t\t\t\t\t\t\t\tff05:0000:0000:0000:0000:0000:0001:0003\t\\\n+\t\t\t\t\t\t\t\t\t\tff05:0000:0000:0000:0000:0000:0001:0004\t]\n+\t# The reservedMCAddressList also contains addresses in the following range\n+\t# ff02:0000:0000:0000:0000:0001:FFXX:XXXX  where X is a place holder for a variable scope value\n+\t# ff05:0000:0000:0000:0000:0000:0001:1000 to ff05:0000:0000:0000:0000:0000:0001:13FF\n+\n+    variable fieldNames                 {topLevelAggregationId nextLevelAggregationId siteLevelAggregationId subnetId interfaceId}\n+\n+    variable fieldListByPrefix\n+    eval array set fieldListByPrefix    \\{ \\\n+\t\t$::ipV6Reserved                 \\{interfaceId\\} \\\n+\t\t$::ipV6NSAPAllocation           \\{interfaceId\\} \\\n+\t\t$::ipV6IPXAllocation            \\{interfaceId\\} \\\n+        $::ipV6GlobalUnicast            \\{topLevelAggregationId reserved nextLevelAggregationId siteLevelAggregationId interfaceId\\} \\\n+        $::ipV6LinkLocalUnicast         \\{interfaceId\\} \\\n+        $::ipV6SiteLocalUnicast         \\{subnetId interfaceId \\} \\\n+        $::ipV6UserDefined              \\{interfaceId topLevelAggregationId nextLevelAggregationId siteLevelAggregationId subnetId\\} \\\n+    \\}\n+\n+    variable fieldNamesByPrefix\n+    eval array set fieldNamesByPrefix   \\{ \\\n+\t\t$::ipV6Reserved                 \\{\\\"Interface Id\\\"\\} \\\n+\t\t$::ipV6NSAPAllocation           \\{\\\"Interface Id\\\"\\} \\\n+\t\t$::ipV6IPXAllocation            \\{\\\"Interface Id\\\"\\} \\\n+        $::ipV6GlobalUnicast            \\{\\\"Interface Id\\\" \\\"Top-Level Aggregation Id\\\" \\\"Next-Level Aggregation Id\\\" \\\"Site-Level Aggregation Id\\\"\\} \\\n+        $::ipV6SiteLocalUnicast         \\{\\\"Interface Id\\\" \\\"Subnet Id\\\"\\} \\\n+        $::ipV6LinkLocalUnicast         \\{\\\"Interface Id\\\"\\} \\\n+        $::ipV6UserDefined              \\{\\\"Interface Id\\\" \\\"Top-Level Aggregation Id\\\" \\\"Next-Level Aggregation Id\\\" \\\"Site-Level Aggregation Id\\\" \\\"Subnet Id\\\"\\} \\\n+    \\}\n+\n+\n+\n+    variable  fieldPositions\n+    array set fieldPositions {\n+        prefix                          4\n+        topLevelAggregationId           16\n+        nextLevelAggregationId          48\n+        siteLevelAggregationId          64\n+        subnetId                        64\n+        interfaceId                     128\n+\t\tgroupId\t\t\t\t\t\t\t128\t\t\t\t\t\t\t\n+    }\n+\n+    variable  fieldOffsets\n+    array set fieldOffsets {\n+        prefix                          0\n+        topLevelAggregationId           0\n+        nextLevelAggregationId          3\n+        siteLevelAggregationId          6\n+        subnetId                        6\n+        interfaceId                     8\n+    }\n+\n+    variable  fieldMasks\n+    array set fieldMasks {\n+        prefix                  0xE0000000000000000000000000000000\n+        topLevelAggregationId   0x1FFF0000000000000000000000000000\n+        nextLevelAggregationId  0x000000FFFFFF00000000000000000000\n+        siteLevelAggregationId  0x000000000000FFFF0000000000000000\n+        subnetId                0x000000000000FFFF0000000000000000\n+        interfaceId             0x0000000000000000FFFFFFFFFFFFFFFF\n+\t\tgroupId\t\t\t\t\t0xFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF\n+    }\n+\n+}   \n+\n+########################################################################################\n+#\n+#   Conversion Utilities\n+#   \n+########################################################################################\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::host2addr\n+#\n+# Description:      Given an IPv6 address, expand it, then return a string of hex\n+#                   characters (similar function to host2addr for IPv4 in utils.tcl)\n+#\n+# Argument(s):      address:    Ipv6 address (any acceptable IPv6 format)\n+#               \n+# Returns:          hex byte string, for example:\n+#                       ffe1::1 becomes\n+#                       ff e1 00 00 00 00 00 00 00 00 00 00 00 00 00 01\n+#\n+#                       ffe1:ffff:eeee:dddd:cccc:bbbb:aaaa:0001 becomes\n+#                       ff e1 ff ff ee ee dd dd cc cc bb bb aa aa 00 01\n+#\n+########################################################################################\n+proc ipv6::host2addr {address} \\\n+{\n+    variable ipV6AddressSize\n+    set bytes {}\n+\n+    if {[isValidAddress $address]        || \\\n+        [isMixedVersionAddress $address]  } {\n+\n+        set address [expandAddress $address]\n+        \n+        set length [expr $ipV6AddressSize / 8]\n+        regsub -all \":\" $address {} address\n+        for {set i 0} {$i < $length} {incr i} {\n+            lappend bytes [string range   $address 0 1]\n+            set address   [string replace $address 0 1]\n+        }\n+    }\n+\n+    return $bytes\n+}\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::expandAddress\n+#\n+# Description:      Expand and IPv6 address from it's compressed form (RFC 2373, section\n+#                   2.1 & 2.2) to a full 16 byte address delimited by colons:\n+#\n+#                   Handles the following:\n+#                       \n+#                   1. Zeros compression operator ::\n+#                           ::1 becomes\n+#                           0000:0000:0000:0000:0000:0000:0000:0001 \n+#\n+#                           fffe::1 becomes\n+#                           fffe:0000:0000:0000:0000:0000:0000:0001\n+#\n+#                   2. Mixed IPv4 and IPv6 Address:\n+#                           0:0:0:0:0:0:192.168.10.1 becomes\n+#                           0000:0000:0000:0000:0000:0000:C0a8:0a01\n+#\n+# Argument(s):      address:    compressed ipv6 address\n+#               \n+# Returns:          expanded address\n+#\n+########################################################################################\n+proc ipv6::expandAddress {address} \\\n+{\n+    variable ipV6AddressSize\n+    variable ipV4AddressSize\n+\n+    set retValue    {}\n+    set segments    8\n+\n+    if {[isValidAddress $address]} {\n+\n+        # Convert IPv4 address to Hex.\n+        if {[isMixedVersionAddress $address]} {\n+            set end [expr [llength [split $address :]] - 1]\n+            set ipv4Address [lindex [split $address :] $end]\n+            regsub \"$ipv4Address\" $address {} address\n+            regsub -all {(.*)\\.(.*)\\.(.*)\\.(.*)} $ipv4Address \\\n+                {[format \"%02x%02x:%02x%02x\" \\1 \\2 \\3 \\4]} ipv4Address\n+            set ipv4Address [subst $ipv4Address]\n+            append address $ipv4Address\n+        }\n+\n+        # Check for Zero Compression operator, if found split into before and after.\n+        set segmentsBefore {}\n+        set segmentsAfter  $address\n+        \n+        regexp {(.*)::(.*)} $address result segmentsBefore segmentsAfter\n+        \n+        #\n+        # Fill in the zeroes needed to expand.\n+        set segmentsBefore [split $segmentsBefore :]\n+        set segmentsAfter  [split $segmentsAfter  :]\n+        set segmentsNeeded [expr  $segments - ([llength $segmentsBefore] + [llength $segmentsAfter])]\n+        set segmentList \"$segmentsBefore [string repeat \" 0\" $segmentsNeeded] $segmentsAfter\"\n+        \n+        # Build it back into a list as the expanded address in 8 segments (2 bytes each).\n+        set expandedAddress [list]\n+        foreach segment $segmentList {\n+            lappend expandedAddress [format \"%04x\" 0x$segment]\n+        }\n+        set retValue [join $expandedAddress :]\n+    }\n+                    \n+    return $retValue\n+}\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::compressAddress\n+#\n+# Description:  \n+#\n+# Argument(s):\n+#               \n+# Returns:\n+#\n+########################################################################################\n+proc ipv6::compressAddress { address } \\\n+{\n+    regsub -all {(:0{1,3})+} $address \":\" stripZeros\n+    regsub {(:0)+} $stripZeros \":\" dc\n+    if {[string index $dc end] == \":\"} {\n+        set num_colons [regsub -all {:} $dc \" \" dc_ignore]\n+        if {$num_colons < 7} {\n+            append dc :0\n+        } else  {\n+            append dc 0\n+        }\n+    }\n+    regsub {^(0{1,3})(.*):(.*)} $dc {\\2:\\3} dc\n+    return $dc\n+}\n+\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::convertAddress\n+#\n+# Description:      Converts from one type of address to another:\n+#                       mac     -> ipv4 invalid\n+#                       mac     -> ipv6\n+#                       ipv4    -> ipv6\n+#                       ipv4    -> mac  invalid\n+#                       ipv6    -> mac  (returns lower 6 bytes)\n+#                       ipv6    -> ipv4 (returns lower 4 bytes)\n+#\n+# Argument(s):      address:        mac or ip address (version 4 or 6)\n+#                                       mac format: 00:00:00:00:00:00 (hex)\n+#                                       ip format:  000.000.000.000 (decimal)        \n+#                                       ipv6 format:  0000:0000:0000:0000:0000:0000:0000:0000\n+#\n+#                   sourceType:     ip, ipV6, mac\n+#                   destType:       ip, ipV6, mac\n+#                   args:           prefix if destType = ipv6 (must be fully expanded prefix)\n+#\n+# Returns:          converted address\n+#\n+########################################################################################\n+proc ipv6::convertAddress {address sourceType destType {args \"\"}} \\\n+{\n+    set retValue {}\n+\n+    array set conversion {\n+        mac,ip              ipv6::convertNoop\n+        mac,ipV6            ipv6::convertMacToIpV6      \n+        ip,mac              ipv6::convertNoop\n+        ip,ipV6             ipv6::convertIpToIpV6\n+        ip,isatap           ipv6::convertIpToIsatap\n+        ip,ipV4Compatible   ipv6::convertIptoIpV4Compatible\n+        ip,6to4             ipv6::convertIpTo6to4\n+        isatap,ip           ipv6::convertIpV6ToIp\n+        ipV4Compatible,ip   ipv6::convertIpV6ToIp\n+        6to4,ip             ipv6::convertIpV6ToIp\n+        ipV6,mac            ipv6::convertIpV6ToMac   \n+        ipV6,ip             ipv6::convertIpV6ToIp    \n+    }\n+\n+    if {[info exists conversion($sourceType,$destType)]} {\n+        set command $conversion($sourceType,$destType)\n+        if {$command != {}} {\n+            set retValue [eval $command $address $args]\n+        }\n+    }\n+\n+    return $retValue\n+}\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::convertMacToIpV6\n+#\n+# Description:      Converts a MAC address to an IPv6 address.\n+#\n+# Argument(s):      address:    mac address\n+#                   prefix:     defaults to 0\n+#               \n+# Returns:          converted address\n+#\n+########################################################################################\n+proc ipv6::convertMacToIpV6 {address {prefix 0}} \\\n+{\n+    variable ipV6AddressSize\n+    variable macAddressSize\n+\n+    set retValue {}\n+    if {[isMacAddressValid $address] == $::TCL_OK} {\n+\n+        # Convert the address and prefix to a string of bytes.\n+        regsub -all \":\" $prefix { } prefixList\n+        set prefix {}\n+        foreach segment $prefixList {\n+            lappend prefix [format \"%04X\" 0x$segment]\n+        }\n+        regsub -all \" \" $prefix \"\" prefix\n+        regsub -all \":\" $address {} address\n+\n+        # Expand if necessary.\n+        set prefixLength [expr [string length $prefix]/2]\n+        set expand [expr $ipV6AddressSize/8 - $macAddressSize/8 - $prefixLength]\n+        for {set i $expand} {$i} {incr i -1} {\n+            append prefix \"00\"\n+        }\n+        append prefix $address\n+\n+        # Build prefix-address string into IPv6 style address\n+        set address {}\n+        while {[string length $prefix] > 0} {\n+            append address \"[string range $prefix 0 3]:\"\n+            set prefix [string replace $prefix 0 3]\n+        }\n+        regexp {(.*):$} $address match address  \n+        set retValue $address\n+    }            \n+\n+    return $retValue\n+}\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::convertIpToIpV6\n+#\n+# Description:      Converts an IP address to an IPv6 address.\n+#\n+# Argument(s):      address:    version 4 style IP address\n+#                   prefix:     defaults to 0\n+#               \n+# Returns:          converted address\n+#\n+########################################################################################\n+proc ipv6::convertIpToIpV6 {address {prefix 0} {option addressAtTheEnd}} \\\n+{\n+    variable ipV4AddressSize\n+    variable ipV6AddressSize\n+\n+    set retValue {}\n+\n+    if {[isIpAddressValid $address]} {\n+\n+        # Convert prefix to string.\n+        regsub -all \":\" $prefix { } prefixList\n+        set prefix {}\n+        foreach segment $prefixList {\n+            lappend prefix [format \"%04X\" \"0x$segment\"]\n+        }\n+        regsub -all \" \" $prefix \"\" prefix\n+        \n+        \n+        # Convert ip address to string.\n+        regsub -all {(.*)\\.(.*)\\.(.*)\\.(.*)} $address \\\n+            {[format \"%02x%02x%02x%02x\" \\1 \\2 \\3 \\4]} address\n+        set address [subst $address]\n+        \n+        \n+        # Expand if necessary.\n+        set prefixLength [expr [string length $prefix]/2]\n+        set expand [expr $ipV6AddressSize/8 - $ipV4AddressSize/8 - $prefixLength]\n+        if {$option == \"addressFollowPrefix\"} {\n+            append prefix $address\n+            ### append the rest with 00...01\n+            ### because host address cannot be all 0's\n+            incr expand -1\n+            for {set i $expand} {$i} {incr i -1} {\n+                append prefix \"00\"\n+            } \n+            append prefix \"01\" \n+        } else {\n+           for {set i $expand} {$i} {incr i -1} {\n+                append prefix \"00\"\n+           }\n+           append prefix $address          \n+        }\n+        \n+        # Break it up into IPv6 address seperated by colons.\n+        set address {}\n+        while {[string length $prefix] > 0} {\n+            append address \"[string range $prefix 0 3]:\"\n+            set prefix [string replace $prefix 0 3]\n+        }\n+        regexp {(.*):$} $address match address            \n+        set retValue $address\n+    }\n+\n+    return $retValue\n+}\n+\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::convertIpToIsatap\n+#\n+# Description:      Converts an IP address to an IPv6 Isatap address.\n+#\n+# Argument(s):      address:    version 4 style IP address\n+#                   prefix:     defaults to 0\n+#               \n+# Returns:          converted address\n+#\n+########################################################################################\n+proc ipv6::convertIpToIsatap {address {prefix 0}} \\\n+{\n+    variable ipV4AddressSize\n+    variable ipV6AddressSize\n+    variable addressIsatap\n+\n+    set retValue {}\n+\n+    if {[isIpAddressValid $address]} {\n+\n+        # Convert prefix to string.\n+        regsub -all \":\" $prefix { } prefixList\n+        set prefix {}\n+        foreach segment $prefixList {\n+\n+            lappend prefix [format \"%04X\" \"0x$segment\"]\n+        }\n+        regsub -all \" \" $prefix \"\" prefix\n+        \n+        # Convert ip address to string.\n+        regsub -all {(.*)\\.(.*)\\.(.*)\\.(.*)} $address \\\n+            {[format \"%02x%02x%02x%02x\" \\1 \\2 \\3 \\4]} address \n+        set address [subst $address]\n+        set address [format \"%08x%08x\" 0x$addressIsatap 0x$address]\n+\n+        set isatapSize [expr [string length $addressIsatap]/2]\n+\n+        \n+        # Expand if necessary.\n+        set prefixLength [expr [string length $prefix]/2]\n+        set expand [expr $ipV6AddressSize/8 - $ipV4AddressSize/8 - $prefixLength - $isatapSize]\n+        for {set i $expand} {$i} {incr i -1} {\n+            append prefix \"00\"\n+        }\n+        append prefix $address\n+        \n+        # Break it up into IPv6 address seperated by colons.\n+        set address {}\n+        while {[string length $prefix] > 0} {\n+            append address \"[string range $prefix 0 3]:\"\n+            set prefix [string replace $prefix 0 3]\n+        }\n+        regexp {(.*):$} $address match address            \n+        set retValue $address\n+    }\n+\n+    return $retValue\n+}\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::convertIpToIpV4Compatible\n+#\n+# Description:      Converts an IP address to an IPv6 IPv4 Compatible address.\n+#\n+# Argument(s):      address:    version 4 style IP address\n+#                   prefix:     defaults to 0\n+#               \n+# Returns:          converted address\n+#\n+########################################################################################\n+proc ipv6::convertIptoIpV4Compatible {address {prefix 0}} \\\n+{\n+    set retValue [convertIpToIpV6 $address $prefix]\n+    return $retValue\n+}\n+\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::convertIpTo6To4\n+#\n+# Description:      Converts an IP address to an IPv6 6to4 address.\n+#\n+# Argument(s):      address:    version 4 style IP address\n+#                   prefix:     defaults to 2002\n+#               \n+# Returns:          converted address\n+#\n+########################################################################################\n+proc ipv6::convertIpTo6to4 {address {prefix 2002}} \\\n+{\n+    set retValue [convertIpToIpV6 $address $prefix addressFollowPrefix]\n+    return $retValue\n+}\n+\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::convertIpV6ToMac\n+#\n+# Description:      Converts an IPv6 address to a MAC.\n+#\n+# Argument(s):      address:    IpV6 address\n+#               \n+# Returns:          converted address\n+#\n+########################################################################################\n+proc ipv6::convertIpV6ToMac {address {args \"\"}} \\\n+{\n+    variable macAddressSize\n+    variable ipV6AddressSize\n+\n+    set retValue {}\n+\n+    if {[isValidAddress $address]} {\n+        set address [expandAddress $address]\n+        regsub -all \":\" $address {} address\n+        \n+        set start [expr ($ipV6AddressSize/4) - ($macAddressSize/4)]\n+        set end   [expr ($ipV6AddressSize/4) - 1]\n+        set byteString [string range $address $start $end]\n+        \n+        set address {}\n+        while {[string length $byteString] > 0} {\n+            append address \"[string range $byteString 0 1]:\"\n+            set byteString [string replace $byteString 0 1]\n+        }\n+        regexp {(.*):$} $address match address            \n+        set retValue $address\n+    }\n+\n+    return $retValue\n+}\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::convertIpV6ToIp\n+#\n+# Description:      Converts an IPv6 address to an IP address, aka IPv4-Compatible Address.\n+#\n+# Argument(s):      address:    IPv4 style address (192.168.1.10)\n+#               \n+# Returns:          converted address\n+#\n+########################################################################################\n+proc ipv6::convertIpV6ToIp {address {args \"\"}} \\\n+{\n+    variable ipV4AddressSize\n+    variable ipV6AddressSize\n+\n+    set retValue {}\n+\n+    if {[isValidAddress $address]} {\n+        set address [expandAddress $address]\n+        regsub -all \":\" $address {} address\n+        \n+        set start [expr ($ipV6AddressSize/4) - ($ipV4AddressSize/4)]\n+        set end   [expr ($ipV6AddressSize/4) - 1]\n+        set byteString [string range $address $start $end]\n+        \n+        set address {}\n+        while {[string length $byteString] > 0} {\n+            lappend address \"[string range $byteString 0 1]\"\n+            set byteString [string replace $byteString 0 1]\n+        }\n+        regsub -all {(.*) (.*) (.*) (.*)} $address \\\n+            {[format \"%d.%d.%d.%d\" 0x\\1 0x\\2 0x\\3 0x\\4]} address\n+        set address [subst $address]\n+        set retValue $address\n+    }\n+\n+    return $retValue\n+}\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::convertNoop\n+#\n+# Description:      Place holder, doesn't do any thing\n+#\n+# Argument(s):      None\n+#               \n+# Returns:          None\n+#\n+########################################################################################\n+proc ipv6::convertNoop {address {args \"\"}} \\\n+{\n+}\n+\n+########################################################################################\n+#\n+#   Field 'get' Utilities\n+#   \n+########################################################################################\n+\n+proc ipv6::getAddressFields {} \\\n+{\n+    variable fieldNames\n+    return  $fieldNames\n+}\n+\n+########################################################################\n+# Procedure:    getFieldListByPrefix\n+#\n+# Description:  Given an address, return a list of the valid fields\n+#                   for that address type.\n+#\n+# Argument(s):  ipAddress:  IP address\n+#\n+# Returns:      field list (enums are interfaceId, subnetID, siteLevelAggregationId,\n+#                    nextLevelAggregationId, topLevelAggregationId).\n+#\n+########################################################################\n+proc ipv6::getFieldListByPrefix {address} \\\n+{\n+    variable fieldListByPrefix\n+\n+    set retValue {}\n+\n+    if {![ipV6Address decode $address]} {\n+        set prefixType [ipV6Address cget -prefixType]\n+        if {[info exists fieldListByPrefix($prefixType)]} {\n+            set retValue $fieldListByPrefix($prefixType)\n+        }\n+    }\n+    \n+    return $retValue    \n+}\n+\n+########################################################################\n+# Procedure:    getFieldNamesByPrefix\n+#\n+# Description:  Given an address, return a list of the field names\n+#                   for that address type.\n+#\n+# Argument(s):  ipAddress:  IP address\n+#\n+# Returns:      list of field names\n+#\n+########################################################################\n+proc ipv6::getFieldNamesByPrefix {address} \\\n+{\n+    variable fieldNamesByPrefix\n+\n+    set retValue {}\n+\n+    if {![ipV6Address decode $address]} {\n+        set prefixType [ipV6Address cget -prefixType]\n+        if {[info exists fieldNamesByPrefix($prefixType)]} {\n+            set retValue $fieldNamesByPrefix($prefixType)\n+        }\n+    }\n+\n+    return $retValue    \n+}\n+\n+\n+\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::getFormatPrefix\n+#\n+# Description:      Returns the format prefix of an IPv6 address.\n+#\n+# Argument(s):      address\n+#               \n+# Returns:          format prefix (enums: ipV6NSAPAllocation, ipV6GlobalUnicast, \n+#                                         ipV6LinkLocalUnicast, ipV6SiteLocalUnicast,\n+#                                         ipV6IPXAllocation, ipV6Multicast)\n+#\n+########################################################################################\n+proc ipv6::getFormatPrefix {address} \\\n+{\n+    set retValue {}\n+\n+    if {![ipV6Address decode $address]} {\n+        set retValue [list [ipV6Address cget -prefixValue]]\n+    }        \n+\n+    return $retValue\n+}\n+\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::getTopLevelAggregationId\n+#\n+# Description:      Returns the top level aggregation id of the global aggregate address.\n+#\n+# Argument(s):      address\n+#               \n+# Returns:          top level aggregation id\n+#\n+########################################################################################\n+proc ipv6::getTopLevelAggregateId {address} \\\n+{\n+    set retValue {}\n+\n+    if {![ipV6Address decode $address]} {\n+        if {[ipV6Address cget -prefixType] == $::ipV6GlobalUnicast} {\n+            set retValue [ipV6Address cget -topLevelAggregationId]\n+        }        \n+    }        \n+\n+    return $retValue\n+}\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::getNextLevelAggregationId\n+#\n+# Description:      Returns the Next Level Aggregation Id of the Global Aggregate address.\n+#\n+# Argument(s):      address\n+#               \n+# Returns:          next level aggregation id\n+#\n+########################################################################################\n+proc ipv6::getNextLevelAggregateId {address} \\\n+{\n+    set retValue {}\n+\n+    if {![ipV6Address decode $address]} {\n+        if {[ipV6Address cget -prefixType] == $::ipV6GlobalUnicast} {\n+            set retValue [ipV6Address cget -nextLevelAggregationId]\n+        }        \n+    }        \n+\n+    return $retValue\n+}\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::getSiteLevelAggregationId\n+#\n+# Description:      Returns the Site Level Aggregation Id of the Global Aggregate address.\n+#\n+# Argument(s):      address\n+#               \n+# Returns:          site level aggregation id\n+#\n+########################################################################################\n+proc ipv6::getSiteLevelAggregateId {address} \\\n+{\n+    set retValue {}\n+\n+    if {![ipV6Address decode $address]} {\n+        if {[ipV6Address cget -prefixType] == $::ipV6GlobalUnicast} {\n+            set retValue [ipV6Address cget -siteLevelAggregationId]\n+        }        \n+    }        \n+\n+    return $retValue\n+}\n+\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::getSubnetId\n+#\n+# Description:      Returns the Subnet Id of the Site Local address.\n+#\n+# Argument(s):      address\n+#               \n+# Returns:          subnet id\n+#\n+########################################################################################\n+proc ipv6::getSubnetId {address} \\\n+{\n+    set retValue {}\n+\n+    if {![ipV6Address decode $address]} {\n+        if {[ipV6Address cget -prefixType] == $::ipV6SiteLocalUnicast} {\n+            set retValue [ipV6Address cget -subnetId]\n+        }        \n+    }        \n+\n+    return $retValue\n+}\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::getInterfaceId\n+#\n+# Description:      Returns the Interface Id Global Aggregate, Site Local, or Link\n+#                       local address.\n+#\n+# Argument(s):      address\n+#               \n+# Returns:          interface id\n+#\n+########################################################################################\n+proc ipv6::getInterfaceId {address} \\\n+{\n+    set retValue {}\n+\n+    if {![ipV6Address decode $address]} {\n+        switch [ipV6Address cget -prefixType] \"\n+            $::ipV6GlobalUnicast -\n+            $::ipV6SiteLocalUnicast -\n+            $::ipV6LinkLocalUnicast {\n+                set retValue [list [ipV6Address cget -interfaceId]]\n+            }        \n+        \"        \n+    }        \n+\n+    return $retValue\n+}\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::getLoopbackAddress\n+#\n+# Description:      Returns the loopback address.\n+#\n+# Argument(s):      None\n+# Argument(s):      None\n+#               \n+# Returns:          loopback address\n+#\n+########################################################################################\n+proc ipv6::getLoopbackAddress {} \\\n+{\n+    variable addressLoopback\n+    return $addressLoopback\n+}    \n+\n+\n+########################################################################################\n+#\n+#   Validation Utilities\n+#   \n+########################################################################################\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::isValidAddress\n+#\n+# Description:      TRUE/FALSE: Is the given ipv6 address valid?\n+#\n+# Argument(s):      address\n+#                   type:       unicast (default), anycast, multicast\n+#               \n+# Returns:          ::true or ::false\n+#\n+########################################################################################\n+proc ipv6::isValidAddress {address {type unicast}} \\\n+{\n+    variable ipV4AddressSize \n+\n+    set retCode $::false\n+\n+    set segments        8\n+    set nibbleSize      4\n+    \n+    set segmentsBefore  {}\n+    set segmentsAfter   $address\n+    set ipv4Address     {}\n+    \n+    set count [regsub -all \":\" $address \":\" address]\n+    if {$count > 0 && $count <= [expr $segments-1]} {\n+    \n+        if {[isMixedVersionAddress $address]} {\n+            set end [expr [llength [split $address :]] - 1]\n+            set ipv4Address [lindex [split $address :] $end]\n+            regsub \"$ipv4Address\" $address {} address\n+            regsub -all {(.*)\\.(.*)\\.(.*)\\.(.*)} $ipv4Address \\\n+                {[format \"%02x%02x:%02x%02x\" \\1 \\2 \\3 \\4]} ipv4Address\n+            set ipv4Address [subst $ipv4Address]\n+            append address $ipv4Address\n+        }\n+        \n+        #\n+        # Fill in the zeroes needed to expand.\n+        set segmentsBefore {}\n+        set segmentsAfter  $address\n+        \n+        if {[regexp {(.*)::(.*)} $address match segmentsBefore segmentsAfter]} {\n+            set segmentsBefore [split $segmentsBefore :]\n+            set segmentsAfter  [split $segmentsAfter  :]\n+            set segmentsNeeded [expr  $segments - ([llength $segmentsBefore] + [llength $segmentsAfter])]\n+            set segmentList \"$segmentsBefore [string repeat \" 0\" $segmentsNeeded] $segmentsAfter\"\n+        } else {\n+            set segmentList [split $address :]\n+        }\n+        \n+        if {[llength [join $segmentList]] == 8} {\n+            set retCode $::true\n+            foreach segment $segmentList {\n+                if {[regexp {[^0-9a-fA-f]} $segment match] > 0} {\n+                    set retCode $::false\n+                    break\n+                }\n+                if {[mpexpr 0x$segment > 0xffff]} {\n+                    set retCode $::false\n+                    break\n+                }\n+            }\n+        }\n+    }\n+    \n+\n+    return $retCode\n+}\n+\n+########################################################################################\n+#\n+# Procedure:    ipv6::validAddress\n+#\n+# Description:  Given and address, determine it's validitiy\n+#\n+# Argument(s):  address:    ipv6 address\n+#               type:       unicast, multicast, anycast\n+#               \n+# Returns:      ::true or ::false\n+#\n+########################################################################################\n+proc ipv6::validateAddress {address {type unicast}} \\\n+{\n+    set retCode $::true\n+\n+\tset retCode [isValidAddress $address]\n+\n+\tif { $retCode } {\n+\n+\t\tswitch $type {\n+\t\t\tunicast -\n+\t\t\tanycast {\n+\t\t\t\t\n+\t\t\t}\n+\t\t\tmulticast {\n+\t\t\t\tset retCode [isValidMCAddress $address]\n+\t\t\t}\n+\t\t\tdefault {\n+\t\t\t\tset retCode $::false\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+    return $retCode\n+}\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::isReservedMCAddress\n+#\n+# Description:      TRUE/FALSE: Is this a reserved multicast address?\n+#\n+# Argument(s):      address:    Ipv6 address\n+#               \n+# Returns:          ::true or ::false\n+#\n+########################################################################################\n+proc ipv6::isReservedMCAddress {address} \\\n+{\n+    variable reservedMCAddressList\n+\tset retCode $::false\n+\n+\tset expand_address [ipv6::expandAddress $address]\n+\tif { [llength expand_address] } {\n+\n+\t\t# Check in the list for predefined multicast addresses\n+\t\tif { [lsearch $reservedMCAddressList $expand_address] < 0 } {\n+\n+\t\t\t# Check for Solicited-node addresses\n+\t\t\tif {[string first \"ff02:0000:0000:0000:0000:0001:ff\" $expand_address] < 0 } {\n+\t\t\t\n+\t\t\t\t# Check for Service location addresses\n+\t\t\t\tif { [string first \"ff05:0000:0000:0000:0000:0000:0001\" $expand_address] == 0} {\n+\t\t\t\t\tset splittedAddr [split $expand_address \":\"]\n+\t\t\t\t\tset comparedPart [format \"0x%s\" [lindex $splittedAddr 7]]\t\n+\t\t\t\t\tif { $comparedPart >= 0x1000 &&  $comparedPart <= 0x13ff } {\t\n+\t\t\t\t\t\tset retCode $::true\n+\t\t\t\t\t}\n+\t\t\t\t} \n+\t\t\t} else {\n+\t\t\t\tset retCode $::true\n+\t\t\t}\t\n+\t\t} else {\n+\t\t\tset retCode $::true\n+\t\t}\n+\t}\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::isValidMCAddress\n+#\n+# Description:      TRUE/FALSE: Is this a reserved multicast address?\n+#\n+# Argument(s):      address:    Ipv6 address\n+#               \n+# Returns:          ::true or ::false\n+#\n+########################################################################################\n+proc ipv6::isValidMCAddress {address} \\\n+{\n+    set retCode $::false\n+\n+\tset expand_address [ipv6::expandAddress $address]\n+\tif { [llength expand_address] } {\n+\n+\t\tset splittedAddr [split $expand_address \":\"]\n+\t\tset mcastPart [format \"0x%s\" [lindex $splittedAddr 0]]\n+\t\tif { $mcastPart >= 0xff00 &&  $mcastPart <= 0xff1f } {\t\n+\t\t\tset retCode $::true\n+\t\t}\n+\t}\n+\t\t\t\n+    return $retCode\n+}\n+\n+########################################################################################\n+#\n+# Procedure:        ipv6::isMixedVersionAddress\n+#\n+# Description:      Given an IPv6 address, determine if it is compiled of both\n+#                   IPv4 and IPv6 components, ie:\n+#\n+#                           0:0:0:0:0:0:192.168.10.1 \n+#\n+# Argument(s):      address:    Ipv6 address (any acceptable IPv6 format)\n+#               \n+# Returns:          ::true or ::false\n+#\n+########################################################################################\n+proc ipv6::isMixedVersionAddress {address} \\\n+{\n+    set retCode $::false\n+    set address [lindex [split $address :] end]\n+    if {[llength [split $address .]] == 4} {\n+        set retCode $::true\n+    }\n+        \n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure:    incrIpV6Field\n+#\n+# Description:  Increments the specified field of a 128 bit IPv6 address\n+#\n+# Argument(s):  ipAddress:  IP address whose field to be incremented\n+#               field:      IPv6 - field to be incremented, default is interfaceId\n+#                                  refer to TCLIpV6Address field enumerations, or \n+#\t\t\t\t\t\t\t\t   any prefix, overflow is not supported yet\n+#               increment:  increment the field by this number, default is 1\n+#\n+# Returns:      Modified IP address\n+#\n+########################################################################\n+proc ipv6::incrIpField {address {prefix 128} {increment 1} } \\\n+{\n+    variable  fieldPositions\n+\n+    set newAddress {}\n+\tset errorFlag  0\n+\n+    if {[info exists fieldPositions($prefix)]} {\n+        set prefix $fieldPositions($prefix)\t\n+    } else {\n+\t\tif {[isValidInteger $prefix] } {\n+\t\t\tif { $prefix  > 128 || $prefix  < 0 } { \n+\t\t\t\terrorMsg \"Error: Invalid prefix value, must be between 0 - 128, inclusive\"\n+\t\t\t\tset errorFlag 1\n+\t\t\t} \n+\t\t} else {\n+\t\t\tset errorFlag 1\n+\t\t\terrorMsg \"Error: Invalid predefined field enumeration\"\n+\t\t}\n+\n+\t}\t\n+\tif { !$errorFlag } {  \t\n+\t\tipV6Address setDefault\n+\t\tif  {![ipV6Address decode $address]} {\n+\n+\t\t\tset prefixType [ipV6Address cget -prefixType]  \n+\t\t\tset newAddress [incIpv6AddressByPrefix $address $prefix  $increment]\n+\t\t\t \n+\t\t\t# Invalid if increment overflows into the format prefix.\n+\t\t\tif  {![ipV6Address decode $newAddress]} {\n+\t\t\t\tset newAddress [ipV6Address encode]\n+\t\t\t\tif {[ipV6Address cget -prefixType] != $prefixType} {\n+\t\t\t\t\tset newAddress {}\n+\t\t\t\t}\n+\t\t\t}\n+\t\t} else {\n+\t\t\terrorMsg \"Error: Invalid ipV6 address:$address\"\n+\t\t}\n+\t}\n+\n+    return $newAddress\n+}\n+\n+\n+\n+# This is NOT COMPLETE\n+# The idea was to get the previous field to the \"prefix\" from the fieldListByPrefix\tthen \n+# make sure it didn't change after increment, and only supports the predefined prefixes\n+# in order to finish this method, we need to create one more method, and test it\n+# proc getOverflowField { prefix prefixType } this will return the field that is overflown\n+\n+#proc ipv6::incrIpField_withOverflow {address {prefix 0} {increment 1} {wrapOverflow no} } \\\n+#{\n+#    variable  fieldPositions\n+#\n+#    set newAddress {}\n+#\tset predefinedField\t\t0\n+#\tset fieldMaxValue\t\t255\n+#\n+#    if {[info exists fieldPositions($prefix)]} {\n+#        set prefix $fieldPositions($prefix)\n+#\t\tset predefinedField 1\n+#    } else {\n+#\t\tset wrapOverflow no\n+#\t}\n+#     puts \"prefix:$prefix\"\n+#\n+#    ipV6Address setDefault\n+#    if  {![ipV6Address decode $address]} {\n+#\n+#        set prefixType [ipV6Address cget -prefixType]  \n+#        set newAddress [incIpv6AddressByPrefix $address $prefix  $increment]\n+#\t\tif { $predefinedField } {\n+#\t\t\tset overflowField\t[getOverflowField $prefix $prefixType]\n+#\t\t}\n+#\t\t \n+#        # Invalid if increment overflows into the format prefix.\n+#        if  {![ipV6Address decode $newAddress]} {\t\n+#\n+#            set newAddress [ipV6Address encode]\n+#\t\t\tif {$wrapOverflow == \"yes\" } {\n+#\t\t\t\tset newOverflowField  [hexlist2Value [ipV6Address cget -overflowField]]\n+#\t\t\t\tipV6Address decode $address\n+#\t\t\t\tset oldOverflowFieldValue [hexlist2Value [ipV6Address cget -overflowField]]\n+#\t\t\t\tif { $newOverflowField >  $oldOverflowFieldValue } {\n+#\t\t\t\t\tipV6Address config -$prefix [value2Hexlist $increment]\n+#\t\t\t\t}\n+#\t\t\t}\n+#\t\t\tset newAddress [ipV6Address encode] \n+#\t\t}\n+#    } else {\n+#\t\terrorMsg \"Invalid ipV6 address:$address\"\n+#\t}\n+#\n+#    return $newAddress\n+#} \n+\n+########################################################################\n+# Procedure:    convertIpv6AddrToBytes\n+#\n+# Description:  Converts the IPv6 into bytes \n+#\n+# Argument(s):  address:      IPv6 address\n+#\n+# Returns:      \n+#\n+########################################################################\n+proc ipv6::convertIpv6AddrToBytes { address } \\\n+{\n+    set expand_address [expandAddress $address]\n+    regsub -all \":\" $expand_address \" \" expand_address\n+    regsub -all {([0-9a-fA-F]{2})([0-9a-fA-F]{2})} $expand_address {\\1 \\2} addrList\n+    return $addrList\n+}\n+\n+########################################################################\n+# Procedure:    convertBytesToIpv6Address\n+#\n+# Description:  Converts the bytes into IPv6 address \n+#\n+# Argument(s):  address:      IPv6 address\n+#\n+# Returns:      \n+#\n+########################################################################\n+proc ipv6::convertBytesToIpv6Address { bytes } \\\n+{\n+   set str {}\n+   foreach {b1 b2} $bytes {\n+      lappend str \"$b1$b2\"\n+   }\n+   set str [join $str \":\"]\n+   return [compressAddress [join $str \"\"]]\n+}\n+\n+\n+########################################################################\n+# Procedure:    incIpv6AddressByPrefix\n+#\n+# Description:  Increments the specified field of a 128 bit IPv6 address\n+#\n+# Argument(s):  ipAddress:  IP address whose field to be incremented\n+#               prefix:     IPv6 - field to be incremented, default is 32\n+#               inc:\t\tincrement the prefix by this number, default is 1\n+#\n+# Returns:      Modified IP address\n+#\n+########################################################################\n+proc ipv6::incIpv6AddressByPrefix {ipAddress {prefix 32} {inc 1}} \\\n+{\n+    variable ipV6AddressSize \n+\n+\tset retAddress {}\n+\n+\tif {[isValidInteger $prefix] } {\n+\t\tif { $prefix  > 128 || $prefix  < 0 } { \n+\t\t\terrorMsg \"Error: Invalid prefix value, must be between 0 - 128, inclusive\"\n+\t\t\tset errorFlag 1\n+\t\t} else {\n+\t\t \tset ipAddress\t[expandAddress $ipAddress]\n+\t\t\tset host\t\t[mpexpr [hexlist2Value [convertIpv6AddrToBytes $ipAddress]] & (int(pow(2,($ipV6AddressSize - $prefix)) - 1))]\n+\t\t\tset network\t\t[mpexpr [hexlist2Value [convertIpv6AddrToBytes $ipAddress]] >> ($ipV6AddressSize - $prefix)]\n+\t\t\tmpincr\tnetwork $inc\n+\n+\t\t\tset retAddress\t[convertBytesToIpv6Address [value2Hexlist [mpexpr ($network << ($ipV6AddressSize - $prefix)) | $host] 16]]\n+\t\t}\n+\t} else {\n+\t\terrorMsg \"Error: Expecting integer prefix value between 0 - 128, inclusive.\"\n+\t}\n+\treturn $retAddress\n+}\n+\n+########################################################################\n+# Procedure:    getFieldMask\n+#\n+# Description:  Return the IPv6 Field Mask (used with stream increment).\n+#\n+# Argument(s):  field:      IPv6 - field to be incremented, default is interfaceId\n+#                                  refer to TCLIpV6Address field enumerations\n+#\n+# Returns:      mask\n+#\n+########################################################################\n+proc ipv6::getFieldMask {{field interfaceId}} \\\n+{\n+    variable fieldPositions\n+\n+    set mask 64\n+\n+    switch $field {\n+        interfaceId {\n+            set mask 64\n+        }\n+        subnetId -\n+        siteLevelAggregationId -\n+        nextLevelAggregationId -\n+        topLevelAggregationId {\n+            if {[info exists fieldPositions($field)]} {\n+                set mask $fieldPositions($field)\n+            }\n+        }\n+    }\n+\n+    return $mask\n+}\n+\n+########################################################################\n+# Procedure:    getMinimumValidFramesize\n+#\n+# Description:  Returns the minimum valid header length for and IPv6\n+#               packet.\n+\n+#               IPv6 header length can vary depending on the options\n+#               selected.  The base header is 40 bytes long.\n+#\n+# Argument(s):  useUdf\n+#               useFir\n+#\n+# Returns:      minimum acceptable frame size\n+#\n+########################################################################\n+proc ipv6::getMinimumValidFramesize {{useUdf true} {useFir true}} \\\n+{\n+    global kFirSize\tkCrcSize kUdfSize kHeaderLength\n+\n+    if {$useFir == \"true\"} {\n+        set firSize $kFirSize\n+    } else {\n+        set firSize 0\n+    }\n+\n+    if {$useUdf == \"true\"} {\n+        set udfSize $kUdfSize\n+    } else {\n+        set udfSize 0\n+    }\n+\n+    set minimum [expr [getHeaderLength] + \\\n+                      $firSize + \\\n+                      $udfSize + \\\n+                      $kCrcSize]\n+\n+    set minimum [expr $minimum & 0xfffffffe]\n+\n+}\n+\n+########################################################################\n+# Procedure:    getHeaderLength\n+#\n+# Description:  Return the length of the IPv6 Header including the\n+#               MAC and UDP headers (in other words, everything up to\n+#               the payload).\n+#\n+#               NOTE:   THis is incomplete since it handles only\n+#                       the simplest case... needs work.\n+#\n+# Arguments(s): None\n+#\n+# Returns:      length of IPv6 header\n+#\n+########################################################################\n+proc ipv6::getHeaderLength {} \\\n+{\n+    global kHeaderLength\n+\n+    set headerLength 0\n+\n+    if {[protocol cget -name] == $::ipV6} {\n+        set headerLength   $::DaSaLength\n+        switch [protocol cget -ethernetType] \"\n+            $::ethernetII -\n+            $::ieee8023 -\n+            $::ieee8022 {\n+                incr headerLength   2\n+            }\n+            $::ieee8023snap {\n+                incr headerLength   10\n+            }\n+        \"\n+        incr headerLength [expr $::kHeaderLength(ipV6) + $::udpHeaderLength]\n+    }\n+\n+    return $headerLength\n+}\n+\n+########################################################################\n+# Procedure:    getAddressFieldOffset\n+#\n+# Description:  Return the offset to the given address field from the\n+#               start of the IPv6 address field (not from the start of\n+#               the header).\n+#\n+# Arguments(s): field:      prefix, topLevelAggregationId, nextLevelAggregationId,\n+#                           siteLevelAggregationId, subnetId, interfaceId\n+#\n+# Returns:      Offset\n+#\n+########################################################################\n+proc ipv6::getAddressFieldOffset {field} \\\n+{\n+    variable  fieldOffsets\n+\n+    set retValue 0\n+\n+    if {[info exists fieldOffsets($field)]} {\n+        set retValue $fieldOffsets($field)\n+    }\n+\n+    return $retValue\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/ixFileUtils.tcl b/dep/tclclient/ixTcl1.0/Generic/ixFileUtils.tcl\nnew file mode 100644\nindex 00000000..b54a753a\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/ixFileUtils.tcl\n@@ -0,0 +1,158 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: ixFileUtils.tcl\n+#    Copyright ©  IXIA\n+#    All Rights Reserved.\n+#\n+#    Revision Log:\n+#    09-05-2002    MG    Genesis\n+#\n+# Description: Contains miscellaneous file commands.\n+#\n+##################################################################################\n+\n+\n+namespace eval ixFileUtils {\n+    variable filesToClose \"\"\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixFileUtils::closeOpenFiles\n+#\n+# Description: Either close all open file handles or close all file handles opened by Ixia routines\n+#              The advanced test parameter closeAllFilesInCleanUp controls which one is done\n+#\n+# Arguments:   None\n+#\n+# Returns:     Nothing\n+########################################################################\n+proc ixFileUtils::closeAll {} \\\n+{\n+    variable filesToClose\n+\n+    if {[info tclversion] >= 8.3} {\n+        set closeAllFiles [advancedTestParameter cget -closeAllFilesInCleanUp]\n+        set listOfFiles \"\"\n+        if {$closeAllFiles} {\n+            set listOfFiles $filesToClose\n+        } else {\n+            foreach fileId [file channels file*] {\n+                set index [lsearch -exact $filesToClose $fileId]\n+                if {$index >= 0} {\n+                    lappend listOfFiles $fileId\n+                }\n+            }\n+        }\n+        foreach fileId $listOfFiles {\n+            close $fileId\n+        }        \n+    }\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixFileUtils::addFileToList\n+#\n+# Description: Add a file handle to the list of handles to be closed during the cleanUp procedure\n+#\n+# Arguments:   fileId - the file handle to add\n+#\n+# Returns:     Nothing\n+########################################################################\n+proc ixFileUtils::addFileToList { fileId } \\\n+{\n+    variable filesToClose\n+\n+    lappend filesToClose $fileId\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixFileUtils::removeFileFromList\n+#\n+# Description: Remove a file handle from the list of handles to be closed during the cleanUp procedure\n+#\n+# Arguments:   fileId - the file handle to remove\n+#\n+# Returns:     Nothing\n+########################################################################\n+proc ixFileUtils::removeFileFromList { fileId } \\\n+{\n+    variable filesToClose\n+\n+    set index [lsearch -exact $filesToClose $fileId]\n+    if {$index >= 0} {\n+        set filesToClose [lreplace $filesToClose $index $index]\n+    }\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixFileUtils::open\n+#\n+# Description: This command opens a file\n+#\n+# Arguments:   filename - full path to filename\n+#              access - file access parameter to use\n+#              permission - file permission parameter to use\n+#\n+# Returns:     fileID if successful, or \"\" if unsuccessful\n+########################################################################\n+proc ixFileUtils::open {filename {access \"\"} {permission \"\"}} \\\n+{\n+    if {[catch {eval ::open [list $filename] $access $permission} fileID]} {\n+        set fileID \"\"\n+    } else {\n+        ixFileUtils::addFileToList $fileID\n+    }\n+    return $fileID\n+}\n+\n+\n+########################################################################\n+# Procedure:   ixFileUtils::close\n+#\n+# Description: This command closes a file\n+#\n+# Arguments:   fileId - channel id of the file to be closed\n+#\n+# Returns:     Nothing\n+########################################################################\n+proc ixFileUtils::close {fileId} \\\n+{\n+    catch {::close $fileId}\n+    ixFileUtils::removeFileFromList $fileId\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/ixGraph.tcl b/dep/tclclient/ixTcl1.0/Generic/ixGraph.tcl\nnew file mode 100644\nindex 00000000..1a526ded\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/ixGraph.tcl\n@@ -0,0 +1,982 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: ixGraph.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#    Revision Log:\n+#    Date        Author                Comments\n+#    -----------    -------------------    --------------------------------------------\n+#    2001/06/11  D. Heins-Gelder     Initial release\n+#\n+# Description:  This file contains API commands for generating a graph\n+#               and displaying data on the graph.\n+#\n+##################################################################################\n+\n+package ifneeded BLT 2.4\n+\n+namespace eval ixGraph {\n+#\n+#   Public Procedures:  \n+#       ixGraph::create:            Create graph with given attributes\n+#       ixGraph::destroy            Destroy graph.\n+#       ixGraph::reset                Reset all data.\n+#       ixGraph::addLine            Add a line to given graph\n+#       ixGraph::deleteLine            Delete a line from given graph\n+#       ixGraph::resetLine            Clear a given line of it's data\n+#       ixGraph::updateLine              Add new x,y coordinates(s) to graph\n+#       ixGraph::updateCoordinates    Append new coordinate to either x or y axis.\n+#       ixGraph::getLines            Show a list of line names\n+#       ixGraph::getDataVector      Obtain data vector handle from graph\n+#       ixGraph::setDataVector      Set data vector handle in graph\n+#       ixGraph::updateDataVector   Append data to the end of the data vector  \n+#       ixGraph::resetDataVector    Clear data from the data vector   \n+#\n+\n+#   Private Procedures: \n+#       None\n+#\n+#   Private Variables:                                                           \n+#       None\n+#\n+#\n+#   SAMPLE USAGE:\n+#   -------------\n+#\n+#    SAMPLE 1\n+#\n+#set xyList \\\n+#    [list 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 9.5 11 9 12 8 13 7 14 6 15 5 16 4 17 3 18 2 19 1.5 20 2 21 3 22 4 23 5 24 6 25 7 26 8 27 9 28 8.5 29 9 30 8]\n+#\n+#set g [ixGraph::create .g    -title          \"MY GRAPH\"      \\\n+#                             -background     black           \\\n+#                             -foreground     white           \\\n+#                             -plotColor      grey            \\\n+#                             -legendColor    grey            \\\n+#                             -xColor         red             \\\n+#                             -yColor         red             \\\n+#                             -font           {Arial-Bold 14} \\\n+#                             -xTitle         \"X-AXIS TITLE\"  \\\n+#                             -yTitle         \"Y-AXIS TITLE\"  \\\n+#                             -xRange         [list 0 10 2]   \\\n+#                             -yRange         [list 0 10 2]   \\\n+#                             -logoFile       ixiaLogo.gif    \\\n+#                             -crossHairs     on              \\\n+#                             -grid           on              ]\n+#pack $g\n+#\n+#ixGraph::addLine $g rate     -color          white   \\\n+#                             -lineWidth      2       \n+#\n+## Update line with a list of coordinates.\n+#ixGraph::updateLine $g rate $xyList\n+#foreach {x y} $xyList {\n+## Update line with a single set of coordinates.\n+#    ixGraph::updateLine $g rate  [list $x $y]\n+#\n+##     or\n+#\n+## Update x / y coordinates individually.\n+#    ixGraph::updateCoordinate $g rate x [list $x] \n+#    ixGraph::updateCoordinate $g rate y [list $y] \n+#\n+#    after 250\n+#}\n+#\n+#ixGraph::destroy $g\n+#\n+#   END SAMPLE OF SAMPLE 1\n+\n+#\n+#    SAMPLE 2\n+#\n+#ixGraph::destroy $g\n+#stat setDefault\n+#set g [ixGraph::create .g    -title          \"MY GRAPH\"      \\\n+#                             -background     black           \\\n+#                             -foreground     white           \\\n+#                             -plotColor      grey            \\\n+#                             -legendColor    grey            \\\n+#                             -xColor         red             \\\n+#                             -yColor         red             \\\n+#                             -font           {Arial-Bold 14} \\\n+#                             -xTitle         \"X-AXIS TITLE\"  \\\n+#                             -yTitle         \"Y-AXIS TITLE\"  \\\n+#                             -xRange         [list 0 20 1]   \\\n+#                             -yRange         [list 0 200000 10000] \\\n+#                             -crossHairs     on              \\\n+#                             -grid           on              ]\n+#pack $g\n+#\n+#ixGraph::addLine $g rate     -color          white   \\\n+#                             -lineWidth      2       \n+#\n+#set i 0\n+#while {$i < 50} {\n+#    after 1000\n+#    incr i 1\n+#    stat get -bytesReceived 1 1 1\n+#    set value [stat cget -bytesReceived]\n+#    set value [expr $value / 1000]\n+#   ixGraph::updateLine $g rate [list $i $value]\n+#}\n+#   END SAMPLE OF SAMPLE 2\n+\n+}\n+## End of ixGraph namespace\n+\n+########################################################################################\n+# Procedure:    create\n+#\n+# Description:  Create a graph as a free-floating element and return it's handle  \n+#                   \n+# Input:        graphName:      window path name, ie: .myGraph or .window.myGraph      \n+#               args:           configuration parameters for the graph, the following\n+#                               are currently valid:\n+#                                   -title          value   - Graph Title\n+#                                   -foreground     value   - Graph foreground color (default grey)\n+#                                   -background     value   - Graph background color (default black)\n+#                                   -plotColor        value   - Color of plot area (default white)\n+#                                   -font           value   - Graph text font\n+#                                   -logoFile       value   - path and file of logo\n+#                                   -xTickFont      value   - font of the numbers on the graph\n+#                                   -yTickFont      value   - font of the numbers on the graph\n+#                                   -xTitle         value   - X Axis Title\n+#                                   -yTitle         value   - Y Axis Title\n+#                                   -xTitleFont     value   - font of the axis titles\n+#                                   -yTitleFont     value   - font of the axis titles\n+#                                   -xRange         value   - [list $minimum $maximum $step]\n+#                                   -yRange         value   - [list $minimum $maximum $step]\n+#                                   -xColor         value   - color of x axis titles\n+#                                   -yColor         value   - color of y axis titles\n+#                                   -grid           value   - on or off\n+#                                   -crossHairs     value   - on or off\n+#                                   -legendColor    value   - color of legend (default grey)\n+#\n+# Output:       \n+#\n+########################################################################################\n+proc ixGraph::create {graphName args} \\\n+{\n+    set parameters [list title          \"\"          \\\n+                         foreground     \"black\"     \\\n+                         background     \"grey\"      \\\n+                         plotColor      \"white\"     \\\n+                         legendColor    \"grey\"      \\\n+                         logoFile       \"\"          \\\n+                         font           {Arial 10}  \\\n+                         xTitle         \"\"          \\\n+                         xTitleFont     {Arial 10}  \\\n+                         xTickFont      {Arial 8}   \\\n+                         xMinimum       \"\"          \\\n+                         xMaximum       \"\"          \\\n+                         xStep          0.0         \\\n+                         xColor         \"black\"     \\\n+                         yTitle         \"\"          \\\n+                         yTitleFont     {Arial 10}  \\\n+                         yTickFont      {Arial 8}   \\\n+                         yMinimum       \"\"          \\\n+                         yMaximum       \"\"          \\\n+                         yStep          0.0         \\\n+                         yColor         \"black\"     \\\n+                         grid           \"off\"       \\\n+                         crossHairs     \"off\"       ]\n+\n+    set retValue \"\"\n+\n+    # Initialize graph parameters\n+    foreach {parameter value} $parameters {\n+        set $parameter $value\n+    }\n+    \n+    foreach {parameter value} $args {\n+        switch -- $parameter {\n+            -title {\n+                set title $value\n+            }\n+            -foreground {\n+                set foreground $value\n+            }\n+            -background {\n+                set background $value\n+            }\n+            -plotColor {\n+                set plotColor $value\n+            }\n+            -legendColor {\n+                set legendColor $value\n+            }\n+            -font {\n+                set font $value\n+            }\n+            -xTitle {\n+                set xTitle $value\n+            }\n+            -yTitle {\n+                set yTitle $value\n+            }\n+            -xColor {\n+                set xColor $value\n+            }\n+            -yColor {\n+                set yColor $value\n+            }\n+            -xTickFont {\n+                set xTickFont $value\n+            }\n+            -yTickFont {\n+                set yTickFont $value\n+            }\n+            -xTitleFont {\n+                set xTitleFont $value\n+            }\n+            -yTitleFont {\n+                set yTitleFont $value\n+            }\n+            -xRange {\n+                foreach {xMinimum xMaximum xStep} $value {}\n+                if {$xMaximum != \"\"} {\n+                    if {$xMinimum > $xMaximum} {\n+                        return $::TCL_ERROR\n+                    }\n+                }\n+            }\n+            -yRange {\n+                foreach {yMinimum yMaximum yStep} $value {}\n+                if {$yMaximum != \"\"} {\n+                    if {$yMinimum > $yMaximum} {\n+                        return $::TCL_ERROR\n+                    }\n+                }\n+                if {$yStep == \"\"} {set yStep 0}\n+            }\n+            -grid {\n+                switch $value {\n+                    on -\n+                    true -\n+                    yes {\n+                        set grid \"on\"\n+                    }\n+                }\n+            }\n+            -crossHairs {\n+                switch $value {\n+                    on -\n+                    true -\n+                    yes {\n+                        set crossHairs \"on\"\n+                    }\n+                }\n+            }\n+            -logoFile {\n+                if {[file exists $value]} {\n+                    set logoFile $value\n+                } else {\n+                    return $::TCL_ERROR\n+                }\n+            }\n+            default {\n+                return $retValue\n+            }\n+        }\n+    }\n+\n+    # Create graph and configure as requested.\n+    if {![catch {blt::graph $graphName} graph]} {\n+\n+        $graph configure -title $title\n+        $graph configure -bufferelements $::false\n+        $graph axis configure x -title $xTitle -min $xMinimum \\\n+            -max $xMaximum -stepsize $xStep\n+        $graph axis configure y -title $yTitle -min $yMinimum \\\n+            -max $yMaximum -stepsize $yStep -command \"stringFormatNumber value\"\n+\n+        $graph grid $grid\n+\n+        if {$crossHairs == \"on\"} {\n+            Blt_Crosshairs $graph\n+            $graph crosshairs configure -color grey\n+        }\n+\n+        $graph configure -foreground $foreground\n+        $graph configure -background $background\n+        $graph configure -plotbackground $plotColor\n+        $graph configure -font $font\n+\n+        $graph legend configure -background $legendColor\n+\n+        $graph axis configure x -tickfont $xTickFont\n+        $graph axis configure y -tickfont $yTickFont\n+        $graph axis configure x -titlefont $xTitleFont\n+        $graph axis configure y -titlefont $yTitleFont\n+        $graph axis configure x -color $xColor\n+        $graph axis configure y -color $yColor\n+        $graph axis configure x -titlecolor $foreground\n+        $graph axis configure y -titlecolor $foreground\n+\n+        if {$logoFile == \"on\"} {\n+            set marker [$graph marker create image \\\n+                -image [image create photo -file ixiaLogo.gif]]\n+            $graph marker configure $marker -coords {1 1} -under 1\n+        }\n+\n+        set retValue $graph\n+    }\n+\n+    return $retValue\n+}\n+\n+########################################################################################\n+# Procedure:    reset\n+#\n+# Description:  Set/Reset the graph and all associated data vectors to initial values.\n+#                   \n+# Input:        graph:      handle\n+#\n+# Output:       TCL_OK or TCL_ERROR\n+#\n+########################################################################################\n+proc ixGraph::reset {graph} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if ![winfo exists $graph] {\n+        return $::TCL_ERROR\n+    }\n+\n+    foreach item [$graph element names] {\n+        resetLine $graph $item\n+    }\n+\n+    # Axis maximum set dynamically, reset to auto scale.\n+    $graph yaxis configure -max \"\"\n+\n+    update idletasks\n+    return $retCode    \n+\n+}\n+\n+########################################################################################\n+# Procedure:    destroy\n+#\n+# Description:  Deletes all data associated with the graph.\n+#                   \n+# Input:        graph:      handle\n+#\n+# Output:       TCL_OK or TCL_ERROR\n+#\n+########################################################################################\n+proc ixGraph::destroy {graph} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if {![winfo exists $graph]} {\n+        return $::TCL_ERROR\n+    }\n+\n+    foreach item [$graph element names] {\n+        blt::vector destroy [$graph element cget $item -xdata]\n+        blt::vector destroy [$graph element cget $item -ydata]\n+\n+        $graph element delete $item\n+    }\n+    ::destroy $graph\n+\n+    return $retCode    \n+\n+}\n+\n+########################################################################################\n+# Procedure:    addLine\n+#\n+# Description:  Add a data line to the given graph.\n+#                   \n+# Input:        graph:      handle\n+#               args:       configuration parameters for the graph, the following\n+#                           are currently valid:\n+#\n+#                           -color      value   - line color name (ie red) or\n+#                                                  hex value (ie #000000)\n+#                           -lineWidth  value   - line size (default 1)\n+#                           -dashes     value   - # from 1-255, \"\" is solid line\n+#                           -legendFont value   - Font of legend text\n+#                           \n+# Output:       vector handle\n+#\n+########################################################################################\n+proc ixGraph::addLine {graph name args} \\\n+{\n+    set parameters [list    color       black     \\\n+                            symbol      none      \\\n+                            smooth      linear    \\\n+                            lineWidth   1         \\\n+                            dashes      \"\"        \\\n+                            legendFont  {Arial 7} \\\n+                                                  ]\n+\n+    set retValue \"\"\n+\n+    # Initialize graph parameters\n+    foreach {parameter value} $parameters {\n+        set $parameter $value\n+    }\n+\n+    if {![winfo exists $graph]} {\n+        return $retValue\n+    }\n+\n+    foreach {parameter value} $args {\n+        switch -- $parameter {\n+            -color {\n+                set color $value\n+            }\n+            -xSize {\n+                set xSize $value\n+            }\n+            -ySize {\n+                set ySize $value\n+            }\n+            -symbol {\n+                set symbol $value\n+            }\n+            -lineWidth {\n+                set lineWidth $value\n+            }\n+            -dashes {\n+                set dashes $value\n+            }\n+            -legendFont {\n+                set legendFont $value\n+            }\n+            default {\n+                return $retValue\n+            }\n+        }\n+    }               \n+\n+    if {![catch {$graph element create $name}]} {\n+        set xVector [blt::vector create #auto(1)]\n+        set yVector [blt::vector create #auto(1)]\n+\n+\n+        $graph element configure $name -xdata       $xVector\n+        $graph element configure $name -ydata       $yVector\n+        $graph element configure $name -color       $color\n+        $graph element configure $name -symbol      $symbol\n+        $graph element configure $name -smooth      $smooth\n+        $graph element configure $name -linewidth   $lineWidth\n+        $graph element configure $name -dashes      $dashes\n+        $graph legend  configure -font $legendFont\n+\n+        set retValue [list $xVector $yVector]\n+    }\n+\n+    return $retValue\n+}\n+\n+########################################################################################\n+# Procedure:    getLines\n+#\n+# Description:  Get a list of lines attached to a graph.\n+#                   \n+# Input:        graph:      handle\n+#                           \n+# Output:       List of lines attached to graph\n+#\n+########################################################################################\n+proc ixGraph::getLines {graph} \\\n+{\n+\n+    set retCode $::TCL_OK\n+\n+    if ![winfo exists $graph] {\n+        return $::TCL_ERROR\n+    }\n+\n+    return [lsort [$graph element names]]\n+}\n+\n+\n+########################################################################################\n+# Procedure:    deleteLine\n+#\n+# Description:  Delete a line from the given graph.\n+#                   \n+# Input:        graph:      handle\n+#               line:       name of graph line\n+#                           \n+# Output:       vector handle\n+#\n+########################################################################################\n+proc ixGraph::deleteLine {graph name} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if ![winfo exists $graph] {\n+        return $::TCL_ERROR\n+    }\n+\n+    if {[lsearch [$graph element names] $name] < 0} {\n+        return $::TCL_ERROR\n+    }\n+\n+    set xVector [$graph element cget $name -xdata]\n+    if {$xVector != \"\"} {\n+        blt::vector destroy $xVector\n+    }\n+    set yVector [$graph element cget $name -ydata]\n+    if {$yVector != \"\"} {\n+        blt::vector destroy $yVector\n+    }\n+\n+    if {[catch {$graph element delete $name}]} {\n+        set retCode $::TCL_ERROR\n+    }\n+     \n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure:    resetLine\n+#\n+# Description:  Resets a graph line to no data.\n+#                   \n+# Input:        graph:      handle\n+#               line:       name of graph line\n+#                           \n+# Output:       vector handle\n+#\n+########################################################################################\n+proc ixGraph::resetLine {graph line} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    # Valid graph handle?\n+    if ![winfo exists $graph] {\n+        return $::TCL_ERROR\n+    }\n+\n+    # Is the given line a member of this graph?\n+    if {[lsearch [$graph element names] $line] < 0} {\n+        return $::TCL_ERROR\n+    }\n+\n+    # Clear the x & y vectors.\n+    if {[set xVector [$graph element cget $line -xdata]] != \"\"} {\n+        resetDataVector $graph $xVector\n+    }\n+    if {[set yVector [$graph element cget $line -ydata]] != \"\"} {\n+        resetDataVector $graph $yVector\n+    }\n+\n+    $graph axis view x moveto 0.0\n+}\n+\n+########################################################################################\n+# Procedure:    updateLine\n+#\n+# Description:  Inserts new data into a given line.\n+#                   \n+# Input:        graph:          handle\n+#               line:           name of graph line\n+#               xyCoordinate:   [list x y x1 y1 x2 x2 .... xn yn]\n+#                           \n+# Output:       vector handle\n+#\n+########################################################################################\n+proc ixGraph::updateLine {graph line xyCoordinate} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if ![winfo exists $graph] {\n+        return $::TCL_ERROR\n+    }\n+\n+    if {[lsearch [$graph element names] $line] < 0} {\n+        return $::TCL_ERROR\n+    }\n+\n+    # Don't allow graph to grow beyond size setting.\n+    set xVector [$graph element cget $line -xdata]\n+    set yVector [$graph element cget $line -ydata]\n+\n+    foreach {x y} $xyCoordinate {\n+        updateDataVector $graph $xVector $yVector [list $x $y]\n+\n+        set xMaximum [$graph xaxis cget -max]\n+        if {$x > $xMaximum} {\n+            $graph axis view x moveto 1.0\n+        }\n+    }  \n+    update idletasks\n+          \n+    return $retCode\n+}\n+\n+########################################################################################\n+# Procedure:    getDataVector\n+#\n+# Description:  Given a graph and line, return the data vector \n+#                   associated with the given axis.\n+#                   \n+# Input:        graph:      handle\n+#               line:       desired line (name of)\n+#               axis:       x or y\n+#                           \n+# Output:       vector handle\n+#\n+########################################################################################\n+proc ixGraph::getDataVector {graph line axis} \\\n+{\n+    set retValue \"\"\n+\n+    # Valid graph?\n+    if {[winfo exists $graph]} {\n+\n+        # Valid line?\n+        if {[lsearch [getLines $graph] $line] >= 0} {\n+            switch $axis {\n+                x {\n+                    set retValue [$graph element cget $line -xdata]\n+                }\n+                y {\n+                    set retValue [$graph element cget $line -ydata]\n+                }\n+                default {\n+                    set retValue \"\"\n+                }\n+            }\n+        }\n+    }\n+    return $retValue\n+}\n+\n+########################################################################################\n+# Procedure:    setDataVector\n+#\n+# Description:  Associate the given data vector with the given graph-line-axis \n+#                   combination.\n+#                   \n+# Input:        graph:      graph handle\n+#               line:       line handle\n+#               axis:       x or y\n+#               vector:     vector handle\n+#                           \n+# Output:       TCL_OK or TCL_ERROR\n+#\n+########################################################################################\n+proc ixGraph::setDataVector {graph line axis vector} \\\n+{\n+    set retCode $::TCL_ERROR\n+\n+    if {[winfo exists $graph]} {\n+\n+        if {[lsearch [getLines $graph] $line] >= 0} {\n+            switch $axis {\n+                x {\n+                    $graph element config $line -xdata $vector\n+                    set retCode $::TCL_OK\n+                }\n+                y {\n+                    $graph element config $line -ydata $vector\n+                    set retCode $::TCL_OK\n+                }\n+                default {\n+                    set retCode $::TCL_ERROR\n+                }\n+            }\n+        }\n+    }\n+    return $retCode\n+}\n+\n+########################################################################################\n+# Procedure:    resetDataVector\n+#\n+# Description:  Resets a data vector to no data.\n+#                   \n+# Input:        graph:      graph handle\n+#               vector:     vector handle\n+#                           \n+# Output:       vector handle\n+#\n+########################################################################################\n+proc ixGraph::resetDataVector {graph vector} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    # Valid graph handle?\n+    if ![winfo exists $graph] {\n+        return $::TCL_ERROR\n+    }\n+\n+    # Valid vector handle?\n+    if {![info exists $vector]} {\n+        return $::TCL_ERROR\n+    }\n+\n+    if {[$vector length] > 0} {\n+        $vector delete 0:end\n+    }\n+}\n+\n+\n+########################################################################################\n+# Procedure:    updateDataVectorPair\n+#\n+# Description:  Inserts new data into a given vector x,y pair.\n+#                   \n+# Input:        graph:          handle\n+#               vector:         vector handle\n+#               xyCoordinate:   [list x y x1 y1 x2 x2 .... xn yn]\n+#                           \n+# Output:       vector handle\n+#\n+########################################################################################\n+proc ixGraph::updateDataVectorPair {graph xVector yVector xyCoordinate} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if {![winfo exists $graph]} {\n+        return $::TCL_ERROR\n+    }\n+\n+    foreach {x y} $xyCoordinate {\n+\n+        updateDataVector $graph $xVector $yVector x $x\n+        updateDataVector $graph $xVector $yVector y $y\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure:    updateDataVector\n+#\n+# Description:  Inserts new data into a given vector\n+#                   \n+# Input:        graph:          handle\n+#               vector:         vector handle\n+#               Coordinate:     [list x x1 x2 ... xn] OR [list y y1 y2 ... yn]\n+#               increment:      graph update increment (ie, how often is the graph updated)\n+#                           \n+# Output:       vector handle\n+#\n+########################################################################################\n+proc ixGraph::updateDataVector {graph xVector yVector axis coordinates {increment 1}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if {![winfo exists $graph]} {\n+        return $::TCL_ERROR\n+    }\n+\n+    switch $axis {\n+        x {\n+            set vector $xVector\n+        }\n+        y {\n+            set vector $yVector\n+        }\n+        default {\n+            return $::TCL_ERROR\n+        }\n+    }\n+\n+    set xMaximum [$graph xaxis cget -max]\n+    set xMinimum [$graph xaxis cget -min]\n+    set windowLength [expr $xMaximum-$xMinimum]\n+\n+    foreach coordinate $coordinates {\n+\n+        # BLT is limited to an signed long - temporary fix.\n+        if {$coordinate < 0} {\n+            set coordinate 0x07fffffff\n+            errorMsg \"Negative number encountered\"\n+        }\n+        if {[catch {set ${vector}(++end) $coordinate} errorMsg]} {\n+            errorMsg \"$errorMsg\"\n+            set ${vector}(++end) 0x07fffffff\n+        }\n+\n+        # Dynamically set maximum for Y axis.\n+        set yMaximum [$graph yaxis cget -max]\n+        if {$yMaximum == \"\" } {\n+            $graph yaxis config -max 100\n+        }\n+        if {[$graph yaxis cget -max] < $coordinate} {\n+            if {[catch {$graph yaxis config -max [expr {round($coordinate*1.05)}]}]} {\n+                $graph yaxis config -max [expr {round($coordinate)}]\n+            }\n+        }\n+\n+        if {[$vector length] > [expr {$windowLength/$increment}]} {\n+            $xVector delete 0:0\n+            $yVector delete 0:0\n+        }\n+        advanceBuffer $graph $xVector $windowLength $increment\n+    }        \n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure:    updateCoordinates\n+#\n+# Description:  Append new data into the given axis on the given line in the given\n+#                    graph.\n+#                   \n+# Input:        graph:          handle\n+#               line:           name of graph line\n+#               axis:            x or y\n+#               coordinates:    [list value1 value2 value 3... valuen]\n+#               increment:      graph update increment (ie, how often is the graph updated)\n+#                           \n+# Output:       vector handle\n+#\n+########################################################################################\n+proc ixGraph::updateCoordinates {graph line axis coordinates {increment 1}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if ![winfo exists $graph] {\n+        return $::TCL_ERROR\n+    }\n+\n+    if {[lsearch [$graph element names] $line] < 0} {\n+        return $::TCL_ERROR\n+    }\n+\n+    set xVector [$graph element cget $line -xdata]\n+    set yVector [$graph element cget $line -ydata]\n+\n+    switch $axis {\n+        x {\n+            set vector $xVector\n+        }\n+        y {\n+            set vector $yVector\n+        }\n+        default {\n+            return $::TCL_ERROR\n+        }\n+    }\n+\n+    set xMaximum [expr {round([$graph xaxis cget -max])}]\n+    set xMinimum [expr {round([$graph xaxis cget -min])}]\n+    set windowLength [expr $xMaximum-$xMinimum]\n+\n+    foreach coordinate $coordinates {\n+\n+        # BLT is limited to an signed long - temporary fix.\n+        if {$coordinate < 0} {\n+            set coordinate 0x07fffffff\n+            errorMsg \"Negative number encountered, statistic: $line.\"\n+        }\n+        if {[catch {set ${vector}(++end) $coordinate} errorMsg]} {\n+            errorMsg \"$errorMsg\"\n+            set ${vector}(++end) 0x07fffffff\n+        }\n+\n+        # Dynamically set maximum for Y axis.\n+        set yMaximum [$graph yaxis cget -max]\n+        if {$yMaximum == \"\" } {\n+            $graph yaxis config -max 100\n+        } \n+        if {[$graph yaxis cget -max] < $coordinate} {\n+            if {[catch {$graph yaxis config -max [expr {round($coordinate*1.05)}]}]} {\n+                $graph yaxis config -max [expr {round($coordinate)}]\n+            }\n+        }\n+\n+        if {[$vector length] > [expr {$windowLength/$increment}]} {\n+            $yVector delete 0:0\n+            $xVector delete 0:0\n+\n+            $graph axis view x moveto [mpexpr 1.0/[$xVector length]]\n+        }\n+        advanceBuffer $graph $xVector $windowLength $increment\n+    }        \n+\n+    return $retCode\n+}\n+\n+########################################################################################\n+# Procedure:    advanceBuffer\n+#\n+# Description:  The x axis contains time data which can be determined at the start of\n+#                   the test, therefore to optimize graphing the x axis is updated\n+#                   in multiples of the window length.  This procedure performs the\n+#                   incrementation of the x axis vector.\n+#                   \n+# Input:        graph:          handle\n+#               vector:         vector handle\n+#               range:          increment size  (window)\n+#               increment:      graph update increment\n+#                           \n+# Output:       $::TCL_ERROR or $::TCL_OK\n+#\n+########################################################################################\n+proc ixGraph::advanceBuffer {graph vector range {increment 1}} \\\n+{\n+    set retCode $::TCL_OK\n+   \n+    if ![winfo exists $graph] {\n+        return $::TCL_ERROR\n+    }\n+\n+    if {[$vector length] > [expr {$range/$increment}]} {\n+        return $::TCL_OK\n+    }\n+\n+    set nextVectorSegment [blt::vector create #auto(1)]\n+    #set range [expr round($range - 1)]\n+    $nextVectorSegment set [$vector range 0 [mpexpr $range/$increment-1]]\n+ \n+    $nextVectorSegment expr {$nextVectorSegment + $range}\n+    $vector append $nextVectorSegment\n+\n+    blt::vector destroy $nextVectorSegment\n+\n+    return $retCode\n+}\n+\n+\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/log.tcl b/dep/tclclient/ixTcl1.0/Generic/log.tcl\nnew file mode 100644\nindex 00000000..ae5d2e9b\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/log.tcl\n@@ -0,0 +1,177 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: log.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t10-22-1999\tHS\tGenesis\n+#\n+# Description: Command to set log parameters.\n+#\n+##################################################################################\n+\n+\n+\n+#######################################################################################\n+# Procedure: logger::on\n+#\n+# Description: This command is used to turn on logging. Usage is as follows:\n+#\t\t\t\tlog on\n+#\n+#######################################################################################\n+proc logger::on {args} \\\n+{\n+\tglobal loggerParms\n+\n+    # if there are any current log files open, close them first\n+    if [info exists loggerParms(enabled)] {\n+        logOff\n+    }\n+\n+    set loggerParms(enabled) 1\n+    if {[string length [logger cget -logFileName]] == 0} {\n+        logger config -logFileName     defaultFile.log\n+        logger config -fileBackup      false\n+    }\n+\n+    set loggerParms(fileID)  [openMyFile [logger cget -logFileName]]\n+\n+    set startTime [clock seconds]\n+    catch {results config -startTime $startTime}\n+\n+    puts [logger cget -fileID] \">>>>>>> Start Time: [clock format [clock seconds] -format \"%A, %b %d, %Y    %I:%M:%S %p\"]\\n\"\n+    logger config -startTime $startTime\n+\n+    if {[info script] != \"\"} {\n+        puts [logger cget -fileID] \"\\nFile being sourced : [info script]\\n\"\n+    }\n+}\n+\n+\n+#######################################################################################\n+# Procedure: logger::off\n+#\n+# Description: This command is used to turn off logging. Usage is as follows:\n+#\t\t\t\tlog off\n+#\n+#######################################################################################\n+proc logger::off {args} \\\n+{\n+    global loggerParms\n+\n+    if [info exists loggerParms(enabled)] {\n+        logger config -endTime [clock seconds]\n+        if {[info exists loggerParms(fileID)]} {\n+\t\t    puts [logger cget -fileID] \"\\n>>>>>>> End Time: [clock format [clock seconds] -format \"%A, %b %d, %Y    %I:%M:%S %p\"]\"\n+\t\t    puts [logger cget -fileID] \"Actual Duration of Test: [formatDurationTime [expr $loggerParms(endTime) - $loggerParms(startTime)]] seconds\"\n+\t        flush [logger cget -fileID]\n+\t\t    if {[logger cget -fileID] != \"stdout\"} {\n+\t\t\t    closeMyFile [logger cget -fileID]\n+\t\t    }\n+            set loggerParms(fileID) stdout\n+        }\n+        unset loggerParms(enabled)\n+    }\n+}\n+\n+\n+###############################################################################\n+# Procedure: logger::message\n+#\n+# Description: This command is used to write messages to the log.\n+#              Usage is as follows:\n+#                  log message <-priority 1> \"This is my message\"\n+#\n+###############################################################################\n+proc logger::message {args} \\\n+{\n+    global loggerParms loggerMethods tcl_platform\n+\n+    set argLen [llength $args]\n+    set type   logger\n+\n+    if {[lindex $args 0] == \"-priority\"} {\n+        set args  [lreplace $args 0 0]\n+        set value [lindex $args 0]\n+        if [catch {format %d $value} err] {\n+            set errMsg \"Usage: $type message \"\n+            foreach op $loggerMethods(message) {\n+                set errMsg [format \"%s\\n       -$op <value> <message>\" $errMsg]\n+            }\n+            error $errMsg\n+            return\n+        }\n+        set args [lreplace $args 0 0]\n+        # set the priority here when we decide to use it...\n+    }\n+\n+    if {[lindex $args 0] == \"-nonewline\"} {\n+        set args [lreplace $args 0 0]\n+\n+        catch {puts -nonewline [logger cget -ioHandle] [join $args \" \"]}\n+\n+        if [info exists loggerParms(enabled)] {\n+            puts -nonewline [logger cget -fileID] [join $args \" \"]\n+        }\n+    } else {\n+        catch {puts [logger cget -ioHandle] [join $args \" \"]}\n+\n+        if [info exists loggerParms(enabled)] {\n+            puts [logger cget -fileID] [join $args \" \"]\n+        }\n+    }\n+\n+    flush [logger cget -ioHandle]\n+\n+    # required not only for flushing the stdout, but also to flush anything from the\n+    # open socket connections  (should probably revisit the socket code later)\n+    update\n+}\n+\n+\n+#######################################################################################\n+# Procedure: logger::show\n+#\n+# Description: This command is used to show log parameters. Usage is as follows:\n+#\t\t\t\tlogger show\n+#\n+#######################################################################################\n+proc logger::show {args} \\\n+{\n+    ixPuts \"\tlogger parameters\"\n+    ixPuts \"\t==================================\"\n+    showCmd logger\n+}\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/logCollector.tcl b/dep/tclclient/ixTcl1.0/Generic/logCollector.tcl\nnew file mode 100644\nindex 00000000..35935976\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/logCollector.tcl\n@@ -0,0 +1,162 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: logCollector.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t05-29-2007\tDS\n+#\n+# Description: This file contains procs used to collect & send logs to support\n+#\n+##################################################################################\n+\n+\n+########################################################################\n+# Procedure: ixCollectAndSendLogs\n+#\n+# This command wraps the exe used to collect logs, zip them & send them to support\n+#\tNOTE:  This command does NOT require a package req IxTclHal to run\n+#\n+# Arguments(s):\n+#\targList - options include:\n+#\t\t-chassis <hostname><.card><.port>\n+#\t\t-userEmail <my email, used to cc on support email>\n+#\t\t-supportEmail <my favourite support person's email>\n+#\t\t-stepsToReproduce <text describing how to reproduce the issue>\n+#\t\t-zipFileName <myZipFile.zip>\n+#\n+########################################################################\n+proc ixCollectAndSendLogs {args} \\\n+{\n+    set level\t  [expr [info level]]\n+    set procName  \"[lindex [info level $level] 0]\"\n+\n+\tset optList {-chassis -userEmail -supportEmail -stepsToReproduce -zipFileName}\n+\n+\tif {[llength $args] == 0} {\n+\t\tputs \"Usage: $procName \"\n+\t\tforeach op $optList {\n+\t\t\tputs \"       $op  <[string trimleft $op \"-\"]>\"\n+\t\t}\n+\t\tflush stdout\n+\t\treturn 1\n+\t}\n+\n+\t# this has to change, but leaving it here for the moment...\n+\tset exeString [list exec \"../diagnostic/logcollectorclient.exe\"]\n+\n+\tforeach {option parameter} $args {\n+\t\tswitch -glob -- $option {\n+\t\t\t-chassis {\n+\t\t\t\tset parameter [split $parameter .]\n+\t\t\t\tset result [scan $parameter \"%s %d %d\" chassis card port]\n+\t\t\t\tswitch -- $result {\n+\t\t\t\t\t1 {\n+\t\t\t\t\t\tset exeString [concat $exeString \"--chassis $chassis\"]\n+\t\t\t\t\t}\n+\t\t\t\t\t2 {\n+\t\t\t\t\t\tset exeString [concat $exeString \"--chassis $chassis,$card\"]\n+\t\t\t\t\t}\n+\t\t\t\t\t3 {\n+\t\t\t\t\t\tset exeString [concat $exeString \"--chassis $chassis,$card,$port\"]\n+\t\t\t\t\t}\n+\t\t\t\t\tdefault {\n+\t\t\t\t\t\tputs \"$procName:  No chassis/hostname specified\"\n+\t\t\t\t\t\treturn 1\n+\t\t\t\t\t}\n+\t\t\t\t}\t\t\t\t\t\t\t\t\n+\t\t\t}\n+\t\t\t-userEmail {\n+\t\t\t\t# just do some quickie checking looking for @ & .   The exe should do the rest.\n+\t\t\t\tif {[llength $parameter] > 0} {\n+\t\t\t\t\tif {[regexp -all {[@.]} $parameter] >= 2} {\n+\t\t\t\t\t\tlappend exeString \"--useremail=$parameter\"\n+\t\t\t\t\t} else {\n+\t\t\t\t\t\tputs \"$procName:  Invalid userEmail: $parameter\"\n+\t\t\t\t\t\treturn 1\n+\t\t\t\t\t}\n+\t\t\t\t} else {\n+\t\t\t\t\tputs \"$procName:  No userEmail specified\"\n+\t\t\t\t\treturn 1\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\t-supportEmail {\n+\t\t\t\t# just do some quickie checking looking for @ & .   The exe should do the rest.\n+\t\t\t\tif {[llength $parameter] > 0} {\n+\t\t\t\t\tif {[regexp -all {[@.]} $parameter] >= 2} {\n+\t\t\t\t\t\tlappend exeString \"--supportemail=$parameter\"\n+\t\t\t\t\t} else {\n+\t\t\t\t\t\tputs \"$procName:  Invalid supportEmail: $parameter\"\n+\t\t\t\t\t\treturn 1\n+\t\t\t\t\t}\n+\t\t\t\t} else {\n+\t\t\t\t\tputs \"$procName:  No supportEmail specified\"\n+\t\t\t\t\treturn 1\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\t-stepsToReproduce {\n+\t\t\t\tif {[llength $parameter] > 0} {\n+\t\t\t\t\tset exeString [concat $exeString \"--usertext $parameter\"]\n+\t\t\t\t} else {\n+\t\t\t\t\tputs \"Warning:  No steps to reproduce included with collection of log files\"\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\t-zipFileName {\n+\t\t\t\tif {[llength $parameter] > 0} {\n+\t\t\t\t\tset exeString [concat $exeString \"--zip $parameter\"]\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tdefault {\n+\t\t\t\tputs \"Usage: $procName \"\n+\t\t\t\tforeach op $optList {\n+\t\t\t\t\tputs \"       -$op  <value>\"\n+\t\t\t\t}\n+\t\t\t\tflush stdout\n+\t\t\t\treturn\n+\t\t\t}\n+\t\t}\n+\t\tcatch {unset option}\n+\t\tcatch {unset parameter}\n+\t}\n+\n+\tputs $exeString\n+\t\n+\tif [catch {eval $exeString} retCode] {\n+\t\tputs \"$procName: $exeString failed: $retCode\"\n+\t\treturn 1\n+\t}\n+\n+\treturn 0\n+}\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/map.tcl b/dep/tclclient/ixTcl1.0/Generic/map.tcl\nnew file mode 100644\nindex 00000000..11c2163a\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/map.tcl\n@@ -0,0 +1,383 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: map.tcl\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t02-05-1998\tDS\tGenesis\n+#\n+# Description: This file contains all the commands to configure the mapping\n+# of traffic which could be from ports of one card of one chassis to any port\n+# on same card on same chassis, different card on same chassis or different\n+# cards on different chassis. Any combination can be specified.\n+#\n+##################################################################################\n+\n+\n+\n+########################################################################################\n+# Procedure: map::new\n+#\n+# Description: This command deletes the existing type & creates a new map.\n+#\n+########################################################################################\n+proc map::new {args} \\\n+{\n+\tglobal mapMethods mapParms\n+\n+\tset type \"map\"\n+\n+\tif {[llength $args] == 0} {\n+\t\tlogMsg \"Usage: $type new \"\n+\t\tforeach op $mapMethods(new) {\n+\t\t\tlogMsg \"       -$op  <value>\"\n+\t\t}\n+\t\treturn\n+\t}\n+\n+\tif {[string index [lindex $args 0] 0] != \"-\"} {\n+\t\tlogMsg \"Usage: $type new \"\n+\t\tforeach op $mapMethods(new) {\n+\t\t\tlogMsg \"       -$op  <value>\"\n+\t\t}\n+\t\treturn\n+\t}\n+\tset opt [string trimleft [lindex $args 0] \"-\"]\n+\tif {[lsearch $mapMethods(new) $opt] == -1} {\n+\t\tlogMsg \"Usage: $type new \"\n+\t\tforeach op $mapMethods(new) {\n+\t\t\tlogMsg \"       -$op  <value>\"\n+\t\t}\n+\t\treturn\n+\t}\n+\n+    set mapType [lindex $args 1]\n+\n+    if {![validateMapType $mapType]} {\n+        set mapArray    [format \"%sArray\" $mapType]\n+        global $mapArray\n+\n+        if [info exists $mapArray] {\n+            unset $mapArray\n+        }\n+    }\n+}\n+\n+\n+#######################################################################################\n+# Procedure: map::add\n+#\n+# Description: This command adds a chassis, card and port number for tx and rx.\n+#\n+########################################################################################\n+proc map::add {args} \\\n+{\n+\tglobal mapMethods mapParms mapConfigVals \n+\tglobal one2oneArray one2manyArray many2oneArray many2manyArray\n+\n+\t# if no option name was passed then display all options available for tx\n+\tif {[llength $args] == 0} {\n+\t\treturn -code error \"Usage: map add $mapMethods(add)\"\n+\t}\n+\n+\tif {[llength $args] != [llength $mapMethods(add)]} {\n+\t\treturn -code error \"Usage: map add $mapMethods(add)\"\n+\t}\n+\n+\tif {![info exists mapParms(type)]} {\n+\t\treturn -code error \"map type not configured yet.\"\n+\t}\n+\n+\tset tx_c [lindex $args 0]\n+\tset tx_l [lindex $args 1]\n+\tset tx_p [lindex $args 2]\n+\tset rx_c [lindex $args 3]\n+\tset rx_l [lindex $args 4]\n+\tset rx_p [lindex $args 5]\n+\n+\t# first of all, don't let tx=rx!! \n+    #if {($tx_c == $rx_c) && ($tx_l == $rx_l) && ($tx_p == $rx_p)} {\n+    #    return -code error \"Invalid map: Tx == Rx\"\n+    #}\n+\n+\tswitch $mapParms(type) {\n+\t\t\"one2one\" {\n+\t\t\t# check if tx is already configured as tx\n+\t\t\tif {[info exists one2oneArray($tx_c,$tx_l,$tx_p)]} {\n+\t\t\t\treturn -code error \"map Tx:[getPortId $tx_c $tx_l $tx_p] exists.\\\n+\t\t\t\t\t                Delete it and add again to change the Rx\"\n+\t\t\t}\n+\n+\t\t\t# check if rx is already configured as rx\n+\t\t\tforeach r [array names one2oneArray] {\n+\t\t\t\tif {[string compare $one2oneArray($r) \"{$rx_c $rx_l $rx_p}\"] == 0} {\n+\t\t\t\t\treturn -code error \"map Rx:[getPortId $rx_c $rx_l $rx_p] is already configured for Rx.\"\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\tset one2oneArray($tx_c,$tx_l,$tx_p) [list [list $rx_c $rx_l $rx_p]]\n+\t\t}\n+\n+\t\t\"one2many\" {\n+\t\t\t# check if rx is already configured as rx on this tx port\n+\t\t\tforeach txPort [array names one2manyArray] {\n+    \t\t\tif {[lsearch $one2manyArray($txPort) [list $rx_c $rx_l $rx_p]] >= 0} {\n+                    if {\"$tx_c,$tx_l,$tx_p\" == $txPort} {\n+    \t\t\t\t    return -code error \"map Tx:[getPortId $tx_c $tx_l $tx_p] to Rx:[getPortId $rx_c $rx_l $rx_p] already exists.\"\n+                    } else {\n+    \t\t\t\t    return -code error \"map Rx:[getPortId $rx_c $rx_l $rx_p] is already configured for Rx.\"\n+                    }\n+    \t\t\t}\n+            }\n+\n+\t\t\tset one2manyArray($tx_c,$tx_l,$tx_p) [lappend one2manyArray($tx_c,$tx_l,$tx_p) [list $rx_c $rx_l $rx_p]]\n+\t\t}\n+\n+\t\t\"many2one\" {\n+\t\t\t# check if tx is already configured as tx\n+\t\t\tif {[info exists many2oneArray($tx_c,$tx_l,$tx_p)]} {\n+    \t\t\tif {$many2oneArray($tx_c,$tx_l,$tx_p) == \"{$rx_c $rx_l $rx_p}\"} {\n+    \t\t\t    return -code error \"map Tx:[getPortId $tx_c $tx_l $tx_p] to Rx:[getPortId $rx_c $rx_l $rx_p] already exists.\"\n+                } else {\n+    \t\t\t    return -code error \"map Tx:[getPortId $tx_c $tx_l $tx_p] is already configured for Tx.\"\n+                }\n+\t\t\t}\n+\n+\t\t\tset many2oneArray($tx_c,$tx_l,$tx_p) [list [list $rx_c $rx_l $rx_p]]\n+\t\t}\n+\n+\t\t\"many2many\" {\n+            if {([lsearch [array names many2manyArray] \"$tx_c,$tx_l,$tx_p\"] != -1)} {\n+                if {[lsearch $many2manyArray($tx_c,$tx_l,$tx_p) \"$rx_c $rx_l $rx_p\"] == -1} {\n+\t\t            set many2manyArray($tx_c,$tx_l,$tx_p) [lappend many2manyArray($tx_c,$tx_l,$tx_p) [list $rx_c $rx_l $rx_p]]\n+                }\n+            } else {\n+\t\t        set many2manyArray($tx_c,$tx_l,$tx_p) [lappend many2manyArray($tx_c,$tx_l,$tx_p) [list $rx_c $rx_l $rx_p]]\n+            }\n+\t\t}\n+\n+\t}\n+\n+\treturn -code ok\n+}\n+\n+########################################################################################\n+# Procedure: map::del\n+#\n+# Description: This command deletes a chassis, card and port number for tx and rx.\n+#\n+########################################################################################\n+\n+proc map::del {args} \\\n+{\n+\tglobal mapMethods mapParms mapConfigVals\n+\n+    set retCode $::TCL_ERROR\n+\n+\t# if no option name was passed then display all options available for tx\n+\tif {[llength $args] == 0} {\n+\t\tlogMsg \"Usage: map del $mapMethods(del)\"\n+\t\treturn $::TCL_ERROR\n+\t}\n+\n+\tif {[llength $args] != [llength $mapMethods(add)]} {\n+\t\tlogMsg \"Usage: map del $mapMethods(del)\"\n+\t\treturn $::TCL_ERROR\n+\t}\n+\n+\tif {![info exists mapParms(type)]} {\n+\t\tlogMsg \"map type not configured yet.\"\n+\t\treturn $::TCL_ERROR\n+\t}\n+\n+\tset tx_c [lindex $args 0]\n+\tset tx_l [lindex $args 1]\n+\tset tx_p [lindex $args 2]\n+\tset rx_c [lindex $args 3]\n+\tset rx_l [lindex $args 4]\n+\tset rx_p [lindex $args 5]\n+\n+\tswitch $mapParms(type) {\n+\t\t\"one2one\" {\n+            global one2oneArray\n+\t\t\tforeach tx [array names one2oneArray] {\n+\t\t\t\tif {$tx == \"$tx_c,$tx_l,$tx_p\" && [join $one2oneArray($tx)] == [list $rx_c $rx_l $rx_p]} {\n+\t\t\t\t\tunset one2oneArray($tx)\n+                    set retCode $::TCL_OK\n+                    break\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\n+\t\t\"one2many\" {\n+            global one2manyArray\n+\n+            if [info exists one2manyArray($tx_c,$tx_l,$tx_p)] {\t\t\t\t\n+\t\t\t    set indx [lsearch $one2manyArray($tx_c,$tx_l,$tx_p) [list $rx_c $rx_l $rx_p]]\n+\t\t\t    if {$indx >= 0} {\n+\t\t\t        if {[llength $one2manyArray($tx_c,$tx_l,$tx_p)] == 1} {\n+\t\t\t\t        unset one2manyArray($tx_c,$tx_l,$tx_p)\n+\t\t\t        } else {\n+\t\t\t\t        set one2manyArray($tx_c,$tx_l,$tx_p) [lreplace $one2manyArray($tx_c,$tx_l,$tx_p) $indx $indx]\n+\t\t\t        }\n+                    set retCode $::TCL_OK\n+                }\n+            }\n+\t\t}\n+\n+\t\t\"many2one\" {\n+            global many2oneArray\n+\t\t\tforeach tx [array names many2oneArray] {\n+\t\t\t\tif {$tx == \"$tx_c,$tx_l,$tx_p\" && [join $many2oneArray($tx)] == [list $rx_c $rx_l $rx_p]} {\n+\t\t\t\t\tunset many2oneArray($tx)\n+                    set retCode $::TCL_OK\n+                    break\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\n+\t\t\"many2many\" {\n+            global many2manyArray\n+            if [info exists many2manyArray($tx_c,$tx_l,$tx_p)] {\t\t\t\t\n+\t\t\t    set indx [lsearch $many2manyArray($tx_c,$tx_l,$tx_p) [list $rx_c $rx_l $rx_p]]\n+\t\t\t    if {$indx >= 0} {\n+\t\t\t        if {[llength $many2manyArray($tx_c,$tx_l,$tx_p)] == 1} {\n+\t\t\t\t        unset many2manyArray($tx_c,$tx_l,$tx_p)\n+\t\t\t        } else {\n+\t\t\t\t        set many2manyArray($tx_c,$tx_l,$tx_p) [lreplace $many2manyArray($tx_c,$tx_l,$tx_p) $indx $indx]\n+\t\t\t        }\n+                    set retCode $::TCL_OK\n+                }\n+            }\n+\t\t}\n+\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: map::show\n+#\n+# Description: This command is used to show the current port map.\n+#\n+# Arguments:\n+#   mapType     - valid options are: one2one, one2many, many2one or many2many\n+#                 Default is current configured mapType\n+#\n+########################################################################################\n+proc map::show {{mapType \"\"}} \\\n+{\n+    global  mapConfigVals\n+\n+    if {$mapType == \"\"} {\n+        set mapType [map cget -type]\n+    }\n+\n+    if [validateMapType $mapType] {\n+        return\n+    }\n+\n+    set mapArray    [format \"%sArray\" $mapType]\n+    global $mapArray\n+\n+    logMsg \"\\nMap type: $mapType\"\n+\n+    if {[llength [array names $mapArray]] < 1} {\n+        logMsg \"--->No ports in map.\\n\"\n+        set retCode 1\n+    } else {\n+        foreach txMap [lnumsort [array names $mapArray]] {\n+            scan [join $txMap] \"%d,%d,%d\" tx_c tx_l tx_p\n+\n+            foreach rxMap [set ${mapArray}($tx_c,$tx_l,$tx_p)] {\n+                scan [join $rxMap] \"%d %d %d\" rx_c rx_l rx_p\n+\n+                logMsg \"\\tTx:[getPortId $tx_c $tx_l $tx_p]   Rx: [getPortId $rx_c $rx_l $rx_p]\"\n+            }\n+        }\n+        logMsg \"\\n\"\n+    }\n+}\n+\n+\n+########################################################################################\n+# Procedure: map::validateMapType\n+#\n+# Description: This command is used to find out if the given map type is valid.\n+#\n+# Arguments:\n+#   mapType     - valid options are: one2one, one2many, many2one or many2many\n+#\n+########################################################################################\n+proc map::validateMapType {mapType {verbose verbose}} \\\n+{\n+    global  mapConfigVals\n+\n+    set notValidMap    1\n+\n+    foreach thing [map getValidValues -type] {\n+        if {$mapType == $thing} {\n+            set notValidMap    0\n+            break\n+        }\n+    }\n+    if {$notValidMap && $verbose == \"verbose\"} {\n+        errorMsg \"Error - invalid map type: $mapType\"\n+    }\n+\n+    return $notValidMap\n+}\n+\n+\n+########################################################################################\n+# Procedure: showmaps\n+#\n+# Description: This command is used to show all port maps.\n+#\n+#\n+########################################################################################\n+proc showmaps {} \\\n+{\n+    global  mapConfigVals\n+\n+    foreach thing [split $mapConfigVals(type) |] {\n+        map show $thing\n+    }\n+}\n+\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/miiUtils.tcl b/dep/tclclient/ixTcl1.0/Generic/miiUtils.tcl\nnew file mode 100644\nindex 00000000..e379b6d7\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/miiUtils.tcl\n@@ -0,0 +1,619 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: miiUtils.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t05-05-03\tDS\n+#\n+# Description: This file contains common procs used to configure features\n+#              via the MII ixTclHal api\n+#\n+##################################################################################\n+\n+\n+proc ixMiiConfigPreEmphasis           {chassis card port peSetting} {return [miiConfig::preEmphasis $chassis $card $port $peSetting]}\n+proc ixMiiConfigLossOfSignalThreshold {chassis card port threshold} {return [miiConfig::lossOfSignalThreshold $chassis $card $port $threshold]}\n+proc ixMiiConfigXgxsLinkMonitoring    {chassis card port enable}    {return [miiConfig::xgxsLinkMonitoring $chassis $card $port $enable]}\n+proc ixMiiConfigAlignRxDataClock      {chassis card port clock}     {return [miiConfig::alignRxDataClock $chassis $card $port $clock]}\n+proc ixMiiConfigReceiveEqualization   {chassis card port value}     {return [miiConfig::receiveEqualization $chassis $card $port $value]}\n+proc ixMiiConfigXauiOutput            {chassis card port enable}    {return [miiConfig::xauiOutput $chassis $card $port $enable]}\n+proc ixMiiConfigXauiSerialLoopback    {chassis card port enable}    {return [miiConfig::xauiSerialLoopback $chassis $card $port $enable]}\n+proc ixMiiConfigXgmiiParallelLoopback {chassis card port enable}    {return [miiConfig::xgmiiParallelLoopback $chassis $card $port $enable]}\n+\n+\n+namespace eval miiConfig {\n+}\n+\n+namespace eval miiaeConfig {\n+}\n+\n+\n+########################################################################\n+# Procedure: preEmphasis\n+#\n+# This command configs the pre-emphasis bits for 10ge\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#   peSetting  <miiPreemphasis_none|miiPreemphasis_18|miiPreemphasis_38|miiPreemphasis_75>\n+#\n+########################################################################\n+proc miiConfig::preEmphasis {chassis card port peSetting} \\\n+{\n+    switch $peSetting {\n+        75 {\n+            set peSetting $::miiPreemphasis_75\n+        }\n+        38 {\n+            set peSetting $::miiPreemphasis_38\n+        }\n+        18 {\n+            set peSetting $::miiPreemphasis_18\n+        }\n+    }            \n+\n+    if {$peSetting > 3 || $peSetting < 0} {\n+        errorMsg \"$peSetting not supported for preEmphasis\"\n+        set retCode $::TCL_ERROR\n+        return $retCode\n+    }\n+\n+    set peSetting [expr $peSetting << 14]\n+\n+    return [setRegister $chassis $card $port $::miiRegister28 0xc000 $peSetting]\n+}\n+\n+\n+########################################################################\n+# Procedure: lossOfSignalThreshold\n+#\n+# This command configs the lossOfSignalThreshold bits for 10ge\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#   threshold  <miiPreemphasis_none|miiPreemphasis_18|miiPreemphasis_38|miiPreemphasis_75>\n+#\n+########################################################################\n+proc miiConfig::lossOfSignalThreshold {chassis card port threshold} \\\n+{\n+    switch $threshold {\n+        160 {\n+            set threshold $::miiLossOfSignal160mv\n+        }\n+        240 {\n+            set threshold $::miiLossOfSignal240mv\n+        }\n+        200 {\n+            set threshold $::miiLossOfSignal200mv\n+        }\n+        120 {\n+            set threshold $::miiLossOfSignal120mv\n+        }\n+        80 {\n+            set threshold $::miiLossOfSignal80mv\n+        }\n+    }            \n+\n+    if {$threshold > 4 || $threshold < 0} {\n+        errorMsg \"$threshold not supported for lossOfSignalThreshold\"\n+        set retCode $::TCL_ERROR\n+        return $retCode\n+    }\n+\n+    set threshold [expr $threshold << 4]\n+\n+    return [setRegister $chassis $card $port $::miiRegister29 0x0070 $threshold]\n+}\n+\n+\n+########################################################################\n+# Procedure: xgxsLinkMonitoring\n+#\n+# This command configs the xgxsLinkMonitoring bits for 10ge\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#   enable <$::TRUE|$::FALSE>\n+#\n+########################################################################\n+proc miiConfig::xgxsLinkMonitoring {chassis card port enable} \\\n+{\n+    switch $enable {\n+        enable -\n+        ENABLE -\n+        true -\n+        TRUE {\n+            set enable $::TRUE\n+        }\n+        enable -\n+        ENABLE -\n+        false -\n+        FALSE {\n+            set enable $::FALSE\n+        }\n+        1 -\n+        0 {\n+        }\n+        default {\n+            errorMsg \"XgxsLinkMonitoring enable must be bool <1|0>\"\n+            set retCode $::TCL_ERROR\n+            return $retCode\n+        }\n+    }\n+\n+    return [setRegister $chassis $card $port $::miiRegister29 0x0040 $enable]\n+}\n+\n+\n+########################################################################\n+# Procedure: alignRxDataClock\n+#\n+# This command configs the alignRxDataClock bits for 10ge\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#   clock\n+#\n+########################################################################\n+proc miiConfig::alignRxDataClock {chassis card port clock} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    switch $clock \"\n+        miiRecoveredClock -\n+        $::miiRecoveredClock {\n+            set clock $::miiRecoveredClock\n+        }\n+        miiLocalRefClock -\n+        $::miiLocalRefClock {\n+            set clock $::miiLocalRefClock\n+        }\n+        default {\n+            errorMsg [list Invalid clock $clock selected.]\n+            set retCode $::TCL_ERROR\n+            return $retCode\n+        }\n+    \"\n+    return [setRegister $chassis $card $port $::miiRegister24 0x0001 $clock]\n+}\n+\n+\n+########################################################################\n+# Procedure: receiveEqualization\n+#\n+# This command configs the receiveEqualization bits for 10ge\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#   value\n+#\n+########################################################################\n+proc miiConfig::receiveEqualization {chassis card port value} \\\n+{\n+    if {$value > 15 || $value < 0} {\n+        errorMsg \"$value not supported for receiveEqualization\"\n+        set retCode $::TCL_ERROR\n+        return $retCode\n+    }\n+\n+    return [setRegister $chassis $card $port $::miiRegister28 0x000F $value]\n+}\n+\n+\n+########################################################################\n+# Procedure: xauiOutput\n+#\n+# This command configs the xauiOutput bits for 10ge\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#   enable <$::TRUE|$::FALSE>\n+#\n+########################################################################\n+proc miiConfig::xauiOutput {chassis card port enable} \\\n+{\n+    switch $enable {\n+        1 -\n+        enable -\n+        ENABLE -\n+        true -\n+        TRUE {\n+            set enable 0xAAAA\n+        }\n+        0 -\n+        enable -\n+        ENABLE -\n+        false -\n+        FALSE {\n+            set enable 0\n+        }\n+        default {\n+            errorMsg \"XAUI Output enable must be bool <1|0>\"\n+            set retCode $::TCL_ERROR\n+            return $retCode\n+        }\n+    }\n+\n+    return [setRegister $chassis $card $port $::miiRegister30 0xAAAA $enable]\n+}\n+\n+\n+########################################################################\n+# Procedure: xauiSerialLoopback\n+#\n+# This command enable/disables the xauiSerialLoopback bits for 10ge\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#   enable\n+#\n+########################################################################\n+proc miiConfig::xauiSerialLoopback {chassis card port enable} \\\n+{\n+    set retCode $::TCL_ERROR\n+\n+    switch $enable {\n+        enable -\n+        ENABLE -\n+        true -\n+        TRUE {\n+            set enable $::TRUE\n+        }\n+        enable -\n+        ENABLE -\n+        false -\n+        FALSE {\n+            set enable $::FALSE\n+        }\n+        1 -\n+        0 {\n+        }\n+        default {\n+            errorMsg \"XAUISerialLoopback enable must be bool <1|0>\"\n+            set retCode $::TCL_ERROR\n+            return $retCode\n+        }\n+    }\n+\n+    # If Serial loopback selected:\n+    #       - set bit 14 of register 0. If it's not selected, clear that bit\n+    #       - clear bits 0-3 and set bits 8-11 for register 23.\n+    if {$enable} {\n+        set reg23   0x0F00\n+    } else {\n+        set reg23   0x0000\n+    }\n+\n+    if {[setRegister $chassis $card $port $::miiRegister23 0x0F0F $reg23] == $::TCL_OK} {        \n+        set bits [expr $enable << 14]\n+        if {[setRegister $chassis $card $port $::miiControl 0x4000 $bits noGet] == $::TCL_OK} {\n+            set retCode $::TCL_OK\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: xgmiiParallelLoopback\n+#\n+# This command enable/disables the xgmiiParallelLoopback bits for 10ge\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#   loopback\n+#\n+########################################################################\n+proc miiConfig::xgmiiParallelLoopback {chassis card port enable} \\\n+{\n+    switch $enable {\n+        enable -\n+        ENABLE -\n+        true -\n+        TRUE {\n+            set enable $::TRUE\n+        }\n+        enable -\n+        ENABLE -\n+        false -\n+        FALSE {\n+            set enable $::FALSE\n+        }\n+        1 -\n+        0 {\n+        }\n+        default {\n+            errorMsg \"XGMIIParallelLoopback enable must be bool <1|0>\"\n+            set retCode $::TCL_ERROR\n+            return $retCode\n+        }\n+    }\n+\n+    if {$enable} {\n+        set reg23   0x000F\n+    } else {\n+        set reg23   0x0000\n+    }\n+\n+    if {[setRegister $chassis $card $port $::miiControl 0x4000 0x0000] == $::TCL_OK} {\n+        if {[setRegister $chassis $card $port $::miiRegister23 0x0F0F $reg23 noGet] == $::TCL_OK} {        \n+            set retCode $::TCL_OK\n+        }\n+    }\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: isXauiSerialLoopback\n+#\n+# This command checks the xauiSerialLoopback bits for 10ge\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#\n+# Return code:\n+#   true if enabled\n+#\n+########################################################################\n+proc miiConfig::isXauiSerialLoopback {chassis card port} \\\n+{\n+    return [expr [getRegister $chassis $card $port $::miiControl] & 0x4000 && \\\n+                 [getRegister $chassis $card $port $::miiRegister23 noGet] & 0x0f00]\n+\n+}\n+\n+\n+########################################################################\n+# Procedure: isXgmiiParallelLoopback\n+#\n+# This command checks the isXgmiiParallelLoopback bits for 10ge\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#\n+# Return code:\n+#   true if enabled\n+#\n+########################################################################\n+proc miiConfig::isXgmiiParallelLoopback {chassis card port} \\\n+{\n+    if {[expr [getRegister $chassis $card $port $::miiRegister23] & 0x000F] == 0x000f} {\n+        set retCode $::true\n+    } else {\n+        set retCode $::false\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: setRegister\n+#\n+# This command sets the register for 10ge - PRIVATE\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#   register    <ie., $::register28>\n+#   bitMask     <ie., 0xc000>\n+#   get         default: true; sometimes you don't want to 'get' first...\n+#\n+########################################################################\n+proc miiConfig::setRegister {chassis card port register bitMask value {get true}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if {$get == \"true\"} {\n+        if [mii get $chassis $card $port] {\n+            errorMsg \"Error getting mii for port [getPortId $chassis $card $port]\"\n+            set retCode $::TCL_ERROR\n+        }\n+    }\n+\n+    if [mii selectRegister $register] {\n+        errorMsg \"Error selecting register $register\"\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    set registerValue [format \"0x%s\" [mii cget -registerValue]]\n+    mii config -registerValue [format %04x [expr {$value & $bitMask} | {$registerValue & ~$bitMask}]]\n+    \n+    if [mii set $chassis $card $port] {\n+        errorMsg \"Error setting mii for port [getPortId $chassis $card $port]\"\n+        set retCode $::TCL_ERROR\n+    }\n+   \n+    return $retCode\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: getRegister\n+#\n+# This command gets the register for 10ge - PRIVATE\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#   register    <ie., $::register28>\n+#   get         default: true; sometimes you don't want to 'get' first...\n+#\n+# Returns:\n+#   value of register as hex number\n+#\n+########################################################################\n+proc miiConfig::getRegister {chassis card port register {get true}} \\\n+{\n+    set value 0x0000\n+\n+    if {$get == \"true\"} {\n+        if [mii get $chassis $card $port] {\n+            errorMsg \"Error getting mii for port [getPortId $chassis $card $port]\"\n+            set retCode $::TCL_ERROR\n+        }\n+    }\n+\n+    if [mii selectRegister $register] {\n+        errorMsg \"Error selecting register $register\"\n+        return $value\n+    }\n+\n+    return [format \"0x%s\" [mii cget -registerValue]]\n+} \n+\n+########################################################################\n+# Procedure: setRegister\n+#\n+# This command sets the register for 10ge - PRIVATE\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#   register    <ie., $::register28>\n+#   bitMask     <ie., 0xc000>\n+#   get         default: true; sometimes you don't want to 'get' first...\n+#\n+########################################################################\n+proc miiaeConfig::setRegister { chassis card port mdioIndex deviceAddress register bitMask value } \\\n+{\n+    set retCode $::TCL_OK\n+\n+\n+\tset registerAddress [miiaeConfig::getRegister $chassis $card $port $mdioIndex $deviceAddress $register ]\n+\tset registerValue\t[format \"0x%s\" [mmdRegister cget -registerValue]]\n+\n+\t\n+    # Since we don't have setRegister command, therefore we have to remove and the same register again\n+\tif [mmd delRegister $register] {\n+        errorMsg \"Error deleting mmd register $register\"\n+\t\tset retCode $::TCL_ERROR\n+    }  \n+\n+    if {[miiae delDevice $deviceAddress]} {\n+        errorMsg \"Error setting miiae for port [getPortId $chassis $card $port]\"\n+        set retCode $::TCL_ERROR\n+    }\t \n+\n+    mmdRegister config -registerValue [format %04x [expr {$value & $bitMask} | {$registerValue & ~$bitMask}]]\n+\n+    if {[mmd addRegister ]} {\n+        errorMsg \"Error adding mmd register $register\"\n+\t\tset retCode $::TCL_ERROR\n+    }\n+\n+\tmmd config -address $registerAddress\n+\n+    if {[miiae addDevice]} {\n+        errorMsg \"Error adding miiae device for port [getPortId $chassis $card $port]\"\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    if {[miiae set $chassis $card $port $mdioIndex]} {\n+        errorMsg \"Error setting miiae for port [getPortId $chassis $card $port]\"\n+        set retCode $::TCL_ERROR\n+    }\n+   \n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: getRegister\n+#\n+# This command gets the register for 10ge - PRIVATE\n+#\n+# Arguments(s):\n+#   chassis\n+#   card\n+#   port\n+#   register    <ie., $::register28>\n+#   get         default: true; sometimes you don't want to 'get' first...\n+#\n+# Returns:\n+#   value of register as hex number\n+#\n+########################################################################\n+proc miiaeConfig::getRegister {chassis card port mdioIndex deviceAddress register} \\\n+{\n+    set value 0x0000\n+\n+    if [miiae get $chassis $card $port $mdioIndex] {\n+        errorMsg \"Error getting miiae PHY $mdioIndex for port [getPortId $chassis $card $port]\"\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    if [miiae getDevice $deviceAddress] {\n+        errorMsg \"Error getting miiae device  $deviceAddress\"\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    if [mmd getRegister $register] {\n+        errorMsg \"Error getting mmd register $register\"\n+        set retCode $::TCL_ERROR\n+\t} else {\n+\t\tset value [format \"0x%s\" [mmd cget -address]]\n+\t}\n+\n+    return $value\n+}\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/miscCmds.tcl b/dep/tclclient/ixTcl1.0/Generic/miscCmds.tcl\nnew file mode 100644\nindex 00000000..3ccb3f9e\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/miscCmds.tcl\n@@ -0,0 +1,992 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: miscCmds.tcl\n+#    Copyright ©  IXIA\n+#    All Rights Reserved.\n+#\n+#    Revision Log:\n+#    02-05-1998    DS    Genesis\n+#\n+# Description: Contains miscellaneous log file commands.\n+#\n+##################################################################################\n+\n+########################################################################\n+# Procedure: logOn\n+#\n+# This command wraps the logger command logger on & sets the parameter\n+#              -logFileName to the defaulted file.\n+#\n+# Arguments:\n+#   filename    - filename, w/out directory, to open\n+#                 directory *must* be specified via cget -directory\n+#\n+########################################################################\n+proc logOn {{file {}}} \\\n+{\n+    logger config -logFileName $file\n+    logger on\n+}\n+\n+\n+########################################################################\n+# Procedure: logOff\n+#\n+# This command wraps the logger command logger off\n+#\n+########################################################################\n+proc logOff {} \\\n+{\n+    logger off\n+}\n+\n+\n+########################################################################\n+# Procedure: logMsg\n+#\n+# Description: This command wraps the logger command logger message\n+#\n+# Arguments: args - a list of valid arguments\n+#\n+# Results: Returns 0 for ok and 1 for error.  WARNING: Cannot use TCL_OK\n+#          and TCL_ERROR at this point.  It was failing on certain unix\n+#          and linux combinations\n+########################################################################\n+proc logMsg {args} \\\n+{\n+    set retCode 0\n+    if {[lindex $args 0] == \"-nonewline\"} {\n+        set args [lreplace $args 0 0]\n+        if {[catch {eval logger::message -nonewline $args} err]} {\n+            set retCode 1\n+        }\n+    } else {\n+        if {[catch {eval logger::message $args} err]} {\n+            set retCode 1\n+        }\n+    }\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: errorMsg\n+#\n+# This command prints the name of the current proc + a message - intended\n+# for output of error messages.\n+#\n+########################################################################\n+proc errorMsg {args} \\\n+{\n+    set level [expr [info level] - 1]\n+    if {$level > 0} {\n+        set levelStr    \"[lindex [info level $level] 0]: \"\n+    } else {\n+        set levelStr    \"Error: \"\n+    }\n+\n+    set verbose     1\n+    set nonewline   0\n+\n+    while {[string index [lindex $args 0] 0] == \"-\"} {    \n+        switch [string range [lindex $args 0] 1 end] {\n+            \"verbose\" {\n+                set verbose 1\n+                set args [lreplace $args 0 0]\n+            }\n+            \"noVerbose\" {\n+                set verbose 0\n+                set args [lreplace $args 0 0]\n+            }\n+            \"nonewline\" {\n+                set nonewline 1\n+                set args [lreplace $args 0 0]\n+            }\n+            default {\n+                break\n+            }\n+        }\n+    }\n+\n+    if {$verbose} {\n+        if {$nonewline} {\n+            logger message -priority 1 -nonewline $levelStr[join $args \" \"]\n+        } else {\n+            logger message -priority 1 \"$levelStr[join $args \" \"]\"\n+        }\n+    }\n+}\n+\n+\n+########################################################################\n+# Procedure: debugOn\n+#\n+# This command enables debug messages & sends them to a file.\n+#\n+########################################################################\n+proc debugOn {{file {}}} \\\n+{\n+    global debug\n+\n+    set debug(enabled) 1\n+    if {[string length $file] == 0} {\n+        set debug(file) [file join [logger cget -directory] debugfile.log]\n+    } else {\n+        set debug(file) [file join [logger cget -directory] $file]\n+    }\n+\n+    if [catch {open $debug(file) w} fileID] {\n+        puts stdout \"Cannot open $debug(file): $fileID\"\n+        set debug(file) stdout\n+    } else {\n+        set debug(file) $fileID\n+    }\n+\n+    proc debugMsg {args} \\\n+    {\n+        global debug\n+\n+        set levelStr    \"\"\n+        set level       [expr [info level] - 1]\n+        if {$level > 0} {\n+            set levelStr    \"[lindex [info level $level] 0]: \"\n+        }\n+\n+        puts $debug(file) $levelStr[join $args \" \"]\n+    }\n+}\n+\n+\n+########################################################################\n+# Procedure: debugOff\n+#\n+# This command disables debug messages & sets the proc debugMsg to empty\n+#\n+########################################################################\n+proc debugOff {} \\\n+{\n+    global debug\n+    if [info exists debug(enabled)] {\n+        unset debug(enabled)\n+        flush $debug(file)\n+        if {$debug(file) != \"stdout\"} {\n+            close $debug(file)\n+        }\n+    }\n+    proc debugMsg {args} \\\n+    {\n+    }\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: debugMsg\n+#\n+# If debugging is enabled, prints a message to the debug file.\n+#\n+########################################################################\n+proc debugMsg {args} \\\n+{\n+}\n+\n+\n+##################################################################################\n+# Procedure: showCmd\n+#\n+# This command lists all available cget options & their current values\n+#\n+# Argument(s):\n+#   cmd     name of command to show\n+#\n+##################################################################################\n+proc showCmd {cmd {method cget}} \\\n+{\n+    catch {$cmd $method} paramList\n+    foreach param [lsort [join $paramList]] {\n+        if {$param == \"-this\"} {\n+            continue\n+        }\n+        if {[string index $param 0] == \"-\"} {\n+            logMsg \"$cmd $method $param: [$cmd cget $param]\"\n+        }\n+    }\n+}\n+\n+\n+########################################################################\n+# Procedure:   openMyFile\n+#\n+# Description: This command opens a file set by a command, w/backup if required.\n+#\n+# The global array openedFileName contains the full name of opened files indexed\n+# by their channels. This information will be used to set the permission of the file\n+# back to both readable and writable when its channel is closed by closeMyFile. \n+#\n+# Arguments:   filename - filename, w/out directory, to open directory *must* be specified via cget -directory\n+#              testCmd  - test command name, ie., logger or results\n+#\n+# Returns:     fileID if successful, or \"\" if unsuccessful\n+########################################################################\n+proc openMyFile {filename {fileAccess w} {command logger}} \\\n+{\n+    global openedFileName\n+\n+    set fileID  stdout\n+    set fullFileName [file join [$command cget -directory] $filename]\n+\n+    if {[$command cget -fileBackup] == \"true\" && $fileAccess == \"w\"} {\n+        # if the log file by this name exists, then copy it into a different name\n+        # with a magic number that increments every time the test is run\n+        if {[file exists $fullFileName]} {\n+            set filePrefix      [file rootname [file tail $fullFileName]]\n+            set magicNum        [clock format [file mtime $fullFileName] -format \"%H%M%S\"]\n+\n+            # put the full path for new file name\n+            set newFileName         [format \"%s%s%s\" $filePrefix $magicNum [file extension $filename]]\n+            set newFullFileName     [file join [$command cget -directory] $newFileName]\n+            if [catch {file rename -force $fullFileName $newFullFileName} res] {\n+                errorMsg \"$res\"\n+            }\n+        }\n+    }\n+\n+    set fileID [ixFileUtils::open $fullFileName $fileAccess]\n+    if {$fileID == \"\"} {\n+        set fileID  stdout\n+    } else {\n+        set openedFileName($fileID) $fullFileName\n+    }\n+\n+    return $fileID\n+}\n+\n+\n+########################################################################\n+# Procedure:   closeMyFile\n+#\n+# Description: This command closes a file that is opened by the command openMyFile.\n+#\n+# Arguments:   fileId - channel id of the file to be closed\n+#\n+# Returns:     None\n+########################################################################\n+proc closeMyFile {fileId} \\\n+{\n+    global openedFileName\n+\n+    if {$fileId == \"stdout\"} {\n+        return\n+    }\n+\n+    ixFileUtils::close $fileId\n+\n+    if { [info exists openedFileName($fileId)] } {\n+        catch {unset openedFileName($fileId)}\n+    }\n+}\n+\n+\n+########################################################################\n+# Procedure: callTraceMsg\n+#\n+# This command prints a trace of the procs\n+#\n+########################################################################\n+proc callTraceMsg {{arg \"\"}} \\\n+{\n+    errorMsg $arg\n+    for {set x [expr [info level]-1]} {$x > 0} {incr x -1} {\n+        ixPuts \"$x: [info level $x]\"\n+    }\n+}\n+\n+\n+########################################################################\n+# Procedure: traceVariableMsg\n+#\n+# This command traces \n+#\n+########################################################################\n+proc traceVariableMsg {name1 name2 op} \\\n+{\n+    upvar $name1 Name1\n+    errorMsg [format \"variable = %s, value = %s\" $name1 $Name1]\n+}\n+\n+\n+##################################################################################\n+# Procedure: isDigit\n+#\n+# This command checks to see if it is digit.\n+#\n+# Argument(s):\n+#\n+##################################################################################\n+proc isDigit {arg} \\\n+{\n+    set retCode 1\n+\n+    if [catch {format %d $arg}] {\n+        set retCode 0\n+    } \n+    return $retCode\n+} \n+\n+\n+##################################################################################\n+# Procedure: isNegative\n+#\n+# This command checks to see if it is negative - (needed for >32 bit numbers)\n+#\n+# Argument(s):\n+#\n+##################################################################################\n+proc isNegative {arg} \\\n+{\n+    set retCode 0\n+\n+    if { [regexp {^-[0-9]+$} $arg] } {\n+        set retCode 1\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure:   isValidExponentialFloat\n+#\n+# Description: Tells if a value is a legal exponential float.\n+#\n+# Argument(s): valueToCheck - the value to check.\n+#\n+# Returns:     true if valid, false otherwise\n+##################################################################################\n+proc isValidExponentialFloat { valueToCheck } \\\n+{\n+    if {($valueToCheck == \"+\") || ($valueToCheck == \"-\")} {\n+        # Do not allow just these symbols.  Regexp will not catch them.\n+        set retCode $::false\n+    } else {\n+        # First check for the one digit - a lot clearer than putting alternates in one big pattern\n+        # Whole digit\n+        set wholeDigit {^[+-]?[0-9]+}\n+        # No whole digit but fraction digit\n+        set fraction {^[+-]?([\\.][0-9]+)+}\n+        if {!([regexp $wholeDigit $valueToCheck] || [regexp $fraction $valueToCheck])} {\n+            set retCode $::false\n+        } else {\n+            # The expression for a legal exponential float means:  An optional +/-\n+            # followed by zero or more digits followed (the fractional part is \n+            # optional) by decimal followed by one or more digits followed by\n+            # optional exponential expression which consists of e/E followed by\n+            # optional +/- followed by an integer.\n+            set validFloat {^[+-]?[0-9]*([\\.][0-9]+)?([eE][+-]?[0-9]+)?$}\n+            if {[regexp $validFloat $valueToCheck]} {\n+                set retCode $::true\n+            } else {\n+                set retCode $::false\n+            }\n+        }\n+    }\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure:   isValidPositiveExponentialFloat\n+#\n+# Description: Tells if a given value is a legal positive exponential float\n+#\n+# Argument(s): valueToCheck - the input value to check\n+#\n+# Returns:     true if valid, false otherwise\n+##################################################################################\n+proc isValidPositiveExponentialFloat { valueToCheck } \\\n+{\n+    if {[isValidExponentialFloat $valueToCheck] && [expr $valueToCheck > 0]} {\n+        set retCode $::true\n+    } else {\n+        set retCode $::false\n+    }\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure:   isValidPartialFloat\n+#\n+# Description: Tells if a given value is a legal partial float.\n+#\n+# Argument(s): valueToCheck - the input value to check\n+#\n+# Returns:     true if valid, false otherwise\n+##################################################################################\n+proc isValidPartialFloat { valueToCheck } \\\n+{\n+    # The expression for a legal partial float means:\n+    # An optional +/- followed by digits.  Followed by optional decimal and\n+    # more digits.  Followed by pieces of the optional exponential expression\n+    # The key difference between partial and full is that partial uses *\n+    # after 0-9 to show it can have 0 or more values.  The values number\n+    # must have 1 or more that is why it uses the +.\n+    set validPartialFloat {^[+-]?[0-9]*([\\.][0-9]*)?([eE][+-]?[0-9]*)?$}\n+    if {[regexp $validPartialFloat $valueToCheck]} {\n+        set retCode $::true\n+    } else {\n+        set retCode $::false\n+    }\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure:   isValidPositivePartialFloat\n+#\n+# Description: Tells if a given value is a legal positive partial float.\n+#\n+# Argument(s): valueToCheck - the input value to check\n+#\n+# Returns:     true if valid, false otherwise\n+##################################################################################\n+proc isValidPositivePartialFloat { valueToCheck } \\\n+{\n+    set validPositivePartialFloat {^[+]?[0-9]*([\\.][0-9]*)?([eE][+-]?[0-9]*)?$}\n+    if {[regexp $validPositivePartialFloat $valueToCheck]} {\n+        set retCode $::true\n+    } else {\n+        set retCode $::false\n+    }\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure:   isValidPositiveFloat\n+#\n+# Description: Tells if a given number is a legal positive float.\n+#\n+# Argument(s): valueToCheck - the input value to check\n+#\n+# Returns:     true if valid, false otherwise\n+##################################################################################\n+proc isValidPositiveFloat { valueToCheck } \\\n+{\n+    # Special case to handle the singular plus and period\n+    if {($valueToCheck == \"+\") || ($valueToCheck == \".\")} {\n+        set retCode $::false\n+    } else {\n+        # The expression for a legal float is an optional + followed by either\n+        # (zero or more digits followed by decimal followed by one or more digits)\n+        # or one or more digits.\n+        set validPositiveFloat {^[+]?[0-9]+([\\.]?[0-9]+)?$}\n+        if {[regexp $validPositiveFloat $valueToCheck]} {\n+            set retCode $::true\n+        } else {\n+            set retCode $::false\n+        }\n+    }\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure:   isValidInteger\n+#\n+# Description: Tell if a given number is a legal integer\n+#\n+# Argument(s): valueToCheck - the input value to check\n+#\n+# Returns:     true if valid, false otherwise\n+##################################################################################\n+proc isValidInteger { valueToCheck } \\\n+{\n+    # The expression for a legal integer is an optional +/- followed by one or more digits.\n+    set validInteger {^[+-]?[0-9]+$}\n+    if {[regexp $validInteger $valueToCheck]} {\n+        set retCode $::true\n+    } else {\n+        set retCode $::false\n+    }\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure:   isValidPositiveInteger\n+#\n+# Description: Tell if a given number is a legal non-zero positive integer\n+#\n+# Argument(s): valueToCheck - the input value to check\n+#\n+# Returns:     true if valid, false otherwise\n+##################################################################################\n+proc isValidPositiveInteger { valueToCheck } \\\n+{\n+    set validPositiveInteger {^[+]?[0-9]+([eE][+-]?[0-9]+)?$}\n+    # If valueToCheck is zero, special case failure\n+    if {$int == \"0\"} {\n+        set retCode $::false\n+    } else {\n+        if {[regexp $validPositiveInteger $valueToCheck]} {\n+            set retCode $::true\n+        } else {\n+            set retCode $::false\n+        }\n+    }\n+    return $retCode\n+}\n+\n+\n+\n+##################################################################################\n+# Procedure: getProcList\n+#\n+# This command opens a Tcl file & prints all procs that live in that file.\n+#\n+# Argument(s):\n+#   fileName        file name\n+#   sortOn          sort either by proc name or line number (default is proc name)\n+#\n+##################################################################################\n+proc getProcList {fileName {sortOn procName} {ProcList \"\"} {verbose verbose}} \\\n+{\n+    set retCode 0\n+\n+    upvar $ProcList procList\n+\n+    set cmd      \"proc \"\n+    if [catch {open $fileName r} fid] {\n+        errorMsg \"Cannot open file $fileName\"\n+        set retCode 1\n+    } else {\n+\n+        if {$verbose == \"verbose\"} {\n+            ixPuts \"FILE:  $fileName\"\n+            ixPuts \"============================================================================\"\n+        }\n+\n+        if [info exists procList] {\n+            unset procList\n+        }\n+\n+        set linenum 1\n+        while {![eof $fid]} {\n+            gets $fid originalLine\n+\n+            if {[string first $cmd $originalLine] == 0} {\n+                lappend procList   [list $linenum [string range [string trim $originalLine \\\\] 5 end]]\n+            }\n+            incr linenum\n+        }        \n+        close $fid\n+\n+        if {$sortOn == \"procName\"} {\n+            set procList    [lsort -index 1 $procList]\n+        } else {\n+            set procList    [lsort -index 0 -integer $procList]\n+        }\n+\n+        if {$verbose == \"verbose\"} {\n+            foreach item $procList {\n+                scan $item \"%s %s\" linenum name\n+                ixPuts [format \"Line: %4d ::::\\t%s\" $linenum [join [lrange $item 1 end]]]\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure: getTxBasedOnRx\n+#\n+# This command returns the tx port based on rx port from TxRxArray\n+#\n+# Argument(s):\n+#   TxRxArray       - map, ie. one2oneArray\n+#\n+##################################################################################\n+proc getTxBasedOnRx {TxRxArray c l p } \\\n+{\n+    upvar $TxRxArray txRxArray\n+    \n+    set breakFlag   0\n+\n+    foreach txMap [lnumsort [array names txRxArray]] {\n+        scan $txMap    \"%d,%d,%d\" tx_c tx_l tx_p\n+\n+        foreach rxMap $txRxArray($tx_c,$tx_l,$tx_p) {\n+            scan $rxMap \"%d %d %d\" rx_c rx_l rx_p\n+\n+            if { [list $rx_c $rx_l $rx_p] == [list $c $l $p]} {\n+                set txPort  [list $tx_c $tx_l $tx_p]\n+                set breakFlag   1\n+                break\n+            }\n+        }\n+        if {$breakFlag ==1} {\n+            break\n+        }\n+    }\n+    return $txPort\n+}\n+\n+##################################################################################\n+# Procedure: convertFromSeconds\n+#\n+# This command formats the duration in hour:minute:seconds format.\n+#\n+# Argument(s):\n+#   duration        duration of the test\n+#\n+##################################################################################\n+proc convertFromSeconds {time Hours Minutes Seconds} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    upvar $Hours   hours\n+    upvar $Minutes minutes\n+    upvar $Seconds seconds\n+\n+    set hours       [expr {$time / 3600}]\n+\n+    set minuteTemp  [expr {$time - $hours * 3600}]\n+    set minutes     [expr {$minuteTemp / 60}]\n+\n+    set seconds     [expr {$minuteTemp - $minutes * 60}]\n+\n+    return $retCode\n+}\n+\n+\n+###############################################################################\n+# Procedure: convertToSeconds\n+#\n+# Description: Convert hours:min:seconds to seconds\n+#\n+# Arguments: hours\n+#            minutes\n+#            seconds\n+#\n+# Returns:   time, in seconds\n+#\n+###############################################################################\n+proc convertToSeconds {hours minutes seconds} \\\n+{\n+    if {[scan $hours \"%d\" x] <= 0} {\n+        set hours 0\n+    }\n+    if {[scan $minutes \"%d\" x] <= 0} {\n+        set minutes 0\n+    }\n+    if {[scan $seconds \"%d\" x] <= 0} {\n+        set seconds 0\n+    }\n+\n+    return [expr ((($hours*60) + $minutes) * 60) + $seconds]\n+}\n+\n+\n+\n+##################################################################################\n+# Procedure: formatDurationTime\n+#\n+# This command formats the duration in hour:minute:seconds format.\n+#\n+# Argument(s):\n+#   duration        duration of the test\n+#\n+##################################################################################\n+proc formatDurationTime {duration} \\\n+{\n+    convertFromSeconds $duration hour minute seconds   \n+    return  [format \"%.2d:%.2d:%.2d\" $hour $minute $seconds]   \n+}\n+\n+\n+##################################################################################\n+# Procedure: formatNumber\n+#\n+# This command formats the number based on the format given\n+#\n+# Argument(s):\n+#   number        number to be formated\n+#\n+##################################################################################\n+proc formatNumber {number formatTemplete} \\\n+{\n+ \tscan $formatTemplete \"%d.%d\" intDigits decDigits\n+\tset base [expr pow(10,$decDigits)]\n+\n+    if {$number > 0.00 && $number < [expr 1/$base]} {\n+        set number [expr ceil($number * $base)/$base]\n+    } else {\n+\t\tset newFormat [format \"%d.%df\" $intDigits $decDigits]\n+        set number  [format \"%$newFormat\" $number]\n+    }\n+ \n+   return  $number\n+   \n+}\n+\n+##################################################################################\n+# Procedure: unixCludgeGetExpr\n+#\n+# This command reroutes mpexpr command. (Note: for UNIX)\n+#\n+# Argument(s):\n+#   duration        duration of the test\n+#\n+##################################################################################\n+proc unixCludgeGetExpr {} \\\n+{\n+    set expr    mpexpr\n+\n+    if {[lsearch [join [info loaded]] Mpexpr] < 0} {\n+        set expr    expr\n+    }\n+\n+    return $expr\n+}\n+\n+\n+##################################################################################\n+# Procedure: useProfile\n+#\n+# This command get the profiles\n+#\n+# Argument(s):\n+#   use         \"true\" for using profile and \"false\" for not using it. It is set to \n+#               \"false\" so whenever you want to use it set it to \"true\". \n+#\n+##################################################################################\n+proc useProfile {use} \\\n+{\n+    if { $use == \"true\" } \\\n+    {\n+        if {[info tclversion] > 8.0} {\n+            proc ixInitProfiler {} \\\n+            {\n+                global currTime\n+                set currTime    [clock clicks -milliseconds]\n+            }\n+            proc profiler {args} \\\n+            {\n+                global currTime\n+\n+                set now         [clock clicks -milliseconds]\n+                set diff        [expr $now - $currTime]\n+                set currTime    $now\n+\n+                return $diff\n+            }\n+                \n+        } else {\n+            global halCommands\n+        \n+            if {[lsearch $halCommands profiler] == -1} {\n+                lappend halCommands profiler\n+            }\n+\n+            proc ixInitProfiler {} \\\n+            {\n+                if {[TCLProfile profiler] == \"\"} {\n+                    puts \"Error instantiating TCLProfile object!\"\n+                    return 1\n+                }\n+            }\n+        }\n+        catch {ixInitProfiler}\n+        proc ixProfile {args} \\\n+        {   # take an optional comment string\n+            set commentStr  \"\"\n+            if {[llength $args] > 0} {\n+                set commentStr \"[lindex $args 0]\"\n+            }\n+            set levelStr    \"\"\n+            set level [expr [info level] - 1]\n+            if {$level > 0} {\n+                set levelStr    \"[lindex [info level $level] 0]: \"\n+            }\n+            logMsg \"$levelStr: [profiler getDiffTime] $commentStr\"\n+        }\n+    } else {\n+        proc ixInitProfiler {} {}\n+        proc ixProfile {args} {}\n+        proc profiler {{arg \"\"}} {}\n+    }\n+}        \n+\n+########################################################################################\n+# Procedure:    CountGlobalMemory\n+#\n+# Description:  Counts the memory usage of a global variable or array, or all global\n+#\t\t\t\t\tvariables and arrays.\n+#\n+#\t\t\t\t\tTcl arrays are stored as hash tables, the indices are stored\n+#\t\t\t\t\t\tas strings.  The overhead in the hash tables is not easily\n+#\t\t\t\t\t\taccounted for, thus it is not accounted for in this procedure.\n+#\n+#\t\t\t\t\tThe following is a quote from www.scriptic.com/bboard\n+#\n+#\t\t\t\t\t\"...Each array entry will have an overhead of 16 bytes (on a 32-bit\n+#\t\t\t\t\tmachine) over the size of the data due to the code that manages the\n+#\t\t\t\t\thashtable on which the array is based, another 32 bytes due to the \n+#\t\t\t\t\tfact that it is a Tcl array entry and is not just a simple mapping \n+#\t\t\t\t\tbetween strings, and another 24 bytes for each unique value in the \n+#\t\t\t\t\tarray. (There is also a small overhead due to the overall array and \n+#\t\t\t\t\thashtable management themselves, but this probably doesn't matter \n+#\t\t\t\t\tsince it is roughly invariant with the size of the table; the only\n+#\t\t\t\t\tnon-constant part is the size of the C array holding the addresses\n+#\t\t\t\t\tof the bucket chains, but that's generally going to average at less\n+#\t\t\t\t\tthan a byte per entry.) This gives you an overhead of 72 bytes per \n+#\t\t\t\t\tentry assuming a worst case of all values being different, which is\n+#\t\t\t\t\tlikely to be the case with your code since Tcl doesn't work incredibly\n+#\t\t\t\t\thard at merging values which look the same (if it did, the cost of doing\n+#\t\t\t\t\tthis would be prohibitive.)\"\n+#\n+# Input:        memory:\t\tarray name, wildcard characters are usuable (gxi*)\n+#\t\t\t\t\t\t\t\tdefault is all globals.\n+#\n+# Output:       byte count\n+#\n+#\n+########################################################################################\n+proc CountGlobalMemory {{memory \"\"}} \\\n+{\n+\n+\t# Hash table overhead is 16 bytes per entry\n+\tset hashTableOverhead 16\n+\n+\t# Tcl Array mapping overhead is 32 bytes per entry\n+\tset arrayMappingOverhead 32\n+\n+\t# Unique value overhead is 24 bytes per entry\n+\tset uniqueValueOverhead 24\n+\n+\t# Overall Overhead per Entry\n+\tset TclOverhead \\\n+\t\t[expr $hashTableOverhead + $arrayMappingOverhead + $uniqueValueOverhead]\n+\n+\tset arrayCounter 0\n+\tset arraySizeCounter 0\n+\tset arrayIndexSizeCounter 0\n+\n+\tif {[string length $memory] == 0} {\n+\t\tset command [list info globals]\n+\t} else {\n+\t\tset command [list info globals $memory]\n+\t}\n+\n+\tforeach i [lsort [eval $command]] {\n+\t\tglobal $i\n+\t\tif [array exists $i] {\n+\t\t\tincr arrayCounter [array size $i]\n+\t\t\tforeach j [array names $i] {\n+\t\t\t\tincr arraySizeCounter [string length ${i}($j)]\n+\t\t\t\tincr arrayIndexSizeCounter [string length $j]\n+\t\t\t}\n+\t\n+\t\t} else {\n+\t\t\tincr arraySizeCounter [string length ${i}]\n+\t\t}\n+\t}\n+\n+\tset totalOverhead [expr $TclOverhead * $arrayCounter]\n+\n+#\terrorMsg \"Array Elements: $arrayCounter, \\\n+#\t\t\t  Array Element Overhead: $totalOverhead \\\n+#\t\t\t  Array Size: $arraySizeCounter, \\\n+#\t\t\t  Array Index Overhead: $arrayIndexSizeCounter\"\n+\n+\n+\treturn [expr $arraySizeCounter + $arrayIndexSizeCounter + $totalOverhead]\t\t\t\t\t\t\t\t\t\t\t\n+\n+}\n+\n+\n+########################################################################################\n+# Procedure:    createNamedFont\n+#\n+# Description:  Create a font with the given name, font family, and size.\n+#               If a font exists with the same name, set it to the given font family\n+#               and size.\n+#\n+# Input:        name:   font name\n+#               family: name of the font family\n+#               size:   size of the font\n+#\n+# Output:       nothing\n+#\n+########################################################################################\n+proc createNamedFont { name family size } \\\n+{\n+    if {[lsearch [font names] $name] == -1} { \n+        font create $name -family $family -size $size\n+    } else {\n+        font config $name -family $family -size $size\n+    }\n+}\n+\n+\n+########################################################################################\n+# Procedure:    buildFileName\n+#\n+# Description:  Builds a new file name by appending the type to the main fileName. This \n+#               is used mostly for the tests that either generate mutiple results files\n+#               \n+#\n+# Input:        fileName: filename without the \".results\"\n+#               type :    type, ie. runtype, errorType etc..\n+#\n+# Output:       The new filename\n+#\n+########################################################################################\n+proc buildFileName { fileName  type} \\\n+{\n+    if { [regexp {\\.} $fileName] == 1} {\n+\n+        set firstPart   [string range $fileName 0 [expr [string last . $fileName] -1] ]\n+        set lastPart    [string range $fileName [string last . $fileName] end ] \n+        unset fileName\n+        append fileName $firstPart _$type $lastPart \n+    } else {\n+        append fileName _$type\n+    }\n+\n+    return $fileName\n+}\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/multiUser.tcl b/dep/tclclient/ixTcl1.0/Generic/multiUser.tcl\nnew file mode 100644\nindex 00000000..d7335a00\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/multiUser.tcl\n@@ -0,0 +1,402 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: multiUser.tcl\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#    Revision Log:\n+#    03-01-1998    HS    Genesis\n+#\n+# Description: This file contains commands related to multi-user scripts\n+# to run.\n+#\n+########################################################################\n+\n+##################################################################################\n+# Procedure: ixSource\n+#\n+# This command sources a list of files passed an an argument or the files under\n+# the directory names passed as an argument. If a list of files is passed, then the\n+# full path of the file must be specified.\n+#\n+# Argument(s):\n+#   dirFileName        directory name or list of files to be sourced\n+#\n+##################################################################################\n+proc ixSource {dirFileName} \\\n+{\n+    if [file isdirectory $dirFileName] {\n+        #  if there are .tcl files here, source them first\n+        if {![catch {glob -nocomplain -- [file join $dirFileName *.tcl]}] != -1} {\n+            foreach filename [glob -nocomplain [file join $dirFileName *.tcl]] {\n+                if [catch {source $filename} srcError] {\n+                    ixPuts \"*** $filename: $srcError\"\n+                }\n+            }\n+        }\n+        sourceRecursively $dirFileName\n+    } else {\n+        # else dirFileName is a list of files, so source them\n+        foreach filename $dirFileName {\n+            if [catch {source $filename} srcError] {\n+                ixPuts \"*** $filename: $srcError\"\n+            }\n+        }\n+    }\n+}\n+\n+##################################################################################\n+# Procedure: sourceRecursively\n+#\n+# This command sources all .tcl files in directories recursively.\n+#\n+# Argument(s):\n+#   dirName        directory name under which files to be sourced\n+#\n+##################################################################################\n+proc sourceRecursively {dirName} \\\n+{\n+    foreach currDir [glob -nocomplain [file join $dirName *]] {\n+        if [file isdirectory $currDir] {\n+            foreach filename [glob -nocomplain [file join $currDir *.tcl]] {\n+                if [catch {source $filename} srcError] {\n+                    ixPuts \"*** $filename: $srcError\"\n+                }\n+            }\n+            sourceRecursively [file join $dirName $currDir]\n+        }\n+    } \n+}\n+\n+\n+########################################################################\n+# Procedure: ixLogin\n+#\n+# This command logs in a user.\n+#\n+# Argument(s):\n+#   userName    - name of the user to login\n+#\n+########################################################################\n+proc ixLogin {userName} \\\n+{\n+    session login $userName\n+}\n+\n+########################################################################\n+# Procedure: ixLogout\n+#\n+# This command logs out the current user.\n+#\n+# Argument(s):\n+#   None\n+#\n+########################################################################\n+proc ixLogout {} \\\n+{\n+    session logout\n+}\n+\n+########################################################################\n+# Procedure: ixTakeOwnership\n+#\n+# This command attempts to take ownership of all the ports in the list\n+#\n+# Argument(s):\n+#   txRxList    - list of ports to take ownership\n+#   takeType    - if \"force\" take regardless of whether\n+#                 the port is previously owned by someone else\n+#\n+########################################################################\n+proc ixTakeOwnership {txRxList {takeType \"\"}} \\\n+{\n+    set retCode 0\n+  \n+\tset portList $txRxList\n+    set removedPorts {}\n+\n+    foreach port $txRxList {\n+\n+\t\tscan $port \"%d %d %d\" c l p\n+\n+\n+\t\tif {[lsearch -exact $port \"*\"] != -1}  {\n+\t\t\tset portList [ixCreatePortListWildCard $txRxList]\n+\t\t\tbreak\n+\t\t} else {\n+\t\t\t# in case we pass the name of the txRxList, which causes ixTakeOwnership \n+\t\t\t# misbehaves after error condition, so we check if the parm passed is \n+\t\t\t# really the value of the port list\n+\t\t\tif [catch {format \"%d %d %d\" $c $l $p} port] {\n+\t\t\t\terrorMsg  \"Error creating port list\"\n+\t\t\t\treturn 1\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+    if {[info exists takeType] && $takeType == \"force\"} {\n+        if [issuePortGroupCommand takeOwnershipForced portList] {\n+            errorMsg \"Error forcing ownership on requested ports\"\n+            set retCode 1\n+        }\n+    } else {\n+        foreach portItem $portList {\n+\t\t    scan $portItem \"%d %d %d\" c l p\n+\n+            if [canUse $c $l $p] {\n+                set index    [lsearch $portList [list $c $l $p]]\n+                if {$index >= 0} {\n+                    logMsg \"Port [getPortId $c $l $p] is not available, removing port from the list.\"\n+                    lappend removedPorts    [list $c $l $p] \n+                    set portList [lreplace $portList $index $index]\n+                } \n+                continue\n+            }\n+        }\n+        if [llength $portList] {\n+            if [issuePortGroupCommand takeOwnership portList] {\n+                errorMsg \"Error taking ownership on requested ports\"\n+                set retCode 1\n+            }\n+        } else {\n+            logMsg \"No available ports to take ownership.\"\n+            set retCode 1\n+        }\n+    }\n+\n+    if {$retCode == 0} {\n+        logMsg \"Took ownership of following ports:\"\n+        logMsg \"$portList\"\n+    }\n+\n+    if [llength $removedPorts] {\n+        errorMsg \"Error taking ownership of ports:\"\n+        logMsg $removedPorts\n+    } \n+\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure: ixPortTakeOwnership\n+#\n+# This command attempts to take ownership of this port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#   takeType    - if \"force\" take regardless of whether\n+#                 the port is previously owned by someone else\n+#\n+########################################################################\n+proc ixPortTakeOwnership {chassis lm port {takeType \"\"}} \\\n+{\n+    set portList    [list [list $chassis $lm $port]]\n+    return          [ixTakeOwnership $portList $takeType]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixClearOwnership\n+#\n+# This command clears ownership of all the ports in the list\n+#\n+# Argument(s):\n+#   txRxList    - list of ports to take ownership\n+#   takeType    - if \"force\" take regardless of whether\n+#                 the port is previously owned by someone else\n+#\n+########################################################################\n+proc ixClearOwnership {{txRxList \"\" } {takeType \"\"}} \\\n+{\n+    set retCode 0\n+\n+    if {$txRxList == \"\"} {\n+        set retCode [clearAllMyOwnership]\n+    } else {\n+        set portList [ixCreatePortListWildCard $txRxList]\n+        if {[info exists takeType] && $takeType == \"force\"} {\n+            if [issuePortGroupCommand clearOwnershipForced portList] {\n+                errorMsg \"Error forcing clear ownership on requested ports\"\n+                set retCode 1\n+            }\n+        } else {\n+\t\t\tset otherPortList {}\n+\t\t\tif {[llength $portList] == 0} {\n+\t\t\t\terrorMsg \"Error clear ownership on requested ports\"\n+\t\t\t\tset retCode 1\n+\t\t\t}\n+\t\t\tforeach port $portList {\n+\t\t\t\tscan $port \"%d %d %d\" c l p\n+\t\t\t\tif {![isMine $c $l $p]} {\n+\t\t\t\t\tlappend otherPortList $port\n+\t\t\t\t\tset index [lsearch $portList $port]\n+\t\t\t\t\tset portList [lreplace $portList $index $index]\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tif {[llength $portList] > 0} {\n+\t\t\t\tif [issuePortGroupCommand clearOwnership portList] {\n+\t\t\t\t\terrorMsg \"Error clearing ownership on requested ports\"\n+\t\t\t\t\tset retCode 1\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tif {[llength $otherPortList] > 0} {\n+\t\t\t\terrorMsg \"Error clearing ownership of ports owned by other user(s):\"\n+\t\t\t\tlogMsg $otherPortList\n+\t\t\t\tset retCode 1\n+\t\t\t}\n+        }\n+    }\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: ixPortClearOwnership\n+#\n+# This command clears ownership of this port\n+#\n+# Arguments(s):\n+#    chassis\n+#    lm\n+#    port\n+#   takeType    - if \"force\" take regardless of whether\n+#                 the port is previously owned by someone else\n+#\n+########################################################################\n+proc ixPortClearOwnership {chassis lm port {takeType \"\"}} \\\n+{\n+    set portList    [list [list $chassis $lm $port]]\n+    return          [ixClearOwnership $portList $takeType]\n+}\n+\n+\n+########################################################################\n+# Procedure: ixCheckOwnership\n+#\n+# This command checks ownership of all the ports in the list\n+#\n+# Argument(s):\n+#   TxRxList    - list of ports to take ownership\n+#\n+########################################################################\n+proc ixCheckOwnership {txRxList} \\\n+{\n+    set retCode 0\n+\n+    set portList [ixCreatePortListWildCard $txRxList]\n+\n+    foreach myport $portList {\n+        scan $myport \"%d %d %d\" c l p\n+       \n+        set retCode [canUse $c $l $p] \n+        if {$retCode != 0} {\n+            return $retCode\n+        }\n+    }           \n+    \n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: canUse\n+#\n+# This command checks to see if the port can be used (ie., if it's not\n+# owned by someone else)\n+#\n+# Argument(s):\n+#   c    - chassis\n+#   l    - card\n+#   p    - port\n+#\n+# NOTE:  logMsg is used here rather than ixPuts so that if logs are \n+#        turned on, the canUse message *will* be saved into the test log.\n+#\n+########################################################################\n+proc canUse {c l p} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    if {![port canUse $c $l $p]} {\n+        set retCode $::ixTcl_notAvailable\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: isMine\n+#\n+# This command checks to see if the currently logged in user owns this\n+# port.\n+#\n+# Argument(s):\n+#   c   - chassis\n+#   l   - card\n+#   p   - port\n+#\n+# Returns :\n+#\t0\t-\tthe port is owned by other user\n+#\t1\t-\tthe ixLogin user name matches the ownership owner\n+#\t2\t-\tthe port does not belong to any user\n+#\n+########################################################################\n+proc isMine {chassis card port} \\\n+{\n+    set isMine 0\n+\n+    global ixTcl_notAvailable\n+\n+    if [port get $chassis $card $port] {\n+        errorMsg \"Error getting port $chassis $card $port\"\n+        set retCode 1\n+    } else {\n+        set owner   [port cget -owner]\n+        if {[string tolower $owner] == [string tolower [session cget -userName]]} {\n+            set isMine  1   ;# this is my port\n+        } elseif {[string tolower $owner] == \"\"} {\n+\t\t\tset isMine\t2\t;# this is unowned port\n+\t\t} else {\n+\t\t\tset isMine\t0\t;# this is owned by other\t\t\t\n+\t\t}\n+    }\n+\n+    return $isMine\n+}\n+\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/packetBuilder.tcl b/dep/tclclient/ixTcl1.0/Generic/packetBuilder.tcl\nnew file mode 100644\nindex 00000000..9679b4ea\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/packetBuilder.tcl\n@@ -0,0 +1,922 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: packetBuilder.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t02-19-1998\tDS\tGenesis\n+#\n+# Description: This file contains common utility functions used to \n+#\t\t\t   build the data packets for various protocols.\n+#\n+########################################################################\n+\n+\n+\n+####################################################################\n+#\t\t\t\tUtility procs used in building packets\n+####################################################################\n+\n+\n+\n+########################################################################\n+# Procedure: calculateChecksum\n+#\n+# This command calculates a checksum for the data argument\n+#\n+# Argument(s):\n+#\tdata\t\tdata to calculate checksum for\t\n+#\n+#########################################################################\n+proc calculateChecksum {data} \\\n+{\n+\tset checksum\t0\n+\n+\tforeach {hi low} $data \\\n+\t{\n+\t\tset word [format 0x%02s%02s $hi $low]\n+\t\tset compliment $word\n+\t\tset checksum [expr $checksum + $compliment]\n+\t}\n+\t\n+\tset checksum [expr (($checksum >> 16) + ($checksum & 0xffff))]\n+\tset checksum [expr ~($checksum + ($checksum >> 16))]\n+\n+\treturn [long2octet $checksum]\n+}\n+\n+\n+########################################################################\n+# Procedure: oid2octet\n+#\n+# This command converts an oid into an octet list for use in an SNMP\n+# packet.\n+#\n+# Argument(s):\n+#\t\toid\t\toid to convert\n+#\n+#########################################################################\n+proc oid2octet {oid} \\\n+{\n+\tset myOid\t[oid2dot $oid]\t;# just in case, doesn't hurt\n+\twhile {([string length $myOid] > 0)} \\\n+\t{\n+\t\tset dot\t[string first \".\" $myOid]\n+\t\tif {($dot < 0)} \\\n+\t\t{\n+\t\t\tlappend octet [format %02x $myOid]\n+\t\t\tbreak;\n+\t\t} \\\n+\t\telse \\\n+\t\t{\n+\t\t\tlappend octet [format %02x [string range $myOid 0 [expr $dot-1]]]\n+\t\t\tset myOid\t[string range $myOid [expr $dot+1] end]\n+\t\t}\n+\t}\n+\tset octet [join [lreplace $octet 0 1 2b]]\n+\treturn $octet\n+}\n+\n+\n+########################################################################\n+# Procedure: buildLLCHeader\n+#\n+# This command builds the LLC header for an 802.2 Ethernet frame.\n+#\n+# Argument(s):\n+#\n+#########################################################################\n+proc buildLLCHeader {} \\\n+{\n+\tset DSAP\t\te0\n+\tset SSAP\t\te0\n+\tset control\t\t03\n+\n+\tset llcHeader\t[concat $DSAP $SSAP $control]\n+\n+\treturn $llcHeader\n+}\n+\n+\n+########################################################################\n+# Procedure: buildIpHeader\n+#\n+# This command builds the IP header for an IP frame including \n+# checksum calculation.\n+#\n+# Argument(s):\n+#\t\tsourceIP\t\tIP address of source, in octet format\n+#\t\tdestinationIP\tIP address of destination, in octet format\n+#\t\tdataLength\t\tLength of the data only if UDP; else length of \n+#\t\t\t\t\t\tall data except IP header.\n+#\t\tTTL\t\t\t\ttime to live\n+#\t\tprotocol\t\tProtocol for IP header, ie, 1 = ICMP, 11 - UDP, etc\n+#\t\tflags\t\t\tFlags for IP header\n+#\t\toptions\t\t\t32-bit options + padding, not required\n+#\n+#########################################################################\n+proc buildIpHeader {sourceIP  destinationIP  \\\n+\t\t\t\t\tdataLength TOS TTL protocol flags options} \\\n+{\n+\tset ipType\t\t\t{08 00}\n+\tset\tipVersion\t\t45\n+\tset\tid\t\t\t\t{00 00}\n+\tset headerChecksum\t{00 00}\n+\tset\tTTL\t\t\t\t[format %02x $TTL]\n+\tset TOS\t\t\t\t[format %02x $TOS]\n+\n+\tif {($protocol == 11)}\t\\\n+\t{\n+\t\tset\ttotalLength\t[expr $dataLength + $::kHeaderLength(udp) + $::kHeaderLength(ip)]\n+\t} \\\n+\telse \\\n+\t{\n+\t\tset totalLength $dataLength\n+\t}\n+\n+\tif {[llength $options] != 0} {\n+\t\tfor {set i [llength $options]} {$i < 4} {incr i} {\n+\t\t\tset options\t[concat $options 00]\n+\t\t}\n+\t\tset ipVersion\t46\n+\t}\n+\n+\tset totalLength [expr $totalLength + [llength $options]]\n+\n+\tset ipHeader [concat $ipVersion $TOS [long2octet $totalLength] $id \\\n+\t\t\t\t\t\t $flags $TTL $protocol $headerChecksum \\\n+\t\t\t\t\t\t $sourceIP $destinationIP]\n+\n+\tif {[llength $options] > 0} {\n+\t\tset ipHeader [concat $ipHeader $options]\n+\t}\n+\n+\tset headerChecksum [calculateChecksum $ipHeader]\n+\tset ipHeader [concat $ipType [join [lreplace $ipHeader 10 11 $headerChecksum]]]\n+\n+\treturn $ipHeader\n+}\n+\n+########################################################################\n+# Procedure: buildRipBlock\n+#\n+# This command builds one block for a RIP packet\n+#\n+# Argument(s):\n+#\tipAddress\t\tIP address to use in RIP packet\n+#\tMetric\t\t\tmetric value to use in RIP packet\t\n+#\n+# Note:\n+# ipAddress should be passed in as a string of the format:\n+#\t\"192.42.172.0\" (class C) or \"192.42.0.0\" (class B) etc.\n+# Metric should be passed in as an integer, 1-15 or 16 for unreachable.\n+#  (ref. rfc1058)\n+#########################################################################\n+proc buildRipBlock {ipAddress Metric {familyId \"00 02\"}} \\\n+{\n+\tif {($Metric > 16)} \\\n+\t{\n+\t\tputs \"Invalid metric value. Must be between 1-16.\"\n+\t\treturn\n+\t}\n+\n+\tset Metric\t\t\t[format %02x $Metric]\n+\t\n+\treturn\t[concat $familyId {00 00} \\\n+\t\t\t\t\t[host2addr $ipAddress] \\\n+\t\t\t\t\t{00 00 00 00 00 00 00 00} \\\n+\t\t\t\t\t{00 00 00} $Metric]\n+}\n+\n+########################################################################\n+# Procedure: buildVidHeader\n+#\n+# This procedure builds the VID of a vlan-tagged frame. \n+#\n+# Argument(s):\n+#   userPriority    - user priority field of the TCI, eight priority levels, 0-7\n+#   CFIformat       - Canonical Format Indicator - if set to true, all MAC\n+#                     addresses in frame is in Canonical format\n+#   VID             - twelve-bit VLAN identifier that uniquely identifies\n+#                     the VLAN to which the frame belongs.\n+#\n+#########################################################################\n+proc buildVidHeader {userPriority CFIformat VID} \\\n+{\n+    set tpid    {81 00}\n+\n+    if {$userPriority > 7 || $userPriority < 0} {\n+        logMsg \"Invalid userPriority value.  Parameter set to 0.\"\n+        set userPriority    0\n+        set retCode         1\n+    }\n+\n+   switch $CFIformat {\n+        true {\n+            set CFIformat   1\n+        }\n+        false {\n+            set CFIformat   0\n+        }\n+\t    default {\n+            logMsg \"Invalid CFIformat value.  Parameter set to false.\"\n+            set CFIformat   0\n+            set retCode     1\n+        }\n+    }\n+\n+    if {$VID > 0xfff || $VID < 0} {\n+        logMsg \"Invalid VID value.  Parameter set to 0x00.\"\n+        set VID         0\n+        set retCode     1\n+    }\n+\n+    set tci     [long2octet [expr ((($userPriority << 1) + $CFIformat) << 12) + $VID]]\n+    \n+    return [concat $tpid $tci]\n+}\n+\n+\n+####################################################################\n+#\t\t\t\tPacket building procs\n+####################################################################\n+\n+########################################################################\n+# Procedure: buildIPXPacket\n+#\n+# This procedure builds the header and data portion of an IPX packet\n+#\n+# Argument(s):\n+#\tpacketType\t\ttype of packet (1 byte)\n+#\t\t\t\t\t\t0x00\t- unknown packet type\n+#\t\t\t\t\t\t0x01\t- routing information packet (RIP)\n+#\t\t\t\t\t\t0x04\t- service advertising packet (SAP)\n+#\t\t\t\t\t\t0x05\t- sequenced packet\n+#\t\t\t\t\t\t0x11\t- netware core protocol packet\n+#\t\t\t\t\t\t0x14\t- propagated packet\n+#\tdestNetwork\t\tdestination network (4 bytes)\n+#\tdestNode\t\tdestination node (6 bytes)\n+#\tdestSocket\t\tdestination socket (2 bytes)\n+#\t\t\t\t\t\t0x451\t- NetWare core protocol\n+#\t\t\t\t\t\t0x452\t- Service advertising packet\n+#\t\t\t\t\t\t0x453\t- Routing information packet\n+#\t\t\t\t\t\t0x455\t- NetBIOS packet\n+#\t\t\t\t\t\t0x456\t- Diagnostic packet\n+#\t\t\t\t\t\t0x457\t- Serialization packet\n+#\t\t\t\t\t\t0x4000 - 0x7fff\t\t- dynamic sockets\n+#\t\t\t\t\t\t0x8000 - 0xffff\t\t- well-known sockets; assigned by Novell\n+#\tsourceNetwork\tsource network (4 bytes)\n+#\tsourceNode\t\tsource node (6 bytes)\t\t\n+#\tsourceSocket\tsource socket (2 bytes, see destSocket for description)\n+#\tdataLength\t\tlength of the data\n+#\tdata\t\t\tdata to follow IPX header (length = dataLength bytes)\n+#\n+#########################################################################\n+proc buildIPXPacket {packetType destNetwork destNode destSocket \\\n+\t\t\t\tsourceNetwork sourceNode sourceSocket dataLength data} \\\n+{\n+    set IPXtype             {81 37}\n+\tset checksum\t\t\t{ff ff}\n+\tset\ttransportControl\t00\n+\n+\tif {[llength $destSocket] == 1} {\n+\t\tset\tdestSocket\t  [concat [format %02x [expr (($destSocket >> 8) & 0xff)]] \\\n+\t\t\t\t  \t\t\t\t  [format %02x [expr $destSocket & 0xff]]]\n+\t}\n+\n+\tif {[llength $sourceSocket] == 1} {\n+\t\tset\tsourceSocket  [concat [format %02x [expr (($sourceSocket >> 8) & 0xff)]] \\\n+\t\t\t\t  \t\t\t\t  [format %02x [expr $sourceSocket & 0xff]]]\n+\t}\n+\n+\tset packetType\t\t[format %02x $packetType]\n+\n+\tset packetLength\t[expr $::kIPXHeaderLength + $dataLength]\n+\n+\tset\tlength\t\t\t[concat [format %02x [expr (($packetLength >> 8) & 0xff)]] \\\n+\t\t\t\t\t\t\t    [format %02x [expr $packetLength & 0xff]]]\n+\n+\tset IPXheader [concat $checksum $length $transportControl $packetType \\\n+\t\t\t\t\t\t  $destNetwork $destNode $destSocket \\\n+\t\t\t\t\t\t  $sourceNetwork $sourceNode $sourceSocket]\n+\tset IPXpacket [concat $IPXheader $data]\n+\n+    if {[protocol cget -ethernetType] == 1} {\n+        set ipxFrame    [concat $IPXtype $IPXpacket]\n+    } else {\n+    \tset enLength  [llength $IPXpacket]\n+\t    set\tlength\t  [concat [format %02x [expr (($enLength >> 8) & 0xff)]] \\\n+\t\t    \t\t  \t      [format %02x [expr $enLength & 0xff]]]\n+    \tset ipxFrame \t[concat $length $IPXpacket]\n+    }\n+\n+\treturn $ipxFrame\n+}\n+\n+########################################################################\n+# Procedure: buildIPXData\n+#\n+# This procedure builds the data portion of an IPX packet\n+########################################################################\n+proc buildIPXData {frameSize} \\\n+{\n+\tset ipxdataList {}\n+\tset currLen 0\n+\tset typeLen\t\t\t2\n+\tset dasaLen\t\t\t12\n+\tset crcLen\t\t\t4\n+\n+\twhile {$currLen < [expr $frameSize - $::kIPXHeaderLength - $typeLen - $dasaLen - $crcLen]} {\n+\t\tset ipxdataList [lappend ipxdataList \"B8\"]\n+\t\tincr currLen\n+\t}\n+\treturn $ipxdataList\n+}\n+\n+########################################################################\n+# Procedure: buildServerEntry\n+#\n+# This procedure builds one server entry (64 bytes) for a SAP packet,\n+# For a SAP request, only the service type field will be used to build\n+# the entry.\n+#\n+# Argument(s):\n+#\tserverType\t\t- type of server (2 bytes)\n+#\tserverName\t\t- server name (SAP response only, 48 bytes)\n+#\tnetAddress\t\t- network address on which server resides (4 bytes)\n+#\tnodeAddress\t\t- address of the node on which server resides (2 bytes)\n+#\tsocketNum\t\t- socket number server will receive service requests (2 bytes)\n+#\thops\t\t\t- number of hops to reach server (2 bytes)\n+#\n+#########################################################################\n+proc buildServerEntry {operation serviceType serverName netAddress nodeAddress socketNum hops} \\\n+{\n+\tset entry $serviceType\n+\n+\tif {($operation == $::kSapOperation(response)) || ($operation == $::kSapOperation(getNearestServerResponse))} {\n+\t\tset entry [concat $entry $serverName $netAddress $nodeAddress $socketNum $hops]\n+\t} else {\n+\t\tset emptyList {}\n+#\t\tfor {set i 0} {$i < 62} {incr i} {\n+#\t\t\tset emptyList [lappend emptyList \"00\"]\n+#\t\t}\n+#\t\tset entry [concat $entry $emptyList]\n+\t}\n+\treturn $entry\n+}\n+\n+########################################################################\n+# Procedure: buildSapPacket\n+#\n+# This procedure builds a SAP packet.\n+# For a SAP request, only the service type field will be used to build\n+# the server entry.\n+#\n+# Argument(s):\n+#\toperation\t\t- type of operation the SAP packet performs\n+#\t\t\t\t\t\t1 - request\n+#\t\t\t\t\t\t2 - response\n+#\t\t\t\t\t\t3 - get nearest server request\n+#\t\t\t\t\t\t4 - get nearest server response\t\n+#\tserverEntry\t\t- server information (64 bytes)\n+#\n+#########################################################################\n+proc buildSapPacket {operation serviceType serverName netAddress nodeAddress socketNum hops} \\\n+{\n+\t\n+\tset oper\t[format \"00 %02x\" $operation]\n+\n+\tif {[llength $socketNum] == 1} {\n+\t\tset\tsocketNum\t  [concat [format %02x [expr (($socketNum >> 8) & 0xff)]] \\\n+\t\t\t\t  \t\t\t\t  [format %02x [expr $socketNum & 0xff]]]\n+\t}\n+\n+\tset serverEntry [buildServerEntry $operation $serviceType $serverName $netAddress $nodeAddress \\\n+\t\t\t\t\t $socketNum $hops]\n+\tset sapFrame [concat $oper $serverEntry]\n+\treturn $sapFrame\n+}\n+\n+########################################################################\n+# Procedure: buildNetworkEntry\n+#\n+# This procedure builds one network entry (8 bytes) for a RIPX packet.\n+#\n+# Argument(s):\n+#\tnetworkNumber\t- network number. Set to all F's for requests (4 bytes)\n+#\thops\t\t\t- number of routers to pass through to reach the network\n+#\t\t\t\t\t  number (2 bytes)\n+#\tticks\t\t\t- how much time it takes to reach the network number\n+#\t\t\t\t\t  (2 bytes)\n+#\n+#########################################################################\n+proc buildNetworkEntry {networkNumber hops ticks} \\\n+{\n+\treturn [concat $networkNumber [format \"00 %02x\" $hops] [format \"00 %02x\" $ticks]]\n+}\n+\n+########################################################################\n+# Procedure: buildRipxPacket\n+#\n+# This procedure builds a RIP packet used in IPX.\n+#\n+# Argument(s):\n+#\toperation\t\t- type of operation the SAP packet performs (2 bytes)\n+#\t\t\t\t\t\t1 - request\n+#\t\t\t\t\t\t2 - response\n+#\tnetworkEntry\t- network information (8 bytes)\n+#\n+#########################################################################\n+proc buildRipxPacket {operation networkNumber hops ticks} \\\n+{\n+\tset oper [format \"00 %02x\" $operation]\n+\tset nwEntry [buildNetworkEntry $networkNumber $hops $ticks]\n+\treturn [concat $oper $nwEntry]\n+}\n+\n+########################################################################\n+# Procedure: buildArpPacket\n+#\n+# This procedure builds the data portion of an ARP packet\n+#\n+# Argument(s):\n+#\tsourceMAC\t\tsource MAC address, list format\n+#\tsourceIP\t\tIP address of the source, in text format\n+#\tdutIP\t\t\tIP address of the DUT, in text format\n+#\n+#########################################################################\n+# ARP request on ethernet\n+proc buildArpPacket {sourceMAC sourceIP dutIP} \\\n+{\n+\tset ethernetType\t{08 06}\n+\tset destMAC\t\t\t{00 00 00 00 00 00}\n+\tset hwType\t\t\t{00 01}\n+\tset protocolType\t{08 00}\n+\tset hwAddressLen\t06\t\t;# length of MAC address\n+\tset\tprAddressLen\t04\t\t;# length of IP address\n+\tset opcode\t\t\t{00 01}\n+\n+\treturn\t[concat $ethernetType $hwType $protocolType $hwAddressLen $prAddressLen \\\n+\t\t\t\t\t$opcode $sourceMAC [host2addr $sourceIP] $destMAC [host2addr $dutIP]]\n+}\n+\n+\n+########################################################################\n+# Procedure: buildRipPacket\n+#\n+# This procedure builds the data portion of a routing update frame. Note-\n+# up to 25 IP addresses may be specified in one datagram.\n+#\n+# Argument(s):\n+#\t\tsourceMAC\t\tsource MAC address, list format\n+#\t\tsourceIP\t\tIP address of source, in text format\n+#\t\tdestinationIP\tIP address of destination, in text format\n+#\t\tRipCommand\t\tCommand for RIP frame:  01 - request\n+#\t\t\t\t\t\t\t\t\t\t\t\t02 - response\n+#\t\tIpList\t\t\tList of RIP blocks to build RIP packet from -\n+#\t\t\t\t\t\tuse buildRipBlocks\n+#\n+#########################################################################\n+proc buildRipPacket {sourceMAC sourceIP destinationIP RipCommand IpList {ttl 0x40} {ripVersion 02}} \\\n+{\n+\t# Determine number of items in IpList first...\n+\tset\tIpListLength\t[llength $IpList]\n+\tif {($IpListLength > 25)} \\\n+\t{\n+\t\tputs \"Too many IP addresses specified for RIP\"\n+\t\treturn\n+\t}\n+\n+\t# Determine data length for IP header & UDP header\n+\tset\tRipLength\t\t20\n+\tset dataLength\t\t[expr ($IpListLength * $RipLength) + $::kHeaderLength(rip)]\n+\n+\t# Build IP header for RIP packet\n+\tset TOS\t\t\t\t00\t\t;# includes precedence bits\n+\tset protocol\t\t11\n+\tset\tflags\t\t\t{00 00}\n+\tset options\t\t\t{}\n+\n+\t# make the destination IP address into a broadcast type...\n+\tset destinationIP\t[host2addr $destinationIP]\n+\tif {( [llength $destinationIP] == 0 )} \\\n+\t{\n+\t\tputs \"Invalid destination IP address.\"\n+\t\treturn\n+\t}\n+\tset ipHeader\t\t[buildIpHeader [host2addr $sourceIP] $destinationIP \\\n+\t\t\t\t\t\t\t\t\t\t$dataLength $TOS $ttl $protocol $flags $options]\n+\n+\t# build UDP part\n+\tset sourcePort\t\t{02 08}\t\t;# source port 208 = RIP\n+\tset destPort\t\t{02 08}\n+\tset udpLength\t\t[expr $dataLength + $::kHeaderLength(udp)]\n+\tset\tudpLength\t\t[concat [format %02x [expr (($udpLength >> 8) & 0xff)]] \\\n+\t\t\t\t\t\t\t    [format %02x [expr $udpLength & 0xff]]]\n+\tset udpChecksum\t\t{00 00}\n+\n+\t# build data part of UDP\n+\tset RipCommand\t\t[format %02x $RipCommand]\t;# just to clean it up\n+\tset data\t\t\t[concat $RipCommand [format %02x $ripVersion] {00 00}]\n+\n+\tforeach {ipItem} $IpList \\\n+\t{\n+\t\tset data\t\t[concat $data $ipItem]\n+\t}\n+\n+\tset\tudpData\t\t\t[concat $sourcePort $destPort $udpLength $udpChecksum $data]\n+\tset\tpseudoIpHdr\t\t[concat [host2addr $sourceIP] $destinationIP 00 $protocol $udpLength]\n+\tset\tudpChecksum\t\t[calculateChecksum $pseudoIpHdr]\n+\n+\t# replace udpChecksum in udpData\n+\treturn\t[concat $ipHeader [join [lreplace $udpData 6 7 $udpChecksum]]]\n+}\n+\n+\n+########################################################################\n+# Procedure: buildUdpEchoPacket\n+#\n+# This procedure builds the data portion of a test packet for use \n+# w/Bradner's test suite\n+#\n+# Argument(s):\n+#\tsourceIP\t\tIP address of source, in text format\n+#\tdestIP\t\t\tIP address of destination, in text format\n+#\tframeLength\t\ttotal length of frame, including IP & UDP headers\t\n+#\n+#########################################################################\n+proc buildUdpEchoPacket {sourceIP destIP frameLength} \\\n+{\n+\t# a couple of constants...\n+\tset\taddressLength\t6\n+\tset\tcrcLength\t\t4\n+\tset\ttypeLength\t\t2\n+\n+\tset dataLength\t\t[expr $frameLength - $addressLength*2 - $typeLength - \\\n+\t\t\t\t\t\t\t  $::kHeaderLength(ip) - $::kHeaderLength(udp) - $crcLength]\n+\n+\tset TOS\t\t\t\t00\t\t;# includes precedence bits\n+ \tset TTL\t\t\t\t0x0a\n+ \tset protocol\t\t11\t\t\t;# UDP\n+ \tset flags\t\t\t{00 00}\n+\tset options\t\t\t{}\n+\tset ipHeader\t\t[buildIpHeader [host2addr $sourceIP] [host2addr $destIP] \\\n+\t\t\t\t\t\t\t\t\t\t$dataLength $TOS $TTL $protocol $flags $options]\n+\n+\t# build UDP part\n+ \tset sourcePort\t\t{C0 20}\n+ \tset destPort\t\t{00 07}\t\t;# ethernet Echo\n+\tset udpLength\t\t[concat {00} [format %02x [expr $dataLength + $::kHeaderLength(udp)]]]\n+\tset udpChecksum\t\t{00 00}\n+\n+ \tset data {}\n+    for {set x 0} {$x < $dataLength} {incr x} {\n+ \t\tlappend data [format %02x [expr $x & 0xff]]\n+ \t}\n+\n+ \tset udpHeader\t\t[concat $sourcePort $destPort $udpLength $udpChecksum]\n+\tset pseudoIpHeader\t[concat [host2addr $sourceIP] [host2addr $destIP] 00 $protocol $udpLength]\n+\tset udpChecksum\t\t[calculateChecksum [concat $pseudoIpHeader $udpHeader $data]]\n+\tset udpHeader\t\t[join [lreplace $udpHeader 6 end $udpChecksum]]\n+\n+ \treturn [concat $ipHeader $udpHeader $data]\n+}\n+\n+\n+########################################################################\n+# Procedure: buildIgmpPacket\n+#\n+# This procedure builds the data portion of an IP-multicast (IGMP)\n+# packet.\n+#\n+# Argument(s):\n+#\tsourceIP\t\tIP address of source, in text format\n+#\tdestIP\t\t\tIP address of destination, in text format\n+#\tversion\t\t\tv1 or v2 IGMP\n+#\ttype\t\t\tIGMP message type:\n+#\t\t\t\t\t\t0x11\t- Membership query\n+#\t\t\t\t\t\t0x16\t- Version 2 membership report\n+#\t\t\t\t\t\t0x17\t- Leave group\n+#\t\t\t\t\t\t0x12\t- Version 1 membership report (provided\n+#\t\t\t\t\t\t\t\t  for backwards capability only)\n+#\trespTime\t\tMaximum allowed time before sending a responding\n+#\t\t\t\t\treport, in units of 1/10 second.  Valid only for\n+#\t\t\t\t\ttype = 0x11 (membership query)\n+#\tgroupAddr\t\tIP multicast group address, set to zero for sending\n+#\t\t\t\t\ta general membership query.\n+#\n+#########################################################################\n+\n+proc buildIgmpPacket {sourceIP destIP version type respTime groupAddr} \\\n+{\n+\tset TOS\t\t\t\t0xc0\t\t\t;# includes precedence bits\n+ \tset TTL\t\t\t\t0x01\n+ \tset protocol\t\t02\t\t\t;# IGMP\n+\tset IgmpHdrLength\t[expr 8 + $::kHeaderLength(ip)]\n+ \tset flags\t\t\t{00 00}\n+\n+\tswitch $version {\n+\t\tdefault -\n+\t\tv1\t{\n+\t\t\tset options\t\t\t{}\n+\t\t}\n+\t\tv2\t{\n+\t\t\tset options\t\t\t{94 04}\n+\t\t}\n+\t}\n+\tset ipHeader\t\t[buildIpHeader [host2addr $sourceIP] [host2addr $destIP] \\\n+\t\t\t\t\t\t\t\t\t\t$IgmpHdrLength $TOS $TTL $protocol $flags $options]\n+\n+\t# build IGMP part\n+\tset type\t\t\t[format %02x $type]\n+\tset respTime\t\t[format %02x $respTime]\n+\tset igmpChecksum\t{00 00}\n+\tif {$groupAddr == 0} {\n+\t\tset groupAddr\t0.0.0.0\n+\t}\n+\n+\tset igmpHeader\t\t[concat $type $respTime $igmpChecksum [host2addr $groupAddr]]\n+\n+\tset igmpChecksum\t[calculateChecksum $igmpHeader]\n+\tset igmpHeader\t\t[join [lreplace $igmpHeader 2 3 $igmpChecksum]]\n+\n+ \treturn [concat $ipHeader $igmpHeader]\n+}\n+\n+\n+########################################################################\n+# Procedure: buildIpPriorityPacket\n+#\n+# This procedure builds the data portion of a test UDP packet for Priority\n+# Queue test.\n+#\n+# Argument(s):\n+#\tsourceIP\t\tIP address of source, in text format\n+#\tdestIP\t\t\tIP address of destination, in text format\n+#\tframeLength\t\ttotal length of frame, including IP & UDP headers\n+#\tprecedence\t\n+#\n+#########################################################################\n+\n+proc buildIpPriorityPacket {sourceIP destIP frameLength TOS} \\\n+{\n+\t# a couple of constants...\n+\tset\taddressLength\t6\n+\tset\tcrcLength\t\t4\n+\tset\ttypeLength\t\t2\n+\n+\tset dataLength\t\t[expr $frameLength - $addressLength*2 - $typeLength - \\\n+\t\t\t\t\t\t\t  $::kHeaderLength(ip) - $::kHeaderLength(udp) - $crcLength]\n+\n+\tset TOS\t\t\t\t[format %02x $TOS]\t\t;# includes precedence bits\n+ \tset TTL\t\t\t\t0x0a\n+ \tset protocol\t\t11\t\t\t;# UDP\n+ \tset flags\t\t\t{00 00}\n+\tset options\t\t\t{}\n+\tset ipHeader\t\t[buildIpHeader [host2addr $sourceIP] [host2addr $destIP] \\\n+\t\t\t\t\t\t\t\t\t\t$dataLength $TOS $TTL $protocol $flags $options]\n+\n+\t# build UDP part\n+ \tset sourcePort\t\t{C0 20}\n+ \tset destPort\t\t{00 07}\t\t;# ethernet Echo\n+\tset udpLength\t\t[concat {00} [format %02x [expr $dataLength + $::kHeaderLength(udp)]]]\n+\tset udpChecksum\t\t{00 00}\n+\n+ \tfor {set x 0} {$x < $dataLength} {incr x} {\n+ \t\tlappend data [format %02x [expr $x & 0xff]]\n+ \t}\n+\n+ \tset udpHeader\t\t[concat $sourcePort $destPort $udpLength $udpChecksum]\n+\tset pseudoIpHeader\t[concat [host2addr $sourceIP] [host2addr $destIP] 00 $protocol $udpLength]\n+\tset udpChecksum\t\t[calculateChecksum [concat $pseudoIpHeader $udpHeader $data]]\n+\tset udpHeader\t\t[join [lreplace $udpHeader 6 end $udpChecksum]]\n+\n+ \treturn [concat $ipHeader $udpHeader $data]\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: buildVlanTagPacket\n+#\n+# This procedure builds the data portion of a vlan tag packet. \n+#\n+# Argument(s):\n+#   userPriority    - user priority field of the TCI, eight priority levels, 0-7\n+#   CFIformat       - Canonical Format Indicator - if set to true, all MAC\n+#                     addresses in frame is in Canonical format\n+#   VID             - twelve-bit VLAN identifier that uniquely identifies\n+#                     the VLAN to which the frame belongs.\n+#   data            - remaining data for packet\n+#\n+#########################################################################\n+proc buildVlanTagPacket {userPriority CFIformat VID data} \\\n+{\n+    return [concat [buildVidHeader $userPriority $CFIformat $VID] $data]\n+}\n+\n+\n+########################################################################\n+# Procedure: buildSnmpPacket\n+#\n+# This procedure builds the data portion of an SNMP management frame. \n+# Only 'get' requests are supported.\n+#\n+# Argument(s):\n+#\tsourceIP\t\tIP address of source, in text format\n+#\tdestIP\t\t\tIP address of destination, in text format\n+#\tsourcePort\t\tSource port to aim SNMP packet at\n+#\tcommunityName\tcommunity name, in text format (usually 'public')\n+#\toid\t\t\t\toid to get\t\n+#\n+#########################################################################\n+proc buildSnmpPacket {sourceIP destIP sourcePort communityName oid } \\\n+{\n+\t# build SNMPv1 part first...\n+\tset\tasn1Header\t\t30\n+\tset snmpVersion\t\t{02 01 00}\n+\tset community\t\t04\n+\tset\tNullValue\t\t{05 00}\t\t\t\t\t;# cause we only do gets...\n+\n+\tset\tsnmpGet\t\t\ta0\n+\tset snmpRequestID\t{02 02 00 00}\n+\tset\tsnmpErrorIndex\t{02 01 00 02 01 00}\n+\n+\t# begin building varbind list\n+\tset\toid\t\t\t\t[oid2octet $oid]\t\t;# turn oid into an octet list\n+\tset oidLength\t\t[llength $oid]\n+\t\n+\tset\tVarBind\t\t\t[concat [list 06 [format %02x $oidLength]] $oid]\n+\t\n+\tset VarBindLength\t[list 30 [format %02x [expr $oidLength + 4]]]\n+\tset\tVarBind\t\t\t[concat\t$VarBindLength $VarBind]\n+\n+\tset\tVarBindList\t\t[list 30 [format %02x [expr [llength $VarBind] + 2]]]\n+\n+\tset\tVarBind\t\t\t[concat $snmpRequestID $snmpErrorIndex $VarBindList $VarBind]\n+\tset\tVarBind\t\t\t[concat $snmpGet [format %02x [expr [llength $VarBind] + 2]] $VarBind]\n+\n+\t# Finish by building pdu\n+\tset\tcommunityName\t[string tolower $communityName]\n+\tset\tpdu\t\t\t\t[concat $snmpVersion $community [format %02x [llength $communityName]] \\\n+\t\t\t\t\t\t\t\t$communityName $VarBind]\n+\t\n+\tset pdu\t\t\t\t[concat $asn1Header [format %02x [expr [llength $pdu] + 2]] $pdu $NullValue]\n+\n+\t\n+\t# build UDP part next\n+\tset destPort\t\t{00 a1}\t\t;# SNMP port 161\n+\tset\tudpLength\t\t[concat {00} [format %02x [expr [llength $pdu] + $::kHeaderLength(udp)]]]\n+\tset\tudpChecksum\t\t{00 00}\n+\tset sourcePort\t\t[list [format %02x [expr $sourcePort >> 8]] \\\n+\t\t\t\t\t\t\t  [format %02x [expr $sourcePort & 0xff]]]\n+\tset\tudp\t\t\t\t[concat $sourcePort $destPort $udpLength $udpChecksum $pdu]\n+\tset\tudpChecksum\t\t[calculateChecksum $udp]\n+\tset udp\t\t\t\t[join [lreplace $udp 6 7 $udpChecksum]]\n+\n+\tset TOS\t\t\t\t00\t\t;# includes precedence bits\n+\tset TTL\t\t\t\t80\n+\tset protocol\t\t11\t\t\t;# UDP\n+\tset flags\t\t\t{00 00}\n+\tset options\t\t\t{}\n+\tset\tipHeader\t\t[buildIpHeader [host2addr $sourceIP] [host2addr $destIP] \\\n+\t\t\t\t\t\t\t\t\t    [llength $pdu] $TOS $TTL $protocol $flags $options]\n+\n+ \treturn [concat $ipHeader $udp]\n+}\n+\n+########################################################################\n+# Procedure: buildIcmpPacket\n+#\n+# This procedure builds the data portion of an icmp/ping packet.\n+#\n+# Argument(s):\n+#\tsourceIP\t\tIP address of source, in text format\n+#\tdestIP\t\t\tIP address of destination, in text format\n+#\tdataLength\t\tlength of ping\n+#\ticmpEcho\t\t== 1 if this is this an Echo frame, 0 if response\n+#\ticmpSequence\tsequence number for this ping, 0 is valid.\n+#\n+#########################################################################\n+proc buildIcmpPacket {sourceIP destIP dataLength icmpEcho icmpSequence} \\\n+{\n+\tset\tstart\t\t\t\t97\n+\tset\tmax\t\t\t\t\t[expr $start + 22]\n+\n+ \tif {($icmpEcho == 1)} \\\n+\t{\n+\t\tset icmpEcho\t08\n+\t} \\\n+\telse \\\n+\t{\n+\t\tset icmpEcho\t00\n+\t}\n+\t\n+\tset\ticmpCode\t\t00\n+\tset\ticmpChecksum\t{00 00}\n+\tset\ticmpId\t\t\t{01 00}\n+\n+\tset\ticmpSequence\t[long2octet $icmpSequence]\n+\n+ \tfor {set x 0} {$x < $dataLength} {incr x } {\n+\t\tif {($start > $max)} {set start 97}\n+ \t\tlappend data [format %02x $start]\n+\t\tincr start\n+ \t}\n+\n+\tset\ticmp\t\t\t[concat $icmpEcho $icmpCode $icmpChecksum \\\n+\t\t\t\t\t\t\t\t$icmpId $icmpSequence $data]\n+\tset icmpChecksum\t[calculateChecksum $icmp]\n+\tset icmp\t\t\t[join [lreplace $icmp 2 3 $icmpChecksum]]\n+\n+\tset TOS\t\t\t\t00\t\t;# includes precedence bits\n+\tset TTL\t\t\t\t0x0a\n+\tset protocol\t\t01\t\t\t;# ICMP\n+\tset flags\t\t\t{00 00}\n+\tset options\t\t\t{}\n+\tset\tipHeader\t\t[buildIpHeader [host2addr $sourceIP] [host2addr $destIP] \\\n+\t\t\t\t\t\t\t\t\t   [expr [llength $icmp] + $::kHeaderLength(ip)] \\\n+\t\t\t\t\t\t\t\t\t    $TOS $TTL $protocol $flags $options]\n+\n+\treturn\t[concat $ipHeader $icmp]\n+}\n+\n+\n+########################################################################\n+# Procedure: buildBpduPacket\n+#\n+# This procedure builds the data portion of a 802.1d BPDU packet.\n+#\n+# Argument(s):\n+#   rootID      root id in IEEE 802.1d BPDU packet\n+#   bridgeID    bridge id in IEEE 802.1d BPDU packet\n+#\t\n+#########################################################################\n+proc buildBpduPacket { {rootID {00 10 FF E4 1C 0D}} {bridgeID {00 10 FF E4 1C 0D}} {protocolID 0} {versionID 0} {bpduType 0} {bitField 0} \\\n+                  {rootPriority 0} {rootPathCost 0} {bridgePriority 32768} {portID 128} \\\n+                  {messageAge 17920} {maxAge 20} {helloTime 2} {forwardDelay 15} } \\\n+{\n+    set bpduData {}\n+\n+    set llcHeader       {42 42 03}                              \n+    set protocolID      [long2octet $protocolID]              ;# 2 byte\n+    set versionID       [long2octet $versionID 1]             ;# 1 byte\n+    set bpduType        [long2octet $bpduType  1]             ;# 1 byte\n+    set bitField        [long2octet $bitField  1]             ;# 1 byte\n+    set rootPriority    [long2octet $rootPriority]            ;# 2 byte\n+    set rootPathCost    [long2octet $rootPathCost 4]          ;# 4 byte\n+    set bridgePriority  [long2octet $bridgePriority]          ;# 2 byte\n+    set portID          [long2octet $portID 1]                ;# 1 byte\n+    set messageAge      [long2octet $messageAge]              ;# 2 byte\n+    set maxAge          [long2octet $maxAge]                  ;# 2 byte\n+    set helloTime       [long2octet $helloTime]               ;# 2 byte\n+    set forwardDelay    [long2octet $forwardDelay]            ;# 2 byte\n+   \n+    set otherData       {00 10 54 65 73 74 5f 52 6f}\n+    set bpduData        [concat $llcHeader $protocolID $versionID $bpduType $bitField $rootPriority \\\n+                                $rootID $rootPathCost $bridgePriority $bridgeID $portID $messageAge \\\n+                                $maxAge $helloTime $forwardDelay $otherData] \n+    \n+    \n+    set length          [long2octet [llength $bpduData]]\n+\n+    return              [concat  $length $bpduData ] \n+}\n+\n+\n+\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/parseArgs.tcl b/dep/tclclient/ixTcl1.0/Generic/parseArgs.tcl\nnew file mode 100644\nindex 00000000..c4bb6288\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/parseArgs.tcl\n@@ -0,0 +1,87 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: parseArgs.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t10-11-2004\tHasmik\n+#\n+# Description: This file contains common procs used for parsing\n+#              \n+#\n+##################################################################################\n+\n+\n+\n+########################################################################\n+# Procedure:   ixGetArgument\n+#\n+# Description: This command will return a value from an argument list\n+#              for a given named argument\n+#\n+# Arguments:\n+#    argList   - A list of arguments.\n+#    argToFind - The name of the option to find in the argList\n+#\n+########################################################################\n+proc ixGetArgument { argList argToFind } \\\n+{\n+\t\n+\tset retValue \"\"\n+\n+\tif {[llength $argList] == 0 } {\n+\t\terrorMsg \"Error - empty argument list\"\n+\t\treturn $retValue\n+\t}\n+\n+    # Put on the dash if it is missing.\n+    if {[string index $argToFind 0] != \"-\"} {\n+        set argToFind [format \"-%s\" $argToFind]\n+    } \n+\n+    set index [lsearch -exact $argList $argToFind]\n+\n+    if {$index != -1} {\n+        # Just in case they passed a list with the argument, then nothing\n+        # after it, this will return null in that case.\n+        if {[catch {lindex $argList [expr $index + 1]} retValue]} {\n+            set retValue \"\"\n+        }\n+    }\n+\n+\treturn $retValue\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/platform.tcl b/dep/tclclient/ixTcl1.0/Generic/platform.tcl\nnew file mode 100644\nindex 00000000..7aba7d2d\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/platform.tcl\n@@ -0,0 +1,88 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: platform.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#       Revision Log:\n+#       09-29-2000       DS\n+#\n+# Description: This file contains platform-independent stuff\n+#\n+##################################################################################\n+\n+\n+############################################################\n+# Procedure  : isUNIX\n+# \n+# Description: This proc tells if current OS is Windows.\n+# Output     : 1 if it is UNIX, 0 otherwise.\n+#\n+############################################################\n+proc isUNIX {} \\\n+{\n+    global tcl_platform\n+\n+    set retCode 0\n+\n+    if {$tcl_platform(platform) == \"unix\"} {\n+        set retCode 1\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+############################################################\n+# Procedure  : isWindows\n+# \n+# Description: This proc tells if current OS is Windows.\n+# Output     : 1 if it is UNIX, 0 otherwise.\n+#\n+############################################################\n+\n+proc isWindows {} \\\n+{\n+    global tcl_platform\n+\n+    set retCode 0\n+\n+    if {$tcl_platform(platform) == \"windows\"} {\n+        set retCode 1\n+    }\n+\n+    return $retCode\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/random.tcl b/dep/tclclient/ixTcl1.0/Generic/random.tcl\nnew file mode 100644\nindex 00000000..e6e68739\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/random.tcl\n@@ -0,0 +1,109 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: random.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t02-03-2000\tHSH\n+#\n+# Description: This file contains common procs used for generating random\n+#              numbers\n+#\n+##################################################################################\n+\n+\n+########################################################################\n+# Set the default randomSeed\n+# Now use a random number to be the randomSeed\n+########################################################################\n+\n+global randomSeed\n+\n+set randomSeed [expr int( [expr rand()] * 100 ) ]\n+\n+\n+########################################################################\n+# Procedure: RandomRange\n+# Should let range equal to \"the total number of data\" ( do not subtract 1 )!!\n+#\n+# range -  the range of random numbers \n+#\n+########################################################################\n+proc RandomRange { range } \\\n+{\n+ \t\n+    return [ expr int( [ Random ] * $range ) ]\n+}\n+\n+########################################################################\n+# Procedure: Random\n+# This gives a random decimal num.\n+# \n+########################################################################\n+\n+proc Random {} \\\n+{\n+ \tglobal randomSeed\n+ \tset randomSeed [ expr ( $randomSeed * 9301 + 49297 ) %233280 ]\n+\treturn [ expr $randomSeed / double( 233280 ) ]\n+}\n+\n+########################################################################\n+# Procedure: RandomInit\n+# \n+# \n+########################################################################\n+proc RandomInit {} \\\n+{\n+    global randomSeed\n+    set randomSeed  [clock seconds]\n+}\n+\n+\n+########################################################################\n+# Procedure: RandomFromTo\n+# This gives a random num within the given range of numbers.\n+# \n+########################################################################\n+proc RandomFromTo {from to} \\\n+{\n+    global randomSeed\n+\n+    set randomSeed [expr ($randomSeed*9301 + 49297) % 233280]\n+    set random     [expr $randomSeed/double(233280)]\n+\n+    return [expr int($random * ($to - $from + 1)) + $from]\n+}\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/scriptmateBackCompat.tcl b/dep/tclclient/ixTcl1.0/Generic/scriptmateBackCompat.tcl\nnew file mode 100644\nindex 00000000..8c99c3f1\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/scriptmateBackCompat.tcl\n@@ -0,0 +1,65 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: scriptmateBackCompat.tcl\n+#\n+#   This file is used to create backwards compatibility for sample scripts created prior to\n+#   IxOS 3.70.  Post of this version, a package require Scriptmate is needed.  This will handle\n+#   attempting to define the commands that used to be defined by IxTclHal and now are defined \n+#   Scriptmate\n+#  \n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#############################################################################################\n+\n+namespace eval scriptmateBackwardsCompatibility {}\n+\n+\n+proc scriptmateBackwardsCompatibility::createAllCommands { } {\n+\n+    foreach cmd {addr back2back bcast cableModem congest dataVerify dtm errframe floss flow gapcheck imix \\\n+            ipmulticast latency tunnel mesh qost randomFS tput tputerror tputjitter tputnat tputl2l3 tputlat \\\n+            tputmfs tputvlan ttl wip results internalModem user bgpSuite dslats ospfSuite rsvpSuite ldpSuite \\\n+            l2VpnSuite l3VpnSuite} {\n+\n+        proc $cmd { args } {\n+            if {[catch {package require Scriptmate}]} {\n+                return \"Command is not supported by IxTclHal, it is part of Scriptmate\"\n+            } else {\n+                return [eval $cmd $args]\n+            }\n+        }\n+    }\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/socket.tcl b/dep/tclclient/ixTcl1.0/Generic/socket.tcl\nnew file mode 100644\nindex 00000000..50d60a2c\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/socket.tcl\n@@ -0,0 +1,718 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: socket.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+# Revision Log:\n+#\n+# Description: \n+#\n+###############################################################################\n+\n+###############################################################################\n+# Procedure: serverSocketAccept\n+#\n+# Description: This function accepts a connection request from client and \n+#              spawns a new socket that will be used to communicate with client\n+#\n+# Arguments:\n+#    socket - the name of the socket to configure\n+#    addr - the ip address or hostname of client\n+#    port - the port number of the server socket\n+###############################################################################\n+proc serverSocketAccept {socket addr port} \\\n+{ \n+    debugMsg \"enter serverSocketAccept $socket from $addr port $port\"\n+\n+    fconfigure $socket -buffering none\n+    fconfigure $socket -blocking 0\n+    fileevent  $socket readable [list readsocket $socket]\n+\n+    debugMsg \"exit  serverSocketAccept\"\n+}\n+\n+\n+###############################################################################\n+# Procedure: readSocket\n+#\n+# Description: This function reads a line from client. It is invoked \n+#              everytime a message arrived from client.\n+#\n+# Arguments:\n+#    socket - the socket that is communicating with the client.\n+###############################################################################\n+proc readsocket {socket} \\\n+{\n+    global socketArray\n+\n+    debugMsg \"enter readSocket $socket\"\n+\n+    if {[eof $socket] || [catch {gets $socket line}]} {\n+\n+        closeSocket $socket\n+        debugMsg \"Close $socket\"\n+\n+     } else {\n+        \n+        debugMsg \"line=$line\"\n+\n+        if {[string compare $line \"quit\"] == 0} {\n+            close $socketArray(serverSocket)\n+            catch {unset socketArray(serverSocket)}\n+        }\n+\n+        if [isLogSocket $socket] {\n+\n+            if { ![regexp {client response:|runningStatus:|this is log socket} $line] } {\n+\n+                if [fblocked $socket] {\n+                    set line [read -nonewline $socket]\n+                    updateLog $line 0\n+                } else {\n+                    updateLog $line\n+                }\n+\n+            } else {\n+\n+                handleEvent $socket $line\n+            }\n+\n+        } elseif {[isCommandSocket $socket]} {\n+            fileTransferServer::handleCommand $line\n+\n+        } elseif {[isDataSocket $socket]} {\n+\n+            fileTransferServer::handleData $line\n+\n+        } else {\n+\n+            handleEvent $socket $line\n+        }\n+    }\n+\n+    update idletask\n+    debugMsg \"exit  readSocket\"\n+}\n+\n+\n+###############################################################################\n+# Procedure: handleEvent\n+#\n+# Description: This function invokes the appropriate action according to the\n+#              contents of the input from client.\n+#\n+# Arguments:\n+#    socket - the socket that received the line.\n+#    line - the character string received from the client\n+###############################################################################\n+proc handleEvent {socket line} \\\n+{\n+    global currContext\n+    global socketArray\n+\n+    debugMsg \"enter handleEvent socket=$socket line=$line\"\n+    \n+    set commandPattern \"\"\n+    catch { regexp {(.*): (.*)} $line match commandPattern portMapList }\n+\n+\n+    if {[regexp {client response} $line]} {\n+\n+        # Nothing to do\n+\n+    } elseif {$line == \"closeSocket\"} {\n+\n+        closeSocket $socket\n+\n+    } elseif {$line == \"runningStatus:currentTestFinished\"} {\n+\n+        updateLog \"\\n****** Current test(s) finished ******\"\n+\n+        runStop\n+        forceToStop\n+\n+       \tsetSF08StartButtonState normal\n+\n+        displayResults\n+\n+    } elseif {$line == \"runningStatus:currentTestFailed\"} {\n+\n+        updateLog \"\\n****** Current test(s) failed ******\"\n+\n+        runStop\n+        forceToStop\n+\n+    } elseif {$line == \"runningStatus:currentTestStopped\"} {\n+\n+        updateLog \"\\n****** Current test(s) stopped ******\"\n+\n+        runStop\n+        forceToStop\n+\n+        setSF08StartButtonState normal\n+\n+    } elseif {$line == \"runningStatus:currentTestStoppedByUser\"} {\n+\n+        updateLog \"\\n****** Current test(s) stopped by user ******\"\n+\n+        forceToStop\n+       \n+        setSF08StartButtonState normal\n+\n+    } elseif {[regexp {removefile} $line]} {\n+\n+        set file [lindex [split $line \"?\"] 1]\n+        debugMsg \"file to be removed is $file\"\n+\n+        if [file exists $file] {\n+            catch {file delete $file}\n+        }\n+\n+    } elseif {$line == \"progress dialog is ready\"} {\n+\n+        progressDialogReady\n+\n+    } elseif {$line == \"this is test command socket\"} {\n+\n+        set currContext(commandSocketReady) 1\n+        set socketArray(testCommandSocket)  $socket\n+\n+    } elseif {$line == \"Background wish is ready\"} {\n+\n+        backgroundWishReady\n+        \n+    } elseif {$line == \"this is log socket\"} {\n+\n+        set socketArray(logSocket) $socket\n+\n+    } elseif {$line == \"this is command socket\"} {\n+\n+        set socketArray(commandSocket) $socket\n+\n+    } elseif {$line == \"this is data socket\"} {\n+\n+        set socketArray(dataSocket) $socket\n+    } elseif { $commandPattern == \"portlist\" } {\n+\n+        debugMsg \"[pid]>>>>>>>>> portMapList:$portMapList\"\n+        testConfig::setCurrentTestMap $portMapList \n+    }\n+\n+    debugMsg \"exit  handleEvent\"\n+}\n+\n+\n+###############################################################################\n+# Procedure: generatePort\n+#\n+# Description: This function generates a port for then server side socket.\n+#              It is based on the current pid.\n+#\n+# Returns the generated port number.\n+###############################################################################\n+proc generatePort {} \\\n+{\n+    debugMsg \"enter generatePort\"\n+\n+    set port [pid]\n+    set len  [string length $port]\n+    debugMsg \"pid=$port\"\n+\n+    if {$len > 4} {\n+        set port [string range $port [expr $len - 4] [expr $len - 1]]\n+    }\n+\n+    if {[string compare $port 0] != 0} {\n+        set port [string trimleft $port 0] \n+    }\n+\n+    if {$port < 4000} {\n+        incr port 4000\n+    }\n+\n+    debugMsg \"exit  generatePort port=$port\"\n+    return $port\n+}\n+\n+\n+###############################################################################\n+# Procedure: putsClient\n+#\n+# Description: This function sends a line to client.\n+#\n+# Arguments:\n+#    line - The string of characters that is to be sent to the client side.\n+###############################################################################\n+proc putsClient {line} \\\n+{\n+    global socketArray\n+\n+    debugMsg \"enter putsClient line=$line\"\n+\n+    if {([info exists socketArray(testCommandSocket)] == 0) || \\\n+            ($socketArray(testCommandSocket) == -1)} {\n+        debugMsg \"exit putsClient on testCommandSocket does not exist\"\n+\n+    } else {\n+        catch {puts  $socketArray(testCommandSocket) $line}\n+        catch {flush $socketArray(testCommandSocket)}\n+        debugMsg \"exit  putsClient\"\n+    }\n+}\n+\n+\n+###############################################################################\n+# Procedure: createServerSocket\n+#\n+# Description: This function creates a server side socket on the specified\n+#              port. If port is not specified, the port number will be \n+#              generated using pid and set to SCRIPTMATE_PORT as an environment\n+#              variable.  The spawned child process will retrieve the port\n+#              number from the environment and create a client side socket.\n+#\n+# Arguments:\n+#    port  - Optional.  The port number to use.  Defaults to -1 if not given.\n+#    retry - Optional.  Increase the port number by 1 until a port is available\n+#                       and server socket is created when this argument is true.\n+#                       Otherwise give up if the port is not available.\n+# Returns:\n+#    port  - The port number of server socket.\n+#\n+###############################################################################\n+proc createServerSocket {{port -1} {retry true}} \\\n+{\n+    global env socketArray\n+\n+    debugMsg \"enter createServerSocket\"\n+\n+    if {$port == -1} {\n+        set port [generatePort]\n+    }\n+\n+    while {[catch {socket -server serverSocketAccept $port} socketArray(serverSocket)] == 1} {\n+        if {$retry == \"true\"} {\n+            incr port\n+            debugMsg \"port=$port\"\n+        } else {\n+            set port -1\n+            break\n+        }\n+    }\n+\n+    debugMsg \"exit  createServerSocket $port\"\n+    return $port\n+}\n+\n+\n+###############################################################################\n+# Procedure: closeSocket\n+#\n+# Description: Close either the given socket, or if none given, close the \n+#              global new socket\n+#\n+# Arguments:\n+#    socket - Optional.  The socket to close\n+###############################################################################\n+proc closeSocket {socket} \\\n+{\n+    global socketArray\n+\n+    debugMsg \"enter closeSocket $socket\"\n+\n+    if {$socket != -1} {\n+        # Close the given socket\n+        catch {close $socket}\n+\n+        foreach name [array name socketArray] {\n+            if {$socketArray($name) == $socket} {\n+                catch {unset socketArray($name)}\n+                break\n+            }\n+        }\n+    }\n+\n+    debugMsg \"exit  closeSocket\"\n+}\n+\n+\n+###############################################################################\n+# Procedure: closeServerSocket\n+#\n+# Description: Close the global main socket\n+###############################################################################\n+proc closeServerSocket {} \\\n+{\n+    global socketArray\n+\n+    debugMsg \"enter closeServerSocket\"\n+\n+    if {[info exists socketArray(serverSocket)]} {\n+        catch {close $socketArray(serverSocket)}\n+        catch {unset socketArray(serverSocket)}\n+    }\n+\n+    debugMsg \"exit  closeServerSocket\"\n+}\n+\n+###############################################################################\n+# Procedure: isTestCommandSocket\n+#\n+# Description: Determine if the given socket is the same as the test command socket\n+#\n+# Arguments:\n+#    socket - the socket to check\n+#\n+# Returns 1 when it is the same socket, and 0 when it is not the same.\n+###############################################################################\n+proc isTestCommandSocket {socket} \\\n+{\n+    global socketArray\n+\n+    debugMsg \"enter isTestCommandSocket $socket\"\n+\n+    set retCode 0\n+\n+    if [info exists socketArray(testCommandSocket)] {\n+        if {$socket == $socketArray(testCommandSocket)} {\n+            set retCode 1\n+        }\n+    }\n+\n+    debugMsg \"exit  isTestCommandSocket $retCode\"\n+    return $retCode\n+}\n+\n+###############################################################################\n+# Procedure: isLogSocket\n+#\n+# Description: Determine if the given socket is the same as the log socket\n+#\n+# Arguments:\n+#    socket - the socket to check\n+#\n+# Returns 1 when it is the same socket, and 0 when it is not the same.\n+###############################################################################\n+proc isLogSocket {socket} \\\n+{\n+    global socketArray\n+\n+    debugMsg \"enter isLogSocket $socket\"\n+\n+    set retCode 0\n+\n+    if [info exists socketArray(logSocket)] {\n+        if {$socket == $socketArray(logSocket)} {\n+            set retCode 1\n+        }\n+    }\n+\n+    debugMsg \"exit  isLogSocket $retCode\"\n+    return $retCode\n+}\n+\n+###############################################################################\n+# Procedure: isCommandSocket\n+#\n+# Description: Determine if the given socket is the same as the command socket\n+#\n+# Arguments:\n+#    socket - the socket to check\n+#\n+# Returns 1 when it is the same socket, and 0 when it is not the same.\n+###############################################################################\n+proc isCommandSocket {socket} \\\n+{\n+    global socketArray\n+\n+    debugMsg \"enter isCommandSocket $socket\"\n+\n+    set retCode 0\n+\n+    if [info exists socketArray(commandSocket)] {\n+        if {$socket == $socketArray(commandSocket)} {\n+            set retCode 1\n+        }\n+    }\n+\n+    debugMsg \"exit  isCommandSocket $retCode\"\n+    return $retCode\n+}\n+\n+###############################################################################\n+# Procedure: isDataSocket\n+#\n+# Description: Determine if the given socket is the same as the data socket\n+#\n+# Arguments:\n+#    socket - the socket to check\n+#\n+# Returns 1 when it is the same socket, and 0 when it is not the same.\n+###############################################################################\n+proc isDataSocket {socket} \\\n+{\n+    global socketArray\n+\n+    debugMsg \"enter isDataSocket $socket\"\n+\n+    set retCode 0\n+\n+    if [info exists socketArray(dataSocket)] {\n+        if {$socket == $socketArray(dataSocket)} {\n+            set retCode 1\n+        }\n+    }\n+\n+    debugMsg \"exit  isDataSocket $retCode\"\n+    return $retCode\n+}\n+\n+###############################################################################\n+# Procedure: createClientSocket\n+#\n+# Description: Create a client socket for the given port name.\n+#\n+# Arguments:\n+#    port - Optional.  The port number to use for the socket being created.\n+#\n+# Returns the name of the socket created\n+###############################################################################\n+proc createClientSocket {{port -1}} \\\n+{\n+    global ixgClientSocket\n+\n+    debugMsg \"enter createClientSocket\"\n+\n+    set socket [createClientSocketCreate localhost $port]\n+\n+    if {$socket != -1} {\n+        fconfigure $socket -buffering line\n+        fileevent $socket readable [list readClientSocket $socket]\n+        #puts $socket \"this is test command socket\"\n+    }\n+\n+    set ixgClientSocket $socket\n+\n+    update idletask\n+\n+    debugMsg \"exit  createClientSocket $socket\"\n+    return $socket\n+}\n+\n+\n+###############################################################################\n+# Procedure: closeClientSocket\n+#\n+# Description: Close the given socket.  If no socket given, close the global\n+#              ixgClientSocket\n+#\n+# Arguments:\n+#    socket - the name of the socket to close\n+###############################################################################\n+proc closeClientSocket {{socket -1}} \\\n+{\n+    global ixgClientSocket\n+\n+    if {$socket != -1} {\n+        catch {close $socket}\n+    } else {\n+        catch {close $ixgClientSocket}\n+    }\n+}\n+\n+\n+###############################################################################\n+# Procedure: closeAllSockets\n+#\n+# Description: Close the two global sockets\n+###############################################################################\n+proc closeAllSockets {} \\\n+{\n+    global socketArray\n+\n+    foreach name [array name socketArray] {\n+        closeSocket $socketArray($name)\n+    }\n+}\n+\n+\n+###############################################################################\n+# Procedure: readClientSocket\n+#\n+# Description: Read the data from the given socket\n+#\n+# Arguments:\n+#    socket - the socket to get the data from\n+###############################################################################\n+proc readClientSocket {socket} \\\n+{\n+    if {[eof $socket] || [catch {gets $socket line}]} {\n+        debugMsg \"readClientSocket: child eof line\"\n+        close $socket\n+    } else {\n+        debugMsg \"readClientSocket: $line\"\n+        handleCommand $line\n+    }\n+}\n+\n+\n+###############################################################################\n+# Procedure: createClientSocketCreate\n+#\n+# Description: Create a client socket given a hostname and port id.\n+#\n+# Arguments:\n+#    host - the hostname to use\n+#    port - the port number to use\n+#\n+# Returns the name of the socket created\n+###############################################################################\n+proc createClientSocketCreate {host port} \\\n+{\n+    global env\n+\n+    if {$port == -1} {\n+        if {[info exists env(SCRIPTMATE_PORT)]} {\n+            set port $env(SCRIPTMATE_PORT)\n+        } else {\n+            debugMsg \"Could not find env(SCRIPTMATE_PORT), failed creating socket.\"\n+            return -1\n+        }\n+    }\n+\n+    set socketName [socket $host $port]\n+    fconfigure $socketName -blocking  0\n+    fconfigure $socketName -buffering line\n+    return $socketName\n+}\n+\n+\n+###############################################################################\n+# Procedure: putsServer\n+#\n+# Description:\n+#\n+# Arguments:\n+#    line - the character stream that is being sent to the server side.\n+#\n+# Returns 0 on success and 1 on failure\n+###############################################################################\n+proc putsServer {line} \\\n+{\n+    global ixgClientSocket\n+\n+    set retCode 0\n+\n+    if {([info exists ixgClientSocket] == 0) || ($ixgClientSocket == -1)} {\n+        set retCode 1\n+        debugMsg \"in putsServer, ixgClientSocket is bad\"\n+\n+    } else {\n+        debugMsg \"in putsServer before line=$line is sent to server\"\n+        if {[catch {puts $ixgClientSocket $line} retCode]} {\n+\n+            # Stop the shell if the child socket is closed\n+            exit\n+        }\n+        catch {flush $ixgClientSocket}\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+###############################################################################\n+# Procedure: handleCommand\n+#\n+# Description: Handle the command sent to the client\n+#\n+# Arguments:\n+#    line - the character stream to handle\n+###############################################################################\n+proc handleCommand {line} \\\n+{\n+    putsServer \"client response: $line newline\"\n+\n+    if {$line == \"stopTest\"} {\n+        stopTest\n+\n+    } elseif { $line == \"closeSession\" || $line == \"stopTestNow\" } {\n+        # kill current tcl shell\n+        closeAllSockets\n+        exit\n+\n+    } elseif {[regexp {progressDialog} $line] == 1} {\n+\n+        set msg [lindex [split $line :] 1]\n+        setMsgWinMessage $msg\n+\n+    } elseif {$line == \"createInterpreter\"} {\n+\n+        # Do nothing\n+\n+    } elseif {[regexp {source\\ ?} $line]} {\n+\n+        regsub {source\\ ?} $line \"\" filename\n+\n+        if { [catch { eval \"source \\\"$filename\\\"\" } retCode] } {\n+\n+            logMsg $retCode\n+\n+        } else {\n+\n+            if { $retCode == 0 } {\n+                logMsg \"runningStatus:currentTestFinished\"\n+            } else {\n+                logMsg \"runningStatus:currentTestFailed\"\n+            }\n+        }\n+\n+        logOff\n+\n+    } elseif {$line == \"stopSF08Test\"} {\n+\n+        setStopTestFlag 1\n+        logOff\n+\n+    } elseif { [regexp {connectToTclServer} $line] } {\n+        set serverName [lindex $line 1]\n+        tclServer::connectToTclServer $serverName errMsg\n+\n+    } \n+\n+    debugMsg \"handleCommand:Exit\"\n+\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/statistics.tcl b/dep/tclclient/ixTcl1.0/Generic/statistics.tcl\nnew file mode 100644\nindex 00000000..c10a23d6\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/statistics.tcl\n@@ -0,0 +1,1222 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: statistics.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t12-30-1998\tDS\n+#\n+# Description: \n+#\tThis file contains common procs used to access/calculate statistics\n+#\n+########################################################################\n+\n+\n+########################################################################\n+# Procedure: checkTransmitDone\n+#\n+# This command polls the TX rate counters & returns the number of frames\n+# transmitted\n+#\n+# Argument(s):\n+#\tchassis\t\tchassis ID\n+#\tlm\t\t\tLoad Module number\n+#\tport\t\tport number\n+#\n+########################################################################\n+proc checkTransmitDone {chassis lm port} \\\n+{\n+    set retCode     $::TCL_OK\n+\tset numTxFrames\t0\n+\n+    while {[stat getTransmitState $chassis $lm $port] && ($::ixStopTest != 1)} {\n+        after 250\n+    }\n+ \n+    # just a wait to make sure stats are all updated...\n+    after 400\n+\t\n+\tset txList [list [list $chassis $lm $port]]\n+\trequestStats txList\n+\n+\tif [statList get $chassis $lm $port] {\n+\t\terrorMsg \"Error getting statList for [getPortId $chassis $lm $port].\"\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+    if { !$retCode } {\n+\t\t# we only need this cause this proc returns num frames sent...\n+\t\tif [catch {statList cget -scheduledFramesSent} numTxFrames ] {\n+\t\t\tif [catch {statList cget -framesSent} numTxFrames ] {\n+\t\t\t\tset numTxFrames 0\n+\t\t\t} else {\n+\t\t\t\tset numTxFrames [mpexpr $numTxFrames - [statList cget -protocolServerTx]]\n+\t\t\t\tif {[isNegative $numTxFrames]} {\n+\t\t\t\t\t set numTxFrames 0\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\t}\n+    \n+    return $numTxFrames    \n+}\n+\n+\n+########################################################################\n+# Procedure: checkAllTransmitDone\n+#\n+# This command polls the TX rate counters for all ports in the list/map\n+#\n+# Argument(s):\n+#   TxRxArray          - list or map array containing ports\n+#\n+########################################################################\n+proc checkAllTransmitDone {TxRxArray {duration 0}} \\\n+{\n+    upvar $TxRxArray    txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+\tset timeout\t\t[expr $duration + 1]\n+    set currentTime [mpexpr [clock clicks]/1000.]\n+\n+    set txPorts     [getTxPorts txRxArray]\n+\n+\tforeach port $txPorts {\n+\t\tscan $port \"%d %d %d\" c l p\n+\n+\t    while {[stat getTransmitState $c $l $p] == $::statActive && ($::ixStopTest != 1)} {\n+            after 250\n+            if {$duration > 0} {\n+                if {[mpexpr [clock clicks]/1000. - $currentTime] > $timeout} {\n+\t\t\t\t\tset retCode $::TCL_ERROR \n+\t\t\t\t\tbreak                  \n+                }\n+            }\n+\t    }\n+\t\tif { $retCode } {\n+\t\t\tbreak\n+\t\t}\n+    }\n+    \n+    return $retCode   \n+}\n+\n+\n+\n+########################################################################\n+# Procedure: requestStats\n+#\n+# This command request stats from a group of ports \n+#\n+# Argument(s):\n+#   TxRxArray          - list or map array containing ports\n+#\n+########################################################################\n+proc requestStats {TxRxArray} \\\n+{\n+    upvar $TxRxArray    txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+    statGroup setDefault\n+\tforeach port [getAllPorts txRxArray] {\n+\t\tscan $port \"%d %d %d\" c l p\n+        \n+        if [statGroup add $c $l $p] {\n+            errorMsg \"Error adding port [getPortId $c $l $p] to statGroup\"\n+            set retCode $::TCL_ERROR\n+            continue\n+        }\n+\t}\n+\n+    if [statGroup get] {\n+        errorMsg \"Error getting stats for ports in statGroup\"\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: collectTxStats\n+#\n+# This command polls the TX counters \n+#\n+# Argument(s):\n+#   txList          - list of transmit ports\n+#   TxNumFrames     - array containing the number of frames that should have been transmitted\n+#   TxActualFrames  - array containing the actual transmitted stats (returned val)\n+#\n+########################################################################\n+proc collectTxStats {txList TxNumFrames TxActualFrames {TotalTxFrames \"\"} {verbose true} } \\\n+{\n+    upvar $TxNumFrames    txNumFrames\n+    upvar $TxActualFrames txActualFrames\n+\n+    if {[info exists TotalTxFrames]} {\n+        upvar $TotalTxFrames\ttotalTxFrames\n+    }\n+\n+    set retCode\t\t        0\n+    set totalTxFrames\t\t0\n+\n+    if {$verbose == \"true\"} {\n+        logMsg \"Collecting transmit statistics ...\"\n+    }\n+\n+    checkAllTransmitDone txList\n+    requestStats txList\n+\n+    # Loop through all receive ports and find the longest name.  Then the log messages can be formatted well.\n+    # Keep the names in a temporary array for use in the next loop.  This is so unix will not be calling twice\n+    # for the name.\n+    set nameLen 0\n+    foreach txMap $txList {\n+        scan $txMap \"%d %d %d\" tx_c tx_l tx_p\n+        set tempTxArray($tx_c,$tx_l,$tx_p) [getPortId $tx_c $tx_l $tx_p]\n+        set newLen [string length $tempTxArray($tx_c,$tx_l,$tx_p)]\n+        if {$newLen > $nameLen} {\n+            set nameLen $newLen\n+        }\n+    }\n+\n+    foreach txMap $txList {\n+        scan $txMap\t\"%d %d %d\" tx_c tx_l tx_p\n+\n+        if [statList get $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error getting stats for [getPortId $tx_c $tx_l $tx_p].\"\n+            set txActualFrames($tx_c,$tx_l,$tx_p)   0\n+            continue\n+        }\n+\n+        # there's a new stat for the txs-family so that we don't have to subtract out the protocol stats, yea!!\n+        if [catch {statList cget -scheduledFramesSent} numTxFrames] {\n+            # if this port doesn't support nifty new stat, then just use config'd value\n+            set numTxFrames $txNumFrames($tx_c,$tx_l,$tx_p)\n+\n+            # only make use of the protocolServerTx stats if the user aborted the test whilst transmitting\n+            if {$::ixStopTest} {\n+                if [catch {statList cget -framesSent} numTxFrames ] {\n+                    set numTxFrames  0\n+                }\n+                if [catch {statList cget -protocolServerTx} numProtocolServerFrames ] {\n+                    set numProtocolServerFrames  0\n+                }\n+                set numTxFrames [mpexpr ($numTxFrames - $numProtocolServerFrames ) ]\n+                # Since 32 bit counter (mpexpr) is used here, if we get a 32 bit long number (in binary) whose most significiant\n+                # bit is 1, it will be recognized as a negtive number. \n+                # So we use regexp to determine wheather numTxFrames is a negative number instead of using \"$numTxFrames < 0\"\n+                if { [regexp {^-[0-9]+$} $numTxFrames] } {\n+                    set numTxFrames 0\n+                }\n+            }\n+        }\n+        set txActualFrames($tx_c,$tx_l,$tx_p) $numTxFrames\n+\n+        if {$txActualFrames($tx_c,$tx_l,$tx_p) < $txNumFrames($tx_c,$tx_l,$tx_p)} {\n+            if {$verbose == \"true\"} {\n+                logMsg \"All $txNumFrames($tx_c,$tx_l,$tx_p) frames not transmitted on [getPortId $tx_c $tx_l $tx_p] - check the device\"\n+            }\n+            set retCode $::TCL_ERROR\n+        } elseif {$txActualFrames($tx_c,$tx_l,$tx_p) > $txNumFrames($tx_c,$tx_l,$tx_p)} {\n+            if {$verbose == \"true\"} {\n+                logMsg \"Transmitted more frames than expected on [getPortId $tx_c $tx_l $tx_p]\"\n+            }\n+        }\n+\n+        if {$verbose == \"true\"} {\n+            logMsg [format \"%-${nameLen}s:  Total frames transmitted: $txActualFrames($tx_c,$tx_l,$tx_p)\" $tempTxArray($tx_c,$tx_l,$tx_p)]\n+        }\n+\n+        mpincr totalTxFrames $txActualFrames($tx_c,$tx_l,$tx_p)\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: collectRxStats\n+#\n+# This command polls the RX counters \n+#\n+# Argument(s):\n+#   rxList          - list of receive ports\n+#   RxNumFrames     - array containing the returned rx stats\n+#   TotalRxFrames   - total received frames\n+#   printError      - if no frames received, print error message\n+#\n+########################################################################\n+proc collectRxStats {rxList RxNumFrames {TotalRxFrames \"\"} {printError yes} {receiveCounter userDefinedStat2}} \\\n+{\n+    upvar $RxNumFrames\t\trxNumFrames\n+    if {[info exists TotalRxFrames]} {\n+        upvar $TotalRxFrames\ttotalRxFrames\n+    }\n+\n+    set retCode\t\t\t\t0\n+    set totalRxFrames\t\t0\n+\n+    logMsg \"Collecting receive statistics ...\"\n+\n+    set retCode [requestStats rxList]\n+\n+    # Loop through all receive ports and find the longest name.  Then the log messages can be formatted well.\n+    set nameLen 0\n+    foreach rxMap [lnumsort $rxList] {\n+        scan $rxMap \"%d %d %d\" rx_c rx_l rx_p\n+        set tempRxArray($rx_c,$rx_l,$rx_p) [getPortId $rx_c $rx_l $rx_p]\n+        set newLen [string length $tempRxArray($rx_c,$rx_l,$rx_p)]\n+        if {$newLen > $nameLen} {\n+            set nameLen $newLen\n+        }\n+    }\n+\n+    foreach rxMap [lnumsort $rxList] {\n+        scan $rxMap\t\"%d %d %d\" rx_c rx_l rx_p\n+\n+        # count the Rx Frames\n+        if [statList get $rx_c $rx_l $rx_p] {\n+            errorMsg \"Error getting Rx statistics for [getPortId $rx_c $rx_l $rx_p]\"\n+        }\n+\n+        if [catch {statList cget -$receiveCounter} rxNumFrames($rx_c,$rx_l,$rx_p)] {\n+            errorMsg \"$receiveCounter is not a valid counter for port [getPortId $rx_c $rx_l $rx_p]\"\n+            set rxNumFrames($rx_c,$rx_l,$rx_p)  0\n+        }\n+\n+        # if no frames received, there must be a connection error... dump out\n+        if {$rxNumFrames($rx_c,$rx_l,$rx_p) == 0} {\n+            if {$printError == \"yes\"} {\n+                logMsg \"\\n\\n\\tError !!\"\n+                logMsg \"\\tZero packets received on port [getPortId $rx_c $rx_l $rx_p]\"    \n+                logMsg \"\\tCheck the connections.\" \n+            }\n+            set retCode 1\n+        }\n+\n+        logMsg [format \"%-${nameLen}s:  Total frames received   : $rxNumFrames($rx_c,$rx_l,$rx_p)\" \\\n+                $tempRxArray($rx_c,$rx_l,$rx_p)]\n+\n+        mpincr totalRxFrames $rxNumFrames($rx_c,$rx_l,$rx_p)\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: collectVlanStats\n+#\n+# This command polls the Vlan counters \n+#\n+# Argument(s):\n+#   vlanList          - list of receive ports\n+#   VlanNumFrames     - array containing the returned Vlan stats\n+#   TotalVlanFrames   - total received frames\n+#\n+########################################################################\n+proc collectVlanStats {vlanList VlanNumFrames {TotalVlanFrames \"\"}} \\\n+{\n+    upvar $VlanNumFrames\t\tvlanNumFrames\n+\tif {[info exists TotalVlanFrames]} {\n+\t\tupvar $TotalVlanFrames\ttotalVlanFrames\n+\t}\n+\n+\tset retCode\t\t\t\t0\n+\tset totalVlanFrames\t\t0\n+\n+\tdebugMsg \"Collecting vlan tagged frame statistics ...\"\n+\n+    set retCode [requestStats vlanList]\n+\n+\tforeach rxMap [lnumsort $vlanList] {\n+\t\tscan $rxMap\t\"%d %d %d\" rx_c rx_l rx_p\n+\n+\t    # count the vlan tagged frames\n+        if [statList get $rx_c $rx_l $rx_p] {\n+\t        errorMsg \"Error getting vlan tagged frame statistics for [getPortId $rx_c $rx_l $rx_p]\"\n+        } else {\n+            if [catch {statList cget -vlanTaggedFramesRx} vlanNumFrames($rx_c,$rx_l,$rx_p)] {\n+                errorMsg \"***** WARNING:Invalid statistic (vlanTaggedFramesRx) for the port:[getPortString $rx_c $rx_l $rx_p]\\n\"\n+                set vlanNumFrames($rx_c,$rx_l,$rx_p) 0\n+                set retCode 1\n+            }\n+\n+            mpincr totalVlanFrames $vlanNumFrames($rx_c,$rx_l,$rx_p)       \n+        }\n+    }\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure: collectDataIntegrityStats\n+#\n+# This command polls the Data Integrity counters \n+#\n+# Argument(s):\n+#   rxPortList      - list of receive ports\n+#   Errors          - array containing the error stats\n+#   RxFrames        - received data integrity frames per rx port\n+#   TotalRxFrames   - total received data integrity frames\n+#\n+########################################################################\n+proc collectDataIntegrityStats {rxPortList Errors RxFrames {TotalRxFrames \"\"} {TotalErrorFrames \"\"}} \\\n+{\n+    upvar $Errors\terrors\n+\tupvar $RxFrames\trxFrames\n+\n+\tif {[string length $TotalRxFrames] != 0 } {\n+\t\tupvar $TotalRxFrames\ttotalRxFrames\n+\t}\n+\n+\tif {[string length $TotalErrorFrames] != 0 } {\n+\t\tupvar $TotalErrorFrames\ttotalErrorFrames\n+\t}\n+\n+\tset retCode\t\t\t\t$::TCL_OK\n+\tset totalRxFrames\t\t0\n+    set totalErrorFrames    0\n+\n+\tlogMsg \"Collecting data integrity statistics ...\"\n+    \n+    set retCode [requestStats rxPortList]\n+\n+\tforeach rxMap $rxPortList {\n+\t\tscan $rxMap\t\"%d %d %d\" rx_c rx_l rx_p\n+\n+\t    # count the data integrity frames\n+        if [statList get $rx_c $rx_l $rx_p] {\n+\t        errorMsg \"Error getting data integrity frame statistics for [getPortId $rx_c $rx_l $rx_p]\"\n+        } else {\n+\n+            if {[catch {statList cget -dataIntegrityFrames} rxFrames($rx_c,$rx_l,$rx_p)]} {\n+                errorMsg \"***** WARNING:Invalid statistic (dataIntegrityFrames) for the port:[getPortString $rx_c $rx_l $rx_p]\\n\"\n+                set rxFrames($rx_c,$rx_l,$rx_p) 0\n+                set retCode $::TCL_ERROR\n+            }\n+            mpincr totalRxFrames $rxFrames($rx_c,$rx_l,$rx_p)       \n+\n+            if {[catch {statList cget -dataIntegrityErrors} errors($rx_c,$rx_l,$rx_p)]} {\n+                errorMsg \"***** WARNING:Invalid statistic (dataIntegrityErrors) for the port:[getPortString $rx_c $rx_l $rx_p]\\n\"\n+                set errors($rx_c,$rx_l,$rx_p) 0\n+                set retCode $::TCL_ERROR\n+            }\n+            mpincr totalErrorFrames $errors($rx_c,$rx_l,$rx_p)            \n+        }\n+    }\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure: collectSequenceStats\n+#\n+# This command polls the Sequence counters \n+#\n+# Argument(s):\n+#   rxPortList      - list of receive ports\n+#   Errors          - array containing the error stats\n+#   RxFrames        - received sequence frames per rx port\n+#   TotalRxFrames   - total received sequence frames\n+#\n+########################################################################\n+proc collectSequenceStats {rxPortList Errors RxFrames {TotalRxFrames \"\"} {TotalErrorFrames \"\"}} \\\n+{\n+    upvar $Errors\terrors\n+\tupvar $RxFrames\trxFrames\n+\n+\tif {[info exists TotalRxFrames]} {\n+\t\tupvar $TotalRxFrames\ttotalRxFrames\n+\t}\n+\n+\tif {[info exists TotalErrorFrames]} {\n+\t\tupvar $TotalErrorFrames\ttotalErrorFrames\n+\t}\n+\n+\tset retCode\t\t\t\t$::TCL_OK\n+\tset totalRxFrames\t\t0\n+    set totalErrorFrames    0\n+\n+\tlogMsg \"Collecting sequence statistics ...\"\n+    \n+    set retCode [requestStats rxPortList]\n+\n+\tforeach rxMap $rxPortList {\n+\t\tscan $rxMap\t\"%d %d %d\" rx_c rx_l rx_p\n+\n+\t    # count the data integrity frames\n+        if [statList get $rx_c $rx_l $rx_p] {\n+\t        errorMsg \"Error getting data integrity frame statistics for [getPortId $rx_c $rx_l $rx_p]\"\n+        } else {\n+\n+            if {[catch {statList cget -sequenceFrames} rxFrames($rx_c,$rx_l,$rx_p)]} {\n+                errorMsg \"***** WARNING:Invalid statistic (dataIntegrityFrames) for the port:[getPortString $rx_c $rx_l $rx_p]\\n\"\n+                set rxFrames($rx_c,$rx_l,$rx_p) 0\n+                set retCode $::TCL_ERROR\n+            }\n+            mpincr totalRxFrames $rxFrames($rx_c,$rx_l,$rx_p)       \n+\n+            if {[catch {statList cget -sequenceErrors} errors($rx_c,$rx_l,$rx_p)]} {\n+                errorMsg \"***** WARNING:Invalid statistic (dataIntegrityErrors) for the port:[getPortString $rx_c $rx_l $rx_p]\\n\"\n+                set errors($rx_c,$rx_l,$rx_p) 0\n+                set retCode $::TCL_ERROR\n+            }\n+            mpincr totalErrorFrames $errors($rx_c,$rx_l,$rx_p)       \n+        }\n+    }\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure: collectErroredFramesStats\n+#\n+# This command collects the counters for the errored frames received \n+# \n+# Argument(s):\n+# rxPortList            - receive port list\n+# ErrorredFrames        - array containing the number of errored frames per rx port\n+# errorList\t\t        - list that contains errors, example {oversize undersize}\n+#\n+# NOTE: This proc is used by custom code, don't remove it\n+#\n+########################################################################\n+proc collectErroredFramesStats {rxPortList ErrorredFrames errorList} \\\n+{\n+    upvar $ErrorredFrames\terrorredFrames\n+\n+    set retCode     0   \n+    set retCode     [requestStats rxPortList]\n+            \n+\tforeach rxMap $rxPortList {\n+\t\tscan $rxMap\t\"%d %d %d\" rx_c rx_l rx_p\n+\n+        if [statList get $rx_c $rx_l $rx_p] {\n+\t        errorMsg \"Error getting statList for [getPortId $rx_c $rx_l $rx_p]\"\n+        } else {\n+            foreach errType $errorList {\n+                if [catch {statList cget -$errType} statValue] {\n+                    logMsg \"\\n\\n***** WARNING: Invalid statistic ($errType) for the port:[getPortString $rx_c $rx_l $rx_p] \\n\"\n+                    set errorredFrames($errType,$rx_c,$rx_l,$rx_p)    \"N/A\"\n+                } else {       \n+                    set errorredFrames($errType,$rx_c,$rx_l,$rx_p)    [statList cget -$errType]\n+                }\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+########################################################################\n+# Procedure: collectQosStats\n+#\n+# This command polls the QoS counters \n+#\n+# Argument(s):\n+#   rxList          - list of receive ports\n+#   RxQosNumFrames  - array containing the returned rx stats per priority\n+#   TotalQosFrames  - array containing the total Qos frames, per priority\n+#   TotalRxFrames   - total received frames\n+#   printError      - if no frames received, print error message\n+#\n+########################################################################\n+proc collectQosStats {rxList RxQosNumFrames {TotalQosFrames \"\"} {TotalRxFrames \"\"} {printError yes}} \\\n+{\n+    upvar $RxQosNumFrames\t\trxQosNumFrames\n+\n+    if [info exists TotalQosFrames] {\n+        upvar $TotalQosFrames   totalQosFrames\n+    }\n+\n+\tif [info exists TotalRxFrames] {\n+\t\tupvar $TotalRxFrames\ttotalRxFrames\n+\t}\n+\n+\tset retCode 0\n+\n+    set numPriorities 8\n+\n+    # init the totals first\n+    for {set i 0} {$i < $numPriorities} {incr i} {\n+        set totalQosFrames($i)  0\n+    }\n+\n+    set retCode [requestStats rxList]\n+\n+\tset totalRxFrames    0\n+\n+    # look at each qost stat\n+\tforeach rxMap $rxList {\n+\t\tscan $rxMap\t\"%d %d %d\" rx_c rx_l rx_p\n+\n+        if [statList get $rx_c $rx_l $rx_p] {\n+\t\t\terrorMsg \"Error getting Rx statistics for [getPortId $rx_c $rx_l $rx_p]\"\n+\t\t\tset retCode 1\n+\t\t}\n+\n+        set totalRx($rx_c,$rx_l,$rx_p)  0\n+\n+        for {set priority 0} {$priority < $numPriorities} {incr priority} {\n+\t\t    if [catch {statList cget -qualityOfService$priority} rxQosNumFrames($priority,$rx_c,$rx_l,$rx_p)] {\n+                errorMsg \"***** WARNING:Invalid statistic (qualityOfService$priority) for the port:[getPortString $rx_c $rx_l $rx_p]\\n\"\n+                set rxQosNumFrames($priority,$rx_c,$rx_l,$rx_p) 0\n+                set retCode 1\n+            }\n+            mpincr totalQosFrames($priority)  $rxQosNumFrames($priority,$rx_c,$rx_l,$rx_p)\n+            mpincr totalRxFrames              $rxQosNumFrames($priority,$rx_c,$rx_l,$rx_p)\n+            mpincr totalRx($rx_c,$rx_l,$rx_p) $rxQosNumFrames($priority,$rx_c,$rx_l,$rx_p)\n+ \n+        }\n+\n+\t\tif {$totalRx($rx_c,$rx_l,$rx_p) == 0 && $printError == \"yes\"} {\n+\t\t\tlogMsg \"\\n\\n\\tError !!\"\n+\t\t\tlogMsg \"\\tZero packets received on port [getPortId $rx_c $rx_l $rx_p]\"    \n+\t\t\tlogMsg \"\\tCheck the connections.\" \n+\t\t}\n+\n+\t    logMsg \"[getPortId $rx_c $rx_l $rx_p]:\tTotal frames received: $totalRx($rx_c,$rx_l,$rx_p)\"\n+\t}\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: collectStats\n+#\n+# This command polls the RX counters for the specified stat\n+#\n+# Argument(s):\n+#   rxList          - list of receive ports\n+#   statNameList    - list name of stats to poll, return total (need cget name)\n+#   RxNumFrames     - array containing the returned rx stats\n+#   TotalRxFrames   - total received frames\n+#\n+########################################################################\n+proc collectStats {rxList statNameList RxNumFrames {TotalRxFrames \"\"} {verbose verbose} } \\\n+{\n+    upvar $RxNumFrames\t\trxNumFrames\n+\tif {[info exists TotalRxFrames]} {\n+\t\tupvar $TotalRxFrames\ttotalRxFrames\n+\t}\n+\n+\tset retCode\t\t\t\t0\n+\tset totalRxFrames\t\t0\n+\n+    logMsg \"Collecting [join $statNameList] statistics ...\"\n+    set retCode [requestStats rxList]\n+\n+\tforeach rxMap [lnumsort $rxList] {\n+\t\tscan $rxMap\t\"%d %d %d\" rx_c rx_l rx_p\n+\n+\t\t# count the Rx Frames\n+\t\tif [statList get $rx_c $rx_l $rx_p] {\n+\t\t\terrorMsg \"Error getting Rx statistics for [getPortId $rx_c $rx_l $rx_p]\"\n+            set retCode 1\n+\t\t} else {\n+            set rxNumFrames($rx_c,$rx_l,$rx_p)  0\n+            foreach statName $statNameList {\n+\t            # make sure we're using the proper stat name!!\n+                if {[string first stat $statName] == 0} {\n+                    set statName     [string trimleft $statName stat]\n+                    set firstChar    [string tolower [string index $statName 0]]\n+                    append firstChar [string range $statName 1 end]\n+                    set statName     $firstChar\n+                }\n+\n+ \t\t        if [catch {statList cget -$statName} value] {\n+                    if {$verbose == \"verbose\"} {\n+                        errorMsg \"***** WARNING:Invalid statistic ($statName) for the port:[getPortString $rx_c $rx_l $rx_p]\\n\"\n+                    }\n+\t\t            set value   0\n+                    set retCode 1\n+                }\n+                 \n+                mpincr rxNumFrames($rx_c,$rx_l,$rx_p) $value\n+            }\n+\t\t    mpincr totalRxFrames $rxNumFrames($rx_c,$rx_l,$rx_p)\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: getNumErroredFrames\n+#\n+# This command gets the counter that contains the number of errored frames \n+# received\n+#\n+# Argument(s):\n+#\tchassis\t\tchassis ID\n+#\tlm\t\t\tLoad Module number\n+#\tport\t\tport number\n+#\terror\t\tallErrors OR {oversize|undersize|alignment|dribble|badCRC}\n+#\n+########################################################################\n+proc getNumErroredFrames {chassis lm port {error allErrors}} \\\n+{ \n+    set numRxFrames     0\n+\n+    set errList         {fragments undersize oversize fcsErrors symbolErrors \\\n+                         alignmentErrors dribbleErrors collisions lateCollisions \\\n+                         collisionFrames excessiveCollisionFrames oversizeAndCrcErrors \\\n+                         symbolErrorFrames synchErrorFrames} \n+ \n+    if [stat get statAllStats $chassis $lm $port] {\n+        errorMsg \"Error getting statistics for $chassis,$lm,$port\"\n+    } else {\n+        if {$error != \"allErrors\"} {\n+            set errList $error\n+        }\n+        foreach error $errList {\n+            if [catch {stat cget -$error} msg]  {\n+               errorMsg $msg\n+            } else {\n+                catch {mpincr numRxFrames [stat cget -$error]}\n+            }\n+        }\n+    }\n+ \n+    return $numRxFrames\n+}\n+\n+\n+########################################################################\n+# Procedure: checkLinkState\n+#\n+# This command checks the link state of all ports in parallel and labels\n+# the ones that are down. Then it polls the links that are down for two\n+# seconds and returns 1 if any port is still down and a 0 if all ports are\n+# up.\n+#\n+# Arguments(s):\n+#\tPortArray\t\tarray or list of ports, ie, ixgSortMap\n+#   PortsToRemove\tlist containing the ports to be removed\n+#\n+########################################################################\n+proc checkLinkState {PortArray {PortsToRemove \"\"} {message messageOn}} \\\n+{\n+\tupvar $PortArray portArray\n+    upvar $PortsToRemove portsToRemove\n+\n+    set retCode $::TCL_OK\n+\n+\tif {$message == \"messageOn\"} {\n+        set logger  \"logMsg\"\n+    } else {\n+        set logger  \"debugMsg\"\n+    }\n+\n+    eval $logger \"Checking link states on ports ...\"\n+   \n+    after 1000  ;# give the port some time to begin it's in autonegotiate mode or PPP\n+    \n+    set portList    [getAllPorts portArray]\n+\tset validLinkUpStates [list $::linkUp $::pppUp $::linkLoopback $::forcedLinkUp]\n+    \n+\t# go through all the ports and label the ones whose links are down\n+\tforeach portMap $portList {\n+\t\tscan $portMap \"%d %d %d\" tx_c tx_l tx_p\n+        debugMsg \"checking link state on [getPortId $tx_c $tx_l $tx_p]\"\n+\n+\t\tif {[lsearch $validLinkUpStates [stat getLinkState $tx_c $tx_l $tx_p]] < 0} {\n+\t\t\tset linkState($tx_c,$tx_l,$tx_p)\t1\n+\t\t\tdebugMsg \"Link on Tx port [getPortId $tx_c $tx_l $tx_p] is down.\"\n+\t\t}\n+\t}\n+\n+\t# the linkState array are all the ports whose links are down. Now poll\n+\t# them a few times until they are all up or return.\n+    set loopCount   [expr [advancedTestParameter cget -linkStateTimeout] * 2] \n+\tfor {set ctr 0} {$ctr < $loopCount} {incr ctr} {\n+\t\tforeach downlink [array names linkState] {\n+\t\t\tscan $downlink \"%d,%d,%d\" c l p\n+\n+\t\t\tif {[lsearch $validLinkUpStates [stat getLinkState $c $l $p]] >= 0} {\n+\t\t\t\tdebugMsg \"Link on port [getPortId $c $l $p] is now up.\"\n+\t\t\t\tunset linkState($c,$l,$p)\n+\t\t\t}\n+\t\t}\n+\t\tif {[llength [array names linkState]] == 0} {\n+\t\t\tbreak\n+\t\t} else {\n+\t\t\tafter 500\n+\t\t}\n+\t}\n+\n+\tset portsToRemove [getTxPorts linkState]\n+\n+\tif {[llength [array names linkState]] == 0} {\n+\t\teval $logger \"Links on all ports are up.\"\n+\t} else {\n+\t\tlogMsg \"Link on these ports are down:\"\n+\t\tforeach downlink [array names linkState] {\n+\t\t\tscan $downlink \"%d,%d,%d\" c l p\n+\t\t\tlogMsg [getPortId $c $l $p]\n+\t\t}\n+        set retCode $::TCL_ERROR      \n+\t}\n+\n+    after [advancedTestParameter cget -dutDelay]\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: checkPPPState\n+#\n+# This command checks the PPP state of all PoS ports in parallel and labels\n+# the ones that are down. Then it polls the links that are down for two\n+# seconds and returns 1 if any port is still down and a 0 if all ports are\n+# up.\n+#\n+# Arguments(s):\n+#\tPortArray\tarray or list of ports, ie, ixgSortMap\n+#\n+########################################################################\n+proc checkPPPState {PortArray {message messageOn}} \\\n+{\n+\tupvar $PortArray portArray\n+\n+    set retCode $::TCL_OK\n+\n+\tif {$message == \"messageOn\"} {\n+        set logger  \"logMsg\"\n+    } else {\n+        set logger  \"debugMsg\"\n+    }\n+\n+    eval $logger \"Checking PPP states on ports ...\"\n+ \n+    after 1000  ;# give the port some time to begin it's in autonegotiate mode or PPP\n+\n+    set portList    [getAllPorts portArray]\n+\tset validLinkUpStates [list $::pppUp ]\n+    \n+\t# go through all the ports and label the ones whose links are down\n+\tforeach portMap $portList {\n+\t\tscan $portMap \"%d %d %d\" c l p\n+\n+        if [IsPOSPort $c $l $p] {\n+            debugMsg \"checking link state on [getPortId $c $l $p]\"\n+\n+\t\t\tif {[lsearch $validLinkUpStates [stat getLinkState $c $l $p]] < 0} {\n+\t\t\t\tset linkState($c,$l,$p)\t[stat getLinkState $c $l $p]\n+\t\t\t\tdebugMsg \"Link on Tx port [getPortId $c $l $p] is down\"\n+\t\t\t}\n+        }\n+\t}\n+\n+\t# the linkState array are all the ports whose links are down. Now poll\n+\t# them a few times until they are all up or return.\n+    set loopCount   [expr [advancedTestParameter cget -linkStateTimeout] * 4] \n+\tfor {set ctr 0} {$ctr < $loopCount} {incr ctr} {\n+\t\tforeach downlink [array names linkState] {\n+\t\t\tscan $downlink \"%d,%d,%d\" c l p\n+            set state   [stat getLinkState $c $l $p]\n+\n+            # if the state has transitioned to something else, print it & check it...\n+            if {$state != $linkState($c,$l,$p)} {\n+\t\t        if {$state == $::pppUp} {\n+\t\t\t\t    debugMsg \"Link on port [getPortId $c $l $p] is now up.\"\n+\t\t\t\t    unset linkState($c,$l,$p)\n+\t\t\t    } else {\n+                    set linkState($c,$l,$p)    $state\n+                }\n+            }\n+\t\t}\n+\t\tif {[llength [array names linkState]] == 0} {\n+\t\t\tbreak\n+\t\t} else {\n+\t\t\tafter 250\n+\t\t}\n+\t}\n+\n+\tif {[llength [array names linkState]] == 0} {\n+\t    if {$message == \"messageOn\"} {\n+\t\t    logMsg \"Links on all ports are up.\"\n+        } else {\n+\t\t    debugMsg \"Links on all ports are up.\"\n+        }\n+\t} else {\n+\t\tlogMsg \"Link on these ports are down:\"\n+\t\tforeach portItem [array names linkState] {\n+\t\t\tlogMsg $portItem\n+\t\t}\n+\t\tset retCode $::TCL_ERROR\n+\t}\n+\n+\treturn $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: getRunningRate\n+#\n+# Description: Gets the running rates of a list of ports\n+#\n+# Argument(s):\n+#   portList    - list of ports or array contains tx and rx ports\n+#   RunningRate - array w/rate values\n+#   sampleNum   - for keeping track of different sample times\n+#\n+########################################################################\n+proc getRunningRate {portList RunningRate args {sampleNum 1}} \\\n+{\n+\tupvar $RunningRate  runningRate\n+\n+    set retCode $::TCL_OK\n+\n+\trequestStats portList\n+\n+    # even if we got an error, go ahead & fill array so we don't crash anyone...\n+\tforeach portMap $portList {\n+\t\tscan $portMap \"%d %d %d\" c l p\n+\n+\t    if [statList getRate $c $l $p] {\n+\t\t    errorMsg \"Error getting rates on port $c,$l,$p\"\n+            set retCode $::TCL_ERROR\n+\t    }\n+\n+        foreach counter [join $args] {\n+\t\t\tset failCount 0\n+\t\t\tset tempCounter $counter\n+\t\t\t\n+\t\t    if [catch {statList cget -$counter} currRate($counter)] {\n+\n+\t\t\t\tswitch $counter {\n+\n+\t\t\t\t\t\"framesReceived\" {\t\t\t\n+\t\t\t\t\t\tset tempCounter atmAal5FramesReceived\n+\t\t\t\t\t\tif [catch {statList cget -atmAal5FramesReceived} currRate($counter)] {\n+\t\t\t\t\t\t\tincr failCount\n+\t\t\t\t\t\t}\n+\t\t\t\t\t}\n+\t\t\t\t\t\"scheduledFramesSent\" { \n+\t\t\t\t\t\tset tempCounter framesSent\n+\t\t\t\t\t\tif [catch {statList cget -framesSent} currRate($counter)] {\n+\t\t\t\t\t\t\tincr failCount\n+\t\t\t\t\t\t}\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\n+\t\t\t\tif { $counter == $tempCounter } {\n+\t\t\t\t\tincr failCount\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\tif { $failCount } {\t\t\t\t\n+\t\t\t\terrorMsg \"$tempCounter is not a valid rate counter\"\n+\t\t\t\tset currRate($counter)  0\n+\t\t    }\n+        }\n+  \n+\t\tif {[llength $args] == 1} {\n+    \t\tset runningRate($c,$l,$p,$sampleNum) $currRate($args)\n+\t\t\tdebugMsg \"TX: runningRate($c,$l,$p,$sampleNum) = $runningRate($c,$l,$p,$sampleNum)\"\n+\t\t} else {\n+\t\t\tforeach counter $args {\n+    \t\t\tset runningRate($c,$l,$p,$counter,$sampleNum) $currRate($counter)\n+\t\t\t\tdebugMsg \"TX: runningRate($c,$l,$p,$counter,$sampleNum) = $runningRate($c,$l,$p,$counter,$sampleNum)\"\n+\t\t\t}\n+\t\t}\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+\n+##################################################################################\n+# Procedure: getRunRatePerSecond\n+#\n+# Description: Collects the rate during transmission at every second.\n+#\n+# Argument(s):\n+#   TxRxArray       - array of ports to transmit, ie. one2oneArray\n+#   TxRateArray     - array containing the running rate for tx ports\n+#   RxRateArray     - array containing the receive rate for rx ports\n+#   duration        - duration of tx\n+#\n+# Note: We need to get rid of this method when we get rid of cable modem suite\n+#\n+##################################################################################\n+proc getRunRatePerSecond {TxRxArray TxRateArray RxRateArray duration} \\\n+{\n+    upvar $TxRxArray    txRxArray\n+    upvar $TxRateArray  txRateArray\n+    upvar $RxRateArray  rxRateArray\n+\n+    set retCode 0\n+    set count   0\n+\n+    set txPortList  [getTxPorts txRxArray]\n+    set rxPortList  [getRxPorts txRxArray]\n+ \n+    if [createDialog \"Transmit Status\"] {\n+        set cmd logMsg\n+    } else {\n+        set cmd writeDialog\n+    }\n+\n+    set currentTime [clock seconds]\n+\n+    for {set timeCtr 1} {$timeCtr <= $duration} {incr timeCtr} {\n+        $cmd  \"Transmitted $timeCtr of $duration seconds\"\n+        mpincr count\t\t\t\t\n+\n+        if [getRunningRate $txPortList txRateArray scheduledFramesSent $count] {\n+            set retCode 1\n+        }\n+        if {$retCode == 0 && [getRunningRate $rxPortList rxRateArray framesReceived $count]} {\n+            set retCode 1\n+        }\n+\n+        while {[expr {[clock seconds] - $currentTime}] < 1} {\n+            update idletasks\n+            after 20\n+        }\n+        set currentTime   [clock seconds]\n+    }\n+    debugMsg \"txRateArray: [array get txRateArray] \"\n+    debugMsg \"rxRateArray: [array get rxRateArray]\"\n+\n+    incr timeCtr -1\n+    if {$duration != $timeCtr} {\n+        logMsg \"******* Test terminated by user after $timeCtr seconds\"\n+    }\n+\n+    logMsg \"Done transmitting for $duration seconds...\\n\"\n+\n+    # destroy the dialog box if it is created\n+    if {$cmd == \"writeDialog\"} {\n+        destroyDialog\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+\n+##################################################################################\n+# Procedure: collectRates\n+#\n+# Description: Collects the rate during transmission at the following points:\n+# 1. Half way during tx\n+# 2. 15% of half duration before the half way point\n+# 3. 15% of half duration after the half way point\n+#\n+# Then get the average of these rates for the QoS counters!!.\n+#\n+# Argument(s):\n+#   AvgRateArray    - array containing the average running rate for tx/rx ports\n+#\tstatNameList\t- name of the stats that rates will be collected\n+#   RxRateArray\t\t- array containing the average rx running rate for the corresponding\n+#\t\t\t\t\t  rateType: rxRate (regular) or qosRate (qos counters)\n+#   duration        - duration of tx\n+#\trateType\t\t- the type of the rate will be collected\n+#\n+##################################################################################\n+proc collectRates { TxRxArray AvgRateArray duration {rateType rxRate} { RxRateArray \"\"} } \\\n+{\n+\tupvar $TxRxArray\t\ttxRxArray\n+\tupvar $AvgRateArray     avgRateArray\n+    upvar $RxRateArray\t\trxRateArray\n+\n+\tset retCode     $::TCL_OK\n+    set sampleCount 0\n+\tset numSamples\t3\n+\tset count       1\n+    set txStartTime [clock seconds]\n+    set runTime\t\t0\n+    set sampleIndex 0\n+    set txPortList  [getTxPorts txRxArray]\n+    set rxPortList  [getRxPorts txRxArray]\n+\n+\tif {$rateType == \"qosRate\" } {\n+\t\tset statNameList\t[list qualityOfService0 qualityOfService1 qualityOfService2 qualityOfService3\t\\\n+\t\t\t\t\t\t\t  qualityOfService4 qualityOfService5 qualityOfService6 qualityOfService7]\n+\t} else {\n+\t\tset statNameList\t[list userDefinedStat2] \n+\n+\t}\n+\n+    # it may take very long time to get all Qos stats, so we want to start earlier...\n+\tset sampleDuration2 [ixMath::max [mpexpr $duration/2]  5]\n+    set sampleDuration1 [mpexpr $sampleDuration2 - round((.15 * $sampleDuration2))]\n+    set sampleDuration3 [mpexpr $sampleDuration2 + round(ceil((.15 * $sampleDuration2)))]\n+\tdebugMsg \"***** sampleDuration2 = $sampleDuration2, sampleDuration1 = $sampleDuration1, sampleDuration3 = $sampleDuration3\"\n+    set sampleTimes [list $sampleDuration1 $sampleDuration2 $sampleDuration3 -1] \n+\n+\tif [createDialog \"Transmit Status\"] {\n+\t\tset cmd logMsg\n+\t} else {\n+\t\tset cmd writeDialog\n+\t}\n+\n+    set nextSample\t[lindex $sampleTimes $sampleIndex]\n+\n+\tset percentToDuration\t0\n+\tset sampleCount\t\t\t0\n+    while {$runTime <= $duration} {\n+        set currentTime [clock seconds]\n+\t\tset percentToDuration\t[mpexpr int(ceil(double($runTime)/$duration*100))]\n+\n+\t\t$cmd  \"Transmitted $percentToDuration% of $duration seconds\"\n+      \n+        if { ($nextSample > 0) && ($runTime >= $nextSample) } {\n+\n+\t\t\tset startSample $runTime\n+\n+\t\t\tif {[getRunningRate $txPortList txRunningRate scheduledFramesSent $count]} {\n+                set retCode $::TCL_ERROR\n+\t\t    }\n+\t\t\t\n+\t\t\tif {[getRunningRate $rxPortList rxRunningRate $statNameList $count]} {\n+\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t}\n+\n+\t\t\tset runTime [expr ([clock seconds] - $txStartTime)]\n+\n+            if {$runTime > $duration } {\n+\t\t\t\tlogMsg \"\\nWARNING!!!: Sampled rate values maybe incorrect. Increase test duration.\"\n+\t\t\t}\n+\n+    \t\tincr count\t\t\t\t\n+ \t\t\tincr sampleIndex\n+            set nextSample [lindex $sampleTimes $sampleIndex]\n+\t\t\tincr sampleCount\n+\t\t}\n+\n+        while {[expr {[clock seconds] - $currentTime}] < 1} {\n+            update idletasks\n+            after 20\n+        }\n+        set runTime [expr ([clock seconds] - $txStartTime)]\n+    }\n+\n+\tif { $sampleCount < $numSamples } {\n+\t\t# We don't want to miss the last transmit status\n+\t\t$cmd  \"Transmitted 100% of $duration seconds\"\n+\t}\n+\n+\tlogMsg \"Done transmitting for $duration seconds...\\n\"\n+\n+    if {$duration > $runTime} {\n+        logMsg \"******* Test terminated by user after $runTime seconds\"\n+    }\n+\n+\n+\t# destroy the dialog box if it is created\n+\tif {$cmd == \"writeDialog\"} {\n+\t\tdestroyDialog\n+\t}\n+\n+\tif {!$retCode } {\n+\n+\t\t# get the average running rate for transmitted frame, received frame & qos rates\n+\t\tforeach txMap $txPortList {\n+\t\t\tscan $txMap\t\"%d %d %d\" tx_c tx_l tx_p\n+\t\t\tset total 0\n+\t\t\tfor {set i 1} {$i <= $sampleCount} {incr i} {\n+\t\t\t\tif {![info exists txRunningRate($tx_c,$tx_l,$tx_p,$i)]} {\n+\t\t\t\t\tlogMsg \"Running rate for [getPortId $tx_c $tx_l $tx_p] sample $i not calculated during transmission\"\n+\t\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t\t} else {\n+\t\t\t\t\tmpincr total  $txRunningRate($tx_c,$tx_l,$tx_p,$i)\n+\t\t\t\t}    \n+\t\t\t}\n+\n+\t\t\tif {$rateType == \"qosRate\" } {\n+\t\t\t\tif [catch {mpexpr $total/$sampleCount} avgRateArray($tx_c,$tx_l,$tx_p)] {\n+\t\t\t\t\tset avgRateArray($tx_c,$tx_l,$tx_p)   0\n+\t\t\t\t}\n+\t\t\t} else {\n+\n+\t\t\t\tif [catch {mpexpr $total/$sampleCount} avgRateArray(TX,$tx_c,$tx_l,$tx_p)] {\n+\t\t\t\t\tset avgRateArray(TX,$tx_c,$tx_l,$tx_p)   0\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tdebugMsg \"avgRateArray:[array get avgRateArray]\"\n+\t\t}\n+\n+\t\tif {$rateType == \"qosRate\" } {\n+\t\t\tforeach rxMap $rxPortList {\n+\t\t\t\tscan $rxMap\t\"%d %d %d\" rx_c rx_l rx_p\n+\n+\t\t\t\tfor {set priority 0} {$priority < 8} {incr priority} {\n+\t\t\t\t\tset total 0\n+    \t\t\t\tfor {set i 1} {$i <= $sampleCount} {incr i} {\n+\t\t\t\t\t\tset counter qualityOfService$priority\n+\t\t\t\t\t\tif {![info exists rxRunningRate($rx_c,$rx_l,$rx_p,$counter,$i)]} {\n+\t\t\t\t\t\t\tlogMsg \"QOS Running rate, priority $priority for [getPortId $rx_c $rx_l $rx_p] sample $i not calculated during transmission.\"\n+\t\t\t\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t\t\t\t} else {\n+\t\t\t\t\t\t\tmpincr total  $rxRunningRate($rx_c,$rx_l,$rx_p,$counter,$i)\n+\t\t\t\t\t\t}\n+\t\t\t\t\t}\n+\t\t\t\t\tif [catch {mpexpr round($total/$sampleCount)} rxRateArray($rx_c,$rx_l,$rx_p,$priority)] {\n+\t\t\t\t\t\trxRateArray($rx_c,$rx_l,$rx_p,$priority)   0\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t\t\t}\n+\t\t} else {\n+\t\t\tforeach rxMap $rxPortList {\n+\t\t\t\tscan $rxMap\t\"%d %d %d\" rx_c rx_l rx_p\n+\t\t\t\tset total 0\n+\t\t\t\tfor {set i 1} {$i <= $sampleCount} {incr i} {\n+\t\t\t\t\tif {![info exists rxRunningRate($rx_c,$rx_l,$rx_p,$i)]} {\n+\t\t\t\t\t\tlogMsg \"Running rate for [getPortId $rx_c $rx_l $rx_p] sample $i not calculated during transmission.\"\n+\t\t\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t\t\t} else {\n+\t\t\t\t\t\tmpincr total  $rxRunningRate($rx_c,$rx_l,$rx_p,$i)\n+\t\t\t\t\t}    \n+\t\t\t\t}\n+\t\t\t\tif [catch {mpexpr $total/$sampleCount} avgRateArray(RX,$rx_c,$rx_l,$rx_p)] {\n+\t\t\t\t\tset avgRateArray(RX,$rx_c,$rx_l,$rx_p)   0\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+    return $retCode\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/stringUtils.tcl b/dep/tclclient/ixTcl1.0/Generic/stringUtils.tcl\nnew file mode 100644\nindex 00000000..6ac77997\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/stringUtils.tcl\n@@ -0,0 +1,632 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: stringUtils.tcl\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t03-07-2001\tDS\tGenesis\n+#\n+# Description: This file contains string helpers, including wrappers\n+#              for string commands not supported in 8.0\n+#\n+########################################################################\n+\n+\n+##################################################################################\n+# Procedure: capitalizeString\n+#\n+# This command returns the string w/the first char toupper\n+#\n+# Argument(s):\n+#   str     string to capitalize\n+#\n+##################################################################################\n+proc capitalizeString {str} \\\n+{\n+    if {[info tclversion] > 8.0} {\n+        set capString   [string totitle $str]\n+    } else {\n+        set capString [format \"%s%s\" [string toupper [string index $str 0]] [string range $str 1 end]]\n+    }\n+    return $capString\n+}\n+\n+\n+\n+##################################################################################\n+# Procedure: stringRepeat\n+#\n+# Helper proc to create a string consists of specialized charaters or strings.\n+#\n+# Argument(s):\n+#   string\t\t- the string to repeat, eg. \"*\", \",\" ...\n+#   repeatCount - number of times to repeat the string\n+#\n+##################################################################################\n+proc stringRepeat {string repeatCount} \\\n+{\n+    if {$repeatCount <= 0} {\n+        return \"\"\n+    }\n+\n+\t# string repeat is a new option added in Tcl8.1\n+    if {[info tclversion] > 8.0} {\n+\t\tset outPutString [string repeat $string $repeatCount]\n+\n+    } else {\n+        regsub -all {[ ]} [format \"%$repeatCount\\s\" \" \"] $string outPutString\n+\t}\n+\n+\treturn $outPutString\n+}\n+\n+\n+##################################################################################\n+# Procedure: stringIsInteger\n+#\n+# Helper proc to verify if a string is an integer value or not.\n+#\n+# Argument(s):\n+#   string\t\t- the string to check\n+#\n+# Return value:\n+#   1 if true\n+#   0 if false\n+#\n+##################################################################################\n+proc stringIsInteger {string} \\\n+{\n+\t# string is integer is a new option added in Tcl8.1\n+    if {[info tclversion] > 8.0} {\n+\t\tset retCode [string is integer $string]\n+    } else {\n+        set retCode 1\n+        if [catch {format %d $string}] {\n+            set retCode 0\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure: stringIsDouble\n+#\n+# Helper proc to verify if a string is an floating value or not.\n+#\n+# Argument(s):\n+#   string\t\t- the string to check\n+#\n+# Return value:\n+#   1 if true\n+#   0 if false\n+#\n+##################################################################################\n+proc stringIsDouble {string} \\\n+{\n+\t# string is integer is a new option added in Tcl8.1\n+    if {[info tclversion] > 8.0} {\n+\t\tset retCode [string is double $string]\n+    } else {\n+        set retCode 1\n+        if [catch {format %f $string}] {\n+            set retCode 0\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure: stringSubstitute\n+#\n+# Helper proc to replace a string w/in another string.\n+#\n+# Argument(s):\n+#   string1     - string to look in\n+#   old\t        - the string to replace\t\n+#   new\t\t    - replace w/this string\n+#\n+# Return value:\n+#   new string\n+#\n+##################################################################################\n+proc stringSubstitute {string1 old new} \\\n+{\n+    set oldLength   [string length $old]\n+    set index       [string first $old $string1]\n+    if {$index < 0} {\n+        set newString   $string1\n+    } else {\n+\n+        # string is integer is a new option added in Tcl8.1\n+        if {[info tclversion] > 8.0} {\n+            set newString [string replace $string1 $index [expr $index + $oldLength - 1] $new]\n+        } else {\n+            set newString [format %s%s%s [string range $string1 0 [expr $index - 1]] $new \\\n+                    [string range $string1 [expr $oldLength + $index] end]]\n+        }\n+    }\n+\n+    return $newString\n+}\n+\n+##################################################################################\n+# Procedure:    stringUnderscore\n+#\n+# Description:  Given an alpha-numeric string, build the same string underscored.\n+#                   Tabs are left in-tact by default, but may be ignored.\n+#\n+#                   Given the string:\n+#                       \"Now is the time for all good people to come to the aid of their universe\"\n+#\n+#                   Returns:\n+#                       \"Now is the time for all good people to come to the aid of their universe\"\n+#                        ========================================================================\n+#\n+#                   OR...\n+#\n+#                   Given a string with tabs:\n+#                       \"This is a\\ttab.\"\n+#\n+#                   Returns:\n+#                       \"This is a\\ttab.\"\n+#                        =========\\t====\n+#\n+#                        Looks like:\n+#\n+#                       \"This is a  tab.\"\n+#                        =========  ====\n+\n+#\n+# Input:        theString:  string to underscore\n+#               underscore: default is \"=\"\n+#               tabs:       ignore OR observe (default)\n+#\n+# Output:       underscored string\n+#\n+##################################################################################\n+proc stringUnderscore {theString {underscore \"=\"} {tabs \"observe\"}} {\n+\n+    if [string length $theString] {\n+        \n+        # Strip out tabs if ignoring.\n+        if {$tabs != \"observe\"} {\n+            regsub -all \\t $theString \" \" theString\n+        }\n+        if {[info tclversion] > 8.0} {\n+            regsub -all {[[:alnum:][:punct:] ]} $theString $underscore underscores\n+        } else {\n+            regsub -all {[-a-zA-z0-9 ;:\"/?.<>!@#$%&*()+']} $theString $underscore underscores\n+        }\n+        \n+        return $theString\\n$underscores\\n\n+    }\n+\n+}\n+\n+##################################################################################\n+# Procedure:    stringTitle\n+#\n+# Description:  Convert a string to a title, ie all words capitalized.\n+#\n+#                   Given the string:\n+#                       \"Now is the time for all good people to come to the aid of their universe\"\n+#\n+#                   Returns:\n+#                       \"Now is the Time For All Good People to Come to the Aid of Their Universe\"\n+#\n+#\n+# Input:        theString:  string to convert\n+#               whichWords: significant (default) OR all\n+#\n+# Output:       new string\n+#\n+#\n+# This capitalizes all words:\n+#\n+#\n+##################################################################################\n+proc stringTitle {theString {whichWords \"significant\"}} \\\n+{\n+\n+    if {$whichWords == \"significant\"} {\n+        set title \"\"\n+        foreach i $theString {\n+            switch -- $i {\n+                the -\n+                is -\n+                to -\n+                of -\n+                and {\n+                    append title \"$i \"\n+                }\n+        \n+                default {\n+                    append title \"[stringToUpper $i 0 0] \"\n+                }\n+            }\n+        }\n+    set title [string range $title 0 [expr [string length $theString] -1]]\n+    } else {\n+        regsub -all {(.+?\\M)} $theString {[stringToUpper \\1 0 0] } title\n+        set title [string trim [subst $title]]\n+    }\n+\n+    return $title\n+}\n+\n+\n+\n+\n+##################################################################################\n+# Procedure:    stringSplitToTitle\n+#\n+# Description:  Splits a string into a title, ie all words capitalized.\n+#\n+#                   Given the string:\n+#                       \"headerBytesReceived\"\n+#                   Returns:\n+#                       \"Header Bytes Received\"\n+#\n+#\n+# Input:        theString:  string to convert\n+#\n+# Output:       new string\n+#\n+#\n+# This capitalizes all words:\n+#\n+#\n+##################################################################################\n+proc stringSplitToTitle {theString} \\\n+{\n+    regsub -all {[A-Z]} $theString \" &\" newText\n+    set theString [stringToUpper $newText 0 0]\n+\n+    return $theString\n+}\n+\n+##################################################################################\n+# Procedure:    stringJoinFromTitle\n+#\n+# Description:  Joins a title into a string, the first letter of each word (except\n+#                   the first is kept/made uppercase, for example:\n+#\n+#                   Given the string:\n+#                       \"Site Level Aggregation Id\"\n+#                   Returns:\n+#                       \"siteLevelAggregationId\"\n+#\n+#\n+# Input:        theString:  string to convert\n+#\n+# Output:       new string\n+#\n+##################################################################################\n+proc stringJoinFromTitle {theString} \\\n+{\n+    set theString [string tolower [stringTitle $theString all] 0 0]\n+    regsub -all { } $theString \"\" theString\n+\n+    return $theString\n+}\n+\n+\n+\n+\n+##################################################################################\n+# Procedure:    stringToUpper\n+#\n+# Description:  Return string in upper case\n+#\n+#\n+#\n+# Input:        theString:  string to convert\n+#               index1   : If it is specified, it refers to the first char index in the string to start modifying. \n+#               index2   : If it is specified, it refers to the char index in the string to stop at. \n+#\n+# Output:       new string\n+#\n+#\n+##################################################################################\n+proc stringToUpper {theString {index1 -1} {index2  -1}} \\\n+{\n+    if {[info tclversion] > 8.0} {\n+        if { $index1 == -1 && $index2 == -1 } {\n+            set newString [string toupper $theString]\n+        } elseif { $index2 == -1 } {\n+            set newString [string toupper $theString $index1]\n+        } else {\n+            set newString [string toupper $theString $index1 $index2]\n+        }\n+\n+    } else {\n+        if {$index1 == -1 && $index2 == -1 } {\n+            set newString [string toupper $theString]\n+        } elseif { $index2 < $index1 && $index2 != -1} {\n+            set newString $theString\n+        } else {\n+            if {$index2 == -1} {\n+                set index2 $index1\n+            }\n+            set part1 [string range $theString 0 [expr $index1 - 1]]\n+            set part2 [string range $theString $index1 $index2]\n+            set part3 [string range $theString [expr $index2 + 1] [string length $theString]]\n+            set newString [append part1 [string toupper $part2] $part3]\n+\n+        }\n+    }        \n+    return $newString\n+}\n+\n+########################################################################################\n+# Procedure:    stringMap\n+#\n+# Description:  Given a translation map, perform character tranlation (same function\n+#                   as [string map] available in 8.3.\n+#\n+# Arguments:    value:\tstring of characters\n+#\n+# Returns:      retValue:\tstring with characters mapped to the corresponding \n+#\t\t\t\t\t\t\tcharacters in the map.  Note that characters not in the \n+#                           map are returned unaltered.\n+#\n+#\n+########################################################################################\n+proc stringMap {{map \"\"} value} \\\n+{\n+    set retValue \"\"\n+    \n+    array set translation $map\n+\n+    set length [string length $value]\n+    for {set i 0} {$i < $length} {incr i} {\n+\n+        set translatedValue [string index $value $i]\n+        if {[info exists translation($translatedValue)]} {\n+            set translatedValue $translation($translatedValue)\n+        }\n+        append retValue $translatedValue\n+    }\n+\n+    return $retValue\n+}\n+\n+\n+########################################################################################\n+# Procedure:    stringCompare\n+#\n+# Description:  Compare the given strings with option that are all specified by the\n+#               argument \"args\".\n+#\n+# Arguments:    args - a list that contains options and strings to be compared\n+#               \n+#\n+# Returns:      retValue - the result of the comparison.\n+#\n+#\n+########################################################################################\n+proc stringCompare {args} \\\n+{\n+    set retValue 1\n+\n+    if { [info tclversion] > 8.0 } {\n+\n+        if [catch {eval \"string compare $args\"} result] {\n+            errorMsg $result\n+        } else {\n+            set retValue $result\n+        }\n+\n+    } else {\n+        \n+        set flagNocase  0\n+        set flagLength  0\n+\n+        foreach arg $args {\n+\n+            switch -- $arg {\n+                \"-nocase\" {\n+                    set flagNocase 1\n+                }\n+                \"-length\" {\n+                    set flagLength 1\n+                    set state length\n+                }\n+                default {\n+\n+                    if { [info exists state] && ($state == \"length\") } {\n+\n+                        set length $arg\n+                        catch {unset state}\n+\n+                        if { ![stringIsInteger $length] } {\n+                            errorMsg \"expected integer but got \\\"$length\\\"\"\n+                            break\n+                        }\n+\n+                    } elseif { [info exists string1] == 0 } {\n+                        set string1 $arg\n+                    } elseif { [info exists string2] == 0 } {\n+                        set string2 $arg\n+                    }\n+                }\n+            }\n+        }\n+\n+        if { [info exists string1] && [info exists string2] } {\n+\n+            if { $flagLength == 1 } {\n+        \n+                if { $length > 0 } {\n+                    set index [expr $length - 1]\n+                    set string1 [string range $string1 0 $index]\n+                    set string2 [string range $string2 0 $index]\n+                } else {\n+                    set string1 \"\"\n+                    set string2 \"\"\n+                }\n+            }\n+\n+            if { $flagNocase == 1 } {\n+                set string1 [string tolower $string1]\n+                set string2 [string tolower $string2]\n+            }\n+\n+            if [catch {eval \"string compare \\\"$string1\\\" \\\"$string2\\\"\"} result] {\n+                errorMsg $result\n+            } else {\n+                set retValue $result\n+            }\n+\n+        } else {\n+            errorMsg \"wrong # args: should be \\\"stringCompare ?-nocase? ?-length int? string1 string2\\\"\"\n+        }\n+        \n+        return $retValue\n+    }\n+}\n+\n+##################################################################################\n+# Procedure:    stringFormatNumber\n+#\n+# Description:  Take a string on numbers (doesn't support special characters yet)\n+#                   and insert commas appropriately. \n+#\n+#                   Note: normally the value to be converted is in the parameter\n+#                   string, when called by a GUI callback function, the value is\n+#                   in args\n+#                   \n+#                   Handles:    -/+ in initial position\n+#                               comma insertion\n+#                               removal of non-numeric data\n+#                               integer with decimal\n+#\n+# Arguments:    string\n+#               args\n+#\n+# Returns:      formatted string\n+#\n+##################################################################################\n+proc stringFormatNumber { value {args {}} } \\\n+{\n+    set retValue 0\n+\n+    if {[llength $args] > 0} {\n+        set value [lindex $args 1]\n+    }\n+\n+    # Check if there is any numeric characters in the string\n+    regsub -all {[^0-9]} $value \"\" temp\n+\n+    if { [string length $temp] > 0 } {\n+        set retValue \"\"\n+\n+        # Remember sign.\n+        if {[string compare [string index $value 0] \"-\"] == 0} {\n+            set sign $::true\n+        } else {\n+            set sign $::false\n+        }\n+\n+        # Remove non-numeric characters (except \".\")\n+        regsub -all {[^0-9\\.]} $value \"\" value\n+\n+        set useDecimal [expr [scan [split $value .] \"%s %s\" integer decimal] > 1 ? $::true:$::false]\n+    \n+        # remove leading '0's before adding commas from INTEGER PORTION ONLY!!\n+        set integer [string trimleft $integer '0']\n+        if {[string length $integer] == 0} {\n+            set integer 0\n+        }\n+\n+        if {[string length $integer] > 0} {\n+\n+            set repetition [mpexpr int([string length $integer] / 3)]\n+            incr repetition -[expr [expr [mpexpr [string length $integer] % 3]>0] ? 0:1]\n+        \n+            for {set i $repetition} {$i > 0} {incr i -1} {\n+                set startIndex [expr [string length $integer] - 3]\n+                set triplet [string range $integer $startIndex end]\n+                set integer [stringReplace $integer $startIndex end]\n+                set retValue \",$triplet$retValue\"\n+            }\n+        }\n+        \n+        set retValue \"$integer$retValue\"\n+        if {$useDecimal} {\n+            set retValue [join [list $retValue $decimal] .]\n+        }\n+\n+        if {$sign} {\n+            set retValue [format \"%s%s\" \"-\" $retValue]\n+        }\n+    }\n+\n+    return $retValue\n+}\n+\n+\n+##################################################################################\n+# Procedure:   stringReplace\n+#\n+# Description: Helper proc to replicate the string replace command which is not supported in tcl 8.0\n+#\n+# Argument(s): oldString - the original string value\n+#              first - the index of the starting point for the replacement\n+#              last - the index of the ending point for the replacement, we will accept end, but not end minus a value\n+#              newString - (optional, defaults to null) the new string to use\n+#\n+# Returns:     Returns a new string created by replacing characters first through last with newString, or nothing.\n+##################################################################################\n+proc stringReplace {oldString first last {newString \"\"}} \\\n+{\n+    # string replace is a new option added in Tcl8.1\n+    if {[info tclversion] > 8.0} {\n+        set newString [string replace $oldString $first $last $newString]\n+    } else {\n+        if {$last == \"end\"} {\n+            set last [expr [string length $oldString] - 1]\n+        }\n+        set newString [format %s%s%s [string range $oldString 0 [expr $first - 1]] $newString \\\n+                [string range $oldString [expr $last + 1] end]]\n+    }\n+\n+    return $newString\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/switchLearn.tcl b/dep/tclclient/ixTcl1.0/Generic/switchLearn.tcl\nnew file mode 100644\nindex 00000000..85222208\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/switchLearn.tcl\n@@ -0,0 +1,2030 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: switchLearn.tcl\n+#\n+#   Copyright ©  IXIA\n+#\tAll Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t08-13-1998    Hardev Soor\n+#\n+# Description: This file contains commands that send learn frames\n+# for various protocols to the switch (DUT).\n+#\n+########################################################################################\n+\n+set ::udfList {1 2 3 4}\n+\n+########################################################################################\n+#::::::::::::                    MAC Layer Learn frames                       :::::::::::::\n+########################################################################################\n+\n+########################################################################################\n+# Procedure: send_learn_frames\n+#\n+# Description: This command sends directed learn frames to allow the DUT to learn the\n+#              mac addresses of the sending ports\n+#\n+# Argument(s):\n+#    PortArray    array of ports, ie., one2oneArray for a one2one configuration\n+#\n+########################################################################################\n+proc send_learn_frames {PortArray {RemovedPorts \"\"} {staggeredStart true}} \\\n+{\n+    upvar $PortArray portArray\n+    if {[string length $RemovedPorts] > 0} {\n+        upvar $RemovedPorts removedPorts\n+    }\n+\n+    set retCode       0\n+    set removedPorts  0\n+\n+    set broadcastMac  $::kBroadcastMacAddress\n+\n+    set enable802dot1qTag [protocol cget -enable802dot1qTag]\n+\n+    # set the stream parameters.\n+    set preambleSize  8\n+\n+    stream setDefault\n+    stream config -rateMode  usePercentRate\n+    stream config -name      \"LearnStream\"\n+    stream config -framesize [learn cget -framesize]\n+    stream config -dma       stopStream\n+    stream config -gapUnit   gapNanoSeconds\n+    stream config -enableIbg false\n+    stream config -enableIsg false\n+\n+    # set frameType to \"08 00\" \n+\tif {[protocol cget -ethernetType] == $::ethernetII} {\n+\t\tstream config -frameType [advancedTestParameter cget -streamFrameType]\n+\t}\n+\n+    set sentList \"\"\n+    # note - send one port at portArray time to allow time for learning;\n+    #         remember, learn frames are sent from Rx to Tx...\n+    foreach txMap [lnumsort [array names portArray]] {\n+        scan $txMap \"%d,%d,%d\" tx_c tx_l tx_p\n+\n+        if [IsPOSPort $tx_c $tx_l $tx_p] {\n+            set txSA $broadcastMac\n+        } else {\n+            if [port get $tx_c $tx_l $tx_p] {\n+                errorMsg \"Port [getPortId $tx_c $tx_l $tx_p] has not been configured yet.\"\n+                set retCode $::TCL_ERROR\n+                continue\n+            }\n+            set txSA [port cget -MacAddress]\n+        }\n+\n+        foreach rxMap $portArray($txMap) {\n+            scan [join $rxMap] \"%d %d %d\" rx_c rx_l rx_p\n+\n+            if {![IsPOSPort $rx_c $rx_l $rx_p] && [lsearch $sentList [list $rx_c $rx_l $rx_p]] < 0} {\n+                lappend sentList [list $rx_c $rx_l $rx_p]\n+\n+                if {[port get $rx_c $rx_l $rx_p] == 1} {\n+                    errorMsg \"Port [getPortId $rx_c $rx_l $rx_p] has not been configured yet.\"\n+                    continue\n+                }\n+\n+                set learnPercentRate [expr double([learn cget -rate])/[calculateMaxRate $rx_c $rx_l $rx_p [learn cget -framesize]]*100.]\n+                stream config -percentPacketRate $learnPercentRate\n+\n+                stream config -da           $txSA\n+\n+                stream config -sa           [port cget -MacAddress]\n+                stream config -numSA        [port cget -numAddresses]\n+\n+                if {[stream cget -numSA] > 1} {\n+                    stream config -saRepeatCounter  increment\n+                }\n+\n+                set numFrames($rx_c,$rx_l,$rx_p)    [expr [learn cget -numframes] * [port cget -numAddresses]]\n+                stream config -numFrames            $numFrames($rx_c,$rx_l,$rx_p)\n+\n+\t\t\t\tif [catch {expr int(ceil(double($numFrames($rx_c,$rx_l,$rx_p))/[learn cget -rate]))} duration] {\n+\t\t\t\t\terrorMsg \"$duration\"\n+\t\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t\t\tset duration 1\n+\t\t\t\t}\n+\n+                disableUdfs {1 2 3 4}\n+                \n+                if {![vlanUtils::isPortTagged $rx_c $rx_l $rx_p] && $enable802dot1qTag} {\n+                    protocol config -enable802dot1qTag  false\n+                }\n+\n+                if [stream set $rx_c $rx_l $rx_p 1] {\n+                    errorMsg \"Error setting stream for learning frames on [getPortId $rx_c $rx_l $rx_p] 1.\"\n+                    set retCode $::TCL_ERROR\n+                    continue\n+                }\n+            }\n+        }\n+    }\n+\n+    if {[llength $sentList] > 0} {        \n+        logMsg \"Configuring learn frames ...\"\n+\n+        # zero stats everywhere to avoid confusion later...\n+        zeroStats portArray\n+\n+        if {$retCode == 0} {\n+            logMsg \"Sending learning frames to all ports...\"\n+\n+            writeConfigToHardware sentList\n+\t        if [startTx sentList $staggeredStart] {\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+\n+        if {$duration < 1} {\n+            set duration 1\n+        }\n+\n+        after [learn cget -waitTime]\n+        # Wait for all frames to be transmitted..\n+        writeWaitMessage \"Transmit Status\" \"Transmitting learn frames\" $duration\n+\n+        statGroup setDefault\n+        foreach rxMap $sentList {\n+            scan $rxMap \"%d %d %d\" rx_c rx_l rx_p\n+\n+            if [statGroup add $rx_c $rx_l $rx_p] {\n+                errorMsg \"Error adding port [getPortId $rx_c $rx_l $rx_p] to statGroup\"\n+                set retCode $::TCL_ERROR\n+                continue\n+            }\n+        }\n+\n+        # wait the min refresh for 10/100 cards to let the stats update...\n+        after 800\n+        set tempSentList   $sentList \n+        set retry           20\n+\n+        while {([llength $tempSentList] > 0) && ($retry > 0)} {\n+            if [statGroup get] {\n+                errorMsg \"Error getting stats for statGroup\"\n+                set retCode $::TCL_ERROR\n+            }\n+\n+            foreach rxMap $tempSentList {\n+                scan $rxMap \"%d %d %d\" rx_c rx_l rx_p\n+\n+                if [statList get $rx_c $rx_l $rx_p] {\n+                    errorMsg \"Error getting Tx statistics for [getPortId $rx_c $rx_l $rx_p]\"\n+                    set retCode $::TCL_ERROR\n+                    continue\n+                }\n+\n+\t\t\t\tif [catch {statList cget -scheduledFramesSent} txNumFrames ] {\n+\t\t\t\t\tif [catch {statList cget -framesSent} txNumFrames ] {\n+\t\t\t\t\t\tset txNumFrames 0\n+\t\t\t\t\t} else {\n+\t\t\t\t\t\tif [catch {statList cget -protocolServerTx} numProtocolServerFrames ] {\n+\t\t\t\t\t\t\tset numProtocolServerFrames  0\n+\t\t\t\t\t\t}\n+\t\t\t\t\t\tset txNumFrames [mpexpr $txNumFrames - $numProtocolServerFrames]\n+\t\t\t\t\t\tif {[isNegative $txNumFrames]} {\n+\t\t\t\t\t\t\t set txNumFrames 0\n+\t\t\t\t\t\t}\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\n+                if { $txNumFrames == $numFrames($rx_c,$rx_l,$rx_p) } {\n+                    set portIndex [lsearch $tempSentList [list $rx_c $rx_l $rx_p]]\n+\t\t\t        if {$portIndex != -1} {\n+\t\t\t\t        set tempSentList [lreplace $tempSentList $portIndex $portIndex]\n+\t\t\t        }\n+                }\n+            }\n+            if { [llength $tempSentList] == 0 } {\n+                set retry  0\n+            } else {\n+                incr retry -1\n+            }\n+        }\n+\n+        if {[llength $tempSentList] > 0} { \n+            foreach rxMap $tempSentList {\n+                scan $rxMap \"%d %d %d\" rx_c rx_l rx_p\n+                logMsg \"All Learn frames not sent on port [getPortId $rx_c $rx_l $rx_p]\"\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+\n+        logMsg \"Learning frames sent...\"\n+    }\n+\n+    if {[fastpath cget -enable] == \"true\"} {\n+        if [send_fastpath_frames portArray] {\n+            errorMsg \"Error sending fastpath frames\"\n+            set retCode $::TCL_ERROR\n+        }\n+    }\n+\n+    protocol config -enable802dot1qTag  $enable802dot1qTag   \n+    stream setDefault\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+#::::::::::::                    IP Layer Learn frames                       :::::::::::::\n+########################################################################################\n+\n+########################################################################################\n+# Procedure: OLDsend_arp_frames\n+#\n+# Description: This command send the arp frames from rx to tx\n+#\n+# Argument(s):\n+#    PortArray    array of ports, ie., one2oneArray for a one2one configuration\n+#\n+########################################################################################\n+proc OLDsend_arp_frames {PortArray {RemovedPorts \"\"}} \\\n+{\n+    upvar $PortArray portArray\n+    if {[string length $RemovedPorts] > 0} {\n+        upvar $RemovedPorts removedPorts\n+    }\n+\n+    set retCode 0\n+    \n+    # This code has been added for \"Send MAC Only\" option\n+    if {[learn cget -type] == \"mac\" } {\n+\t\tif [send_learn_frames portArray] {\n+\t\t\treturn -code error -errorinfo \"Error sending MAC learning frames\"\n+\t\t}\n+        return $retCode\n+    }\n+            \n+    set removedPorts 0\n+\n+    disableUdfs $::udfList\n+    filter setDefault\n+    stream setDefault\n+    udf setDefault\n+\n+    # set the stream parameters.\n+    set preambleSize            8\n+    set framesize               [learn cget -framesize]\n+    set enable802dot1qTag       [protocol cget -enable802dot1qTag]\n+    set duration                [expr [learn cget -numframes] / [learn cget -rate]]\n+\n+    stream config -rateMode     usePercentRate\n+    stream config -name         \"ArpStream\"\n+    stream config -framesize    $framesize\n+    stream config -dma          stopStream\n+    stream config -numFrames    [learn cget -numframes]\n+    stream config -fcs          good\n+    stream config -gapUnit      gapNanoSeconds\n+\n+    filter config -captureFilterPattern          any\n+    filter config -captureFilterError            errGoodFrame\n+    filter config -captureFilterFrameSizeEnable  false\n+    filter config -captureFilterFrameSizeEnable  false\n+    filter config -captureTriggerError           errGoodFrame\n+\n+    # zero stats everywhere to avoid confusion later...\n+    zeroStats portArray\n+\n+    # note - send one port at portArray time to allow time for learning; arp frames should\n+    #         be sent from tx->DUT & rx->DUT.\n+\n+    set rxList  [lnumsort [getAllPorts portArray]]\n+\n+    set tempAppName [protocol cget -appName]\n+    protocol config -appName  Arp\n+\n+    foreach txMap $rxList {\n+        scan $txMap \"%d %d %d\" tx_c tx_l tx_p\n+\n+        if [IsPOSPort $tx_c $tx_l $tx_p] {\n+            set index   [lsearch  $rxList $txMap]\n+            set rxList  [lreplace $rxList $index $index]\n+            continue\n+        }\n+\n+        if {[port get $tx_c $tx_l $tx_p] == 1 || [ip get $tx_c $tx_l $tx_p] == 1} {\n+            errorMsg \"Port [getPortId $tx_c $tx_l $tx_p] has not been configured yet.\"\n+            set retCode 1\n+            continue\n+        }\n+\n+        set txSA            [port cget -MacAddress]\n+        set numTx           [port cget -numAddresses]\n+\n+        set txDA            $::kBroadcastMacAddress\n+        set txIP            [ip cget -sourceIpAddr]\n+        set txDutIP         [ip cget -destDutIpAddr]\n+\n+\n+        arp config -operation           arpRequest\n+        arp config -sourceProtocolAddr  $txIP\n+        arp config -destProtocolAddr    $txDutIP\n+        arp config -sourceHardwareAddr  $txSA\n+        arp config -destHardwareAddr    $txDA\n+                               \n+        if {$numTx > 1} {\n+            arp config -sourceHardwareAddrMode arpIncrement\n+            arp config -sourceHardwareAddrRepeatCount $numTx\n+            arp config -sourceProtocolAddrMode arpIncrement\n+            arp config -sourceProtocolAddrRepeatCount $numTx\n+            stream config -numFrames [expr $numTx * [learn cget -numframes]]\n+            if {[expr [stream cget -numFrames]/[learn cget -rate]] > $duration} {\n+                set duration    [expr [stream cget -numFrames]/[learn cget -rate]]\n+            }\n+        }\n+\n+        if [arp set $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error setting Arp for port [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+            continue\n+        }\n+\n+        set learnPercentRate             [expr double([learn cget -rate])/[calculateMaxRate $tx_c $tx_l $tx_p $framesize]*100.]\n+        stream config -percentPacketRate $learnPercentRate\n+\n+        stream config -da       $txDA\n+        stream config -numDA    1\n+\n+        stream config -sa       $txSA\n+        stream config -numSA    $numTx\n+        if {$numTx > 1} {\n+            stream config -saRepeatCounter increment\n+        }\n+\n+        stream config -patternType    repeat\n+        stream config -dataPattern    allZeroes\n+\n+        if {$enable802dot1qTag && ![vlanUtils::isPortTagged $tx_c $tx_l $tx_p]} {\n+            protocol config -enable802dot1qTag  false\n+        }\n+\n+        if [stream set $tx_c $tx_l $tx_p 1] {\n+            errorMsg \"Error setting stream 1 on [getPortId $tx_c $tx_l $tx_p] for ARP frames.\"\n+            set retCode 1\n+        }\n+\n+        protocol config -enable802dot1qTag  $enable802dot1qTag\n+\n+        # set up the pattern filter\n+        filterPallette config -pattern1        [host2addr $txDutIP]\n+        filterPallette config -patternOffset1    28\n+        if [filterPallette set $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error setting filter pallette for [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+        }\n+\n+        # set the filter parameters on the receive port\n+        debugMsg \"    configuring filters\"\n+        filter config -captureFilterEnable   true\n+        filter config -captureTriggerEnable  true\n+        if [filter set $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error setting filters on [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+        }\n+    }\n+    protocol config -appName  $tempAppName\n+\n+    if {[llength $rxList] == 0} {\n+        return $retCode\n+    }\n+\n+    disableArpResponse    rxList\n+\n+    if [setCaptureMode rxList] {\n+        set retCode 1\n+    }\n+\n+    writeConfigToHardware rxList\n+\n+\tif {[checkLinkState rxList ]} {\n+        set retCode 1\n+    }\n+\n+    if [startCapture rxList] {\n+        errorMsg \"Error starting capture.\"\n+        set retCode 1\n+    }\n+\n+    foreach txMap $rxList {\n+        scan $txMap \"%d %d %d\" tx_c tx_l tx_p\n+\n+        if [arp get $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error getting Arp on [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+        }\n+\n+        logMsg \"sending ARP frame from [getPortId $tx_c $tx_l $tx_p], SrcPort: [arp cget -sourceProtocolAddr] to DestPort: [arp cget -destProtocolAddr]\"\n+    }\n+\tset retCode [startStaggeredTx rxList]\n+\n+    # wait the min refresh for 10/100 cards to let the stats update...\n+    after 800\n+\n+    after [learn cget -waitTime]\n+    # Wait for all frames to be transmitted..\n+    for {set timeCtr 1} {$timeCtr <= $duration} {incr timeCtr} {\n+        logMsg  \"Transmitted arp frames $timeCtr of $duration seconds\"\n+        after 1000\n+    }\n+\n+    checkAllTransmitDone rxList\n+\n+    foreach txMap $rxList {\n+        scan $txMap \"%d %d %d\" tx_c tx_l tx_p\n+\n+        # look for ARP responses\n+        set maxArp  100\n+        if [captureBuffer get $tx_c $tx_l $tx_p 1 $maxArp] {\n+            errorMsg \"Error getting capture buffer for [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+            continue\n+        }\n+        set found 0\n+        set nFrame 1\n+        while {[captureBuffer getframe $nFrame] != 1 && $nFrame <= $maxArp} {\n+            debugMsg \"Getting frame $nFrame from Buffer   .....\"\n+            set capframe    [captureBuffer cget -frame]\n+            if {([arp decode $capframe] == 0) && ([arp cget -operation] == $::arpReply)} {\n+                set found 1\n+                break\n+            }\n+            incr nFrame\n+        }\n+\n+        if {$found == 0} {\n+            logMsg \"No ARP response frames received on [getPortId $tx_c $tx_l $tx_p]\"\n+            if {[learn cget -removeOnError] == \"true\"} {\n+                logMsg \"Removing port $txMap from map...\"\n+                if [array exists portArray] {\n+                    if [info exists portArray($c,$l,$p)] {\n+                        unset portArray($c,$l,$p)\n+                        set removedPorts    1\n+                    }\n+                    foreach txMap [array names portArray] {\n+                        scan $txMap \"%d,%d,%d\" tx_c tx_l tx_p\n+\n+                        foreach rxMap $portArray($tx_c,$tx_l,$tx_p) {\n+                            set index [lsearch $portArray($tx_c,$tx_l,$tx_p) \"$c $l $p\"]\n+\n+                            if {$index >= 0} {\n+                                set portArray($tx_c,$tx_l,$tx_p) [lreplace $portArray($tx_c,$tx_l,$tx_p) $index $index]\n+                                set removedPorts    1\n+                            }\n+                            if {[llength $portArray($tx_c,$tx_l,$tx_p)] <= 0} {\n+                                unset portArray($tx_c,$tx_l,$tx_p)\n+                            }\n+                        }\n+                    }                   \n+                } else {\n+                    set index [lsearch [getAllPorts portArray] \"$c $l $p\"]\n+                    if {$index >= 0} {\n+                        set portArray [lreplace [getAllPorts portArray $index $index]]\n+                        set removedPorts    1\n+                    }\n+                }\n+\n+                # remember to set an error if we removed all ports!!\n+                if {![info exists portArray]} {\n+                    set retCode 1\n+                } else {\n+                    if {[llength [array get portArray]] <= 0} {\n+                        set retCode 1\n+                    }\n+                }\n+            } else {\n+                set retCode 1\n+            }\n+            continue\n+        }\n+\n+        if [port get $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error getting port [getPortId $tx_c $tx_l $tx_p] for storing DestMacAddress.\"\n+            set retCode 1\n+            continue\n+        }\n+        port config -DestMacAddress    [arp cget -sourceHardwareAddr]\n+        if [port set $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error setting port [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+        }\n+        logMsg \"Got ARP RESPONSE on [getPortId $tx_c $tx_l $tx_p], DUT MAC address for [getPortId $tx_c $tx_l $tx_p]: [arp cget -sourceHardwareAddr]\"\n+    }\n+\n+    if {[learn cget -waitTime] > 1000} {\n+        logMsg \"Waiting for DUT to settle down after learning for [expr [learn cget -waitTime]/1000] second(s)...\"\n+    }\n+\n+    after [learn cget -waitTime]\n+\n+    if {$retCode == 0 && [ipfastpath cget -enable] == \"true\"} {\n+        if [send_ipfastpath_frames portArray] {\n+            errorMsg \"Error sending IP fastpath frames\"\n+            set retCode 1\n+        }\n+    } elseif {$retCode == 0 && [fastpath cget -enable] == \"true\"} {\n+        if [send_fastpath_frames portArray] {\n+            errorMsg \"Error sending IP fastpath frames\"\n+            set retCode 1\n+        }\n+    }\n+\n+    stream setDefault\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: send_arp_frames\n+#\n+# Description: This command uses the protocol server to configure arp, send out arp \n+#              requests & enable arp response\n+#\n+# Argument(s):\n+#    PortArray    array of ports, ie., one2oneArray for a one2one configuration\n+#\n+########################################################################################\n+proc send_arp_frames {PortArray {RemovedPorts \"\"} {resetInterfaces true}} \\\n+{\n+    upvar $PortArray    portArray\n+    if {[string length $RemovedPorts] > 0} {\n+        upvar $RemovedPorts removedPorts\n+    }\n+\n+    set retCode\t\t\t0\n+\tset numInterfaces\t1\n+    set arpList         [getAllPorts portArray]\n+\n+    if [configureArp portArray arpList write $numInterfaces $resetInterfaces] {\n+        errorMsg \"Error configuring ARP\"\n+        set retCode 1\n+    }   \n+    if {[llength $arpList] != 0} {\n+        \n+        if {[sendArp portArray $arpList removedPorts] || $retCode } {\n+            errorMsg \"Error sending ARP\"\n+            set retCode 1\n+        }\n+\n+        if {$retCode == 0 && [ipfastpath cget -enable] == \"true\"} {\n+            if [send_ipfastpath_frames portArray] {\n+                errorMsg \"Error sending IP fastpath frames\"\n+                set retCode 1\n+            }\n+        } elseif {$retCode == 0 && [fastpath cget -enable] == \"true\"} {\n+            if [send_fastpath_frames portArray] {\n+                errorMsg \"Error sending IP fastpath frames\"\n+                set retCode 1\n+            }\n+        }\n+    }\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: configureArp\n+#\n+# Description: This command configures the protocol server for ARP \n+#\n+# Argument(s):\n+#    PortArray  - array of ports, ie., one2oneArray for a one2one configuration\n+#                 NOTE:This array is passed for internal modem configuration purposes      \n+#    ArpList\n+#\n+########################################################################################\n+proc configureArp {PortArray ArpList {write write} {numInterfaces 1} {resetInterfaces true}} \\\n+{\n+    upvar $PortArray    portArray\n+    upvar $ArpList      arpList\n+\n+    set retCode 0\n+\n+    #set rxList  [getRxPorts  portArray]\n+    set enable802dot1qTag   [protocol cget -enable802dot1qTag]\n+\n+    foreach txMap $arpList {\n+        scan $txMap \"%d %d %d\" tx_c tx_l tx_p\n+        \n+        if [IsPOSPort $tx_c $tx_l $tx_p] {\n+            set index   [lsearch $arpList $txMap]\n+            set arpList [lreplace $arpList $index $index]\n+            continue\n+        }\n+\n+        ipAddressTable      setDefault\n+        ipAddressTableItem  setDefault\n+        arpServer           setDefault\n+        protocolServer      setDefault\n+                         \n+        if {![catch {hasInternalModem portArray $tx_c $tx_l $tx_p} internalModemFlag] && $internalModemFlag } {\n+            configureArpInternalModem portArray $tx_c $tx_l $tx_p\n+\n+        } else {\n+            if {[port get $tx_c $tx_l $tx_p] == 1 || [ip get $tx_c $tx_l $tx_p] == 1} {\n+                errorMsg \"Port [getPortId $tx_c $tx_l $tx_p] has not been configured yet.\"\n+                set retCode 1\n+                continue\n+            }\n+            set txSA                [port cget -MacAddress]\n+            set numTx               [port cget -numAddresses]\n+                              \n+            ipAddressTable config -defaultGateway       [ip cget -destDutIpAddr]\n+\n+            ipAddressTableItem config -fromIpAddress    [ip cget -sourceIpAddr]\n+            ipAddressTableItem config -fromMacAddress   $txSA\n+            ipAddressTableItem config -numAddresses     $numTx\n+\n+            if {[vlanUtils::isPortTagged $tx_c $tx_l $tx_p] && $enable802dot1qTag} {\n+                if [vlan get $tx_c $tx_l $tx_p] {\n+                    errorMsg \"Error getting vlan parameters for $tx_c $tx_l $tx_p\"\n+                    set retCode 1\n+                }\n+                ipAddressTableItem config -enableVlan   true\n+                ipAddressTableItem config -vlanId   [vlan cget -vlanID]\n+            }\n+\n+            if [ipAddressTableItem set] {\n+                errorMsg \"Error setting ipAddressTableItem\"\n+                set retCode 1\n+                continue\n+            }\n+            if [ipAddressTable addItem] {\n+                errorMsg \"Error adding ipAddressTable item\"\n+                set retCode 1\n+                continue\n+            }\n+        }\n+        \n+        if [ipAddressTable set $tx_c $tx_l $tx_p] {\n+             errorMsg \"Error setting ipAddressTable on port [getPortId $tx_c $tx_l $tx_p]\"\n+             set retCode 1\n+             continue\n+        }\n+\n+        # if this is a receive port, then make sure we learn as well as get the DUT mac addr...\n+        #if {[lsearch $rxList [list $tx_c $tx_l $tx_p]] >= 0} {\n+        #   arpServer config -mode   arpGatewayAndLearn\n+        #} else {\n+        #   # we only need the gateway address if we're not a receiver...\n+        #   arpServer config -mode   arpGatewayOnly\n+        #}\n+    \n+        # because we want to use requestRepeatCount, so need to ARP and Learn for all ports\n+        arpServer config -mode          arpGatewayAndLearn\n+        arpServer config -retries       [learn cget -retries]\n+        arpServer config -rate          [learn cget -rate]\n+        arpServer config -requestRepeatCount   [learn cget -numframes]\n+\n+        if [arpServer set $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error setting arpServer on port [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+            continue\n+        }\n+        protocolServer config -enableArpResponse    true\n+        if [protocolServer set $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error setting protocolServer on port [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+        }\n+\n+        if {[interfaceTable::configurePort $tx_c $tx_l $tx_p $::ipV4 $numInterfaces nowrite $resetInterfaces]} {\n+            errorMsg \"Error: Unable to set interface table on port [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode $::TCL_OK\n+        }\n+    }\n+\n+    if {[llength $arpList] > 0 && $retCode == 0 && $write == \"write\"} {\n+        writeConfigToHardware arpList\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: sendArp\n+#\n+# Description: This command uses the protocol server to send out arp requests & enable\n+#              arp response\n+#\n+# Argument(s):\n+#    PortArray    array of ports, ie., one2oneArray for a one2one configuration\n+#\n+# Returns:        TCL_OK or TCL_ERROR\n+#\n+########################################################################################\n+proc sendArp { PortArray arpList {RemovedPorts \"\"} } \\\n+{\n+\n+    upvar $PortArray    portArray\n+    #upvar $ArpList      arpList\n+    if {[string length $RemovedPorts] > 0} {\n+        upvar $RemovedPorts removedPorts\n+    }\n+\n+    set retCode $::TCL_OK\n+\n+    if {[info exists removedPorts]} {\n+        unset removedPorts\n+    }\n+    set removedPorts    0\n+\n+    if {[clearArpTable arpList]} {\n+        errorMsg \"Error clearing arp table\"\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    set numAddress          [advancedTestParameter cget -numAddressesPerPort]\n+    set duration            [expr ceil (double([learn cget -numframes]) / [learn cget -rate])]\n+\n+    if {[issuePortGroupCommand resetStatistics arpList]} {\n+\t    errorMsg \"Error: Unable to issue port group commands: resetStatistics\"\n+\t    set retCode $::TCL_ERROR\n+    }\n+    set numFrames  $numAddress\n+\n+    if {[advancedTestParameter cget -verifyAllArpReply] == \"true\"} {\n+        set numFrames [expr $numAddress * [learn cget -numframes]]\n+    }\n+\n+    if {[expr ceil (double($numFrames)/[learn cget -rate])] > $duration } {\n+        set duration    [expr $numFrames/[learn cget -rate]]\n+    }\n+\n+    if {[transmitArpRequest arpList]} {\n+        errorMsg \"Error transmitting arp request\"\n+        set retCode $::TCL_ERROR\n+    }\n+\n+    if {$duration > 2 } {\n+        logMsg \"Transmiting ARP frames for $duration seconds...\"\n+        # Wait for at least 1 frame per address gets transmitted..\n+        set retCode [writeWaitMessage \"Transmit ARP Status\" \"Transmitting\" $duration destroy]\n+    }\n+\n+    if {[learn cget -waitTime] > 1000 } {\n+        logMsg \"Waiting for DUT to settle down after learning for [expr [learn cget -waitTime]/1000] second(s)...\"\n+    }\n+\n+    after [learn cget -waitTime]\n+\n+    if {$numAddress > 1 } {\n+        if {[verifyAllArpFramesSent $arpList]} {\n+            errorMsg \"Error verifying all Arp frames sent.\"\n+            return $::TCL_ERROR\n+        }\n+    } \n+       \n+    if {[advancedTestParameter cget -verifyAllArpReply] == \"true\"} {\n+        if {[verifyArpReply $arpList]} {\n+            errorMsg \"Error verifying all Arp replies\"\n+            return $::TCL_ERROR\n+        }\n+    }\n+\n+    set retries     [learn cget -retries]\n+    while {[llength $arpList] > 0 && $retries > 0} {\n+        incr retries -1\n+\n+        foreach txMap [lnumsort $arpList] {\n+            scan $txMap \"%d %d %d\" tx_c tx_l tx_p\n+\n+            if {[ipAddressTable get $tx_c $tx_l $tx_p]} {\n+                errorMsg \"Error getting ipAddressTable on [getPortId $tx_c $tx_l $tx_p]\"\n+                set retCode $::TCL_ERROR\n+                continue\n+            }\n+            # look for ARP responses\n+            if {[arpServer get $tx_c $tx_l $tx_p]} {\n+                errorMsg \"Error getting arpServer from [getPortId $tx_c $tx_l $tx_p]\"\n+                set retCode $::TCL_ERROR\n+                continue\n+            }\n+\n+            if {![catch {hasInternalModem portArray $tx_c $tx_l $tx_p} internalModemFlag] && $internalModemFlag} {\n+                if {[internalModemCheckArpResponse portArray $tx_c $tx_l $tx_p]} {\n+                    set retCode $::TCL_ERROR\n+                } else {\n+                    set mapIndex    [lsearch  $arpList $txMap]\n+                    set arpList     [lreplace $arpList $mapIndex $mapIndex]\n+                    set retCode $::TCL_OK\n+                }\n+            } else {\n+                set gateway [ipAddressTable cget -defaultGateway]\n+\n+\n+                if {[arpServer getEntry $gateway]} {\n+                    logMsg \"Waiting for ARP response from $gateway on [getPortId $tx_c $tx_l $tx_p] ...\"\n+                    after [learn cget -waitTime]\n+                    continue\n+                }\n+                if {[arpAddressTableEntry get]} {\n+                    errorMsg \"Error getting arpAddressTableEntry\"\n+                    set retCode $::TCL_ERROR\n+                    continue\n+                }\n+                set dutMacAddress   [arpAddressTableEntry cget -macAddress]\n+\n+                if {[port get $tx_c $tx_l $tx_p]} {\n+                    errorMsg \"Error getting port [getPortId $tx_c $tx_l $tx_p] for storing DestMacAddress.\"\n+                    set retCode $::TCL_ERROR\n+                    continue\n+                }\n+                port config -DestMacAddress    $dutMacAddress\n+                if {[port set $tx_c $tx_l $tx_p]} {\n+                    errorMsg \"Error setting port [getPortId $tx_c $tx_l $tx_p]\"\n+                    set retCode $::TCL_ERROR\n+                }\n+                logMsg \"Got ARP RESPONSE on [getPortId $tx_c $tx_l $tx_p], Gateway: $gateway, DUT MAC address for [getPortId $tx_c $tx_l $tx_p]: $dutMacAddress\"\n+                set mapIndex    [lsearch  $arpList $txMap]\n+                set arpList     [lreplace $arpList $mapIndex $mapIndex]\n+            } \n+        }\n+    }\n+    \n+    foreach txMap [lnumsort $arpList] {\n+        scan $txMap \"%d %d %d\" c l p\n+        if {![catch {hasInternalModem portArray $c $l $p} internalModemFlag] && $internalModemFlag} {\n+            getInternalModemNoArpResponse portArray $c $l $p\n+        } else {\n+            if {[ipAddressTable get $c $l $p]} {\n+                errorMsg \"Error getting ipAddressTable on [getPortId $c $l $p]\"\n+                set retCode $::TCL_ERROR\n+                continue\n+            }\n+            set gateway [ipAddressTable cget -defaultGateway]\n+            logMsg \"No ARP response received from $gateway on $txMap\"\n+        }\n+\n+    }\n+    \n+    if {[llength $arpList] > 0 && $retCode == 0} {\n+        if {[learn cget -removeOnError] == \"true\"} {\n+            removePorts portArray $arpList\n+            set removedPorts      1\n+        } else {\n+            set retCode     $::TCL_ERROR\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: verifyAllArpFramesSent\n+#\n+# Description: This command verifies all the ARP frames sent for all the addresses\n+#\n+# Argument(s):\n+#    portList   - list of ports\n+#\n+########################################################################################\n+proc verifyAllArpFramesSent { portList } \\\n+{\n+\n+    set retCode $::TCL_OK\n+\n+    set numAddress  [advancedTestParameter cget -numAddressesPerPort]\n+    if {[advancedTestParameter cget -verifyAllArpReply] == \"true\"} {\n+        set numFrames   [expr $numAddress * [learn cget -numframes]]\n+    } else {\n+        set numFrames $numAddress\n+    }\n+\n+    set retries     [learn cget -retries]\n+    while {[llength $portList] > 0 && $retries > 0} {\n+        \n+        set retCode [requestStats portList]\n+        \n+        foreach portMap $portList {\n+            scan $portMap\t\"%d %d %d\" c l p\n+\n+            if {[statList get $c $l $p]} {\n+                errorMsg \"Error getting stats for [getPortId $c $l $p].\"\n+                set retCode     $::TCL_ERROR\n+                continue\n+            }\n+\n+\t\t\tif [catch {statList cget -framesSent} framesSent ] {\n+\t\t\t\tif [catch {statList cget -atmAal5FramesSent} framesSent ] {\n+\t\t\t\t\tset framesSent 0\n+\t\t\t\t}\n+\t\t\t}\n+\n+            # Since 32 bit counter (mpexpr) is used here, if we get a 32 bit long number (in binary) whose most significiant\n+            # bit is 1, it will be recognized as a negtive number. \n+            # So we use regexp to determine wheather numTxFrames is a negative number instead of using \"$numTxFrames < 0\"\n+            if { [regexp {^-[0-9]+$} $framesSent] } {\n+                set framesSent 0\n+            }\n+            if { $framesSent >= $numFrames } {\n+                set mapIndex    [lsearch  $portList $portMap]\n+                set portList    [lreplace $portList $mapIndex $mapIndex] \n+            }   \n+            after 1000\n+        }\n+        incr retries -1\n+    }\n+\n+    foreach txMap [lnumsort $portList] {\n+        scan $txMap \"%d %d %d\" c l p\n+   \n+        logMsg \"Not all ARP frames sent for all $numAddress addresses on $txMap\"\n+        set retCode     $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+########################################################################################\n+# Procedure: verifyArpReply\n+#\n+# Description: This command verifies all the ARP replies - number of ARP replies from all\n+#              the addresses\n+#\n+# Argument(s):\n+#    portList   - list of ports\n+#\n+########################################################################################\n+proc verifyArpReply { portList } \\\n+{\n+\n+    set retCode $::TCL_OK\n+\n+    set numAddress  [advancedTestParameter cget -numAddressesPerPort]\n+\n+    set retries     [learn cget -retries]\n+    while {[llength $portList] > 0 && $retries > 0} {\n+        \n+        set retCode [requestStats portList]\n+        \n+        foreach portMap $portList {\n+            scan $portMap\t\"%d %d %d\" c l p\n+\n+            if {[statList get $c $l $p]} {\n+                errorMsg \"Error getting stats for [getPortId $c $l $p].\"\n+                set retCode     $::TCL_ERROR\n+                continue\n+            }\n+\n+            set numRxArpReply [statList cget -rxArpReply]\n+\n+            # Since 32 bit counter (mpexpr) is used here, if we get a 32 bit long number (in binary) whose most significiant\n+            # bit is 1, it will be recognized as a negtive number. \n+            # So we use regexp to determine wheather numTxFrames is a negative number instead of using \"$numTxFrames < 0\"\n+            if { [regexp {^-[0-9]+$} $numRxArpReply] } {\n+                set numRxArpReply 0\n+            }\n+            if { $numRxArpReply >= $numAddress } {\n+                set mapIndex    [lsearch  $portList $portMap]\n+                set portList    [lreplace $portList $mapIndex $mapIndex] \n+            }   \n+            after 1000\n+        }\n+        incr retries -1\n+    }\n+\n+    foreach txMap [lnumsort $portList] {\n+        scan $txMap \"%d %d %d\" c l p\n+   \n+        if {[ipAddressTable get $c $l $p]} {\n+            errorMsg \"Error getting ipAddressTable on [getPortId $c $l $p]\"\n+            set retCode $::TCL_ERROR\n+            continue\n+        }\n+        set gateway [ipAddressTable cget -defaultGateway]\n+        logMsg \"Not all ARP responses received for all $numAddress addresses from $gateway on $txMap\"\n+        set retCode     $::TCL_ERROR\n+    }\n+\n+    return $retCode\n+}\n+\n+########################################################################################\n+#::::::::::::                    IPV6 Layer Learn frames                   :::::::::::::\n+########################################################################################\n+########################################################################################\n+# Procedure:    send_neighborDiscovery_frames\n+#\n+# Description:  Solicit and save the link-layer addresses for the ports of the \n+#                   given portArray\n+#\n+# Argument(s):  PortArray:      ports array, ie: one2oneArray, many2oneArray...\n+#               RemovedPorts:   return removed ports here\n+#\n+# Returns:      ::TCL_OK or ::TCL_ERROR\n+#\n+########################################################################################\n+proc send_neighborDiscovery_frames {PortArray {RemovedPorts \"\"} {resetInterfaces true}} \\\n+{\n+    upvar $PortArray portArray\n+    if {[string length $RemovedPorts] > 0} {\n+        upvar $RemovedPorts removedPorts\n+    }\n+\n+    set retCode $::TCL_OK\n+\n+    if {![catch {namespace parent userCode}]} {\n+        set retCode [userCode::performNeighborDiscovery portArray]\n+        \n+    } else {\n+        set retCode [performNeighborDiscovery portArray removedPorts $resetInterfaces]\n+    }\n+    return $retCode\n+}\n+\n+########################################################################################\n+# Procedure:    performNeighborDiscovery\n+#\n+# Description:  Solicit and save the link-layer addresses for the ports of the \n+#                   given portArray\n+#\n+#                   In this implementation, the neighbor discovery table is populated\n+#                   after a set of router solicitation/advertisement commands are \n+#                   sent and recieved.  The 'source link-layer option' of the router\n+#                   advertisement is used to extract the DUT's link layer address.\n+#\n+# Argument(s):  PortArray:      ports array, ie: one2oneArray, many2oneArray...\n+#               RemovedPorts:   return removed ports here\n+#\n+# Returns:      ::TCL_OK or ::TCL_ERROR\n+#\n+########################################################################################\n+proc performNeighborDiscovery {PortArray {RemovedPorts \"\"} {resetInterfaces true}} \\\n+{\n+    upvar $PortArray    portArray\n+    if {[string length $RemovedPorts] > 0} {\n+        upvar $RemovedPorts removedPorts\n+    }\n+\n+    set retCode $::TCL_OK\n+\n+    set retries     [learn cget -retries]\n+    set waitTime    [learn cget -waitTime]\n+    set portList    [getAllPorts portArray]\n+\n+    if {[llength $portList] > 0} {\n+\n+        discoveredNeighbor  setDefault\n+        if {![interfaceTable::configure portList $::ipV6 1 nowrite $resetInterfaces]} {\n+\n+            set discoveryList $portList\n+\n+\t\t\tforeach portItem $portList {\n+\t\t\t\tscan $portItem \"%d %d %d\" tx_c tx_l tx_p\n+\n+\t\t\t\tif [IsPOSPort $tx_c $tx_l $tx_p] {\n+\t\t\t\t\tset index   [lsearch $discoveryList $portItem]\n+\t\t\t\t\tset discoveryList [lreplace $discoveryList $index $index]\n+\t\t\t\t\tcontinue\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tif {[llength $discoveryList] } {\n+\t\t\t\tif {![set retCode [sendRouterSolicitation discoveryList]]} {\n+\t\t\t\t\twhile {$retries >= 0} {\n+                \n+\t\t\t\t\t\tset retCode $::TCL_OK\n+\t\t\t\t\t\tif {![getNeighborDiscovery discoveryList]} {\n+\t\t\t\t\t\t\tbreak\n+\t\t\t\t\t\t} else {\n+\t\t\t\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t\t\t\t\tincr retries -1\n+\t\t\t\t\t\t}\n+\t\t\t\t\t\tafter $waitTime\n+\n+\t\t\t\t\t\tsendRouterSolicitation discoveryList\n+\t\t\t\t\t}\n+\n+\t\t\t\t\t# Handle ports that didn't respond with Neighbor Advertisement.\n+\t\t\t\t\tif {[llength $discoveryList] > 0} {\n+                \n+\t\t\t\t\t\tif {[learn cget -removeOnError] == \"true\"} {\n+\t\t\t\t\t\t\tremovePorts portArray $discoveryList\n+\t\t\t\t\t\t\tset removedPorts $::true\n+\t\t\t\t\t\t} else {\n+\t\t\t\t\t\t\terrorMsg \"Error: Unable to discover neighbors on ports: $discoveryList\"\n+\t\t\t\t\t\t\tset retCode $::TCL_ERROR\n+\t\t\t\t\t\t}\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t\t\t}\n+\n+        } else {\n+            errorMsg \"Error configuring Interface Table\"\n+            set retCode $::TCL_ERROR\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+########################################################################################\n+# Procedure:    SendRouterSolicitation\n+#\n+# Description:  Send router solicitation to each port in the portList.\n+#\n+#               This command causes the router to respond with a router advertisement \n+#               where the source link-layer option is used to extract the link layer \n+#               address of the DUT.\n+#\n+# Argument(s):  PortArray:      ports array, ie: one2oneArray, many2oneArray...\n+#\n+# Returns:      ::TCL_OK or ::TCL_ERROR\n+#\n+########################################################################################\n+proc sendRouterSolicitation {PortList} \\\n+{\n+    upvar $PortList portList\n+\n+    set retCode $::TCL_OK\n+\n+    foreach portMap $portList {\n+        scan $portMap \"%d %d %d\" c l p\n+\n+        if {![interfaceTable select $c $l $p]} {\n+\n+            if {[interfaceTable sendRouterSolicitation]} {\n+                errorMsg \"Error: Unable to send router solicitation on $c $l $p\"\n+                set retCode $::TCL_ERROR\n+                break\n+            } \n+\n+        } else {\n+            errorMsg \"Error: Unable to selected interface on $c $l $p\"\n+            set retCode $::TCL_ERROR\n+            break\n+        }\n+    }\n+    after [learn cget -waitTime]\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure:    getNeighborDiscovery\n+#\n+# Description:  Store the link-layer addresses solicited.\n+#\n+# Argument(s):  PortList:  port list\n+#\n+# Returns:      ::TCL_OK or ::TCL_ERROR\n+#\n+########################################################################################\n+proc getNeighborDiscovery {PortList {MacAddrArray \"\"} {verbose false} } \\\n+{\n+    upvar $PortList         portList\n+    upvar $MacAddrArray     macAddrArray\n+\n+    set retCode $::TCL_OK\n+\n+    set waitTime     [learn cget -waitTime]\n+\n+    if { [llength $portList] > 1 } {\n+        logMsg \"\\nPerforming Neighbor Discovery on ports: $portList.\"\n+    }\n+\n+    # Read neighbors from neighbor discovery table.\n+    foreach portMap $portList {\n+        scan $portMap \"%d %d %d\" chassId cardId portId\n+\n+        # Error message for select is taken care off on the second select below\n+        if {![interfaceTable select $chassId $cardId $portId]} {\n+            interfaceTable requestDiscoveredTable\n+        } \n+    }\n+\n+    # We only wait here instead of inside the loop for each port,\n+    # make sure we wait long enough for all the ports in the list\n+    after [learn cget -waitTime]\n+\n+    foreach portMap $portList {\n+\n+        scan $portMap \"%d %d %d\" chassId cardId portId\n+\n+        set macAddrArray($chassId,$cardId,$portId) 0\n+        set message \"\"\n+\n+        if {![interfaceTable select $chassId $cardId $portId]} {\n+        \n+            set description [interfaceTable::formatEntryDescription $chassId $cardId $portId]\n+            if {![interfaceTable getDiscoveredList $description]} {\n+            \n+                            \n+                if {![discoveredList getFirstNeighbor]} {\n+                    set macAddrArray($chassId,$cardId,$portId) [discoveredNeighbor cget -macAddress]\n+                } else {\n+                    set message \"Error: Unable to get neighbor in discovery list for [getPortId $chassId $cardId $portId]\"\n+                }\n+        \n+            } else {\n+                set message \"Error: Unable to get neighbor discovery list for [getPortId $chassId $cardId $portId]\"\n+            }\n+\n+            if {[isMacAddressValid $macAddrArray($chassId,$cardId,$portId)] == $::TCL_OK} {\n+\n+                logMsg \"Neighbor Discovery Complete for [getPortId $chassId $cardId $portId]: $macAddrArray($chassId,$cardId,$portId)\"\n+                if {![port get $chassId $cardId $portId]} {\n+                    port config -DestMacAddress $macAddrArray($chassId,$cardId,$portId)\n+                }\n+                if {[port set $chassId $cardId $portId]} {\n+                    errorMsg \"Error: Unable configure [getPortId $chassId $cardId $portId] with link-layer address\"\n+                    set retCode $::TCL_ERROR\n+                }\n+\n+                set index       [lsearch  $portList $portMap]\n+                set portList [lreplace $portList $index $index]\n+\n+            } else {\n+                set retCode $::TCL_ERROR\n+            }            \n+\n+        } else {\n+            set message \"Error: Unable to select interface table for [getPortId $chassId $cardId $portId]\"\n+        }\n+\n+        if {$verbose == \"true\"} {\n+            if {[string length $message] > 0} {\n+                errorMsg $message\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+########################################################################################\n+# Procedure:    getNeighborDiscoveryPort\n+#\n+# Description:  Return link-layer address of DUT.\n+#\n+# Argument(s):  chassId\n+#               cardId\n+#               portId\n+#\n+# Returns:      ::TCL_OK or ::TCL_ERROR\n+#\n+########################################################################################\n+proc getNeighborDiscoveryPort {chassId cardId portId {verbose false} } \\\n+{\n+    set macAddrArray($chassId,$cardId,$portId) 0\n+\n+    set portList [list [list $chassId $cardId $portId]]\n+\n+    if {[getNeighborDiscovery portList macAddrArray $verbose]} {\n+        errorMsg \"Error getting Neighbor Discovery for one or more ports.\"\n+    }\n+\n+    return $macAddrArray($chassId,$cardId,$portId)\n+}\n+\n+\n+\n+########################################################################################\n+#::::::::::::                    IPX Layer Learn frames                       :::::::::::::\n+########################################################################################\n+\n+########################################################################################\n+# Procedure: sapStr2Asc\n+#\n+# Description: Converts a string into hex and pads to make it into 48 bytes. SAP frame\n+# has 48 bytes reserved for server name.\n+#\n+# Argument(s):\n+#    string to convert\n+#\n+########################################################################################\n+\n+proc sapStr2Asc {strName} \\\n+{\n+    set nameList {}\n+    for {set i 0} {$i < [string length $strName]} {incr i} {\n+        binary scan [string index $strName $i] tx_c val\n+        set hexVal [format %02x [set val]]\n+        set nameList [lappend nameList $hexVal]\n+    }\n+\n+    set currLen [string length $strName]\n+    while {$currLen < 48} {\n+        set nameList [lappend nameList \"00\"]\n+        incr currLen\n+    }\n+    return $nameList\n+}\n+\n+########################################################################################\n+# Procedure: send_ripx_frames\n+#\n+# Description: This command sends ripx frames all ports in order to advertise the\n+#               sourceNode for IPX routing\n+# The algorithm of establishing an IPX connection is as follows:\n+#    - send RIPX broadcast (requests) to the destination node's (router's) network number\n+#        from all ports in the port map\n+#    - the router responds to this request giving its network and node (MAC) adddress in\n+#        the IPX header\n+#    - to send traffic now, the sending node\n+#        * places the destination node's (router's) network, node addresses and socket number\n+#            in the destination address fields of the IPX header\n+#        * places its own network, node addresses and socket number in the source address\n+#            fields of the IPX header\n+#        * places the node (MAC) address of the router (port) in the destination address\n+#            address field of MAC header\n+#        * places its own node address in the source address field of the MAC header\n+#\n+# Argument(s):\n+#    PortArray    array of ports, ie., one2oneArray for a one2one configuration\n+#\n+########################################################################################\n+proc send_ripx_frames {PortArray {RemovedPorts \"\"}} \\\n+{\n+    global udfList\n+\n+    upvar $PortArray portArray\n+    if {[string length $RemovedPorts] > 0} {\n+        upvar $RemovedPorts removedPorts\n+    }\n+\n+    set retCode         0\n+    set removedPorts    0\n+\n+    # set the stream parameters.\n+    set preambleSize    8\n+    set framesize       [learn cget -framesize]\n+\n+    set duration    [expr [learn cget -numframes] / [learn cget -rate]]\n+\n+    stream setDefault\n+    stream config -rateMode         usePercentRate\n+    stream config -dma              stopStream\n+    stream config -fcs              good\n+    stream config -enableTimestamp  false\n+    stream config -gapUnit          gapNanoSeconds\n+\n+    # need to turn off signature...!!\n+    packetGroup setDefault\n+\n+    udf setDefault\n+    if [disableUdfs $udfList] {\n+        errorMsg \"Error disabling udfs in switchLearn for RIPx frames\"\n+        set retCode 1\n+    }\n+\n+    filterPallette setDefault\n+\n+    filter setDefault\n+    filter config -captureFilterError   errGoodFrame\n+    filter config -captureTriggerError  errGoodFrame\n+\n+    # zero stats everywhere to avoid confusion later...\n+    zeroStats portArray\n+\n+    # note - send one port at portArray time to allow time for learning\n+\n+    debugMsg \"Configuring RIPX frames...\"\n+\n+    # send RIPX on all ports involved in this map, but just send once...\n+    set ripxMap     [getAllPorts portArray]\n+\n+    # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n+    # >>>>>>>>>>>>>>>>>>>>>>>>>>  Send RIPX Frames <<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n+    # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n+\n+    # first send the RIPX broadcast request to the router asking for its addresses\n+    foreach txMap $ripxMap {\n+        scan $txMap \"%d %d %d\" tx_c tx_l tx_p\n+\n+        if {[port get $tx_c $tx_l $tx_p] == 1} {\n+            errorMsg \"port [getPortId $tx_c $tx_l $tx_p] has not been configured yet.\"\n+            continue\n+        }\n+\n+        set learnPercentRate             [expr double([learn cget -rate])/[calculateMaxRate $tx_c $tx_l $tx_p $framesize]*100.]\n+        stream config -percentPacketRate $learnPercentRate\n+\n+        stream config -name         \"RIPXStream\"\n+\n+        stream config -da       $::kBroadcastMacAddress\n+        stream config -numDA    1\n+\n+        set numAddresses        [port cget -numAddresses]\n+          stream config -sa     [port cget -MacAddress]\n+        stream config -numSA    $numAddresses\n+\n+        stream config -patternType    nonRepeat\n+        stream config -dataPattern    userpattern\n+        stream config -numFrames      [expr [learn cget -numframes] * $numAddresses]\n+        if {[expr [stream cget -numFrames]/[learn cget -rate]] > $duration} {\n+            set duration    [expr [stream cget -numFrames]/[learn cget -rate]]\n+        }\n+\n+        if [ipx get $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error getting IPx on [getPortId $tx_c $tx_l $tx_p] for RIPX frames.\"\n+            set retCode 1\n+            continue\n+        }\n+\n+        # save the original setup and restore it at the end\n+        set origSrcSocket($tx_c,$tx_l,$tx_p)    [ipx cget -sourceSocket]\n+\n+        # build the RIPX packet which is the data portion of the IPX packet\n+        ipx config -packetType        1        ;# RIP type packet\n+\n+        set RIPXNetworkNumber   {ff ff ff ff}\n+        set numHops             1\n+        set numTicks            2\n+\n+        ipx config -destNetwork     {00 00 00 00}\n+        ipx config -destNode        $::kBroadcastMacAddress\n+        ipx config -destSocket      [format %d $::kRipSocket]\n+\n+        ipx config -sourceNetwork   {00 00 00 00}\n+        ipx config -sourceNode      [port cget -MacAddress]\n+        if {$numAddresses > 1} {\n+            ipx config -sourceNodeRepeatCounter $numAddresses\n+            ipx config -sourceNodeCounterMode   ipxIncrement\n+        } else {\n+            ipx config -sourceNodeCounterMode   ipxIdle\n+        }\n+        ipx config -destNetworkCounterMode  ipxIdle\n+        ipx config -destNodeCounterMode     ipxIdle\n+        ipx config -destSocketCounterMode   ipxIdle\n+\n+        ipx config -sourceSocket        [format %d $::kRipSocket]\n+        ipx config -lengthOverride      true\n+        ipx config -length              40\n+\n+        if [ipx set $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error setting IPX parameters on [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+            continue\n+        }\n+\n+       \n+        # now build the IPX packet with the RIPX in it\n+        set streamPattern    [buildRipxPacket $::kRIPXOperation(request) $RIPXNetworkNumber $numHops $numTicks]    \n+\n+        stream config -pattern $streamPattern\n+        stream config -framesize [learn cget -framesize]\n+        if [stream set $tx_c $tx_l $tx_p 1] {\n+            errorMsg \"Error setting stream 1 on [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+            continue\n+        }\n+\n+        # need to turn off signature for ripx frames...!!\n+        if [packetGroup setTx $tx_c $tx_l $tx_p 1] {\n+            errorMsg \"Error disabling packetGroup signatures on stream 1, [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+            continue\n+        }\n+\n+        # set up the pattern filter\n+        filterPallette config -DA1 [port cget -MacAddress]\n+        if [filterPallette set $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error setting filter pallette for [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+            continue\n+        }\n+\n+        # set the filter parameters on the receive port\n+        debugMsg \"    configuring filters\"\n+        filter config -captureFilterEnable  true\n+        filter config -captureTriggerEnable true\n+        if [filter set $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error setting filters on [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+            continue\n+        }\n+\n+        if [filterPallette write $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error writing filterPallette to hardware for RIPX frames\"\n+            set retCode 1\n+            continue\n+        }\n+\n+    }\n+\n+    writeConfigToHardware portArray\n+    if [startCapture ripxMap] {\n+        errorMsg \"Error starting capture.\"\n+        set retCode 1\n+    }\n+\n+    foreach txMap [lnumsort $ripxMap] {\n+        scan $txMap \"%d %d %d\" tx_c tx_l tx_p\n+\n+        logMsg \"sending RIPX broadcast frame from [getPortId $tx_c $tx_l $tx_p]\"\n+    }\n+\tset retCode [startStaggeredTx ripxMap]\n+\n+    # wait the min refresh for 10/100 cards to let the stats update...\n+    after 800\n+\n+    after [learn cget -waitTime]\n+    # Wait for all frames to be transmitted..\n+    for {set timeCtr 1} {$timeCtr <= $duration} {incr timeCtr} {\n+        logMsg  \"Transmitted $timeCtr of $duration seconds\"\n+        after 1000\n+    }\n+\n+    checkAllTransmitDone ripxMap\n+\n+    foreach txMap [lnumsort $ripxMap] {\n+        scan $txMap \"%d %d %d\" tx_c tx_l tx_p\n+\n+        # decode the RIPX response and get the router's node address\n+        set maxRip  100\n+\n+        if [port get $tx_c $tx_l $tx_p] {\n+            errorMsg \"port [getPortId $tx_c $tx_l $tx_p] has not been configured yet.\"\n+            continue\n+        }\n+\n+        if [captureBuffer get $tx_c $tx_l $tx_p 1 $maxRip] {\n+            errorMsg \"Error getting capture buffer from frame(s) 1 to 1 for [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+            continue\n+        }\n+\n+        set found 0\n+        set nFrame 1\n+        while {[captureBuffer getframe $nFrame] != 1 && $nFrame <= $maxRip} {\n+            debugMsg \"Getting frame $nFrame from Buffer   .....\"\n+            set capframe    [captureBuffer cget -frame]\n+\n+            if {[ipx decode $capframe] == 0 && ([ipx cget -destSocket] == 1107) && ([ipx cget -destNode] == [string toupper [port cget -MacAddress]])} {\n+                logMsg \"Got RIPX RESPONSE on [getPortId $tx_c $tx_l $tx_p]\"\n+                set found 1\n+\n+                ipx config -sourceSocket    $origSrcSocket($tx_c,$tx_l,$tx_p)\n+                ipx config -destNetwork     [ipx cget -sourceNetwork]\n+                ipx config -sourceNetwork   [ipx cget -destNetwork]\n+\n+                set sourceNode              [ipx cget -destNode]\n+                set destNode                [ipx cget -sourceNode]\n+                ipx config -sourceNode      $sourceNode\n+                ipx config -destNode        $destNode\n+\n+                if [ipx set $tx_c $tx_l $tx_p] {\n+                    errorMsg \"Error setting IPX parameters for [getPortId $tx_c $tx_l $tx_p]\"\n+                    set retCode 1\n+                    continue\n+                }\n+\n+                if [port get $tx_c $tx_l $tx_p] {\n+                    errorMsg \"Error getting port [getPortId $tx_c $tx_l $tx_p]\"\n+                    set retCode 1\n+                    continue\n+                }\n+                port config -DestMacAddress    [ipx cget -destNode]\n+                if [port set $tx_c $tx_l $tx_p] {\n+                    errorMsg \"Error setting port [getPortId $tx_c $tx_l $tx_p]\"\n+                    set retCode 1\n+                    continue\n+                }\n+                break\n+            }\n+            incr nFrame\n+        }\n+\n+        if {$found == 0} {\n+            errorMsg \"No RIPX response frames received on [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+return -code error\n+            continue\n+        }\n+    }\n+\n+    if {$retCode == 0 && [fastpath cget -enable] == \"true\"} {\n+        if [send_fastpath_frames portArray] {\n+            errorMsg \"Error sending fastpath frames\"\n+            set retCode 1\n+        }\n+    }\n+\n+    stream setDefault\n+\n+    logMsg \"RIPX frames sent ...\"\n+    return $retCode\n+}\n+\n+########################################################################################\n+# Procedure: send_sap_server_frames\n+#\n+# Description: This command sends IPX SAP broadcast frames in order to advertise the\n+#               port as portArray server node for IPX routing.\n+#\n+# Argument(s):\n+#    PortArray    array of ports, ie., one2oneArray for portArray one2one configuration\n+#\n+########################################################################################\n+proc send_sap_server_frames {PortArray} \\\n+{\n+    global udfList\n+\n+    upvar $PortArray portArray\n+    set retCode 0\n+\n+    # set the stream parameters.\n+    set preambleSize                8\n+    set framesize                   [learn cget -framesize]\n+\n+    stream config -rateMode         usePercentRate\n+    stream config -dma              stopStream\n+    stream config -fcs              good\n+    stream config -enableTimestamp  false\n+    stream config -numFrames        [learn cget -numframes]\n+    stream config -gapUnit          gapNanoSeconds\n+\n+    udf setDefault\n+    disableUdfs $udfList\n+\n+    filterPallette setDefault\n+\n+    filter setDefault\n+    filter config -captureTriggerDA     addr1\n+    filter config -captureFilterError   errGoodFrame\n+    filter config -captureTriggerError  errGoodFrame\n+\n+    # zero stats everywhere to avoid confusion later...\n+    zeroStats portArray\n+\n+    # note - send one port at portArray time to allow time for learning\n+\n+    debugMsg \"Configuring SAP frames...\"\n+\n+    # send sap on all ports involved in this map, but just send once...\n+    foreach txMap [array names portArray] {\n+        if {![info exists sapMap($txMap]} {\n+            set sapMap($txMap)    1\n+        }\n+\n+        foreach rxMap $portArray($txMap) {\n+            scan $rxMap \"%d %d %d\" tx_c tx_l tx_p\n+            if {![info exists sapMap($tx_c,$tx_l,$tx_p)]} {\n+                set sapMap($tx_c,$tx_l,$tx_p)    1\n+            }\n+        }\n+    }\n+\n+    # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n+    # >>>>>>>>>>>>>>>>>>>  SAP Broadcast - Advertise Servers <<<<<<<<<<<<<<<<<<<\n+    # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n+\n+    foreach txMap [lnumsort [array names sapMap]] {\n+        scan $txMap \"%d,%d,%d\" tx_c tx_l tx_p\n+        if {[port get $tx_c $tx_l $tx_p] == 1} {\n+            logMsg \"port [getPortId $tx_c $tx_l $tx_p] has not been configured yet.\"\n+            continue\n+        }\n+\n+        if [ipx get $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error getting IPx on [getPortId $tx_c $tx_l $tx_p] for SAP frames.\"\n+            set retCode 1\n+            continue\n+        }\n+        # if this port is set up as SERVER, then send SAP broadcast announcing iteslf\n+        if {[ipx cget -svrClientType] == 1} {\n+            set txSA  [port cget -MacAddress]\n+\n+            set learnPercentRate [expr double([learn cget -rate])/[calculateMaxRate $tx_c $tx_l $tx_p $framesize]*100.]\n+            stream config -percentPacketRate $learnPercentRate\n+\n+            stream config -name    \"SapBroadcastStream\"\n+\n+            stream config -da      $::kBroadcastMacAddress\n+            stream config -numDA   1\n+\n+            stream config -sa      $txSA\n+            stream config -numSA   1\n+\n+            stream config -patternType    nonRepeat\n+            stream config -dataPattern    userpattern\n+\n+            set netAddress  [ipx cget -sourceNetwork]\n+            set nodeAddress [port cget -MacAddress]\n+\n+            set hops {00 01}\n+            ipx config -packetType     4\n+\n+            ipx config -destSocket     $::kSapSocket\n+            ipx config -sourceNode     $txSA\n+            ipx config -sourceNetwork  {00 00 00 00}\n+            ipx config -destNetwork    {00 00 00 00}\n+\n+            set serverName [sapStr2Asc \"ixiaServer$tx_c$tx_l$tx_p\"]\n+\n+            if [ipx set $tx_c $tx_l $tx_p] {\n+                errorMsg \"Error setting IPX packet on [getPortId $tx_c $tx_l $tx_p]\"\n+                set retCode 1\n+            }\n+\n+            # build the SAP broadcast packet (which is service type General Service Response)\n+            set streamPattern [buildSapPacket $::kSapOperation(response) $::kSapServiceType(fileServer) \\\n+                                         $serverName $netAddress $nodeAddress $::kSapSocket $hops]\n+                                                         \n+            stream config -pattern $streamPattern\n+\n+            set IPXheaderLen    30\n+            set DASATypeLen     14\n+            set CRCLen          4\n+            stream config -framesize [expr [llength [ipx cget -data]] + $IPXheaderLen + $DASATypeLen + $CRCLen]\n+\n+            if [stream set $tx_c $tx_l $tx_p 1] {\n+                errorMsg \"Error setting stream 1 on [getPortId $tx_c $tx_l $tx_p] for SAP frames.\"\n+                set retCode 1\n+            }\n+\n+            if [stream write $tx_c $tx_l $tx_p 1] {\n+                errorMsg \"Error writing stream to hardware for SAP frames\"\n+                set retCode 1\n+                continue\n+            }\n+\n+            logMsg \"sending SAP broadcast frame from [getPortId $tx_c $tx_l $tx_p] server, Network address: [ipx cget -sourceNetwork]\"\n+            if [startPortTx $tx_c $tx_l $tx_p] {\n+                errorMsg \"Error starting Tx on port [getPortId $tx_c $tx_l $tx_p]\"\n+                set retCode 1\n+            }\n+\n+            # wait for portArray second portArray look for nearest SAP response on each port\n+            after 1000\n+\n+            # make sure something got transmitted\n+            set txNumFrames    [stat cget -counterVal]\n+            if {$txNumFrames == 0} {\n+                errorMsg \"Error transmitting SAP broadcast frames for SERVER on [getPortId $tx_c $tx_l $tx_p]\"\n+                set retCode 1\n+                continue\n+            }\n+        }\n+    }\n+\n+    logMsg \"SAP broadcast frames sent...\"\n+    return $retCode\n+}\n+\n+########################################################################################\n+# Procedure: send_sapgns_frames\n+#\n+# Description: This command sends SAP GNS frames on all ports for IPX routing\n+#\n+# Argument(s):\n+#    PortArray    array of ports, ie., one2oneArray for portArray one2one configuration\n+#\n+########################################################################################\n+proc send_sapgns_frames {PortArray} \\\n+{\n+    global udfList\n+\n+    upvar $PortArray portArray\n+    set retCode 0\n+\n+    # set the stream parameters.\n+    set preambleSize        8\n+    set framesize           [learn cget -framesize]\n+\n+    stream config -rateMode         usePercentRate\n+    stream config -dma              stopStream\n+    stream config -fcs              good\n+    stream config -enableTimestamp  false\n+    stream config -numFrames        [learn cget -numframes]\n+    stream config -gapUnit          gapNanoSeconds\n+\n+    udf setDefault\n+    disableUdfs $udfList\n+\n+    filterPallette setDefault\n+\n+    filter setDefault\n+    filter config -captureTriggerDA     addr1\n+    filter config -captureFilterError   errGoodFrame\n+    filter config -captureTriggerError  errGoodFrame\n+\n+    # zero stats everywhere to avoid confusion later...\n+    zeroStats portArray\n+\n+    # note - send one port at portArray time to allow time for learning\n+\n+    debugMsg \"Configuring SAP frames...\"\n+\n+    # send sap on all ports involved in this map, but just send once...\n+    foreach txMap [array names portArray] {\n+        if {![info exists sapMap($txMap]} {\n+            set sapMap($txMap)    1\n+        }\n+\n+        foreach rxMap $portArray($txMap) {\n+            scan $rxMap \"%d %d %d\" tx_c tx_l tx_p\n+            if {![info exists sapMap($tx_c,$tx_l,$tx_p)]} {\n+                set sapMap($tx_c,$tx_l,$tx_p)    1\n+            }\n+        }\n+    }\n+\n+    # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n+    # >>>>>>>>>>>>>>>>>>>>  SAP Get Nearest Server Request <<<<<<<<<<<<<<<<<<<<<\n+    # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n+    foreach txMap [lnumsort [array names sapMap]] {\n+        scan $txMap \"%d,%d,%d\" tx_c tx_l tx_p\n+        if {[port get $tx_c $tx_l $tx_p] == 1} {\n+            logMsg \"port [getPortId $tx_c $tx_l $tx_p] has not been configured yet.\"\n+            continue\n+        }\n+\n+        set txSA [port cget -MacAddress]\n+\n+        if [ipx get $tx_c $tx_l $tx_p] {\n+            errorMsg \"Error getting IPx on [getPortId $tx_c $tx_l $tx_p] for SAP frames.\"\n+            set retCode 1\n+            continue\n+        }\n+        # if this port is set up as CLIENT, then send SAP Get Nearest server request\n+        if {[ipx cget -svrClientType] == 2} {\n+            filter config -captureFilterPattern         any\n+            filter config -captureFilterError           errGoodFrame\n+            filter config -captureFilterFrameSizeEnable false\n+            filter config -captureFilterFrameSizeEnable false\n+            filter config -captureTriggerError          errGoodFrame\n+\n+            if [startPortCapture $tx_c $tx_l $tx_p] {\n+                errorMsg \"Error starting Capture on port [getPortId $tx_c $tx_l $tx_p]\"\n+                set retCode 1\n+            }\n+\n+            set learnPercentRate             [expr double([learn cget -rate])/[calculateMaxRate $tx_c $tx_l $tx_p $framesize]*100.]\n+            stream config -percentPacketRate $learnPercentRate\n+\n+            stream config -name     \"SapGNSStream\"\n+\n+            stream config -da       [port cget -DestMacAddress]\n+            stream config -numDA    1\n+\n+              stream config -sa     $txSA\n+            stream config -numSA    1\n+\n+            stream config -patternType    nonRepeat\n+            stream config -dataPattern    userpattern\n+\n+            set netAddress    [ipx cget -sourceNetwork]\n+            set nodeAddress   [port cget -MacAddress]\n+            set hops {00 01}\n+\n+            ipx config -packetType      4\n+\n+            ipx config -destNode        $::kBroadcastMacAddress\n+            ipx config -destSocket      $::kSapSocket\n+\n+            ipx config -sourceNode      $txSA\n+            ipx config -sourceSocket    $::kSapSocket\n+\n+            set serverName [sapStr2Asc \"ixiaServer$tx_c$tx_l$tx_p\"]        ;# this is ignored by the router\n+\n+            if [ipx set $tx_c $tx_l $tx_p] {\n+                errorMsg \"Error setting IPX packet on [getPortId $tx_c $tx_l $tx_p]\"\n+                set retCode 1\n+            }\n+\n+            set streamPattern [buildSapPacket $::kSapOperation(getNearestServerRequest) $::kSapServiceType(fileServer) \\\n+                                           $serverName $netAddress $nodeAddress $::kSapSocket $hops]    \n+    \n+            stream config -pattern $streamPattern\n+            stream config -framesize 64\n+\n+            if [stream set $tx_c $tx_l $tx_p 1] {\n+                errorMsg \"Error setting stream 1 on [getPortId $tx_c $tx_l $tx_p] for SAP GNS frames.\"\n+                set retCode 1\n+            }\n+\n+\n+            if [stream write $tx_c $tx_l $tx_p 1] {\n+                errorMsg \"Error writing stream to hardware for SAP GNS frames\"\n+                set retCode 1\n+                continue\n+            }\n+\n+            logMsg \"sending SAP GNS request frame from [getPortId $tx_c $tx_l $tx_p] client, Network address: [ipx cget -sourceNetwork]\"\n+            if [startPortTx $tx_c $tx_l $tx_p] {\n+                errorMsg \"Error starting Tx on port [getPortId $tx_c $tx_l $tx_p]\"\n+                set retCode 1\n+            }\n+\n+            # wait for portArray second portArray look for nearest SAP response on each port\n+            after 1000\n+\n+            # make sure something got transmitted\n+            set txNumFrames    [stat cget -counterVal]\n+            if {$txNumFrames == 0} {\n+                errorMsg \"Error transmitting SAP GNS frames for CLIENT on [getPortId $tx_c $tx_l $tx_p]\"\n+                set retCode 1\n+                continue\n+            }\n+\n+            # decode the SAP GNS response and get the server's net address\n+            if [capture get $tx_c $tx_l $tx_p] {\n+                errorMsg \"Error getting capture data on [getPortId $tx_c $tx_l $tx_p]\"\n+                set retCode 1\n+                continue\n+            }\n+    \n+            set numCapturedFrames [capture cget -nPackets]\n+            debugMsg \"numCapturedFrames = $numCapturedFrames\"\n+\n+            if {$numCapturedFrames < 1} {\n+                logMsg \"No SAP GNS response frames received on [getPortId $tx_c $tx_l $tx_p]\"\n+            } else {\n+                # look for SAP GNS responses\n+                if [captureBuffer get $tx_c $tx_l $tx_p 1 $numCapturedFrames] {\n+                    errorMsg \"Error getting capture buffer from frame(s) 1 to 1 for [getPortId $tx_c $tx_l $tx_p]\"\n+                    set retCode 1\n+                    continue\n+                }\n+                set found 0\n+                for {set nFrame 1} {$nFrame <= $numCapturedFrames} {incr nFrame} {\n+                    debugMsg \"Getting frame $nFrame from Buffer   .....\"\n+                    if [captureBuffer getframe $nFrame] {\n+                        errorMsg \"Error getting frame $nFrame from capture buffer for [getPortId $tx_c $tx_l $tx_p]\"\n+                        set retCode 1\n+                        continue\n+                    }\n+                    set capframe    [captureBuffer cget -frame]\n+                    debugMsg $capframe\n+\n+                    if [ipx get $tx_c $tx_l $tx_p] {\n+                        errorMsg \"Error getting IPx on [getPortId $tx_c $tx_l $tx_p] for SAP frames.\"\n+                        set retCode 1\n+                        continue\n+                    }\n+\n+                    set ipxPacketType   [lindex $capframe 19]\n+                    set sapOperType     [lrange $capframe 44 45]\n+                    set destSocket      [lrange $capframe 106 107]\n+                    set serverType      [lrange $capframe 46 47]\n+                    set serverNetAddr   [lrange $capframe 96 99]\n+\n+                    if {($sapOperType == \"00 04\") && ($destSocket == \"04 52\") && ($serverType == $::kSapServiceType(fileServer))} {\n+                        logMsg \"Got SAP GNS RESPONSE on [getPortId $tx_c $tx_l $tx_p]\"\n+                        set found 1\n+                        break\n+                    }\n+                }\n+\n+                if {$found == 0} {\n+                    logMsg \"No SAP GNS response frames received on [getPortId $tx_c $tx_l $tx_p]\"\n+                    continue\n+                }\n+\n+                ipx config -destNetwork $serverNetAddr\n+                if [ipx set $tx_c $tx_l $tx_p] {\n+                    errorMsg \"Error setting IPX parameters for [getPortId $tx_c,$tx_c,$tx_p]\"\n+                }\n+            }\n+        }\n+    }\n+\n+    logMsg \"SAP GNS frames sent...\"\n+    return $retCode\n+}\n+\n+\n+\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/tclServer.tcl b/dep/tclclient/ixTcl1.0/Generic/tclServer.tcl\nnew file mode 100644\nindex 00000000..55091d75\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/tclServer.tcl\n@@ -0,0 +1,458 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: tclServer.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+# Revision Log:\n+# 3-1-2001 Michael Githens\n+#\n+# Description: This file contains procedures that handle any connections with\n+#              the Tcl Server.\n+#\n+# NOTE: All routines in this file must be able to stand on their own.  There\n+#       can be no dependence on ScriptMate\n+#\n+###############################################################################\n+\n+namespace eval tclServer \\\n+{\n+    variable tclServerName      \"\"\n+    variable tclServerConnected 0\n+}\n+# End of tclServer namespace\n+\n+# The following are the procedures that are meant to be called from outside\n+# of the namespace.  The rest are just helper routines for use within the\n+# namespace.\n+#\n+#  tclServer::getTclServerName\n+#  tclServer::setTclServerName\n+#  tclServer::disconnectTclServer\n+#  tclServer::connectToTclServer serverName errMsg clientPort\n+#  tclServer::isTclServerConnected\n+#\n+\n+\n+###############################################################################\n+# Procedure:   tclServer::getTclServerName\n+#\n+# Description: Retrieve the hostname of tcl server.\n+#\n+# Arguments:   None\n+#\n+# Returns:     Hostname of the tcl server.\n+###############################################################################\n+proc tclServer::getTclServerName {} \\\n+{\n+    variable tclServerName\n+\n+    return  $tclServerName\n+}\n+\n+\n+###############################################################################\n+# Procedure:   tclServer::setTclServerName\n+#\n+# Description: Sets the hostname of tcl server.\n+#\n+# Arguments:   hostname - the new hostname\n+#\n+# Returns:     None\n+###############################################################################\n+proc tclServer::setTclServerName { hostname } \\\n+{\n+    variable tclServerName\n+\n+    set tclServerName $hostname\n+\n+    return\n+}\n+\n+\n+###############################################################################\n+# Procedure: tclServer::disconnectTclServer\n+#\n+# Description: Disconnects from the TclServer socket\n+#\n+# Results: Returns the code from the clientClose call.\n+###############################################################################\n+proc tclServer::disconnectTclServer {} \\\n+{\n+    global   ixTclSvrHandle ixErrorInfo\n+\n+    variable tclServerName\n+    variable tclServerConnected\n+\n+    set retCode 0\n+\n+    if {[isUNIX]} {\n+        # We only want to see this message on unix machines.  We do not want \n+        # to see it on windows, because it is meaningless.\n+        logMsg \"Disconnecting from Tcl Server ...\"\n+    }\n+    if {[info exists ixTclSvrHandle]} {\n+        set retCode [clientClose $ixTclSvrHandle]\n+        catch {unset ixTclSvrHandle}\n+    }\n+    set tclServerConnected 0\n+    set tclServerName      \"\"\n+    set ixErrorInfo        \"\"\n+\n+    return $retCode\n+}\n+\n+\n+###############################################################################\n+# Procedure: tclServer::read\n+#\n+# Description: Reads the buffer from the TclServer socket\n+#\n+# Results: \n+###############################################################################\n+proc tclServer::read {socket} \\\n+{\n+    variable buffer\n+\n+    set buffer \"\"\n+    set length -1\n+\n+\tif {[eof $socket] || [catch {gets $socket buffer}]} {\n+\t\t# end-of-file or abnormal connection drop\n+        catch {close $socket}\n+        debugMsg \"Close $socket\"\n+        return -code error -errorinfo \"Socket closed prematurely..\"\n+    } else {\n+        debugMsg \"buffer=$buffer\"\n+    }\n+}\n+\n+\n+###############################################################################\n+# Procedure: tclServer::connectToTclServer\n+#\n+# Description: This procedure connects the remote tcl session to a\n+#              TclServer/proxy.\n+#\n+# Side Effects: If the connection is successful, then define the remote \n+#               commands and functions that can now be accessed.\n+#\n+# Arguments:\n+#    serverName: Hostname or IP address of the machine to connect with.\n+#    ErrMsg: Pass by reference.  If there is an error connecting, this will contain the error message.\n+#    clientPort: Optional.  The port number to use.\n+#\n+# Results: Returns 0 on success and 1 on failure\n+###############################################################################\n+proc tclServer::connectToTclServer { serverName ErrMsg {clientPort 4555} } \\\n+{\n+    global halCommands halFuncs ixTclSvrHandle ixErrorInfo halRedefineCommands\n+    variable tclServerConnected\n+    variable tclServerName\n+\n+    upvar $ErrMsg errMsg\n+    set errMsg \"\"\n+\n+    set retCode 0\n+\n+    set ixErrorInfo \"\"\n+\n+    logMsg \"Connecting to Tcl Server $serverName ...\"\n+    if {[info exists ixTclSvrHandle]} {\n+        catch { clientClose $ixTclSvrHandle }\n+        catch { unset ixTclSvrHandle }\n+    }\n+\n+    set clientSocket [clientOpen $serverName $clientPort]\n+    set ixTclSvrHandle $clientSocket\n+\n+    if {$clientSocket == {}} {\n+        set tclServerConnected 0\n+        set errMsg \"Error opening client socket.\"\n+        set retCode 1\n+    } else {\n+        set tclServerConnected 1\n+        set tclServerName      $serverName\n+\n+\t    fconfigure $clientSocket -buffering line -translation crlf\n+        fileevent  $clientSocket readable [list tclServer::read $clientSocket]\n+\n+        if [catch {clientSend $ixTclSvrHandle \"package req IxTclHal\"} result] {\n+            errorMsg $result\n+        }\n+\n+        remoteDefine $halCommands\n+        remoteDefine $halFuncs\n+\n+        getConstantsValue $clientSocket\n+\n+        if { [isUNIX] } {\n+            foreach {command} $halRedefineCommands {\n+                redefineCommand $command\n+            }\n+        }\n+    }\n+\n+    # Warn user if using different Ixia versions on client & server.\n+    if {[isUNIX]} {\n+        if {[isTclServerConnected]} {\n+            set clientVersion $::env(IXIA_VERSION)\n+            set clientVers [scan $clientVersion \"%d.%d\" clientMajor clientMinor]\n+\n+            set serverVers [scan [version cget -ixTclHALVersion] \"%d.%d\" serverMajor serverMinor]\n+            set serverVersion [format \"%d.%d\" $serverMajor $serverMinor]\n+\n+            if {$clientVers != 2 || $serverMajor != $clientMajor || $serverMinor < $clientMinor} {\n+                set retCode 1\n+                set errMsg \"WARNING: Tcl Server and Client are running incompatible Ixia Software Versions\"\n+                append errMsg \"\\n\\tTcl Server: $serverVersion\"\n+                append errMsg \"\\n\\tTcl Client: $clientVersion\\n\\n\"\n+                logMsg \"$errMsg\"\n+                set ixErrorInfo $errMsg\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+###############################################################################\n+# Procedure: tclServer::isTclServerConnected\n+#\n+# Description: Tells if the there is a connection to a tcl server\n+#\n+# Results: Returns the value of the tclServerConnected variable\n+###############################################################################\n+proc tclServer::isTclServerConnected {} \\\n+{\n+    variable tclServerConnected\n+    return $tclServerConnected\n+}\n+\n+\n+###############################################################################\n+# Procedure: tclServer::setTclServer\n+#\n+# Description: Create a window that will ask for the location of the tcl\n+#              server.  Only used on Unix and Linux platforms.\n+#\n+# Arguments:\n+#    warningMsg - the text to place next to the warning sign\n+###############################################################################\n+proc tclServer::setTclServer {warningMsg} \\\n+{\n+    variable tclServerName\n+    variable tclServerConnected\n+\n+    # Return if not on unix or linux\n+    if {[isUNIX] == 0} {\n+        # Always let windows think it is connected\n+        set tclServerConnected 1\n+        return\n+    }\n+\n+    set tclServerDlg .tclServer\n+\n+    # If it already exists, destroy it.\n+    if {[winfo exists $tclServerDlg]} {\n+        catch {destroy $tclServerDlg}\n+    }\n+\n+    # Create the new top level window and make it transient to the top\n+    toplevel $tclServerDlg -class Dialog\n+    wm withdraw $tclServerDlg\n+    wm title $tclServerDlg \"Tcl Server\"\n+\n+    # Create a frame and the entry for the tcl server value\n+    set serverFrame [frame $tclServerDlg.frame]\n+    set serverLabel [label $serverFrame.label -text \"Hostname: \" -width 10]\n+    set serverEntry [entry $serverFrame.entry -width 20]\n+\n+    # Bind the enter key to the window. It will be the same as clicking connect\n+    bind $tclServerDlg <Key-Return> \"[namespace current]::connectButton \\\n+            $tclServerDlg $serverEntry \\\"$warningMsg\\\"\"\n+\n+    # Create a warning note about the consequences of not being connected\n+    set serverWarning [label $serverFrame.warning -text \"WARNING: \" \\\n+            -fg red]\n+    set serverMessage [label $serverFrame.message -text $warningMsg]\n+\n+    # Create the connect and cancel buttons\n+    set connectButton [button $tclServerDlg.connect -text \"Connect\" -width 6 \\\n+            -command \"[namespace current]::connectButton $tclServerDlg \\\n+            $serverEntry \\\"$warningMsg\\\"\"]\n+    set cancelButton [button $tclServerDlg.cancel -text \"Cancel\" -width 6 \\\n+            -command \"[namespace current]::cancelButton $tclServerDlg \\\n+            $serverEntry\"]\n+\n+    # Grid the entry and warning into the frame\n+    grid $serverLabel   -row 0 -column 0 -padx 5  -pady 5 -sticky wens\n+    grid $serverEntry   -row 0 -column 1 -padx 10 -pady 5 -sticky wens\n+    grid $serverWarning -row 1 -column 0 -pady 10 -sticky ens\n+    grid $serverMessage -row 1 -column 1 -pady 10 -sticky wns\n+\n+    # Grid the frame and the buttons into the dialog\n+    grid $serverFrame   -row 0 -column 0 -padx 5 -pady 5 -sticky wens \\\n+            -columnspan 2\n+    grid $connectButton -row 1 -column 0 -padx 5 -pady 5 -sticky ens\n+    grid $cancelButton  -row 1 -column 1 -padx 5 -pady 5 -sticky wns\n+\n+    # Make the first row and the second column expandable\n+    grid rowconfigure $tclServerDlg 0 -weight 1\n+\n+    # Set the entry with the currently saved value\n+    if {[string compare $tclServerName \"\"] != 0} {\n+        $serverEntry insert 0 $tclServerName\n+    } else {\n+        $serverEntry insert 0 [testConfig::getTestConfItem serverName]\n+    }\n+\n+    # Bring up the dialog and set its size\n+    wm deiconify $tclServerDlg\n+    wm minsize $tclServerDlg 325 150\n+    wm resizable $tclServerDlg 0 0\n+\n+    # Make the user do something in this window before continuing\n+    focus $tclServerDlg\n+    grab $tclServerDlg\n+    tkwait window $tclServerDlg\n+\n+    return\n+}\n+\n+\n+###############################################################################\n+# Procedure: tclServer:connectButton\n+#\n+# Description: Called when the connect button on the set tcl server window is\n+#              pressed.  This will \n+#              1. If already connected, save any values that need to carry\n+#                 across to the new connection and then disconnect.\n+#              2. Connect to the newly chosen tcl server.\n+#              3. Restore any saved settings from step 1.\n+#\n+# Arguments:\n+#    tclServerDlg - The widget name for the set tcl server dialog\n+#    serverEntry - The entry widget that contains the tcl server data\n+#    warningMsg - If failure to connect, the message to pass to the dialog\n+###############################################################################\n+proc tclServer::connectButton { tclServerDlg serverEntry warningMsg } \\\n+{\n+    variable tclServerName\n+    variable tclServerConnected\n+\n+    # If connected, we first need to disconnect\n+    set continueFlag 1\n+\n+    if {$tclServerConnected} {\n+        if { [llength [smChassisUtils::getHostName]] > 0 } {\n+            set    message \"Reconnecting to Tcl Server will cause reconnecting\"\n+            append message \"\\nto all configured chassis.\\n\\nDo you want to continue?\"\n+            set answer [tk_messageBox -parent $tclServerDlg -title \"Warning\" -type yesno \\\n+                    -icon warning -message $message]\n+\n+            if { $answer == \"no\" } {\n+                catch {destroy $tclServerDlg}\n+                set continueFlag 0\n+            }\n+        }\n+\n+        if { $continueFlag == 1 } {\n+            tclServer::disconnectTclServer\n+        }\n+    }\n+\n+    if { $continueFlag == 1 } {\n+\n+        set tclServerName [$serverEntry get]\n+\n+        testConfig::setTestConfItem serverName $tclServerName\n+\n+        # Connect to this server\n+        $tclServerDlg configure -cursor watch\n+        set retcode [tclServer::connectToTclServer $tclServerName errMsg]\n+\n+        if {$retcode == 0} {\n+            setConnectChassisFlag \"continue\" \n+            smGlobalChassis::reconnect\n+    \t    $tclServerDlg configure -cursor arrow\n+            catch {destroy $tclServerDlg}\n+        } else {\n+            $tclServerDlg configure -cursor arrow\n+            # Could not connect to tcl server, ask them again\n+            set msg \"Could not connect to Tcl Server on $tclServerName.\\n\"\n+            append msg $errMsg\n+            tk_messageBox -parent $tclServerDlg -title \"Tcl Server\" -type ok \\\n+                    -icon error -message $msg\n+            tclServer::setTclServer $warningMsg\n+\n+            set tclServerName \"\"\n+        }\n+    }\n+\n+    return\n+}\n+\n+\n+###############################################################################\n+# Procedure: tclServer:cancelButton\n+#\n+# Description: Called when the cancel button on the set tcl server window is\n+#              pressed.  This will \n+#\n+# Arguments:\n+#    tclServerDlg - The widget name for the set tcl server dialog\n+#    serverEntry - The entry widget that contains the tcl server data\n+###############################################################################\n+proc tclServer::cancelButton { tclServerDlg serverEntry } \\\n+{\n+    variable tclServerConnected\n+\n+    set tclServerName [$serverEntry get]\n+\n+    # Set the server name\n+    testConfig::setTestConfItem serverName $tclServerName\n+\n+    if {[info exists tclServerConnected] == 0} {\n+        set tclServerConnected 0\n+    }\n+\n+    # Destroy the dialog\n+    catch {destroy $tclServerDlg}\n+\n+    return\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/testCmdControl.tcl b/dep/tclclient/ixTcl1.0/Generic/testCmdControl.tcl\nnew file mode 100644\nindex 00000000..74ea02b8\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/testCmdControl.tcl\n@@ -0,0 +1,538 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: testCmdControl.tcl\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t01-06-1999\tHS\tGenesis\n+#\n+# Description: This file contains the commands for all the tests. When a new test\n+# is added, create a new proc for that test here.\n+#\n+##################################################################################\n+\n+\n+########################################################################################\n+# Procedure: parseCmd\n+#\n+# Description: This command parses the test parameters and calls the appropriate functions.\n+#\n+########################################################################################\n+proc parseCmd {testName {method_name \"\"} {Args {}}} \\\n+{\n+    upvar $Args args\n+\n+    set retCode 0\n+\n+    switch $method_name {\n+        \"config\" -\n+        \"configure\" {\n+            configureOptions $testName args\n+        }\n+        \"cget\" {\n+            set retCode [cgetOptions $testName args]\n+        }\n+        \"exists\" {\n+            set retCode [existsOptions $testName args]\n+        }\n+        \"start\" {\n+            set retCode [startOptions $testName args]\n+        }\n+        \"registerResultVars\" {\n+            set retCode [registerResultVarsOptions $testName args]\n+        }\n+        \"getType\" {\n+            set retCode [getParmProperty $testName type $args]\n+        }\n+        \"getValidRange\" {\n+            set retCode [getParmProperty $testName validRange $args]\n+        }\n+        \"getValidValues\" {\n+            set retCode [getParmProperty $testName validValues $args]\n+        }\n+        \"getValidateProc\" {\n+            set retCode [getParmProperty $testName validateProc $args]\n+        }\n+        \"getHelp\" {\n+            set retCode [getParmProperty $testName help $args]\n+        }\n+        \"get\" -\n+        \"set\" {\n+\t        set mname [format \"%s::_%s\" $testName $method_name]\n+\t        set retCode [uplevel $mname $args]\n+        }\n+        default {\n+\t        set mname [format \"%s::%s\" $testName $method_name]\n+\n+            if [catch {uplevel $mname $args} retCode] {\n+                set testMethods [format \"%s%s\" $testName Methods]\n+                global $testMethods\n+\n+                set methods [array names ${testMethods}]\n+                set methods [lsort [lappend methods exists]]\n+\n+                error \"$testName methods : { $methods }\"\n+                return\n+            }\n+        }\n+    }\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: configureOptions\n+#\n+# Description: This command is used to configure the parameters.\n+#\n+########################################################################################\n+proc configureOptions {testName arguments} \\\n+{\n+    upvar $arguments args\n+\n+    set testMethods [format \"%s%s\" $testName Methods]\n+    set testParms   [format \"%s%s\" $testName Parms]\n+    set testConfigVals   [format \"%s%s\" $testName ConfigVals]\n+\n+\tglobal $testMethods $testParms $testConfigVals\n+\n+\tset argLen [llength $args]\n+\tset type $testName\n+\n+\t# if no option name was passed then display all options available for config\n+\tif {$argLen == 0} {\n+\t\tset errMsg \"Usage: $type config \"\n+\t\tforeach op [set ${testMethods}(config)] {\n+\t\t\tset errMsg  [format \"%s\\n       -$op  <value>\" $errMsg]\n+\t\t}\n+        error $errMsg\n+\t\treturn\n+\t}\n+\n+\tif {[string index [lindex $args 0] 0] != \"-\"} {\n+\t\tset errMsg \"Usage: $type config \"\n+\t\tforeach op [set ${testMethods}(config)] {\n+\t\t\tset errMsg  [format \"%s\\n       -$op  <value>\" $errMsg]\n+\t\t}\n+        error $errMsg\n+\t\treturn\n+\t}\n+\tset opt [lindex [string trimleft [lindex $args 0] \"-\"] 0]\n+\n+\t# if a wrong option is passed then display all options available for config\n+\tif {[lsearch [set ${testMethods}(config)] $opt] == -1} {\n+\t\tset errMsg \"Usage: $type config \"\n+\t\tforeach op [set [set testMethods](config)] {\n+\t\t\tset errMsg  [format \"%s\\n       -$op  <value>\" $errMsg]\n+\t\t}\n+        error $errMsg\n+\t\treturn\n+\t}\n+\n+    if {[info exists ${testConfigVals}]} {\n+\t    # if an option is passed but no value then display the values expected for this parm\n+\t    if {$argLen == 1} {\n+\t\t    set errMsg \"Usage: $type config -$opt \"\n+\t\t    set valList [array names ${testConfigVals}]\n+\t\t    if {[lsearch $valList $opt] != -1} {\n+\t\t\t    foreach val [set ${testConfigVals}($opt)] {\n+\t\t\t\t    set errMsg  [format \"%s<$val> \" $errMsg]\n+\t\t        }\n+\t\t    }\n+            set errMsg [format \"%s\\n\" $errMsg]\n+            error $errMsg \n+\t    }\n+\n+\t    # at this point, it is confirmed that a valid option name with a value has\n+\t    # been passed. Validate the value passed now. Do this only for parms who are\n+\t    # expecting only one value, not multiple. Also, check only if this parm is\n+\t    # expecting a certain type or range of values.\n+\t    if {$argLen == 2} {\n+\t\t    set valList [array names ${testConfigVals}]\n+\t\t    if {[lsearch $valList $opt] != -1} {\n+\n+\t\t\t    # if the values are required options then it is a list of more\n+\t\t\t    # than one element. If values are \"one of\" type, like a|b|c,\n+\t\t\t    # then this is a list of 1 element. First search for the\n+\t\t\t    # expected value in the list\n+\t\t\t    if {[lsearch [set ${testConfigVals}($opt)] [lindex $args 1]] == -1} {\n+\t\t\t\t    # now it may be an a|b|c type value\n+\t\t\t\t    if {[regexp [set ${testConfigVals}($opt)] [lindex $args 1]] == 0} {\n+\t\t\t\t\t    set errMsg \"Invalid value. Usage: $type config -$opt \"\n+\t\t\t\t\t    foreach val [set ${testConfigVals}($opt)] {\n+\t\t\t\t\t\t    set errMsg [format \"%s<$val> \" $errMsg]\n+\t\t\t\t\t    }\n+                        set errMsg [format \"%s\\n\" $errMsg]\n+\t\t\t\t\t    error $errMsg\n+\t\t\t\t    }\n+\t\t\t    }\n+\t\t    }\n+\t    }\n+    }\n+\n+\t# if more than one parm is passed then convert it to a list because it is\n+\t# one of the parms that is expecting multiple values. But first check if the\n+\t# right number of values are passed.\n+\tif {$argLen > 2} {\n+        if {[info exists ${testConfigVals}]} {\n+\t\t    if {[expr $argLen - 1] != [llength [set [set testConfigVals]($opt)]]} {\n+\t\t\t    set errMsg \"Invalid number of arguments. Usage: $type config -$opt \"\n+                foreach val [set ${testConfigVals}($opt)] {\n+\t\t\t\t    set errMsg [format \"%s<$val> \" $errMsg]\n+                }\n+                set errMsg [format \"%s\\n\" $errMsg]\n+\t\t\t    error $errMsg\n+\t\t    }\n+        }\n+\t\tset argList {}\n+\t\tfor {set i 1} {$i < $argLen} {incr i} {\n+\t\t\tset argList [lappend argList [lindex $args $i]]\n+\t\t}\n+\t\tset ${testParms}($opt) $argList\n+\t} else {\n+\t\tset ${testParms}($opt) [lindex $args 1]\n+\t}\n+\n+\treturn 0\n+}\n+\n+########################################################################################\n+# Procedure: cgetOptions\n+#\n+# Description: This command is used to get the configured parameters.\n+#\n+########################################################################################\n+proc cgetOptions {testName arguments} \\\n+{\n+    upvar $arguments args\n+\n+    set testMethods [format \"%s%s\" $testName \"Methods\"]\n+    set testParms   [format \"%s%s\" $testName \"Parms\"]\n+\n+\tglobal $testMethods $testParms\n+\n+\tset type $testName\n+\tif {[llength $args] == 0} {\n+\t\tset errMsg \"Usage: $type cget \"\n+\t\tforeach op [set ${testMethods}(cget)] {\n+\t\t\tset errMsg  [format \"%s\\n       -$op\" $errMsg]\n+\t\t}\n+        error $errMsg\n+\t\treturn\n+\t}\n+\n+\tif {[string index [lindex $args 0] 0] != \"-\"} {\n+\t\tset errMsg  \"Usage: $type cget \"\n+\t\tforeach op [set ${testMethods}(cget)] {\n+\t\t\tset errMsg  [format \"%s\\n       -$op\" $errMsg]\n+\t\t}\n+        error $errMsg\n+\t\treturn\n+\t}\n+\tset opt [lindex [string trimleft [lindex $args 0] \"-\"] 0]\n+\n+\tif {[lsearch [set ${testMethods}(cget)] $opt] == -1} {\n+\t\tset errMsg   \"Usage: $type cget \"\n+\t\tforeach op [set ${testMethods}(cget)] {\n+\t\t\tset errMsg  [format \"%s\\n       -$op\" $errMsg]\n+\t\t}\n+        error $errMsg\n+\t\treturn\n+\t}\n+\n+\treturn [set ${testParms}($opt)]\n+}\n+\n+########################################################################################\n+# Procedure: getParmProperty\n+#\n+# Description: This command is used to get the configured parameters.\n+#\n+########################################################################################\n+proc getParmProperty {testName property parmName} \\\n+{\n+    set retCode 0\n+\n+    switch $property {\n+        type         {set propertyArray [format %sType         $testName]}\n+        validRange   {set propertyArray [format %sValidRange   $testName]}\n+        validValues  {set propertyArray [format %sConfigVals   $testName]}\n+        validateProc {set propertyArray [format %sValidateProc $testName]}\n+        help         {set propertyArray [format %sHelp         $testName]}\n+        default {\n+            error \"Parameter property \\'$property\\' does not exist.\"\n+            set retCode 1\n+        }\n+    }\n+\n+    global $propertyArray\n+    regsub {^-} $parmName \"\" parmName\n+\n+    if {($retCode == 0) && [info exists ${propertyArray}($parmName)]} {\n+        set retCode [set ${propertyArray}($parmName)]\n+    } else {\n+        set retCode \"\"\n+    }\n+\n+    return $retCode\n+}\n+\n+########################################################################################\n+# Procedure: startOptions\n+#\n+# Description: This command starts the specified test. The frames on desired ports should\n+# have been configured using the \"port\" and \"streams\" commands.  For this test,\n+# there is only one stream per port with a specific frame size and rate.\n+#\n+########################################################################################\n+proc startOptions {testName arguments} \\\n+{\n+    upvar $arguments args\n+\n+    set testMethods [format \"%s%s\" $testName \"Methods\"]\n+\n+\tglobal $testMethods\n+\n+\tset type    $testName\n+\tset methods [lsort [eval set ${testMethods}(start)]]\n+\n+    # this is some special stuff to preserve backwards compatibility...\n+\tswitch $testName {\n+        tput {\n+            if {[llength $args] == 0} {\n+\t\t        lappend args -rfc2544\n+\t        }\n+            # Protect the depricated test command\n+            if { $args == \"-Rfc2544\" } {\n+                set args    \"-rfc2544\"\n+            }\n+        }\n+        bcast {\n+            if {[llength $args] == 0} {\n+\t\t        lappend args -rate\n+\t        }\n+        }\n+        tputjitter {\n+            if {[llength $args] == 0} {\n+\t\t        lappend args -linearIteration\n+\t        }\n+        }\n+        imix {\n+            if {[llength $args] == 0} {\n+\t\t        lappend args -linearIteration\n+\t        }\n+        }\n+        tputvlan {\n+            if {[llength $args] == 0} {\n+\t\t        lappend args -one2many\n+\t        }\n+        }\n+        cableModem {\n+            # since the percentMaxRate vars have been obseleted, do this for backwards compatiblity\n+            # w/the new vars\n+            if {[cableModem cget -clientPercentMaxRate] > 0} {\n+                cableModem config -rateSelect   percentMaxRate\n+                cableModem config -clientRate   [cableModem cget -clientPercentMaxRate]\n+            }  \n+\n+            if {[cableModem cget -serverPercentMaxRate] > 0} {\n+                cableModem config -rateSelect   percentMaxRate\n+                cableModem config -serverRate   [cableModem cget -serverPercentMaxRate]\n+            }\n+            \n+            # Protect the depricated test\n+            if { $args == \"-LLCFiltering\" } {\n+                set args    \"-usb02LLCFiltering\"\n+            }\n+            \n+            if { $args == \"-LLCTransfer\" } {\n+                set args    \"-usb02LLCTransfer\"\n+            }\n+            if { $args == \"-multiAddrIPFiltering\" } {\n+                set args    \"-usb02MultiAddrIPFiltering\"\n+            }\n+            if { $args == \"-multiAddrIPTransfer\" } {\n+                set args    \"-usb02MultiAddrIPTransfer\"\n+            }\n+            if { $args == \"-usb02MultiAddrIPFiltering\" } {\n+                set args    \"-usb02MultiAddrFiltering\"\n+            }\n+            if { $args == \"-usb02MultiAddrIPTransfer\" } {\n+                set args    \"-usb02MultiAddrTransfer\"\n+            }                 \n+        }\n+    }\n+\n+    switch [llength $args] {\n+        0 {\n+            if {[llength $methods] > 0} {\n+\t\t        puts \"Usage: $type start \"\n+\t\t        foreach op $methods {\n+\t\t\t        puts \"       -$op\"\n+\t\t        }\n+\t\t        return $::TCL_ERROR\n+            }\n+            set opt \"start\"\n+        }\n+        1 {\n+\t        if {[string index [lindex $args 0] 0] != \"-\"} {\n+\t\t        puts \"Usage: $type start \"\n+\t\t        foreach op $methods {\n+\t\t\t        puts \"       -$op\"\n+\t\t        }\n+\t\t        return $::TCL_ERROR\n+\t        }\n+\t        set opt [string trimleft [lindex $args 0] \"-\"]\n+\n+\t        if {[lsearch $methods $opt] == -1} {\n+\t\t        puts \"Invalid ${testName} command: $methods\"\n+\t\t        return $::TCL_ERROR\n+\t        }\n+        }\n+        default {\n+\t\t    puts \"Usage: $type start \"\n+\t\t    foreach op ${testName} {\n+\t\t\t    puts \"       -$op  <value>\"\n+\t\t    }\n+\t\t    return $::TCL_ERROR\n+        }\n+    }\n+\n+    set mname [format \"%s::%s\" $testName $opt]\n+\tset retCode [uplevel $mname]\n+\t\n+\treturn $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: registerResultVarsOptions\n+#\n+# Description: This command registers the results variables.\n+#\n+########################################################################################\n+proc registerResultVarsOptions {testName arguments} \\\n+{\n+    upvar $arguments args\n+\n+    set testMethods [format \"%s%s\" $testName \"Methods\"]\n+\n+\tglobal $testMethods\n+\n+\tset type    $testName\n+\tset methods [lsort [eval set ${testMethods}(registerResultVars)]]\n+\n+    switch [llength $args] {\n+        0 {\n+            if {[llength $methods] > 0} {\n+\t\t        puts \"Usage: $type registerResultVars \"\n+\t\t        foreach op $methods {\n+\t\t\t        puts \"       -$op\"\n+\t\t        }\n+\t\t        return\n+            }\n+            set opt \"registerResultVars\"\n+        }\n+        1 {\n+\t        if {[string index [lindex $args 0] 0] != \"-\"} {\n+\t\t        puts \"Usage: $type registerResultVars \"\n+\t\t        foreach op $methods {\n+\t\t\t        puts \"       -$op\"\n+\t\t        }\n+\t\t        return\n+\t        }\n+\t        set opt [string trimleft [lindex $args 0] \"-\"]\n+\n+\t        if {[lsearch $methods $opt] == -1} {\n+\t\t        puts \"Invalid ${testName} command: $methods\"\n+\t\t        return\n+\t        }\n+            set opt [format \"registerResultVars_%s\" $opt]\n+        }\n+        default {\n+\t\t    puts \"Usage: $type registerResultVars \"\n+\t\t    foreach op ${testName} {\n+\t\t\t    puts \"       -$op  <value>\"\n+\t\t    }\n+\t\t    return\n+        }\n+    }\n+\n+    set mname [format \"%s::%s\" $testName $opt]\n+\tset ret [uplevel $mname]\n+\n+\treturn $ret\n+}\n+\n+\n+\n+########################################################################################\n+# Procedure: existsOptions\n+#\n+# Description: This command is used check if the options exists.\n+#\n+# If exists, return \n+#\n+########################################################################################\n+proc existsOptions {testName arguments} \\\n+{\n+    upvar $arguments args\n+\n+    set retCode 0\n+\n+    set testMethods [format \"%s%s\" $testName \"Methods\"]\n+    set testParms   [format \"%s%s\" $testName \"Parms\"]\n+\n+\tglobal $testMethods $testParms\n+\n+\tset type $testName\n+\tif {[llength $args] == 0} {\n+        if [info exists ${testMethods}] {\n+            set retCode 1\n+        }\n+\t} else {\n+\t    set opt [lindex [string trimleft [lindex $args 0] \"-\"] 0]\n+\n+\t    if {[lsearch [set ${testMethods}(cget)] $opt] != -1} {\n+            set retCode 1\n+\t    }\n+    }\n+\n+\treturn $retCode\n+}\n+\n+\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/trafficMix.tcl b/dep/tclclient/ixTcl1.0/Generic/trafficMix.tcl\nnew file mode 100644\nindex 00000000..302727f4\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/trafficMix.tcl\n@@ -0,0 +1,329 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: trafficMix.tcl\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t09-15-1999\tDS\n+#\n+# Description: This file contains special procs to set up multiple\n+#              streams w/one aggregate rate\n+#\n+########################################################################\n+\n+\n+########################################################################\n+# Procedure: calcTrafficMix\n+#\n+# This command calculates the relative percents (number of frames) for\n+# a number of streams based on one aggregate percent utilization.\n+#\n+# Arguments(s):\n+#   StreamArray         - array indexed by streamID, that\n+#                         contains the framesize & percentFrameRate\n+#                         for that stream\n+#   BurstArray          - calc'd burst size for each stream\n+#   percentUtilization  - desired aggregate percent utilization\n+#\n+# Return:\n+#\n+########################################################################\n+proc calcTrafficMix {StreamArray BurstArray {percentUtilization 100}} \\\n+{\n+    set retCode 0\n+\n+    upvar $StreamArray  streamArray\n+    upvar $BurstArray burstArray\n+\n+    set maxFrameSize    0\n+    foreach streamID [array names streamArray] {\n+        scan $streamArray($streamID) \"%d %d\" fs percent\n+        lappend frameSizeList   $fs\n+        if {$fs > $maxFrameSize} {\n+            set maxFrameSize    $fs\n+            set maxFsIndex      $streamID\n+        }\n+    }\n+\n+    foreach streamID [array names streamArray] {\n+        scan $streamArray($streamID) \"%d %d\" fs percent\n+\n+        set burstArray($streamID)  [expr ([lindex $streamArray($maxFsIndex) 0]/double([lindex $streamArray($maxFsIndex) end]))/$fs*double($percent)]\n+    }\n+\n+    debugMsg \"calcTrafficMix: burstArray:[array get burstArray]\"\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: calcAggregateDataRate\n+#\n+# This command calculates the ifgs for an aggregrate data rate, assuming\n+# there is one packet per stream/one packet per fs.\n+#\n+# Arguments(s):\n+#\n+#   frameSizeList   - list of framesizes to use in aggregrate calculation\n+#   bitRate         - desired aggregrate bit rate\n+#   speed           - in mbps, ie., 100, 10 or 1000 mbps\n+#\n+# Return:\n+#   ifg, in nanoseconds OR 0 if bit rate is greater than achievable wire\n+#   speed or error calculating\n+#\n+########################################################################\n+proc calcAggregateDataRate {frameSizeList bitRate speed {preambleSize 8}} \\\n+{\n+    return [calcAggregateBitRate $frameSizeList $bitRate $speed false false $preambleSize]\n+}\n+\n+\n+########################################################################\n+# Procedure: calcAggregateFrameRate\n+#\n+# This command calculates the ifgs for an aggregrate frame rate, assuming\n+# there is one packet per stream/one packet per fs.\n+#\n+# Arguments(s):\n+#\n+#   frameSizeList   - list of framesizes to use in aggregrate calculation\n+#   bitRate         - desired aggregrate bit rate\n+#   speed           - in mbps, ie., 100, 10 or 1000 mbps\n+#\n+# Return:\n+#   ifg, in nanoseconds OR 0 if bit rate is greater than achievable wire\n+#   speed or error calculating\n+#\n+########################################################################\n+proc calcAggregateFrameRate {frameSizeList bitRate speed {preambleSize 8}} \\\n+{\n+    return [calcAggregateBitRate $frameSizeList $bitRate $speed true false $preambleSize]\n+}\n+\n+\n+########################################################################\n+# Procedure: calcAggregateTotalRate\n+#\n+# This command calculates the ifgs for an aggregrate total bit rate, assuming\n+# there is one packet per stream/one packet per fs.\n+#\n+# Arguments(s):\n+#\n+#   frameSizeList   - list of framesizes to use in aggregrate calculation\n+#   bitRate         - desired aggregrate bit rate\n+#   speed           - in mbps, ie., 100, 10 or 1000 mbps\n+#\n+# Return:\n+#   ifg, in nanoseconds OR 0 if bit rate is greater than achievable wire\n+#   speed or error calculating\n+#\n+########################################################################\n+proc calcAggregateTotalRate {frameSizeList bitRate speed {preambleSize 8}} \\\n+{\n+    return [calcAggregateBitRate $frameSizeList $bitRate $speed true true $preambleSize]\n+}\n+\n+\n+########################################################################\n+# Procedure: calcAggregateBitRate\n+#\n+# This command calculates the ifgs for an aggregrate bit rate, assuming\n+# there is one packet per stream/one packet per fs.\n+#\n+# Arguments(s):\n+#\n+#   frameSizeList   - list of framesizes to use in aggregrate calculation\n+#   bitRate         - desired aggregrate bit rate\n+#   speed           - in mbps, ie., 100, 10 or 1000 mbps\n+#\n+# Return:\n+#   ifg, in nanoseconds OR 0 if bit rate is greater than achievable wire\n+#   speed or error calculating\n+#\n+########################################################################\n+proc calcAggregateBitRate {frameSizeList bitRate speed {includeCRC true} {includePreamble true} {preambleSize 8}} \\\n+{\n+    set nBits   [calcTotalBits $frameSizeList $includeCRC $includePreamble $preambleSize]\n+    if [catch {mpexpr double([llength $frameSizeList] * $bitRate)/$nBits} pps] {\n+        logMsg \"calcAggregateBitRate: Error converting bit rate to PPS\"\n+        return 0\n+    }\n+    return [calcAggregatePPS $frameSizeList $pps $speed $preambleSize]\n+}\n+\n+\n+########################################################################\n+# Procedure: calcAggregatePPS\n+#\n+# This command calculates the ifgs for an aggregrate pps rate, assuming\n+# there is one packet per stream/one packet per fs.\n+#\n+# Arguments(s):\n+#\n+#   frameSizeList   - list of framesizes to use in aggregrate calculation\n+#   pps             - desired aggregrate pps rate\n+#   speed           - in mbps, ie., 100, 10 or 1000 mbps\n+#\n+# Return:\n+#   ifg, in nanoseconds OR 0 if pps rate is greater than achievable wire\n+#   speed or error calculating\n+#\n+########################################################################\n+proc calcAggregatePPS {frameSizeList pps speed {preambleSize 8}} \\\n+{\n+    set ifgNS 0\n+\n+    set nBits       [calcTotalBits $frameSizeList true true $preambleSize]\n+    set speed       [mpexpr $speed*1000000.]\n+\n+    if [catch {mpexpr double($nBits)/$speed} dataTime] {\n+        logMsg \"calcAggregratePPS: Error calculating data time.\"\n+        return $ifgNS\n+    }\n+\n+    if [catch {mpexpr ((1./$pps) - ($dataTime/[llength $frameSizeList]))/0.000000001} ifgNS] {\n+        logMsg \"calcAggregratePPS: Error calculating ifg.\"\n+        return $ifgNS\n+    }\n+\n+    if {$ifgNS < 0} {\n+        set ifgNS   0\n+    }\n+\n+    return [mpexpr round($ifgNS)]\n+}\n+\n+\n+########################################################################\n+# Procedure: calcTotalBits\n+#\n+# This command calculates the total bits, including preamble, of the\n+# frames in the frameSizeList\n+#\n+# Arguments(s):\n+#\n+#   frameSizeList   - list of framesizes to use in aggregrate calculation\n+#\n+# Return:\n+#   0 if pps rate is greater than achievable wire speed.\n+#\n+########################################################################\n+proc calcTotalBits {frameSizeList {includeCRC true} {includePreamble true} {preambleSize 8}} \\\n+{\n+    set nBits   0\n+\n+    if {$includePreamble != \"true\"} {\n+        set preambleSize    0\n+    }\n+\n+    set nPackets    [llength $frameSizeList]\n+    if {$nPackets > 0} {\n+        set totalFS 0\n+        foreach fs $frameSizeList {\n+            if {$includeCRC == \"true\"} {\n+                incr totalFS    $fs\n+            } else {\n+                incr totalFS    [expr $fs - 4]\n+            }\n+        }\n+        set nBits       [mpexpr ($totalFS + ($preambleSize * $nPackets)) * 8]\n+    }\n+\n+    return $nBits\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: calcTotalStreamTime\n+#\n+# This command calculates the total time the aggregate streams will take\n+# if using the giving duration & percentUtilization & returns an array,\n+# Loopcount, that contains a loopcount number for each transmit port.\n+#\n+# Arguments(s):\n+#   TxRxArray           - array (ie., one2oneArray) or list of ports to\n+#                         transmit on\n+#   StreamArray         - array indexed by streamID, that\n+#                         contains the framesize & percentFrameRate\n+#                         for that stream\n+#   BurstArray          - calc'd burst size for each stream\n+#   Loopcount           - calc'd loopcount for each tx port\n+#   duration            - tx time\n+#   percentUtilization  - desired aggregate percent utilization\n+#\n+# Return:\n+#\n+########################################################################\n+proc calcTotalStreamTime {TxRxArray StreamArray BurstArray Loopcount duration {percentUtilization 100} {numRxAddresses 1} {preambleSize 8}} \\\n+{\n+    set retCode 0\n+\n+    upvar $TxRxArray    txRxArray\n+    upvar $StreamArray  streamArray\n+    upvar $BurstArray   burstArray\n+    upvar $Loopcount    loopcount\n+\n+    set txList  [getTxPorts txRxArray]\n+\n+    foreach txMap $txList {\n+        scan $txMap \"%d %d %d\" tx_c tx_l tx_p\n+\n+        if [port get $tx_c $tx_l $tx_p] {\n+            logMsg \"calcTotalStreamTime: Error getting port [getPortId $tx_c $tx_l $tx_p]\"\n+            set retCode 1\n+            continue\n+        }\n+        set speed   [port cget -speed]\n+\n+        set totalTime   0\n+        foreach streamID [array names streamArray] {\n+            scan $streamArray($streamID) \"%d %d\" fs percent\n+\n+            set rate        [mpexpr ($percentUtilization * [calculateMaxRate $tx_c $tx_l $tx_p $fs $preambleSize])/100.]\n+            set gapInBytes  [calculateGapBytes $tx_c $tx_l $tx_p $rate $fs]\n+\n+            set currTime    [mpexpr ((($fs + $preambleSize + $gapInBytes) * 8.) * $burstArray($streamID) * $numRxAddresses)/($speed*1000000.)]\n+            set totalTime   [mpexpr $totalTime + $currTime]\n+        }\n+        set loopcount($tx_c,$tx_l,$tx_p)    [mpexpr round($duration / $totalTime)]\n+        debugMsg \"calcTotalStreamTime: totalTime:$totalTime, loopcount:$loopcount($tx_c,$tx_l,$tx_p)\"\n+    }\n+\n+    return $retCode\n+}\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/utilWrappers.tcl b/dep/tclclient/ixTcl1.0/Generic/utilWrappers.tcl\nnew file mode 100644\nindex 00000000..b03199a9\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/utilWrappers.tcl\n@@ -0,0 +1,357 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: utilWrappers.tcl\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t06-18-2001\tHSH\tGenesis\n+#\n+# Description: Wrappers for utility commands from IxTclHal\n+#\n+##################################################################################\n+\n+########################################################################################\n+# Procedure: ixIsBgpInstalled\n+#\n+# Description: This command checks if Bgp client installed\n+#\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsBgpInstalled {} \\\n+{\n+\treturn [ixUtils isBgpInstalled]\n+}\n+\n+\n+########################################################################################\n+# Procedure: ixIsIsisInstalled\n+#\n+# Description: This command checks if Isis client installed\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsIsisInstalled {} \\\n+{\n+\treturn [ixUtils isIsisInstalled]\n+}\n+\n+########################################################################################\n+# Procedure: ixIsRsvpInstalled\n+#\n+# Description: This command checks if Rsvp client installed\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsRsvpInstalled {} \\\n+{\n+\treturn [ixUtils isRsvpInstalled]\n+}\n+\n+\n+########################################################################################\n+# Procedure: ixIsOspfInstalled\n+#\n+# Description: This command checks if Ospf client installed\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsOspfInstalled {} \\\n+{\n+\treturn [ixUtils isOspfInstalled]\n+}\n+\n+\n+########################################################################################\n+# Procedure: ixIsRipInstalled\n+#\n+# Description: This command checks if Rip client installed\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsRipInstalled {} \\\n+{\n+\treturn [ixUtils isRipInstalled]\n+}\n+\n+########################################################################################\n+# Procedure: ixIsArpInstalled\n+#\n+# Description: This command checks if Arp client installed\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsArpInstalled {} \\\n+{\n+\treturn [ixUtils isArpInstalled]\n+}\n+\n+########################################################################################\n+# Procedure: ixIsIgmpInstalled\n+#\n+# Description: This command checks if Igmp client installed\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsIgmpInstalled {} \\\n+{\n+\treturn [ixUtils isIgmpInstalled]\n+}\n+\n+\n+########################################################################################\n+# Procedure: ixIsVpnL2Installed\n+#\n+# Description: This command checks if VpnL2 client installed\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsVpnL2Installed {} \\\n+{\n+\treturn [ixUtils isVpnL2Installed]\n+}\n+\n+\n+########################################################################################\n+# Procedure: ixIsVpnL3Installed\n+#\n+# Description: This command checks if VpnL3 client installed\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsVpnL3Installed {} \\\n+{\n+\treturn [ixUtils isVpnL3Installed]\n+}\n+\n+\n+########################################################################################\n+# Procedure: ixIsMldInstalled\n+#\n+# Description: This command checks if MLD client installed\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsMldInstalled {} \\\n+{\n+\treturn [ixUtils isMldInstalled]\n+}\n+\n+\n+########################################################################################\n+# Procedure: ixIsOspfV3Installed\n+#\n+# Description: This command checks if OSPF V3 client installed\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsOspfV3Installed {} \\\n+{\n+\treturn [ixUtils isOspfV3Installed]\n+}\n+\n+\n+########################################################################################\n+# Procedure: ixIsPimsmInstalled\n+#\n+# Description: This command checks if PIM-SM client installed\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsPimsmInstalled {} \\\n+{\n+\treturn [ixUtils isPimsmInstalled]\n+}\n+\n+########################################################################################\n+# Procedure: ixGetLineUtilization\n+#\n+# Description: This command returns the total port rate.\n+#\n+# Input:\n+#   rateType - i.e. typePercentMaxRate or typeFpsRate\n+#\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixGetLineUtilization {chassis card port {rateType typePercentMaxRate}} \\\n+{\n+\treturn [ixUtils getLineUtilization $chassis $card $port $rateType]\n+}\n+\n+########################################################################################\n+# Procedure: ixIsLdpInstalled\n+#\n+# Description: This command checks if LDP client installed\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsLdpInstalled {} \\\n+{\n+\treturn [ixUtils isLdpInstalled]\n+}\n+\n+########################################################################################\n+# Procedure: ixIsRipngInstalled\n+#\n+# Description: This command checks if Ripng client installed\n+# Returned value : \n+#\n+#               TRUE  : If it is installed.\n+#\t\t\t\tFALSE : If it is NOT installed.\n+########################################################################################\n+proc ixIsRipngInstalled {} \\\n+{\n+\treturn [ixUtils isRipngInstalled]\n+}\n+\n+\n+########################################################################################\n+# Procedure: calculateMaxRate\n+#\n+# This proc calculates the max rate in packets per second for this interface\n+#\n+# Arguments(s):\n+#   chassis \n+#   card\n+#   port\n+#   framesize\n+#   preambleSize, default == 8   \n+#\n+# Returned value : \n+#   returns the max rate in PPS\n+#\n+########################################################################################\n+proc calculateMaxRate {chassis card port {framesize 64} {preambleOrAtmEncap 8} } \\\n+{\n+\treturn [ixUtils calculateMaxRate $chassis $card $port $framesize $preambleOrAtmEncap ]\n+}\n+\n+\n+########################################################################################\n+# Procedure: calculateGapBytes\n+#\n+# This proc calculates the number of bytes that fit in between each packet for this rate\n+#\n+# Arguments(s):\n+#   chassis \n+#   card\n+#   port\n+#   framerate\n+#   framesize, default = 64\n+#   preambleSize, default == 8   \n+#\n+# Returned value : \n+#   returns the number of bytes that fit in a gap space of a certain rate\n+#\n+########################################################################################\n+proc calculateGapBytes {chassis card port framerate {framesize 64} {preambleSize 8}} \\\n+{\n+\treturn [ixUtils calculateGapBytes $chassis $card $port $framerate $framesize $preambleSize]\n+}\n+\n+\n+########################################################################################\n+# Procedure: calculateFPS\n+#\n+# This proc calculates the framerate in frames per second given the percent line rate\n+#\n+# Arguments(s):\n+#   chassis \n+#   card\n+#   port\n+#   percentLineRate = 100\n+#   framesize, default = 64\n+#   preambleSize, default == 8   \n+#\n+# Returned value : \n+#   returns framerate, in PPS\n+#\n+########################################################################################\n+proc calculateFPS {chassis card port {percentLineRate 100} {framesize 64} {preambleOrAtmEncap 8} } \\\n+{\n+\treturn [ixUtils calculateFPS $chassis $card $port $percentLineRate $framesize $preambleOrAtmEncap]\n+}\n+\n+\n+########################################################################################\n+# Procedure: calculatePercentMaxRate\n+#\n+# This proc calculates percent of line rate for this PPS value\n+#\n+# Arguments(s):\n+#   chassis \n+#   card\n+#   port\n+#   framerate\n+#   framesize, default = 64\n+#   preambleSize, default == 8   \n+#\n+# Returned value : \n+#   returns the number of bytes that fit in a gap space of a certain rate\n+#\n+########################################################################################\n+proc calculatePercentMaxRate {chassis card port framerate framesize {preambleOrAtmEncap 8}} \\\n+{\n+\treturn [ixUtils calculatePercentMaxRate $chassis $card $port $framerate $framesize $preambleOrAtmEncap]\n+}\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/utils.tcl b/dep/tclclient/ixTcl1.0/Generic/utils.tcl\nnew file mode 100644\nindex 00000000..1352ce04\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/utils.tcl\n@@ -0,0 +1,2319 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: utils.tcl\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#       Revision Log:\n+#       05-7-1998       Hardev Soor\n+#\n+# Description: This file contains common commands used by the tests\n+#\n+########################################################################\n+\n+\n+########################################################################\n+# Procedure: globalSetDefault\n+#                       \n+# Description: This command calls the setDefault for all the IxTclHal\n+# commands as a form of initialization.\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc globalSetDefault {} \\\n+{\n+\n+\t# This \"if\" condition was added to avoid unnecessary warning messages\n+\t# in the TCLEvent.log\n+\tif {[llength $::ixTclHal::nonDeprecatedCommands] == 0} {\n+\n+\t\tset deprecatedCommands {usb licenseManagement}\n+\t\tregsub -all { } $deprecatedCommands \"|\" deprecatedCommands\n+\t\tregsub -all $deprecatedCommands $::halCommands {} ::ixTclHal::nonDeprecatedCommands\n+\t}\n+\n+\tif [info exists ::ixTclHal::nonDeprecatedCommands] {\n+        foreach halCmd $::ixTclHal::nonDeprecatedCommands {\n+            if {[info commands $halCmd] != \"\"} {\n+                catch {$halCmd setDefault}\n+            }\n+        }\n+    }\n+}\n+\n+\n+########################################################################\n+# Procedure: protocolStackSetDefault\n+#\n+# This command calls the setDefault for all the protocol stack related\n+# commands as a form of initialization.\n+#\n+# Arguments(s):\n+#\n+########################################################################\n+proc protocolStackSetDefault {} \\\n+{\n+    global ixProtocolList\n+\n+    foreach protocol $ixProtocolList {\n+        $protocol setDefault\n+    }\n+}\n+\n+########################################################################\n+# Procedure: streamSet\n+#\n+# Description: This command sets the stream and prints an error message based on the \n+# return code\n+#\n+# Argument(s):\n+#   chasId      - chassis id\n+#   cardId      - card id\n+#   portId      - port id\n+#   streamId    - stream id\n+#\n+# Results :     0 : No error found, else error\n+#                  \n+########################################################################\n+proc streamSet { chasId cardId portId streamId } \\\n+{\n+    set level [expr [info level] - 2]\n+    if {$level > 0} {\n+        set levelStr    \"[lindex [info level $level] 0]: \"\n+    } else {\n+        set levelStr    \"Error: \"\n+    }\n+\n+    set retCode [stream set $chasId $cardId $portId $streamId] \n+    switch $retCode \\\n+        $::ixTcl_outOfMemory {\n+            logger message \"$levelStr Error setting stream $streamId on port [getPortId $chasId $cardId $portId] - Port is out of memory\"\n+        }\\\n+        $::ixTcl_generalError   {               \n+            logger message \"$levelStr Error setting stream $streamId on port [getPortId $chasId $cardId $portId]\"\n+        }\\\n+        $::ixTcl_notAvailable {\n+            logger message \"$levelStr Port [getPortId $chasId $cardId $portId] is unavailable, check ownership.\"\n+        }\\\n+        $::ixTcl_ok -\\\n+        default {\n+        }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure:    validateFramesize\n+#\n+# Description:  Checks the framesize against 64-1518 valid EN type \n+#                   framesize and tests against protocol restrictions\n+#\n+# Arguments(s): framesize   - framesize to validate\n+#\n+# Returns:      TCL_OK or TCL_ERROR (if invalid)\n+#\n+########################################################################\n+proc validateFramesize {framesize} \\\n+{\n+    set retCode $::TCL_ERROR\n+\n+    switch [getProtocolName [protocol cget -name]] {\n+        ipV6 {\n+            set minimumFramesize [ipv6::getMinimumValidFramesize]\n+            if {$framesize >= $minimumFramesize} {\n+                set retCode $::TCL_OK\n+            }\n+        }\n+        ip -\n+        mac -\n+        default {\n+            return $::TCL_OK\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure:    validateFramesizeList\n+#\n+# Description:  Checks the framesize against 64-1518 valid EN type \n+#                   framesize and tests against protocol restrictions\n+#\n+# Arguments(s): framesizeList:  framesizes to validate\n+#\n+# Returns:      TCL_OK or TCL_ERROR (if invalid)\n+#\n+########################################################################\n+proc validateFramesizeList {framesizeList} \\\n+{\n+    set retCode $::TCL_ERROR\n+\n+    foreach framesize $framesizeList {\n+        set retCode [validateFramesize $framesize]\n+        if {$retCode == $::TCL_ERROR} {\n+            break\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: validatePreamblesize\n+#\n+# This command checks the preamble size against 2-256 valid EN preamble size\n+#\n+# Arguments(s):\n+#       preambleSize   - Preamblesize to validate\n+#\n+########################################################################\n+proc validatePreamblesize {preambleSize} \\\n+{\n+    set retCode 0\n+\n+    if {$preambleSize > 256 || $preambleSize < 2} {\n+        logMsg \"Invalid preamble size, must be between 2 & 256\"\n+        set retCode 1\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: getLearnProc\n+#\n+# This command determines which learn proc to use\n+#\n+# Arguments(s):\n+#   portArray       - port map, ie. one2oneArray, one2manyArray, etc\n+#\n+########################################################################\n+proc getLearnProc {{portArray \"\"}} \\\n+{\n+    set learnproc       send_learn_frames\n+\n+    if {[learn cget -type] == \"default\"} {\n+        learn config -type      [getProtocolName [protocol cget -name]]\n+    }\n+       \n+    switch [learn cget -type]  {\n+        default -\n+        mac     {\n+                set learnproc   send_learn_frames\n+        }\n+        ip      {\n+                set learnproc   send_arp_frames\n+        }\n+        ipx     {\n+                set learnproc   send_ripx_frames\n+        }\n+        ipV6    {\n+                set learnproc   send_neighborDiscovery_frames\n+        }\n+\n+    }\n+\n+    return $learnproc\n+}\n+\n+\n+########################################################################\n+# Procedure:    validateProtocol\n+#\n+# Description:  This command validates the protocol type for this test\n+#\n+# Arguments:    protocols:  list of allowable protocols for this test, \n+#                               ie. {mac ip ipx ipV6}\n+#\n+# Returns:      ::TCL_OK or TCL_ERROR\n+#\n+########################################################################\n+proc validateProtocol {protocols} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    set protocolName [getProtocolName [protocol cget -name]]\n+    switch $protocolName {\n+        mac  -\n+        ip   -\n+        ipx  -\n+        ipV6 {\n+            if {[lsearch $protocols $protocolName] == -1} {\n+                set retCode $::TCL_ERROR\n+            }\n+        }\n+        default {\n+            set retCode $::TCL_ERROR\n+        }\n+    }\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: initMaxRate\n+#\n+# This command initializes an array containing the max rate values per\n+# all TX ports in the array\n+#\n+# Arguments(s):\n+#   PortArray       - port map, ie. one2oneArray, one2manyArray, etc\n+#   maxRateArray    - array containing the max rates for each tx port\n+#   framesize       - framesize ref for max rate\n+#   userRateArray   - array containing the actual user rate to tx\n+#   percentRate     - user-specifed percent of max rate\n+#   preambleSize\n+#\n+########################################################################\n+proc initMaxRate {PortArray maxRateArray framesize {userRateArray \"\"} {percentRate 100} {preambleSize 8}} \\\n+{\n+    upvar $PortArray portArray\n+    upvar $maxRateArray maxRate\n+\n+    if {[string length $userRateArray] > 0} {\n+        upvar $userRateArray userRate\n+    }\n+\n+    set retCode $::TCL_OK\n+\n+    set txRxList    [getAllPorts portArray]\n+\n+    foreach portMap $txRxList {\n+        scan $portMap \"%d %d %d\" c l p\n+\n+        set maxRate($c,$l,$p)   [calculateMaxRate $c $l $p $framesize $preambleSize]\n+        set userRate($c,$l,$p)  [expr round($percentRate/100. * $maxRate($c,$l,$p))]\n+\n+        if {$userRate($c,$l,$p) > $maxRate($c,$l,$p)} {\n+            logMsg \"****** WARNING: Rate $userRate($c,$l,$p) fps exceeded Maximum Rate $maxRate($c,$l,$p) for [getPortId $c $l $p]\"\n+            set userRate($c,$l,$p) $maxRate($c,$l,$p) \n+        }\n+\n+        if {$userRate($c,$l,$p) <= 0} {\n+            logMsg \"****** ERROR: Rate cannot be 0 for [getPortId $c $l $p]\"\n+            set retCode $::TCL_ERROR\n+        }\n+    }\n+\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: buildIpMcastMacAddress\n+#\n+# This command builds the MAC address to use when transmitting multi-\n+# cast packets.\n+#\n+# Arguments(s):\n+#       groupAddress    IP multicast group address\n+#\n+# NOTE:The Ethernet directly supports the sending of local multicast\n+# packets by allowing multicast addresses in the destination field of \n+# Ethernet packets. All that is needed to support the sending of\n+# multicast IP datagrams is a procedure for mapping IP host group\n+# addresses to Ethernet multicast addresses. \n+#\n+# An IP host group address is mapped to an Ethernet multicast address \n+# by placing the low-order 23-bits of the IP address into the low-order\n+# 23 bits of the Ethernet multicast address 01-00-5E-00-00-00 (hex)\n+# [RFC1112]. Because there are 28 significant bits in an IP host group\n+# address, more than one host group address may map to the same Ethernet\n+# multicast address. \n+########################################################################\n+proc buildIpMcastMacAddress {groupAddress} \\\n+{\n+    set mcastIP [host2addr $groupAddress]\n+\n+    # the lower 3 bytes of DA need to match the lower 23 bits of the multicast IP addr\n+    set DA  [format \"%02x %02x %02x %02x %02x %02x\" 01 00 0x5e \\\n+                    [expr \"0x[lindex $mcastIP 1]\" & 0x7f] \\\n+                    \"0x[lindex $mcastIP 2]\" \\\n+                    \"0x[lindex $mcastIP 3]\"]\n+\n+    return $DA\n+}\n+\n+\n+########################################################################\n+# Procedure: setPortName\n+#\n+# This command sets a character string name to a specified port\n+#\n+# Arguments(s):\n+#   portName      - name of port\n+#   chassis\n+#   card  \n+#   port\n+#\n+# Return:\n+#       TCL_OK if port found\n+#\n+########################################################################\n+proc setPortName {portName chassis card pt} \\\n+{\n+    set retCode 0\n+\n+    if [catch {port get $chassis $card $pt} retCode] {\n+        global ixgPortNameMap\n+        set ixgPortNameMap($chassis,$card,$pt)    $portName\n+        set retCode 0\n+    } else {\n+        port config -name   $portName\n+        if [port set $chassis $card $pt] {\n+            set ixgPortNameMap($chassis,$card,$pt)    $portName\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+##################################################################################\n+# Procedure: getPortString\n+#\n+# This command gets the port name as a string.\n+#\n+##################################################################################\n+proc getPortString {c l p {testCmd results}} \\\n+{\n+    set portname [getPortName $c $l $p]\n+\n+    if {[$testCmd cget -portNameOption] == \"both\" && $portname != \"\"} {   \n+        set portString [format \"%s.%s.%s %s\" $c $l $p $portname]\n+    } elseif {[$testCmd cget -portNameOption] == \"number\" && $portname != \"\"} {\n+        set portString $portname\n+    } elseif {[$testCmd cget -portNameOption] == \"name\" && $portname != \"\"} {\n+        set portString $portname\n+    } else {\n+        set portString [format \"%s.%s.%s\" $c $l $p]\n+    }\n+\n+    return $portString\n+}\n+\n+\n+########################################################################\n+# Procedure: getPortId\n+#\n+# This command gets the portID + character string name of a port\n+#\n+# Arguments(s):\n+#   c\n+#   l  \n+#   p\n+#\n+# Return:\n+#       portName\n+#\n+########################################################################\n+proc getPortId {c l p} \\\n+{\n+\n+    if [catch {port getId $c $l $p} portname] {\n+        set portname  \"$c.$l.$p \"\n+    }\n+\n+    return $portname\n+}\n+\n+\n+########################################################################\n+# Procedure: getPortName\n+#\n+# This command gets the character string name from a specified port\n+#\n+# Arguments(s):\n+#   chassis\n+#   card  \n+#   port\n+#   default - optionally, if no name was specified, name defaults\n+#             to \"$chassis.$card.$port\", otherwise empty string returned.\n+#\n+# Return:\n+#       portName\n+#\n+########################################################################\n+proc getPortName {chassis card port {default default}} \\\n+{\n+    set retCode  0\n+    set portName \"\"\n+\n+    global ixgPortNameMap\n+\n+    if [catch {port get $chassis $card $port} retCode] {\n+        if [catch {set portName $ixgPortNameMap($chassis,$card,$port)}] {\n+            set portName    \"\"\n+        }\n+    } else {\n+        if [info exists ixgPortNameMap($chassis,$card,$port)] {\n+            set portName $ixgPortNameMap($chassis,$card,$port)\n+            setPortName  $portName $chassis $card $port\n+            unset ixgPortNameMap($chassis,$card,$port)\n+        } \n+     \n+        if {$retCode != 0} {  \n+            set portName    \"\"\n+        } else {\n+            set portName    [port cget -name]\n+        }      \n+    }\n+\n+    if {$portName == \"\" && $default == \"default\"} {\n+        set portName    \"$chassis.$card.$port\"\n+    }\n+\n+    return $portName\n+}\n+\n+\n+########################################################################################\n+# Procedure: setPortFactoryDefaults\n+#\n+# Description: This command sets the factory defaults on a port\n+#\n+# Argument(s):\n+#   chassis -\n+#   card    -\n+#   port    -\n+#\n+########################################################################################\n+proc setPortFactoryDefaults {chassis card port} \\\n+{\n+    set retCode [port setFactoryDefaults $chassis $card $port]\n+    switch $retCode \"\n+        $::ixTcl_ok {\n+        }\n+        $::ixTcl_generalError {\n+\t\t\terrorMsg \\\"Error setting factory defaults on port [getPortId $chassis $card $port].\\\"\n+        }\n+        $::ixTcl_notAvailable {\n+            errorMsg \\\"Port [getPortId $chassis $card $port] is unavailable, check ownership.\\\"\n+        }\n+    \"\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################################\n+# Procedure: setFactoryDefaults\n+#\n+# Description: This command sets the factory defaults on all ports in the map\n+#\n+# Argument(s):\n+#   portList     - list containing all ports to set factory defaults on, may be an array\n+#\n+########################################################################################\n+proc setFactoryDefaults {portList {write nowrite}} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    foreach port $portList {\n+        scan $port \"%d %d %d\" chassisId cardId portId\n+\n+        set retCode [setPortFactoryDefaults $chassisId $cardId $portId]\n+        if {$retCode != $::TCL_OK} {\n+            break\n+        }\n+    }\n+\n+    if {$retCode == $::TCL_OK && $write == \"write\"} {\n+        ixWritePortsToHardware portList\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: getProtocolName\n+#\n+# This command returns the protocol as a character string name\n+#\n+# Arguments(s):\n+#       protocol        integer value of protocol, from protocol cget -name\n+#\n+# Return:\n+#       character name of protocol or 0 if error\n+#\n+########################################################################\n+proc getProtocolName {protocol} \\\n+{\n+    global kProtocol\n+\n+    # this is for scripts that are sending valid ip packets, but\n+    # we are treating it like an l2 test\n+    if {[advancedTestParameter cget -l2DataProtocol] == \"ip\"} {\n+        set name \"mac\"\n+        return $name\n+    }\n+\n+    foreach {pr name} [array get kProtocol] {\n+        if {$protocol == $pr} {\n+            return $name\n+        }\n+    }\n+\n+    return 0\n+}\n+\n+\n+########################################################################\n+# Procedure: getDuplexModeString\n+#\n+# This command returns the duplex mode as a character string name\n+#\n+# Arguments(s):\n+#       duplexMode      integer value of duplex mode, from port cget -duplex\n+#\n+# Return:\n+#       character name of duplex mode or 0 if error\n+#\n+########################################################################\n+proc getDuplexModeString {duplex} \\\n+{\n+    global kDuplexMode\n+\n+    foreach {dp name} [array get kDuplexMode] {\n+        if {$duplex == $dp} {\n+                return $name\n+        }\n+    }\n+\n+    return 0\n+}\n+\n+\n+########################################################################\n+# Procedure: disableUdfs\n+#\n+# This command disables the udfs in the list.\n+#\n+# Arguments(s):\n+#       udfList     Tcl list of udfs to disable, in the form {1 2 3 4}\n+#\n+# Return:\n+#       1 if error\n+#\n+########################################################################\n+proc disableUdfs {udfList} \\\n+{\n+    set retCode 0\n+\n+    udf config -enable  false\n+    foreach u $udfList {\n+        if [udf set $u] {\n+            set retCode 1\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: getIpClassName\n+#\n+# This command returns the class type of IP address as a character string name\n+#\n+# Arguments(s):\n+#       classNum        integer value of IP addr class, from ip cget -class\n+#\n+# Return:\n+#       character name of IP addr class or 0 if error\n+#\n+########################################################################\n+proc getIpClassName {classNum} \\\n+{\n+    global kIpAddrClass\n+\n+    foreach {ipclass className} [array get kIpAddrClass] {\n+        if {$classNum == $ipclass} {\n+                return $className\n+        }\n+    }\n+\n+    return 0\n+}\n+\n+\n+########################################################################\n+# Procedure: getMinimum\n+#\n+# This command returns the minimum value in the passed array\n+#\n+# Arguments(s):\n+#       ValArray        - array of values\n+#\n+# Return:\n+#       minimum value in array\n+#\n+########################################################################\n+proc getMinimum {ValArray} \\\n+{\n+    upvar $ValArray valArray\n+\n+    foreach index [array names valArray] {\n+        if {[info exists minimum] && $valArray($index) >= $minimum} {\n+            continue\n+        }\n+        set minimum $valArray($index)\n+    }\n+\n+    if {![info exists minimum]} {\n+        set minimum 0\n+    }\n+\n+    return $minimum\n+}\n+\n+\n+########################################################################\n+# Procedure: swapPortList\n+#\n+# This command swaps the Tx/Rx pairs\n+#\n+# Argument(s):\n+#       portList        list of ports, ie, one2oneArray, one2manyArray etc\n+#       newList         copied list\n+#\n+########################################################################\n+proc swapPortList {portList newList} \\\n+{\n+    upvar $portList old\n+    upvar $newList  new\n+\n+    set retCode 0\n+\n+    if [info exists new] {\n+        unset new\n+    }\n+\n+    foreach txMap [lsort [array names old]] {\n+        scan $txMap \"%d,%d,%d\" tx_c tx_l tx_p\n+\n+        foreach rxMap [lsort $old($txMap)] {\n+            scan [join $rxMap]  \"%d %d %d\" rx_c rx_l rx_p\n+\n+            set new($rx_c,$rx_l,$rx_p) [lappend new($rx_c,$rx_l,$rx_p) [list $tx_c $tx_l $tx_p]]\n+        }\n+    }\n+\n+        return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: copyPortList\n+#\n+# This command copies the port array into another local variable\n+#\n+# Argument(s):\n+#       portList        list of ports, ie, one2oneArray, one2manyArray etc\n+#       newList         copied list\n+#\n+########################################################################\n+proc copyPortList {SourceList DestList} \\\n+{\n+    upvar $SourceList   sourceList\n+    upvar $DestList     destList\n+\n+    array set destList [array get sourceList]\n+\n+    return $::TCL_OK\n+}\n+\n+\n+########################################################################\n+# Procedure: removePorts\n+#\n+# This command removes ports from the port array/list. \n+#\n+# Argument(s):\n+#       PortList        port map or list of ports, ie, one2oneArray, one2manyArray etc\n+#       removePortList  list of ports to be removed from the PortList\n+#\n+########################################################################\n+proc removePorts {PortList removePortList} \\\n+{\n+\n+    upvar $PortList portList\n+\n+    set retCode 0\n+\n+    if [array exists portList] {\n+        foreach txMap [array names portList] {\n+\n+            scan [split [join $txMap] ,] \"%d %d %d\" tx_c tx_l tx_p\n+\n+            if {[lsearch $removePortList [list $tx_c $tx_l $tx_p]] >= 0} {\n+                logMsg \"Removing TX port [getPortId $tx_c $tx_l $tx_p] from map...\"\n+                unset portList($tx_c,$tx_l,$tx_p)\n+                continue\n+            }\n+\n+            foreach rxMap $portList($tx_c,$tx_l,$tx_p) {\n+\n+                set index [lsearch $removePortList $rxMap]\n+\n+                if {$index >= 0} {\n+                    logMsg \"Removing RX port [join $rxMap ,] from map...\"\n+                    set rmIndex [lsearch $portList($tx_c,$tx_l,$tx_p) $rxMap]\n+\n+                    set portList($tx_c,$tx_l,$tx_p) [lreplace $portList($tx_c,$tx_l,$tx_p) $rmIndex $rmIndex]\n+\n+                    if {[llength $portList($tx_c,$tx_l,$tx_p)] <= 0} {\n+                        unset portList($tx_c,$tx_l,$tx_p)\n+                    }\n+\n+                }                    \n+            }\n+        }\n+\n+        if {[llength [array names portList]] == 0} {\n+            set errMsg \"Error - invalid map after removing ports!!!\"\n+            #errorMsg \"Error - invalid map after removing ports!!!\"\n+            set retCode 1    \n+        }\n+\n+    } else {\n+\n+        if { [llength $portList] >0 && [llength  $removePortList] > 0 } {\n+            foreach portMap $removePortList {\n+                scan [join $portMap] \"%d %d %d\" c l p\n+\n+                set index    [lsearch $portList [list $c $l $p]]\n+                if {$index >= 0} {\n+                    logMsg \"Removing port [join [split $portMap ,] ,] from map...\"\n+                    set portList [lreplace $portList $index $index]\n+                }\n+            }\n+        } else {\n+            logMsg \"No ports to remove.\"\n+            set retCode 1\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: lnumsort\n+#\n+# This command sorts a list (like ports) into numerical order\n+#\n+# Argument(s):\n+#       option        -decending\n+#       MyList        list of stuff\n+#\n+########################################################################\n+proc lnumsort {option {MyList \"\"}} \\\n+{\n+    if {[string index [lindex $option 0] 0] != \"-\"} {\n+        set MyList  $option\n+        set sortedList  [lsort -dictionary $MyList]\n+    } else {\n+        set sortedList  [lsort -dictionary $option $MyList]\n+    }\n+\n+    return $sortedList\n+}\n+\n+\n+########################################################################\n+# Procedure: mergeLists\n+#\n+# This command merges two lists\n+#\n+# Arguments(s):\n+#   MergedList  - returned merged list w/dups removed\n+#   args        - variable number of lists to be merged together\n+#   <sortedOrder - return list in sorted order, default is no sort>\n+#\n+# Return values:\n+#   If there are duplicate items in the list, returns number of dups, otherwise\n+#   returns 0\n+#\n+########################################################################\n+proc mergeLists {MergedList args} \\\n+{\n+    upvar $MergedList   mergedList\n+\n+    set mergedList  \"\"\n+    set sortFlag    0\n+    set duplicate   0\n+\n+    foreach list $args {\n+        if {$list == \"sortedOrder\"} {\n+            set sortFlag    1\n+            continue\n+        }\n+        foreach item $list {\n+            if {[lsearch $mergedList $item] >= 0} {\n+                incr duplicate\n+            } else {\n+                lappend mergedList $item\n+            }\n+        }\n+    }\n+\n+    if {$sortFlag} {\n+        set mergedList  [lnumsort $mergedList]\n+    }\n+\n+    return $duplicate\n+}\n+\n+\n+\n+########################################################################\n+# Procedure:    host2addr\n+#\n+# Description:  This command converts an IP address in form 100.101.102.103 \n+#               to a list of hex bytes all in upper case letters.\n+#\n+# Arguments(s): ipAddr: ip address to convert\n+#\n+# Return(s):    IP address in list of hex bytes\n+#\n+########################################################################\n+proc host2addr {ipAddr} \\\n+{\n+    set ipHex        {}\n+\n+    set delimiter .\n+    regexp {([:.])} $ipAddr match delimiter\n+\n+    set protocol [expr [string match $delimiter :]?\"ipV6\":\"ip\"]\n+\n+    switch $protocol {\n+        ipV6 {\n+            set ipHex [ipv6::host2addr $ipAddr]\n+        }\n+        ip {\n+            set ipname [split $ipAddr $delimiter]\n+            if {[llength [string trim [join $ipname]]] == 4} {\n+                foreach i $ipname {\n+                    if {$i > 255 || $i < 0} {\n+                        set ipHex {}\n+                        break\n+                    }\n+                    set hexCharacter [format \"%02X\" $i]\n+                    set ipHex [linsert $ipHex end $hexCharacter]\n+                }\n+            }\n+        }\n+    }\n+\n+    return $ipHex\n+}\n+\n+\n+########################################################################\n+# Procedure:    long2IpAddr\n+#\n+# Description   Converts long word into an IP address in \n+#                   form x.y.z.a\n+#\n+# Argument(s):  longword to convert\n+#\n+# Returns:      Ip Address x.y.z.a OR \n+#               0.0.0.0 if invalid input arguments\n+#\n+#########################################################################\n+proc long2IpAddr {value} \\\n+{\n+    if [catch {set ipAddress \"[expr {(($value >> 24) & 0xff)}].[expr {(($value >> 16) & 0xff)}].[expr {(($value >> 8 ) & 0xff)}].[expr {$value & 0xff}]\"} ipAddress] {\n+        set ipAddress 0.0.0.0\n+    }\n+\n+    return $ipAddress\n+}\n+\n+\n+########################################################################\n+# Procedure:    byte2IpAddr\n+#\n+# Description   Converts 4 hexideciaml bytes into an IP address in \n+#                   form x.y.z.a\n+#\n+# Argument(s):  hexBytes:   list of bytes to convert\n+#\n+# Returns:      Ip Address x.y.z.a OR \n+#               0.0.0.0 if invalid input arguments\n+#\n+#########################################################################\n+proc byte2IpAddr {hexBytes} \\\n+{\n+    set newIpAddr       \"0.0.0.0\"\n+\n+    # Validate input parameters.\n+\n+    # If given a string of 8 bytes instead of list of 4, convert it to a list.\n+    set hexBytes       [string trim $hexBytes]\n+    set hexBytesLength  [llength $hexBytes]\n+\n+    if {$hexBytesLength == 1} {\n+\n+        if {[string length [string trim $hexBytes]] == 8} {\n+\n+            set hexBytesString  $hexBytes\n+            set hexBytes [list]\n+            for {set i 0} {$i < 4} {incr i} {\n+                lappend hexBytes   [string range   $hexBytesString 0 1]\n+                set hexBytesString [string replace $hexBytesString 0 1]\n+            }\n+\n+        } else {\n+            set hexBytes [list 0 0 0 0]\n+        }\n+\n+    } elseif {$hexBytesLength != 4} {\n+        set hexBytes [list 0 0 0 0]\n+    }\n+\n+\n+    # Convert to decimal.\n+    regsub -all {(.*) (.*) (.*) (.*)} $hexBytes \\\n+        {[format \"%d %d %d %d\" \"0x\\1\" \"0x\\2\" \"0x\\3\" \"0x\\4\"]} newIpAddr\n+    if {[catch {subst $newIpAddr} newIpAddr]} {\n+        set newIpAddr [list 0 0 0 0]\n+    }\n+\n+    # If any invalid values, return 0.0.0.0\n+    foreach byte $newIpAddr {\n+        if {$byte < 0 || $byte > 255} {\n+            set newIpAddr [list 0 0 0 0]\n+            break\n+        }\n+    }\n+    set newIpAddr [join $newIpAddr .]\n+\n+    debugMsg \"byte2IpAddr: newIpAddr = $newIpAddr\"\n+    return $newIpAddr\n+}\n+\n+\n+\n+\n+########################################################################\n+# Procedure: num2ip\n+#\n+# Description:\n+#   This command convert a number to an IP address.\n+# \n+# Arguments(s):\n+#   num - number\n+#\n+# Returns: \n+#   An IP address.\n+#             \n+########################################################################\n+proc num2ip {num} \\\n+{\n+    set ipAddr [format \"%d.%d.%d.%d\" [expr {($num >> 24) & 255}] [expr {($num >> 16) & 255}] \\\n+                                     [expr {($num >>  8) & 255}] [expr { $num        & 255}]]\n+    return $ipAddr\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: ip2num\n+#\n+# This command converts an IP address of the form d.d.d.d into a 32-bit\n+# unsigned number.\n+#\n+# Arguments(s):\n+#   ipAddr      - ip address of the form d.d.d.d\n+#\n+# Return:\n+#   ipNum\n+#\n+########################################################################\n+proc ip2num {ipAddr} \\\n+{\n+    set ipNum   0\n+\n+    if {[scan $ipAddr \"%d.%d.%d.%d\" a b c d] == 4} {\n+        set ipNum   [format %u [expr {($a<<24)|($b<<16)|($c<<8)|$d}]]\n+    }\n+\n+    return $ipNum\n+}\n+\n+\n+########################################################################\n+# Procedure: long2octet\n+#\n+# This command converts a multi-byte number into multi octets in a list\n+#\n+# Argument(s):\n+#       value           the value to convert\n+#\n+#########################################################################\n+proc long2octet {value {sizeInBytes 2} } \\\n+{\n+\n+    switch $sizeInBytes {\n+            2 {\n+                return  [format \"%02x %02x\" \\\n+                                    [expr {(($value >> 8) & 0xff)}]   \\\n+                                    [expr   {$value & 0xff}]]\n+            }\n+            3 {\n+                return  [format \"%02x %02x %02x\" \\\n+                                    [expr {(($value >> 16) & 0xff)}]  \\\n+                                    [expr {(($value >> 8 ) & 0xff)}]  \\\n+                                    [expr   {$value & 0xff}]]\n+            }\n+            4 {\n+                return  [format \"%02x %02x %02x %02x\" \\\n+                                    [expr {(($value >> 24) & 0xff)}]  \\\n+                                    [expr {(($value >> 16) & 0xff)}]  \\\n+                                    [expr {(($value >> 8 ) & 0xff)}]  \\\n+                                    [expr   {$value & 0xff}]]     \n+            }\n+            1 -\n+            default {\n+                return [list [format %02x $value ]]\n+            }\n+    }  \n+}\n+\n+\n+########################################################################\n+# Procedure: list2word\n+#\n+# This command converts a 2-byte list into a word\n+#\n+# Argument(s):\n+#       mylist           the value to convert\n+#\n+#########################################################################\n+proc list2word {mylist} \\\n+{\n+    set listlength  [llength $mylist]\n+    set result      0\n+\n+    if {$listlength <= 2 && $listlength > 0} {\n+        incr listlength -1\n+        set j 0\n+        for {set i $listlength} {$i >= 0} {incr i -1} {\n+            incr result  [expr [hextodec [lindex $mylist $i]] << ($j * 8)]\n+            incr j                \n+        }\n+    }\n+\n+    return $result\n+}\n+\n+########################################################################\n+# Procedure: value2Hexlist\n+#\n+# Description:\tThis command converts a number into a hex\n+#\n+# Argument(s):\n+#   value   - a number\n+#\twidth\t- the hex list lenght to be generated\n+#\n+#########################################################################\n+proc value2Hexlist { value width } \\\n+{\n+    set retValue {}\n+    while { $width } {\n+        set retValue [linsert $retValue 0 [format \"%02x\" [mpexpr $value & 255]]]\n+        incr width -1\n+        set value [mpexpr $value >> 8]\n+    }\n+    return $retValue\n+}\n+\n+########################################################################\n+# Procedure: hexlist2Value\n+#\n+# Description:\tThis command converts a hex list into a number\n+#\n+# Argument(s):\n+#       hexlist\t\t- the hex list ( example {01 02 03 04} )\n+#\n+#########################################################################\n+proc hexlist2Value { hexlist } \\\n+{\n+   set retValue 0\n+   foreach byte $hexlist {\n+      set retValue [mpexpr ($retValue << 8) | 0x$byte]\n+   }\n+   return $retValue\n+}\n+\n+\n+\n+########################################################################\n+# Procedure:    expandHexString\n+#\n+# Description:  Expands a string of delimited hex values:\n+#\n+#                   0 a b 1  becomes 00 0a 0b 01\n+#                   0:a:b:21 becomes 00:0a:0b:21\n+#\n+#               Does not verify the validity of the original hex string.\n+#\n+# Argument(s):  bytesList\n+#               delimiter\n+#\n+# Returns:      expanded hex string\n+#\n+#########################################################################\n+proc expandHexString {byteList {delimiter :}} \\\n+{\n+    set hexList [list]\n+\n+    regsub -all $delimiter $byteList \" \" byteList\n+    foreach byte $byteList {\n+        regsub -all {(.*)} $byte \\\n+            {[format \"%02x \" 0x\\1]} byte \n+        append hexList [subst \"$byte\"]\n+    }\n+    regsub -all \" \" [string trim $hexList] $delimiter hexList\n+\n+    return $hexList\n+}\n+\n+\n+########################################################################\n+# Procedure: getMultipleNumbers\n+#\n+# This procedure gives two numbers that are multiples of each other but\n+# less than the allowed maximum number. If he \"number\" is a prime number\n+# than this procedure may not be useful.\n+#\n+# Argument(s):\n+#       number              the number whose multiple is to be found\n+#       maxAllowedNum   the maximum allowed number\n+#       numA                the multiplier\n+#       numB                    the divider\n+#\n+#########################################################################\n+proc getMultipleNumbers {number maxAllowedNum numA numB} \\\n+{\n+    upvar $numA a\n+    upvar $numB b\n+\n+    # just pick an arbitrary number for max value for loop\n+    for {set divider 2} {$divider <= 1000} {incr divider} {\n+        set result      [mpexpr $number/$divider]\n+        set remainder   [mpexpr $number%$divider]\n+        if {$remainder != 0} {\n+            continue\n+        }\n+        if {$result > $maxAllowedNum} {\n+            continue\n+        }\n+        set a $result\n+        set b $divider\n+        return 0\n+    }\n+\n+    return 1\n+}\n+\n+\n+########################################################################\n+# Procedure: hextodec\n+#\n+# This command converts a hex number to a decimal number\n+#\n+# Argument(s):\n+#   number  - hex number to convert\n+#\n+########################################################################\n+proc hextodec {number} \\\n+{\n+    if [catch {format \"%u\" \"0x$number\"} retCode] {\n+        logMsg \"Invalid hex number: $number\"\n+        set retCode -1\n+    }\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: dectohex\n+#\n+# This command converts a decimal number to a hex number\n+#\n+# Argument(s):\n+#   number  - decimal number to convert\n+#\n+########################################################################\n+proc dectohex {number} \\\n+{\n+    if [catch {format \"%x\" $number} retCode] {\n+        logMsg \"Invalid decimal number: $number\"\n+        set retCode -1\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: incrMacAddress\n+#\n+# This command increments the last three bytes (24-bit word) of the MAC\n+# address.\n+#\n+# Argument(s):\n+#   macaddr         mac address to increment\n+#   amt             increment the field by this number\n+#\n+########################################################################\n+proc incrMacAddress {macaddr amt} \\\n+{\n+    upvar $macaddr valList\n+\n+    set hexnum [format \"%02x%02x%02x\" \"0x[lindex $valList 3]\" \\\n+                             \"0x[lindex $valList 4]\" \"0x[lindex $valList 5]\"]\n+    set decnum [hextodec $hexnum]\n+    set decnum [incr decnum $amt]\n+    set hexnum [format \"%06x\" \"0x[dectohex $decnum]\"]\n+\n+    scan $hexnum \"%02s%02s%02s\" byte3 byte4 byte5\n+\n+    set valList [lreplace $valList 3 3 $byte3]\n+    set valList [lreplace $valList 4 5 $byte4 $byte5]\n+    return $valList\n+}\n+\n+\n+########################################################################\n+# Procedure: incrIpField\n+#\n+# Description: Increments the specified byte of IP address\n+#\n+#\n+# Argument(s):\n+#   ipAddress       IP address whose byte to be incremented\n+#   byteNum         the byte field to be incremented\n+#   amount             increment the field by this number\n+#\n+########################################################################\n+proc incrIpField {ipAddress {byteNum 4} {amount 1}} \\\n+{\n+    set one [ip2num $ipAddress]\n+    set two [expr {$amount<<(8*(4-$byteNum))}]\n+\n+    return  [long2IpAddr [expr {$one + $two}]]\n+}\n+\n+\n+\n+########################################################################\n+# Procedure: incrIpFieldHexFormat\n+#\n+# Description: Increments the specified byte of IP address.  Both the input\n+#              and returned IP address are in hex format.\n+#\n+#\n+# Argument(s):\n+#   ipAddress       IP address whose byte to be incremented (It's in the form\n+#                    of 4 byte hex number:  ex, \"4c 2e 01 05\"  \n+# \n+#   byteNum         the byte field to be incremented\n+#   amount          increment the field by this number\n+#\n+########################################################################\n+proc incrIpFieldHexFormat {ipAddress {byteNum 4} {amount 1}} \\\n+{\n+    set hexIpAddr   0x[join $ipAddress \"\"]\n+\n+    set val [format %x [expr [format %d $hexIpAddr] + [expr {$amount<<(8*(4-$byteNum))}]]]\n+    return [long2octet [format %d \"0x$val\"] 4]\n+}\n+\n+\n+########################################################################\n+# Procedure: assignIncrMacAddresses\n+#\n+# Description: Assigns an incrementing MAC address\n+#\n+# Argument(s):\n+#   portList       a list of sorted ports\n+#\n+########################################################################\n+proc assignIncrMacAddresses {portList} \\\n+{\n+    logMsg \"Assigning incrementing addresses on all ports ...\"\n+    set retCode $::TCL_OK\n+\n+    scan [lindex $portList 0] \"%d %d %d\" c l p\n+    set currMacAddr [join [list 00 [format \"%02x %02x\" $l $p ] 00 00 00 ]]\n+\n+    foreach maplist $portList {\n+        scan $maplist \"%d %d %d\" c l p\n+\n+        if {![IsPOSPort $c $l $p] } {\n+            if [port get $c $l $p] {\n+                errorMsg \"Error getting port [getPortId $c $l $p]\"\n+                set retCode $::TCL_ERROR\n+            }\n+\n+            port config -MacAddress $currMacAddr\n+            if [port set $c $l $p] {\n+                errorMsg \"Error setting port [getPortId $c $l $p]\"\n+                set retCode $::TCL_ERROR\n+            }\n+\n+            logMsg \"[getPortId $c $l $p] ====>  MAC: $currMacAddr\"\n+            set currMacAddr [incrMacAddress currMacAddr [port cget -numAddresses]]\n+        }\n+    }\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: incrHostIpAddr\n+#\n+# Description: Increments the host portion of the IP address\n+#              NOTE:  will carry!!\n+#\n+# Argument(s):\n+#   ipAddress      - ip address to increment\n+#   amount         - amount to increment by\n+#\n+########################################################################\n+proc incrHostIpAddr {ipAddress {amount 1}} \\\n+{\n+    return [incrIpField $ipAddress 4 $amount]\n+}\n+\n+\n+########################################################################\n+# Procedure: waitForResidualFrames\n+#\n+# Description: Waits for residual rx frames\n+#\n+# Argument(s):\n+#   time        - time to wait\n+#\n+########################################################################\n+proc waitForResidualFrames {time} \\\n+{\n+    logMsg \"Waiting for Residual frames to settle down for $time seconds\"\n+    for {set timeCtr 1} {$timeCtr <= $time} {incr timeCtr} {\n+        logMsg \"Waited for $timeCtr of $time seconds\"\n+        after 1000\n+    }\n+}\n+\n+\n+########################################################################################\n+# Procedure: getPerTxArray\n+#\n+# Description: Helper proc that seperates multiple map per Tx port\n+#\n+# Arguments(s):\n+#   TxRxArray       - map, ie. one2oneArray\n+#   PerTxArray      - per Tx map, ie. one2one or one2many\n+#   txPort          - tx port\n+#   testCmd         - name of test command, ie. tput\n+#\n+########################################################################################\n+proc getPerTxArray {TxRxArray PerTxArray txPort } \\\n+{\n+    upvar $TxRxArray    txRxArray\n+    upvar $PerTxArray   perTxArray\n+\n+    set retCode 0\n+\n+    if [info exists perTxArray] {\n+        unset perTxArray\n+    }\n+    foreach rxPort $txRxArray($txPort) {\n+        scan [join $rxPort] \"%d %d %d\" rx_c rx_l rx_p               \n+        set perTxArray($txPort)   [lappend perTxArray($txPort) [list $rx_c $rx_l $rx_p]] \n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: getTxPorts\n+#\n+# Description: Gets all the Tx ports from any map array passed.\n+#\n+# Argument(s):\n+#   MapArray        the reference to map array to be scanned\n+#\n+# Returns:\n+#   txList          List containing all Tx ports\n+#\n+########################################################################\n+proc getTxPorts {MapArray} \\\n+{\n+    upvar $MapArray mapArray\n+\n+    set txList {}\n+\n+    if [info exists mapArray] {\n+        if {[array exists mapArray]} {\n+            foreach txMap [array names mapArray] {\n+\n+                regsub -all \",\" $txMap \" \" txPort\n+\n+                if {[lsearch $txList $txPort] == -1} {\n+                    # add this Tx port to the list\n+                    lappend txList $txPort\n+                }\n+            }\n+        } else {\n+            foreach port $mapArray {\n+                lappend txList [join [split $port ',']]\n+            }\n+        }\n+    }\n+\n+    return [lsort -dictionary $txList]\n+}\n+\n+\n+########################################################################\n+# Procedure: getRxPorts\n+#\n+# Description: Gets all the Tx ports from any map array passed.\n+#\n+# Argument(s):\n+#   MapArray        the reference to map array to be scanned\n+#\n+# Returns:\n+#   rxList          List containing all Rx ports\n+#\n+########################################################################\n+proc getRxPorts {MapArray} \\\n+{\n+    upvar $MapArray mapArray\n+\n+    set rxList {}\n+\n+    if [info exists mapArray] {\n+\n+        if {[array exists mapArray]} {\n+\n+            foreach {txMap rxMap} [array get mapArray] {\n+\n+                foreach rxPort $rxMap {\n+                    if {[lsearch $rxList $rxPort] == -1} {\n+                        # add this Rx port to the list\n+                        lappend rxList $rxPort\n+                    }\n+                }\n+            }\n+\n+        } else {\n+            foreach port $mapArray {\n+                lappend rxList [join [split $port ',']]\n+            }\n+        }\n+    }\n+\n+    return [lsort -dictionary $rxList]\n+}\n+\n+\n+########################################################################\n+# Procedure:    getAllPorts\n+#\n+# Description:  Gets all the ports from any map array passed.\n+#\n+# Argument(s):  MapArray:   Reference to map array to be scanned\n+#\n+# Returns:      portList:   List containing all ports\n+#\n+########################################################################\n+proc getAllPorts {MapArray} \\\n+{\n+    upvar $MapArray mapArray\n+\n+    set portList {}\n+\n+    if [info exists mapArray] {\n+        if {[array exists mapArray]} {\n+\n+            foreach {txMap rxMap} [array get mapArray] {\n+\n+                regsub -all \",\" $txMap \" \" txPort\n+\n+                if {[lsearch $portList $txPort] == -1} {\n+                    # add this Tx port to the list\n+                    lappend portList $txPort\n+                }\n+\n+                foreach rxPort $rxMap {\n+                    if {[lsearch $portList $rxPort] == -1} {\n+                        # add this Rx port to the list\n+                        lappend portList $rxPort\n+                    }\n+                }\n+            }\n+        } else {\n+            foreach port $mapArray {\n+                lappend portList [join [split $port ',']]\n+            }\n+        }\n+    }\n+\n+    return [lsort -dictionary $portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: comparePortArray\n+#\n+# This command compares two arrays; if one array contains ports that\n+#           the other array doesn't, it will optionally remove those ports\n+#\n+# Argument(s):\n+#       KeepArray        array of ports to compare against\n+#       CompareArray     array to check\n+#       removePorts      optionally remove ports from compareArray that\n+#                        are not in keepArray\n+#\n+# Return:\n+#       returns 1 if ports are in CompareArray that are not in KeepArray\n+#\n+########################################################################\n+proc comparePortArray {KeepArray CompareArray {removePorts remove}} \\\n+{\n+    upvar $KeepArray     keepArray\n+    upvar $CompareArray  compareArray\n+\n+    set retCode 0\n+\n+    set keepList   [getAllPorts keepArray]\n+\n+    foreach txPort [array names compareArray] {\n+        scan [split [join $txPort] ,] \"%d %d %d\" c l p\n+        # if we don't find the tx port in the keepArray, remove it from the compareArray\n+        if {[lsearch $keepList \"$c $l $p\"] == -1 && [info exists compareArray]} {\n+            if {$removePorts == \"remove\"} {\n+                unset compareArray($txPort)\n+            }\n+            set retCode 1\n+            continue\n+        }\n+        # now cycle through the rx ports & remove them if they're not in the keepArray\n+        foreach rxPort $compareArray($txPort) {\n+            scan [join $rxPort] \"%d %d %d\" c l p\n+\n+            if {[lsearch $keepList \"$c $l $p\"] == -1} {\n+                if {$removePorts == \"remove\"} {\n+                    set index                 [lsearch  $compareArray($txPort) \"$c $l $p\"]\n+                    set compareArray($txPort) [lreplace $compareArray($txPort) $index $index]\n+                }\n+                set retCode 1\n+            }\n+            if {[llength $compareArray($txPort)] <= 0} {\n+                unset compareArray($txPort)\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: mergePortArray\n+#\n+# Description:  This command merges the two array into one (TxRxArray and \n+#               MapArray are merged into TxRxArray\n+#              \n+#\n+# Argument(s):\n+#        TxRxArray  - first array before merge and then final array after merge\n+#        mapArray   - second array to be merged into TxRxArray\n+# \n+#\n+########################################################################\n+proc mergePortArray { TxRxArray MapArray } \\\n+{\n+    upvar $TxRxArray    txRxArray\n+    upvar $MapArray     mapArray\n+\n+    set retCode 0\n+\n+    foreach txMap [array names mapArray] {\n+        scan $txMap \"%d,%d,%d\" tx_c tx_l tx_p\n+        foreach rxMap $mapArray($txMap) {\n+            scan [join $rxMap] \"%d %d %d\" rx_c rx_l rx_p\n+            \n+            if [info exists txRxArray($txMap)] {\n+                if {[lsearch $txRxArray($txMap) [list $rx_c $rx_l $rx_p]] < 0} {\n+                    lappend txRxArray($txMap)  [list $rx_c $rx_l $rx_p]\n+                }\n+            } else {\n+                set txRxArray($txMap)  [list [list $rx_c $rx_l $rx_p]]\n+            }  \n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: getAdvancedSchedulerArray\n+#\n+# This command seperates the portmap that supports adand other portmap from txRxArray\n+#\n+# Argument(s):\n+# \n+#   TxRxArray               - map, ie. one2oneArray\n+#   AdvancedSchedulerArray  - map for interfaces that support advanced stream scheduler\n+#   OtherArray              - map for rest of the interfaces (rest of the TxRxArray)\n+#\n+########################################################################\n+proc getAdvancedSchedulerArray {TxRxArray AdvancedSchedulerArray OtherArray} \\\n+{\n+    upvar $TxRxArray                txRxArray\n+    upvar $AdvancedSchedulerArray   advancedSchedulerArray\n+    upvar $OtherArray               otherArray\n+\n+    set retCode 0\n+\n+    if [info exists advancedSchedulerArray] {\n+        unset interfaceArray\n+    }\n+\n+    if [info exists otherArray] {\n+        unset otherArray\n+    }\n+\n+    foreach txMap [lnumsort [array names txRxArray]] {\n+        scan $txMap \"%d,%d,%d\" tx_c tx_l tx_p\n+        foreach rxMap $txRxArray($tx_c,$tx_l,$tx_p) {\n+            scan [join $rxMap] \"%d %d %d\" rx_c rx_l rx_p\n+\n+            if [port isValidFeature $tx_c $tx_l $tx_p portFeatureAdvancedScheduler] {\n+                if [info exist advancedSchedulerArray($tx_c,$tx_l,$tx_p)] {\n+                    if { [lsearch $advancedSchedulerArray($tx_c,$tx_l,$tx_p) [list $rx_c $rx_l $rx_p]] < 0 } {\n+                        set advancedSchedulerArray($tx_c,$tx_l,$tx_p)   [lappend advancedSchedulerArray($tx_c,$tx_l,$tx_p) [list $rx_c $rx_l $rx_p]]\n+                    }\n+                } else {\n+                    set advancedSchedulerArray($tx_c,$tx_l,$tx_p)   [lappend advancedSchedulerArray($tx_c,$tx_l,$tx_p) [list $rx_c $rx_l $rx_p]]\n+                }\n+            } else {\n+                if [info exist otherArray($tx_c,$tx_l,$tx_p)] {\n+                    if { [lsearch $otherArray($tx_c,$tx_l,$tx_p) [list $rx_c $rx_l $rx_p]] < 0 } {\n+                        set otherArray($tx_c,$tx_l,$tx_p)   [lappend otherArray($tx_c,$tx_l,$tx_p) [list $rx_c $rx_l $rx_p]]\n+                    }\n+                } else {\n+                    set otherArray($tx_c,$tx_l,$tx_p)   [lappend otherArray($tx_c,$tx_l,$tx_p) [list $rx_c $rx_l $rx_p]]\n+                }                \n+            }\n+        }\n+    }\n+\n+    debugMsg \"advancedSchedulerArray: [array get advancedSchedulerArray]\"\n+    debugMsg \"otherArray: [array get otherArray]\"\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+#\n+# NOTE: This proc is only used by Scriptmate, it will be removed from\n+#       IxOs eventually\n+#\n+# Procedure: cleanUpMultiuser\n+#\n+# Description: Clears ownership and does ixLogout if applicable\n+#\n+# Argument(s):\n+#\n+########################################################################\n+proc cleanUpMultiuser {} \\\n+{\n+    global multiList\n+\n+    if {[info exists multiList] && ([llength $multiList] > 0)} {\n+          ixClearOwnership $multiList\n+          logMsg \"Cleared ownership for the following ports:\"\n+          logMsg \"$multiList\"\n+    }\n+\n+    if {[testConfig::getLoginId] != \"\"} {\n+          logMsg \"[testConfig::getLoginId] - logging out.\"\n+          ixLogout\n+    }\n+\n+}\n+\n+\n+########################################################################\n+# Procedure: cleanUp\n+#\n+# Description: Cleans up global memory & empties the chassis chain\n+#\n+# Argument(s):\n+#\n+########################################################################\n+proc cleanUp {} \\\n+{\n+    global halCommands testConf\n+    global chassisGroup ixStopTest\n+\n+    # Special case that sometimes happens that a global named item existed\n+    if {[string compare [info globals item] \"item\"] == 0} {\n+        global item\n+        catch {unset item}\n+    }\n+\n+    set ixStopTest 0\n+\n+    dhcpStopTimers\n+\n+    #if {(![info exists cleanUpDone]) || ($cleanUpDone == 1)} {\n+    #   return\n+    #   }\n+\n+    # destroy the chassisGroup - we don't really care if it succeeded or not...\n+    if [info exists chassisGroup] {\n+        if {[info commands portGroup] != \"\"} {\n+            portGroup destroy $chassisGroup\n+        }\n+    }\n+\n+    foreach item [info globals ixg*] {\n+        global $item\n+        catch {unset $item}\n+    }\n+\n+\n+\n+    # delete all chassis from the chain, call destructors of SWIG commands\n+    # and forget the package\n+    if {[info commands chassisChain] != \"\"} {\n+        chassisChain removeAll\n+    }\n+\n+    if [info exists halCommands] {\n+        foreach halCmd $halCommands {\n+            if {[info commands $halCmd] != \"\"} {\n+                debugMsg \"Deleting      $halCmd\"\n+                rename $halCmd \"\"\n+                # remove this commands from the list\n+                lreplace $halCommands 0 0\n+            }\n+        }\n+\n+        # now delete the list\n+        unset halCommands\n+    }\n+\n+    # we need to delete the pointer refs too, because otherwise the next package req will be using stale pointers\n+    foreach ptr [info global *Ptr] {\n+        if [catch {unset ::$ptr} msg] {puts $msg}\n+    }\n+\n+    if [info exists testConf] {\n+        unset testConf\n+    }\n+\n+    debugOff\n+    logOff\n+\n+    ixFileUtils::closeAll\n+\n+    if {[isUNIX]} {\n+        if [tclServer::isTclServerConnected] {\n+            tclServer::disconnectTclServer\n+        }\n+    }\n+\n+    package forget IxTclHal\n+\tpackage forget IxTclProtocol\n+\n+    if [info exists defineCommand::commandList] {\n+        foreach testCmd $defineCommand::commandList {\n+            if { $testCmd != \"results\" } {               \n+                $testCmd setDefault\n+            }\n+\n+        }\n+    }\n+\n+    ixTclHal::cleanUpDone\n+\n+    return\n+}\n+\n+\n+###############################################################################\n+# Procedure: isIpAddressValid\n+#\n+# Description: Verify that the ip address is valid.\n+#\n+# Arguments: ipAddress - the ip address to validate\n+#\n+# Returns: true if the ip address is valid, false otherwise.\n+###############################################################################\n+proc isIpAddressValid {ipAddress} {\n+\n+    set retCode $::true\n+\n+    if {[info tclversion] == \"8.0\"} {\n+        # Advanced regular expressions are not supported in 8.0\n+\n+        # First check to see that there are four octets\n+        if {[regexp {^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$} $ipAddress]} {\n+\n+            # Now check each octet for a legitimate value\n+            foreach byte [split $ipAddress .] {\n+                if {($byte < 0) || ($byte > 255)} {\n+                    set retCode $::false\n+                    break\n+                }\n+            }\n+        } else {\n+            set retCode $::false\n+        }\n+    } else {\n+\n+        # The ip address should be four octets\n+        if {[regexp {^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$} \\\n+                $ipAddress]} {\n+\n+            # Now check each octet for a legitimate value\n+            foreach byte [split $ipAddress .] {\n+                if {($byte < 0) || ($byte > 255)} {\n+                    set retCode $::false\n+                    break\n+                }\n+            }\n+        } else {\n+            set retCode $::false\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+###############################################################################\n+# Procedure:    isMacAddressValid\n+#\n+# Description:  Verify that the mac address is valid.\n+#\n+# Input:        macAddress:    address to validate\n+#\n+# Output:       TCL_OK if address is valid, else\n+#               TCL_ERROR\n+#\n+###############################################################################\n+proc isMacAddressValid {macAddress} \\\n+{\n+    set retCode $::TCL_ERROR\n+\n+    regsub -all { |:} $macAddress \" \" macAddress\n+    if {[llength $macAddress] == 6} {\n+\n+    \tset retCode $::TCL_OK\n+        foreach value $macAddress {\n+            if {[string length $value] == 2} {\n+\t\t\t\tif {![regexp {[0-9a-fA-F]{2}} $value match]} {\n+                    set retCode $::TCL_ERROR\n+                    break\n+                }\n+            } else {\n+                set retCode $::TCL_ERROR\n+                break\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+###############################################################################\n+# Procedure:   isPartialMacAddressValid\n+#\n+# Description: Given a mac address, is it valid.  The given address does not have \n+#              to be complete\n+#\n+# Arguments:   macAddress - the partial address to verify\n+#\n+# Returns:     1 if it is valid, 0 if not valid\n+###############################################################################\n+proc isPartialMacAddressValid { macAddress } \\\n+{\n+    set retCode 1\n+\n+    if {[info tclversion] > 8.0} {\n+        if {![regexp {^([0-9a-fA-F]{1,2}( )*)*$} $macAddress]} {\n+            set retCode 0\n+        }\n+    } else {\n+        if {[string length $macAddress] > 2} {\n+            set splitChar [string index $macAddress 2]\n+            set macAddress [split $macAddress $splitChar]\n+        }\n+\n+        foreach value $macAddress {\n+            if {![regexp {^([0-9a-fA-F]+)$} $value]} {\n+                set retCode 0\n+            }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+###############################################################################\n+# Procedure:   getCommandParameters\n+#\n+# Description: Retrieve the parameters for a given command.\n+#\n+# Arguments:   command - name of the command.\n+#    \n+# Returns      All the parameters of the specified command.\n+###############################################################################\n+proc getCommandParameters {command} \\\n+{\n+    set commandParameters {}\n+\n+    if {![info exists command] || ($command == \"\")} {\n+        return $commandParameters\n+    }\n+\n+    set testMethods [format \"%s%s\" $command \"Methods\"]\n+\n+    global $testMethods\n+\n+    foreach parm [set ${testMethods}(cget)] {\n+        lappend commandParameters $parm\n+    }\n+\n+    return $commandParameters\n+}\n+\n+\n+###############################################################################\n+# Procedure:   changePortLoopback\n+#\n+# Description: Retrieve the parameters for a given command.\n+#\n+# Arguments:   TxRxArray - map, ie. one2oneArray\n+#              enabled   - flag to enable or disable the port loopback \n+#    \n+# Output:        TCL_OK if loopback enabled/disabled, else\n+#                TCL_ERROR\n+###############################################################################\n+proc changePortLoopback {TxRxArray {enabled true} {verbose noVerbose}} \\\n+{\n+    upvar $TxRxArray txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+    if {$verbose == \"verbose\" } {\n+        if {$enabled == $::true} {\n+            logMsg \"Putting ports into loopback.\"    \n+        } else {\n+            logMsg \"Getting ports out of loopback.\"\n+        }\n+    }\n+\n+    foreach txMap [getAllPorts txRxArray] {\n+        scan $txMap \"%d %d %d\" c l p\n+\n+        if [port get $c $l $p] {\n+            errorMsg \"Error getting port [getPortId $c $l $p]\"\n+            set retCode $::TCL_ERROR\n+        }\n+        port config -loopback $enabled\n+        \n+        # This part apply only to Gig SX card\n+        if { $enabled } {\n+            port config -rxTxMode $::gigLoopback\n+        } else {\n+            port config -rxTxMode $::gigNormal\n+        }\n+\n+        if [port set $c $l $p] {\n+            errorMsg \"Error setting port [getPortId $c $l $p]\"\n+            set retCode $::TCL_ERROR\n+        }                        \n+    }\n+\n+    if [writePortsToHardware txRxArray -noProtocolServer ] {\n+        errorMsg \"Error writing port configurations.\"\n+        set retCode $::TCL_ERROR\n+    }\n+ \n+    return $retCode\n+}\n+\n+\n+#################################################################################\n+# Procedure: validateUnidirectionalMap\n+#\n+# Description: This command validates the unidirectional map\n+#  \n+# Argument(s):\n+# TxRxArray       - map, ie. one2oneArray\n+#             \n+# Results :       0 : No error found\n+#                 1 : Error found\n+#\n+#################################################################################\n+proc validateUnidirectionalMap {TxRxArray } \\\n+{   \n+    upvar $TxRxArray txRxArray\n+\n+    set retCode $::TCL_OK\n+\n+    set txPortList  [getTxPorts txRxArray]\n+    set rxPortList  [getRxPorts txRxArray] \n+\n+    if {[map cget -echo] != \"true\" } {\n+        foreach txMap $txPortList {\n+             if { [lsearch $rxPortList $txMap] > -1 } {\n+                logMsg \"***** WARNING:Invalid map configuration, only unidirectional map is allowed.\"\n+                set retCode $::TCL_ERROR\n+                break\n+             }\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+###############################################################################\n+# Procedure:   getTxRxModeString\n+#\n+# Description: Retrieve the string for the value given\n+#\n+# Arguments:   modeType - txMode or rxMode\n+#              value    - integer value of the string \n+#    \n+# Output:        Returns the string corresponding that value\n+#\n+###############################################################################\n+proc getTxRxModeString { value {modeType \"TX\"} } \\\n+{\n+    set retString \"Invalid\"\n+\n+    set modeType [string toupper $modeType]\n+\n+    set modeTX($::portTxPacketStreams)                      portTxPacketStreams                     \n+    set modeTX($::portTxPacketFlows)                        portTxPacketFlows                       \n+    set modeTX($::portTxTcpSessions)                        portTxTcpSessions                       \n+    set modeTX($::portTxTcpRoundTrip)                       portTxTcpRoundTrip                      \n+    set modeTX($::portTxModeAdvancedScheduler)              portTxModeAdvancedScheduler             \n+    set modeTX($::portTxModeBert)\t\t\t\t            portTxModeBert\t\t\t\t            \n+    set modeTX($::portTxModeEcho)\t\t\t\t\t\t    portTxModeEcho\t\t\t\t\t\t\t\n+    set modeTX($::portTxModeBertChannelized)\t            portTxModeBertChannelized\t            \n+    set modeTX($::portTxModeDccStreams)\t\t\t\t        portTxModeDccStreams\t\t\t\t\t\n+    set modeTX($::portTxModeDccAdvancedScheduler)\t\t    portTxModeDccAdvancedScheduler\t\t\t\n+    set modeTX($::portTxModeDccFlowsSpeStreams)\t\t        portTxModeDccFlowsSpeStreams\t\t\t\n+    set modeTX($::portTxModeDccFlowsSpeAdvancedScheduler)   portTxModeDccFlowsSpeAdvancedScheduler\t\n+    set modeTX($::portTxModeAdvancedSchedulerCoarse)\t\tportTxModeAdvancedSchedulerCoarse\n+    set modeTX($::portTxModePacketStreamsCoarse)\t\t\tportTxModePacketStreamsCoarse\n+\n+    set modeRX($::portCapture)                  portCapture                                     \n+    set modeRX($::portPacketGroup)              portPacketGroup  \n+    set modeRX($::portRxModeWidePacketGroup)    portRxModeWidePacketGroup           \n+    set modeRX($::portRxTcpSessions)            portRxTcpSessions           \n+    set modeRX($::portRxTcpRoundTrip)           portRxTcpRoundTrip          \n+    set modeRX($::portRxDataIntegrity)          portRxDataIntegrity         \n+    set modeRX($::portRxFirstTimeStamp)         portRxFirstTimeStamp        \n+    set modeRX($::portRxSequenceChecking)\t    portRxSequenceChecking\t    \n+    set modeRX($::portRxModeBert)\t\t\t    portRxModeBert\t\t\t    \n+    set modeRX($::portRxModeIsl)\t\t\t\tportRxModeIsl\t\t\t\t\n+    set modeRX($::portRxModeBertChannelized)    portRxModeBertChannelized\t\n+    set modeRX($::portRxModeDcc) \t\t\t\tportRxModeDcc \t\t\t\t\n+    set modeRX($::portRxModeEcho)\t\t\t\tportRxModeEcho\n+    set modeRX($::portRxModeWidePacketGroup)\tportRxModeWidePacketGroup\n+    set modeRX($::portRxModePrbs)\t\t\t\tportRxModePrbs\n+    set modeRX($::portRxModeRateMonitoring)\t\tportRxModeRateMonitoring\n+    set modeRX($::portRxModePerFlowErrorStats)\tportRxModePerFlowErrorStats\n+\n+\n+    if {$modeType == \"TX\"} {\n+        if [info exists modeTX($value)] {\n+            set retString $modeTX($value)\n+        }\n+    } else {\n+\t    set flag  0\n+        set modes \"\"\n+        for {set i 0} {$i < [llength [array names modeRX]]} {incr i} {\n+            set enumValue [expr 1 << $i]\n+\n+            if {($enumValue > 1) && [expr $value & $enumValue] && $flag} {\n+                append modes \" | \"\n+            }\n+            if {[expr $value & $enumValue]} {\n+                set flag 1\n+            }\n+            set enumValue [expr $value & $enumValue] \n+            if [info exists modeRX($enumValue)] {\n+                append modes  $modeRX($enumValue)        \n+            }\n+        }\n+        set retString $modes\n+    }\n+ \n+    return $retString\n+}\n+\n+\n+########################################################################\n+# Procedure: removeStreams\n+#\n+# Description: This proc removes all the stream on ports in given map\n+#\n+# Arguments: TxRxPortList       - map, ie. one2oneArray\n+#\n+# Results :       0 : No error found\n+#                 1 : Error found\n+#\n+########################################################################\n+proc removeStreams { TxRxPortList {verbose verbose} } \\\n+{\n+    upvar $TxRxPortList    txRxPortList\n+    \n+ \tset retCode\t\t$::TCL_OK\n+    set portList\t[getAllPorts txRxPortList]\n+\t\t\t\t\t\t\t\t\t\t\t\t\t   \n+    if {$verbose == \"verbose\"} {\n+        logMsg \"Removing streams on the ports...\\n\"\n+    }\n+\t\n+    foreach portItem $portList {\n+        scan $portItem \"%d %d %d\" chassId cardId portId\n+\n+\t\t# since portFeaturePacketStreams is a circuit level feature, but we don't have to have\n+\t\t# a circuit id, since we want to clear all the streams under the port, therefore the below\n+\t\t# condition will cover the VCAT ports\n+\t\tset retValue [expr [port isValidFeature $chassId $cardId $portId portFeaturePacketStreams] || \\\n+\t\t\t\t\t [port isValidFeature $chassId $cardId $portId portFeatureAdvancedScheduler] || \\\n+\t\t\t\t\t [port isActiveFeature $chassId $cardId $portId portFeatureVcat]]\n+\n+\t\tswitch $retValue {\n+\t\t    1 {\n+\t\t        lappend featurePortList [list $chassId $cardId $portId]\n+\t\t    }\n+\t\t    0 {\n+\t\t        errorMsg \"!WARNING: portFeaturePacketStreams is not supported on port [getPortId $chassId $cardId $portId]\"\n+\t\t        continue\n+\t\t    }\n+\t\t}\n+\n+        # using a temp var retValue so I don't step on retCode\n+\t\tset retValue [port reset $chassId $cardId $portId]\n+        if {$retValue == $::ixTcl_notAvailable} {\n+            errorMsg \"Port [getPortId $chassId $cardId $portId] is unavailable, check ownership.\"\n+            set retCode $retValue\n+        } elseif {$retValue != $::TCL_OK} {\n+\t\t\terrorMsg \"Error deleting streams on port $chassId $cardId $portId\"\n+            set retCode $retValue\n+        }\t\t\n+\t}\n+\n+\tif {[info exists featurePortList] && $retCode == $::TCL_OK} {\n+\t\tset retCode [ixWriteConfigToHardware featurePortList -noProtocolServer ]\n+\t}\n+\n+\treturn $retCode\t\t\n+}\n+\n+\n+###############################################################################\n+# Procedure:   getIpV4MaskWidth\n+#\n+# Description: This proc gets ip mask as input and calculates the maskWidth.\n+#\n+# Arguments:   ip mask - ipV4 format.\n+#    \n+# Returns      mask width.\n+###############################################################################\n+proc getIpV4MaskWidth {ipV4Mask} \\\n+{\n+    scan $ipV4Mask \"%d.%d.%d.%d\" b1 b2 b3 b4\n+\t\n+\tset result  [mpexpr ($b4 | $b3 << 8 | $b2 << 16 | $b1 << 24) ^ 0xFFFFFFFF]\n+\t\n+\tfor {set mask  0} { $mask < 32} {incr mask} {\n+\t\tif { [mpexpr $result >> $mask] == 0} {\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\tset mask [expr 32 - $mask]\n+\t\n+    return $mask\n+}\n+\n+\n+###############################################################################\n+# Procedure:   getIpV4MaskFromWidth\n+#\n+# Description: This proc takes the mask prefix as input and calculates the ip mask.\n+#\n+# Arguments:   mask width - an integer number between 0 and 32.\n+#    \n+# Returns      mask ip.\n+###############################################################################\n+proc getIpV4MaskFromWidth {maskWidth} \\\n+{\n+    set mask [mpexpr (0xffffffff << (32 - $maskWidth)) & 0xffffffff]\n+    return [num2ip $mask]\n+}\n+\n+\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/vlanUtils.tcl b/dep/tclclient/ixTcl1.0/Generic/vlanUtils.tcl\nnew file mode 100644\nindex 00000000..c92a4834\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/vlanUtils.tcl\n@@ -0,0 +1,327 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: vlanUtils.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t11-02-2001\tDS\n+#\n+# Description: This file contains common vlan utilities\n+#\n+########################################################################\n+\n+proc vlanUtilsSetDefault {} {\n+    set ::vlanUtils::untaggedPortList \"\"\n+}\n+\n+\n+namespace eval vlanUtils {} {\n+    vlanUtilsSetDefault\n+}\n+\n+\n+########################################################################\n+# Procedure: vlanUtils::setPortTagged\n+#\n+# Description: Sets a boolean indicated whether this port is a vlan-tagged port\n+#\n+# Arguments:\n+#   chassis - The number of the chassis\n+#   card - The number of the card\n+#   port - The number of the port\n+#\n+# Returns: TCL_OK on completion\n+########################################################################\n+proc vlanUtils::setPortTagged {chassis card port} \\\n+{\n+    variable untaggedPortList\n+\n+    set retCode $::TCL_OK\n+\n+    if {[catch {lsearch $untaggedPortList [list $chassis $card $port]} found]} {\n+        set found -1\n+    }\n+\n+    if {$found >= 0} {\n+        set untaggedPortList [lreplace $untaggedPortList $found $found]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: vlanUtils::setTagged\n+#\n+# Description: Sets a boolean indicated whether the ports in this list are vlan-tagged ports\n+#\n+# Arguments: portList - A list of ports to tag.  A port identifier is of the list form: chassis card port.\n+#\n+# Returns: TCL_OK on success and TCL_ERROR on failure\n+########################################################################\n+proc vlanUtils::setTagged {portList} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    foreach taggedPort $portList {\n+        scan $taggedPort \"%d %d %d\" c l p\n+\n+        if {[setPortTagged $c $l $p]} {\n+            set retCode $::TCL_ERROR\n+            break\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: vlanUtils::setPortUntagged\n+#\n+# Description: Sets a boolean indicated whether this port is a vlan-tagged port\n+#\n+# Arguments:\n+#   chassis - The number of the chassis for the port\n+#   card - The number of the card for the port\n+#   port - The number of the port\n+#\n+# Returns: TCL_OK on success\n+########################################################################\n+proc vlanUtils::setPortUntagged {chassis card port} \\\n+{\n+    variable untaggedPortList\n+\n+    set retCode $::TCL_OK\n+\n+    if {[catch {lsearch $untaggedPortList [list $chassis $card $port]} found]} {\n+        set found -1\n+    }\n+\n+    if {$found < 0} {\n+        lappend untaggedPortList [list $chassis $card $port]\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: vlanUtils::setUntagged\n+#\n+# Description: Sets a boolean indicated whether the ports in this list are NOT vlan-tagged ports\n+#\n+# Arguments: portList - A list of ports to tag.  A port identifier is of the list form: chassis card port.\n+#\n+# Returns: TCL_OK on success and TCL_ERROR on failure\n+########################################################################\n+proc vlanUtils::setUntagged {portList} \\\n+{\n+    set retCode $::TCL_OK\n+\n+    foreach taggedPort $portList {\n+        scan $taggedPort \"%d %d %d\" c l p\n+\n+        if {[setPortUntagged $c $l $p]} {\n+            set retCode $::TCL_ERROR\n+            break\n+        }\n+    }\n+\n+    return $retCode\n+}\n+\n+\n+########################################################################\n+# Procedure: vlanUtils::isPortTagged\n+#\n+# Description: Returns a boolean indicated whether this port is a vlan-tagged port\n+#\n+# Arguments:\n+#   chassis - The number of the chassis for the port\n+#   card - The number of the card for the port\n+#   port - The number of the port\n+#\n+# Returns: true if the port is tagged and false if it is not.\n+########################################################################\n+proc vlanUtils::isPortTagged {chassis card port} \\\n+{\n+    variable untaggedPortList\n+\n+    if {[catch {lsearch $untaggedPortList [list $chassis $card $port]} found]} {\n+        set tagged $::true\n+    } else {\n+\n+        if {$found < 0} {\n+            set tagged $::true\n+        } else {\n+            set tagged $::false\n+        }\n+    }\n+\n+    return $tagged\n+}\n+\n+\n+########################################################################\n+# Procedure: emptyUntaggedPortList\n+#\n+# Description: Reset the untagged port list to a empty list.\n+#\n+# Arguments:\n+#\n+# Returns:\n+########################################################################\n+proc vlanUtils::emptyUntaggedPortList {} \\\n+{\n+    variable untaggedPortList\n+\n+    set untaggedPortList \"\"\n+}\n+\n+\n+########################################################################\n+# Procedure: setPortTagged\n+#\n+# Description: Sets a boolean indicated whether this port is a vlan-tagged port\n+#\n+# Arguments:\n+#   chassis - The number of the chassis\n+#   card - The number of the card\n+#   port - The number of the port\n+#\n+# Returns: TCL_OK on completion\n+########################################################################\n+proc setPortTagged {chassis card port} \\\n+{\n+    return [vlanUtils::setPortTagged $chassis $card $port]\n+}\n+\n+\n+########################################################################\n+# Procedure: setTagged\n+#\n+# Description: Sets a boolean indicated whether the ports in this list are vlan-tagged ports\n+#\n+# Arguments: portList - A list of ports to tag.  A port identifier is of the list form: chassis card port.\n+#\n+# Returns: TCL_OK on success and TCL_ERROR on failure\n+########################################################################\n+proc setTagged {portList} \\\n+{\n+    return [vlanUtils::setTagged $portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: setPortUntagged\n+#\n+# Description: Sets a boolean indicated whether this port is a vlan-tagged port\n+#\n+# Arguments:\n+#   chassis - The number of the chassis for the port\n+#   card - The number of the card for the port\n+#   port - The number of the port\n+#\n+# Returns: TCL_OK on success\n+########################################################################\n+proc setPortUntagged {chassis card port} \\\n+{\n+    return [vlanUtils::setPortUntagged $chassis $card $port]\n+}\n+\n+\n+########################################################################\n+# Procedure: setUntagged\n+#\n+# Description: Sets a boolean indicated whether the ports in this list are NOT vlan-tagged ports\n+#\n+# Arguments: portList - A list of ports to tag.  A port identifier is of the list form: chassis card port.\n+#\n+# Returns: TCL_OK on success and TCL_ERROR on failure\n+########################################################################\n+proc setUntagged {portList} \\\n+{\n+    return [vlanUtils::setUntagged $portList]\n+}\n+\n+\n+########################################################################\n+# Procedure: isPortTagged\n+#\n+# Description: Returns a boolean indicated whether this port is a vlan-tagged port\n+#\n+# Arguments:\n+#   chassis - The number of the chassis for the port\n+#   card - The number of the card for the port\n+#   port - The number of the port\n+#\n+# Returns: true if the port is tagged and false if it is not.\n+########################################################################\n+proc isPortTagged {chassis card port} \\\n+{\n+    return [vlanUtils::isPortTagged $chassis $card $port]\n+}\n+\n+\n+########################################################################\n+# Procedure: getUntaggedPortList\n+#\n+# Description: Returns the list of untagged ports\n+#\n+# Arguments:\n+#\n+# Returns: The list of untagged ports.\n+########################################################################\n+proc getUntaggedPortList {} \\\n+{\n+    return $::vlanUtils::untaggedPortList\n+}\n+\n+\n+########################################################################\n+# Procedure: emptyUntaggedPortList\n+#\n+# Description: Reset the untagged port list to a empty list.\n+#\n+# Arguments:\n+#\n+# Returns:\n+########################################################################\n+proc emptyUntaggedPortList {} \\\n+{\n+    vlanUtils::emptyUntaggedPortList\n+}\n+\ndiff --git a/dep/tclclient/ixTcl1.0/Generic/xmlUtils.tcl b/dep/tclclient/ixTcl1.0/Generic/xmlUtils.tcl\nnew file mode 100644\nindex 00000000..3fa6463b\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/Generic/xmlUtils.tcl\n@@ -0,0 +1,241 @@\n+# BSD LICENSE\n+#\n+# Copyright (c) 2014, Ixia All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+# * Redistributions of source code must retain the above copyright\n+#   notice, this list of conditions and the following disclaimer.\n+# * Redistributions in binary form must reproduce the above copyright\n+#   notice, this list of conditions and the following disclaimer in\n+#   the documentation and/or other materials provided with the\n+#   distribution.\n+# * Neither the name of the copyright holder nor the names of its\n+#   contributors may be used to endorse or promote products derived\n+#   from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+#   Version 6.20\n+#   \n+#   File: xmlUtils.tcl\n+#\n+#   Copyright ©  IXIA\n+#   All Rights Reserved.\n+#\n+#\tRevision Log:\n+#\t3-7-2007\tDS\tGenesis\n+#\n+# Description: Simple XML parser.  \n+#\n+# credit to Keith Vetter, March 2004\n+# http://wiki.tcl.tk/11020\n+#\n+# Modified to work with both tcl8.3 & tcl8.4.\n+#\n+##################################################################################\n+\n+ namespace eval ::ixXML { variable XML \"\" loc 0}\n+\n+ proc ::ixXML::Init {xmlData} {\n+    variable XML\n+    variable loc\n+\n+    set XML [string trim $xmlData];\n+    regsub -all {<!--.*?-->} $XML {} XML        ;# Remove all comments\n+    set loc 0\n+ }\n+\n+ # Returns {XML|TXT|EOF|PI value attributes START|END|EMPTY}\n+ proc ::ixXML::NextToken {{peek 0}} {\n+    variable XML\n+    variable loc\n+\n+    set n [regexp -start $loc -indices {(.*?)\\s*?<(/?)(.*?)(/?)>} \\\n+               $XML all txt stok tok etok]\n+    if {! $n} {return [list EOF]}\n+    foreach {all0 all1} $all {txt0 txt1} $txt \\\n+        {stok0 stok1} $stok {tok0 tok1} $tok {etok0 etok1} $etok break\n+\n+    if {$txt1 >= $txt0} {                       ;# Got text\n+        set txt [string range $XML $txt0 $txt1]\n+        if {! $peek} {set loc [expr {$txt1 + 1}]}\n+        return [list TXT $txt]\n+    }\n+\n+    set token [string range $XML $tok0 $tok1]   ;# Got something in brackets\n+    if {! $peek} {set loc [expr {$all1 + 1}]}\n+    if {[regexp {^!\\[CDATA\\[(.*)\\]\\]} $token => txt]} { ;# Is it CDATA stuff?\n+        return [list TXT $txt]\n+    }\n+\n+    # Check for Processing Instruction <?...?>\n+    set type XML\n+    if {[regexp {^\\?(.*)\\?$} $token => token]} {\n+        set type PI\n+    }\n+    set attr \"\"\n+    regexp {^(.*?)\\s+(.*?)$} $token => token attr\n+\n+    set etype START                             ;# Entity type\n+    if {$etok0 <= $etok1} {\n+        if {$stok0 <= $stok1} { set token \"/$token\"} ;# Bad XML\n+        set etype EMPTY\n+    } elseif {$stok0 <= $stok1} {\n+        set etype END\n+    }\n+    return [list $type $token $attr $etype]\n+ }\n+ # ::ixXML::IsWellFormed\n+ #  checks if the XML is well-formed )http://www.w3.org/TR/1998/REC-xml-19980210)\n+ #\n+ # Returns \"\" if well-formed, error message otherwise\n+ # missing:\n+ #  characters: doesn't check valid extended characters\n+ #  attributes: doesn't check anything: quotes, equals, unique, etc.\n+ #  text stuff: references, entities, parameters, etc.\n+ #  doctype internal stuff\n+ #\n+ proc ::ixXML::IsWellFormed {} {\n+    set result [::ixXML::_IsWellFormed]\n+    set ::ixXML::loc 0\n+    return $result\n+ }\n+ ;proc ::ixXML::_IsWellFormed {} {\n+    array set emsg {\n+        XMLDECLFIRST \"The XML declaration must come first\"\n+        MULTIDOCTYPE \"Only one DOCTYPE is allowed\"\n+        INVALID \"Invalid document structure\"\n+        MISMATCH \"Ending tag '$val' doesn't match starting tag\"\n+        BADELEMENT \"Bad element name '$val'\"\n+        EOD \"Only processing instructions allowed at end of document\"\n+        BADNAME \"Bad name '$val'\"\n+        BADPI \"No processing instruction starts with 'xml'\"\n+    }\n+\n+    # [1] document ::= prolog element Misc*\n+    # [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?\n+    # [27] Misc ::= Comment | PI | S\n+    # [28] doctypedecl ::= <!DOCTYPE...>\n+    # [16] PI ::= <? Name ...?>\n+    set seen 0                                  ;# 1 xml, 2 pi, 4 doctype\n+    while {1} {\n+        foreach {type val attr etype} [::ixXML::NextToken] break\n+        if {[string equal $type \"PI\"]} {\n+            if {! [regexp {^[a-zA-Z_:][a-zA-Z0-9.-_:\\xB7]+$} $val]} {\n+                return [subst $emsg(BADNAME)]\n+            }\n+            if {[string equal $val \"xml\"]} {                ;# XMLDecl\n+                if {$seen != 0} { return $emsg(XMLDECLFIRST) }\n+                # TODO: check version number exist and only encoding and\n+                # standalone attributes are allowed\n+                incr seen                       ;# Mark as seen XMLDecl\n+                continue\n+            }\n+            if {[string equal -nocase \"xml\" $val]} {return $emsg(BADPI)}\n+            set seen [expr {$seen | 2}]         ;# Mark as seen PI\n+            continue\n+        } elseif {[string equal $type \"XML\"] && [string equal $val \"!DOCTYPE\"]} { ;# Doctype\n+            if {$seen & 4} { return $emsg(MULTIDOCTYPE) }\n+            set seen [expr {$seen | 4}]\n+            continue\n+        }\n+        break\n+    }\n+\n+    # [39] element ::= EmptyElemTag | STag content ETag\n+    # [40] STag ::= < Name (S Attribute)* S? >\n+    # [42] ETag ::= </ Name S? >\n+    # [43] content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)*\n+    # [44] EmptyElemTag ::= < Name (S Attribute)* S? />\n+    #\n+\n+    set stack {}\n+    set first 1\n+    while {1} {\n+        if {! $first} {                         ;# Skip first time in\n+            foreach {type val attr etype} [::ixXML::NextToken] break\n+        } else {\n+            if {![string equal $type \"XML\"] && ![string equal $type \"EOF\"]} { return $emsg(INVALID) }\n+            set first 0\n+        }\n+\n+        if {[string equal $type \"EOF\"]} break\n+        ;# TODO: check attributes: quotes, equals and unique\n+\n+        if {[string equal $type \"TXT\"]} continue\n+        if {! [regexp {^[a-zA-Z_:][a-zA-Z0-9.-_:\\xB7]+$} $val]} {\n+            return [subst $emsg(BADNAME)]\n+        }\n+\n+        if {[string equal $type \"PI\"]} {\n+            if {[string equal -nocase xml $val]} { return $emsg(BADPI) }\n+            continue\n+        }\n+        if {[string equal $etype \"START\"]} {                ;# Starting tag\n+            lappend stack $val\n+        } elseif {[string equal $etype \"END\"]} {            ;# </tag>\n+            if {![string equal $val [lindex $stack end]]} { return [subst $emsg(MISMATCH)] }\n+            set stack [lrange $stack 0 end-1]\n+            if {[llength $stack] == 0} break    ;# Empty stack\n+        } elseif {[string equal $etype \"EMPTY\"]} {          ;# <tag/>\n+        }\n+    }\n+\n+    # End-of-Document can only contain processing instructions\n+    while {1} {\n+        foreach {type val attr etype} [::ixXML::NextToken] break\n+        if {[string equal $type \"EOF\"]} break\n+        if {[string equal $type \"PI\"]} {\n+            if {[string equal -nocase xml $val]} { return $emsg(BADPI) }\n+            continue\n+        }\n+        return $emsg(EOD)\n+    }\n+    return \"\"\n+ }\n+\n+ ################################################################\n+ #\n+ # Demo code\n+ #\n+ #set xml {<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n+ #   <loc version=\"1.0\" src=\"Groundspeak\">\n+ #   <waypoint>\n+ #   <name id=\"GCGPXK\"><![CDATA[Playing Poker with the Squirrels by Rino 'n Rinette]]></name>\n+ #   <coord lat=\"40.1548166\" lon=\"-82.5202833\"/>\n+ #   <type>Geocache</type>\n+ #   <link text=\"Cache Details\">http://www.geocaching.com/seek/cache_details.aspx?wp=GCGPXK</link>\n+ #   </waypoint><waypoint>\n+ #   <name id=\"GC19DF\"><![CDATA[Great Playground Caper by Treasure Hunters Inc.]]></name>\n+ #   <coord lat=\"40.0667166666667\" lon=\"-82.5358\"/>\n+ #   <type>Geocache</type>\n+ #   <link text=\"Cache Details\">http://www.geocaching.com/seek/cache_details.aspx?wp=GC19DF</link>\n+ #   </waypoint>\n+ #   </loc>\n+ #}\n+#\n+# ::ixXML::Init $xml\n+# set wellFormed [::ixXML::IsWellFormed]\n+# if {![string equal $wellFormed \"\"]} {\n+#    puts \"The xml is not well-formed: $wellFormed\"\n+# } else {\n+#    puts \"The xml is well-formed\"\n+#    while {1} {\n+#       foreach {type val attr etype} [::ixXML::NextToken] break\n+#       puts \"looking at: $type '$val' '$attr' '$etype'\"\n+#       if {$type == \"EOF\"} break\n+#    }\n+# }\n\\ No newline at end of file\ndiff --git a/dep/tclclient/ixTcl1.0/ixInit.tcl b/dep/tclclient/ixTcl1.0/ixInit.tcl\nnew file mode 100644\nindex 00000000..6953aa5b\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/ixInit.tcl\n@@ -0,0 +1,65 @@\n+# BSD LICENSE\r\n+#\r\n+# Copyright (c) 2014, Ixia All rights reserved.\r\n+#\r\n+# Redistribution and use in source and binary forms, with or without\r\n+# modification, are permitted provided that the following conditions\r\n+# are met:\r\n+#\r\n+# * Redistributions of source code must retain the above copyright\r\n+#   notice, this list of conditions and the following disclaimer.\r\n+# * Redistributions in binary form must reproduce the above copyright\r\n+#   notice, this list of conditions and the following disclaimer in\r\n+#   the documentation and/or other materials provided with the\r\n+#   distribution.\r\n+# * Neither the name of the copyright holder nor the names of its\r\n+#   contributors may be used to endorse or promote products derived\r\n+#   from this software without specific prior written permission.\r\n+#\r\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n+# \r\n+#   Version 6.20\r\n+#   \r\n+#   File: ixInit.tcl\r\n+#\r\n+# NOTE: This file should be sourced from the ixTcl1.0 directory structure\r\n+#\r\n+# Copyright ©  IXIA.\r\n+# All Rights Reserved.\r\n+#\r\n+#############################################################################################\r\n+\r\n+# Set the initial pattern to nothing\r\n+set newPatterns {}\r\n+\r\n+# Get the current directory\r\n+set dir [pwd]\r\n+\r\n+# Get all items in the directory\r\n+foreach fileItem1 [glob -nocomplain *] {\r\n+\r\n+    # We only are concerned with directories\r\n+    if {[file isdirectory $fileItem1]} {\r\n+        lappend newPatterns [file join $fileItem1 \"*.tcl\"]\r\n+\r\n+        foreach fileItem2 [glob -nocomplain $fileItem1/*] {\r\n+            if {[file isdirectory $fileItem2]} {\r\n+                lappend newPatterns [file join $fileItem2 \"*.tcl\"]\r\n+            } \r\n+        }\r\n+    } \r\n+}\r\n+\r\n+eval auto_mkindex . $newPatterns\r\n+\r\n+\r\ndiff --git a/dep/tclclient/ixTcl1.0/ixTclHal.tcl b/dep/tclclient/ixTcl1.0/ixTclHal.tcl\nnew file mode 100644\nindex 00000000..72ad01ca\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/ixTclHal.tcl\n@@ -0,0 +1,192 @@\n+# BSD LICENSE\r\n+#\r\n+# Copyright (c) 2014, Ixia All rights reserved.\r\n+#\r\n+# Redistribution and use in source and binary forms, with or without\r\n+# modification, are permitted provided that the following conditions\r\n+# are met:\r\n+#\r\n+# * Redistributions of source code must retain the above copyright\r\n+#   notice, this list of conditions and the following disclaimer.\r\n+# * Redistributions in binary form must reproduce the above copyright\r\n+#   notice, this list of conditions and the following disclaimer in\r\n+#   the documentation and/or other materials provided with the\r\n+#   distribution.\r\n+# * Neither the name of the copyright holder nor the names of its\r\n+#   contributors may be used to endorse or promote products derived\r\n+#   from this software without specific prior written permission.\r\n+#\r\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n+#\r\n+#   Version 6.20\r\n+#   \r\n+#   File: ixTclHal.tcl\r\n+#\r\n+#  Package initialization file\r\n+#\r\n+#  This file is executed when you use \"package require IxTclHal\" to\r\n+#  load the IxTclHal library package.  It sets up the IXTCLHAL_LIBRARY\r\n+#  environment variable to point to the directory where the package\r\n+#  resides.\r\n+#\r\n+#  If the package is being loaded from a multi-user template script, then continue\r\n+#  otherwise return rightaway\r\n+#\r\n+#   Copyright ©  IXIA.\r\n+#\tAll Rights Reserved.\r\n+#\r\n+#############################################################################################\r\n+\r\n+## basically this is a keeping room for all the method pointer stuff + ixTclHal package req procs\r\n+namespace eval ixTclHal {\r\n+    variable noArgList\r\n+    variable pointerList\r\n+    variable protocolList\r\n+    variable commandList\r\n+\r\n+    variable cleanUpDone    0\r\n+\tvariable nonDeprecatedCommands\t[list]\r\n+\r\n+    proc update {MyList} \\\r\n+    {\r\n+        upvar $MyList myList\r\n+\r\n+        variable noArgList\r\n+        variable pointerList\r\n+        variable protocolList\r\n+        variable commandList\r\n+        \r\n+        set myList [join [list $noArgList $pointerList $protocolList $commandList]]\r\n+    }\r\n+\r\n+    proc createCommand {object command args} \\\r\n+    {\r\n+        # make sure the command doesn't already exist so that we don't step on it!!\r\n+        if {[llength [info commands ::$command]] == 0} {\r\n+            validateArgs $args\r\n+            eval [format \"proc ::%s {args}                                 \\\r\n+                          {                                                \\\r\n+                              if {\\[%s %s [join $args]\\] == \\\"\\\"} {        \\\r\n+\t                              puts \\\"Error instantiating %s object!\\\"; \\\r\n+\t                              return 1;                                \\\r\n+                              };                                           \\\r\n+                              return \\[eval %s \\$args];                    \\\r\n+                          }\"                                               \\\r\n+                 $command $object $command $object $command] \r\n+        }       \r\n+    }\r\n+\r\n+    proc createCommandPtr {object command args} \\\r\n+    {\r\n+        # make sure the command doesn't already exist so that we don't step on it!!\r\n+        if {[llength [info commands ::$command]] == 0} {\r\n+            set ptrCmd [format \"$command%s\" Ptr]\r\n+            validateArgs $args\r\n+            eval [format \"proc ::%s {args}                                   \\\r\n+                          {                                                \\\r\n+                              set ::%s \\[%s %s [join $args]\\];             \\\r\n+                              if {\\$::%s == \\\"\\\"} {                        \\\r\n+\t                              puts \\\"Error instantiating %s object!\\\"; \\\r\n+\t                              return 1;                                \\\r\n+                              };                                           \\\r\n+                              return \\[eval %s \\$args];                    \\\r\n+                          }\"                                               \\\r\n+                 $command $ptrCmd $object $command $ptrCmd $object $command $command]\r\n+        }\r\n+    }\r\n+\r\n+    # this one is scary; it adds a line of code to the created proc right before the return\r\n+    # so that we can setup pointers in an ixTclHal object\r\n+    proc updateCommand {command args} \\\r\n+    {\r\n+        set commandProc [string trim [info body $command]]\r\n+        set lastcmd     [string range $commandProc [string last return $commandProc] end]\r\n+\r\n+        eval [format \"proc ::%s {args}                                   \\\r\n+                      {                                                \\ \r\n+                          %s                                           \\\r\n+                      }\"                                               \\\r\n+             $command [concat [string range $commandProc 0 [expr [string last return $commandProc]-1]] [format \"%s;\" [join $args]] $lastcmd] ]\r\n+    }\r\n+\r\n+    proc validateArgs {args} \\\r\n+    {\r\n+        set args [join $args]\r\n+        if {$args != \"\"} {\r\n+            foreach cmdPtr $args {\r\n+                regsub -all {[$]} $cmdPtr \"\" cmdPtr\r\n+                if {![info exists $cmdPtr]} {\r\n+                    regsub -all {[;:\"$']} $cmdPtr \"\" cmd\r\n+                    regsub \"Ptr$\" $cmd \"\" cmd\r\n+                    catch {$cmd}\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    proc cleanUpDone   {} {variable cleanUpDone; set cleanUpDone 1}\r\n+    proc isCleanUpDone {} {variable cleanUpDone; return $cleanUpDone}\r\n+}\r\n+\r\n+\r\n+set currDir [file dirname [info script]]\r\n+\r\n+source [file join $currDir ixTclSetup.tcl]\r\n+source [file join $currDir ixTclHalSetup.tcl]\r\n+\r\n+package provide IxTclHal 6.20\r\n+\r\n+\r\n+#\r\n+# Source the user configuration file located in the following directory.\r\n+#\r\n+# IXIA_DIR/TclScripts/lib/ixTcl1.0\r\n+#\r\n+# IXIA_DIR is the name of the directory where IXIA software is installed.\r\n+# The directory UserFiles should be created while IXIA software is being\r\n+# installed.\r\n+#\r\n+# The name of the file has to be userProfile.tcl.\r\n+#\r\n+catch {\r\n+    source [file join $currDir userProfile.tcl]\r\n+}\r\n+\r\n+if {[catch {source [file join $currDir ixScriptmatePackageControl.tcl]}] } {\r\n+    catch {package require Scriptmate}\r\n+}\r\n+\r\n+# Recent IxNetwork Tcl pacakges allow the user to specify a version.  Try that first:\r\n+if {[info exists ::IxTclHal_LoadIxTclProtocolVersion]} {\r\n+    # If the user requests \"none\", simply do not load the package at all\r\n+    if {$::IxTclHal_LoadIxTclProtocolVersion != \"none\"} {\r\n+        # Attempt to require the specified version of IxTclProtocol package\r\n+        if {[catch {package require IxTclProtocol $::IxTclHal_LoadIxTclProtocolVersion} IxTclProtocol_result} {\r\n+            # Display a helpful message on failure\r\n+            set savInfo $::errorInfo\r\n+            if {[catch {package versions IxTclProtocol} versionList]} {\r\n+                set versionList [list]\r\n+            }\r\n+            set errMsg \"Couldn't load IxTclProtocol version \\\"$::IxTclHal_LoadIxTclProtocolVersion\\\" ('set ::IxTclHal_LoadIxTclProtocolVersion \\\"none\\\"', or any of: $versionList, or unset it)\"\r\n+            error $errMsg $savInfo\r\n+        }\r\n+    }\r\n+} else {\r\n+    # If the user did not specify a version, try to load the first IxTclProtocol we can find:\r\n+    if {[catch {package require IxTclProtocol}] } {\r\n+        # Finally, try the legacy location:\r\n+        catch {source [file join $currDir ixTclProtocolPackageControl.tcl] }\r\n+        # If nothing is found, that's ok, IxNetwork is just not installed\r\n+    }\r\n+}\r\n+\r\ndiff --git a/dep/tclclient/ixTcl1.0/ixTclHalSetup.tcl b/dep/tclclient/ixTcl1.0/ixTclHalSetup.tcl\nnew file mode 100644\nindex 00000000..84eaeb95\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/ixTclHalSetup.tcl\n@@ -0,0 +1,400 @@\n+# BSD LICENSE\r\n+#\r\n+# Copyright (c) 2014, Ixia All rights reserved.\r\n+#\r\n+# Redistribution and use in source and binary forms, with or without\r\n+# modification, are permitted provided that the following conditions\r\n+# are met:\r\n+#\r\n+# * Redistributions of source code must retain the above copyright\r\n+#   notice, this list of conditions and the following disclaimer.\r\n+# * Redistributions in binary form must reproduce the above copyright\r\n+#   notice, this list of conditions and the following disclaimer in\r\n+#   the documentation and/or other materials provided with the\r\n+#   distribution.\r\n+# * Neither the name of the copyright holder nor the names of its\r\n+#   contributors may be used to endorse or promote products derived\r\n+#   from this software without specific prior written permission.\r\n+#\r\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n+# \r\n+#   Version 6.20\r\n+#   \r\n+#   File: ixTclHalSetup.tcl\r\n+#\r\n+#  Package initialization file\r\n+#\r\n+#  This file is executed when you use \"package require IxTclHal\" to\r\n+#  load the IxTclHal library package. It sets up the TclHal related\r\n+#  objects and commands. This file will be called by ixtclhal.tcl file\r\n+#  on the server side or whereever the TclHal.dll file is installed.\r\n+#\r\n+#\r\n+# Copyright ©  IXIA.\r\n+# All Rights Reserved.\r\n+#\r\n+#############################################################################################\r\n+\r\n+if [isWindows] {\r\n+    load ixTclHal.dll\r\n+\r\n+\t# This is done for the applications that don't know the location of the mpexpr10.dll, itm\r\n+\tset mpexprPath \"$env(IXTCLHAL_LIBRARY)/../../bin\"\r\n+\tif { [catch {load Mpexpr10.dll}] } {\r\n+\t\tcatch {load $mpexprPath/Mpexpr10.dll}\r\n+\t}\r\n+\r\n+\r\n+    ############################ OBJECT INSTANTIATION ##########################\r\n+\r\n+    foreach procName $ixTclHal::noArgList {\r\n+        set tclCmd [format \"TCL%s%s\" [string toupper [string index $procName 0]] [string range $procName 1 end]]\r\n+        ixTclHal::createCommand $tclCmd $procName\r\n+    }\r\n+\r\n+    ixTclHal::createCommand TCLStatistics    stat\r\n+    ixTclHal::createCommand TCLUtils         ixUtils\r\n+    ixTclHal::createCommand TCLVsrStatistics vsrStat\r\n+\r\n+    foreach procName $ixTclHal::pointerList {\r\n+        set tclCmd [format \"TCL%s%s\" [string toupper [string index $procName 0]] [string range $procName 1 end]]\r\n+        ixTclHal::createCommandPtr $tclCmd $procName\r\n+    }\r\n+\r\n+    foreach procName $ixTclHal::protocolList {\r\n+        set tclCmd [format \"TCL%s%s\" [string toupper [string index $procName 0]] [string range $procName 1 end]]\r\n+        ixTclHal::createCommand $tclCmd $procName \\$::portPtr\r\n+    }\r\n+\tixTclHal::createCommandPtr TCLProtocolOffset\t  protocolOffset   \\$::portPtr\r\n+    ixTclHal::createCommandPtr TCLStream              stream           \\$::portPtr \\$::protocolPtr \\$::protocolOffsetPtr\r\n+    ixTclHal::createCommandPtr TCLIgmpAddressTable    igmpAddressTable \\$::igmpAddressTableItemPtr\r\n+    ixTclHal::createCommandPtr TCLRip                 rip              \\$::portPtr\r\n+    ixTclHal::createCommandPtr TCLMpls                mpls             \\$::portPtr \r\n+    ixTclHal::createCommand    TCLAtmHeader           atmHeader        \\$::portPtr \\$::atmHeaderCounterPtr\r\n+    ixTclHal::createCommandPtr TCLSrpDiscovery        srpDiscovery     \\$::portPtr \\$::srpMacBindingPtr\r\n+    ixTclHal::createCommandPtr TCLSrp                 srpHeader        \\$::portPtr \\$::protocolPtr\r\n+    ixTclHal::createCommand    TCLIgmp\t\t\t      igmp\t\t\t   \\$::portPtr\t\\$::igmpGroupRecordPtr\r\n+\r\n+    ixTclHal::createCommandPtr TCLUdf                 udf              \\$::streamPtr\r\n+    ixTclHal::createCommand    TCLTableUdf            tableUdf         \\$::portPtr\t\\$::tableUdfColumnPtr\r\n+    ixTclHal::createCommand    TCLSequenceNumberUdf   sequenceNumberUdf \\$::portPtr\r\n+    ixTclHal::createCommand    TCLPacketGroup         packetGroup       \\$::udfPtr \\$::packetGroupThresholdListPtr\r\n+    ixTclHal::createCommand    TCLPacketLengthInsertion      packetLengthInsertion   \\$::streamPtr\r\n+\r\n+    ixTclHal::createCommand    TCLIpAddressTable      ipAddressTable   \\$::ipAddressTableItemPtr\r\n+    ixTclHal::createCommand    TCLArpServer           arpServer        \\$::arpAddressTableEntryPtr\r\n+    ixTclHal::createCommand    TCLRipRoute            ripRoute         \\$::ripPtr\r\n+    ixTclHal::createCommand    TCLMplsLabel           mplsLabel        \\$::mplsPtr\r\n+\r\n+    ixTclHal::createCommandPtr TCLRprRingControl            rprRingControl  \\$::portPtr \\$::protocolPtr\r\n+    ixTclHal::createCommandPtr TCLRprTlvIndividualBandwidth rprTlvIndividualBandwidth   \\$::rprTlvBandwidthPairPtr\r\n+    ixTclHal::createCommand    TCLRprTopology               rprTopology     \\$::portPtr \\$::rprTlvIndividualBandwidthPtr \\\r\n+                                                                                        \\$::rprTlvStationNamePtr    \\\r\n+                                                                                        \\$::rprTlvNeighborAddressPtr    \\\r\n+                                                                                        \\$::rprTlvTotalBandwidthPtr     \\\r\n+                                                                                        \\$::rprTlvVendorSpecificPtr     \\\r\n+                                                                                        \\$::rprTlvWeightPtr \r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n+\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n+    ixTclHal::createCommandPtr TCLIpV6HopByHop      ipV6HopByHop       \\$::ipV6OptionPAD1Ptr                    \\\r\n+                                                                       \\$::ipV6OptionPADNPtr                    \\\r\n+                                                                       \\$::ipV6OptionJumboPtr                   \\\r\n+                                                                       \\$::ipV6OptionRouterAlertPtr             \\\r\n+                                                                       \\$::ipV6OptionBindingUpdatePtr           \\\r\n+                                                                       \\$::ipV6OptionBindingAckPtr              \\\r\n+                                                                       \\$::ipV6OptionBindingRequestPtr          \\\r\n+                                                                       \\$::ipV6OptionMIpV6UniqueIdSubPtr        \\\r\n+                                                                       \\$::ipV6OptionMIpV6AlternativeCoaSubPtr  \\\r\n+                                                                       \\$::ipV6OptionUserDefinePtr\r\n+\r\n+    ixTclHal::createCommandPtr TCLIpV6Destination   ipV6Destination    \\$::ipV6OptionPAD1Ptr                    \\\r\n+                                                                       \\$::ipV6OptionPADNPtr                    \\\r\n+                                                                       \\$::ipV6OptionHomeAddressPtr             \r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                                          \r\n+\r\n+    ixTclHal::createCommand    TCLIpV6               ipV6              \\$::portPtr  \\$::ipV6RoutingPtr          \\\r\n+                                                                                    \\$::ipV6FragmentPtr         \\\r\n+                                                                                    \\$::ipV6DestinationPtr      \\\r\n+                                                                                    \\$::ipV6AuthenticationPtr\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::ipV6HopByHopPtr\r\n+    ixTclHal::createCommandPtr TCLCustomOrderedSet   customOrderedSet\r\n+    ixTclHal::createCommand    TCLLinkFaultSignaling linkFaultSignaling \\$::customOrderedSetPtr\r\n+    ixTclHal::createCommandPtr TCLPacketGroupStats   packetGroupStats  \\$::latencyBinPtr\r\n+    ixTclHal::createCommandPtr TCLGfp\t\t\t\t gfp\t\t\t   \\$::portPtr\r\n+                                                                                        \r\n+    ixTclHal::createCommand    TCLAtmOam\t\t\tatmOam\t\t\t\t\\$::portPtr\t\t\\$::atmOamAisPtr\t\\\r\n+                                                                                        \\$::atmOamRdiPtr\t\\\r\n+                                                                                        \\$::atmOamFaultManagementCCPtr\t\\\r\n+                                                                                        \\$::atmOamFaultManagementLBPtr  \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::atmOamActDeactPtr\r\n+                                                                                        \r\n+    ixTclHal::createCommandPtr TCLAtmOamTrace\t\tatmOamTrace\t\t\t\\$::portPtr\r\n+\r\n+    ixTclHal::createCommandPtr TCLVlan\t\t\t\tvlan\t\t        \\$::portPtr\r\n+    ixTclHal::createCommand\t   TCLStackedVlan       stackedVlan         \\$::portPtr \\$::vlanPtr\r\n+\r\n+\r\n+    ixTclHal::createCommandPtr TCLMmd   mmd     \\$::mmdRegisterPtr\r\n+    ixTclHal::createCommandPtr TCLMiiae miiae   \\$::mmdPtr\r\n+\r\n+    ixTclHal::createCommandPtr TCLDhcpV4Properties\t\tdhcpV4Properties\t\t\\$::dhcpV4TlvPtr\r\n+    ixTclHal::createCommandPtr TCLDhcpV4DiscoveredInfo  dhcpV4DiscoveredInfo\t\\$::dhcpV4TlvPtr\r\n+\r\n+\t# dhcpV6Tlv command is exactly the same as dhcpV4Tlv.  We use the same underlying C++ object.\r\n+\tixTclHal::createCommandPtr TCLDhcpV4Tlv\t\t\t\tdhcpV6Tlv\t\r\n+    ixTclHal::createCommandPtr TCLDhcpV6Properties\t\tdhcpV6Properties\t\t\\$::dhcpV6TlvPtr\r\n+    ixTclHal::createCommandPtr TCLDhcpV6DiscoveredInfo  dhcpV6DiscoveredInfo\t\\$::dhcpV6TlvPtr\r\n+\r\n+    # fipTlv command is exactly the same as dhcpV4Tlv.  We use the same underlying C++ object.\r\n+\tixTclHal::createCommandPtr TCLDhcpV4Tlv\t\t\t\tfipTlv\r\n+\tixTclHal::createCommandPtr TCLFcoeProperties\tfcoeProperties  \\$::fipTlvPtr  \\\r\n+\t                                                                \\$::fcoePlogiPtr  \\\r\n+                                                                    \\$::fcoeNameServerPtr \\\r\n+                                                                    \\$::fcNameServerQueryPtr\r\n+                                                                    \r\n+    ixTclHal::createCommandPtr TCLFcProperties\t   fcProperties  \t\t\\$::fcPlogiPtr  \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::fcNameServerPtr \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::fcNameServerQueryPtr\r\n+\t                                                                \r\n+\tixTclHal::createCommandPtr TCLNpivProperties\tnpivProperties  \\$::fcoePlogiPtr  \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::fcoeNameServerPtr \\\r\n+                                                                    \\$::fcNameServerPtr \\\r\n+                                                                    \\$::fcNameServerQueryPtr\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n+\tixTclHal::createCommandPtr TCLDcbxProperties\tdcbxProperties  \\$::lldpPortIdPtr    \\\r\n+\t                                                                \\$::dcbxPriorityGroupFeaturePtr  \\\r\n+\t                                                                \\$::dcbxPfcFeaturePtr  \\\r\n+\t                                                                \\$::dcbxFcoeFeaturePtr  \\\r\n+\t                                                                \\$::dcbxLogicalLinkFeaturePtr  \\\r\n+                                                                    \\$::dcbxCustomFeaturePtr  \\\r\n+                                                                    \\$::dcbxIscsiFeaturePtr\r\n+                                                            \t\r\n+\tixTclHal::createCommandPtr TCLInterfaceEntry     interfaceEntry     \\$::interfaceIpV4Ptr\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::interfaceIpV6Ptr\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::dhcpV4PropertiesPtr \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::dhcpV6PropertiesPtr \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::fcoePropertiesPtr\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::npivPropertiesPtr\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::ptpPropertiesPtr    \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::dcbxPropertiesPtr   \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::fcPropertiesPtr \r\n+\r\n+    ixTclHal::createCommandPtr TCLDiscoveredNeighbor discoveredNeighbor \\$::discoveredAddressPtr\r\n+    ixTclHal::createCommandPtr TCLDiscoveredList     discoveredList     \\$::discoveredNeighborPtr \\$::discoveredAddressPtr\r\n+    \r\n+    ixTclHal::createCommandPtr TCLDcbxDiscoveredInfo dcbxDiscoveredInfo  \\$::dcbxPriorityGroupFeaturePtr  \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \\$::dcbxPfcFeaturePtr  \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \\$::dcbxFcoeFeaturePtr  \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \\$::dcbxLogicalLinkFeaturePtr  \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \\$::dcbxCustomFeaturePtr    \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \\$::dcbxControlTlvPtr  \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \\$::dcbxIscsiFeaturePtr\r\n+\r\n+    ixTclHal::createCommand    TCLInterfaceTable     interfaceTable     \\$::interfaceEntryPtr\t\t\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    \\$::discoveredListPtr\t\t\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::dhcpV4DiscoveredInfoPtr\t\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::dhcpV6DiscoveredInfoPtr\t\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::fcoeDiscoveredInfoPtr\t\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::ptpDiscoveredInfoPtr        \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::dcbxDiscoveredInfoPtr\r\n+\r\n+    ixTclHal::createCommand    TCLSonetCircuitList   sonetCircuitList   \\$::sonetCircuitPtr\r\n+\r\n+    ixTclHal::createCommand    TCLMacSecTx\t\t\t macSecTx\t\t    \\$::macSecChannelPtr \r\n+    ixTclHal::createCommand    TCLMacSecRx\t\t\t macSecRx\t\t    \\$::macSecChannelPtr\r\n+    ixTclHal::createCommand    TCLMacSecTag\t\t\t macSecTag\t\t\t\\$::portPtr\r\n+\r\n+    ixTclHal::createCommandPtr TCLOamInformation     oamInformation\t\t\\$::oamLocalInformationTlvPtr\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::oamRemoteInformationTlvPtr  \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::oamOrganizationSpecificTlvPtr                   \r\n+\r\n+    ixTclHal::createCommandPtr TCLOamEventNotification oamEventNotification\t\\$::oamSymbolPeriodTlvPtr\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::oamFrameTlvPtr\t\t\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::oamFramePeriodTlvPtr\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::oamSummaryTlvPtr\t\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::oamEventOrgTlvPtr\r\n+\r\n+    ixTclHal::createCommandPtr TCLOamVariableRequest oamVariableRequest\t\t\\$::oamVariableRequestTlvPtr\r\n+    ixTclHal::createCommandPtr TCLOamVariableResponse oamVariableResponse\t\\$::oamVariableResponseTlvPtr\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                   \r\n+    ixTclHal::createCommand    TCLOamHeader          oamHeader          \\$::portPtr \\$::oamInformationPtr\t\t\t\\\r\n+                                                                                    \\$::oamEventNotificationPtr     \\\r\n+                                                                                    \\$::oamVariableRequestPtr\t\t\\\r\n+                                                                                    \\$::oamVariableResponsePtr      \\\r\n+                                                                                    \\$::oamLoopbackControlPtr\t\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::oamOrganizationSpecificPtr\r\n+\r\n+    ixTclHal::createCommand    TCLCiscoMetaData\t\tciscoMetaData       \\$::portPtr \\$::ciscoMetaDataSourceGroupTagPtr\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::ciscoMetaDataCustomOptionPtr\r\n+\r\n+    ixTclHal::createCommand    TCLConditionalStats\tconditionalStats    \\$::conditionalTablePtr\r\n+\r\n+    ixTclHal::createCommand    TCLPtp          ptp\t\t\t\t\t\t\\$::portPtr \\$::ptpAnnouncePtr\t\t\t\\\r\n+                                                                                    \\$::ptpDelayRequestPtr\t\t\\\r\n+                                                                                    \\$::ptpSyncPtr\t\t\t\t\\\r\n+                                                                                    \\$::ptpFollowUpPtr\t\t\t\\\r\n+                                                                                    \\$::ptpDelayResponsePtr\t\t\r\n+\r\n+\r\n+    ixTclHal::createCommandPtr TCLIcmpV6NeighborDiscovery\ticmpV6NeighborDiscovery \\$::icmpV6OptionLinkLayerSourcePtr      \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::icmpV6OptionLinkLayerDestinationPtr \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::icmpV6OptionPrefixInformationPtr    \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::icmpV6OptionRedirectedHeaderPtr\t\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::icmpV6OptionMaxTransmissionUnitPtr  \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::icmpV6OptionUserDefinePtr\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n+\r\n+\tixTclHal::createCommand    TCLIcmpV6               icmpV6\t\t\t\\$::portPtr \\$::icmpV6ErrorPtr\t\t\t\t\\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::icmpV6InformationalPtr\t\t\\\r\n+                                                                                    \\$::icmpV6MulticastListenerPtr\t\\\r\n+                                                                                    \\$::icmpV6NeighborDiscoveryPtr\t\\\r\n+                                                                                    \\$::icmpV6UserDefinePtr\r\n+\r\n+    ixTclHal::createCommand    TCLCommonTransport    commonTransport    \\$::portPtr                             \\\r\n+                                                                        \\$::ctPreamblePtr                       \\\r\n+                                                                        \\$::ctGetAllNextRequestPtr              \\\r\n+                                                                        \\$::ctGetAllNextAcceptPtr               \\\r\n+                                                                        \\$::ctGetPortNameRequestPtr             \\\r\n+                                                                        \\$::ctGetPortNameAcceptPtr              \\\r\n+                                                                        \\$::ctGetNodeNameRequestPtr             \\\r\n+                                                                        \\$::ctGetNodeNameAcceptPtr              \\\r\n+                                                                        \\$::ctGetFC4TypeRequestPtr              \\\r\n+                                                                        \\$::ctRegisterNodeNameRequestPtr\r\n+\r\n+    ixTclHal::createCommandPtr TCLFcpCommandStatus     fcpCommandStatus \\$::fcpSnsInfoPtr\r\n+\r\n+    ixTclHal::createCommand    TCLFcp                  fcp              \\$::portPtr                     \\\r\n+                                                                        \\$::fcpCommandStatusPtr         \\\r\n+                                                                        \\$::fcpUnsolicitedCommandPtr    \\\r\n+                                                                        \\$::fcpDataDescriptorPtr        \\\r\n+                                                                        \\$::fcpScsiReadPtr              \\\r\n+                                                                        \\$::fcpScsiWritePtr             \\\r\n+                                                                        \\$::fcpScsiInquiryPtr\r\n+\r\n+    ixTclHal::createCommand    TCLBasicLinkServices    basicLinkServices    \\$::portPtr\r\n+\r\n+    ixTclHal::createCommand    TCLExtendedLinkServices  extendedLinkServices    \\$::portPtr  \\\r\n+                                                                                \\$::elsFlogiPtr \\\r\n+                                                                                \\$::elsPlogiPtr \\\r\n+                                                                                \\$::elsFdiscPtr \\\r\n+                                                                                \\$::elsLsAccPtr \\\r\n+                                                                                \\$::elsLogoPtr  \\\r\n+                                                                                \\$::elsScrPtr   \\\r\n+                                                                                \\$::elsLsRjtPtr \\\r\n+                                                                                \\$::elsRscnPtr\r\n+\r\n+    ixTclHal::createCommand    TCLFcSOF                 fcSOF           \\$::portPtr\r\n+\r\n+    ixTclHal::createCommand    TCLFcEOF                 fcEOF           \\$::portPtr\r\n+\r\n+\r\n+\tixTclHal::createCommandPtr    TCLNetworkHeader    networkHeader        \\$::iEEE48BitAddressSrcPtr        \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \\$::iEEEExtendedSrcPtr            \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t       \\$::locallyAssignedSrcPtr         \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \\$::iEEERegisteredSrcPtr          \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \\$::iEEERegisteredExtendedSrcPtr  \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \\$::eUI64MappedSrcPtr             \\\r\n+                                                                           \\$::iEEE48BitAddressDestPtr       \\\r\n+                                                                           \\$::iEEEExtendedDestPtr           \\\r\n+                                                                           \\$::locallyAssignedDestPtr        \\\r\n+                                                                           \\$::iEEERegisteredDestPtr         \\\r\n+                                                                           \\$::iEEERegisteredExtendedDestPtr \\\r\n+                                                                           \\$::eUI64MappedDestPtr  \r\n+\t\r\n+\tixTclHal::createCommand    TCLFibreChannel       fibreChannel       \\$::portPtr                 \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::vftHeaderPtr            \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::ifrHeaderPtr            \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::encHeaderPtr            \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::espHeaderPtr            \\\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\$::associationHeaderPtr    \\\r\n+                                                                        \\$::networkHeaderPtr \r\n+                                                                        \r\n+\tixTclHal::createCommandPtr    TCLProtocolPad\t\t protocolPad\t\\$::portPtr  \r\n+\r\n+    ixTclHal::createCommandPtr      TCLHse40GQsfpLane   hse40GQsfpLane\r\n+    ixTclHal::createCommand         TCLHse40GQsfp       hse40GQsfp        \\$::hse40GQsfpLanePtr\r\n+    \r\n+    ixTclHal::createCommandPtr      TCLHseCfpQsfpLane   hseCfpQsfpLane\r\n+    ixTclHal::createCommand         TCLHseCfpQsfp       hseCfpQsfp        \\$::hseCfpQsfpLanePtr    \r\n+\r\n+    # Enable logging of messages from SWIG\r\n+    enableEvents true\r\n+\r\n+    #################################################################################\r\n+    # Procedure: after\r\n+    #\r\n+    # NOTE:  This command effective 'steps on' the original after command\r\n+    #        so that we have more control over what happens during the sleep\r\n+    #        process (ie., so that we can make some task switches)\r\n+    #\r\n+    #        It is used *exactly* like the original after.\r\n+    #\r\n+    #        This proc is here because we don't want to overload the 'after' command\r\n+    #        in unix, only windows.\r\n+    #\r\n+    # Argument(s):\r\n+    #   duration    - time to sleep, in milliseconds\r\n+    #\r\n+    #################################################################################\r\n+    proc after {args} \\\r\n+    {\r\n+\t    set retCode \"\"\r\n+\r\n+\t    set argc    [llength $args]\r\n+\r\n+\t    set duration  [lindex $args 0]  \r\n+\t    if {[stringIsInteger $duration] && $argc == 1} {\r\n+\t\t    ixSleep $duration\r\n+\t\t    set retCode \"\"\r\n+\t    } else {\r\n+\t\t    catch {eval originalAfter $args} retCode\r\n+\t    }\r\n+\r\n+\t    set retCode [stringSubstitute $retCode originalAfter after]\r\n+\r\n+\t    return $retCode\r\n+    }\r\n+\r\n+} else {\r\n+    catch {package req Mpexpr}\r\n+\r\n+    proc enableEvents {flag} {}\r\n+\tlogMsg \"Tcl Client is running Ixia Software version: $env(IXIA_VERSION)\"\r\n+}\r\n+\r\n+\r\n+# note that mpexpr is only req'd for 8.3 & below.\r\n+if {[info command mpexpr] == \"\"} {\r\n+    # if we didn't get a real mpexpr AND we're not 8.4, that's ugly so throw an exception - otherwise just make it work\r\n+    if {[info tclversion] <= 8.3} {\r\n+        puts \"Package req failed: Mpexpr package/file not found\"\r\n+        return -code error -errorinfo \"Mpexpr package/file not found\"\r\n+    } else {    \r\n+        proc mpexpr {args}   {return [eval expr $args]}\r\n+        proc mpformat {args} {return [eval format $args]}\r\n+        proc mpincr {args} \\\r\n+        {\r\n+            set Item [lindex $args 0]\r\n+            upvar $Item item\r\n+            set args [lrange $args 1 end]\r\n+            return [eval incr item $args]\r\n+        }\r\n+    }\r\n+}\r\n+\r\n+\r\n+useProfile false \r\n+\r\n+\r\ndiff --git a/dep/tclclient/ixTcl1.0/ixTclSetup.tcl b/dep/tclclient/ixTcl1.0/ixTclSetup.tcl\nnew file mode 100644\nindex 00000000..de82f41b\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/ixTclSetup.tcl\n@@ -0,0 +1,244 @@\n+# BSD LICENSE\r\n+#\r\n+# Copyright (c) 2014, Ixia All rights reserved.\r\n+#\r\n+# Redistribution and use in source and binary forms, with or without\r\n+# modification, are permitted provided that the following conditions\r\n+# are met:\r\n+#\r\n+# * Redistributions of source code must retain the above copyright\r\n+#   notice, this list of conditions and the following disclaimer.\r\n+# * Redistributions in binary form must reproduce the above copyright\r\n+#   notice, this list of conditions and the following disclaimer in\r\n+#   the documentation and/or other materials provided with the\r\n+#   distribution.\r\n+# * Neither the name of the copyright holder nor the names of its\r\n+#   contributors may be used to endorse or promote products derived\r\n+#   from this software without specific prior written permission.\r\n+#\r\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n+#\r\n+#   Version 6.20\r\n+#   \r\n+#   File: ixTclSetup.tcl\r\n+#\r\n+#   Copyright ©  IXIA\r\n+#   All Rights Reserved.\r\n+#\r\n+#\tRevision Log:\r\n+#\t10-29-2002      DHG     Initial Release\r\n+#\r\n+# Description: Package initialization file.\r\n+#              This file is executed when you use \"package require IxTclHal\" to\r\n+#              load the IxTclHal library package. It sets up the Tcl-only variables\r\n+#              and is called by the client and server side ixTclHal.tcl files.\r\n+#\r\n+# Copyright ©  IXIA.\r\n+# All Rights Reserved.\r\n+#\r\n+#############################################################################################\r\n+\r\n+set env(IXTCLHAL_LIBRARY) [file dirname [info script]]\r\n+\r\n+proc PromptIxia {} {\r\n+        puts -nonewline \"[pwd]> \"\r\n+}\r\n+\r\n+# This flag will be set when anyone calls cleanUp proc\r\n+set cleanUpDone 0\r\n+\r\n+#  Not REQUIRED --- this is taken care of below..... source [file join $env(IXTCLHAL_LIBRARY) ixiarc.tcl]\r\n+\r\n+set genPath [file join $env(IXTCLHAL_LIBRARY) Generic]\r\n+\r\n+lappend auto_path $env(IXTCLHAL_LIBRARY)\r\n+\r\n+initializeDefineCommand\r\n+initializeDefineTest\r\n+\r\n+set interfaceFile [file join $genPath interface.tcl]\r\n+source $interfaceFile\r\n+\r\n+set constantsFile [file join $genPath constants.tcl]\r\n+source $constantsFile\r\n+\r\n+\r\n+# rename the system exit with our exit so that we can clean up before calling\r\n+# system exit for Windows only\r\n+if [isWindows] {\r\n+\tif {[info commands exit] != \"\"} {\r\n+\t\tif {[info commands exitOld] == \"\"} {\r\n+\t\t\trename exit exitOld\r\n+\t\t}\r\n+\t}\t\r\n+\t\r\n+\t# NOTE: Need to redefine this exit here, AND NOT ANYWHERE ELSE, so that the system\r\n+\t# exit gets called when exitOld is called.\r\n+\tproc exit {{exitStat 0}} \\\r\n+\t{\r\n+\t\tcleanUp\r\n+\t\texitOld $exitStat\r\n+\t}\r\n+\t# rename the system after with our after so that we can task switch for Windows only\r\n+    if {[info commands after] != \"\"} {\r\n+        if {[info commands originalAfter] == \"\"} {\r\n+            rename after originalAfter\r\n+        }\r\n+    }\r\n+}\r\n+\r\n+\r\n+if {[isWindows] && [info commands tk] != \"\"} {\r\n+    if {![regexp -nocase scriptmate [tk appname]]} {\r\n+        console show\r\n+    }\r\n+}\r\n+\r\n+\r\n+############################# GLOBAL VARIABLES #################################\r\n+#### NOTE: DON'T FORGET TO ADD NEW ONES\r\n+ \r\n+## these are the simple ones that don't have any ptr parameters...\r\n+set ixTclHal::noArgList    { version session chassisChain chassis card qos streamRegion streamQueue streamQueueList \\\r\n+                             portGroup filter filterPallette statGroup statList capture captureBuffer \\\r\n+                             splitPacketGroup dataIntegrity tcpRoundTripFlow autoDetectInstrumentation \\\r\n+                             protocolServer igmpServer mii usb timeServer forcedCollisions collisionBackoff portCpu \\\r\n+                             ppp pppStatus sonet sonetError sonetOverhead atmPort dcc srpUsage \\\r\n+                             bert bertErrorGeneration bertUnframed xaui vsrError fecError opticalDigitalWrapper \\\r\n+                             ipV6Address logFile remoteConnection licenseManagement \\\r\n+\t\t\t\t\t\t\t atmStat atmFilter atmReassembly statWatch txRxPreamble streamExtractorFilter streamExtractorModifier \\\r\n+                             flexibleTimestamp pcpuCommandService gfpOverhead streamTransmitStats xfp lasi sfpPlus \\\r\n+                             poePoweredDevice poeSignalAcquisition poeAutoCalibration statAggregator \\\r\n+\t\t\t\t\t\t\t sonetCircuitProperties lcas prbsCapture oamPort oamStatus \\\r\n+\t\t\t\t\t\t\t txLane pcsLaneStatistics pcsLaneError fcPort}\r\n+\r\n+## these are the ones that we need simple pointers returned for other stuff...\r\n+set ixTclHal::pointerList   { port protocol arpAddressTableEntry ipAddressTableItem igmpAddressTableItem \\\r\n+                              interfaceIpV4 interfaceIpV6 discoveredAddress atmHeaderCounter \\\r\n+                              customOrderedSet srpMacBinding mmdRegister latencyBin \\\r\n+                              ipV6Authentication ipV6Routing ipV6Fragment \\\r\n+                              rprTlvBandwidthPair rprTlvWeight rprTlvVendorSpecific \\\r\n+                              rprTlvTotalBandwidth rprTlvNeighborAddress rprTlvStationName \\\r\n+                              tableUdfColumn igmpGroupRecord dhcpV4Tlv \\\r\n+\t\t\t\t\t\t\t  atmOamAis atmOamRdi atmOamFaultManagementCC atmOamFaultManagementLB atmOamActDeact \\\r\n+\t\t\t\t\t\t\t  ipV6OptionPAD1 ipV6OptionPADN ipV6OptionJumbo ipV6OptionRouterAlert ipV6OptionBindingUpdate \\\r\n+                              ipV6OptionBindingAck ipV6OptionHomeAddress ipV6OptionBindingRequest ipV6OptionMIpV6UniqueIdSub \\\r\n+                              ipV6OptionMIpV6AlternativeCoaSub ipV6OptionUserDefine sonetCircuit macSecChannel \\\r\n+\t\t\t\t\t\t\t  oamLocalInformationTlv oamRemoteInformationTlv oamOrganizationSpecificTlv oamSymbolPeriodTlv \\\r\n+\t\t\t\t\t\t\t  oamFrameTlv oamFramePeriodTlv oamSummaryTlv oamEventOrgTlv \\\r\n+\t\t\t\t\t\t\t  oamVariableRequestTlv oamVariableResponseTlv oamLoopbackControl oamOrganizationSpecific\t\\\r\n+\t\t\t\t\t\t\t  ciscoMetaDataSourceGroupTag ciscoMetaDataCustomOption conditionalTable \\\r\n+\t\t\t\t\t\t\t  fcoeDiscoveredInfo fcoePlogi fcoeNameServer fcNameServerQuery ptpProperties ptpDiscoveredInfo\\\r\n+\t\t\t\t\t\t\t  ptpAnnounce ptpDelayRequest ptpSync ptpFollowUp ptpDelayResponse packetGroupThresholdList \\\r\n+\t\t\t\t\t\t\t  icmpV6OptionLinkLayerSource icmpV6OptionLinkLayerDestination icmpV6OptionPrefixInformation \\\r\n+\t\t\t\t\t\t\t  icmpV6OptionRedirectedHeader icmpV6OptionMaxTransmissionUnit icmpV6OptionUserDefine \\\r\n+\t\t\t\t\t\t\t  icmpV6Error icmpV6Informational icmpV6MulticastListener icmpV6UserDefine lldpPortId \\\r\n+\t\t\t\t\t\t\t  dcbxPriorityGroupFeature dcbxPfcFeature dcbxFcoeFeature dcbxIscsiFeature dcbxLogicalLinkFeature \\\r\n+                              dcbxCustomFeature dcbxControlTlv ctPreamble ctGetAllNextRequest ctGetAllNextAccept \\\r\n+                              ctGetPortNameRequest ctGetPortNameAccept ctGetNodeNameRequest ctGetNodeNameAccept \\\r\n+                              ctGetFC4TypeRequest ctRegisterNodeNameRequest elsFlogi elsPlogi elsFdisc elsLsAcc elsLogo \\\r\n+                              elsScr elsLsRjt elsRscn fcpUnsolicitedCommand fcpDataDescriptor \\\r\n+                              fcpScsiRead fcpScsiWrite fcpScsiInquiry fcpSnsInfo \\\r\n+\t\t\t\t\t\t\t  iEEE48BitAddressSrc iEEEExtendedSrc locallyAssignedSrc iEEERegisteredSrc iEEERegisteredExtendedSrc eUI64MappedSrc \\\r\n+  \t\t\t\t\t\t\t  iEEE48BitAddressDest iEEEExtendedDest locallyAssignedDest iEEERegisteredDest iEEERegisteredExtendedDest eUI64MappedDest \\\r\n+\t\t\t\t\t\t\t  vftHeader ifrHeader encHeader espHeader associationHeader \\\r\n+\t\t\t\t\t\t\t  fcPlogi fcNameServer hse40GQsfpLane hseCfpQsfpLane}\r\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n+## these are basically all the protocols that require a portPtr parameter for instantiation\r\n+set ixTclHal::protocolList { ip udp tcp ipx icmp arp dhcp gre macSecTag fcoe  \\\r\n+                             srpArp srpIps frameRelay hdlc isl pauseControl weightedRandomFramesize \\\r\n+                             rprArp rprProtection rprFairness rprOam cdlPreamble dataCenterEncapsulation \\\r\n+                             basicLinkServices fcSOF fcEOF}\r\n+\r\n+## this initial list is all the complicated ones\r\n+set ixTclHal::commandList  { stat stream udf mplsLabel mpls rip ripRoute  ipAddressTable igmpAddressTable arpServer\\\r\n+                             interfaceTable interfaceEntry discoveredList discoveredNeighbor discoveredAddress  \\\r\n+\t\t\t\t\t\t\t packetGroupStats tableUdf sequenceNumberUdf igmp atmOam atmOamTrace vlan stackedVlan protocolOffset \\\r\n+\t\t\t\t\t\t\t ipV6 ipV6HopByHop ipV6Destination rprRingControl rprTopology rprTlvIndividualBandwidth  \\\r\n+                             miiae mmd srpHeader srpDiscovery atmHeader ixUtils linkFaultSignaling gfp\t\\\r\n+\t\t\t\t\t\t\t dhcpV4Properties dhcpV4DiscoveredInfo dhcpV6Properties dhcpV6DiscoveredInfo \\\r\n+\t\t\t\t\t\t\t sonetCircuitList packetGroup macSecTx macSecRx oamHeader ciscoMetaData ptp \\\r\n+\t\t\t\t\t\t\t oamInformation oamEventNotification oamVariableRequest oamVariableResponse conditionalStats \\\r\n+\t\t\t\t\t\t\t fcoeProperties npivProperties icmpV6 icmpV6NeighborDiscovery dcbxProperties dcbxDiscoveredInfo \\\r\n+                             fibreChannel networkHeader commonTransport extendedLinkServices fcpCommandStatus fcp fcProperties protocolPad \\\r\n+                             hse40GQsfp packetLengthInsertion hseCfpQsfp}\r\n+          \r\n+ixTclHal::update ::halCommands\r\n+## These commands needs redefinition of the body during connecting to TCL server\t\t\t\t\t\t\t \r\n+\r\n+set ixTclHal::redefineCommandList [list chassis card port stream captureBuffer tableUdf]\r\n+\r\n+set ::halRedefineCommands [join [list $ixTclHal::redefineCommandList]]\r\n+## We need to append dhcpV6Tlv to halCommands, since it is instantiated as an TCLDhcpV4Tlv and can't be added to ixTclHal::pointerList\r\n+lappend ::halCommands\tdhcpV6Tlv\r\n+\r\n+## We need to append fipTlv to halCommands, since it is instantiated as an TCLDhcpV4Tlv and can't be added to ixTclHal::pointerList\r\n+lappend ::halCommands\tfipTlv\r\n+\r\n+set halFuncs     { enableEvents clearAllMyOwnership }\r\n+\r\n+set globalArrays { ixgTrialArray ixgTrialCongArray ixgTrialUncongArray \\\r\n+                   one2oneArray one2manyArray many2oneArray many2manyArray }\r\n+\r\n+set ixProtocolList {ip udp ptp tcp ipx igmp icmp arp vlan dhcp mpls mplsLabel qos rip ripRoute \\\r\n+                    isl frameRelay ipV6 fcoe fibreChannel commonTransport fcp basicLinkServices extendedLinkServices fcSOF fcEOF }\r\n+\r\n+set ixStopTest      0\r\n+set ixStopAction    0\r\n+\r\n+############################ TCL FILES/DIR INITIALIZATION ##########################\r\n+\r\n+if [info exists env(IXIA_RESULTS_DIR)] {\r\n+    #set RESULTS_DIR [file join $env(IXIA_RESULTS_DIR) Results]\r\n+    set RESULTS_DIR $env(IXIA_RESULTS_DIR)\r\n+} else {\r\n+    set RESULTS_DIR [file join [file dirname [file dirname $env(IXTCLHAL_LIBRARY)]] Results]\r\n+    set env(IXIA_RESULTS_DIR) $RESULTS_DIR\r\n+}\r\n+if {![file exists $RESULTS_DIR]} {\r\n+        file mkdir $RESULTS_DIR\r\n+}\r\n+\r\n+if [info exists env(IXIA_LOGS_DIR)] {\r\n+    #set LOGS_DIR [file join $env(IXIA_LOGS_DIR) Logs]\r\n+    set LOGS_DIR $env(IXIA_LOGS_DIR)\r\n+} else {\r\n+    set LOGS_DIR [file join [file dirname [file dirname $env(IXTCLHAL_LIBRARY)]] Logs]\r\n+    set env(IXIA_LOGS_DIR) $LOGS_DIR\r\n+}\r\n+if {![file exists $LOGS_DIR]} {\r\n+        file mkdir $LOGS_DIR\r\n+}\r\n+\r\n+if {![info exists env(IXIA_SAMPLES_DIR)]} {\r\n+    set env(IXIA_SAMPLES_DIR) [file dirname [file dirname $env(IXTCLHAL_LIBRARY)]]\r\n+}\r\n+\r\n+foreach initProc [info commands initCommand_zz_*] {\r\n+    # puts $initProc\r\n+    ${initProc}\r\n+}\r\n+\r\n+# Create dummy calls to the commands that were moved to the scriptmate package.  This is for\r\n+# backwards compatibility but it not guaranteed to work unless the Scriptmate package is installed.\r\n+scriptmateBackwardsCompatibility::createAllCommands\r\n+\r\n+############### sample script environment initialization ############################\r\n+global ixgJitterIndex \r\n+set ixgJitterIndex(averageLatency)     0\r\n+set ixgJitterIndex(standardDeviation)  1\r\n+set ixgJitterIndex(averageDeviation)   2\r\n+set ixgJitterIndex(minLatency)         3\r\n+set ixgJitterIndex(maxLatency)         4\r\n+\r\n+\r\ndiff --git a/dep/tclclient/ixTcl1.0/ixiaDCB.tcl b/dep/tclclient/ixTcl1.0/ixiaDCB.tcl\nnew file mode 100644\nindex 00000000..8e2da3e3\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/ixiaDCB.tcl\n@@ -0,0 +1,588 @@\n+# BSD LICENSE\r\n+#\r\n+# Copyright (c) 2014, Ixia All rights reserved.\r\n+# Copyright (c) 2014, Intel Corporation All rights reserved.\r\n+#\r\n+# Redistribution and use in source and binary forms, with or without\r\n+# modification, are permitted provided that the following conditions\r\n+# are met:\r\n+#\r\n+# * Redistributions of source code must retain the above copyright\r\n+#   notice, this list of conditions and the following disclaimer.\r\n+# * Redistributions in binary form must reproduce the above copyright\r\n+#   notice, this list of conditions and the following disclaimer in\r\n+#   the documentation and/or other materials provided with the\r\n+#   distribution.\r\n+# * Neither the name of the copyright holder nor the names of its\r\n+#   contributors may be used to endorse or promote products derived\r\n+#   from this software without specific prior written permission.\r\n+#\r\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n+\r\n+#Config Ixia.\r\n+proc configIxia {chasId rxcard rxport rxda txcard txport txda} {\r\n+    set ::chasId   $chasId\r\n+    set ::rxcard   $rxcard\r\n+    set ::rxport   $rxport\r\n+    set ::txcard   $txcard\r\n+    set ::txport   $txport\r\n+    set ::rxPortList [list [list $chasId $rxcard $rxport]]\r\n+    set ::txPortList [list [list $chasId $txcard $txport]]\r\n+    set ::rxsa       [format \"00 00 %02x 00 %02x 00\" [expr $rxcard-1] [expr $rxport-1]]\r\n+    set ::rxda       [string trim $rxda \"'\"]\r\n+    set ::txsa       [format \"00 00 %02x 00 %02x 00\" [expr $txcard-1] [expr $txport-1]]\r\n+    set ::txda       [string trim $txda \"'\"]\r\n+    set ::rxGroup    $rxport \r\n+    set ::txGroup    $txport \r\n+}\r\n+\r\n+#Config Port properties for DCB & PFC.\r\n+proc configPort {direction tc} {\r\n+    #direction :  rx tx\r\n+    #tc  :  4  8\r\n+    set ::direction     $direction\r\n+    set ::tc            $tc\r\n+    set ::[set direction]StreamNum   0\r\n+    if [array exists ::[set direction]StreamUPs] {\r\n+        unset ::[set direction]StreamUPs  \r\n+    }\r\n+    set da        [set ::[set direction]da]\r\n+    set card      [set ::[set direction]card]\r\n+    set port      [set ::[set direction]port]\r\n+    set portList  [set ::[set direction]PortList]\r\n+\r\n+    port setFactoryDefaults $::chasId $card $port\r\n+    port config -speed                              10000\r\n+    port config -duplex                             full\r\n+    port config -flowControl                        true\r\n+    port config -directedAddress                    $da\r\n+    port config -autonegotiate                      false\r\n+    port config -transmitMode                       portTxModeAdvancedScheduler \r\n+    port config -portMode                           port10GigLanMode\r\n+    port config -enableDataCenterMode               true\r\n+    port config -flowControlType                    ieee8021Qbb\r\n+    port config -pfcResponseDelayEnabled            0\r\n+    port config -pfcResponseDelayQuanta             255\r\n+\r\n+    if [string equal \"4\" $tc] {\r\n+        port config -dataCenterMode                 fourPriorityTrafficMapping\r\n+        port config -pfcEnableValueListBitMatrix    \"{1 1} {1 2} {1 4} {1 8}\"\r\n+    } elseif [string equal \"8\" $tc] {\r\n+        port config -dataCenterMode                 eightPriorityTrafficMapping\r\n+        port config -pfcEnableValueListBitMatrix    \"{1 1} {1 2} {1 4} {1 8} {1 16} {1 32} {1 64} {1 128}\"\r\n+    } else {\r\n+        errorMsg \"TCs can only be 4 or 8.\"\r\n+        return $::TCL_ERROR\r\n+    }\r\n+    if [port set $::chasId $card $port] {\r\n+        errorMsg \"Could not call port set $::chasId $card $port\"\r\n+        return $::TCL_ERROR\r\n+    }\r\n+    #Delete all streams from a port\r\n+    port reset $::chasId $card $port\r\n+\r\n+    filter setDefault \r\n+    if [filter set $::chasId $card $port] {\r\n+        errorMsg \"Error calling filter set $::chasId $card $port\"\r\n+        return $::TCL_ERROR\r\n+    }\r\n+\r\n+    filterPallette setDefault \r\n+    if [filterPallette set $::chasId $card $port] {\r\n+        errorMsg \"Error calling filterPallette set $::chasId $card $port\"\r\n+        return $::TCL_ERROR\r\n+    }\r\n+\r\n+    capture setDefault\r\n+    capture config -fullAction                         wrap\r\n+    capture config -captureMode                        captureContinuousMode\r\n+    if [capture set $::chasId $card $port] {\r\n+        errorMsg \"Error calling capture set $::chasId $card $port\"\r\n+        return $::TCL_ERROR\r\n+    }\r\n+\r\n+    streamRegion setDefault \r\n+    streamRegion config -gapControlMode    streamGapControlFixed\r\n+    if [streamRegion set $::chasId $card $port] {\r\n+        errorMsg \"Error calling streamRegion set $::chasId $card $port\"\r\n+        return $::TCL_ERROR\r\n+    }\r\n+\r\n+    #Write port properties to hardware\r\n+    puts \"Write port $port properties to hardware.\"\r\n+    if [ixWritePortsToHardware portList] {\r\n+        errorMsg \"Could not write port $port properties to hardware.\"\r\n+        return $::TCL_ERROR\r\n+    }\r\n+    after 500\r\n+}\r\n+\r\n+#Configure all streams.\r\n+proc configStream {stream rate prio type {tc $::tc}} {\r\n+    #stream : UDP PFC\r\n+    #rate   : 1.0 100.0\r\n+    #prio   : 0 1 2 3 4 5 6 7 8\r\n+    #type   : on  off  - vt\r\n+    #       : XOFF XON - pfc\r\n+    #tc     : 8   4\r\n+    set ::stream  $stream\r\n+\r\n+    stream setDefault \r\n+    if {$rate == \"0\"} {                              \r\n+        stream config -enable                          false\r\n+    } else {\r\n+        stream config -enable                          true\r\n+    }\r\n+    stream config -percentPacketRate                   $rate\r\n+    stream config -rateMode                            streamRateModePercentRate\r\n+    stream config -asyncIntEnable                      true\r\n+    stream config -enableStatistic                     true\r\n+    stream config -enableSuspend                       false\r\n+    stream config -dma                                 contPacket\r\n+    stream config -priorityGroup                       \"priorityGroup$prio\"\r\n+\r\n+    switch -exact -- $stream {\r\n+           \"UDP\" {\r\n+                   #Configure UDP     \r\n+                   stream config -sa                                  $::txsa\r\n+                   stream config -da                                  $::txda\r\n+                   stream config -framesize                           68\r\n+                   stream config -frameSizeMIN                        68\r\n+                   stream config -frameSizeMAX                        68\r\n+                   stream config -frameType                           \"08 00\"\r\n+     \r\n+                   protocol setDefault \r\n+                   protocol config -name                              ipV4\r\n+                   protocol config -ethernetType                      ethernetII\r\n+                   protocol config -enable802dot1qTag                 vlanSingle\r\n+ \r\n+                   ip setDefault \r\n+                   ip config -checksum                                \"7a c0\"\r\n+                   ip config -sourceIpAddr                            \"0.0.0.0\"\r\n+                   ip config -sourceIpAddrRepeatCount                 10\r\n+                   ip config -sourceClass                             classA\r\n+                   ip config -destIpAddr                              \"0.0.0.0\"\r\n+                   ip config -destIpAddrRepeatCount                   10\r\n+                   ip config -destClass                               classA\r\n+                   ip config -destMacAddr                             \"00 DE BB 00 00 02\"\r\n+                   ip config -destDutIpAddr                           \"0.0.0.0\"\r\n+                   if [ip set $::chasId $::txcard $::txport] {\r\n+                       errorMsg \"Error calling ip set $::chasId $::txcard $::txport\"\r\n+                       return $::TCL_ERROR\r\n+                   } \r\n+ \r\n+                   udp setDefault \r\n+                   udp config -sourcePort                            unassignedPort\r\n+                   udp config -destPort                              unassignedPort\r\n+                   udp config -checksum                              \"b6 eb \"\r\n+                   udp config -length                                26\r\n+                   if [udp set $::chasId $::txcard $::txport] {\r\n+                       errorMsg \"Error calling udp set $::chasId $::txcard $::txport\"\r\n+                       return $::TCL_ERROR\r\n+                   }\r\n+ \r\n+                   vlan setDefault\r\n+                   if [string equal \"on\" $type] {\r\n+                       vlan config -mode                            vIncrement\r\n+                       vlan config -repeat                          [expr 128/$::tc]\r\n+                   } elseif [string equal \"off\" $type] {\r\n+                       vlan config -vlanID                          [expr int([expr 32 * [expr rand()]])]\r\n+                   }\r\n+                   vlan config -userPriority                        $prio\r\n+                   if [vlan set $::chasId $::txcard $::txport] {\r\n+                       errorMsg \"Could not call vlan set $::chasId $::txcard $::txport\"\r\n+                       return $::TCL_ERROR\r\n+                   }\r\n+                   set bool 1\r\n+                   foreach item [array names ::txStreamUPs] { \r\n+                       if {$prio == $::txStreamUPs($item)} {\r\n+                           incr bool -1\r\n+                           set id $item \r\n+                           break \r\n+                       }\r\n+                   }  \r\n+                   if { $bool } {\r\n+                       incr ::txStreamNum\r\n+                       set ::txStreamUPs($::txStreamNum) $prio\r\n+                       set id $::txStreamNum\r\n+                   }\r\n+                   if [stream set $::chasId $::txcard $::txport $id] {\r\n+                       errorMsg \"Could not call stream set $::chasId $::txcard $::txport $id\"\r\n+                       return $::TCL_ERROR\r\n+                   }\r\n+                   if [stream write $::chasId $::txcard $::txport $id] {\r\n+                       errorMsg \"Could not write stream $::chasId $::txcard $::txport $id\"\r\n+                   }\r\n+           }\r\n+           \"PFC\" {\r\n+                   #Configure PFC\r\n+                   stream config -sa                                 $::rxsa\r\n+                   stream config -da                                 $::rxda\r\n+                   stream config -framesize                          64\r\n+                   stream config -frameSizeMIN                       64\r\n+                   stream config -frameSizeMAX                       64\r\n+                   stream config -frameType                          \"88 08\"\r\n+\r\n+                   protocol setDefault \r\n+                   protocol config -name                             pauseControl\r\n+                   protocol config -ethernetType                     ethernetII\r\n+\r\n+                   pauseControl setDefault \r\n+                   pauseControl config -da                           $::rxda\r\n+                   pauseControl config -pauseTime                    255\r\n+                   pauseControl config -pauseControlType             ieee8021Qbb\r\n+                   pauseControl config -usePfcEnableValueList        0    \r\n+\r\n+                   pauseControl config -priorityEnableVector         [format \"%#04x\" [expr 0x01<<$prio]]\r\n+                   for {set n 0; set paFrame \"\"; set pfcList \"\"} {$n < 8 } {incr n} { \r\n+                       if {$type == \"XOFF\" && $prio == $n} {\r\n+                           append paFrame \"FF FF \"\r\n+                           append pfcList \"{1 65535} \"\r\n+                           continue\r\n+                       }\r\n+                       append paFrame \"00 00 \"\r\n+                       append pfcList \"{0 0} \"\r\n+                   }\r\n+                   pauseControl config -pauseFrame                  [string trimright $paFrame]\r\n+                   pauseControl config -pfcEnableValueList          [string trimright $pfcList]\r\n+                   if [pauseControl set $::chasId $::rxcard $::rxport] {\r\n+                       errorMsg \"Error calling pauseControl set  $::chasId $::rxcard $::rxport\"\r\n+                       set retCode $::TCL_ERROR\r\n+                   }\r\n+                   set bool 1\r\n+                   foreach item [array names ::rxStreamUPs] { \r\n+                       if {$prio == $::rxStreamUPs($item)} {\r\n+                           incr bool -1\r\n+                           set id $item \r\n+                           break \r\n+                       }\r\n+                   }  \r\n+                  if { $bool } {\r\n+                       incr ::rxStreamNum\r\n+                       set ::rxStreamUPs($::rxStreamNum) $prio\r\n+                       set id $::rxStreamNum\r\n+                   }\r\n+                   if [stream set $::chasId $::rxcard $::rxport $id] {\r\n+                       errorMsg \"Could not call stream set $::chasId $::rxcard $::rxport $id\"\r\n+                       return $::TCL_ERROR\r\n+                   }\r\n+                   if [stream write $::chasId $::rxcard $::rxport $id] {\r\n+                       errorMsg \"Could not write stream $::chasId $::rxcard $::rxport $id\"\r\n+                       return $::TCL_ERROR\r\n+                   } \r\n+          }\r\n+          default { \r\n+                   errorMsg \"Configure streams error.\"\r\n+                   return $::TCL_ERROR\r\n+          }\r\n+    }\r\n+\r\n+    after 100\r\n+}\r\n+\r\n+#Get the statistics counter for all stats \r\n+proc getAllStats {direction {type None} {prio None}} {\r\n+    set card           [set ::[set direction]card]\r\n+    set port           [set ::[set direction]port]\r\n+    if [stat get statAllStats $::chasId $card $port] {\r\n+        puts \"Could not read stats on port $port.\"\r\n+        return $::TCL_ERROR\r\n+    } \r\n+\r\n+    set framesSent [stat cget -framesSent]\r\n+    set framesRecv [stat cget -framesReceived]\r\n+    for {set upId 0; set recvSum 0} {$upId < $::tc} {incr upId} {\r\n+         set pfcUP$upId    [stat cget -rxPausePriorityGroup[set upId]Frames]\r\n+         incr recvSum [set pfcUP$upId]\r\n+    }\r\n+\r\n+    if [stat getRate statAllStats $::chasId $card $port] {\r\n+        puts \"Could not read stat rate on port $port.\"\r\n+        return $::TCL_ERROR\r\n+    }\r\n+    set framesSentRate [stat cget -framesSent]\r\n+    set framesRecvRate [stat cget -framesReceived]\r\n+    \r\n+    puts \"+---------------------------------------------+\"\r\n+    puts \"[ format \"| %-44s|\" \"Read Statistics On [string toupper $direction 0 0] Port $port Of Ixia.\"]\"\r\n+    puts \"+---------------------------------------------+\"\r\n+    puts \"[format \"| %-12s| %-14s| %-14s|\" \"Type\" \"Count\" \"Unit\"]\"\r\n+    puts \"+-------------+---------------+---------------+\"\r\n+    switch -exact -- $type {\r\n+           \"FramesSent\" { \r\n+                         puts \"[format \"| %-12s| %-14s| %-14s|\" \"Frames Sent\" $framesSent \"frames\"]\"\r\n+                         puts \"+---------------------------------------------+\"\r\n+                         after 50\r\n+                         return $framesSent\r\n+           }\r\n+           \"RateSent\" { \r\n+                         puts \"[format \"| %-12s| %-14s| %-14s|\" \"Rate Sent\" $framesSentRate \"packets/sec\"]\"\r\n+                         puts \"+---------------------------------------------+\"\r\n+                         return $framesSentRate\r\n+           }\r\n+           \"FramesRecv\" { \r\n+                         puts \"[format \"| %-12s| %-14s| %-14s|\" \"Frames Recv\" $framesRecv \"frames\"]\"\r\n+                         puts \"+---------------------------------------------+\"\r\n+                         after 50\r\n+                         return $framesRecv\r\n+           }\r\n+           \"RateRecv\" { \r\n+                         puts \"[format \"| %-12s| %-14s| %-14s|\" \"Rate Recv\" $framesRecvRate \"packets/sec\"]\"\r\n+                         puts \"+---------------------------------------------+\"\r\n+                         after 50\r\n+                         return $framesRecvRate\r\n+           }\r\n+           \"PfcsRecv\" { \r\n+                         puts \"[format \"| %-12s| %-14s| %-14s|\" \"Frames Sent\" $framesSent \"frames\"]\"\r\n+                         puts \"+-------------+---------------+---------------+\"\r\n+                         puts \"[format \"| %-12s| %-14s| %-14s|\" \"Frames Recv\" $framesRecv \"frames\"]\"\r\n+                         puts \"+-------------+---------------+---------------+\"\r\n+                         for {set upId 0} {$upId < $::tc} {incr upId} {\r\n+                             puts \"[format \"| %-12s| %-14s| %-14s|\" \"PFCs $upId Rcvd\" [set pfcUP$upId] \"frames\"]\"\r\n+                             puts \"+-------------+---------------+---------------+\"\r\n+                         }\r\n+                         puts \"[format \"| %-12s| %-14s| %-14s|\" \"Total  Recv\" $recvSum \"frames\"]\"\r\n+                         puts \"+---------------------------------------------+\"\r\n+                         after 50\r\n+                         if {$prio == \"None\"} {\r\n+                             return $recvSum\r\n+                         } else {\r\n+                             return [set pfcUP$prio]\r\n+                         }\r\n+           }\r\n+           default { \r\n+                     puts \"[format \"| %-12s| %-14s| %-14s|\" \"Frames Sent\" $framesSent \"frames\"]\"\r\n+                     puts \"+-------------+---------------+---------------+\"\r\n+                     puts \"[format \"| %-12s| %-14s| %-14s|\" \"Actual Rate\" $framesSentRate \"packets/sec\"]\"\r\n+                     puts \"+-------------+---------------+---------------+\"\r\n+                     puts \"[format \"| %-12s| %-14s| %-14s|\" \"Frames Recv\" $framesRecv \"frames\"]\"\r\n+                     puts \"+-------------+---------------+---------------+\"\r\n+                     puts \"[format \"| %-12s| %-14s| %-14s|\" \"Actual Rate\" $framesRecvRate \"packets/sec\"]\"\r\n+                     puts \"+-------------+---------------+---------------+\"\r\n+                     for {set upId 0} {$upId < $::tc} {incr upId} {\r\n+                         puts \"[format \"| %-12s| %-14s| %-14s|\" \"PFCs $upId Rcvd\" [set pfcUP$upId] \"frames\"]\"\r\n+                         puts \"+-------------+---------------+---------------+\"\r\n+                     }\r\n+                     puts \"[format \"| %-12s| %-14s| %-14s|\" \"Total  Recv\" $recvSum \"frames\"]\"\r\n+                     puts \"+---------------------------------------------+\"\r\n+                     after 50\r\n+           }\r\n+    }\r\n+}\r\n+    \r\n+#Get per-stream transmit statistics on Tx port\r\n+proc getTxPerStreamStats {} {\r\n+    set nums [streamTransmitStats cget -numGroups]\r\n+    puts \"+-------------------------------------------------------------+\"\r\n+    puts \"[format \"| %-60s|\" \"Read $nums Streams On Tx Port $::txport Of Ixia.\"]\"\r\n+    puts \"+-------------------------------------------------------------+\"\r\n+    puts \"[format \"| %-7s| %-3s| %-14s| %-14s| %-14s|\" \"Stream\" \"UP\" \"FramesSent\" \"Define Rate\" \"Actual Rate\"]\"\r\n+    #Get the statistics for each stream\r\n+    set rateSum 0\r\n+    set deRateSum 0\r\n+    set sentSum 0\r\n+    set aveRate    [streamTransmitStats cget -theoreticalAverageFrameRate]\r\n+    for {set streamId 1} {$streamId <= $nums} {incr streamId} {\r\n+        if [streamTransmitStats getGroup $streamId] {\r\n+           errorMsg \"Could not get group $streamId on port $::txport.\"\r\n+           return $::TCL_ERROR\r\n+        }\r\n+        set frameRate  [streamTransmitStats cget -frameRate]\r\n+        set framesPSent [streamTransmitStats cget -framesSent]\r\n+        stream get  $::chasId $::txcard $::txport $streamId\r\n+        set deRate [expr int([stream cget -fpsRate])]\r\n+        \r\n+        puts \"+--------+----+---------------+---------------+---------------+\"\r\n+        puts \"[format \"| %-7s| %-3s| %-14s| %-14s| %-14s|\" $streamId $::txStreamUPs($streamId) $framesPSent $deRate $frameRate]\"\r\n+        incr rateSum $frameRate\r\n+        incr deRateSum $deRate\r\n+        incr sentSum $framesPSent\r\n+    }\r\n+    puts \"+-------------------------------------------------------------+\"\r\n+    puts \"[format \"| %-7s| %-3s| %-14s| %-14s| %-14s|\" \"Total\" $nums $sentSum $deRateSum $rateSum]\"\r\n+    puts \"+-------------+---------------+---------------+---------------+\"\r\n+    puts \"[format \"| %-12s| %-14s| %-14s| %-14s|\" \"Unit\" \"frames\" \"packets/sec\" \"packets/sec\"]\"\r\n+    puts \"+-------------------------------------------------------------+\"\r\n+    after 50\r\n+    }\r\n+    \r\n+#Get the captured frames on on Tx port\r\n+proc getTxCaptureFrames {type {prio None}} {\r\n+    puts \"+--------------------------------------+\"\r\n+    puts \"[format \"| %-37s|\" \"Analyse frames captured on port $::txport.\"]\"\r\n+    if [capture get $::chasId $::txcard $::txport] {\r\n+        puts \"Could not get capture frames on port $::txport\"\r\n+        return $::TCL_ERROR\r\n+    } \r\n+    set numFrames [capture cget -nPackets]\r\n+    puts \"+--------------------------------------+\"\r\n+    puts \"[format \"| %-16s| %-19s|\" \"Frames Captured\" $numFrames]\"\r\n+    if [expr $numFrames] {\r\n+        for {set frameId 1} {$frameId <= $numFrames} {incr frameId} {\r\n+            captureBuffer get $::chasId $::txcard $::txport $frameId $frameId\r\n+            captureBuffer getframe 1\r\n+            set capFrame     [captureBuffer cget -frame]\r\n+            set etherType    [lrange $capFrame 12 13]\r\n+      \r\n+            switch -exact -- $etherType {\r\n+                   \"08 00\" { \r\n+                             set types \"IPv4 Frame\" \r\n+                             if {$type == \"UDP\"} {\r\n+                                 return 1\r\n+                             }\r\n+                   }\r\n+                   \"86 DD\" { \r\n+                             set types \"IPv6 Frame\"\r\n+                             if {$type == \"UDP\"} {\r\n+                                 return 1\r\n+                             }\r\n+                   }\r\n+                   \"81 00\" { \r\n+                             set types \"VLAN-tagged Frame\"\r\n+                             if {$type == \"UDP\"} {\r\n+                                 return 1\r\n+                             }\r\n+                   }\r\n+                   \"88 08\" {  \r\n+                             set types \"MAC Control Frame\"\r\n+                             set ctrlOpcode   [lrange $capFrame 14 15]\r\n+                             switch -exact -- $ctrlOpcode {\r\n+                                    \"00 01\" { \r\n+                                              set fc    \"IEEE 802.3x PAUSE Frame\"\r\n+                                              if {$type == \"FC-PAUSE\"} {\r\n+                                                  return 1\r\n+                                              } \r\n+                                    }\r\n+                                    \"01 01\" { \r\n+                                              set prioEnVector    [lrange $capFrame 16 17]\r\n+                                              if {[lrange $capFrame 17 17] == [format \"%02x\" [expr 0x01<<$prio]]} {\r\n+                                                  for {set timeId 0; set start 17; set ret \"\"} {$timeId < $::tc} {incr timeId} {\r\n+                                                       set Time$timeId  [lrange $capFrame [incr start] [incr start]]\r\n+                                                       if {[set Time$timeId] == \"00 00\" && $ret != \"XOFF\"} {\r\n+                                                           set ret \"XON\"\r\n+                                                       } else {\r\n+                                                           set ret \"XOFF\"\r\n+                                                       }  \r\n+                                                  }\r\n+                                                  if {$type == $ret} {                          \r\n+                                                      puts \"+-----------------+--------------------+\"\r\n+                                                      puts \"[format \"| %-16s| %-19s|\" \"Frames Analysed\" $frameId]\"\r\n+                                                      puts \"+-----------------+--------------------+\"\r\n+                                                      puts \"[format \"| %-16s| %-19s|\" \"Frames Type\" $types]\"\r\n+                                                      puts \"+-----------------+--------------------+\"\r\n+                                                      puts \"[format \"| %-16s| %-19s|\" \" \" \"PFC $type Frame\"]\"\r\n+                                                      puts \"+-----------------+--------------------+\"\r\n+                                                      puts \"[format \"| %-16s| %-19s|\" \"Control Opcode\" $ctrlOpcode]\"\r\n+                                                      puts \"+-----------------+--------------------+\"\r\n+                                                      puts \"[format \"| %-16s| %-19s|\" \"Priority Vector\" $prioEnVector]\"\r\n+                                                      puts \"+-----------------+--------------------+\"\r\n+                                                      puts \"[format \"| %-16s| %-19s|\" \" \" $prio]\"\r\n+                                                      for {set timeId 0; set start 17; set ret \"\"} {$timeId < $::tc} {incr timeId} {\r\n+                                                          puts \"+-----------------+--------------------+\"\r\n+                                                          puts \"[format \"| %-16s| %-19s|\" \"Time$timeId\" [set Time$timeId]]\"\r\n+                                                      }\r\n+                                                      puts \"+--------------------------------------+\"\r\n+                                                      after 50\r\n+                                                      return 1\r\n+                                                  }\r\n+                                              }    \r\n+                                    } \r\n+                             }               \r\n+                   }\r\n+                   default { puts \"Unknown Frame\" }\r\n+            }\r\n+        }\r\n+    } \r\n+    puts \"+--------------------------------------+\"\r\n+    return 0\r\n+}\r\n+        \r\n+#Clear all statistic counters on Tx/Rx port\r\n+proc clearStats {direction} {\r\n+    set portList  [set ::[set direction]PortList] \r\n+    if [ixClearStats portList] {\r\n+        return $::TCL_ERROR\r\n+    }\r\n+    after 100\r\n+}\r\n+\r\n+#Start transmission on Tx/Rx port\r\n+proc startTransmit {direction} {\r\n+    set port      [set ::[set direction]port]\r\n+    set portList  [set ::[set direction]PortList] \r\n+    puts \"+------------------------------------+\"\r\n+    puts \"[format \"| %-35s|\" \"Start transmit on $direction port $port.\"]\"\r\n+    if [ixStartTransmit portList] {\r\n+        return $::TCL_ERROR\r\n+    }\r\n+    puts \"+------------------------------------+\"\r\n+    after 500\r\n+}\r\n+\r\n+#Stop transmission on Tx/Rx port\r\n+proc stopTransmit {direction} {\r\n+    set port      [set ::[set direction]port]\r\n+    set portList  [set ::[set direction]PortList] \r\n+    puts \"+------------------------------------+\"\r\n+    puts \"[format \"| %-35s|\" \"Stop transmit on $direction port $port.\"]\"\r\n+    if [ixStopTransmit portList] {\r\n+        return $::TCL_ERROR\r\n+    }\r\n+    puts \"+------------------------------------+\"\r\n+    after 500\r\n+}\r\n+\r\n+#Start capture on Tx/Rx port\r\n+proc startCapture {direction} {\r\n+    set card      [set ::[set direction]card]\r\n+    set port      [set ::[set direction]port]\r\n+    puts \"+------------------------------------+\"\r\n+    puts \"[format \"| %-35s|\" \"Start capture on $direction port $port.\"]\"\r\n+    if [ixStartPortCapture $::chasId $card $port] {\r\n+        return $::TCL_ERROR\r\n+    }\r\n+    puts \"+------------------------------------+\"\r\n+}\r\n+\r\n+#Stop capture on Tx/Rx port\r\n+proc stopCapture {direction} {\r\n+    set card      [set ::[set direction]card]\r\n+    set port      [set ::[set direction]port]\r\n+    puts \"+------------------------------------+\"\r\n+    puts \"[format \"| %-35s|\" \"Stop capture on $direction port $port.\"]\"\r\n+    if [ixStopPortCapture $::chasId $card $port] {\r\n+       return $::TCL_ERROR\r\n+    }\r\n+    puts \"+------------------------------------+\"\r\n+}\r\n+\r\n+#Get Per-stream transmit statistics on Tx port\r\n+proc perStreamTxStats {} {\r\n+    puts \"+------------------------------------+\"\r\n+    puts \"[format \"| %-35s|\" \"Get Per-stream stats on Tx port $::txport.\"]\"\r\n+    if [streamTransmitStats get $::chasId $::txcard $::txport 1 $::txStreamNum] {\r\n+       return $::TCL_ERROR\r\n+    }\r\n+    puts \"+------------------------------------+\"\r\n+    after 1000\r\n+}\r\n+\r\n+#Clean, Logoff and Disconnect\r\n+proc clean {server portList}  {\r\n+    #Let go of the ports that we reserved\r\n+    ixClearOwnership $portList\r\n+    #Log off user\r\n+    ixLogout\r\n+    #End a test and cleanup all variables\r\n+    cleanUp\r\n+}\r\ndiff --git a/dep/tclclient/ixTcl1.0/ixiaPing6.tcl b/dep/tclclient/ixTcl1.0/ixiaPing6.tcl\nnew file mode 100644\nindex 00000000..3012346d\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/ixiaPing6.tcl\n@@ -0,0 +1,140 @@\n+# BSD LICENSE\r\n+#\r\n+# Copyright (c) 2014, Ixia All rights reserved.\r\n+# Copyright (c) 2014, Intel Corporation All rights reserved.\r\n+#\r\n+# Redistribution and use in source and binary forms, with or without\r\n+# modification, are permitted provided that the following conditions\r\n+# are met:\r\n+#\r\n+# * Redistributions of source code must retain the above copyright\r\n+#   notice, this list of conditions and the following disclaimer.\r\n+# * Redistributions in binary form must reproduce the above copyright\r\n+#   notice, this list of conditions and the following disclaimer in\r\n+#   the documentation and/or other materials provided with the\r\n+#   distribution.\r\n+# * Neither the name of the copyright holder nor the names of its\r\n+#   contributors may be used to endorse or promote products derived\r\n+#   from this software without specific prior written permission.\r\n+#\r\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n+\r\n+proc ping6 {destIP destMAC chasId card port } {\r\n+\r\n+\tset retCode $::TCL_OK \r\n+\tset streamId 1\r\n+\tset portList [list [list $chasId $card $port]]\r\n+\tset portIP \"fe80:0000:0000:0000:021e:67ff:fe0d:b60a\"\r\n+\r\n+\t# Set ports to factory defaults. Dumps out on error. \r\n+\tport setFactoryDefaults $chasId $card $port\r\n+\tport setDefault\r\n+\r\n+\t# Writes port properties in hardware \r\n+\tif {[ixWritePortsToHardware portList]} { \r\n+\t\treturn $::TCL_ERROR \r\n+\t} \r\n+ \r\n+# Check the link state of the ports \r\n+\tif {[ixCheckLinkState portList]} { \r\n+\t\treturn $::TCL_ERROR \r\n+\t}\r\n+\r\n+\tprotocol setDefault\r\n+\tprotocol config -ethernetType ethernetII \r\n+\tprotocol config -name ipV6 \r\n+\r\n+\ticmpV6 setDefault\r\n+\ticmpV6 setType icmpV6EchoRequestMessage \r\n+\r\n+\ticmpV6Informational setDefault\r\n+\ticmpV6Informational config -identifier 58275\r\n+\ticmpV6Informational config -sequenceNumber 1\r\n+\r\n+\tif {[icmpV6 set $chasId $card $port]} { \r\n+\t\treturn $::TCL_ERROR \r\n+\t}\r\n+\r\n+\tipV6 setDefault\r\n+\tipV6 config -sourceAddr $portIP\r\n+\tipV6 config -sourceMask 64\r\n+\tipV6 config -destAddr $destIP\r\n+\tipV6 config -destMask 64\r\n+\tipV6 config -nextHeader ipV4ProtocolIpv6Icmp\r\n+\tipV6 config -trafficClass 3\r\n+\tipV6 clearAllExtensionHeaders\r\n+ \r\n+\tif {[ipV6 addExtensionHeader ipV4ProtocolIpv6Icmp]} {\r\n+\t\treturn $::TCL_ERROR \r\n+\t}\r\n+\r\n+\tif {[ipV6 set $chasId $card $port]} { \r\n+\t\treturn $::TCL_ERROR \r\n+\t}\r\n+\r\n+\tstream config -numFrames 1\r\n+\tstream config -dma stopStream \r\n+\tstream config -framesize 122\r\n+\tstream config -rateMode usePercentRate \r\n+\tstream config -percentPacketRate 1 \r\n+\tstream config -sa \"00 00 01 00 02 00\"\r\n+\tstream config -da $destMAC\r\n+\r\n+\tif {[stream set $chasId $card $port $streamId]} { \r\n+\t\treturn $::TCL_ERROR \r\n+\t}\r\n+\r\n+\tif [ixWriteConfigToHardware portList] { \r\n+\t\treturn -code error \r\n+\t}\t\r\n+\r\n+\tif [ixClearStats portList] { \r\n+\t\treturn -code error \r\n+\t}\r\n+\r\n+\tafter 1000\r\n+\r\n+\tixStartCapture portList\r\n+\tixStartTransmit portList\r\n+\r\n+\tafter 1000\r\n+\r\n+\tif {[ixCheckTransmitDone portList] == $::TCL_ERROR} {\r\n+\t\treturn -code error\r\n+\t} else {\r\n+\t\tixPuts \"Transmission is complete\"\r\n+\t}\t\r\n+\r\n+\tif [ixStopCapture portList] {\r\n+\t\treturn -code error\r\n+\t}\r\n+\r\n+\tcaptureBuffer get $chasId $card $port\r\n+\tif {[captureBuffer cget -numFrames] == 0} {\r\n+\t\tixPuts \"No packets received\"\r\n+\t} else {\r\n+\t\tcaptureBuffer getframe 1\r\n+\t\tset data [captureBuffer cget -frame]\r\n+\t\ticmpV6 decode $data $chasId $card $port\r\n+\t\tipV6   decode $data $chasId $card $port\r\n+\t\tif {[icmpV6 cget -type] == 135 && [ipV6 cget -sourceAddr] == $destIP} {\r\n+\t\t\tixPuts \"64 bytes from\"\r\n+\t\t}\r\n+\t}\r\n+#\tixClearOwnership $portList\r\n+#\tixDisconnectFromChassis $hostname\r\n+#\tif [isUNIX] {\r\n+#\t\tixDisconnectTclServer $hostname\r\n+#\t}\r\n+#    cleanUp\r\n+}\r\ndiff --git a/dep/tclclient/ixTcl1.0/ixiarc.tcl b/dep/tclclient/ixTcl1.0/ixiarc.tcl\nnew file mode 100644\nindex 00000000..3c8e46d9\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/ixiarc.tcl\n@@ -0,0 +1,60 @@\n+# BSD LICENSE\r\n+#\r\n+# Copyright (c) 2014, Ixia All rights reserved.\r\n+#\r\n+# Redistribution and use in source and binary forms, with or without\r\n+# modification, are permitted provided that the following conditions\r\n+# are met:\r\n+#\r\n+# * Redistributions of source code must retain the above copyright\r\n+#   notice, this list of conditions and the following disclaimer.\r\n+# * Redistributions in binary form must reproduce the above copyright\r\n+#   notice, this list of conditions and the following disclaimer in\r\n+#   the documentation and/or other materials provided with the\r\n+#   distribution.\r\n+# * Neither the name of the copyright holder nor the names of its\r\n+#   contributors may be used to endorse or promote products derived\r\n+#   from this software without specific prior written permission.\r\n+#\r\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n+#\r\n+#   Version 6.20\r\n+#   \r\n+#   File: ixiarc.tcl\r\n+#\r\n+#   Copyright ©  IXIA\r\n+#   All Rights Reserved.\r\n+#\r\n+#   Revision Log:\r\n+#   04-28-1998  HS  Genesis\r\n+#\r\n+# Description: \r\n+#   This file sets up environment variables and other resources before the package\r\n+#\tcan be loaded. This file must be sourced before the main script is run. It can\r\n+#\tbe sourced manually in the wish/tclsh shell on placed as the first line of the\r\n+#\tmain script.\r\n+#\r\n+###################################################################################\r\n+global env\r\n+# Results of all Ixia tests will be placed in this directory\r\n+set env(IXIA_RESULTS_DIR)   [file dirname [file dirname [info library]]]\r\n+\r\n+# Run-time Logs of all Ixia tests will be placed in this directory\r\n+set env(IXIA_LOGS_DIR)      [file dirname [file dirname [info library]]]\r\n+\r\n+# The Samples files are located under this directory\r\n+set env(IXIA_SAMPLESDIR)    [file dirname [file dirname [info library]]]\r\n+\r\n+\r\n+\r\n+\r\ndiff --git a/dep/tclclient/ixTcl1.0/pkgIndex.tcl b/dep/tclclient/ixTcl1.0/pkgIndex.tcl\nnew file mode 100644\nindex 00000000..5e61c17e\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/pkgIndex.tcl\n@@ -0,0 +1,54 @@\n+# BSD LICENSE\r\n+#\r\n+# Copyright (c) 2014, Ixia All rights reserved.\r\n+#\r\n+# Redistribution and use in source and binary forms, with or without\r\n+# modification, are permitted provided that the following conditions\r\n+# are met:\r\n+#\r\n+# * Redistributions of source code must retain the above copyright\r\n+#   notice, this list of conditions and the following disclaimer.\r\n+# * Redistributions in binary form must reproduce the above copyright\r\n+#   notice, this list of conditions and the following disclaimer in\r\n+#   the documentation and/or other materials provided with the\r\n+#   distribution.\r\n+# * Neither the name of the copyright holder nor the names of its\r\n+#   contributors may be used to endorse or promote products derived\r\n+#   from this software without specific prior written permission.\r\n+#\r\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n+#\r\n+#   Version 6.20\r\n+#   \r\n+#   File: pkgIndex.tcl\r\n+#\r\n+#   Copyright ©  IXIA.\r\n+#\tAll Rights Reserved.\r\n+#\r\n+#############################################################################################\r\n+\r\n+if {$::tcl_platform(platform) != \"unix\"} {\r\n+    # if this package is already loaded, then don't load it again\r\n+    if {[lsearch [package names] IxTclHal] != -1} {\r\n+        return\r\n+    }\r\n+} else {\r\n+    lappend ::auto_path $dir\r\n+}\r\n+\r\n+package ifneeded IxTclHal 6.20 [list source [file join $dir ixTclHal.tcl]]\r\n+\r\n+\r\n+\r\n+\r\n+\r\ndiff --git a/dep/tclclient/ixTcl1.0/tclIndex b/dep/tclclient/ixTcl1.0/tclIndex\nnew file mode 100644\nindex 00000000..8d932054\n--- /dev/null\n+++ b/dep/tclclient/ixTcl1.0/tclIndex\n@@ -0,0 +1,836 @@\n+# Tcl autoload index file, version 2.0\r\n+# This file is generated by the \"auto_mkindex\" command\r\n+# and sourced to set up indexing information for one or\r\n+# more commands.  Typically each line is a command that\r\n+# sets an element in the auto_index array, where the\r\n+# element name is the name of a command and the value is\r\n+# a script that loads the command.\r\n+\r\n+set auto_index(ixDapConfigPort) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(ixDapAddPortInterface) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(ixDapAddRouteTable) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(ixDapAddPortFilter) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(ixDapBaseIpAddresses) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(ixDapCleanUp) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(ixDapSetBaseIp) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(ixDapAddRoute) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(ixDapDelRoute) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(ixDapLogin) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::Log) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::Error) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::init) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::login) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::printVersion) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::viewRoutes) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::addRoute) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::delRoute) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::createViewFrame) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::setAppName) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::setChassisList) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::getBaseIpAddressList) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::addInterfaceToArray) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::getInterfacePortList) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::getSortListFromArray) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::removeInterfaceFromArray) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::addRouteToArray) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::addFilterToArray) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::getValueFromList) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::isSubnetOverlapped) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::setBaseIp) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::validateBaseIpAddresses) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::setupPortInterfaces) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::addPortInterface) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::setupRouteTable) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::setupPortFilters) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::manageFilter) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::managePcpuCommand) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::downloadPackage) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::deletePackage) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::managePackage) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::pingBaseIpAddress) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::cleanUp) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(::ixDapConfig::main) [list source [file join $dir Dap ixDapConfig.tcl]]\r\n+set auto_index(clearStatsAndTransmit) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(transmitAndCollectRxRatesPerSecond) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(collectRxRatesPerSecond) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(prepareToTransmit) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(writeWaitForTransmit) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(writeWaitForPause) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(writeWaitMessage) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(issuePortGroupCommand) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(getPortGroupObject) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(issuePortGroupMethod) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(startTx) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(startStaggeredTx) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(stopTx) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(startPortTx) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(stopPortTx) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(startCapture) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(startPrbsCapture) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(stopCapture) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(stopPrbsCapture) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(clearPrbsCapture) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(startPortCapture) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(startPortPrbsCapture) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(stopPortCapture) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(stopPortPrbsCapture) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(clearPortPrbsCapture) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(startPacketGroups) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(stopPacketGroups) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(startPortPacketGroups) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(stopPortPacketGroups) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(clearPacketGroups) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(clearPortPacketGroups) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(startCollisions) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(stopCollisions) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(startPortCollisions) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(stopPortCollisions) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(zeroStats) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(zeroPortStats) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(clearPerStreamTxStats) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(clearPerStreamTxPortStats) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(clearPcsLaneStatistics) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(clearPcsLanePortStatistics) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(clearTimeStamp) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(flushAddressTable) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(enableArpResponse) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(enablePortArpResponse) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(disableArpResponse) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(disablePortArpResponse) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(transmitArpRequest) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(transmitPortArpRequest) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(clearArpTable) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(clearPortArpTable) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setDataIntegrityMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setPrbsMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setPacketGroupMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setWidePacketGroupMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setCaptureMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setTcpRoundTripFlowMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setPacketStreamMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setPacketFlowMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setAdvancedStreamSchedulerMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setFirstLastTimestampMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setDataIntegrityMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setSequenceCheckingMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(changePortTransmitMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(changePortReceiveMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(writeToHardware) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(writeToHardwareAsChunks) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(writePortsToHardware) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(writeConfigToHardware) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(resetSequenceIndex) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(resetPortSequenceIndex) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(loadPoePulse) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(loadPortPoePulse) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(armPoeTrigger) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(armPortPoeTrigger) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(abortPoeArm) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(abortPortPoeArm) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(resetSequenceIndex) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(resetPortSequenceIndex) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(loadPoEPulse) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(loadPortPoEPulse) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(restartAutoNegotiation) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(rebootLocalCpu) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(rebootPortLocalCpu) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(simulatePhysicalInterfaceDown) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(simulatePortPhysicalInterfaceDown) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(simulatePhysicalInterfaceUp) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(simulatePortPhysicalInterfaceUp) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(startAtmOamTransmit) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(startPortAtmOamTransmit) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(stopAtmOamTransmit) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(stopPortAtmOamTransmit) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setScheduledTransmitTime) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(setAutoDetectInstrumentationMode) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(enablePortIntrinsicLatencyAdjustment) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(enableIntrinsicLatencyAdjustment) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(isIntrinsicLatencyAdjustmentEnabled) [list source [file join $dir Generic actions.tcl]]\r\n+set auto_index(ipAddressSetDefault) [list source [file join $dir Generic addressTableUtils.tcl]]\r\n+set auto_index(updateIpAddressTable) [list source [file join $dir Generic addressTableUtils.tcl]]\r\n+set auto_index(mpincr) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(calculatePercentLossExact) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(calculatePercentLoss) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(calculatePercentThroughput) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(calculateDuration) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(calculateTotalBursts) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(calculateAvgLatency) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(calculateLoopCounterFromTxFrames) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(calculateStreamNumFrames) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(getTransmitTime) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(getDurationFromCapture) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(::ixMath::min) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(::ixMath::max) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(maxArray) [list source [file join $dir Generic calculate.tcl]]\r\n+set auto_index(connectToChassis) [list source [file join $dir Generic chassisUtils.tcl]]\r\n+set auto_index(setConnectChassisFlag) [list source [file join $dir Generic chassisUtils.tcl]]\r\n+set auto_index(getConnectChassisFlag) [list source [file join $dir Generic chassisUtils.tcl]]\r\n+set auto_index(clientOpen) [list source [file join $dir Generic clientUtils.tcl]]\r\n+set auto_index(clientClose) [list source [file join $dir Generic clientUtils.tcl]]\r\n+set auto_index(clientSend) [list source [file join $dir Generic clientUtils.tcl]]\r\n+set auto_index(remoteDefine) [list source [file join $dir Generic clientUtils.tcl]]\r\n+set auto_index(getConstantsValue) [list source [file join $dir Generic clientUtils.tcl]]\r\n+set auto_index(ixMasterSet) [list source [file join $dir Generic clientUtils.tcl]]\r\n+set auto_index(redefineCommand) [list source [file join $dir Generic clientUtils.tcl]]\r\n+set auto_index(doFileTransfer) [list source [file join $dir Generic clientUtils.tcl]]\r\n+set auto_index(getPercentMaxRate) [list source [file join $dir Generic conversions.tcl]]\r\n+set auto_index(getMaxFPS) [list source [file join $dir Generic conversions.tcl]]\r\n+set auto_index(convertPercentMaxRate) [list source [file join $dir Generic conversions.tcl]]\r\n+set auto_index(convertKbpsRate) [list source [file join $dir Generic conversions.tcl]]\r\n+set auto_index(convertFpsRate) [list source [file join $dir Generic conversions.tcl]]\r\n+set auto_index(generateFullList) [list source [file join $dir Generic conversions.tcl]]\r\n+set auto_index(::dataValidation::initialize) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::setParameter) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::getParameter) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::showRules) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::parseValues) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::isPortList) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::isString) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::isInteger) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::isDouble) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::areValuesOfTheType) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::validateTest) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::getValidValueString) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::validateTestConfParameter) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::doValidateTestConfParameter) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::validateCommandParameter) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::setErrorString) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::getErrorString) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::isDataInRange) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::validatePortSpeed) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::getProtocol) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::checkIdentical) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::checkMatched) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::frameSizeProtocolSame) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::validateImixList) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::validateProtocolTable) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::validateCmFlowMix) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::validateRunType) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::validateNumber) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::checkErrFrameFrameErrorList) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::checkCmatsIpAndMacAddress) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::isValidMulticastIp) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::isValidUnicastIp) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::isOverlappingIpAddress) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::isSameSubnet) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::isValidNetMask) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(::dataValidation::isValidHostPart) [list source [file join $dir Generic dataValidation.tcl]]\r\n+set auto_index(initializeDefineCommand) [list source [file join $dir Generic defineCommand.tcl]]\r\n+set auto_index(::defineCommand::initialize) [list source [file join $dir Generic defineCommand.tcl]]\r\n+set auto_index(::defineCommand::isRegistered) [list source [file join $dir Generic defineCommand.tcl]]\r\n+set auto_index(::defineCommand::getAllRegisteredCommands) [list source [file join $dir Generic defineCommand.tcl]]\r\n+set auto_index(::defineCommand::registerCommand) [list source [file join $dir Generic defineCommand.tcl]]\r\n+set auto_index(::defineCommand::registerMethod) [list source [file join $dir Generic defineCommand.tcl]]\r\n+set auto_index(::defineCommand::registerParameter) [list source [file join $dir Generic defineCommand.tcl]]\r\n+set auto_index(initializeDefineTest) [list source [file join $dir Generic defineTest.tcl]]\r\n+set auto_index(::defineTest::initialize) [list source [file join $dir Generic defineTest.tcl]]\r\n+set auto_index(::defineTest::registerCommand) [list source [file join $dir Generic defineTest.tcl]]\r\n+set auto_index(::defineTest::registerParameter) [list source [file join $dir Generic defineTest.tcl]]\r\n+set auto_index(::defineTest::registerTest) [list source [file join $dir Generic defineTest.tcl]]\r\n+set auto_index(dhcpSetState) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpGetState) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpSetLease) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpGetLease) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpSetIP) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpGetIP) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpSetServer) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpGetServer) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpGetTimer) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpStartTimers) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpStartTimer) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpStopTimers) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpStopTimer) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpSetStreamRegion) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpGetStreamRegion) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpSetPortList) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpGetPortList) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpStop) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpStopPort) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpEnableStateMachine) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(dhcpDisableStateMachine) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(DHCPdiscoverIP) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(send_DHCP_discover) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(get_DHCP_offer) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(send_DHCP_request) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(get_DHCP_ack) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(send_DHCP_release) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(setupUDPbootp) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(setupDhcpBroadcastIP) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(setupDhcpUnicastIP) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(setupDefaultDhcpParameters) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(setDhcpOptions) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(sendDhcpPacket) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(buildDhcpPacket) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(get_DHCP_packet) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::Initialize) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::Stop) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::StopPort) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::SetState) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::GetState) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::SetLease) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::GetLease) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::StartTimers) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::StopTimers) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::StartTimer) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::StopTimer) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::GetTimer) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::SetIP) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::GetIP) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::SetServer) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::GetServer) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::SetStreamRegion) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::GetStreamRegion) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::SetPortList) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::GetPortList) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::InitStateTable) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::StateLookup) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::ActionNull) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::ActionRenew) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::ActionRebind) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::ActionInit) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::GetStateNames) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::GetStateName) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::GetStateCodes) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::ValidState) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::GetEventName) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::GetEventCodes) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::ValidEvent) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::getTransactionID) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::clearParameterRequestList) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::getParameterRequestList) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::setParameterRequestList) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::getMagicCookie) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::setStartTime) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::getStartTime) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(::dhcpClient::debug) [list source [file join $dir Generic dhcpExchange.tcl]]\r\n+set auto_index(createDialog) [list source [file join $dir Generic dialogUtils.tcl]]\r\n+set auto_index(writeDialog) [list source [file join $dir Generic dialogUtils.tcl]]\r\n+set auto_index(destroyDialog) [list source [file join $dir Generic dialogUtils.tcl]]\r\n+set auto_index(::dialogUtils::init) [list source [file join $dir Generic dialogUtils.tcl]]\r\n+set auto_index(::dialogUtils::create) [list source [file join $dir Generic dialogUtils.tcl]]\r\n+set auto_index(::dialogUtils::writeText) [list source [file join $dir Generic dialogUtils.tcl]]\r\n+set auto_index(::dialogUtils::getWindowState) [list source [file join $dir Generic dialogUtils.tcl]]\r\n+set auto_index(::dialogUtils::setWindowState) [list source [file join $dir Generic dialogUtils.tcl]]\r\n+set auto_index(::dialogUtils::saveWindowState) [list source [file join $dir Generic dialogUtils.tcl]]\r\n+set auto_index(::dialogUtils::destroyedByUser) [list source [file join $dir Generic dialogUtils.tcl]]\r\n+set auto_index(::dialogUtils::destroy) [list source [file join $dir Generic dialogUtils.tcl]]\r\n+set auto_index(setStopTestFlag) [list source [file join $dir Generic eventHandler.tcl]]\r\n+set auto_index(stopTest) [list source [file join $dir Generic eventHandler.tcl]]\r\n+set auto_index(isTestStopped) [list source [file join $dir Generic eventHandler.tcl]]\r\n+set auto_index(informServerCurrentTestStopped) [list source [file join $dir Generic eventHandler.tcl]]\r\n+set auto_index(IsPOSPort) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(Is10GigEPort) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(IsGigabitPort) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(any10100Ports) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(anyGigPorts) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(anyOc48Ports) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(anyOc192Ports) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(anyPortsByInterface) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(anyPortsBySpeed) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(supportsProtocolServer) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(supportsPortCPU) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(isValidFeature) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(isPacketFlowMode) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(isAdvancedStreamSchedulerMode) [list source [file join $dir Generic featureUtils.tcl]]\r\n+set auto_index(::fileTransferClient::openConnectionToTclServer) [list source [file join $dir Generic fileTransferClient.tcl]]\r\n+set auto_index(::fileTransferClient::closeTclServerConnection) [list source [file join $dir Generic fileTransferClient.tcl]]\r\n+set auto_index(::fileTransferClient::sendTransactionToTclServer) [list source [file join $dir Generic fileTransferClient.tcl]]\r\n+set auto_index(::fileTransferClient::getFile) [list source [file join $dir Generic fileTransferClient.tcl]]\r\n+set auto_index(::fileTransferClient::putFile) [list source [file join $dir Generic fileTransferClient.tcl]]\r\n+set auto_index(::fileTransferClient::getTransferOutcome) [list source [file join $dir Generic fileTransferClient.tcl]]\r\n+set auto_index(putFtpLogWindow) [list source [file join $dir Generic ftp.tcl]]\r\n+set auto_index(ixFileSend) [list source [file join $dir Generic ftp.tcl]]\r\n+set auto_index(ixFileTransferStart) [list source [file join $dir Generic ftp.tcl]]\r\n+set auto_index(ixInitialize) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixConnectToChassis) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixConnectToTclServer) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixDisconnectTclServer) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixGetChassisID) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixDisconnectFromChassis) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixGlobalSetDefault) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStartTransmit) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStartPortTransmit) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStartStaggeredTransmit) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStopTransmit) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStopPortTransmit) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStartCapture) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStartPrbsCapture) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStopCapture) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStopPrbsCapture) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixClearPrbsCapture) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStartPortCapture) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStartPortPrbsCapture) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStopPortCapture) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStopPortPrbsCapture) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixClearPortPrbsCapture) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixClearStats) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixClearPortStats) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixClearPerStreamTxStats) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixClearPerStreamTxPortStats) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixRequestStats) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixClearTimeStamp) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStartPacketGroups) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStartPortPacketGroups) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStopPacketGroups) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixClearPacketGroups) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixClearPortPacketGroups) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetScheduledTransmitTime) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixClearScheduledTransmitTime) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStopPortPacketGroups) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStartCollisions) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStartPortCollisions) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStopCollisions) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStopPortCollisions) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixLoadPoePulse) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixLoadPortPoePulse) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixArmPoeTrigger) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixArmPortPoeTrigger) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixAbortPoeArm) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixAbortPortPoeArm) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStartAtmOamTransmit) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStartPortAtmOamTransmit) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStopAtmOamTransmit) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixStopPortAtmOamTransmit) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixCreatePortListWildCard) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixCreateSortedPortList) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixPuts) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixiaPortSetParms) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixiaReadWriteMII) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixTclSvrConnect) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixTclSvrDisconnect) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixEnableArpResponse) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixEnablePortArpResponse) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixDisableArpResponse) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixTransmitArpRequest) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixClearArpTable) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixDisablePortArpResponse) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixTransmitPortArpRequest) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixClearPortArpTable) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPacketGroupMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPortPacketGroupMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetAutoDetectInstrumentationMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPortAutoDetectInstrumentationMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetWidePacketGroupMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPortWidePacketGroupMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetCaptureMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPortCaptureMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetTcpRoundTripFlowMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPortTcpRoundTripFlowMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetDataIntegrityMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPortDataIntegrityMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPrbsMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPortPrbsMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetSequenceCheckingMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPortSequenceCheckingMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPacketFlowMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPortPacketFlowMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPacketStreamMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPortPacketStreamMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetAdvancedStreamSchedulerMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSetPortAdvancedStreamSchedulerMode) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixWritePortsToHardware) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixWriteConfigToHardware) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixCheckTransmitDone) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixCheckPortTransmitDone) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixCheckLinkState) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixCheckPPPState) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixCollectStats) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixProxyConnect) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixResetSequenceIndex) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixResetPortSequenceIndex) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixRestartAutoNegotiation) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixRestartPortAutoNegotiation) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixRestartPPPNegotiation) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixRestartPortPPPNegotiation) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSimulatePhysicalInterfaceUp) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSimulatePortPhysicalInterfaceUp) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSimulatePhysicalInterfaceDown) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixSimulatePortPhysicalInterfaceDown) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixIsOverlappingIpAddress) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixIsSameSubnet) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixIsValidHost) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixIsValidNetMask) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixIsValidUnicastIp) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixConvertFromSeconds) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixConvertToSeconds) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixEnablePortIntrinsicLatencyAdjustment) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixEnableIntrinsicLatencyAdjustment) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(ixIsIntrinsicLatencyAdjustmentEnabled) [list source [file join $dir Generic highLevelAPI.tcl]]\r\n+set auto_index(initCommand_zz_advancedTestParameter) [list source [file join $dir Generic interface.tcl]]\r\n+set auto_index(initCommand_zz_fastpath) [list source [file join $dir Generic interface.tcl]]\r\n+set auto_index(initCommand_zz_ipfastpath) [list source [file join $dir Generic interface.tcl]]\r\n+set auto_index(initCommand_zz_learn) [list source [file join $dir Generic interface.tcl]]\r\n+set auto_index(initCommand_zz_logger) [list source [file join $dir Generic interface.tcl]]\r\n+set auto_index(initCommand_zz_map) [list source [file join $dir Generic interface.tcl]]\r\n+set auto_index(initCommand_zz_tclClient) [list source [file join $dir Generic interface.tcl]]\r\n+set auto_index(initCommand_zz_testProfile) [list source [file join $dir Generic interface.tcl]]\r\n+set auto_index(::interfaceTable::setDefault) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::configurePort) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::configure) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::addEntry) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::updateEntry) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::updateItemIpV4) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::updateItemIpV6) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::addMultipleEntry) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::addItemIpV4) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::formatEntryDescription) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::getInterfaceId) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::getInterfaceCount) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::enableInterface) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::disableInterface) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::disableAllInterfaces) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::deleteInterface) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::getEntryList) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::interfaceTable::getGatewayArray) [list source [file join $dir Generic interfaceTableUtils.tcl]]\r\n+set auto_index(::ipv6::host2addr) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::expandAddress) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::compressAddress) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::convertAddress) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::convertMacToIpV6) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::convertIpToIpV6) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::convertIpToIsatap) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::convertIptoIpV4Compatible) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::convertIpTo6to4) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::convertIpV6ToMac) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::convertIpV6ToIp) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::convertNoop) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getAddressFields) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getFieldListByPrefix) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getFieldNamesByPrefix) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getFormatPrefix) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getTopLevelAggregateId) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getNextLevelAggregateId) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getSiteLevelAggregateId) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getSubnetId) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getInterfaceId) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getLoopbackAddress) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::isValidAddress) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::validateAddress) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::isReservedMCAddress) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::isValidMCAddress) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::isMixedVersionAddress) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::incrIpField) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::convertIpv6AddrToBytes) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::convertBytesToIpv6Address) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::incIpv6AddressByPrefix) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getFieldMask) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getMinimumValidFramesize) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getHeaderLength) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ipv6::getAddressFieldOffset) [list source [file join $dir Generic ipV6Utils.tcl]]\r\n+set auto_index(::ixFileUtils::closeAll) [list source [file join $dir Generic ixFileUtils.tcl]]\r\n+set auto_index(::ixFileUtils::addFileToList) [list source [file join $dir Generic ixFileUtils.tcl]]\r\n+set auto_index(::ixFileUtils::removeFileFromList) [list source [file join $dir Generic ixFileUtils.tcl]]\r\n+set auto_index(::ixFileUtils::open) [list source [file join $dir Generic ixFileUtils.tcl]]\r\n+set auto_index(::ixFileUtils::close) [list source [file join $dir Generic ixFileUtils.tcl]]\r\n+set auto_index(::ixGraph::create) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::reset) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::destroy) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::addLine) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::getLines) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::deleteLine) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::resetLine) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::updateLine) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::getDataVector) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::setDataVector) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::resetDataVector) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::updateDataVectorPair) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::updateDataVector) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::updateCoordinates) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::ixGraph::advanceBuffer) [list source [file join $dir Generic ixGraph.tcl]]\r\n+set auto_index(::logger::on) [list source [file join $dir Generic log.tcl]]\r\n+set auto_index(::logger::off) [list source [file join $dir Generic log.tcl]]\r\n+set auto_index(::logger::message) [list source [file join $dir Generic log.tcl]]\r\n+set auto_index(::logger::show) [list source [file join $dir Generic log.tcl]]\r\n+set auto_index(ixCollectAndSendLogs) [list source [file join $dir Generic logCollector.tcl]]\r\n+set auto_index(::map::new) [list source [file join $dir Generic map.tcl]]\r\n+set auto_index(::map::add) [list source [file join $dir Generic map.tcl]]\r\n+set auto_index(::map::del) [list source [file join $dir Generic map.tcl]]\r\n+set auto_index(::map::show) [list source [file join $dir Generic map.tcl]]\r\n+set auto_index(::map::validateMapType) [list source [file join $dir Generic map.tcl]]\r\n+set auto_index(showmaps) [list source [file join $dir Generic map.tcl]]\r\n+set auto_index(ixMiiConfigPreEmphasis) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(ixMiiConfigLossOfSignalThreshold) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(ixMiiConfigXgxsLinkMonitoring) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(ixMiiConfigAlignRxDataClock) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(ixMiiConfigReceiveEqualization) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(ixMiiConfigXauiOutput) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(ixMiiConfigXauiSerialLoopback) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(ixMiiConfigXgmiiParallelLoopback) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiConfig::preEmphasis) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiConfig::lossOfSignalThreshold) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiConfig::xgxsLinkMonitoring) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiConfig::alignRxDataClock) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiConfig::receiveEqualization) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiConfig::xauiOutput) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiConfig::xauiSerialLoopback) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiConfig::xgmiiParallelLoopback) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiConfig::isXauiSerialLoopback) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiConfig::isXgmiiParallelLoopback) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiConfig::setRegister) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiConfig::getRegister) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiaeConfig::setRegister) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(::miiaeConfig::getRegister) [list source [file join $dir Generic miiUtils.tcl]]\r\n+set auto_index(logOn) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(logOff) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(logMsg) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(errorMsg) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(debugOn) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(debugOff) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(debugMsg) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(showCmd) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(openMyFile) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(closeMyFile) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(callTraceMsg) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(traceVariableMsg) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(isDigit) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(isNegative) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(isValidExponentialFloat) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(isValidPositiveExponentialFloat) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(isValidPartialFloat) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(isValidPositivePartialFloat) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(isValidPositiveFloat) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(isValidInteger) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(isValidPositiveInteger) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(getProcList) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(getTxBasedOnRx) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(convertFromSeconds) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(convertToSeconds) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(formatDurationTime) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(formatNumber) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(unixCludgeGetExpr) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(useProfile) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(CountGlobalMemory) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(createNamedFont) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(buildFileName) [list source [file join $dir Generic miscCmds.tcl]]\r\n+set auto_index(ixSource) [list source [file join $dir Generic multiUser.tcl]]\r\n+set auto_index(sourceRecursively) [list source [file join $dir Generic multiUser.tcl]]\r\n+set auto_index(ixLogin) [list source [file join $dir Generic multiUser.tcl]]\r\n+set auto_index(ixLogout) [list source [file join $dir Generic multiUser.tcl]]\r\n+set auto_index(ixTakeOwnership) [list source [file join $dir Generic multiUser.tcl]]\r\n+set auto_index(ixPortTakeOwnership) [list source [file join $dir Generic multiUser.tcl]]\r\n+set auto_index(ixClearOwnership) [list source [file join $dir Generic multiUser.tcl]]\r\n+set auto_index(ixPortClearOwnership) [list source [file join $dir Generic multiUser.tcl]]\r\n+set auto_index(ixCheckOwnership) [list source [file join $dir Generic multiUser.tcl]]\r\n+set auto_index(canUse) [list source [file join $dir Generic multiUser.tcl]]\r\n+set auto_index(isMine) [list source [file join $dir Generic multiUser.tcl]]\r\n+set auto_index(calculateChecksum) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(oid2octet) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildLLCHeader) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildIpHeader) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildRipBlock) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildVidHeader) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildIPXPacket) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildIPXData) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildServerEntry) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildSapPacket) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildNetworkEntry) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildRipxPacket) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildArpPacket) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildRipPacket) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildUdpEchoPacket) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildIgmpPacket) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildIpPriorityPacket) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildVlanTagPacket) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildSnmpPacket) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildIcmpPacket) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(buildBpduPacket) [list source [file join $dir Generic packetBuilder.tcl]]\r\n+set auto_index(ixGetArgument) [list source [file join $dir Generic parseArgs.tcl]]\r\n+set auto_index(isUNIX) [list source [file join $dir Generic platform.tcl]]\r\n+set auto_index(isWindows) [list source [file join $dir Generic platform.tcl]]\r\n+set auto_index(RandomRange) [list source [file join $dir Generic random.tcl]]\r\n+set auto_index(Random) [list source [file join $dir Generic random.tcl]]\r\n+set auto_index(RandomInit) [list source [file join $dir Generic random.tcl]]\r\n+set auto_index(RandomFromTo) [list source [file join $dir Generic random.tcl]]\r\n+set auto_index(::scriptmateBackwardsCompatibility::createAllCommands) [list source [file join $dir Generic scriptmateBackCompat.tcl]]\r\n+set auto_index(serverSocketAccept) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(readsocket) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(handleEvent) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(generatePort) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(putsClient) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(createServerSocket) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(closeSocket) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(closeServerSocket) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(isTestCommandSocket) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(isLogSocket) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(isCommandSocket) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(isDataSocket) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(createClientSocket) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(closeClientSocket) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(closeAllSockets) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(readClientSocket) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(createClientSocketCreate) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(putsServer) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(handleCommand) [list source [file join $dir Generic socket.tcl]]\r\n+set auto_index(checkTransmitDone) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(checkAllTransmitDone) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(requestStats) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(collectTxStats) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(collectRxStats) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(collectVlanStats) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(collectDataIntegrityStats) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(collectSequenceStats) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(collectErroredFramesStats) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(collectQosStats) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(collectStats) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(getNumErroredFrames) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(checkLinkState) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(checkPPPState) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(getRunningRate) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(getRunRatePerSecond) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(collectRates) [list source [file join $dir Generic statistics.tcl]]\r\n+set auto_index(capitalizeString) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(stringRepeat) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(stringIsInteger) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(stringIsDouble) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(stringSubstitute) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(stringUnderscore) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(stringTitle) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(stringSplitToTitle) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(stringJoinFromTitle) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(stringToUpper) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(stringMap) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(stringCompare) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(stringFormatNumber) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(stringReplace) [list source [file join $dir Generic stringUtils.tcl]]\r\n+set auto_index(send_learn_frames) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(OLDsend_arp_frames) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(send_arp_frames) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(configureArp) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(sendArp) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(verifyAllArpFramesSent) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(verifyArpReply) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(send_neighborDiscovery_frames) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(performNeighborDiscovery) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(sendRouterSolicitation) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(getNeighborDiscovery) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(getNeighborDiscoveryPort) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(sapStr2Asc) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(send_ripx_frames) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(send_sap_server_frames) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(send_sapgns_frames) [list source [file join $dir Generic switchLearn.tcl]]\r\n+set auto_index(::tclServer::getTclServerName) [list source [file join $dir Generic tclServer.tcl]]\r\n+set auto_index(::tclServer::setTclServerName) [list source [file join $dir Generic tclServer.tcl]]\r\n+set auto_index(::tclServer::disconnectTclServer) [list source [file join $dir Generic tclServer.tcl]]\r\n+set auto_index(::tclServer::read) [list source [file join $dir Generic tclServer.tcl]]\r\n+set auto_index(::tclServer::connectToTclServer) [list source [file join $dir Generic tclServer.tcl]]\r\n+set auto_index(::tclServer::isTclServerConnected) [list source [file join $dir Generic tclServer.tcl]]\r\n+set auto_index(::tclServer::setTclServer) [list source [file join $dir Generic tclServer.tcl]]\r\n+set auto_index(::tclServer::connectButton) [list source [file join $dir Generic tclServer.tcl]]\r\n+set auto_index(::tclServer::cancelButton) [list source [file join $dir Generic tclServer.tcl]]\r\n+set auto_index(parseCmd) [list source [file join $dir Generic testCmdControl.tcl]]\r\n+set auto_index(configureOptions) [list source [file join $dir Generic testCmdControl.tcl]]\r\n+set auto_index(cgetOptions) [list source [file join $dir Generic testCmdControl.tcl]]\r\n+set auto_index(getParmProperty) [list source [file join $dir Generic testCmdControl.tcl]]\r\n+set auto_index(startOptions) [list source [file join $dir Generic testCmdControl.tcl]]\r\n+set auto_index(registerResultVarsOptions) [list source [file join $dir Generic testCmdControl.tcl]]\r\n+set auto_index(existsOptions) [list source [file join $dir Generic testCmdControl.tcl]]\r\n+set auto_index(calcTrafficMix) [list source [file join $dir Generic trafficMix.tcl]]\r\n+set auto_index(calcAggregateDataRate) [list source [file join $dir Generic trafficMix.tcl]]\r\n+set auto_index(calcAggregateFrameRate) [list source [file join $dir Generic trafficMix.tcl]]\r\n+set auto_index(calcAggregateTotalRate) [list source [file join $dir Generic trafficMix.tcl]]\r\n+set auto_index(calcAggregateBitRate) [list source [file join $dir Generic trafficMix.tcl]]\r\n+set auto_index(calcAggregatePPS) [list source [file join $dir Generic trafficMix.tcl]]\r\n+set auto_index(calcTotalBits) [list source [file join $dir Generic trafficMix.tcl]]\r\n+set auto_index(calcTotalStreamTime) [list source [file join $dir Generic trafficMix.tcl]]\r\n+set auto_index(globalSetDefault) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(protocolStackSetDefault) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(streamSet) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(validateFramesize) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(validateFramesizeList) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(validatePreamblesize) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getLearnProc) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(validateProtocol) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(initMaxRate) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(buildIpMcastMacAddress) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(setPortName) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getPortString) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getPortId) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getPortName) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(setPortFactoryDefaults) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(setFactoryDefaults) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getProtocolName) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getDuplexModeString) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(disableUdfs) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getIpClassName) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getMinimum) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(swapPortList) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(copyPortList) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(removePorts) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(lnumsort) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(mergeLists) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(host2addr) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(long2IpAddr) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(byte2IpAddr) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(num2ip) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(ip2num) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(long2octet) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(list2word) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(value2Hexlist) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(hexlist2Value) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(expandHexString) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getMultipleNumbers) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(hextodec) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(dectohex) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(incrMacAddress) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(incrIpField) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(incrIpFieldHexFormat) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(assignIncrMacAddresses) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(incrHostIpAddr) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(waitForResidualFrames) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getPerTxArray) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getTxPorts) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getRxPorts) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getAllPorts) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(comparePortArray) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(mergePortArray) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getAdvancedSchedulerArray) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(cleanUpMultiuser) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(cleanUp) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(isIpAddressValid) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(isMacAddressValid) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(isPartialMacAddressValid) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getCommandParameters) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(changePortLoopback) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(validateUnidirectionalMap) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getTxRxModeString) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(removeStreams) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getIpV4MaskWidth) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(getIpV4MaskFromWidth) [list source [file join $dir Generic utils.tcl]]\r\n+set auto_index(ixIsBgpInstalled) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixIsIsisInstalled) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixIsRsvpInstalled) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixIsOspfInstalled) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixIsRipInstalled) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixIsArpInstalled) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixIsIgmpInstalled) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixIsVpnL2Installed) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixIsVpnL3Installed) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixIsMldInstalled) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixIsOspfV3Installed) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixIsPimsmInstalled) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixGetLineUtilization) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixIsLdpInstalled) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(ixIsRipngInstalled) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(calculateMaxRate) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(calculateGapBytes) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(calculateFPS) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(calculatePercentMaxRate) [list source [file join $dir Generic utilWrappers.tcl]]\r\n+set auto_index(vlanUtilsSetDefault) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(::vlanUtils::setPortTagged) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(::vlanUtils::setTagged) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(::vlanUtils::setPortUntagged) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(::vlanUtils::setUntagged) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(::vlanUtils::isPortTagged) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(::vlanUtils::emptyUntaggedPortList) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(setPortTagged) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(setTagged) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(setPortUntagged) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(setUntagged) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(isPortTagged) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(getUntaggedPortList) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(emptyUntaggedPortList) [list source [file join $dir Generic vlanUtils.tcl]]\r\n+set auto_index(::ixXML::Init) [list source [file join $dir Generic xmlUtils.tcl]]\r\n+set auto_index(::ixXML::NextToken) [list source [file join $dir Generic xmlUtils.tcl]]\r\n+set auto_index(::ixXML::IsWellFormed) [list source [file join $dir Generic xmlUtils.tcl]]\r\n+set auto_index(::ixXML::_IsWellFormed) [list source [file join $dir Generic xmlUtils.tcl]]\r\ndiff --git a/dep/tgen.tgz b/dep/tgen.tgz\ndeleted file mode 100644\nindex 5b242a1ec15db3948b09456e9a8736c93ac337f2..0000000000000000000000000000000000000000\nGIT binary patch\nliteral 0\nHcmV?d00001\n\nliteral 134392\n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\n\ndiff --git a/dep/tgen/Pktgen.lua b/dep/tgen/Pktgen.lua\nnew file mode 100644\nindex 00000000..d8181ef7\n--- /dev/null\n+++ b/dep/tgen/Pktgen.lua\n@@ -0,0 +1,276 @@\n+-- Create some short cuts to the real functions.\n+gsub\t\t    = string.gsub\n+gmatch          = string.gmatch\n+strrep\t\t    = string.rep\n+strsub          = string.sub\n+strfmt          = string.format\n+strmatch        = string.match\n+strrep          = string.rep\n+strfind         = string.find\n+strlen          = string.len\n+tolower         = string.lower\n+unlink          = os.remove\n+system          = os.execute\n+tinsert         = table.insert\n+tgetn           = table.getn\n+tconcat         = table.concat\n+\n+-- ===========================================================================\n+-- getPwd - Get the current working directory path.\n+-- Works for both dos and cygwin shell, which may emit an error if one failes.\n+--\n+function getPwd( func )\n+\tlocal s = syscmd(\"pwd\", func);\n+\tif ( s == nil ) then\n+\t\ts = syscmd(\"sh pwd\", func);\n+\tend\n+\treturn s;\n+end\n+\n+-- ===========================================================================\n+-- d2u - convert dos backslashes to unix forward slashes.\n+--\n+function d2u( str )\n+    return gsub(str or \"\", \"\\\\\", \"/\");\n+end\n+\n+-- ===========================================================================\n+-- u2d - convert unix forward slashes to dos backslashes.\n+--\n+function u2d( str )\n+    return gsub(str or \"\", \"/\", \"\\\\\");\n+end\n+\n+-- ===========================================================================\n+-- str2tbl - convert a string to a table.\n+--\n+function str2tbl( str )\n+    local t = {};\n+    local s;\n+\n+    for s in gmatch(str or \"\", \"(.-)\\n\") do\n+        tinsert(t, s);\n+    end\n+    return t\n+end\n+\n+-- ===========================================================================\n+-- trims the string of beginning and trailing spaces and tabs.\n+--\n+function trim(txt) return gsub(txt, \"%s*(.-)%s*$\", \"%1\", 1); end\n+\n+-- ===========================================================================\n+-- A formatted output routine just like the real printf.\n+--\n+function printf(...) io.write(strfmt(...)); io.flush(); end\n+\n+-- ===========================================================================\n+-- returns the table size or number of items in table.\n+--\n+function getn( t )\n+\n+    local   i = 0;\n+\n+    if ( (t ~= nil) and (type(t) == \"table\") ) then\n+        i = tgetn(t);\n+        if ( i > 0 ) then\n+            return i;\n+        end\n+        for k in pairs(t) do\n+            i = i + 1;\n+        end\n+    end\n+    return i;\n+end\n+\n+-- ===========================================================================\n+-- returns the 'basename' and the 'basedir' \n+--\n+function basename(filename) \n+    local   fn, dn;\n+\n+    -- Convert the '\\' to '/' in the path name.\n+    filename = d2u(filename);\n+\n+    fn = gsub(filename, \"(.*/)(.*)\", \"%2\") or filename; \n+    dn = gsub(filename, \"(.*/)(.*)\", \"%1\") \n+\n+    dn = strsub(dn, 1, -2);\n+\n+    return fn, dn;\n+end\n+\n+-- ===========================================================================\n+-- Default routine to read data from syscmd function.\n+--\n+local function __doRead(fn)\n+    local   data, f;\n+\n+    -- Open and read all of the data.\n+    f = assert(io.open(fn));\n+    data = f:read(\"*all\");\n+    f:close();\n+\n+    unlink(fn);\n+\n+    return data;\n+end\n+\n+-- ===========================================================================\n+-- Execute the system command return the command output if needed.\n+--\n+function syscmd( cmd, funcPtr )\n+    local tmpFile = \"syscmd_tmp\";\n+\n+    system( cmd .. \" > \" .. tmpFile );\n+ \n+    funcPtr = funcPtr or __doRead;\n+\n+    return funcPtr(tmpFile);    -- tmpFile is removed by the function.\n+end\n+\n+-- ===========================================================================\n+-- Execute the string and return true/false.\n+--\n+function isTrue(f)\n+    local   s;\n+\n+    if ( f == nil ) then\n+        return 0;\n+    end\n+\n+    s = \"if ( \"..f..\" ) then return 1 else return 0 end\";\n+    return assert(loadstring(s))();\n+end\n+\n+-- ===========================================================================\n+-- Output a message and return.\n+--\n+function msg(m, ...)\n+\n+    if ( m ~= nil ) then io.write(\"++ \"..strfmt(m, ...)); io.flush(); end\n+end\n+-- ===========================================================================\n+-- Display an error message and exit.\n+--\n+function errmsg(m, ...)\n+\n+    if ( m ~= nil ) then printf(\"** %s\", strfmt(m, ...)); end\n+\n+    os.exit(1);\n+end\n+\n+-- ===========================================================================\n+-- Output a 'C' like block comment.\n+--\n+function cPrintf(m, ...)\n+\n+    printf(\"/* \");\n+    io.write(strfmt(m, ...));\n+    printf(\" */\\n\");\n+end\n+-- ===========================================================================\n+-- Output a 'C' like comment.\n+--\n+function comment(msg)\n+\n+    printf(\"/* %s */\\n\", msg or \"ooops\");\n+end\n+\n+-- Standard set of functions for normal operation.\n+--\n+\n+-----------------------------------------------------------------------------\n+-- serializeIt - Convert a variable to text or its type of variable.\n+--\n+local function serializeIt(v)\n+    local   s;\n+    local   t = type(v);\n+\n+    if (t == \"number\") then\n+        s = tostring(v);\n+    elseif (t == \"table\") then\n+        s = tostring(v);\n+    elseif (t == \"string\") then\n+        s = strfmt(\"%q\", v);\n+    elseif (t == \"boolean\") then\n+        s = tostring(v);\n+    elseif (t == \"function\") then\n+        s = strfmt(\"()\");\n+    elseif (t == \"userdata\") then\n+        s = tostring(v);\n+    elseif (t == \"nil\") then\n+        s = \"nil\";\n+    else\n+        s = strfmt(\"<%s>\", tostring(v));\n+    end\n+\n+    return s;\n+end\n+\n+-----------------------------------------------------------------------------\n+-- Serialize a value\n+--    k - is the variable name string.\n+--    o - is the orignal variable name for tables.\n+--    v - the value of the variable.\n+--    saved - is the saved table to detect loops.\n+--    tab - is the current tab depth.\n+--\n+local function doSerialize(k, o, v, saved, tab)\n+\tlocal s, t;\n+    local space = function(t) return strrep(\" \", t); end;\n+\n+    tab     = tab or 0;\n+    t       = type(v);\n+    saved   = saved or {};\n+\n+\tif (t == \"table\") then\n+        if ( saved[v] ~= nil ) then\n+            return strfmt(\"%s[%s] = %s,\\n\", space(tab), serializeIt(o), saved[v]); \n+        else\n+            local   kk, vv, mt;\n+\n+            saved[v] = k;\n+\n+            if ( tab == 0 ) then\n+                s = strfmt(\"%s%s = {\\n\", space(tab), tostring(k)); \n+            else\n+                s = strfmt(\"%s[%s] = {\\n\", space(tab), serializeIt(o)); \n+            end\n+            for kk,vv in pairs(v) do\n+                local fn = strfmt(\"%s[%s]\", tostring(k), serializeIt(kk));\n+\n+                s = s .. doSerialize(fn, kk, vv, saved, tab+2);\n+            end\n+\n+\t\t\tif ( tab == 0 ) then\n+            \treturn s .. strfmt(\"%s}\\n\", space(tab));\n+\t\t\telse\n+            \treturn s .. strfmt(\"%s},\\n\", space(tab));\n+\t\t\tend\n+        end\n+\telse\n+        return strfmt(\"%s[%s] = %s,\\n\", space(tab), serializeIt(o), serializeIt(v));\n+\tend\n+end\n+\n+-----------------------------------------------------------------------------\n+-- serialize - For a given key serialize the global variable.\n+--    k is a string for display and t is the table to display.\n+--    e.g. printf(serialize(\"foo\", { [\"bar\"] = \"foobar\" } ));\n+--              \n+function serialize(k, t)\n+\n+    if ( k == nil ) then\n+\t    k = \"Globals\";\n+        t = _G;\t\t\t-- Dump out globals\n+    end\n+\tif ( t == nil ) then\n+\t\tt = _G;\n+\tend\n+\n+   \treturn doSerialize(k, k, t, {}, 0);\n+end\n+\n+function prints(k, t) io.write(serialize(k, t)); io.flush(); end\n+function sleep(t) pktgen.delay(t * 1000); end\ndiff --git a/dep/tgen/PktgenGUI.lua b/dep/tgen/PktgenGUI.lua\nnew file mode 100644\nindex 00000000..1ce542ab\n--- /dev/null\n+++ b/dep/tgen/PktgenGUI.lua\n@@ -0,0 +1,113 @@\n+--\n+-- PktgenGUI.lua\n+--\n+\n+gui = {}\n+\n+function gui.msg(...)\n+\tstr = strfmt(\"msg=%s\\n\",strfmt(...));\n+\tio.write(str);\n+\tio.flush();\n+end\n+\n+function gui.dumpStats(func, name, portlist)\n+\tstats = func(portlist);\n+\tprintf(\"%s={ \", name);\n+\tst = stats[0];\n+\tfor k,v in pairs(st) do \n+\t\tprintf(\"%s \", k);\n+\tend\n+\tprintf(\"},\");\n+\tfor i = 0, (stats.n - 1) do\n+\t\tst = stats[i];\n+\t\tprintf(\"%d={ \", i);\n+\t\tfor k,v in pairs(st) do \n+\t\t\tprintf(\"%d \", v);\n+\t\tend\n+\t\tif ( i == (stats.n - 1) ) then\n+\t\t\tprintf(\"}\\n\");\n+\t\telse\n+\t\t\tprintf(\"},\");\n+\t\tend\n+\tend\n+end\n+\n+function gui.dumpInfo(func, name, portlist)\n+\tstats = func(portlist);\n+\tprintf(\"%s={ \", name);\n+\tst = stats[0];\n+\tfor k,v in pairs(st) do \n+\t\tprintf(\"%s \", k);\n+\tend\n+\tprintf(\"},\");\n+\tfor i = 0, (stats.n - 1) do\n+\t\tst = stats[i];\n+\t\tprintf(\"%d={ \", i);\n+\t\tfor k,v in pairs(st) do \n+\t\t\tprintf(\"%s \", v);\n+\t\tend\n+\t\tif ( i == (stats.n - 1) ) then\n+\t\t\tprintf(\"}\\n\");\n+\t\telse\n+\t\t\tprintf(\"},\");\n+\t\tend\n+\tend\n+end\n+\n+function gui.getPktStats(portlist)\n+\tgui.dumpStats(pktgen.pktStats, \"pktStats\", portlist)\n+end\n+\n+function gui.getPortStats(portlist)\n+\tgui.dumpStats(pktgen.portStats, \"portStats\", portlist)\n+end\n+\n+function gui.getRateStats(portlist)\n+\tgui.dumpStats(pktgen.rateStats, \"rateStats\", portlist)\n+end\n+\n+function gui.getPortSizes(portlist)\n+\tgui.dumpStats(pktgen.portSizes, \"portSizes\", portlist)\n+end\n+\n+function gui.getPortInfo(portlist)\n+\tgui.dumpInfo(pktgen.portInfo, \"portInfo\", portlist)\n+end\n+\n+function gui.getLinkState(portlist)\n+\tlinks = pktgen.linkState(portlist);\n+\tprintf(\"linkState={ \");\n+\tfor k,v in pairs(links) do\n+\t\tif ( k == \"n\" ) then break; end\n+\t\tprintf(\"%d=%s \", k, v);\n+\tend\n+\tprintf(\"}\\n\");\n+end\n+\n+function gui.getPortFlags(portlist)\n+\tlinks = pktgen.portFlags(portlist);\n+\tprintf(\"portFlags={ \");\n+\tfor k,v in pairs(links) do\n+\t\tif ( k == \"n\" ) then break; end\n+\t\tprintf(\"%d=%s \", k, v);\n+\tend\n+\tprintf(\"}\\n\");\n+end\n+\n+function gui.startTransmitting(portlist)\n+\t-- gui.msg(\"=== Start Transmit %s\", portlist);\n+\tpktgen.start(portlist);\n+end\n+\n+function gui.stopTransmitting(portlist)\n+\t-- gui.msg(\"=== Stop Transmit %s\", portlist);\n+\tpktgen.stop(portlist);\n+end\n+\n+function gui.clearAllStats()\n+\tpktgen.clear(\"all\");\n+end\n+\n+function gui.noop()\n+\t-- Do nothing\n+end\ndiff --git a/dep/tgen/tgen b/dep/tgen/tgen\nnew file mode 100755\nindex 0000000000000000000000000000000000000000..63fe0f631ef4602e7a210377c0dfa121cb478887\nGIT binary patch\nliteral 300314\n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\nRD7idIs}7jZ<Vuz?{vYHsZixT@\n\nliteral 0\nHcmV?d00001\n\ndiff --git a/framework/project_dpdk.py b/framework/project_dpdk.py\nindex c20aa044..31f0f68a 100644\n--- a/framework/project_dpdk.py\n+++ b/framework/project_dpdk.py\n@@ -4,6 +4,7 @@\n \n import os\n import re\n+import subprocess\n \n from .crb import Crb\n from .dut import Dut\n@@ -566,6 +567,8 @@ class DPDKtester(Tester):\n                 else:\n                     self.set_huge_pages(1024)\n \n+            subprocess.getoutput(\"cd dep/tclclient && tar czvf ../tclclient.tgz *  && cd - \")\n+            subprocess.getoutput(\"cd dep/tgen && tar czvf ../tgen.tgz *  && cd - \")\n             self.session.copy_file_to(\"dep/tgen.tgz\")\n             self.session.copy_file_to(\"dep/tclclient.tgz\")\n             # unpack tgen\n",
    "prefixes": []
}