/* Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef TransporterDefinitions_H #define TransporterDefinitions_H #include #include #include /** * The maximum number of transporters allowed * A maximum is needed to be able to allocate the array of transporters */ const int MAX_NTRANSPORTERS = 256; /** * The sendbuffer limit after which the contents of the buffer is sent */ const int TCP_SEND_LIMIT = 64000; enum SendStatus { SEND_OK = 0, SEND_BLOCKED = 1, SEND_DISCONNECTED = 2, SEND_BUFFER_FULL = 3, SEND_MESSAGE_TOO_BIG = 4, SEND_UNKNOWN_NODE = 5 }; enum TransporterType { tt_TCP_TRANSPORTER = 1, tt_SCI_TRANSPORTER = 2, tt_SHM_TRANSPORTER = 3 }; enum SB_LevelType { SB_NO_RISK_LEVEL = 0, SB_LOW_LEVEL = 1, SB_MEDIUM_LEVEL = 2, SB_HIGH_LEVEL = 3, SB_RISK_LEVEL = 4, SB_CRITICAL_LEVEL = 5 }; /** * Maximum message sizes * --------------------- * Maximum byte sizes for sent and received messages. * The maximum send message size is temporarily smaller than * the maximum receive message size to support online * upgrade * Maximum received size increased in : * mysql-5.1-telco-6.3.18 from 16516 bytes to 32768 * Maximum send size increased in : * mysql-5.1-telco-6.4.0 from 16516 bytes to 32768 * * Therefore mysql-5.1-telco-6.4.0 cannot safely communicate * with nodes at versions lower than mysql-5.1-telco-6.3.18 * */ const Uint32 MAX_RECV_MESSAGE_BYTESIZE = 32768; const Uint32 MAX_SEND_MESSAGE_BYTESIZE = 32768; /** * TransporterConfiguration * * used for setting up a transporter. the union member specific is for * information specific to a transporter type. */ struct TransporterConfiguration { Int32 s_port; // negative port number implies dynamic port const char *remoteHostName; const char *localHostName; NodeId remoteNodeId; NodeId localNodeId; NodeId serverNodeId; bool checksum; bool signalId; bool isMgmConnection; // is a mgm connection, requires transforming TransporterType type; union { // Transporter specific configuration information struct { Uint32 sendBufferSize; // Size of SendBuffer of priority B Uint32 maxReceiveSize; // Maximum no of bytes to receive Uint32 tcpSndBufSize; Uint32 tcpRcvBufSize; Uint32 tcpMaxsegSize; Uint32 tcpOverloadLimit; } tcp; struct { Uint32 shmKey; Uint32 shmSize; int signum; } shm; struct { Uint32 sendLimit; // Packet size Uint32 bufferSize; // Buffer size Uint32 nLocalAdapters; // 1 or 2, the number of adapters on local host Uint32 remoteSciNodeId0; // SCInodeId for adapter 1 Uint32 remoteSciNodeId1; // SCInodeId for adapter 2 } sci; }; }; struct SignalHeader { Uint32 theVerId_signalNumber; // 4 bit ver id - 16 bit gsn Uint32 theReceiversBlockNumber; // Only 16 bit blocknum Uint32 theSendersBlockRef; Uint32 theLength; Uint32 theSendersSignalId; Uint32 theSignalId; Uint16 theTrace; Uint8 m_noOfSections; Uint8 m_fragmentInfo; }; /** 7x4 = 28 Bytes */ class NdbOut & operator <<(class NdbOut & out, SignalHeader & sh); #define TE_DO_DISCONNECT 0x8000 enum TransporterError { TE_NO_ERROR = 0, /** * TE_ERROR_CLOSING_SOCKET * * Error found during closing of socket * * Recommended behavior: Ignore */ TE_ERROR_CLOSING_SOCKET = 0x1, /** * TE_ERROR_IN_SELECT_BEFORE_ACCEPT * * Error found during accept (just before) * The transporter will retry. * * Recommended behavior: Ignore * (or possible do setPerformState(PerformDisconnect) */ TE_ERROR_IN_SELECT_BEFORE_ACCEPT = 0x2, /** * TE_INVALID_MESSAGE_LENGTH * * Error found in message (message length) * * Recommended behavior: setPerformState(PerformDisconnect) */ TE_INVALID_MESSAGE_LENGTH = 0x3 | TE_DO_DISCONNECT, /** * TE_INVALID_CHECKSUM * * Error found in message (checksum) * * Recommended behavior: setPerformState(PerformDisonnect) */ TE_INVALID_CHECKSUM = 0x4 | TE_DO_DISCONNECT, /** * TE_COULD_NOT_CREATE_SOCKET * * Error found while creating socket * * Recommended behavior: setPerformState(PerformDisonnect) */ TE_COULD_NOT_CREATE_SOCKET = 0x5, /** * TE_COULD_NOT_BIND_SOCKET * * Error found while binding server socket * * Recommended behavior: setPerformState(PerformDisonnect) */ TE_COULD_NOT_BIND_SOCKET = 0x6, /** * TE_LISTEN_FAILED * * Error found while listening to server socket * * Recommended behavior: setPerformState(PerformDisonnect) */ TE_LISTEN_FAILED = 0x7, /** * TE_ACCEPT_RETURN_ERROR * * Error found during accept * The transporter will retry. * * Recommended behavior: Ignore * (or possible do setPerformState(PerformDisconnect) */ TE_ACCEPT_RETURN_ERROR = 0x8 /** * TE_SHM_DISCONNECT * * The remote node has disconnected * * Recommended behavior: setPerformState(PerformDisonnect) */ ,TE_SHM_DISCONNECT = 0xb | TE_DO_DISCONNECT /** * TE_SHM_IPC_STAT * * Unable to check shm segment * probably because remote node * has disconnected and removed it * * Recommended behavior: setPerformState(PerformDisonnect) */ ,TE_SHM_IPC_STAT = 0xc | TE_DO_DISCONNECT /** * Permanent error */ ,TE_SHM_IPC_PERMANENT = 0x21 /** * TE_SHM_UNABLE_TO_CREATE_SEGMENT * * Unable to create shm segment * probably os something error * * Recommended behavior: setPerformState(PerformDisonnect) */ ,TE_SHM_UNABLE_TO_CREATE_SEGMENT = 0xd /** * TE_SHM_UNABLE_TO_ATTACH_SEGMENT * * Unable to attach shm segment * probably invalid group / user * * Recommended behavior: setPerformState(PerformDisonnect) */ ,TE_SHM_UNABLE_TO_ATTACH_SEGMENT = 0xe /** * TE_SHM_UNABLE_TO_REMOVE_SEGMENT * * Unable to remove shm segment * * Recommended behavior: Ignore (not much to do) * Print warning to logfile */ ,TE_SHM_UNABLE_TO_REMOVE_SEGMENT = 0xf ,TE_TOO_SMALL_SIGID = 0x10 ,TE_TOO_LARGE_SIGID = 0x11 ,TE_WAIT_STACK_FULL = 0x12 | TE_DO_DISCONNECT ,TE_RECEIVE_BUFFER_FULL = 0x13 | TE_DO_DISCONNECT /** * TE_SIGNAL_LOST_SEND_BUFFER_FULL * * Send buffer is full, and trying to force send fails * a signal is dropped!! very bad very bad * */ ,TE_SIGNAL_LOST_SEND_BUFFER_FULL = 0x14 | TE_DO_DISCONNECT /** * TE_SIGNAL_LOST * * Send failed for unknown reason * a signal is dropped!! very bad very bad * */ ,TE_SIGNAL_LOST = 0x15 /** * TE_SEND_BUFFER_FULL * * The send buffer was full, but sleeping for a while solved it */ ,TE_SEND_BUFFER_FULL = 0x16 /** * TE_SCI_UNABLE_TO_CLOSE_CHANNEL * * Unable to close the sci channel and the resources allocated by * the sisci api. */ ,TE_SCI_UNABLE_TO_CLOSE_CHANNEL = 0x22 /** * TE_SCI_LINK_ERROR * * There is no link from this node to the switch. * No point in continuing. Must check the connections. * Recommended behavior: setPerformState(PerformDisonnect) */ ,TE_SCI_LINK_ERROR = 0x0017 /** * TE_SCI_UNABLE_TO_START_SEQUENCE * * Could not start a sequence, because system resources * are exumed or no sequence has been created. * Recommended behavior: setPerformState(PerformDisonnect) */ ,TE_SCI_UNABLE_TO_START_SEQUENCE = 0x18 | TE_DO_DISCONNECT /** * TE_SCI_UNABLE_TO_REMOVE_SEQUENCE * * Could not remove a sequence */ ,TE_SCI_UNABLE_TO_REMOVE_SEQUENCE = 0x19 | TE_DO_DISCONNECT /** * TE_SCI_UNABLE_TO_CREATE_SEQUENCE * * Could not create a sequence, because system resources are * exempted. Must reboot. * Recommended behavior: setPerformState(PerformDisonnect) */ ,TE_SCI_UNABLE_TO_CREATE_SEQUENCE = 0x1a | TE_DO_DISCONNECT /** * TE_SCI_UNRECOVERABLE_DATA_TFX_ERROR * * Tried to send data on redundant link but failed. * Recommended behavior: setPerformState(PerformDisonnect) */ ,TE_SCI_UNRECOVERABLE_DATA_TFX_ERROR = 0x1b | TE_DO_DISCONNECT /** * TE_SCI_CANNOT_INIT_LOCALSEGMENT * * Cannot initialize local segment. A whole lot of things has * gone wrong (no system resources). Must reboot. * Recommended behavior: setPerformState(PerformDisonnect) */ ,TE_SCI_CANNOT_INIT_LOCALSEGMENT = 0x1c | TE_DO_DISCONNECT /** * TE_SCI_CANNOT_MAP_REMOTESEGMENT * * Cannot map remote segment. No system resources are left. * Must reboot system. * Recommended behavior: setPerformState(PerformDisonnect) */ ,TE_SCI_CANNOT_MAP_REMOTESEGMENT = 0x1d | TE_DO_DISCONNECT /** * TE_SCI_UNABLE_TO_UNMAP_SEGMENT * * Cannot free the resources used by this segment (step 1). * Recommended behavior: setPerformState(PerformDisonnect) */ ,TE_SCI_UNABLE_TO_UNMAP_SEGMENT = 0x1e | TE_DO_DISCONNECT /** * TE_SCI_UNABLE_TO_REMOVE_SEGMENT * * Cannot free the resources used by this segment (step 2). * Cannot guarantee that enough resources exist for NDB * to map more segment * Recommended behavior: setPerformState(PerformDisonnect) */ ,TE_SCI_UNABLE_TO_REMOVE_SEGMENT = 0x1f | TE_DO_DISCONNECT /** * TE_SCI_UNABLE_TO_DISCONNECT_SEGMENT * * Cannot disconnect from a remote segment. * Recommended behavior: setPerformState(PerformDisonnect) */ ,TE_SCI_UNABLE_TO_DISCONNECT_SEGMENT = 0x20 | TE_DO_DISCONNECT /* Used 0x21 */ /* Used 0x22 */ /** * TE_UNSUPPORTED_BYTE_ORDER * * Error found in message (byte order) * * Recommended behavior: setPerformState(PerformDisonnect) */ , TE_UNSUPPORTED_BYTE_ORDER = 0x23 | TE_DO_DISCONNECT /** * TE_COMPRESSED_UNSUPPORTED * * Error found in message (compressed flag) * * Recommended behavior: setPerformState(PerformDisonnect) */ , TE_COMPRESSED_UNSUPPORTED = 0x24 | TE_DO_DISCONNECT }; #endif // Define of TransporterDefinitions_H