1 /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */ 2 /* 3 * Copyright (c) 2005-2006 Intel Corporation. All rights reserved. 4 * 5 * This software is available to you under a choice of one of two 6 * licenses. You may choose to be licensed under the terms of the GNU 7 * General Public License (GPL) Version 2, available from the file 8 * COPYING in the main directory of this source tree, or the 9 * OpenIB.org BSD license below: 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions are met: 14 * 15 * - Redistributions of source code must retain the above 16 * copyright notice, this list of conditions and the following 17 * disclaimer. 18 * 19 * - Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials 22 * provided with the distribution. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 * SOFTWARE. 32 */ 33 34 #ifndef RDMA_USER_CM_H 35 #define RDMA_USER_CM_H 36 37 #include <linux/types.h> 38 #include <linux/socket.h> 39 #include <linux/in6.h> 40 #include <rdma/ib_user_verbs.h> 41 #include <rdma/ib_user_sa.h> 42 43 #define RDMA_USER_CM_ABI_VERSION 4 44 45 #define RDMA_MAX_PRIVATE_DATA 256 46 47 enum { 48 RDMA_USER_CM_CMD_CREATE_ID, 49 RDMA_USER_CM_CMD_DESTROY_ID, 50 RDMA_USER_CM_CMD_BIND_IP, 51 RDMA_USER_CM_CMD_RESOLVE_IP, 52 RDMA_USER_CM_CMD_RESOLVE_ROUTE, 53 RDMA_USER_CM_CMD_QUERY_ROUTE, 54 RDMA_USER_CM_CMD_CONNECT, 55 RDMA_USER_CM_CMD_LISTEN, 56 RDMA_USER_CM_CMD_ACCEPT, 57 RDMA_USER_CM_CMD_REJECT, 58 RDMA_USER_CM_CMD_DISCONNECT, 59 RDMA_USER_CM_CMD_INIT_QP_ATTR, 60 RDMA_USER_CM_CMD_GET_EVENT, 61 RDMA_USER_CM_CMD_GET_OPTION, 62 RDMA_USER_CM_CMD_SET_OPTION, 63 RDMA_USER_CM_CMD_NOTIFY, 64 RDMA_USER_CM_CMD_JOIN_IP_MCAST, 65 RDMA_USER_CM_CMD_LEAVE_MCAST, 66 RDMA_USER_CM_CMD_MIGRATE_ID, 67 RDMA_USER_CM_CMD_QUERY, 68 RDMA_USER_CM_CMD_BIND, 69 RDMA_USER_CM_CMD_RESOLVE_ADDR, 70 RDMA_USER_CM_CMD_JOIN_MCAST, 71 RDMA_USER_CM_CMD_RESOLVE_IB_SERVICE, 72 RDMA_USER_CM_CMD_WRITE_CM_EVENT, 73 }; 74 75 /* See IBTA Annex A11, servies ID bytes 4 & 5 */ 76 enum rdma_ucm_port_space { 77 RDMA_PS_IPOIB = 0x0002, 78 RDMA_PS_IB = 0x013F, 79 RDMA_PS_TCP = 0x0106, 80 RDMA_PS_UDP = 0x0111, 81 }; 82 83 /* 84 * command ABI structures. 85 */ 86 struct rdma_ucm_cmd_hdr { 87 __u32 cmd; 88 __u16 in; 89 __u16 out; 90 }; 91 92 struct rdma_ucm_create_id { 93 __aligned_u64 uid; 94 __aligned_u64 response; 95 __u16 ps; /* use enum rdma_ucm_port_space */ 96 __u8 qp_type; 97 __u8 reserved[5]; 98 }; 99 100 struct rdma_ucm_create_id_resp { 101 __u32 id; 102 }; 103 104 struct rdma_ucm_destroy_id { 105 __aligned_u64 response; 106 __u32 id; 107 __u32 reserved; 108 }; 109 110 struct rdma_ucm_destroy_id_resp { 111 __u32 events_reported; 112 }; 113 114 struct rdma_ucm_bind_ip { 115 __aligned_u64 response; 116 struct sockaddr_in6 addr; 117 __u32 id; 118 }; 119 120 struct rdma_ucm_bind { 121 __u32 id; 122 __u16 addr_size; 123 __u16 reserved; 124 struct __kernel_sockaddr_storage addr; 125 }; 126 127 struct rdma_ucm_resolve_ip { 128 struct sockaddr_in6 src_addr; 129 struct sockaddr_in6 dst_addr; 130 __u32 id; 131 __u32 timeout_ms; 132 }; 133 134 struct rdma_ucm_resolve_addr { 135 __u32 id; 136 __u32 timeout_ms; 137 __u16 src_size; 138 __u16 dst_size; 139 __u32 reserved; 140 struct __kernel_sockaddr_storage src_addr; 141 struct __kernel_sockaddr_storage dst_addr; 142 }; 143 144 struct rdma_ucm_resolve_route { 145 __u32 id; 146 __u32 timeout_ms; 147 }; 148 149 enum { 150 RDMA_USER_CM_QUERY_ADDR, 151 RDMA_USER_CM_QUERY_PATH, 152 RDMA_USER_CM_QUERY_GID, 153 RDMA_USER_CM_QUERY_IB_SERVICE 154 }; 155 156 struct rdma_ucm_query { 157 __aligned_u64 response; 158 __u32 id; 159 __u32 option; 160 }; 161 162 struct rdma_ucm_query_route_resp { 163 __aligned_u64 node_guid; 164 struct ib_user_path_rec ib_route[2]; 165 struct sockaddr_in6 src_addr; 166 struct sockaddr_in6 dst_addr; 167 __u32 num_paths; 168 __u8 port_num; 169 __u8 reserved[3]; 170 __u32 ibdev_index; 171 __u32 reserved1; 172 }; 173 174 struct rdma_ucm_query_addr_resp { 175 __aligned_u64 node_guid; 176 __u8 port_num; 177 __u8 reserved; 178 __u16 pkey; 179 __u16 src_size; 180 __u16 dst_size; 181 struct __kernel_sockaddr_storage src_addr; 182 struct __kernel_sockaddr_storage dst_addr; 183 __u32 ibdev_index; 184 __u32 reserved1; 185 }; 186 187 struct rdma_ucm_query_path_resp { 188 __u32 num_paths; 189 __u32 reserved; 190 struct ib_path_rec_data path_data[]; 191 }; 192 193 struct rdma_ucm_query_ib_service_resp { 194 __u32 num_service_recs; 195 struct ib_user_service_rec recs[]; 196 }; 197 198 struct rdma_ucm_conn_param { 199 __u32 qp_num; 200 __u32 qkey; 201 __u8 private_data[RDMA_MAX_PRIVATE_DATA]; 202 __u8 private_data_len; 203 __u8 srq; 204 __u8 responder_resources; 205 __u8 initiator_depth; 206 __u8 flow_control; 207 __u8 retry_count; 208 __u8 rnr_retry_count; 209 __u8 valid; 210 }; 211 212 struct rdma_ucm_ud_param { 213 __u32 qp_num; 214 __u32 qkey; 215 struct ib_uverbs_ah_attr ah_attr; 216 __u8 private_data[RDMA_MAX_PRIVATE_DATA]; 217 __u8 private_data_len; 218 __u8 reserved[7]; 219 }; 220 221 struct rdma_ucm_ece { 222 __u32 vendor_id; 223 __u32 attr_mod; 224 }; 225 226 struct rdma_ucm_connect { 227 struct rdma_ucm_conn_param conn_param; 228 __u32 id; 229 __u32 reserved; 230 struct rdma_ucm_ece ece; 231 }; 232 233 struct rdma_ucm_listen { 234 __u32 id; 235 __u32 backlog; 236 }; 237 238 struct rdma_ucm_accept { 239 __aligned_u64 uid; 240 struct rdma_ucm_conn_param conn_param; 241 __u32 id; 242 __u32 reserved; 243 struct rdma_ucm_ece ece; 244 }; 245 246 struct rdma_ucm_reject { 247 __u32 id; 248 __u8 private_data_len; 249 __u8 reason; 250 __u8 reserved[2]; 251 __u8 private_data[RDMA_MAX_PRIVATE_DATA]; 252 }; 253 254 struct rdma_ucm_disconnect { 255 __u32 id; 256 }; 257 258 struct rdma_ucm_init_qp_attr { 259 __aligned_u64 response; 260 __u32 id; 261 __u32 qp_state; 262 }; 263 264 struct rdma_ucm_notify { 265 __u32 id; 266 __u32 event; 267 }; 268 269 struct rdma_ucm_join_ip_mcast { 270 __aligned_u64 response; /* rdma_ucm_create_id_resp */ 271 __aligned_u64 uid; 272 struct sockaddr_in6 addr; 273 __u32 id; 274 }; 275 276 /* Multicast join flags */ 277 enum { 278 RDMA_MC_JOIN_FLAG_FULLMEMBER, 279 RDMA_MC_JOIN_FLAG_SENDONLY_FULLMEMBER, 280 RDMA_MC_JOIN_FLAG_RESERVED, 281 }; 282 283 struct rdma_ucm_join_mcast { 284 __aligned_u64 response; /* rdma_ucma_create_id_resp */ 285 __aligned_u64 uid; 286 __u32 id; 287 __u16 addr_size; 288 __u16 join_flags; 289 struct __kernel_sockaddr_storage addr; 290 }; 291 292 struct rdma_ucm_get_event { 293 __aligned_u64 response; 294 }; 295 296 struct rdma_ucm_event_resp { 297 __aligned_u64 uid; 298 __u32 id; 299 __u32 event; 300 __u32 status; 301 /* 302 * NOTE: This union is not aligned to 8 bytes so none of the union 303 * members may contain a u64 or anything with higher alignment than 4. 304 */ 305 union { 306 struct rdma_ucm_conn_param conn; 307 struct rdma_ucm_ud_param ud; 308 __u32 arg32[2]; 309 } param; 310 __u32 reserved; 311 struct rdma_ucm_ece ece; 312 }; 313 314 /* Option levels */ 315 enum { 316 RDMA_OPTION_ID = 0, 317 RDMA_OPTION_IB = 1 318 }; 319 320 /* Option details */ 321 enum { 322 RDMA_OPTION_ID_TOS = 0, 323 RDMA_OPTION_ID_REUSEADDR = 1, 324 RDMA_OPTION_ID_AFONLY = 2, 325 RDMA_OPTION_ID_ACK_TIMEOUT = 3 326 }; 327 328 enum { 329 RDMA_OPTION_IB_PATH = 1 330 }; 331 332 struct rdma_ucm_set_option { 333 __aligned_u64 optval; 334 __u32 id; 335 __u32 level; 336 __u32 optname; 337 __u32 optlen; 338 }; 339 340 struct rdma_ucm_migrate_id { 341 __aligned_u64 response; 342 __u32 id; 343 __u32 fd; 344 }; 345 346 struct rdma_ucm_migrate_resp { 347 __u32 events_reported; 348 }; 349 350 enum { 351 RDMA_USER_CM_IB_SERVICE_FLAG_ID = 1 << 0, 352 RDMA_USER_CM_IB_SERVICE_FLAG_NAME = 1 << 1, 353 }; 354 355 #define RDMA_USER_CM_IB_SERVICE_NAME_SIZE 64 356 struct rdma_ucm_ib_service { 357 __u64 service_id; 358 __u8 service_name[RDMA_USER_CM_IB_SERVICE_NAME_SIZE]; 359 __u32 flags; 360 __u32 reserved; 361 }; 362 363 struct rdma_ucm_resolve_ib_service { 364 __u32 id; 365 struct rdma_ucm_ib_service ibs; 366 }; 367 368 struct rdma_ucm_write_cm_event { 369 __u32 id; 370 __u32 reserved; 371 __u32 event; 372 __u32 status; 373 union { 374 struct rdma_ucm_conn_param conn; 375 struct rdma_ucm_ud_param ud; 376 __u64 arg; 377 } param; 378 }; 379 #endif /* RDMA_USER_CM_H */ 380