1c0dd49bdSEiji Ota /* 216e76cddSagiri * This file contains definitions used in OFED defined user/kernel 316e76cddSagiri * interfaces. These are imported from the OFED header <linux/rds.h>. Oracle 416e76cddSagiri * elects to have and use the contents of <linux/rds.h> under and governed 516e76cddSagiri * by the OpenIB.org BSD license (see below for full license text). However, 616e76cddSagiri * the following notice accompanied the original version of this file: 7c0dd49bdSEiji Ota */ 8c0dd49bdSEiji Ota /* 9c0dd49bdSEiji Ota * Copyright (c) 2008 Oracle. All rights reserved. 10c0dd49bdSEiji Ota * 11c0dd49bdSEiji Ota * This software is available to you under a choice of one of two 12c0dd49bdSEiji Ota * licenses. You may choose to be licensed under the terms of the GNU 13c0dd49bdSEiji Ota * General Public License (GPL) Version 2, available from the file 14c0dd49bdSEiji Ota * COPYING in the main directory of this source tree, or the 15c0dd49bdSEiji Ota * OpenIB.org BSD license below: 16c0dd49bdSEiji Ota * 17c0dd49bdSEiji Ota * Redistribution and use in source and binary forms, with or 18c0dd49bdSEiji Ota * without modification, are permitted provided that the following 19c0dd49bdSEiji Ota * conditions are met: 20c0dd49bdSEiji Ota * 21c0dd49bdSEiji Ota * - Redistributions of source code must retain the above 22c0dd49bdSEiji Ota * copyright notice, this list of conditions and the following 23c0dd49bdSEiji Ota * disclaimer. 24c0dd49bdSEiji Ota * 25c0dd49bdSEiji Ota * - Redistributions in binary form must reproduce the above 26c0dd49bdSEiji Ota * copyright notice, this list of conditions and the following 27c0dd49bdSEiji Ota * disclaimer in the documentation and/or other materials 28c0dd49bdSEiji Ota * provided with the distribution. 29c0dd49bdSEiji Ota * 30c0dd49bdSEiji Ota * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 31c0dd49bdSEiji Ota * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 32c0dd49bdSEiji Ota * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 33c0dd49bdSEiji Ota * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 34c0dd49bdSEiji Ota * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 35c0dd49bdSEiji Ota * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 36c0dd49bdSEiji Ota * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 37c0dd49bdSEiji Ota * SOFTWARE. 38c0dd49bdSEiji Ota * 39c0dd49bdSEiji Ota */ 40*fe817b60SEiji Ota #ifndef _SYS_RDS_H 41*fe817b60SEiji Ota #define _SYS_RDS_H 42c0dd49bdSEiji Ota 43*fe817b60SEiji Ota #ifdef __cplusplus 44*fe817b60SEiji Ota extern "C" { 45*fe817b60SEiji Ota #endif 46c0dd49bdSEiji Ota 47*fe817b60SEiji Ota #if !(defined(__SVR4) && defined(__sun)) 48*fe817b60SEiji Ota #include <linux/types.h> 49*fe817b60SEiji Ota #else 50c0dd49bdSEiji Ota #include <sys/types.h> 515d5562f5SEiji Ota #include <sys/socket.h> 52*fe817b60SEiji Ota #endif 53c0dd49bdSEiji Ota 54*fe817b60SEiji Ota /* 55*fe817b60SEiji Ota * These sparse annotated types shouldn't be in any user 56*fe817b60SEiji Ota * visible header file. We should clean this up rather 57*fe817b60SEiji Ota * than kludging around them. 58*fe817b60SEiji Ota */ 59*fe817b60SEiji Ota #if !(defined(__SVR4) && defined(__sun)) 60*fe817b60SEiji Ota #ifndef __KERNEL__ 61*fe817b60SEiji Ota #define __be16 u_int16_t 62*fe817b60SEiji Ota #define __be32 u_int32_t 63*fe817b60SEiji Ota #define __be64 u_int64_t 64*fe817b60SEiji Ota #endif 65*fe817b60SEiji Ota #else 66*fe817b60SEiji Ota #define u_int8_t uint8_t 67*fe817b60SEiji Ota #define u_int16_t uint16_t 68*fe817b60SEiji Ota #define u_int32_t uint32_t 69*fe817b60SEiji Ota #define u_int64_t uint64_t 70c0dd49bdSEiji Ota #endif 71c0dd49bdSEiji Ota 72c0dd49bdSEiji Ota #define RDS_IB_ABI_VERSION 0x301 73c0dd49bdSEiji Ota 74*fe817b60SEiji Ota #define AF_RDS AF_INET_OFFLOAD 75*fe817b60SEiji Ota #define PF_RDS AF_INET_OFFLOAD 76*fe817b60SEiji Ota #define SOL_RDS 272 77c0dd49bdSEiji Ota 78c0dd49bdSEiji Ota /* 79c0dd49bdSEiji Ota * setsockopt/getsockopt for SOL_RDS 80c0dd49bdSEiji Ota */ 81*fe817b60SEiji Ota #define RDS_CANCEL_SENT_TO 1 82*fe817b60SEiji Ota #define RDS_GET_MR 2 83*fe817b60SEiji Ota #define RDS_FREE_MR 3 84c0dd49bdSEiji Ota /* deprecated: RDS_BARRIER 4 */ 85*fe817b60SEiji Ota #define RDS_RECVERR 5 86*fe817b60SEiji Ota #define RDS_CONG_MONITOR 6 87*fe817b60SEiji Ota #define RDS_GET_MR_FOR_DEST 7 88*fe817b60SEiji Ota 89c0dd49bdSEiji Ota 90c0dd49bdSEiji Ota /* 91c0dd49bdSEiji Ota * Control message types for SOL_RDS. 92c0dd49bdSEiji Ota * 93*fe817b60SEiji Ota * CMSG_RDMA_ARGS (sendmsg) 94c0dd49bdSEiji Ota * Request a RDMA transfer to/from the specified 95c0dd49bdSEiji Ota * memory ranges. 96*fe817b60SEiji Ota * The cmsg_data is a struct rds_rdma_args. 97c0dd49bdSEiji Ota * RDS_CMSG_RDMA_DEST (recvmsg, sendmsg) 98c0dd49bdSEiji Ota * Kernel informs application about intended 99c0dd49bdSEiji Ota * source/destination of a RDMA transfer 100c0dd49bdSEiji Ota * RDS_CMSG_RDMA_MAP (sendmsg) 101c0dd49bdSEiji Ota * Application asks kernel to map the given 102c0dd49bdSEiji Ota * memory range into a IB MR, and send the 103c0dd49bdSEiji Ota * R_Key along in an RDS extension header. 104*fe817b60SEiji Ota * The cmsg_data is a struct rds_get_mr_args, 105c0dd49bdSEiji Ota * the same as for the GET_MR setsockopt. 106c0dd49bdSEiji Ota * RDS_CMSG_RDMA_STATUS (recvmsg) 107c0dd49bdSEiji Ota * Returns the status of a completed RDMA operation. 108c0dd49bdSEiji Ota */ 109*fe817b60SEiji Ota #define RDS_CMSG_RDMA_ARGS 1 110*fe817b60SEiji Ota #define RDS_CMSG_RDMA_DEST 2 111*fe817b60SEiji Ota #define RDS_CMSG_RDMA_MAP 3 112*fe817b60SEiji Ota #define RDS_CMSG_RDMA_STATUS 4 113*fe817b60SEiji Ota #define RDS_CMSG_CONG_UPDATE 5 114*fe817b60SEiji Ota 115*fe817b60SEiji Ota #define RDS_INFO_FIRST 10000 116*fe817b60SEiji Ota #define RDS_INFO_COUNTERS 10000 117*fe817b60SEiji Ota #define RDS_INFO_CONNECTIONS 10001 118c0dd49bdSEiji Ota /* 10002 aka RDS_INFO_FLOWS is deprecated */ 119*fe817b60SEiji Ota #define RDS_INFO_SEND_MESSAGES 10003 120*fe817b60SEiji Ota #define RDS_INFO_RETRANS_MESSAGES 10004 121*fe817b60SEiji Ota #define RDS_INFO_RECV_MESSAGES 10005 122*fe817b60SEiji Ota #define RDS_INFO_SOCKETS 10006 123*fe817b60SEiji Ota #define RDS_INFO_TCP_SOCKETS 10007 124*fe817b60SEiji Ota #define RDS_INFO_IB_CONNECTIONS 10008 125*fe817b60SEiji Ota #define RDS_INFO_CONNECTION_STATS 10009 126*fe817b60SEiji Ota #define RDS_INFO_IWARP_CONNECTIONS 10010 127*fe817b60SEiji Ota #define RDS_INFO_LAST 10010 128*fe817b60SEiji Ota 129*fe817b60SEiji Ota #if defined(__SVR4) && defined(__sun) 130b27516f5Sagiri struct rds_info_arg { 131b27516f5Sagiri uint64_t lenp; 132b27516f5Sagiri uint64_t datap; 133b27516f5Sagiri }; 134*fe817b60SEiji Ota #endif 135b27516f5Sagiri 136c0dd49bdSEiji Ota #ifndef __lock_lint 137c0dd49bdSEiji Ota #pragma pack(1) 138*fe817b60SEiji Ota struct rds_info_counter { 139*fe817b60SEiji Ota u_int8_t name[32]; 140*fe817b60SEiji Ota u_int64_t value; 141c0dd49bdSEiji Ota } __attribute__((packed)); 142c0dd49bdSEiji Ota #pragma pack() 143c0dd49bdSEiji Ota #else 144*fe817b60SEiji Ota struct rds_info_counter { 145*fe817b60SEiji Ota u_int8_t name[32]; 146*fe817b60SEiji Ota u_int64_t value; 147c0dd49bdSEiji Ota }; 148c0dd49bdSEiji Ota #endif 149c0dd49bdSEiji Ota 150*fe817b60SEiji Ota #define RDS_INFO_CONNECTION_FLAG_SENDING 0x01 151*fe817b60SEiji Ota #define RDS_INFO_CONNECTION_FLAG_CONNECTING 0x02 152*fe817b60SEiji Ota #define RDS_INFO_CONNECTION_FLAG_CONNECTED 0x04 153c0dd49bdSEiji Ota 154cadbfdc3SEiji Ota #define TRANSNAMSIZ 16 155cadbfdc3SEiji Ota 156c0dd49bdSEiji Ota #ifndef __lock_lint 157c0dd49bdSEiji Ota #pragma pack(1) 158*fe817b60SEiji Ota struct rds_info_connection { 159*fe817b60SEiji Ota u_int64_t next_tx_seq; 160*fe817b60SEiji Ota u_int64_t next_rx_seq; 161*fe817b60SEiji Ota u_int32_t laddr; 162*fe817b60SEiji Ota u_int32_t faddr; 163*fe817b60SEiji Ota u_int8_t transport[TRANSNAMSIZ]; /* null term ascii */ 164*fe817b60SEiji Ota u_int8_t flags; 165c0dd49bdSEiji Ota } __attribute__((packed)); 166c0dd49bdSEiji Ota #pragma pack() 167c0dd49bdSEiji Ota #else 168*fe817b60SEiji Ota struct rds_info_connection { 169*fe817b60SEiji Ota u_int64_t next_tx_seq; 170*fe817b60SEiji Ota u_int64_t next_rx_seq; 171*fe817b60SEiji Ota u_int32_t laddr; 172*fe817b60SEiji Ota u_int32_t faddr; 173*fe817b60SEiji Ota u_int8_t transport[TRANSNAMSIZ]; /* null term ascii */ 174*fe817b60SEiji Ota u_int8_t flags; 175c0dd49bdSEiji Ota }; 176c0dd49bdSEiji Ota #endif 177c0dd49bdSEiji Ota 178c0dd49bdSEiji Ota #ifndef __lock_lint 179c0dd49bdSEiji Ota #pragma pack(1) 180*fe817b60SEiji Ota struct rds_info_flow { 181*fe817b60SEiji Ota u_int32_t laddr; 182*fe817b60SEiji Ota u_int32_t faddr; 183*fe817b60SEiji Ota u_int32_t bytes; 184*fe817b60SEiji Ota u_int16_t lport; 185*fe817b60SEiji Ota u_int16_t fport; 186c0dd49bdSEiji Ota } __attribute__((packed)); 187c0dd49bdSEiji Ota #pragma pack() 188c0dd49bdSEiji Ota #else 189*fe817b60SEiji Ota struct rds_info_flow { 190*fe817b60SEiji Ota u_int32_t laddr; 191*fe817b60SEiji Ota u_int32_t faddr; 192*fe817b60SEiji Ota u_int32_t bytes; 193*fe817b60SEiji Ota u_int16_t lport; 194*fe817b60SEiji Ota u_int16_t fport; 195c0dd49bdSEiji Ota }; 196c0dd49bdSEiji Ota #endif 197c0dd49bdSEiji Ota 198*fe817b60SEiji Ota #define RDS_INFO_MESSAGE_FLAG_ACK 0x01 199*fe817b60SEiji Ota #define RDS_INFO_MESSAGE_FLAG_FAST_ACK 0x02 200c0dd49bdSEiji Ota 201c0dd49bdSEiji Ota #ifndef __lock_lint 202c0dd49bdSEiji Ota #pragma pack(1) 203*fe817b60SEiji Ota struct rds_info_message { 204*fe817b60SEiji Ota u_int64_t seq; 205*fe817b60SEiji Ota u_int32_t len; 206*fe817b60SEiji Ota u_int32_t laddr; 207*fe817b60SEiji Ota u_int32_t faddr; 208*fe817b60SEiji Ota u_int16_t lport; 209*fe817b60SEiji Ota u_int16_t fport; 210*fe817b60SEiji Ota u_int8_t flags; 211c0dd49bdSEiji Ota } __attribute__((packed)); 212c0dd49bdSEiji Ota #pragma pack() 213c0dd49bdSEiji Ota #else 214*fe817b60SEiji Ota struct rds_info_message { 215*fe817b60SEiji Ota u_int64_t seq; 216*fe817b60SEiji Ota u_int32_t len; 217*fe817b60SEiji Ota u_int32_t laddr; 218*fe817b60SEiji Ota u_int32_t faddr; 219*fe817b60SEiji Ota u_int16_t lport; 220*fe817b60SEiji Ota u_int16_t fport; 221*fe817b60SEiji Ota u_int8_t flags; 222c0dd49bdSEiji Ota }; 223c0dd49bdSEiji Ota #endif 224c0dd49bdSEiji Ota 225c0dd49bdSEiji Ota #ifndef __lock_lint 226c0dd49bdSEiji Ota #pragma pack(1) 227*fe817b60SEiji Ota struct rds_info_socket { 228*fe817b60SEiji Ota u_int32_t sndbuf; 229*fe817b60SEiji Ota u_int32_t bound_addr; 230*fe817b60SEiji Ota u_int32_t connected_addr; 231*fe817b60SEiji Ota u_int16_t bound_port; 232*fe817b60SEiji Ota u_int16_t connected_port; 233*fe817b60SEiji Ota u_int32_t rcvbuf; 234*fe817b60SEiji Ota u_int64_t inum; 235c0dd49bdSEiji Ota } __attribute__((packed)); 236c0dd49bdSEiji Ota #pragma pack() 237c0dd49bdSEiji Ota #else 238*fe817b60SEiji Ota struct rds_info_socket { 239*fe817b60SEiji Ota u_int32_t sndbuf; 240*fe817b60SEiji Ota u_int32_t bound_addr; 241*fe817b60SEiji Ota u_int32_t connected_addr; 242*fe817b60SEiji Ota u_int16_t bound_port; 243*fe817b60SEiji Ota u_int16_t connected_port; 244*fe817b60SEiji Ota u_int32_t rcvbuf; 245*fe817b60SEiji Ota u_int64_t inum; 246c0dd49bdSEiji Ota }; 247c0dd49bdSEiji Ota #endif 248c0dd49bdSEiji Ota 249c0dd49bdSEiji Ota #ifndef __lock_lint 250c0dd49bdSEiji Ota #pragma pack(1) 251*fe817b60SEiji Ota struct rds_info_tcp_socket { 252*fe817b60SEiji Ota u_int32_t local_addr; 253*fe817b60SEiji Ota u_int16_t local_port; 254*fe817b60SEiji Ota u_int32_t peer_addr; 255*fe817b60SEiji Ota u_int16_t peer_port; 256*fe817b60SEiji Ota u_int64_t hdr_rem; 257*fe817b60SEiji Ota u_int64_t data_rem; 258*fe817b60SEiji Ota u_int32_t last_sent_nxt; 259*fe817b60SEiji Ota u_int32_t last_expected_una; 260*fe817b60SEiji Ota u_int32_t last_seen_una; 261c0dd49bdSEiji Ota } __attribute__((packed)); 262c0dd49bdSEiji Ota #pragma pack() 263c0dd49bdSEiji Ota #else 264*fe817b60SEiji Ota struct rds_info_tcp_socket { 265*fe817b60SEiji Ota u_int32_t local_addr; 266*fe817b60SEiji Ota u_int16_t local_port; 267*fe817b60SEiji Ota u_int32_t peer_addr; 268*fe817b60SEiji Ota u_int16_t peer_port; 269*fe817b60SEiji Ota u_int64_t hdr_rem; 270*fe817b60SEiji Ota u_int64_t data_rem; 271*fe817b60SEiji Ota u_int32_t last_sent_nxt; 272*fe817b60SEiji Ota u_int32_t last_expected_una; 273*fe817b60SEiji Ota u_int32_t last_seen_una; 274*fe817b60SEiji Ota } __attribute__((packed)); 275c0dd49bdSEiji Ota }; 276c0dd49bdSEiji Ota #endif 277c0dd49bdSEiji Ota 278c0dd49bdSEiji Ota #define RDS_IB_GID_LEN 16 279*fe817b60SEiji Ota struct rds_info_rdma_connection { 280*fe817b60SEiji Ota u_int32_t src_addr; 281*fe817b60SEiji Ota u_int32_t dst_addr; 282c0dd49bdSEiji Ota uint8_t src_gid[RDS_IB_GID_LEN]; 283c0dd49bdSEiji Ota uint8_t dst_gid[RDS_IB_GID_LEN]; 284c0dd49bdSEiji Ota 285c0dd49bdSEiji Ota uint32_t max_send_wr; 286c0dd49bdSEiji Ota uint32_t max_recv_wr; 287c0dd49bdSEiji Ota uint32_t max_send_sge; 288c0dd49bdSEiji Ota uint32_t rdma_mr_max; 289c0dd49bdSEiji Ota uint32_t rdma_mr_size; 290c0dd49bdSEiji Ota }; 291c0dd49bdSEiji Ota 292cadbfdc3SEiji Ota /* 293cadbfdc3SEiji Ota * Congestion monitoring. 294cadbfdc3SEiji Ota * Congestion control in RDS happens at the host connection 295cadbfdc3SEiji Ota * level by exchanging a bitmap marking congested ports. 296cadbfdc3SEiji Ota * By default, a process sleeping in poll() is always woken 297cadbfdc3SEiji Ota * up when the congestion map is updated. 298cadbfdc3SEiji Ota * With explicit monitoring, an application can have more 299cadbfdc3SEiji Ota * fine-grained control. 300cadbfdc3SEiji Ota * The application installs a 64bit mask value in the socket, 301cadbfdc3SEiji Ota * where each bit corresponds to a group of ports. 302cadbfdc3SEiji Ota * When a congestion update arrives, RDS checks the set of 303cadbfdc3SEiji Ota * ports that are now uncongested against the list bit mask 304cadbfdc3SEiji Ota * installed in the socket, and if they overlap, we queue a 305cadbfdc3SEiji Ota * cong_notification on the socket. 306cadbfdc3SEiji Ota * 307cadbfdc3SEiji Ota * To install the congestion monitor bitmask, use RDS_CONG_MONITOR 308cadbfdc3SEiji Ota * with the 64bit mask. 309cadbfdc3SEiji Ota * Congestion updates are received via RDS_CMSG_CONG_UPDATE 310cadbfdc3SEiji Ota * control messages. 311cadbfdc3SEiji Ota * 312cadbfdc3SEiji Ota * The correspondence between bits and ports is 313cadbfdc3SEiji Ota * 1 << (portnum % 64) 314cadbfdc3SEiji Ota */ 315*fe817b60SEiji Ota #define RDS_CONG_MONITOR_SIZE 64 316*fe817b60SEiji Ota #define RDS_CONG_MONITOR_BIT(port) \ 317*fe817b60SEiji Ota (((unsigned int) port) % RDS_CONG_MONITOR_SIZE) 318*fe817b60SEiji Ota #define RDS_CONG_MONITOR_MASK(port) (1ULL << RDS_CONG_MONITOR_BIT(port)) 319cadbfdc3SEiji Ota 320cadbfdc3SEiji Ota /* 321cadbfdc3SEiji Ota * RDMA related types 322cadbfdc3SEiji Ota */ 323cadbfdc3SEiji Ota 324cadbfdc3SEiji Ota /* 325cadbfdc3SEiji Ota * This encapsulates a remote memory location. 326cadbfdc3SEiji Ota * In the current implementation, it contains the R_Key 327cadbfdc3SEiji Ota * of the remote memory region, and the offset into it 328cadbfdc3SEiji Ota * (so that the application does not have to worry about 329cadbfdc3SEiji Ota * alignment). 330cadbfdc3SEiji Ota */ 331*fe817b60SEiji Ota typedef u_int64_t rds_rdma_cookie_t; 332cadbfdc3SEiji Ota 333*fe817b60SEiji Ota struct rds_iovec { 334*fe817b60SEiji Ota u_int64_t addr; 335*fe817b60SEiji Ota u_int64_t bytes; 336cadbfdc3SEiji Ota }; 337cadbfdc3SEiji Ota 338*fe817b60SEiji Ota struct rds_get_mr_args { 339*fe817b60SEiji Ota struct rds_iovec vec; 340*fe817b60SEiji Ota u_int64_t cookie_addr; 341cadbfdc3SEiji Ota uint64_t flags; 342cadbfdc3SEiji Ota }; 343cadbfdc3SEiji Ota 344*fe817b60SEiji Ota struct rds_get_mr_for_dest_args { 345*fe817b60SEiji Ota struct sockaddr_storage dest_addr; 346*fe817b60SEiji Ota struct rds_iovec vec; 347*fe817b60SEiji Ota u_int64_t cookie_addr; 348cadbfdc3SEiji Ota uint64_t flags; 349cadbfdc3SEiji Ota }; 350cadbfdc3SEiji Ota 351*fe817b60SEiji Ota 352*fe817b60SEiji Ota struct rds_free_mr_args { 353*fe817b60SEiji Ota rds_rdma_cookie_t cookie; 354*fe817b60SEiji Ota u_int64_t flags; 355cadbfdc3SEiji Ota }; 356cadbfdc3SEiji Ota 357*fe817b60SEiji Ota struct rds_rdma_args { 358*fe817b60SEiji Ota rds_rdma_cookie_t cookie; 359*fe817b60SEiji Ota struct rds_iovec remote_vec; 360*fe817b60SEiji Ota u_int64_t local_vec_addr; 361*fe817b60SEiji Ota u_int64_t nr_local; 362*fe817b60SEiji Ota u_int64_t flags; 363*fe817b60SEiji Ota u_int64_t user_token; 364cadbfdc3SEiji Ota }; 365cadbfdc3SEiji Ota 366*fe817b60SEiji Ota struct rds_rdma_notify { 367*fe817b60SEiji Ota u_int64_t user_token; 368cadbfdc3SEiji Ota int32_t status; 369cadbfdc3SEiji Ota }; 370cadbfdc3SEiji Ota 371*fe817b60SEiji Ota #define RDS_RDMA_SUCCESS 0 372*fe817b60SEiji Ota #define RDS_RDMA_REMOTE_ERROR 1 373*fe817b60SEiji Ota #define RDS_RDMA_CANCELED 2 374*fe817b60SEiji Ota #define RDS_RDMA_DROPPED 3 375*fe817b60SEiji Ota #define RDS_RDMA_OTHER_ERROR 4 376cadbfdc3SEiji Ota 377cadbfdc3SEiji Ota /* 378cadbfdc3SEiji Ota * Common set of flags for all RDMA related structs 379cadbfdc3SEiji Ota */ 380*fe817b60SEiji Ota #define RDS_RDMA_READWRITE 0x0001 381*fe817b60SEiji Ota #define RDS_RDMA_FENCE 0x0002 /* use FENCE for immediate send */ 382*fe817b60SEiji Ota #define RDS_RDMA_INVALIDATE 0x0004 /* invalidate R_Key after freeing MR */ 383*fe817b60SEiji Ota #define RDS_RDMA_USE_ONCE 0x0008 /* free MR after use */ 384*fe817b60SEiji Ota #define RDS_RDMA_DONTWAIT 0x0010 /* Don't wait in SET_BARRIER */ 385*fe817b60SEiji Ota #define RDS_RDMA_NOTIFY_ME 0x0020 /* Notify when operation completes */ 386cadbfdc3SEiji Ota 387c0dd49bdSEiji Ota #ifdef __cplusplus 388c0dd49bdSEiji Ota } 389c0dd49bdSEiji Ota #endif 390c0dd49bdSEiji Ota 391*fe817b60SEiji Ota #endif /* _SYS_RDS_H */ 392