Msg File src/transport/contract/TCPCommand.msg

Name Description
TcpCommandCode (enum)

TCP command codes, sent by the application to TCP. These constants should be set as message kind on a message sent to the TCP entity.

TcpStatusInd (enum)

TCP indications, sent by TCP to the application. TCP will set these constants as message kind on messages it sends to the application.

TCPErrorCode (enum)

Currently not in use.

TCPCommand (class)

Control info for TCP connections. This class is to be set as control info (see cMessage::setControlInfo()) on all messages exchanged between TCP and application, in both directions. Some commands and indications (TCP_C_OPEN_xxx, TCP_I_STATUS) use subclasses.

TCPErrorInfo (class)

Currently not in use.

TCPOpenCommand (class)

Control info to be used for active or passive TCP open.

TCPSendCommand (class)

Control info to be used with the SEND command.

TCPConnectInfo (class)

Sent with message kind TCP_I_ESTABLISHED, to let the app know about the local and remote IP address and port.

TCPStatusInfo (class)

Sent with message kind TCP_I_STATUS, in response to command TCP_C_STATUS. For explanation of variables, see RFC 793 or TCPStateVariables in TCPConnection.h.

Source code:

//
// Copyright (C) 2004 Andras Varga
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program; if not, see <http://www.gnu.org/licenses/>.
//


cplusplus {{
#include "IPvXAddress.h"
}}


class noncobject IPvXAddress;

//
// \TCP command codes, sent by the application to TCP. These constants
// should be set as message kind on a message sent to the TCP entity.
//
// @see TCPCommand, TCPOpenCommand, TCP
//
enum TcpCommandCode
{

    TCP_C_OPEN_ACTIVE = 1;   // active open (must carry TCPOpenCommand)
    TCP_C_OPEN_PASSIVE = 2;  // passive open (must carry TCPOpenCommand)
    TCP_C_SEND = 3;          // send data (set on data packet)
    TCP_C_CLOSE = 5;         // "I have no more data to send"
    TCP_C_ABORT = 6;         // abort connection
    TCP_C_STATUS = 7;        // request status info (TCP_I_STATUS) from TCP
}


//
// \TCP indications, sent by TCP to the application. TCP will set these
// constants as message kind on messages it sends to the application.
//
// @see TCPCommand, TCPStatusInfo, TCP
//
enum TcpStatusInd
{

    TCP_I_DATA = 1;              // data packet (set on data packet)
    TCP_I_URGENT_DATA = 2;       // urgent data (set on data packet)
    TCP_I_ESTABLISHED = 3;       // connection established
    TCP_I_PEER_CLOSED = 4;       // FIN received from remote TCP
    TCP_I_CLOSED = 5;            // connection closed normally (via FIN exchange)
    TCP_I_CONNECTION_REFUSED = 6; // connection refused
    TCP_I_CONNECTION_RESET = 7;  // connection reset
    TCP_I_TIMED_OUT = 8;         // conn-estab timer went off, or max retransm. count reached
    TCP_I_STATUS = 9;            // status info (will carry TCPStatusInfo)
}


//
// Currently not in use.
//
enum TCPErrorCode
{

}


//
// Control info for \TCP connections. This class is to be set as control info
// (see cMessage::setControlInfo()) on all messages exchanged between TCP and
// application, in both directions. Some commands and indications
// (TCP_C_OPEN_xxx, TCP_I_STATUS) use subclasses.
//
// connId identifies the connection locally within the application (internally,
// TCP uses the (app gate index, connId) pair to identify the socket).
// connId is to be chosen by the application in the open command.
//
//# TODO explain userId
//
// @see TcpCommandCode, TcpStatusInd, TCPOpenCommand, TCPStatusInfo, TCP
//
class TCPCommand
{
    int connId = -1;   // identifies the socket within the application
    int userId = -1;   // id than can be freely used by the app
}


//
// Currently not in use.
//
class TCPErrorInfo extends TCPCommand
{
    int errorCode enum(TCPErrorCode);
    string messageText;
}


//
// Control info to be used for active or passive TCP open.
//
// localAddr, remoteAddr, localPort, remotePort should be self-explanatory.
// localAddr is optional because TCP can learn it from IP when a packet
// is received from the peer; localPort is optional because TCP supports
// ephemeral ports.
//
// The sendQueueClass, receiveQueueClass and tcpAlgorithmClass fields
// allow per-connection TCP configuration. These fields may contain
// names of classes subclassed from TCPSendQueue, TCPReceiveQueue
// and TCPAlgorithm, respectively. If not set, module parameters with
// similar names are used.
//
// The fork parameter is used with passive open, and controls what happens
// when an incoming connection is received. With fork=true, it emulates
// the Unix accept(2) syscall semantics: a new connection structure
// is created for the connection (with a new connId, see in TCPCommand),
// and the connection structure with the old connId remains listening.
// With fork=false, all the above does not happen: the first connection
// is accepted (with the original connId), and further incoming connections
// will be refused by TCP by sending an RST segment.
//
// @see TcpCommandCode, TCP
//
class TCPOpenCommand extends TCPCommand
{
    IPvXAddress localAddr; // may be left empty
    IPvXAddress remoteAddr;// required for active open
    int localPort = -1;       // required for passive open
    int remotePort = -1;      // required for active open
    bool fork = false;        // used only for passive open
    string sendQueueClass;    // may be left empty
    string receiveQueueClass; // may be left empty
    string tcpAlgorithmClass; // may be left empty
}


//
// Control info to be used with the SEND command.
//
// @see TcpCommandCode, TCP
//
class TCPSendCommand extends TCPCommand
{
}


//
// Sent with message kind TCP_I_ESTABLISHED, to let the app know
// about the local and remote IP address and port.
//
// @see TcpCommandCode, TCP
//
class TCPConnectInfo extends TCPCommand
{
    IPvXAddress localAddr;
    IPvXAddress remoteAddr;
    int localPort;
    int remotePort;
}


//
// Sent with message kind TCP_I_STATUS, in response to command TCP_C_STATUS.
// For explanation of variables, see RFC 793 or TCPStateVariables in
// TCPConnection.h.
//
// @see TcpStatusInd, TcpCommandCode, TCP
//
class TCPStatusInfo extends TCPCommand
{
    int state;
    string stateName;

    IPvXAddress localAddr;
    IPvXAddress remoteAddr;
    int localPort;
    int remotePort;

    unsigned int snd_mss;

    unsigned int snd_una;
    unsigned int snd_nxt;
    unsigned int snd_max;
    unsigned int snd_wnd;
    unsigned int snd_up;
    unsigned int snd_wl1;
    unsigned int snd_wl2;
    unsigned int iss;

    unsigned int rcv_nxt;
    unsigned int rcv_wnd;
    unsigned int rcv_up;
    unsigned int irs;

    bool fin_ack_rcvd;
}