Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */
0002 /*
0003  * Copyright (c) 2005-2006 Intel Corporation.  All rights reserved.
0004  *
0005  * This software is available to you under a choice of one of two
0006  * licenses.  You may choose to be licensed under the terms of the GNU
0007  * General Public License (GPL) Version 2, available from the file
0008  * COPYING in the main directory of this source tree, or the
0009  * OpenIB.org BSD license below:
0010  *
0011  *     Redistribution and use in source and binary forms, with or
0012  *     without modification, are permitted provided that the following
0013  *     conditions are met:
0014  *
0015  *      - Redistributions of source code must retain the above
0016  *        copyright notice, this list of conditions and the following
0017  *        disclaimer.
0018  *
0019  *      - Redistributions in binary form must reproduce the above
0020  *        copyright notice, this list of conditions and the following
0021  *        disclaimer in the documentation and/or other materials
0022  *        provided with the distribution.
0023  *
0024  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
0025  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
0026  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
0027  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
0028  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
0029  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
0030  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
0031  * SOFTWARE.
0032  */
0033 
0034 #ifndef RDMA_USER_CM_H
0035 #define RDMA_USER_CM_H
0036 
0037 #include <linux/types.h>
0038 #include <linux/socket.h>
0039 #include <linux/in6.h>
0040 #include <rdma/ib_user_verbs.h>
0041 #include <rdma/ib_user_sa.h>
0042 
0043 #define RDMA_USER_CM_ABI_VERSION    4
0044 
0045 #define RDMA_MAX_PRIVATE_DATA       256
0046 
0047 enum {
0048     RDMA_USER_CM_CMD_CREATE_ID,
0049     RDMA_USER_CM_CMD_DESTROY_ID,
0050     RDMA_USER_CM_CMD_BIND_IP,
0051     RDMA_USER_CM_CMD_RESOLVE_IP,
0052     RDMA_USER_CM_CMD_RESOLVE_ROUTE,
0053     RDMA_USER_CM_CMD_QUERY_ROUTE,
0054     RDMA_USER_CM_CMD_CONNECT,
0055     RDMA_USER_CM_CMD_LISTEN,
0056     RDMA_USER_CM_CMD_ACCEPT,
0057     RDMA_USER_CM_CMD_REJECT,
0058     RDMA_USER_CM_CMD_DISCONNECT,
0059     RDMA_USER_CM_CMD_INIT_QP_ATTR,
0060     RDMA_USER_CM_CMD_GET_EVENT,
0061     RDMA_USER_CM_CMD_GET_OPTION,
0062     RDMA_USER_CM_CMD_SET_OPTION,
0063     RDMA_USER_CM_CMD_NOTIFY,
0064     RDMA_USER_CM_CMD_JOIN_IP_MCAST,
0065     RDMA_USER_CM_CMD_LEAVE_MCAST,
0066     RDMA_USER_CM_CMD_MIGRATE_ID,
0067     RDMA_USER_CM_CMD_QUERY,
0068     RDMA_USER_CM_CMD_BIND,
0069     RDMA_USER_CM_CMD_RESOLVE_ADDR,
0070     RDMA_USER_CM_CMD_JOIN_MCAST
0071 };
0072 
0073 /* See IBTA Annex A11, servies ID bytes 4 & 5 */
0074 enum rdma_ucm_port_space {
0075     RDMA_PS_IPOIB = 0x0002,
0076     RDMA_PS_IB    = 0x013F,
0077     RDMA_PS_TCP   = 0x0106,
0078     RDMA_PS_UDP   = 0x0111,
0079 };
0080 
0081 /*
0082  * command ABI structures.
0083  */
0084 struct rdma_ucm_cmd_hdr {
0085     __u32 cmd;
0086     __u16 in;
0087     __u16 out;
0088 };
0089 
0090 struct rdma_ucm_create_id {
0091     __aligned_u64 uid;
0092     __aligned_u64 response;
0093     __u16 ps;                  /* use enum rdma_ucm_port_space */
0094     __u8  qp_type;
0095     __u8  reserved[5];
0096 };
0097 
0098 struct rdma_ucm_create_id_resp {
0099     __u32 id;
0100 };
0101 
0102 struct rdma_ucm_destroy_id {
0103     __aligned_u64 response;
0104     __u32 id;
0105     __u32 reserved;
0106 };
0107 
0108 struct rdma_ucm_destroy_id_resp {
0109     __u32 events_reported;
0110 };
0111 
0112 struct rdma_ucm_bind_ip {
0113     __aligned_u64 response;
0114     struct sockaddr_in6 addr;
0115     __u32 id;
0116 };
0117 
0118 struct rdma_ucm_bind {
0119     __u32 id;
0120     __u16 addr_size;
0121     __u16 reserved;
0122     struct __kernel_sockaddr_storage addr;
0123 };
0124 
0125 struct rdma_ucm_resolve_ip {
0126     struct sockaddr_in6 src_addr;
0127     struct sockaddr_in6 dst_addr;
0128     __u32 id;
0129     __u32 timeout_ms;
0130 };
0131 
0132 struct rdma_ucm_resolve_addr {
0133     __u32 id;
0134     __u32 timeout_ms;
0135     __u16 src_size;
0136     __u16 dst_size;
0137     __u32 reserved;
0138     struct __kernel_sockaddr_storage src_addr;
0139     struct __kernel_sockaddr_storage dst_addr;
0140 };
0141 
0142 struct rdma_ucm_resolve_route {
0143     __u32 id;
0144     __u32 timeout_ms;
0145 };
0146 
0147 enum {
0148     RDMA_USER_CM_QUERY_ADDR,
0149     RDMA_USER_CM_QUERY_PATH,
0150     RDMA_USER_CM_QUERY_GID
0151 };
0152 
0153 struct rdma_ucm_query {
0154     __aligned_u64 response;
0155     __u32 id;
0156     __u32 option;
0157 };
0158 
0159 struct rdma_ucm_query_route_resp {
0160     __aligned_u64 node_guid;
0161     struct ib_user_path_rec ib_route[2];
0162     struct sockaddr_in6 src_addr;
0163     struct sockaddr_in6 dst_addr;
0164     __u32 num_paths;
0165     __u8 port_num;
0166     __u8 reserved[3];
0167     __u32 ibdev_index;
0168     __u32 reserved1;
0169 };
0170 
0171 struct rdma_ucm_query_addr_resp {
0172     __aligned_u64 node_guid;
0173     __u8  port_num;
0174     __u8  reserved;
0175     __u16 pkey;
0176     __u16 src_size;
0177     __u16 dst_size;
0178     struct __kernel_sockaddr_storage src_addr;
0179     struct __kernel_sockaddr_storage dst_addr;
0180     __u32 ibdev_index;
0181     __u32 reserved1;
0182 };
0183 
0184 struct rdma_ucm_query_path_resp {
0185     __u32 num_paths;
0186     __u32 reserved;
0187     struct ib_path_rec_data path_data[];
0188 };
0189 
0190 struct rdma_ucm_conn_param {
0191     __u32 qp_num;
0192     __u32 qkey;
0193     __u8  private_data[RDMA_MAX_PRIVATE_DATA];
0194     __u8  private_data_len;
0195     __u8  srq;
0196     __u8  responder_resources;
0197     __u8  initiator_depth;
0198     __u8  flow_control;
0199     __u8  retry_count;
0200     __u8  rnr_retry_count;
0201     __u8  valid;
0202 };
0203 
0204 struct rdma_ucm_ud_param {
0205     __u32 qp_num;
0206     __u32 qkey;
0207     struct ib_uverbs_ah_attr ah_attr;
0208     __u8  private_data[RDMA_MAX_PRIVATE_DATA];
0209     __u8  private_data_len;
0210     __u8  reserved[7];
0211 };
0212 
0213 struct rdma_ucm_ece {
0214     __u32 vendor_id;
0215     __u32 attr_mod;
0216 };
0217 
0218 struct rdma_ucm_connect {
0219     struct rdma_ucm_conn_param conn_param;
0220     __u32 id;
0221     __u32 reserved;
0222     struct rdma_ucm_ece ece;
0223 };
0224 
0225 struct rdma_ucm_listen {
0226     __u32 id;
0227     __u32 backlog;
0228 };
0229 
0230 struct rdma_ucm_accept {
0231     __aligned_u64 uid;
0232     struct rdma_ucm_conn_param conn_param;
0233     __u32 id;
0234     __u32 reserved;
0235     struct rdma_ucm_ece ece;
0236 };
0237 
0238 struct rdma_ucm_reject {
0239     __u32 id;
0240     __u8  private_data_len;
0241     __u8  reason;
0242     __u8  reserved[2];
0243     __u8  private_data[RDMA_MAX_PRIVATE_DATA];
0244 };
0245 
0246 struct rdma_ucm_disconnect {
0247     __u32 id;
0248 };
0249 
0250 struct rdma_ucm_init_qp_attr {
0251     __aligned_u64 response;
0252     __u32 id;
0253     __u32 qp_state;
0254 };
0255 
0256 struct rdma_ucm_notify {
0257     __u32 id;
0258     __u32 event;
0259 };
0260 
0261 struct rdma_ucm_join_ip_mcast {
0262     __aligned_u64 response;     /* rdma_ucm_create_id_resp */
0263     __aligned_u64 uid;
0264     struct sockaddr_in6 addr;
0265     __u32 id;
0266 };
0267 
0268 /* Multicast join flags */
0269 enum {
0270     RDMA_MC_JOIN_FLAG_FULLMEMBER,
0271     RDMA_MC_JOIN_FLAG_SENDONLY_FULLMEMBER,
0272     RDMA_MC_JOIN_FLAG_RESERVED,
0273 };
0274 
0275 struct rdma_ucm_join_mcast {
0276     __aligned_u64 response;     /* rdma_ucma_create_id_resp */
0277     __aligned_u64 uid;
0278     __u32 id;
0279     __u16 addr_size;
0280     __u16 join_flags;
0281     struct __kernel_sockaddr_storage addr;
0282 };
0283 
0284 struct rdma_ucm_get_event {
0285     __aligned_u64 response;
0286 };
0287 
0288 struct rdma_ucm_event_resp {
0289     __aligned_u64 uid;
0290     __u32 id;
0291     __u32 event;
0292     __u32 status;
0293     /*
0294      * NOTE: This union is not aligned to 8 bytes so none of the union
0295      * members may contain a u64 or anything with higher alignment than 4.
0296      */
0297     union {
0298         struct rdma_ucm_conn_param conn;
0299         struct rdma_ucm_ud_param   ud;
0300     } param;
0301     __u32 reserved;
0302     struct rdma_ucm_ece ece;
0303 };
0304 
0305 /* Option levels */
0306 enum {
0307     RDMA_OPTION_ID      = 0,
0308     RDMA_OPTION_IB      = 1
0309 };
0310 
0311 /* Option details */
0312 enum {
0313     RDMA_OPTION_ID_TOS   = 0,
0314     RDMA_OPTION_ID_REUSEADDR = 1,
0315     RDMA_OPTION_ID_AFONLY    = 2,
0316     RDMA_OPTION_ID_ACK_TIMEOUT = 3
0317 };
0318 
0319 enum {
0320     RDMA_OPTION_IB_PATH  = 1
0321 };
0322 
0323 struct rdma_ucm_set_option {
0324     __aligned_u64 optval;
0325     __u32 id;
0326     __u32 level;
0327     __u32 optname;
0328     __u32 optlen;
0329 };
0330 
0331 struct rdma_ucm_migrate_id {
0332     __aligned_u64 response;
0333     __u32 id;
0334     __u32 fd;
0335 };
0336 
0337 struct rdma_ucm_migrate_resp {
0338     __u32 events_reported;
0339 };
0340 
0341 #endif /* RDMA_USER_CM_H */