1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 /* 26 * Copyright (c) 2005 SilverStorm Technologies, Inc. All rights reserved. 27 * 28 * This software is available to you under a choice of one of two 29 * licenses. You may choose to be licensed under the terms of the GNU 30 * General Public License (GPL) Version 2, available from the file 31 * COPYING in the main directory of this source tree, or the 32 * OpenIB.org BSD license below: 33 * 34 * Redistribution and use in source and binary forms, with or 35 * without modification, are permitted provided that the following 36 * conditions are met: 37 * 38 * - Redistributions of source code must retain the above 39 * copyright notice, this list of conditions and the following 40 * disclaimer. 41 * 42 * - Redistributions in binary form must reproduce the above 43 * copyright notice, this list of conditions and the following 44 * disclaimer in the documentation and/or other materials 45 * provided with the distribution. 46 * 47 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 48 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 49 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 50 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 51 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 52 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 53 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 54 * SOFTWARE. 55 * 56 */ 57 /* 58 * Sun elects to include this software in Sun product 59 * under the OpenIB BSD license. 60 * 61 * 62 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 63 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 64 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 65 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 66 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 67 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 68 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 69 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 70 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 71 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 72 * POSSIBILITY OF SUCH DAMAGE. 73 */ 74 75 #ifndef _RDSIB_PROTOCOL_H 76 #define _RDSIB_PROTOCOL_H 77 78 #ifdef __cplusplus 79 extern "C" { 80 #endif 81 82 #include <netinet/in.h> 83 84 #define RDS_VERSION 4 85 86 /* 87 * RDS Well known service id 88 * Format: 0x1h00144Fhhhhhhhh 89 * "00144F" is the Sun OUI 90 * 'h' can be any hex-decimal digit. 91 */ 92 #define RDS_SERVICE_ID 0x1000144F00000001ULL 93 94 /* Max number of nodes supported with the default configuration */ 95 #define RDS_MAX_NODES 8 96 97 /* packet size */ 98 #define RDS_USER_DATA_BUFFER_SIZE 4096 /* 4K */ 99 100 /* per session */ 101 #define RDS_MAX_DATA_RECV_BUFFERS 3000 102 #define RDS_MAX_DATA_SEND_BUFFERS 2000 103 #define RDS_MAX_CTRL_RECV_BUFFERS 100 104 #define RDS_MAX_CTRL_SEND_BUFFERS 50 105 106 /* RQ low water mark in percentage. More RWR have to be posted */ 107 #define RDS_DATA_RECV_BUFFER_LWM 90 108 #define RDS_CTRL_RECV_BUFFER_LWM 50 109 110 /* 111 * High water mark in percentage of pkts pending on sockets. 112 * Incoming traffic should be controlled or stopped for all sockets 113 * or some sockets that are above their quota 114 */ 115 #define RDS_PENDING_RX_PKTS_HWM 75 116 117 /* 118 * Only interoperate with homogeneous Solaris (x32, x64, sparcv9). 119 */ 120 #if defined(__sparcv9) 121 #define RDS_THIS_ARCH 1 122 #elif defined(__amd64) 123 #define RDS_THIS_ARCH 2 124 #elif defined(__i386) 125 #define RDS_THIS_ARCH 3 126 #else 127 #error "ISA not supported" 128 #endif 129 130 /* 131 * CM Private Data 132 * 133 * This data is sent with the CM REQ message by the initiater of the 134 * RC channel. 135 * 136 * cm_ip_pvt - ibt_ip_cm_info_t 137 * version - RDS version 138 * arch - only interoperate with homogeneous Solaris (x32, x64, sparcv9). 139 * eptype - RDS_EP_TYPE_CTRL or RDS_EP_TYPE_DATA 140 * failover - flag to indicate failover. 141 * last_bufid - used during failover, indicates the last buffer the remote 142 * received. 143 * user_buffer_size - Packet size on the sending node. This is also the size 144 * of the SGL buffer used in the send and receive WRs. This should be 145 * same size on the both active and passive nodes. 146 * ack_rkey - RKEY for the RDMA acknowledgement buffer. 147 * ack_addr - Registered MR address to receive RDMA acknowledgement. 148 */ 149 typedef struct rds_cm_private_data_s { 150 uint8_t cmp_ip_pvt[IBT_IP_HDR_PRIV_DATA_SZ]; 151 uint8_t cmp_version; 152 uint8_t cmp_arch; 153 uint8_t cmp_eptype; 154 uint8_t cmp_failover; 155 uintptr_t cmp_last_bufid; 156 uint32_t cmp_user_buffer_size; 157 ibt_rkey_t cmp_ack_rkey; 158 uintptr_t cmp_ack_addr; 159 } rds_cm_private_data_t; 160 161 /* 162 * Data Header 163 * This header is transmitted with every WR. 164 * 165 * bufid - Ponter to the send buffer that is used to send this packet. 166 * datalen - Number of bytes of data (not including the header) 167 * npkts - number of remaining pkts(including this one) for the message. 168 * It is set to 1 for single packet messages. 169 * psn - Packet sequence number(starts at 0). Zero for single packet messages. 170 * sendport - Port number of the sending socket 171 * recvport - Port number of the receiving socket 172 */ 173 typedef struct rds_data_hdr_s { 174 uintptr_t dh_bufid; 175 uint32_t dh_datalen; 176 uint32_t dh_npkts; 177 uint32_t dh_psn; 178 in_port_t dh_sendport; 179 in_port_t dh_recvport; 180 } rds_data_hdr_t; 181 182 #define RDS_DATA_HDR_SZ sizeof (rds_data_hdr_t) 183 184 /* 185 * List of control commands sent on a session: 186 * 187 * STALL: This command is sent to inform remote RDS that a port is stalled. 188 * Always sent on all existing sessions. 189 * UNSTALL: This command is sent to inform remote RDS that a port is unstalled. 190 * Always sent on all existing sessions. 191 * STALL_PORTS: Inform remote RDS that all local ports are stalled. 192 * UNSTALL_PORTS: Inform remote RDS that all local ports are unstalled. 193 * HEARTBEAT: Sent to check if the connection is still alive 194 */ 195 #define RDS_CTRL_CODE_STALL 1 196 #define RDS_CTRL_CODE_UNSTALL 2 197 #define RDS_CTRL_CODE_STALL_PORTS 3 198 #define RDS_CTRL_CODE_UNSTALL_PORTS 4 199 #define RDS_CTRL_CODE_HEARTBEAT 5 200 #define RDS_CTRL_CODE_CLOSE_SESSION 6 201 202 /* 203 * RDS ctrl packet 204 * 205 * port - Socket to be stalled/unstalled 206 * code - STALL/UNSTALL (other codes are currently not used) 207 */ 208 209 typedef struct rds_ctrl_pkt_s { 210 uint16_t rcp_port; 211 uint8_t rcp_code; 212 } rds_ctrl_pkt_t; 213 214 #define RDS_CTRLPKT_SIZE sizeof (rds_ctrl_pkt_t) 215 216 #ifdef __cplusplus 217 } 218 #endif 219 220 #endif /* _RDSIB_PROTOCOL_H */ 221