root/usr/src/uts/common/sys/ib/clients/rds/rdsib_protocol.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */
/*
 * Copyright (c) 2005 SilverStorm Technologies, Inc. All rights reserved.
 *
 * This software is available to you under a choice of one of two
 * licenses.  You may choose to be licensed under the terms of the GNU
 * General Public License (GPL) Version 2, available from the file
 * COPYING in the main directory of this source tree, or the
 * OpenIB.org BSD license below:
 *
 *     Redistribution and use in source and binary forms, with or
 *     without modification, are permitted provided that the following
 *     conditions are met:
 *
 *      - Redistributions of source code must retain the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer.
 *
 *      - Redistributions in binary form must reproduce the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer in the documentation and/or other materials
 *        provided with the distribution.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 */
/*
 * Sun elects to include this software in Sun product
 * under the OpenIB BSD license.
 *
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _RDSIB_PROTOCOL_H
#define _RDSIB_PROTOCOL_H

#ifdef __cplusplus
extern "C" {
#endif

#include <netinet/in.h>

#define RDS_VERSION     4

/*
 * RDS Well known service id
 * Format: 0x1h00144Fhhhhhhhh
 *         "00144F" is the Sun OUI
 * 'h' can be any hex-decimal digit.
 */
#define RDS_SERVICE_ID          0x1000144F00000001ULL

/* Max number of nodes supported with the default configuration */
#define RDS_MAX_NODES   8

/* packet size */
#define RDS_USER_DATA_BUFFER_SIZE       4096 /* 4K */

/* per session */
#define RDS_MAX_DATA_RECV_BUFFERS       3000
#define RDS_MAX_DATA_SEND_BUFFERS       2000
#define RDS_MAX_CTRL_RECV_BUFFERS       100
#define RDS_MAX_CTRL_SEND_BUFFERS       50

/* RQ low water mark in percentage. More RWR have to be posted */
#define RDS_DATA_RECV_BUFFER_LWM        90
#define RDS_CTRL_RECV_BUFFER_LWM        50

/*
 * High water mark in percentage of pkts pending on sockets.
 * Incoming traffic should be controlled or stopped for all sockets
 * or some sockets that are above their quota
 */
#define RDS_PENDING_RX_PKTS_HWM 75

/*
 * Only interoperate with homogeneous Solaris (x32, x64, sparcv9).
 */
#if defined(__sparcv9)
#define RDS_THIS_ARCH   1
#elif defined(__amd64)
#define RDS_THIS_ARCH   2
#elif defined(__i386)
#define RDS_THIS_ARCH   3
#else
#error "ISA not supported"
#endif

/*
 * CM Private Data
 *
 * This data is sent with the CM REQ message by the initiater of the
 * RC channel.
 *
 * cm_ip_pvt - ibt_ip_cm_info_t
 * version - RDS version
 * arch - only interoperate with homogeneous Solaris (x32, x64, sparcv9).
 * eptype - RDS_EP_TYPE_CTRL or RDS_EP_TYPE_DATA
 * failover - flag to indicate failover.
 * last_bufid - used during failover, indicates the last buffer the remote
 *     received.
 * user_buffer_size - Packet size on the sending node. This is also the size
 *     of the SGL buffer used in the send and receive WRs. This should be
 *     same size on the both active and passive nodes.
 * ack_rkey - RKEY for the RDMA acknowledgement buffer.
 * ack_addr - Registered MR address to receive RDMA acknowledgement.
 */
typedef struct rds_cm_private_data_s {
        uint8_t         cmp_ip_pvt[IBT_IP_HDR_PRIV_DATA_SZ];
        uint8_t         cmp_version;
        uint8_t         cmp_arch;
        uint8_t         cmp_eptype;
        uint8_t         cmp_failover;
        uintptr_t       cmp_last_bufid;
        uint32_t        cmp_user_buffer_size;
        ibt_rkey_t      cmp_ack_rkey;
        uintptr_t       cmp_ack_addr;
} rds_cm_private_data_t;

/*
 * Data Header
 * This header is transmitted with every WR.
 *
 * bufid - Ponter to the send buffer that is used to send this packet.
 * datalen - Number of bytes of data (not including the header)
 * npkts - number of remaining pkts(including this one) for the message.
 *         It is set to 1 for single packet messages.
 * psn - Packet sequence number(starts at 0). Zero for single packet messages.
 * sendport - Port number of the sending socket
 * recvport - Port number of the receiving socket
 */
typedef struct rds_data_hdr_s {
        uintptr_t               dh_bufid;
        uint32_t                dh_datalen;
        uint32_t                dh_npkts;
        uint32_t                dh_psn;
        in_port_t               dh_sendport;
        in_port_t               dh_recvport;
} rds_data_hdr_t;

#define RDS_DATA_HDR_SZ         sizeof (rds_data_hdr_t)

/*
 * List of control commands sent on a session:
 *
 * STALL: This command is sent to inform remote RDS that a port is stalled.
 *        Always sent on all existing sessions.
 * UNSTALL: This command is sent to inform remote RDS that a port is unstalled.
 *        Always sent on all existing sessions.
 * STALL_PORTS: Inform remote RDS that all local ports are stalled.
 * UNSTALL_PORTS: Inform remote RDS that all local ports are unstalled.
 * HEARTBEAT: Sent to check if the connection is still alive
 */
#define RDS_CTRL_CODE_STALL             1
#define RDS_CTRL_CODE_UNSTALL           2
#define RDS_CTRL_CODE_STALL_PORTS       3
#define RDS_CTRL_CODE_UNSTALL_PORTS     4
#define RDS_CTRL_CODE_HEARTBEAT         5
#define RDS_CTRL_CODE_CLOSE_SESSION     6

/*
 * RDS ctrl packet
 *
 * port - Socket to be stalled/unstalled
 * code - STALL/UNSTALL (other codes are currently not used)
 */

typedef struct rds_ctrl_pkt_s {
        uint16_t        rcp_port;
        uint8_t         rcp_code;
} rds_ctrl_pkt_t;

#define RDS_CTRLPKT_SIZE        sizeof (rds_ctrl_pkt_t)

#ifdef __cplusplus
}
#endif

#endif  /* _RDSIB_PROTOCOL_H */