    Copyright (c)  2004  Mark D. Collier
    Permission is granted to copy, distribute and/or modify this document
    under the terms of the GNU Free Documentation License, Version 1.2
    or any later version published by the Free Software Foundation;
    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
    A copy of the license is included in the section entitled "GNU
    Free Documentation License".

Author: Mark D. Collier - 12/01/2006   v1.1
        Mark D. Collier - 04/26/2004   v1.0
        www.securelogix.com - mark.collier@securelogix.com
        www.hackingexposedvoip.com

This tool was produced with honorable intentions, which are:

  o To aid owners of VoIP infrastructure to test, audit, and uncover security
    vulnerabilities in their deployments.

  o To aid 3rd parties to test, audit, and uncover security vulnerabilities
    in the VoIP infrastructure of owners of said infrastructure who contract
    with or otherwise expressly approve said 3rd parties to assess said
    VoIP infrastructure.

  o To aid producers of VoIP infrastructure to test, audit, and uncover security
    vulnerabilities in the VoIP hardware/software/systems they produce.

  o For use in collective educational endeavors or use by individuals for
    their own intellectual curiosity, amusement, or aggrandizement - absent
    nefarious intent.
   
Unlawful use of this tool is strictly prohibited.

In addition to this file, please also see: SCENARIOS, CAVEATS, and RESEARCH


Left column: * = implemented, + = partially implemented

    ---------------------
    Control Port Language
    ---------------------
    
+   Help
        Shows this text.
    
*   Connection [<Id>]
        Switches context to the connection specified, if no user is already
        connected to that id. You must be connected to a specific connection id
        before you can create objects and issue many other commands. The
        connection ids allow you to disconnect from and reconnect to the
        control port while leaving all your objects active. If the connection
        command is given with no parameters, it will return the current
        connection id.
    
*   Status
        Reports the general status of the call generator. The report will be in
        the following format:
    
            Begin General Status
            Uptime: <days> <hours>:<minutes>:<seconds>
            Connection: <id>
            Total Objects: <number>
            Total <ObjectType> Objects: <number>
            Begin Connections Report
            ID   OBJECTS  |  ID   OBJECTS  |  ID   OBJECTS  |  ID   OBJECTS
            00 *      12  |  01-*-     38  |  02      1407  |  03 *
            04            |  05            |  06            |  07
            08            |  09            |  0A       183  |  0B
            0C            |  0D            |  0E            |  0F
             *  Has a user connected currently
            -*- The connection currently in use on this socket
            End Connections Report
            End General Status
    
        Total <ObjectType> Objects will be repeated for each object type that
        has existing objects. The object types are the following: SipUdpPort,
        SipDispatcher, SipRegistrar, SipEndPoint, SipProxyEndPoint,
        SipCall, Script, Timer, and Trigger.
    
+   Status of <ObjectName>
        Reports the status of the named object. The status will reported
        depending upon the object's type. Here follow the report formats:
    
*           Begin Status of SipUdpPort <ObjectName>
            Uptime: <days> <hours>:<minutes>:<seconds>
            IP: <number>.<number>.<number>.<number>
            Port: <number>
            SIP Messages Sent: <number>
            SIP Messages Received: <number>
            SIP Messages Queued to Send: <number>
            Responding Sources Queued to Send: <number>
            Requesting Sources Queued to Send: <number>
            Retransmitted Sources Queued to Send: <number>
            SIP Messages Queued to Dispatch: <number>
            Most SIP Messages Queued to Send: <number>
            Most Responding Sources Queued to Send: <number>
            Most Requesting Sources Queued to Send: <number>
            Most Retransmitting Sources Queued to Send: <number>
            Most SIP Messages Queued to Dispatch: <number>
            SIP Bytes Sent: <number>
            SIP Bytes Received: <number>
            End Status of SipUdpPort <ObjectName>
    
            Begin Status of SipDispatcher <ObjectName>
            Uptime: <days> <hours>:<minutes>:<seconds>
            SIP UDP Port: <sipUdpPortName>
            SIP Messages Sent: <number>
            SIP Messages Received: <number>
            SIP Messages Dispatched: <number>
            SIP Messages Not Dispatched: <number>
            SIP Bytes Sent: <number>
            SIP Bytes Received: <number>
            SIP Bytes Dispatched: <number>
            SIP Bytes Not Dispatched: <number>
            Registered End Points: <number>
            Registered Proxy End Points: <number>
            Registered Calls: <number>
            End Status of SipDispatcher <ObjectName>
    
            Begin Status of SipRegistrarConnector <ObjectName>
            Uptime: <days> <hours>:<minutes>:<seconds>
            IP: <number>.<number>.<number>.<number>
            Port: <number>
            Domain: <domain>
            SIP Messages Sent: <number>
            SIP Messages Resent: <number>
            SIP Messages Received: <number>
            SIP Messages Rereceived: <number>
            SIP Bytes Sent: <number>
            SIP Bytes Resent: <number>
            SIP Bytes Received: <number>
            SIP Bytes Rereceived: <number>
            Registered End Points: <number>
            Registered Proxy End Points: <number>
            End Status of SipRegistrarConnector <ObjectName>
    
            Begin Status of SipEndPoint <ObjectName>
            Uptime: <days> <hours>:<minutes>:<seconds>
            AKA: <text>
            SIP Dispatcher: <sipDispatcherName>
            SIP Registrar Connector: <sipRegistrarConnectorName>
            SIP Proxy Connector: <sipProxyName>
            SIP Messages Sent: <number>
            SIP Messages Resent: <number>
            SIP Messages Received: <number>
            SIP Messages Rereceived: <number>
            SIP Bytes Sent: <number>
            SIP Bytes Resent: <number>
            SIP Bytes Received: <number>
            SIP Bytes Rereceived: <number>
            End Status of SipEndPoint <ObjectName>
    
            Begin Status of SipProxyEndPoint <ObjectName>
            Uptime: <days> <hours>:<minutes>:<seconds>
            AKA: <text>
            SIP Dispatcher: <sipDispatcherName>
            SIP Registrar Connector: <sipRegistrarConnectorName>
            SIP Proxy Connector: <sipProxyName>
            SIP Messages Sent: <number>
            SIP Messages Resent: <number>
            SIP Messages Received: <number>
            SIP Messages Rereceived: <number>
            SIP Bytes Sent: <number>
            SIP Bytes Resent: <number>
            SIP Bytes Received: <number>
            SIP Bytes Rereceived: <number>
            End Status of SipProxyEndPoint <ObjectName>
    
            Begin Status of SipCall <ObjectName>
            Uptime: <days> <hours>:<minutes>:<seconds>
            Ringing Time: <days> <hours>:<minutes>:<seconds>
            Call Time: <days> <hours>:<minutes>:<seconds>
            SIP End Point: <sipEndPointName>
            To Named URI: <namedUri>
            To AKA: <text>
            SIP Messages Sent: <number>
            SIP Messages Resent: <number>
            SIP Messages Received: <number>
            SIP Messages Rereceived: <number>
            RTP Local IP: <number>.<number>.<number>.<number>
            RTP Local Port: <number>
            RTP Remote IP: <number>.<number>.<number>.<number>
            RTP Remote Port: <number>
            RTP Type: <number> <name> <rate> <channels>
            RTP Packets Sent: <number>
            RTP Packets Received: <number>
            RTP Bytes Sent: <number>
            RTP Bytes Received: <number>
            RTCP Packets Sent: <number>
            RTCP Packets Received: <number>
            RTCP Bytes Sent: <number>
            RTCP Bytes Received: <number>
            RTCP Incoming Missed RTP Packets: <number>
            RTCP Outgoing Missed RTP Packets: <number>
            RTCP Incoming RTP Jitter: <number>
            RTCP Outgoing RTP Jitter: <number>
            End Status of SipCall <ObjectName>
    
                Note that RTP Type, RTP Packets Sent, RTP Packets Received,
                RTP Bytes Sent, and RTP Bytes Received will be repeated for
                each RTP type in use. Also note that RTP Local IP, RTP Local
                Port, RTP Remote IP, RTP Remote Port, and a set of previously
                mentioned values will be repeated for each RTP stream of a
                call.
    
            Begin Status of Script <ObjectName>
            Uptime: <days> <hours>:<minutes>:<seconds>
            Firings: <number>
            End Status of Script <ObjectName>
    
            Begin Status of Timer <ObjectName>
            Uptime: <days> <hours>:<minutes>:<seconds>
            Script: <scriptName>
            When: every|in <number> seconds
            Firings: <number>
            End Status of Timer <ObjectName>
    
            Begin Status of Timer <ObjectName>
            Uptime: <days> <hours>:<minutes>:<seconds>
            Script: <scriptName>
            When: <hour>:<minute> [every day]
            Firings: <number>
            End Status of Timer <ObjectName>
    
            Begin Status of Trigger <ObjectName>
            Uptime: <days> <hours>:<minutes>:<seconds>
            Script: <scriptName>
            Based On: message to|from <objectName> containing <searchText>
            Firings: <number>
            End Status of Trigger <ObjectName>
    
    
    Status of All [<ObjectType>]
        Reports the status of all objects. If <ObjectType> is included, only
        all objects of that type are reported. <ObjectType> may be one of the
        following: SipUdpPorts, SipDispatchers, SipRegistrarConnectors,
        SipProxies, SipEndPoints, SipProxyEndPoints, SipCalls, Scripts, Timers,
        or Triggers. The report formats are defined above.
    
    Summary of <ObjectType>
        Shows summary data about all the objects of type <ObjectType> for the
        connection.
    
            Begin Summary of SipUdpPort
            Total Objects: <number>
            End Summary of SipUdpPort
    
            Begin Summary of SipUdpPort
            Total Objects: <number>
            End Summary of SipUdpPort
    
            Begin Summary of SipDispatcher
            Total Objects: <number>
            End Summary of SipDispatcher
    
            Begin Summary of SipEndPoint
            Total Objects: <number>
            End Summary of SipEndPoint
    
            Begin Summary of SipProxyEndPoint
            Total Objects: <number>
            End Summary of SipProxyEndPoint
    
*           Begin Summary of SipCall
            Total Objects: <number>
            Total Active Objects: <number>
            Total Inactive Objects: <number>
            Total Objects in State of <StateName>: <number>
            End Summary of SipCall
    
                Total Objects in State of <StateName> will be shown for each
                call state that currently has calls in that state. The possible
                states are: Invalid, Timer Fire, Created, Got Message, Send
                Invite, Resend Invite, Sent Invite, Invite Got Provisional,
                Invite Got Provisional Wait, Got Ok For Invite, Send Ack For
                Invite, Send Trying For Invite, Sent Trying For Invite, Send
                Ringing, Sent Ringing, Send Ok For Invite, Resend Ok For
                Invite, Sent Ok For Invite, Established, Send Bye, Resend Bye,
                Sent Bye, Got Ok For Bye, Got Bye, Send Ok For Bye, Terminate,
                Terminated, and Unknown.
    
*   Create SipUdpPort <Name> [Using <IP>:<Port>]
        Creates a new SIP UDP port with the given IP address and UDP port for
        sending and receiving messages. The default IP address will be all
        local IP addresses and port will be 5060.
    
    Create SipTcpPort <Name> [Using <IP>:<Port>]
        Creates a new SIP TCP port with the given IP address and TCP port for
        sending and receiving messages. The default IP address will be all
        local IP addresses and port will be 5060.
    
+   Create SipDispatcher <Name> [Using UDP Port <SipUdpPortName>]
                                [Using TCP Port <SipTcpPortName>]
        Creates a new dispatcher that will send and receive messages using the
        named SIP UDP port and SIP TCP port. If no SIP UDP port is named, the
        last created SIP UDP port will be used. If no SIP TCP port is named, no
        SIP TCP port will be used.
    
*   Create RtpHandler <Name>
        Creates a handler for RTP/RTCP streams.

*   Create SipRegistrarConnector <Name> [Using Dispatcher <SipDispatcherName>]
                                        to <IP>:<Port> With the Domain <Domain>
        Creates a new SIP registrar connection definition for use with future
        SIP end points. The <IP> and <Port> indicate how to contact the
        registrar, and the <Domain> is the domain to use when registering. If
        the dispatcher is not named, the last created dispatcher will be used.
    
    Create SipProxyConnector <Name> at <IP>:<Port>
        Creates a new SIP proxy connection definition for use with future SIP
        end points.
    
+   Create SipEndPoint <Name> [AKA <TextName>]
                              [With RtpHandler <RtpHandlerName>]
                              [With Dispatcher <SipDispatcherName>]
                              [With RegistrarConnector
                                                    <SipRegistrarConnectorName>]
                              [With ProxyConnector      <SipProxyConnectorName>     ]
        Creates a new SIP end point for receiving and placing calls to and from
        the object name. Optionally, the end point can be given a text name to
        use in SIP named URIs. Also optionally, a named rtp handler,
        dispatcher, registrar connector, and proxy connector may be used. The
        registrar and proxy names may be "none", in which case any existing
        registrar connectors or proxy connectors are ignored. If the optional
        names are omitted, the last objects of those types created will be
        used.
    
+   Create SipProxyEndPoint <Name> [AKA <TextName>] to <NamedUri>
                              [With Dispatcher <SipDispatcherName>]
                              [With RegistrarConnector
                                                    <SipRegistrarConnectorName>]
                              [With ProxyConnector <SipProxyConnectorName>]
        Creates a new SIP proxy end point for proxying transactions to 
        the object name. Optionally, the end point can be given a text name to
        use in SIP named URIs. Also optionally, a named dispatcher, registrar
        connector, and next proxy connector may be used. The registrar and
        proxy names may be "none", in which case any existing registrar
        connectors or proxy connectors are ignored. If the optional names are
        omitted, the last objects of those types created will be used.
    
+   Create SipCall <Name> Using End Point <SipEndPointName> to <NamedUri>
                          [AKA <TextName>]
        Creates a new SIP call object for calling the named end point to the
        named URI. Optionally, the remote URI can be given a text name to be
        used in SIP named URIs. To actually establish the call, issue the newly
        created call object the "connect" command. To end the call, issue the
        "disconnect" command to the call object, or use the delete command with
        the object name. Calls cannot be reused. To place additional calls,
        create another call object. This restriction is to keep the call
        reporting simpler with the status command.

+   Create SipRegistrar <Name> <Domain> [With Dispatcher <SipDispatcherName>]

        Creates a new SIP registrar server for accepting and resolving
        registrations for the given <Domain>. As registrations are made,
        SipProxyEndPoint will be made automatically.
    
*   Create Script <Name>
        Creates a new script of control commands that can be used by other
        commands. The next line sent after this command specifies the marker
        used to signify the end of the script. The marker should be sent a
        second time once all of the script text has been transmitted. Within
        the script text, replaceable parameters may be used. The parameters are
        named $1 through $9. If a parameter does not exist upon execution, it
        will be replaced with NULL.
    
    Create Timer <Name> Firing Script <ScriptName> Every|in <Number> Seconds
        Creates a new timer that will fire the named script. If the keyword
        "in" is used, the timer will fire once after the specified number of
        seconds. If the keyword "every" is used, the timer will reset itself to
        fire again after each firing. To cancel a timer, use the delete command
        with the timer's name.
    
    Create Timer <Name> Firing Script <ScriptName>
                        Every|at <Number> Minutes After the Hour
        Creates a new timer that will fire the named script. If the keyword
        "at" is used, the timer will fire once the specified number of minutes
        after the hour. If the keyword "every" is used, the timer will reset
        itself to fire again after each firing. To cancel a timer, use the
        delete command with the timer's name.
    
    Create Timer <Name> Firing Script <scriptName> [<Hour>:]<Minute> [Every Day]
        Creates a new timer that will fire the named script. If the key phrase
        "every day" is omitted, the timer will only fire once the specified
        time occurs. If the key phrase "every day" is used, the timer will
        reset itself to fire each day after day. To cancel a timer, use the
        delete command with the timer's name.
    
    Create Trigger <Name> Firing Script <ScriptName>
                          Based on Messages to|From <ObjectName>
                          Containing <SearchText>
        Sets up a new trigger that will fire the named script when the search
        text matches within a message to or from the named object. If
        <objectName> is "all", all messages are scanned. Also, dispatcher names
        can be suffixed with ":default" which will scan just those packets
        bound for or from the dispatcher that could not be dispatched to other
        objects. When triggered, the trigger script will be run just as if it
        had been received on the socket directly.
    
*   Delete <ObjectName> [<optional arguments>]
        Deletes the named object. If <ObjectName> is "all", all objects are
        deleted. The optional arguments are listed below for each object type:

        SipCall: [if terminated]

            The optional "if terminated" will only delete the call if the call
            is currently in the "terminated" state.
    
    Measuring Starts
        Starts taking measurements that will be reported when measuring stops.
    
    Measuring Report
        Outputs an intermediate measurement report as if the "measuring stops"
        command had been issued, but continues measuring. See the "measuring
        stops" command for the report format.
    
    Measuring Stops
        Stops taking measurements and outputs the results. Note that these are
        overall system results for all objects. For more specific results, use
        the various "status" commands. The measurement report will be in the
        following format:

            Begin Measurements
            Uptime: <days> <hours>:<minutes>:<seconds>
            SIP Messages Sent: <number>
            SIP Messages Received: <number>
            SIP Messages Dispatched: <number>
            SIP Messages Not Dispatched: <number>
            SIP Bytes Sent: <number>
            SIP Bytes Received: <number>
            SIP Bytes Dispatched: <number>
            SIP Bytes Not Dispatched: <number>
            Ringing Time: <days> <hours>:<minutes>:<seconds>
            Call Time: <days> <hours>:<minutes>:<seconds>
            RTP Packets Sent: <number>
            RTP Packets Received: <number>
            RTP Bytes Sent: <number>
            RTP Bytes Received: <number>
            RTCP Packets Sent: <number>
            RTCP Packets Received: <number>
            RTCP Bytes Sent: <number>
            RTCP Bytes Received: <number>
            RTCP Incoming Missed RTP Packets: <number>
            RTCP Outgoing Missed RTP Packets: <number>
            RTCP Incoming RTP Jitter: <number>
            RTCP Outgoing RTP Jitter: <number>
            End Measurements
    
*   Execute <ScriptName> [In Background] [Parameters]
        Runs the named script as if were just sent to the socket directly. The
        Parameters given are passed to the script named. The optional "in
        background" can be given to have the script's output suppressed.
    
*   Issue <ObjectName> <CommandText>
        Issues the given command text to the named object. See below for object
        command sets.

+   Issue [With Interval <Microseconds>] All <ObjectType> <CommandText>
        Issues all the objects of the type specified the command given.
        Optionally, "With Interval <Microseconds>" can be specified to space
        the issuing of the command to each object.
    
    List [<ObjectType>]
        Lists the names of created objects. All objects are listed if no object
        type is given. Object type may be one of the following: sipUdpPorts,
        sipDispatchers, rtpHandlers, sipRegistrarConnectors,
        sipProxyConnectors, sipEndPoints, sipProxyEndPoints, sipCalls, scripts,
        timers, or triggers.

+   Sleep <number> [microseconds|milliseconds|seconds|minutes]
        Delays for the amount specified. If none of the unit times are given,
        seconds are assumed.

*   Exit
        Closes the client's socket connection.
    
*   Quit
        Closes the client's socket connection.
    
*   Shutdown
        Deletes all objects for all connections and exits the entire process.
    
    
    ---------------------
    SIP UDP Port Commands
    ---------------------
    
    Issue <sipUdpPortName> delay <number> milliseconds
        Causes incoming and outgoing packets to be delayed on delivery by the
        number of milliseconds given, emulating a more distant (or simply
        slower) network route.
    
    Issue <sipUdpPortName> deactivate
        Causes the sipUdpPort to act as if it has lost network connectivity.
        All incoming and outgoing messages will be discarded.
    
    Issue <sipUdpPortName> activate
        Cancels a previous "deactivate" command, as if the sipUdpPort just
        regained network connectivity. It will again send and receive messages.
    
*   Issue <sipUdpPortName> hold
        Causes the sipUdpPort to hold all outgoing packets. The outgoing
        packets will be queued up to the maximum queue limit.
    
*   Issue <sipUdpPortName> unhold
        Cancels a previous "hold" command, as if the sipUdpPort just regained
        network connectivity. It will again send messages.
    
    
    ---------------------
    SIP TCP Port Commands
    ---------------------
    
    Issue <sipTcpPortName> delay <number> milliseconds
        Causes incoming and outgoing packets to be delayed on delivery by the
        number of milliseconds given, emulating a more distant (or simply
        slower) network route.
    
    
    -----------------------
    SIP Dispatcher Commands
    -----------------------
    
    Issue <sipDispatcherPortName> delay <number> milliseconds
        Causes incoming and outgoing messages to be delayed on delivery by the
        number of milliseconds given, emulating a more distant (or simply
        slower) network route.
    
    Issue <sipDispatcherName> deactivate
        Causes the dispatcher to act as if it has lost connectivity to its SIP
        ports. All incoming and outgoing messages will be discarded.
    
    Issue <sipDispatcherName> activate
        Cancels a previous "deactivate" command, as if the dispatcher just
        regained connectivity to its SIP ports. It will again send and receive
        messages.
    
    Issue <sipDispatcherName> send [udp|tcp]
        Sends a raw SIP message. UDP or TCP may be specified, otherwise UDP
        will be used unless the message is too large. The next line sent
        specifies the marker used to signify the end of the message payload.
        The marker should be sent a second time once all of the message payload
        has been transmitted. The payload will consist of every byte after the
        new line following the first marker up to, but not including the new
        line preceding the second marker. If the second marker's preceding new
        line is also preceded by a carriage return, that too will be excluded
        from the message payload.

*   Issue <sipDispatcherName> Set T1 <milliseconds>
        Sets the T1 value for the SipDispatcher and any new SipEndPoints,
        SipProxyEndPoints, and SipCalls that use the SipDispatcher. The T1
        value is documented in the SIP RFC, but, in short, it controls the
        timing of the first retransmission.

*   Issue <sipDispatcherName> Set T2 <milliseconds>
        Sets the T2 value for the SipDispatcher and any new SipEndPoints,
        SipProxyEndPoints, and SipCalls that use the SipDispatcher. The T2
        value is documented in the SIP RFC, but, in short, it controls the
        longest interval between retransmissions.

*   Issue <sipDispatcherName> Set Retransmissions true|false
        Turns on or off retransmissions for the SipDispatcher and any new
        SipEndPoints, SipProxyEndPoints, and SipCalls that use the
        SipDispatcher.

*   Issue <sipDispatcherName> Set Timeouts true|false
        Turns on or off timeouts for the SipDispatcher and any new
        SipEndPoints, SipProxyEndPoints, and SipCalls that use the
        SipDispatcher. Timeouts, for instance, could cause a call to give up
        and terminate a dialog prematurely.

*   Issue <sipDispatcherName> Set Provisionals true|false
        Turns on or off provisional responses for the SipDispatcher and any new
        SipEndPoints, SipProxyEndPoints, and SipCalls that use the
        SipDispatcher. Provisional responses are responses such as 100 Trying
        and 180 Ringing -- any of the 1xx response codes.
    
    
    ----------------------
    SIP End Point Commands
    ----------------------
    
*   Issue <sipEndPointName> accept calls
                            [after ringing for <number>-<number> seconds]
        Causes the end point to answer any incoming calls. Optionally, the
        range for the number of seconds to remain in ringing mode may be
        specified. By default, the ringing time will be 2-5 seconds.
    
+   Issue <sipEndPointName> Relay Calls to <NamedUri> [AKA <TextName>]
        For each incoming call accepted, an additional outgoing call to the
        <NamedUri> will be made, and the media for the two calls will be
        relayed to and from each other.

+   Issue <sipEndPointName> Tap Calls to <NamedUri> [AKA <TextName>]
        For each incoming call accepted, an additional outgoing call to the
        <NamedUri> will be made, and the media for the first call will be
        copied to the second call.
        
+   Issue <sipEndPointName> insertrtp to <NamedUri> caller/callee
                            <SoundFilePathName>
                            
+   Issue <sipEndPointName> mixrtp to <NamedUri> caller/callee
                            <SoundFilePathName>

    Issue <sipUdpPortName> delay <number> milliseconds
        Causes incoming and outgoing messages to be delayed on delivery by the
        number of milliseconds given, emulating a more distant (or simply
        slower) network route.
    
    Issue <sipEndPointName> no provisional responses
        Turns off sending any automatic provisional responses, such as "Trying"
        or "Ringing".
    
    Issue <sipEndPointName> no media
        Turns off sending any RTP/RTCP packets. The media will be negotiated
        for as if it would be used, and the ports shall be opened to accept any
        incoming data, but that data will be discarded and none will be sent.
    
    Issue <sipEndPointName> no rtcp
        Turns off sending any RTCP packets.
    
    Issue <sipEndPointName> allow codecs: <codecSpecs>
        Lists the codecs that the end point should negotiate with. <codecSpecs>
        is one or more of <codecSpec>. <codecSpec> is in the format:
            <type> [<name>[/<rate>[/<channels>]]]
        Where <type> is the RTP type. If <type> is "-", it is considered a
        dynamic id and <name> is required at a minimum. Otherwise, <name>,
        <rate>, and <channels> are optional.
    
    Issue <sipEndPointName> deactivate
        Causes the end point to act as if it has lost connectivity to its
        dispatcher, registrar, and proxy components. All incoming and outgoing
        messages will be discarded.
    
    Issue <sipEndPointName> activate
        Cancels a previous "deactivate" command, as if the end point just
        regained connectivity to its dispatcher, registrar, and proxy
        components. It will again send and receive messages.
    
    Issue <sipEndPointName> reregister
        Causes the end point to register itself with its registrar, assuming it
        was created with a connector to one.
    
    
    ----------------------------
    SIP Proxy End Point Commands
    ----------------------------
    
    Issue <sipUdpPortName> delay <number> milliseconds
        Causes incoming and outgoing messages to be delayed on delivery by the
        number of milliseconds given, emulating a more distant (or simply
        slower) network route.
    
    Issue <sipProxyEndPointName> no provisional responses
        Turns off sending any automatic provisional responses, such as "Trying"
        or "Ringing".
    
    Issue <sipProxyEndPointName> deactivate
        Causes the end point to act as if it has lost connectivity to its
        dispatcher, registrar, and proxy components. All incoming and outgoing
        messages will be discarded.
    
    Issue <sipProxyEndPointName> activate
        Cancels a previous "deactivate" command, as if the end point just
        regained connectivity to its dispatcher, registrar, and proxy
        components. It will again send and receive messages.
    
    Issue <sipProxyEndPointName> reregister
        Causes the end point to register itself with its registrar, assuming it
        was created with a connector to one.
    
    
    -------------
    Call Commands
    -------------
    
*   Issue <callName> connect
        Tries to connect the call with an invite message.
    
*   Issue <callName> disconnect [if established]
        Disconnects the call with a bye, cancel, or negative response message.
        Once a call has been disconnected, it cannot be reconnected; another
        call must be made instead. The option "if established" will only issue
        the disconnect to the call if the call is currently in an "established"
        state, meaning that the call is connected normally.
    
    Issue <callName> reinvite
        Sends a reinvite to the remote end point to renegotiate the SDP.
    
    Issue <callName> delay <number> milliseconds
        Causes incoming and outgoing messages to be delayed on delivery by the
        number of milliseconds given, emulating a more distant (or simply
        slower) network route.
    
    Issue <callName> deactivate [media]
        Causes the call to act as if it has lost network connectivity. The
        outgoing RTP/RTCP stream will stop. The incoming RTP/RTCP stream and
        SIP will simply be discarded as if they never arrived. If the optional
        parameter "media" is included, only the RTP/RTCP streams will be
        deactivated, the SIP will still be sent and received.
    
    Issue <callName> activate
        Cancels a previous "deactivate" command, as if the call just regained
        network connectivity. It will again send RTP data and respond to
        incoming RTP and SIP data.
    
*   Issue <callName> rtp burst for <seconds> seconds
        Causes the call to send excessive RTP packets for the stated number of
        seconds.
    
*   Issue <callName> rtp jitter for <seconds> seconds
        Causes the call to widely vary the timing of sending RTP packets for
        the stated number of seconds.

*   Issue <callName> rtp uutest
        This command is used to test sending an unnegotiated, unknown codec (in
        this case, type 20). The plan is to remove this command once a more
        full fledged command for sending on-the-fly rtp packets is created.
    
    Issue <callName> rtp skip <number> packets
        Causes the call to skip the given number of RTP packets before
        continuing to send them.
    
    Issue <callName> send rtcp [<number> packets lost] [<number> jitter value]
        Sends an RTCP packet with the given parameters. If a parameter is
        omitted, the current actual value is used.
    
    Issue <callName> send [udp|tcp] <method> request to <sipUri> at <ip:port>
        Sends a "half-cooked" SIP request to the remote end point. UDP or TCP
        may be optionally specified, otherwise UDP is used unless the message
        is too large. The next line sent specifies the marker used to signify
        the end of the request payload. The marker should be sent a second time
        once all of the request payload has been transmitted. The first set of
        non-empty lines will constitute additional header lines for the
        request. The reset of the lines, excluding the first empty line, will
        constitute the request body.
    
    Issue <callName> send [udp|tcp] <statusCode> response to <sipUri>
                                     at <ip:port> [with the reason of <text>]
        Sends a "half-cooked" SIP response to the remote end point. UDP or TCP
        may be optionally specified, otherwise UDP is used unless the message
        is too large. The next line sent specifies the marker used to signify
        the end of the response payload. The marker should be sent a second
        time once all of the response payload has been transmitted. The first
        set of non-empty lines will constitute additional header lines for the
        response. The reset of the lines, excluding the first empty line, will
        constitute the response body.
    

    ---------------------
    SipRegistrar Commands
    ---------------------
    
*   Issue <registrarName> randomize
        Randomizes the resolution of names with contacts. This causes each
        incoming call to be randomly routing to any registered contact, to
        include the proper contact.
    
