xref: /linux/include/uapi/linux/rds.h (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
1d50e14abSJason Gunthorpe /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */
2607ca46eSDavid Howells /*
3b7ff8b10SKa-Cheong Poon  * Copyright (c) 2008, 2018 Oracle and/or its affiliates. All rights reserved.
4607ca46eSDavid Howells  *
5607ca46eSDavid Howells  * This software is available to you under a choice of one of two
6607ca46eSDavid Howells  * licenses.  You may choose to be licensed under the terms of the GNU
7607ca46eSDavid Howells  * General Public License (GPL) Version 2, available from the file
8607ca46eSDavid Howells  * COPYING in the main directory of this source tree, or the
9607ca46eSDavid Howells  * OpenIB.org BSD license below:
10607ca46eSDavid Howells  *
11607ca46eSDavid Howells  *     Redistribution and use in source and binary forms, with or
12607ca46eSDavid Howells  *     without modification, are permitted provided that the following
13607ca46eSDavid Howells  *     conditions are met:
14607ca46eSDavid Howells  *
15607ca46eSDavid Howells  *      - Redistributions of source code must retain the above
16607ca46eSDavid Howells  *        copyright notice, this list of conditions and the following
17607ca46eSDavid Howells  *        disclaimer.
18607ca46eSDavid Howells  *
19607ca46eSDavid Howells  *      - Redistributions in binary form must reproduce the above
20607ca46eSDavid Howells  *        copyright notice, this list of conditions and the following
21607ca46eSDavid Howells  *        disclaimer in the documentation and/or other materials
22607ca46eSDavid Howells  *        provided with the distribution.
23607ca46eSDavid Howells  *
24607ca46eSDavid Howells  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25607ca46eSDavid Howells  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26607ca46eSDavid Howells  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27607ca46eSDavid Howells  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28607ca46eSDavid Howells  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29607ca46eSDavid Howells  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30607ca46eSDavid Howells  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31607ca46eSDavid Howells  * SOFTWARE.
32607ca46eSDavid Howells  *
33607ca46eSDavid Howells  */
34607ca46eSDavid Howells 
35607ca46eSDavid Howells #ifndef _LINUX_RDS_H
36607ca46eSDavid Howells #define _LINUX_RDS_H
37607ca46eSDavid Howells 
38607ca46eSDavid Howells #include <linux/types.h>
391786dbf3SDmitry V. Levin #include <linux/socket.h>		/* For __kernel_sockaddr_storage. */
4059a03feaSVinson Lee #include <linux/in6.h>			/* For struct in6_addr. */
41607ca46eSDavid Howells 
42607ca46eSDavid Howells #define RDS_IB_ABI_VERSION		0x301
43607ca46eSDavid Howells 
44a28c257cSSowmini Varadhan #define	SOL_RDS		276
45a28c257cSSowmini Varadhan 
46607ca46eSDavid Howells /*
47607ca46eSDavid Howells  * setsockopt/getsockopt for SOL_RDS
48607ca46eSDavid Howells  */
49607ca46eSDavid Howells #define RDS_CANCEL_SENT_TO      	1
50607ca46eSDavid Howells #define RDS_GET_MR			2
51607ca46eSDavid Howells #define RDS_FREE_MR			3
52607ca46eSDavid Howells /* deprecated: RDS_BARRIER 4 */
53607ca46eSDavid Howells #define RDS_RECVERR			5
54607ca46eSDavid Howells #define RDS_CONG_MONITOR		6
55607ca46eSDavid Howells #define RDS_GET_MR_FOR_DEST		7
56a28c257cSSowmini Varadhan #define SO_RDS_TRANSPORT		8
57a28c257cSSowmini Varadhan 
583289025aSSantosh Shilimkar /* Socket option to tap receive path latency
593289025aSSantosh Shilimkar  *	SO_RDS: SO_RDS_MSG_RXPATH_LATENCY
603289025aSSantosh Shilimkar  *	Format used struct rds_rx_trace_so
613289025aSSantosh Shilimkar  */
623289025aSSantosh Shilimkar #define SO_RDS_MSG_RXPATH_LATENCY	10
633289025aSSantosh Shilimkar 
643289025aSSantosh Shilimkar 
65a28c257cSSowmini Varadhan /* supported values for SO_RDS_TRANSPORT */
66a28c257cSSowmini Varadhan #define	RDS_TRANS_IB	0
67*4c342f77SRao Shoaib #define	RDS_TRANS_GAP	1
68a28c257cSSowmini Varadhan #define	RDS_TRANS_TCP	2
69a28c257cSSowmini Varadhan #define RDS_TRANS_COUNT	3
70a28c257cSSowmini Varadhan #define	RDS_TRANS_NONE	(~0)
71*4c342f77SRao Shoaib /* don't use RDS_TRANS_IWARP - it is deprecated */
72*4c342f77SRao Shoaib #define RDS_TRANS_IWARP RDS_TRANS_GAP
73607ca46eSDavid Howells 
743eb45036SSantosh Shilimkar /* IOCTLS commands for SOL_RDS */
753eb45036SSantosh Shilimkar #define SIOCRDSSETTOS		(SIOCPROTOPRIVATE)
763eb45036SSantosh Shilimkar #define SIOCRDSGETTOS		(SIOCPROTOPRIVATE + 1)
773eb45036SSantosh Shilimkar 
783eb45036SSantosh Shilimkar typedef __u8	rds_tos_t;
793eb45036SSantosh Shilimkar 
80607ca46eSDavid Howells /*
81607ca46eSDavid Howells  * Control message types for SOL_RDS.
82607ca46eSDavid Howells  *
83607ca46eSDavid Howells  * CMSG_RDMA_ARGS (sendmsg)
84607ca46eSDavid Howells  *	Request a RDMA transfer to/from the specified
85607ca46eSDavid Howells  *	memory ranges.
86607ca46eSDavid Howells  *	The cmsg_data is a struct rds_rdma_args.
87607ca46eSDavid Howells  * RDS_CMSG_RDMA_DEST (recvmsg, sendmsg)
88607ca46eSDavid Howells  *	Kernel informs application about intended
89607ca46eSDavid Howells  *	source/destination of a RDMA transfer
90607ca46eSDavid Howells  * RDS_CMSG_RDMA_MAP (sendmsg)
91607ca46eSDavid Howells  *	Application asks kernel to map the given
92607ca46eSDavid Howells  *	memory range into a IB MR, and send the
93607ca46eSDavid Howells  *	R_Key along in an RDS extension header.
94607ca46eSDavid Howells  *	The cmsg_data is a struct rds_get_mr_args,
95607ca46eSDavid Howells  *	the same as for the GET_MR setsockopt.
96607ca46eSDavid Howells  * RDS_CMSG_RDMA_STATUS (recvmsg)
97607ca46eSDavid Howells  *	Returns the status of a completed RDMA operation.
983289025aSSantosh Shilimkar  * RDS_CMSG_RXPATH_LATENCY(recvmsg)
993289025aSSantosh Shilimkar  *	Returns rds message latencies in various stages of receive
1003289025aSSantosh Shilimkar  *	path in nS. Its set per socket using SO_RDS_MSG_RXPATH_LATENCY
1013289025aSSantosh Shilimkar  *	socket option. Legitimate points are defined in
1023289025aSSantosh Shilimkar  *	enum rds_message_rxpath_latency. More points can be added in
1033289025aSSantosh Shilimkar  *	future. CSMG format is struct rds_cmsg_rx_trace.
104607ca46eSDavid Howells  */
105607ca46eSDavid Howells #define RDS_CMSG_RDMA_ARGS		1
106607ca46eSDavid Howells #define RDS_CMSG_RDMA_DEST		2
107607ca46eSDavid Howells #define RDS_CMSG_RDMA_MAP		3
108607ca46eSDavid Howells #define RDS_CMSG_RDMA_STATUS		4
109607ca46eSDavid Howells #define RDS_CMSG_CONG_UPDATE		5
110607ca46eSDavid Howells #define RDS_CMSG_ATOMIC_FADD		6
111607ca46eSDavid Howells #define RDS_CMSG_ATOMIC_CSWP		7
112607ca46eSDavid Howells #define RDS_CMSG_MASKED_ATOMIC_FADD	8
113607ca46eSDavid Howells #define RDS_CMSG_MASKED_ATOMIC_CSWP	9
1143289025aSSantosh Shilimkar #define RDS_CMSG_RXPATH_LATENCY		11
1150cebacceSSowmini Varadhan #define	RDS_CMSG_ZCOPY_COOKIE		12
116401910dbSSowmini Varadhan #define	RDS_CMSG_ZCOPY_COMPLETION	13
117607ca46eSDavid Howells 
118607ca46eSDavid Howells #define RDS_INFO_FIRST			10000
119607ca46eSDavid Howells #define RDS_INFO_COUNTERS		10000
120607ca46eSDavid Howells #define RDS_INFO_CONNECTIONS		10001
121607ca46eSDavid Howells /* 10002 aka RDS_INFO_FLOWS is deprecated */
122607ca46eSDavid Howells #define RDS_INFO_SEND_MESSAGES		10003
123607ca46eSDavid Howells #define RDS_INFO_RETRANS_MESSAGES       10004
124607ca46eSDavid Howells #define RDS_INFO_RECV_MESSAGES          10005
125607ca46eSDavid Howells #define RDS_INFO_SOCKETS                10006
126607ca46eSDavid Howells #define RDS_INFO_TCP_SOCKETS            10007
127607ca46eSDavid Howells #define RDS_INFO_IB_CONNECTIONS		10008
128607ca46eSDavid Howells #define RDS_INFO_CONNECTION_STATS	10009
129607ca46eSDavid Howells #define RDS_INFO_IWARP_CONNECTIONS	10010
130b7ff8b10SKa-Cheong Poon 
131b7ff8b10SKa-Cheong Poon /* PF_RDS6 options */
132b7ff8b10SKa-Cheong Poon #define RDS6_INFO_CONNECTIONS		10011
133b7ff8b10SKa-Cheong Poon #define RDS6_INFO_SEND_MESSAGES		10012
134b7ff8b10SKa-Cheong Poon #define RDS6_INFO_RETRANS_MESSAGES	10013
135b7ff8b10SKa-Cheong Poon #define RDS6_INFO_RECV_MESSAGES		10014
136b7ff8b10SKa-Cheong Poon #define RDS6_INFO_SOCKETS		10015
137b7ff8b10SKa-Cheong Poon #define RDS6_INFO_TCP_SOCKETS		10016
138b7ff8b10SKa-Cheong Poon #define RDS6_INFO_IB_CONNECTIONS	10017
139b7ff8b10SKa-Cheong Poon 
140b7ff8b10SKa-Cheong Poon #define RDS_INFO_LAST			10017
141607ca46eSDavid Howells 
142607ca46eSDavid Howells struct rds_info_counter {
143feb0869dSDmitry V. Levin 	__u8	name[32];
144feb0869dSDmitry V. Levin 	__u64	value;
145607ca46eSDavid Howells } __attribute__((packed));
146607ca46eSDavid Howells 
147607ca46eSDavid Howells #define RDS_INFO_CONNECTION_FLAG_SENDING	0x01
148607ca46eSDavid Howells #define RDS_INFO_CONNECTION_FLAG_CONNECTING	0x02
149607ca46eSDavid Howells #define RDS_INFO_CONNECTION_FLAG_CONNECTED	0x04
150607ca46eSDavid Howells 
151607ca46eSDavid Howells #define TRANSNAMSIZ	16
152607ca46eSDavid Howells 
153607ca46eSDavid Howells struct rds_info_connection {
154feb0869dSDmitry V. Levin 	__u64		next_tx_seq;
155feb0869dSDmitry V. Levin 	__u64		next_rx_seq;
156607ca46eSDavid Howells 	__be32		laddr;
157607ca46eSDavid Howells 	__be32		faddr;
158feb0869dSDmitry V. Levin 	__u8		transport[TRANSNAMSIZ];		/* null term ascii */
159feb0869dSDmitry V. Levin 	__u8		flags;
1603eb45036SSantosh Shilimkar 	__u8		tos;
161607ca46eSDavid Howells } __attribute__((packed));
162607ca46eSDavid Howells 
163b7ff8b10SKa-Cheong Poon struct rds6_info_connection {
164b7ff8b10SKa-Cheong Poon 	__u64		next_tx_seq;
165b7ff8b10SKa-Cheong Poon 	__u64		next_rx_seq;
166b7ff8b10SKa-Cheong Poon 	struct in6_addr	laddr;
167b7ff8b10SKa-Cheong Poon 	struct in6_addr	faddr;
168b7ff8b10SKa-Cheong Poon 	__u8		transport[TRANSNAMSIZ];		/* null term ascii */
169b7ff8b10SKa-Cheong Poon 	__u8		flags;
170b7ff8b10SKa-Cheong Poon } __attribute__((packed));
171b7ff8b10SKa-Cheong Poon 
172607ca46eSDavid Howells #define RDS_INFO_MESSAGE_FLAG_ACK               0x01
173607ca46eSDavid Howells #define RDS_INFO_MESSAGE_FLAG_FAST_ACK          0x02
174607ca46eSDavid Howells 
175607ca46eSDavid Howells struct rds_info_message {
176feb0869dSDmitry V. Levin 	__u64		seq;
177feb0869dSDmitry V. Levin 	__u32		len;
178607ca46eSDavid Howells 	__be32		laddr;
179607ca46eSDavid Howells 	__be32		faddr;
180607ca46eSDavid Howells 	__be16		lport;
181607ca46eSDavid Howells 	__be16		fport;
182feb0869dSDmitry V. Levin 	__u8		flags;
1833eb45036SSantosh Shilimkar 	__u8		tos;
184607ca46eSDavid Howells } __attribute__((packed));
185607ca46eSDavid Howells 
186b7ff8b10SKa-Cheong Poon struct rds6_info_message {
187b7ff8b10SKa-Cheong Poon 	__u64	seq;
188b7ff8b10SKa-Cheong Poon 	__u32	len;
189b7ff8b10SKa-Cheong Poon 	struct in6_addr	laddr;
190b7ff8b10SKa-Cheong Poon 	struct in6_addr	faddr;
191b7ff8b10SKa-Cheong Poon 	__be16		lport;
192b7ff8b10SKa-Cheong Poon 	__be16		fport;
193b7ff8b10SKa-Cheong Poon 	__u8		flags;
194b7ff8b10SKa-Cheong Poon 	__u8		tos;
195b7ff8b10SKa-Cheong Poon } __attribute__((packed));
196b7ff8b10SKa-Cheong Poon 
197607ca46eSDavid Howells struct rds_info_socket {
198feb0869dSDmitry V. Levin 	__u32		sndbuf;
199607ca46eSDavid Howells 	__be32		bound_addr;
200607ca46eSDavid Howells 	__be32		connected_addr;
201607ca46eSDavid Howells 	__be16		bound_port;
202607ca46eSDavid Howells 	__be16		connected_port;
203feb0869dSDmitry V. Levin 	__u32		rcvbuf;
204feb0869dSDmitry V. Levin 	__u64		inum;
205607ca46eSDavid Howells } __attribute__((packed));
206607ca46eSDavid Howells 
207b7ff8b10SKa-Cheong Poon struct rds6_info_socket {
208b7ff8b10SKa-Cheong Poon 	__u32		sndbuf;
209b7ff8b10SKa-Cheong Poon 	struct in6_addr	bound_addr;
210b7ff8b10SKa-Cheong Poon 	struct in6_addr	connected_addr;
211b7ff8b10SKa-Cheong Poon 	__be16		bound_port;
212b7ff8b10SKa-Cheong Poon 	__be16		connected_port;
213b7ff8b10SKa-Cheong Poon 	__u32		rcvbuf;
214b7ff8b10SKa-Cheong Poon 	__u64		inum;
215b7ff8b10SKa-Cheong Poon } __attribute__((packed));
216b7ff8b10SKa-Cheong Poon 
217607ca46eSDavid Howells struct rds_info_tcp_socket {
218607ca46eSDavid Howells 	__be32          local_addr;
219607ca46eSDavid Howells 	__be16          local_port;
220607ca46eSDavid Howells 	__be32          peer_addr;
221607ca46eSDavid Howells 	__be16          peer_port;
222feb0869dSDmitry V. Levin 	__u64           hdr_rem;
223feb0869dSDmitry V. Levin 	__u64           data_rem;
224feb0869dSDmitry V. Levin 	__u32           last_sent_nxt;
225feb0869dSDmitry V. Levin 	__u32           last_expected_una;
226feb0869dSDmitry V. Levin 	__u32           last_seen_una;
2273eb45036SSantosh Shilimkar 	__u8		tos;
228607ca46eSDavid Howells } __attribute__((packed));
229607ca46eSDavid Howells 
230b7ff8b10SKa-Cheong Poon struct rds6_info_tcp_socket {
231b7ff8b10SKa-Cheong Poon 	struct in6_addr	local_addr;
232b7ff8b10SKa-Cheong Poon 	__be16		local_port;
233b7ff8b10SKa-Cheong Poon 	struct in6_addr	peer_addr;
234b7ff8b10SKa-Cheong Poon 	__be16		peer_port;
235b7ff8b10SKa-Cheong Poon 	__u64		hdr_rem;
236b7ff8b10SKa-Cheong Poon 	__u64		data_rem;
237b7ff8b10SKa-Cheong Poon 	__u32		last_sent_nxt;
238b7ff8b10SKa-Cheong Poon 	__u32		last_expected_una;
239b7ff8b10SKa-Cheong Poon 	__u32		last_seen_una;
240b7ff8b10SKa-Cheong Poon } __attribute__((packed));
241b7ff8b10SKa-Cheong Poon 
242607ca46eSDavid Howells #define RDS_IB_GID_LEN	16
243607ca46eSDavid Howells struct rds_info_rdma_connection {
244607ca46eSDavid Howells 	__be32		src_addr;
245607ca46eSDavid Howells 	__be32		dst_addr;
246feb0869dSDmitry V. Levin 	__u8		src_gid[RDS_IB_GID_LEN];
247feb0869dSDmitry V. Levin 	__u8		dst_gid[RDS_IB_GID_LEN];
248607ca46eSDavid Howells 
249feb0869dSDmitry V. Levin 	__u32		max_send_wr;
250feb0869dSDmitry V. Levin 	__u32		max_recv_wr;
251feb0869dSDmitry V. Levin 	__u32		max_send_sge;
252feb0869dSDmitry V. Levin 	__u32		rdma_mr_max;
253feb0869dSDmitry V. Levin 	__u32		rdma_mr_size;
2543eb45036SSantosh Shilimkar 	__u8		tos;
255e0e6d062SZhu Yanjun 	__u8		sl;
256fe3475afSZhu Yanjun 	__u32		cache_allocs;
257607ca46eSDavid Howells };
258607ca46eSDavid Howells 
259b7ff8b10SKa-Cheong Poon struct rds6_info_rdma_connection {
260b7ff8b10SKa-Cheong Poon 	struct in6_addr	src_addr;
261b7ff8b10SKa-Cheong Poon 	struct in6_addr	dst_addr;
262b7ff8b10SKa-Cheong Poon 	__u8		src_gid[RDS_IB_GID_LEN];
263b7ff8b10SKa-Cheong Poon 	__u8		dst_gid[RDS_IB_GID_LEN];
264b7ff8b10SKa-Cheong Poon 
265b7ff8b10SKa-Cheong Poon 	__u32		max_send_wr;
266b7ff8b10SKa-Cheong Poon 	__u32		max_recv_wr;
267b7ff8b10SKa-Cheong Poon 	__u32		max_send_sge;
268b7ff8b10SKa-Cheong Poon 	__u32		rdma_mr_max;
269b7ff8b10SKa-Cheong Poon 	__u32		rdma_mr_size;
2703eb45036SSantosh Shilimkar 	__u8		tos;
271e0e6d062SZhu Yanjun 	__u8		sl;
272fe3475afSZhu Yanjun 	__u32		cache_allocs;
273b7ff8b10SKa-Cheong Poon };
274b7ff8b10SKa-Cheong Poon 
2753289025aSSantosh Shilimkar /* RDS message Receive Path Latency points */
2763289025aSSantosh Shilimkar enum rds_message_rxpath_latency {
2773289025aSSantosh Shilimkar 	RDS_MSG_RX_HDR_TO_DGRAM_START = 0,
2783289025aSSantosh Shilimkar 	RDS_MSG_RX_DGRAM_REASSEMBLE,
2793289025aSSantosh Shilimkar 	RDS_MSG_RX_DGRAM_DELIVERED,
2803289025aSSantosh Shilimkar 	RDS_MSG_RX_DGRAM_TRACE_MAX
2813289025aSSantosh Shilimkar };
2823289025aSSantosh Shilimkar 
2833289025aSSantosh Shilimkar struct rds_rx_trace_so {
284c12f4d76SDmitry V. Levin 	__u8 rx_traces;
285c12f4d76SDmitry V. Levin 	__u8 rx_trace_pos[RDS_MSG_RX_DGRAM_TRACE_MAX];
2863289025aSSantosh Shilimkar };
2873289025aSSantosh Shilimkar 
2883289025aSSantosh Shilimkar struct rds_cmsg_rx_trace {
289c12f4d76SDmitry V. Levin 	__u8 rx_traces;
290c12f4d76SDmitry V. Levin 	__u8 rx_trace_pos[RDS_MSG_RX_DGRAM_TRACE_MAX];
291c12f4d76SDmitry V. Levin 	__u64 rx_trace[RDS_MSG_RX_DGRAM_TRACE_MAX];
2923289025aSSantosh Shilimkar };
2933289025aSSantosh Shilimkar 
294607ca46eSDavid Howells /*
295607ca46eSDavid Howells  * Congestion monitoring.
296607ca46eSDavid Howells  * Congestion control in RDS happens at the host connection
297607ca46eSDavid Howells  * level by exchanging a bitmap marking congested ports.
298607ca46eSDavid Howells  * By default, a process sleeping in poll() is always woken
299607ca46eSDavid Howells  * up when the congestion map is updated.
300607ca46eSDavid Howells  * With explicit monitoring, an application can have more
301607ca46eSDavid Howells  * fine-grained control.
302607ca46eSDavid Howells  * The application installs a 64bit mask value in the socket,
303607ca46eSDavid Howells  * where each bit corresponds to a group of ports.
304607ca46eSDavid Howells  * When a congestion update arrives, RDS checks the set of
305607ca46eSDavid Howells  * ports that are now uncongested against the list bit mask
306607ca46eSDavid Howells  * installed in the socket, and if they overlap, we queue a
307607ca46eSDavid Howells  * cong_notification on the socket.
308607ca46eSDavid Howells  *
309607ca46eSDavid Howells  * To install the congestion monitor bitmask, use RDS_CONG_MONITOR
310607ca46eSDavid Howells  * with the 64bit mask.
311607ca46eSDavid Howells  * Congestion updates are received via RDS_CMSG_CONG_UPDATE
312607ca46eSDavid Howells  * control messages.
313607ca46eSDavid Howells  *
314607ca46eSDavid Howells  * The correspondence between bits and ports is
315607ca46eSDavid Howells  *	1 << (portnum % 64)
316607ca46eSDavid Howells  */
317607ca46eSDavid Howells #define RDS_CONG_MONITOR_SIZE	64
318607ca46eSDavid Howells #define RDS_CONG_MONITOR_BIT(port)  (((unsigned int) port) % RDS_CONG_MONITOR_SIZE)
319607ca46eSDavid Howells #define RDS_CONG_MONITOR_MASK(port) (1ULL << RDS_CONG_MONITOR_BIT(port))
320607ca46eSDavid Howells 
321607ca46eSDavid Howells /*
322607ca46eSDavid Howells  * RDMA related types
323607ca46eSDavid Howells  */
324607ca46eSDavid Howells 
325607ca46eSDavid Howells /*
326607ca46eSDavid Howells  * This encapsulates a remote memory location.
327607ca46eSDavid Howells  * In the current implementation, it contains the R_Key
328607ca46eSDavid Howells  * of the remote memory region, and the offset into it
329607ca46eSDavid Howells  * (so that the application does not have to worry about
330607ca46eSDavid Howells  * alignment).
331607ca46eSDavid Howells  */
332feb0869dSDmitry V. Levin typedef __u64		rds_rdma_cookie_t;
333607ca46eSDavid Howells 
334607ca46eSDavid Howells struct rds_iovec {
335feb0869dSDmitry V. Levin 	__u64		addr;
336feb0869dSDmitry V. Levin 	__u64		bytes;
337607ca46eSDavid Howells };
338607ca46eSDavid Howells 
339607ca46eSDavid Howells struct rds_get_mr_args {
340607ca46eSDavid Howells 	struct rds_iovec vec;
341feb0869dSDmitry V. Levin 	__u64		cookie_addr;
342feb0869dSDmitry V. Levin 	__u64		flags;
343607ca46eSDavid Howells };
344607ca46eSDavid Howells 
345607ca46eSDavid Howells struct rds_get_mr_for_dest_args {
3461786dbf3SDmitry V. Levin 	struct __kernel_sockaddr_storage dest_addr;
347607ca46eSDavid Howells 	struct rds_iovec 	vec;
348feb0869dSDmitry V. Levin 	__u64			cookie_addr;
349feb0869dSDmitry V. Levin 	__u64			flags;
350607ca46eSDavid Howells };
351607ca46eSDavid Howells 
352607ca46eSDavid Howells struct rds_free_mr_args {
353607ca46eSDavid Howells 	rds_rdma_cookie_t cookie;
354feb0869dSDmitry V. Levin 	__u64		flags;
355607ca46eSDavid Howells };
356607ca46eSDavid Howells 
357607ca46eSDavid Howells struct rds_rdma_args {
358607ca46eSDavid Howells 	rds_rdma_cookie_t cookie;
359607ca46eSDavid Howells 	struct rds_iovec remote_vec;
360feb0869dSDmitry V. Levin 	__u64		local_vec_addr;
361feb0869dSDmitry V. Levin 	__u64		nr_local;
362feb0869dSDmitry V. Levin 	__u64		flags;
363feb0869dSDmitry V. Levin 	__u64		user_token;
364607ca46eSDavid Howells };
365607ca46eSDavid Howells 
366607ca46eSDavid Howells struct rds_atomic_args {
367607ca46eSDavid Howells 	rds_rdma_cookie_t cookie;
368feb0869dSDmitry V. Levin 	__u64		local_addr;
369feb0869dSDmitry V. Levin 	__u64		remote_addr;
370607ca46eSDavid Howells 	union {
371607ca46eSDavid Howells 		struct {
372feb0869dSDmitry V. Levin 			__u64		compare;
373feb0869dSDmitry V. Levin 			__u64		swap;
374607ca46eSDavid Howells 		} cswp;
375607ca46eSDavid Howells 		struct {
376feb0869dSDmitry V. Levin 			__u64		add;
377607ca46eSDavid Howells 		} fadd;
378607ca46eSDavid Howells 		struct {
379feb0869dSDmitry V. Levin 			__u64		compare;
380feb0869dSDmitry V. Levin 			__u64		swap;
381feb0869dSDmitry V. Levin 			__u64		compare_mask;
382feb0869dSDmitry V. Levin 			__u64		swap_mask;
383607ca46eSDavid Howells 		} m_cswp;
384607ca46eSDavid Howells 		struct {
385feb0869dSDmitry V. Levin 			__u64		add;
386feb0869dSDmitry V. Levin 			__u64		nocarry_mask;
387607ca46eSDavid Howells 		} m_fadd;
388607ca46eSDavid Howells 	};
389feb0869dSDmitry V. Levin 	__u64		flags;
390feb0869dSDmitry V. Levin 	__u64		user_token;
391607ca46eSDavid Howells };
392607ca46eSDavid Howells 
393607ca46eSDavid Howells struct rds_rdma_notify {
394feb0869dSDmitry V. Levin 	__u64		user_token;
395feb0869dSDmitry V. Levin 	__s32		status;
396607ca46eSDavid Howells };
397607ca46eSDavid Howells 
398607ca46eSDavid Howells #define RDS_RDMA_SUCCESS	0
399607ca46eSDavid Howells #define RDS_RDMA_REMOTE_ERROR	1
400607ca46eSDavid Howells #define RDS_RDMA_CANCELED	2
401607ca46eSDavid Howells #define RDS_RDMA_DROPPED	3
402607ca46eSDavid Howells #define RDS_RDMA_OTHER_ERROR	4
403607ca46eSDavid Howells 
404401910dbSSowmini Varadhan #define	RDS_MAX_ZCOOKIES	8
405401910dbSSowmini Varadhan struct rds_zcopy_cookies {
406401910dbSSowmini Varadhan 	__u32 num;
407401910dbSSowmini Varadhan 	__u32 cookies[RDS_MAX_ZCOOKIES];
408401910dbSSowmini Varadhan };
409401910dbSSowmini Varadhan 
410607ca46eSDavid Howells /*
411607ca46eSDavid Howells  * Common set of flags for all RDMA related structs
412607ca46eSDavid Howells  */
413607ca46eSDavid Howells #define RDS_RDMA_READWRITE	0x0001
414607ca46eSDavid Howells #define RDS_RDMA_FENCE		0x0002	/* use FENCE for immediate send */
415607ca46eSDavid Howells #define RDS_RDMA_INVALIDATE	0x0004	/* invalidate R_Key after freeing MR */
416607ca46eSDavid Howells #define RDS_RDMA_USE_ONCE	0x0008	/* free MR after use */
417607ca46eSDavid Howells #define RDS_RDMA_DONTWAIT	0x0010	/* Don't wait in SET_BARRIER */
418607ca46eSDavid Howells #define RDS_RDMA_NOTIFY_ME	0x0020	/* Notify when operation completes */
419607ca46eSDavid Howells #define RDS_RDMA_SILENT		0x0040	/* Do not interrupt remote */
420607ca46eSDavid Howells 
421607ca46eSDavid Howells #endif /* IB_RDS_H */
422