1331772Shselasky/*-
2331772Shselasky * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3331772Shselasky *
4320592Shselasky * Copyright (c) 2005-2006 Intel Corporation.  All rights reserved.
5320592Shselasky *
6320592Shselasky * This software is available to you under a choice of one of two
7320592Shselasky * licenses.  You may choose to be licensed under the terms of the GNU
8320592Shselasky * General Public License (GPL) Version 2, available from the file
9320592Shselasky * COPYING in the main directory of this source tree, or the
10320592Shselasky * OpenIB.org BSD license below:
11320592Shselasky *
12320592Shselasky *     Redistribution and use in source and binary forms, with or
13320592Shselasky *     without modification, are permitted provided that the following
14320592Shselasky *     conditions are met:
15320592Shselasky *
16320592Shselasky *      - Redistributions of source code must retain the above
17320592Shselasky *        copyright notice, this list of conditions and the following
18320592Shselasky *        disclaimer.
19320592Shselasky *
20320592Shselasky *      - Redistributions in binary form must reproduce the above
21320592Shselasky *        copyright notice, this list of conditions and the following
22320592Shselasky *        disclaimer in the documentation and/or other materials
23320592Shselasky *        provided with the distribution.
24320592Shselasky *
25320592Shselasky * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26320592Shselasky * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27320592Shselasky * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28320592Shselasky * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29320592Shselasky * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30320592Shselasky * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31320592Shselasky * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32320592Shselasky * SOFTWARE.
33331772Shselasky *
34331772Shselasky * $FreeBSD: stable/11/sys/ofed/include/uapi/rdma/rdma_user_cm.h 331772 2018-03-30 18:17:33Z hselasky $
35320592Shselasky */
36320592Shselasky
37320592Shselasky#ifndef RDMA_USER_CM_H
38320592Shselasky#define RDMA_USER_CM_H
39320592Shselasky
40320592Shselasky#ifdef _KERNEL
41320592Shselasky#include <linux/types.h>
42320592Shselasky#include <linux/socket.h>
43320592Shselasky#include <linux/in6.h>
44320592Shselasky#else
45320592Shselasky#include <infiniband/types.h>
46320592Shselasky#include <netinet/in.h>
47320592Shselasky#endif
48320592Shselasky
49320592Shselasky#include <rdma/ib_user_verbs.h>
50320592Shselasky#include <rdma/ib_user_sa.h>
51320592Shselasky
52320592Shselasky#define RDMA_USER_CM_ABI_VERSION	4
53320592Shselasky
54320592Shselasky#define RDMA_MAX_PRIVATE_DATA		256
55320592Shselasky
56320592Shselaskyenum {
57320592Shselasky	RDMA_USER_CM_CMD_CREATE_ID,
58320592Shselasky	RDMA_USER_CM_CMD_DESTROY_ID,
59320592Shselasky	RDMA_USER_CM_CMD_BIND_IP,
60320592Shselasky	RDMA_USER_CM_CMD_RESOLVE_IP,
61320592Shselasky	RDMA_USER_CM_CMD_RESOLVE_ROUTE,
62320592Shselasky	RDMA_USER_CM_CMD_QUERY_ROUTE,
63320592Shselasky	RDMA_USER_CM_CMD_CONNECT,
64320592Shselasky	RDMA_USER_CM_CMD_LISTEN,
65320592Shselasky	RDMA_USER_CM_CMD_ACCEPT,
66320592Shselasky	RDMA_USER_CM_CMD_REJECT,
67320592Shselasky	RDMA_USER_CM_CMD_DISCONNECT,
68320592Shselasky	RDMA_USER_CM_CMD_INIT_QP_ATTR,
69320592Shselasky	RDMA_USER_CM_CMD_GET_EVENT,
70320592Shselasky	RDMA_USER_CM_CMD_GET_OPTION,
71320592Shselasky	RDMA_USER_CM_CMD_SET_OPTION,
72320592Shselasky	RDMA_USER_CM_CMD_NOTIFY,
73320592Shselasky	RDMA_USER_CM_CMD_JOIN_IP_MCAST,
74320592Shselasky	RDMA_USER_CM_CMD_LEAVE_MCAST,
75320592Shselasky	RDMA_USER_CM_CMD_MIGRATE_ID,
76320592Shselasky	RDMA_USER_CM_CMD_QUERY,
77320592Shselasky	RDMA_USER_CM_CMD_BIND,
78320592Shselasky	RDMA_USER_CM_CMD_RESOLVE_ADDR,
79320592Shselasky	RDMA_USER_CM_CMD_JOIN_MCAST
80320592Shselasky};
81320592Shselasky
82320592Shselasky/*
83320592Shselasky * command ABI structures.
84320592Shselasky */
85320592Shselaskystruct rdma_ucm_cmd_hdr {
86320592Shselasky	__u32 cmd;
87320592Shselasky	__u16 in;
88320592Shselasky	__u16 out;
89320592Shselasky};
90320592Shselasky
91320592Shselaskystruct rdma_ucm_create_id {
92320592Shselasky	__u64 uid;
93320592Shselasky	__u64 response;
94320592Shselasky	__u16 ps;
95320592Shselasky	__u8  qp_type;
96320592Shselasky	__u8  reserved[5];
97320592Shselasky};
98320592Shselasky
99320592Shselaskystruct rdma_ucm_create_id_resp {
100320592Shselasky	__u32 id;
101320592Shselasky};
102320592Shselasky
103320592Shselaskystruct rdma_ucm_destroy_id {
104320592Shselasky	__u64 response;
105320592Shselasky	__u32 id;
106320592Shselasky	__u32 reserved;
107320592Shselasky};
108320592Shselasky
109320592Shselaskystruct rdma_ucm_destroy_id_resp {
110320592Shselasky	__u32 events_reported;
111320592Shselasky};
112320592Shselasky
113320592Shselaskystruct rdma_ucm_bind_ip {
114320592Shselasky	__u64 response;
115320592Shselasky	struct sockaddr_in6 addr;
116320592Shselasky	__u32 id;
117320592Shselasky};
118320592Shselasky
119320592Shselaskystruct rdma_ucm_bind {
120320592Shselasky	__u32 id;
121320592Shselasky	__u16 addr_size;
122320592Shselasky	__u16 reserved;
123320592Shselasky	struct sockaddr_storage addr;
124320592Shselasky};
125320592Shselasky
126320592Shselaskystruct rdma_ucm_resolve_ip {
127320592Shselasky	struct sockaddr_in6 src_addr;
128320592Shselasky	struct sockaddr_in6 dst_addr;
129320592Shselasky	__u32 id;
130320592Shselasky	__u32 timeout_ms;
131320592Shselasky};
132320592Shselasky
133320592Shselaskystruct rdma_ucm_resolve_addr {
134320592Shselasky	__u32 id;
135320592Shselasky	__u32 timeout_ms;
136320592Shselasky	__u16 src_size;
137320592Shselasky	__u16 dst_size;
138320592Shselasky	__u32 reserved;
139320592Shselasky	struct sockaddr_storage src_addr;
140320592Shselasky	struct sockaddr_storage dst_addr;
141320592Shselasky};
142320592Shselasky
143320592Shselaskystruct rdma_ucm_resolve_route {
144320592Shselasky	__u32 id;
145320592Shselasky	__u32 timeout_ms;
146320592Shselasky};
147320592Shselasky
148320592Shselaskyenum {
149320592Shselasky	RDMA_USER_CM_QUERY_ADDR,
150320592Shselasky	RDMA_USER_CM_QUERY_PATH,
151320592Shselasky	RDMA_USER_CM_QUERY_GID
152320592Shselasky};
153320592Shselasky
154320592Shselaskystruct rdma_ucm_query {
155320592Shselasky	__u64 response;
156320592Shselasky	__u32 id;
157320592Shselasky	__u32 option;
158320592Shselasky};
159320592Shselasky
160320592Shselaskystruct rdma_ucm_query_route_resp {
161320592Shselasky	__u64 node_guid;
162320592Shselasky	struct ib_user_path_rec ib_route[2];
163320592Shselasky	struct sockaddr_in6 src_addr;
164320592Shselasky	struct sockaddr_in6 dst_addr;
165320592Shselasky	__u32 num_paths;
166320592Shselasky	__u8 port_num;
167320592Shselasky	__u8 reserved[3];
168320592Shselasky};
169320592Shselasky
170320592Shselaskystruct rdma_ucm_query_addr_resp {
171320592Shselasky	__u64 node_guid;
172320592Shselasky	__u8  port_num;
173320592Shselasky	__u8  reserved;
174320592Shselasky	__u16 pkey;
175320592Shselasky	__u16 src_size;
176320592Shselasky	__u16 dst_size;
177320592Shselasky	struct sockaddr_storage src_addr;
178320592Shselasky	struct sockaddr_storage dst_addr;
179320592Shselasky};
180320592Shselasky
181320592Shselaskystruct rdma_ucm_query_path_resp {
182320592Shselasky	__u32 num_paths;
183320592Shselasky	__u32 reserved;
184320592Shselasky	struct ib_path_rec_data path_data[0];
185320592Shselasky};
186320592Shselasky
187320592Shselaskystruct rdma_ucm_conn_param {
188320592Shselasky	__u32 qp_num;
189320592Shselasky	__u32 qkey;
190320592Shselasky	__u8  private_data[RDMA_MAX_PRIVATE_DATA];
191320592Shselasky	__u8  private_data_len;
192320592Shselasky	__u8  srq;
193320592Shselasky	__u8  responder_resources;
194320592Shselasky	__u8  initiator_depth;
195320592Shselasky	__u8  flow_control;
196320592Shselasky	__u8  retry_count;
197320592Shselasky	__u8  rnr_retry_count;
198320592Shselasky	__u8  valid;
199320592Shselasky};
200320592Shselasky
201320592Shselaskystruct rdma_ucm_ud_param {
202320592Shselasky	__u32 qp_num;
203320592Shselasky	__u32 qkey;
204320592Shselasky	struct ib_uverbs_ah_attr ah_attr;
205320592Shselasky	__u8  private_data[RDMA_MAX_PRIVATE_DATA];
206320592Shselasky	__u8  private_data_len;
207320592Shselasky	__u8  reserved[7];
208320592Shselasky};
209320592Shselasky
210320592Shselaskystruct rdma_ucm_connect {
211320592Shselasky	struct rdma_ucm_conn_param conn_param;
212320592Shselasky	__u32 id;
213320592Shselasky	__u32 reserved;
214320592Shselasky};
215320592Shselasky
216320592Shselaskystruct rdma_ucm_listen {
217320592Shselasky	__u32 id;
218320592Shselasky	__u32 backlog;
219320592Shselasky};
220320592Shselasky
221320592Shselaskystruct rdma_ucm_accept {
222320592Shselasky	__u64 uid;
223320592Shselasky	struct rdma_ucm_conn_param conn_param;
224320592Shselasky	__u32 id;
225320592Shselasky	__u32 reserved;
226320592Shselasky};
227320592Shselasky
228320592Shselaskystruct rdma_ucm_reject {
229320592Shselasky	__u32 id;
230320592Shselasky	__u8  private_data_len;
231320592Shselasky	__u8  reserved[3];
232320592Shselasky	__u8  private_data[RDMA_MAX_PRIVATE_DATA];
233320592Shselasky};
234320592Shselasky
235320592Shselaskystruct rdma_ucm_disconnect {
236320592Shselasky	__u32 id;
237320592Shselasky};
238320592Shselasky
239320592Shselaskystruct rdma_ucm_init_qp_attr {
240320592Shselasky	__u64 response;
241320592Shselasky	__u32 id;
242320592Shselasky	__u32 qp_state;
243320592Shselasky};
244320592Shselasky
245320592Shselaskystruct rdma_ucm_notify {
246320592Shselasky	__u32 id;
247320592Shselasky	__u32 event;
248320592Shselasky};
249320592Shselasky
250320592Shselaskystruct rdma_ucm_join_ip_mcast {
251320592Shselasky	__u64 response;		/* rdma_ucm_create_id_resp */
252320592Shselasky	__u64 uid;
253320592Shselasky	struct sockaddr_in6 addr;
254320592Shselasky	__u32 id;
255320592Shselasky};
256320592Shselasky
257320592Shselasky/* Multicast join flags */
258320592Shselaskyenum {
259320592Shselasky	RDMA_MC_JOIN_FLAG_FULLMEMBER,
260320592Shselasky	RDMA_MC_JOIN_FLAG_SENDONLY_FULLMEMBER,
261320592Shselasky	RDMA_MC_JOIN_FLAG_RESERVED,
262320592Shselasky};
263320592Shselasky
264320592Shselaskystruct rdma_ucm_join_mcast {
265320592Shselasky	__u64 response;		/* rdma_ucma_create_id_resp */
266320592Shselasky	__u64 uid;
267320592Shselasky	__u32 id;
268320592Shselasky	__u16 addr_size;
269320592Shselasky	__u16 join_flags;
270320592Shselasky	struct sockaddr_storage addr;
271320592Shselasky};
272320592Shselasky
273320592Shselaskystruct rdma_ucm_get_event {
274320592Shselasky	__u64 response;
275320592Shselasky};
276320592Shselasky
277320592Shselaskystruct rdma_ucm_event_resp {
278320592Shselasky	__u64 uid;
279320592Shselasky	__u32 id;
280320592Shselasky	__u32 event;
281320592Shselasky	__u32 status;
282320592Shselasky	union {
283320592Shselasky		struct rdma_ucm_conn_param conn;
284320592Shselasky		struct rdma_ucm_ud_param   ud;
285320592Shselasky	} param;
286320592Shselasky};
287320592Shselasky
288320592Shselasky/* Option levels */
289320592Shselaskyenum {
290320592Shselasky	RDMA_OPTION_ID		= 0,
291320592Shselasky	RDMA_OPTION_IB		= 1
292320592Shselasky};
293320592Shselasky
294320592Shselasky/* Option details */
295320592Shselaskyenum {
296320592Shselasky	RDMA_OPTION_ID_TOS	 = 0,
297320592Shselasky	RDMA_OPTION_ID_REUSEADDR = 1,
298320592Shselasky	RDMA_OPTION_ID_AFONLY	 = 2,
299320592Shselasky	RDMA_OPTION_IB_PATH	 = 1
300320592Shselasky};
301320592Shselasky
302320592Shselaskystruct rdma_ucm_set_option {
303320592Shselasky	__u64 optval;
304320592Shselasky	__u32 id;
305320592Shselasky	__u32 level;
306320592Shselasky	__u32 optname;
307320592Shselasky	__u32 optlen;
308320592Shselasky};
309320592Shselasky
310320592Shselaskystruct rdma_ucm_migrate_id {
311320592Shselasky	__u64 response;
312320592Shselasky	__u32 id;
313320592Shselasky	__u32 fd;
314320592Shselasky};
315320592Shselasky
316320592Shselaskystruct rdma_ucm_migrate_resp {
317320592Shselasky	__u32 events_reported;
318320592Shselasky};
319320592Shselasky
320320592Shselasky#endif /* RDMA_USER_CM_H */
321