112198SEiji.Ota@Sun.COM /* 212763SGiri.Adari@Sun.COM * This file contains definitions used in OFED defined user/kernel 312763SGiri.Adari@Sun.COM * interfaces. These are imported from the OFED header <linux/rds.h>. Oracle 412763SGiri.Adari@Sun.COM * elects to have and use the contents of <linux/rds.h> under and governed 512763SGiri.Adari@Sun.COM * by the OpenIB.org BSD license (see below for full license text). However, 612763SGiri.Adari@Sun.COM * the following notice accompanied the original version of this file: 712763SGiri.Adari@Sun.COM */ 812763SGiri.Adari@Sun.COM /* 912198SEiji.Ota@Sun.COM * Copyright (c) 2008 Oracle. All rights reserved. 1012198SEiji.Ota@Sun.COM * 1112198SEiji.Ota@Sun.COM * This software is available to you under a choice of one of two 1212198SEiji.Ota@Sun.COM * licenses. You may choose to be licensed under the terms of the GNU 1312198SEiji.Ota@Sun.COM * General Public License (GPL) Version 2, available from the file 1412198SEiji.Ota@Sun.COM * COPYING in the main directory of this source tree, or the 1512198SEiji.Ota@Sun.COM * OpenIB.org BSD license below: 1612198SEiji.Ota@Sun.COM * 1712198SEiji.Ota@Sun.COM * Redistribution and use in source and binary forms, with or 1812198SEiji.Ota@Sun.COM * without modification, are permitted provided that the following 1912198SEiji.Ota@Sun.COM * conditions are met: 2012198SEiji.Ota@Sun.COM * 2112198SEiji.Ota@Sun.COM * - Redistributions of source code must retain the above 2212198SEiji.Ota@Sun.COM * copyright notice, this list of conditions and the following 2312198SEiji.Ota@Sun.COM * disclaimer. 2412198SEiji.Ota@Sun.COM * 2512198SEiji.Ota@Sun.COM * - Redistributions in binary form must reproduce the above 2612198SEiji.Ota@Sun.COM * copyright notice, this list of conditions and the following 2712198SEiji.Ota@Sun.COM * disclaimer in the documentation and/or other materials 2812198SEiji.Ota@Sun.COM * provided with the distribution. 2912198SEiji.Ota@Sun.COM * 3012198SEiji.Ota@Sun.COM * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 3112198SEiji.Ota@Sun.COM * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 3212198SEiji.Ota@Sun.COM * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 3312198SEiji.Ota@Sun.COM * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 3412198SEiji.Ota@Sun.COM * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 3512198SEiji.Ota@Sun.COM * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 3612198SEiji.Ota@Sun.COM * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 3712198SEiji.Ota@Sun.COM * SOFTWARE. 3812198SEiji.Ota@Sun.COM * 3912198SEiji.Ota@Sun.COM */ 40*12863SEiji.Ota@Sun.COM #ifndef _SYS_RDS_H 41*12863SEiji.Ota@Sun.COM #define _SYS_RDS_H 4212198SEiji.Ota@Sun.COM 4312198SEiji.Ota@Sun.COM #ifdef __cplusplus 4412198SEiji.Ota@Sun.COM extern "C" { 4512198SEiji.Ota@Sun.COM #endif 4612198SEiji.Ota@Sun.COM 47*12863SEiji.Ota@Sun.COM #if !(defined(__SVR4) && defined(__sun)) 48*12863SEiji.Ota@Sun.COM #include <linux/types.h> 49*12863SEiji.Ota@Sun.COM #else 50*12863SEiji.Ota@Sun.COM #include <sys/types.h> 51*12863SEiji.Ota@Sun.COM #include <sys/socket.h> 52*12863SEiji.Ota@Sun.COM #endif 53*12863SEiji.Ota@Sun.COM 54*12863SEiji.Ota@Sun.COM /* 55*12863SEiji.Ota@Sun.COM * These sparse annotated types shouldn't be in any user 56*12863SEiji.Ota@Sun.COM * visible header file. We should clean this up rather 57*12863SEiji.Ota@Sun.COM * than kludging around them. 58*12863SEiji.Ota@Sun.COM */ 59*12863SEiji.Ota@Sun.COM #if !(defined(__SVR4) && defined(__sun)) 60*12863SEiji.Ota@Sun.COM #ifndef __KERNEL__ 61*12863SEiji.Ota@Sun.COM #define __be16 u_int16_t 62*12863SEiji.Ota@Sun.COM #define __be32 u_int32_t 63*12863SEiji.Ota@Sun.COM #define __be64 u_int64_t 64*12863SEiji.Ota@Sun.COM #endif 65*12863SEiji.Ota@Sun.COM #else 66*12863SEiji.Ota@Sun.COM #define u_int8_t uint8_t 67*12863SEiji.Ota@Sun.COM #define u_int16_t uint16_t 68*12863SEiji.Ota@Sun.COM #define u_int32_t uint32_t 69*12863SEiji.Ota@Sun.COM #define u_int64_t uint64_t 70*12863SEiji.Ota@Sun.COM #endif 71*12863SEiji.Ota@Sun.COM 7212198SEiji.Ota@Sun.COM #define RDS_IB_ABI_VERSION 0x301 7312198SEiji.Ota@Sun.COM 74*12863SEiji.Ota@Sun.COM #define AF_RDS AF_INET_OFFLOAD 75*12863SEiji.Ota@Sun.COM #define PF_RDS AF_INET_OFFLOAD 76*12863SEiji.Ota@Sun.COM #define SOL_RDS 272 7712198SEiji.Ota@Sun.COM 7812198SEiji.Ota@Sun.COM /* 7912198SEiji.Ota@Sun.COM * setsockopt/getsockopt for SOL_RDS 8012198SEiji.Ota@Sun.COM */ 81*12863SEiji.Ota@Sun.COM #define RDS_CANCEL_SENT_TO 1 82*12863SEiji.Ota@Sun.COM #define RDS_GET_MR 2 83*12863SEiji.Ota@Sun.COM #define RDS_FREE_MR 3 8412198SEiji.Ota@Sun.COM /* deprecated: RDS_BARRIER 4 */ 85*12863SEiji.Ota@Sun.COM #define RDS_RECVERR 5 86*12863SEiji.Ota@Sun.COM #define RDS_CONG_MONITOR 6 87*12863SEiji.Ota@Sun.COM #define RDS_GET_MR_FOR_DEST 7 88*12863SEiji.Ota@Sun.COM 8912198SEiji.Ota@Sun.COM 9012198SEiji.Ota@Sun.COM /* 9112198SEiji.Ota@Sun.COM * Control message types for SOL_RDS. 9212198SEiji.Ota@Sun.COM * 93*12863SEiji.Ota@Sun.COM * CMSG_RDMA_ARGS (sendmsg) 9412198SEiji.Ota@Sun.COM * Request a RDMA transfer to/from the specified 9512198SEiji.Ota@Sun.COM * memory ranges. 96*12863SEiji.Ota@Sun.COM * The cmsg_data is a struct rds_rdma_args. 9712198SEiji.Ota@Sun.COM * RDS_CMSG_RDMA_DEST (recvmsg, sendmsg) 9812198SEiji.Ota@Sun.COM * Kernel informs application about intended 9912198SEiji.Ota@Sun.COM * source/destination of a RDMA transfer 10012198SEiji.Ota@Sun.COM * RDS_CMSG_RDMA_MAP (sendmsg) 10112198SEiji.Ota@Sun.COM * Application asks kernel to map the given 10212198SEiji.Ota@Sun.COM * memory range into a IB MR, and send the 10312198SEiji.Ota@Sun.COM * R_Key along in an RDS extension header. 104*12863SEiji.Ota@Sun.COM * The cmsg_data is a struct rds_get_mr_args, 10512198SEiji.Ota@Sun.COM * the same as for the GET_MR setsockopt. 10612198SEiji.Ota@Sun.COM * RDS_CMSG_RDMA_STATUS (recvmsg) 10712198SEiji.Ota@Sun.COM * Returns the status of a completed RDMA operation. 10812198SEiji.Ota@Sun.COM */ 109*12863SEiji.Ota@Sun.COM #define RDS_CMSG_RDMA_ARGS 1 110*12863SEiji.Ota@Sun.COM #define RDS_CMSG_RDMA_DEST 2 111*12863SEiji.Ota@Sun.COM #define RDS_CMSG_RDMA_MAP 3 112*12863SEiji.Ota@Sun.COM #define RDS_CMSG_RDMA_STATUS 4 113*12863SEiji.Ota@Sun.COM #define RDS_CMSG_CONG_UPDATE 5 11412198SEiji.Ota@Sun.COM 115*12863SEiji.Ota@Sun.COM #define RDS_INFO_FIRST 10000 116*12863SEiji.Ota@Sun.COM #define RDS_INFO_COUNTERS 10000 117*12863SEiji.Ota@Sun.COM #define RDS_INFO_CONNECTIONS 10001 11812198SEiji.Ota@Sun.COM /* 10002 aka RDS_INFO_FLOWS is deprecated */ 119*12863SEiji.Ota@Sun.COM #define RDS_INFO_SEND_MESSAGES 10003 120*12863SEiji.Ota@Sun.COM #define RDS_INFO_RETRANS_MESSAGES 10004 121*12863SEiji.Ota@Sun.COM #define RDS_INFO_RECV_MESSAGES 10005 122*12863SEiji.Ota@Sun.COM #define RDS_INFO_SOCKETS 10006 123*12863SEiji.Ota@Sun.COM #define RDS_INFO_TCP_SOCKETS 10007 124*12863SEiji.Ota@Sun.COM #define RDS_INFO_IB_CONNECTIONS 10008 125*12863SEiji.Ota@Sun.COM #define RDS_INFO_CONNECTION_STATS 10009 126*12863SEiji.Ota@Sun.COM #define RDS_INFO_IWARP_CONNECTIONS 10010 127*12863SEiji.Ota@Sun.COM #define RDS_INFO_LAST 10010 12812198SEiji.Ota@Sun.COM 129*12863SEiji.Ota@Sun.COM #if defined(__SVR4) && defined(__sun) 13012580SGiri.Adari@Sun.COM struct rds_info_arg { 13112580SGiri.Adari@Sun.COM uint64_t lenp; 13212580SGiri.Adari@Sun.COM uint64_t datap; 13312580SGiri.Adari@Sun.COM }; 134*12863SEiji.Ota@Sun.COM #endif 13512580SGiri.Adari@Sun.COM 13612198SEiji.Ota@Sun.COM #ifndef __lock_lint 13712198SEiji.Ota@Sun.COM #pragma pack(1) 138*12863SEiji.Ota@Sun.COM struct rds_info_counter { 139*12863SEiji.Ota@Sun.COM u_int8_t name[32]; 140*12863SEiji.Ota@Sun.COM u_int64_t value; 14112198SEiji.Ota@Sun.COM } __attribute__((packed)); 14212198SEiji.Ota@Sun.COM #pragma pack() 14312198SEiji.Ota@Sun.COM #else 144*12863SEiji.Ota@Sun.COM struct rds_info_counter { 145*12863SEiji.Ota@Sun.COM u_int8_t name[32]; 146*12863SEiji.Ota@Sun.COM u_int64_t value; 14712198SEiji.Ota@Sun.COM }; 14812198SEiji.Ota@Sun.COM #endif 14912198SEiji.Ota@Sun.COM 150*12863SEiji.Ota@Sun.COM #define RDS_INFO_CONNECTION_FLAG_SENDING 0x01 151*12863SEiji.Ota@Sun.COM #define RDS_INFO_CONNECTION_FLAG_CONNECTING 0x02 152*12863SEiji.Ota@Sun.COM #define RDS_INFO_CONNECTION_FLAG_CONNECTED 0x04 15312198SEiji.Ota@Sun.COM 15412414SEiji.Ota@Sun.COM #define TRANSNAMSIZ 16 15512414SEiji.Ota@Sun.COM 15612198SEiji.Ota@Sun.COM #ifndef __lock_lint 15712198SEiji.Ota@Sun.COM #pragma pack(1) 158*12863SEiji.Ota@Sun.COM struct rds_info_connection { 159*12863SEiji.Ota@Sun.COM u_int64_t next_tx_seq; 160*12863SEiji.Ota@Sun.COM u_int64_t next_rx_seq; 161*12863SEiji.Ota@Sun.COM u_int32_t laddr; 162*12863SEiji.Ota@Sun.COM u_int32_t faddr; 163*12863SEiji.Ota@Sun.COM u_int8_t transport[TRANSNAMSIZ]; /* null term ascii */ 164*12863SEiji.Ota@Sun.COM u_int8_t flags; 16512198SEiji.Ota@Sun.COM } __attribute__((packed)); 16612198SEiji.Ota@Sun.COM #pragma pack() 16712198SEiji.Ota@Sun.COM #else 168*12863SEiji.Ota@Sun.COM struct rds_info_connection { 169*12863SEiji.Ota@Sun.COM u_int64_t next_tx_seq; 170*12863SEiji.Ota@Sun.COM u_int64_t next_rx_seq; 171*12863SEiji.Ota@Sun.COM u_int32_t laddr; 172*12863SEiji.Ota@Sun.COM u_int32_t faddr; 173*12863SEiji.Ota@Sun.COM u_int8_t transport[TRANSNAMSIZ]; /* null term ascii */ 174*12863SEiji.Ota@Sun.COM u_int8_t flags; 17512198SEiji.Ota@Sun.COM }; 17612198SEiji.Ota@Sun.COM #endif 17712198SEiji.Ota@Sun.COM 17812198SEiji.Ota@Sun.COM #ifndef __lock_lint 17912198SEiji.Ota@Sun.COM #pragma pack(1) 180*12863SEiji.Ota@Sun.COM struct rds_info_flow { 181*12863SEiji.Ota@Sun.COM u_int32_t laddr; 182*12863SEiji.Ota@Sun.COM u_int32_t faddr; 183*12863SEiji.Ota@Sun.COM u_int32_t bytes; 184*12863SEiji.Ota@Sun.COM u_int16_t lport; 185*12863SEiji.Ota@Sun.COM u_int16_t fport; 18612198SEiji.Ota@Sun.COM } __attribute__((packed)); 18712198SEiji.Ota@Sun.COM #pragma pack() 18812198SEiji.Ota@Sun.COM #else 189*12863SEiji.Ota@Sun.COM struct rds_info_flow { 190*12863SEiji.Ota@Sun.COM u_int32_t laddr; 191*12863SEiji.Ota@Sun.COM u_int32_t faddr; 192*12863SEiji.Ota@Sun.COM u_int32_t bytes; 193*12863SEiji.Ota@Sun.COM u_int16_t lport; 194*12863SEiji.Ota@Sun.COM u_int16_t fport; 19512198SEiji.Ota@Sun.COM }; 19612198SEiji.Ota@Sun.COM #endif 19712198SEiji.Ota@Sun.COM 198*12863SEiji.Ota@Sun.COM #define RDS_INFO_MESSAGE_FLAG_ACK 0x01 199*12863SEiji.Ota@Sun.COM #define RDS_INFO_MESSAGE_FLAG_FAST_ACK 0x02 20012198SEiji.Ota@Sun.COM 20112198SEiji.Ota@Sun.COM #ifndef __lock_lint 20212198SEiji.Ota@Sun.COM #pragma pack(1) 203*12863SEiji.Ota@Sun.COM struct rds_info_message { 204*12863SEiji.Ota@Sun.COM u_int64_t seq; 205*12863SEiji.Ota@Sun.COM u_int32_t len; 206*12863SEiji.Ota@Sun.COM u_int32_t laddr; 207*12863SEiji.Ota@Sun.COM u_int32_t faddr; 208*12863SEiji.Ota@Sun.COM u_int16_t lport; 209*12863SEiji.Ota@Sun.COM u_int16_t fport; 210*12863SEiji.Ota@Sun.COM u_int8_t flags; 21112198SEiji.Ota@Sun.COM } __attribute__((packed)); 21212198SEiji.Ota@Sun.COM #pragma pack() 21312198SEiji.Ota@Sun.COM #else 214*12863SEiji.Ota@Sun.COM struct rds_info_message { 215*12863SEiji.Ota@Sun.COM u_int64_t seq; 216*12863SEiji.Ota@Sun.COM u_int32_t len; 217*12863SEiji.Ota@Sun.COM u_int32_t laddr; 218*12863SEiji.Ota@Sun.COM u_int32_t faddr; 219*12863SEiji.Ota@Sun.COM u_int16_t lport; 220*12863SEiji.Ota@Sun.COM u_int16_t fport; 221*12863SEiji.Ota@Sun.COM u_int8_t flags; 22212198SEiji.Ota@Sun.COM }; 22312198SEiji.Ota@Sun.COM #endif 22412198SEiji.Ota@Sun.COM 22512198SEiji.Ota@Sun.COM #ifndef __lock_lint 22612198SEiji.Ota@Sun.COM #pragma pack(1) 227*12863SEiji.Ota@Sun.COM struct rds_info_socket { 228*12863SEiji.Ota@Sun.COM u_int32_t sndbuf; 229*12863SEiji.Ota@Sun.COM u_int32_t bound_addr; 230*12863SEiji.Ota@Sun.COM u_int32_t connected_addr; 231*12863SEiji.Ota@Sun.COM u_int16_t bound_port; 232*12863SEiji.Ota@Sun.COM u_int16_t connected_port; 233*12863SEiji.Ota@Sun.COM u_int32_t rcvbuf; 234*12863SEiji.Ota@Sun.COM u_int64_t inum; 23512198SEiji.Ota@Sun.COM } __attribute__((packed)); 23612198SEiji.Ota@Sun.COM #pragma pack() 23712198SEiji.Ota@Sun.COM #else 238*12863SEiji.Ota@Sun.COM struct rds_info_socket { 239*12863SEiji.Ota@Sun.COM u_int32_t sndbuf; 240*12863SEiji.Ota@Sun.COM u_int32_t bound_addr; 241*12863SEiji.Ota@Sun.COM u_int32_t connected_addr; 242*12863SEiji.Ota@Sun.COM u_int16_t bound_port; 243*12863SEiji.Ota@Sun.COM u_int16_t connected_port; 244*12863SEiji.Ota@Sun.COM u_int32_t rcvbuf; 245*12863SEiji.Ota@Sun.COM u_int64_t inum; 24612198SEiji.Ota@Sun.COM }; 24712198SEiji.Ota@Sun.COM #endif 24812198SEiji.Ota@Sun.COM 24912198SEiji.Ota@Sun.COM #ifndef __lock_lint 25012198SEiji.Ota@Sun.COM #pragma pack(1) 251*12863SEiji.Ota@Sun.COM struct rds_info_tcp_socket { 252*12863SEiji.Ota@Sun.COM u_int32_t local_addr; 253*12863SEiji.Ota@Sun.COM u_int16_t local_port; 254*12863SEiji.Ota@Sun.COM u_int32_t peer_addr; 255*12863SEiji.Ota@Sun.COM u_int16_t peer_port; 256*12863SEiji.Ota@Sun.COM u_int64_t hdr_rem; 257*12863SEiji.Ota@Sun.COM u_int64_t data_rem; 258*12863SEiji.Ota@Sun.COM u_int32_t last_sent_nxt; 259*12863SEiji.Ota@Sun.COM u_int32_t last_expected_una; 260*12863SEiji.Ota@Sun.COM u_int32_t last_seen_una; 26112198SEiji.Ota@Sun.COM } __attribute__((packed)); 26212198SEiji.Ota@Sun.COM #pragma pack() 26312198SEiji.Ota@Sun.COM #else 264*12863SEiji.Ota@Sun.COM struct rds_info_tcp_socket { 265*12863SEiji.Ota@Sun.COM u_int32_t local_addr; 266*12863SEiji.Ota@Sun.COM u_int16_t local_port; 267*12863SEiji.Ota@Sun.COM u_int32_t peer_addr; 268*12863SEiji.Ota@Sun.COM u_int16_t peer_port; 269*12863SEiji.Ota@Sun.COM u_int64_t hdr_rem; 270*12863SEiji.Ota@Sun.COM u_int64_t data_rem; 271*12863SEiji.Ota@Sun.COM u_int32_t last_sent_nxt; 272*12863SEiji.Ota@Sun.COM u_int32_t last_expected_una; 273*12863SEiji.Ota@Sun.COM u_int32_t last_seen_una; 274*12863SEiji.Ota@Sun.COM } __attribute__((packed)); 27512198SEiji.Ota@Sun.COM }; 27612198SEiji.Ota@Sun.COM #endif 27712198SEiji.Ota@Sun.COM 27812198SEiji.Ota@Sun.COM #define RDS_IB_GID_LEN 16 279*12863SEiji.Ota@Sun.COM struct rds_info_rdma_connection { 280*12863SEiji.Ota@Sun.COM u_int32_t src_addr; 281*12863SEiji.Ota@Sun.COM u_int32_t dst_addr; 28212198SEiji.Ota@Sun.COM uint8_t src_gid[RDS_IB_GID_LEN]; 28312198SEiji.Ota@Sun.COM uint8_t dst_gid[RDS_IB_GID_LEN]; 28412198SEiji.Ota@Sun.COM 28512198SEiji.Ota@Sun.COM uint32_t max_send_wr; 28612198SEiji.Ota@Sun.COM uint32_t max_recv_wr; 28712198SEiji.Ota@Sun.COM uint32_t max_send_sge; 28812198SEiji.Ota@Sun.COM uint32_t rdma_mr_max; 28912198SEiji.Ota@Sun.COM uint32_t rdma_mr_size; 29012198SEiji.Ota@Sun.COM }; 29112198SEiji.Ota@Sun.COM 29212414SEiji.Ota@Sun.COM /* 29312414SEiji.Ota@Sun.COM * Congestion monitoring. 29412414SEiji.Ota@Sun.COM * Congestion control in RDS happens at the host connection 29512414SEiji.Ota@Sun.COM * level by exchanging a bitmap marking congested ports. 29612414SEiji.Ota@Sun.COM * By default, a process sleeping in poll() is always woken 29712414SEiji.Ota@Sun.COM * up when the congestion map is updated. 29812414SEiji.Ota@Sun.COM * With explicit monitoring, an application can have more 29912414SEiji.Ota@Sun.COM * fine-grained control. 30012414SEiji.Ota@Sun.COM * The application installs a 64bit mask value in the socket, 30112414SEiji.Ota@Sun.COM * where each bit corresponds to a group of ports. 30212414SEiji.Ota@Sun.COM * When a congestion update arrives, RDS checks the set of 30312414SEiji.Ota@Sun.COM * ports that are now uncongested against the list bit mask 30412414SEiji.Ota@Sun.COM * installed in the socket, and if they overlap, we queue a 30512414SEiji.Ota@Sun.COM * cong_notification on the socket. 30612414SEiji.Ota@Sun.COM * 30712414SEiji.Ota@Sun.COM * To install the congestion monitor bitmask, use RDS_CONG_MONITOR 30812414SEiji.Ota@Sun.COM * with the 64bit mask. 30912414SEiji.Ota@Sun.COM * Congestion updates are received via RDS_CMSG_CONG_UPDATE 31012414SEiji.Ota@Sun.COM * control messages. 31112414SEiji.Ota@Sun.COM * 31212414SEiji.Ota@Sun.COM * The correspondence between bits and ports is 31312414SEiji.Ota@Sun.COM * 1 << (portnum % 64) 31412414SEiji.Ota@Sun.COM */ 315*12863SEiji.Ota@Sun.COM #define RDS_CONG_MONITOR_SIZE 64 316*12863SEiji.Ota@Sun.COM #define RDS_CONG_MONITOR_BIT(port) \ 317*12863SEiji.Ota@Sun.COM (((unsigned int) port) % RDS_CONG_MONITOR_SIZE) 318*12863SEiji.Ota@Sun.COM #define RDS_CONG_MONITOR_MASK(port) (1ULL << RDS_CONG_MONITOR_BIT(port)) 31912414SEiji.Ota@Sun.COM 32012414SEiji.Ota@Sun.COM /* 32112414SEiji.Ota@Sun.COM * RDMA related types 32212414SEiji.Ota@Sun.COM */ 32312414SEiji.Ota@Sun.COM 32412414SEiji.Ota@Sun.COM /* 32512414SEiji.Ota@Sun.COM * This encapsulates a remote memory location. 32612414SEiji.Ota@Sun.COM * In the current implementation, it contains the R_Key 32712414SEiji.Ota@Sun.COM * of the remote memory region, and the offset into it 32812414SEiji.Ota@Sun.COM * (so that the application does not have to worry about 32912414SEiji.Ota@Sun.COM * alignment). 33012414SEiji.Ota@Sun.COM */ 331*12863SEiji.Ota@Sun.COM typedef u_int64_t rds_rdma_cookie_t; 33212414SEiji.Ota@Sun.COM 333*12863SEiji.Ota@Sun.COM struct rds_iovec { 334*12863SEiji.Ota@Sun.COM u_int64_t addr; 335*12863SEiji.Ota@Sun.COM u_int64_t bytes; 33612414SEiji.Ota@Sun.COM }; 33712414SEiji.Ota@Sun.COM 338*12863SEiji.Ota@Sun.COM struct rds_get_mr_args { 339*12863SEiji.Ota@Sun.COM struct rds_iovec vec; 340*12863SEiji.Ota@Sun.COM u_int64_t cookie_addr; 34112414SEiji.Ota@Sun.COM uint64_t flags; 34212414SEiji.Ota@Sun.COM }; 34312414SEiji.Ota@Sun.COM 344*12863SEiji.Ota@Sun.COM struct rds_get_mr_for_dest_args { 345*12863SEiji.Ota@Sun.COM struct sockaddr_storage dest_addr; 346*12863SEiji.Ota@Sun.COM struct rds_iovec vec; 347*12863SEiji.Ota@Sun.COM u_int64_t cookie_addr; 34812414SEiji.Ota@Sun.COM uint64_t flags; 34912414SEiji.Ota@Sun.COM }; 35012414SEiji.Ota@Sun.COM 351*12863SEiji.Ota@Sun.COM 352*12863SEiji.Ota@Sun.COM struct rds_free_mr_args { 353*12863SEiji.Ota@Sun.COM rds_rdma_cookie_t cookie; 354*12863SEiji.Ota@Sun.COM u_int64_t flags; 35512414SEiji.Ota@Sun.COM }; 35612414SEiji.Ota@Sun.COM 357*12863SEiji.Ota@Sun.COM struct rds_rdma_args { 358*12863SEiji.Ota@Sun.COM rds_rdma_cookie_t cookie; 359*12863SEiji.Ota@Sun.COM struct rds_iovec remote_vec; 360*12863SEiji.Ota@Sun.COM u_int64_t local_vec_addr; 361*12863SEiji.Ota@Sun.COM u_int64_t nr_local; 362*12863SEiji.Ota@Sun.COM u_int64_t flags; 363*12863SEiji.Ota@Sun.COM u_int64_t user_token; 36412414SEiji.Ota@Sun.COM }; 36512414SEiji.Ota@Sun.COM 366*12863SEiji.Ota@Sun.COM struct rds_rdma_notify { 367*12863SEiji.Ota@Sun.COM u_int64_t user_token; 36812414SEiji.Ota@Sun.COM int32_t status; 36912414SEiji.Ota@Sun.COM }; 37012414SEiji.Ota@Sun.COM 371*12863SEiji.Ota@Sun.COM #define RDS_RDMA_SUCCESS 0 372*12863SEiji.Ota@Sun.COM #define RDS_RDMA_REMOTE_ERROR 1 373*12863SEiji.Ota@Sun.COM #define RDS_RDMA_CANCELED 2 374*12863SEiji.Ota@Sun.COM #define RDS_RDMA_DROPPED 3 375*12863SEiji.Ota@Sun.COM #define RDS_RDMA_OTHER_ERROR 4 37612414SEiji.Ota@Sun.COM 37712414SEiji.Ota@Sun.COM /* 37812414SEiji.Ota@Sun.COM * Common set of flags for all RDMA related structs 37912414SEiji.Ota@Sun.COM */ 380*12863SEiji.Ota@Sun.COM #define RDS_RDMA_READWRITE 0x0001 381*12863SEiji.Ota@Sun.COM #define RDS_RDMA_FENCE 0x0002 /* use FENCE for immediate send */ 382*12863SEiji.Ota@Sun.COM #define RDS_RDMA_INVALIDATE 0x0004 /* invalidate R_Key after freeing MR */ 383*12863SEiji.Ota@Sun.COM #define RDS_RDMA_USE_ONCE 0x0008 /* free MR after use */ 384*12863SEiji.Ota@Sun.COM #define RDS_RDMA_DONTWAIT 0x0010 /* Don't wait in SET_BARRIER */ 385*12863SEiji.Ota@Sun.COM #define RDS_RDMA_NOTIFY_ME 0x0020 /* Notify when operation completes */ 38612414SEiji.Ota@Sun.COM 38712198SEiji.Ota@Sun.COM #ifdef __cplusplus 38812198SEiji.Ota@Sun.COM } 38912198SEiji.Ota@Sun.COM #endif 39012198SEiji.Ota@Sun.COM 391*12863SEiji.Ota@Sun.COM #endif /* _SYS_RDS_H */ 392