125981136fb13bcacf5f475f3e0ec750341e1e671Christopher Ferris/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) */
230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Copyright (c) 2008 Oracle.  All rights reserved.
430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * This software is available to you under a choice of one of two
630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * licenses.  You may choose to be licensed under the terms of the GNU
730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * General Public License (GPL) Version 2, available from the file
830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * COPYING in the main directory of this source tree, or the
930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * OpenIB.org BSD license below:
1030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
1130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *     Redistribution and use in source and binary forms, with or
1230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *     without modification, are permitted provided that the following
1330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *     conditions are met:
1430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
1530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *      - Redistributions of source code must retain the above
1630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *        copyright notice, this list of conditions and the following
1730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *        disclaimer.
1830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
1930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *      - Redistributions in binary form must reproduce the above
2030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *        copyright notice, this list of conditions and the following
2130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *        disclaimer in the documentation and/or other materials
2230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *        provided with the distribution.
2330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
2430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
2530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
2730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
2830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
2930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
3030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SOFTWARE.
3230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
3330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
3430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
3530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _LINUX_RDS_H
3630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _LINUX_RDS_H
3730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
3830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <linux/types.h>
390543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris#include <linux/socket.h>		/* For __kernel_sockaddr_storage. */
4030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_IB_ABI_VERSION		0x301
4230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4312e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris#define	SOL_RDS		276
4412e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris
4530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
4630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * setsockopt/getsockopt for SOL_RDS
4730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
4830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CANCEL_SENT_TO      	1
4930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_GET_MR			2
5030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_FREE_MR			3
5130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* deprecated: RDS_BARRIER 4 */
5230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_RECVERR			5
5330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CONG_MONITOR		6
5430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_GET_MR_FOR_DEST		7
5512e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris#define SO_RDS_TRANSPORT		8
5612e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris
570543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris/* Socket option to tap receive path latency
580543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris *	SO_RDS: SO_RDS_MSG_RXPATH_LATENCY
590543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris *	Format used struct rds_rx_trace_so
600543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris */
610543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris#define SO_RDS_MSG_RXPATH_LATENCY	10
620543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris
630543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris
6412e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris/* supported values for SO_RDS_TRANSPORT */
6512e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris#define	RDS_TRANS_IB	0
6612e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris#define	RDS_TRANS_IWARP	1
6712e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris#define	RDS_TRANS_TCP	2
6812e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris#define RDS_TRANS_COUNT	3
6912e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris#define	RDS_TRANS_NONE	(~0)
7030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
7130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
7230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Control message types for SOL_RDS.
7330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
7430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * CMSG_RDMA_ARGS (sendmsg)
7530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	Request a RDMA transfer to/from the specified
7630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	memory ranges.
7730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	The cmsg_data is a struct rds_rdma_args.
7830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * RDS_CMSG_RDMA_DEST (recvmsg, sendmsg)
7930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	Kernel informs application about intended
8030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	source/destination of a RDMA transfer
8130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * RDS_CMSG_RDMA_MAP (sendmsg)
8230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	Application asks kernel to map the given
8330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	memory range into a IB MR, and send the
8430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	R_Key along in an RDS extension header.
8530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	The cmsg_data is a struct rds_get_mr_args,
8630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	the same as for the GET_MR setsockopt.
8730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * RDS_CMSG_RDMA_STATUS (recvmsg)
8830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	Returns the status of a completed RDMA operation.
890543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris * RDS_CMSG_RXPATH_LATENCY(recvmsg)
900543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris *	Returns rds message latencies in various stages of receive
910543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris *	path in nS. Its set per socket using SO_RDS_MSG_RXPATH_LATENCY
920543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris *	socket option. Legitimate points are defined in
930543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris *	enum rds_message_rxpath_latency. More points can be added in
940543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris *	future. CSMG format is struct rds_cmsg_rx_trace.
9530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
9630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CMSG_RDMA_ARGS		1
9730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CMSG_RDMA_DEST		2
9830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CMSG_RDMA_MAP		3
9930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CMSG_RDMA_STATUS		4
10030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CMSG_CONG_UPDATE		5
10130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CMSG_ATOMIC_FADD		6
10230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CMSG_ATOMIC_CSWP		7
10330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CMSG_MASKED_ATOMIC_FADD	8
10430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CMSG_MASKED_ATOMIC_CSWP	9
1050543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris#define RDS_CMSG_RXPATH_LATENCY		11
10630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
10730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_FIRST			10000
10830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_COUNTERS		10000
10930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_CONNECTIONS		10001
11030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 10002 aka RDS_INFO_FLOWS is deprecated */
11130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_SEND_MESSAGES		10003
11230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_RETRANS_MESSAGES       10004
11330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_RECV_MESSAGES          10005
11430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_SOCKETS                10006
11530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_TCP_SOCKETS            10007
11630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_IB_CONNECTIONS		10008
11730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_CONNECTION_STATS	10009
11830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_IWARP_CONNECTIONS	10010
11930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_LAST			10010
12030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
12130692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct rds_info_counter {
1220543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u8	name[32];
1230543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64	value;
12430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} __attribute__((packed));
12530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
12630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_CONNECTION_FLAG_SENDING	0x01
12730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_CONNECTION_FLAG_CONNECTING	0x02
12830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_CONNECTION_FLAG_CONNECTED	0x04
12930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
13030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TRANSNAMSIZ	16
13130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
13230692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct rds_info_connection {
1330543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		next_tx_seq;
1340543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		next_rx_seq;
13530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be32		laddr;
13630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be32		faddr;
1370543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u8		transport[TRANSNAMSIZ];		/* null term ascii */
1380543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u8		flags;
13930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} __attribute__((packed));
14030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
14130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_MESSAGE_FLAG_ACK               0x01
14230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_INFO_MESSAGE_FLAG_FAST_ACK          0x02
14330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
14430692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct rds_info_message {
1450543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		seq;
1460543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u32		len;
14730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be32		laddr;
14830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be32		faddr;
14930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be16		lport;
15030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be16		fport;
1510543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u8		flags;
15230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} __attribute__((packed));
15330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
15430692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct rds_info_socket {
1550543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u32		sndbuf;
15630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be32		bound_addr;
15730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be32		connected_addr;
15830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be16		bound_port;
15930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be16		connected_port;
1600543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u32		rcvbuf;
1610543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		inum;
16230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} __attribute__((packed));
16330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
16430692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct rds_info_tcp_socket {
16530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be32          local_addr;
16630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be16          local_port;
16730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be32          peer_addr;
16830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be16          peer_port;
1690543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64           hdr_rem;
1700543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64           data_rem;
1710543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u32           last_sent_nxt;
1720543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u32           last_expected_una;
1730543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u32           last_seen_una;
17430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} __attribute__((packed));
17530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
17630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_IB_GID_LEN	16
17730692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct rds_info_rdma_connection {
17830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be32		src_addr;
17930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__be32		dst_addr;
1800543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u8		src_gid[RDS_IB_GID_LEN];
1810543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u8		dst_gid[RDS_IB_GID_LEN];
1820543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris
1830543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u32		max_send_wr;
1840543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u32		max_recv_wr;
1850543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u32		max_send_sge;
1860543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u32		rdma_mr_max;
1870543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u32		rdma_mr_size;
1880543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris};
1890543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris
1900543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris/* RDS message Receive Path Latency points */
1910543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferrisenum rds_message_rxpath_latency {
1920543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	RDS_MSG_RX_HDR_TO_DGRAM_START = 0,
1930543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	RDS_MSG_RX_DGRAM_REASSEMBLE,
1940543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	RDS_MSG_RX_DGRAM_DELIVERED,
1950543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	RDS_MSG_RX_DGRAM_TRACE_MAX
1960543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris};
1970543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris
1980543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferrisstruct rds_rx_trace_so {
1990543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u8 rx_traces;
2000543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u8 rx_trace_pos[RDS_MSG_RX_DGRAM_TRACE_MAX];
2010543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris};
2020543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris
2030543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferrisstruct rds_cmsg_rx_trace {
2040543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u8 rx_traces;
2050543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u8 rx_trace_pos[RDS_MSG_RX_DGRAM_TRACE_MAX];
2060543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64 rx_trace[RDS_MSG_RX_DGRAM_TRACE_MAX];
20730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
20830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
20930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
21030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Congestion monitoring.
21130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Congestion control in RDS happens at the host connection
21230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * level by exchanging a bitmap marking congested ports.
21330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * By default, a process sleeping in poll() is always woken
21430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * up when the congestion map is updated.
21530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * With explicit monitoring, an application can have more
21630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * fine-grained control.
21730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The application installs a 64bit mask value in the socket,
21830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * where each bit corresponds to a group of ports.
21930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * When a congestion update arrives, RDS checks the set of
22030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ports that are now uncongested against the list bit mask
22130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * installed in the socket, and if they overlap, we queue a
22230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * cong_notification on the socket.
22330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
22430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * To install the congestion monitor bitmask, use RDS_CONG_MONITOR
22530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * with the 64bit mask.
22630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Congestion updates are received via RDS_CMSG_CONG_UPDATE
22730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * control messages.
22830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
22930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The correspondence between bits and ports is
23030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	1 << (portnum % 64)
23130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
23230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CONG_MONITOR_SIZE	64
23330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CONG_MONITOR_BIT(port)  (((unsigned int) port) % RDS_CONG_MONITOR_SIZE)
23430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_CONG_MONITOR_MASK(port) (1ULL << RDS_CONG_MONITOR_BIT(port))
23530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
23630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
23730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * RDMA related types
23830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
23930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
24030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
24130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * This encapsulates a remote memory location.
24230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * In the current implementation, it contains the R_Key
24330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * of the remote memory region, and the offset into it
24430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * (so that the application does not have to worry about
24530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * alignment).
24630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
2470543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferristypedef __u64		rds_rdma_cookie_t;
24830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
24930692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct rds_iovec {
2500543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		addr;
2510543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		bytes;
25230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
25330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
25430692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct rds_get_mr_args {
25530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	struct rds_iovec vec;
2560543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		cookie_addr;
2570543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		flags;
25830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
25930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
26030692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct rds_get_mr_for_dest_args {
2610543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	struct __kernel_sockaddr_storage dest_addr;
26230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	struct rds_iovec 	vec;
2630543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64			cookie_addr;
2640543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64			flags;
26530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
26630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
26730692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct rds_free_mr_args {
26830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	rds_rdma_cookie_t cookie;
2690543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		flags;
27030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
27130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
27230692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct rds_rdma_args {
27330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	rds_rdma_cookie_t cookie;
27430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	struct rds_iovec remote_vec;
2750543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		local_vec_addr;
2760543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		nr_local;
2770543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		flags;
2780543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		user_token;
27930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
28030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
28130692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct rds_atomic_args {
28230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	rds_rdma_cookie_t cookie;
2830543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		local_addr;
2840543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		remote_addr;
28530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	union {
28630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		struct {
2870543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris			__u64		compare;
2880543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris			__u64		swap;
28930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} cswp;
29030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		struct {
2910543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris			__u64		add;
29230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} fadd;
29330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		struct {
2940543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris			__u64		compare;
2950543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris			__u64		swap;
2960543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris			__u64		compare_mask;
2970543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris			__u64		swap_mask;
29830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} m_cswp;
29930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		struct {
3000543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris			__u64		add;
3010543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris			__u64		nocarry_mask;
30230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} m_fadd;
30330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	};
3040543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		flags;
3050543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		user_token;
30630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
30730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
30830692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct rds_rdma_notify {
3090543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u64		user_token;
3100543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__s32		status;
31130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
31230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
31330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_RDMA_SUCCESS	0
31430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_RDMA_REMOTE_ERROR	1
31530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_RDMA_CANCELED	2
31630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_RDMA_DROPPED	3
31730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_RDMA_OTHER_ERROR	4
31830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
31930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
32030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Common set of flags for all RDMA related structs
32130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
32230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_RDMA_READWRITE	0x0001
32330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_RDMA_FENCE		0x0002	/* use FENCE for immediate send */
32430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_RDMA_INVALIDATE	0x0004	/* invalidate R_Key after freeing MR */
32530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_RDMA_USE_ONCE	0x0008	/* free MR after use */
32630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_RDMA_DONTWAIT	0x0010	/* Don't wait in SET_BARRIER */
32730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_RDMA_NOTIFY_ME	0x0020	/* Notify when operation completes */
32830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define RDS_RDMA_SILENT		0x0040	/* Do not interrupt remote */
32930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
33030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* IB_RDS_H */
331