1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Copyright (C) 2025, Stefan Metzmacher 4 */ 5 6 #ifndef __LINUX_SMBDIRECT_H__ 7 #define __LINUX_SMBDIRECT_H__ 8 9 #include <linux/types.h> 10 11 /* SMB-DIRECT buffer descriptor V1 structure [MS-SMBD] 2.2.3.1 */ 12 struct smbdirect_buffer_descriptor_v1 { 13 __le64 offset; 14 __le32 token; 15 __le32 length; 16 } __packed; 17 18 /* 19 * Connection parameters mostly from [MS-SMBD] 3.1.1.1 20 * 21 * These are setup and negotiated at the beginning of a 22 * connection and remain constant unless explicitly changed. 23 * 24 * Some values are important for the upper layer. 25 */ 26 struct smbdirect_socket_parameters { 27 __u64 flags; 28 #define SMBDIRECT_FLAG_PORT_RANGE_ONLY_IB ((__u64)0x1) 29 #define SMBDIRECT_FLAG_PORT_RANGE_ONLY_IW ((__u64)0x2) 30 __u32 resolve_addr_timeout_msec; 31 __u32 resolve_route_timeout_msec; 32 __u32 rdma_connect_timeout_msec; 33 __u32 negotiate_timeout_msec; 34 __u16 initiator_depth; /* limited to U8_MAX */ 35 __u16 responder_resources; /* limited to U8_MAX */ 36 __u16 recv_credit_max; 37 __u16 send_credit_target; 38 __u32 max_send_size; 39 __u32 max_fragmented_send_size; 40 __u32 max_recv_size; 41 __u32 max_fragmented_recv_size; 42 __u32 max_read_write_size; 43 __u32 max_frmr_depth; 44 __u32 keepalive_interval_msec; 45 __u32 keepalive_timeout_msec; 46 } __packed; 47 48 #define SMBDIRECT_FLAG_PORT_RANGE_MASK ( \ 49 SMBDIRECT_FLAG_PORT_RANGE_ONLY_IB | \ 50 SMBDIRECT_FLAG_PORT_RANGE_ONLY_IW) 51 52 struct smbdirect_socket; 53 struct smbdirect_send_batch; 54 struct smbdirect_mr_io; 55 56 #include <rdma/rw.h> 57 58 u8 smbdirect_netdev_rdma_capable_node_type(struct net_device *netdev); 59 60 bool smbdirect_frwr_is_supported(const struct ib_device_attr *attrs); 61 62 int smbdirect_socket_create_kern(struct net *net, struct smbdirect_socket **_sc); 63 64 int smbdirect_socket_create_accepting(struct rdma_cm_id *id, struct smbdirect_socket **_sc); 65 66 int smbdirect_socket_set_initial_parameters(struct smbdirect_socket *sc, 67 const struct smbdirect_socket_parameters *sp); 68 69 const struct smbdirect_socket_parameters * 70 smbdirect_socket_get_current_parameters(struct smbdirect_socket *sc); 71 72 int smbdirect_socket_set_kernel_settings(struct smbdirect_socket *sc, 73 enum ib_poll_context poll_ctx, 74 gfp_t gfp_mask); 75 76 #define SMBDIRECT_LOG_ERR 0x0 77 #define SMBDIRECT_LOG_INFO 0x1 78 79 #define SMBDIRECT_LOG_OUTGOING 0x1 80 #define SMBDIRECT_LOG_INCOMING 0x2 81 #define SMBDIRECT_LOG_READ 0x4 82 #define SMBDIRECT_LOG_WRITE 0x8 83 #define SMBDIRECT_LOG_RDMA_SEND 0x10 84 #define SMBDIRECT_LOG_RDMA_RECV 0x20 85 #define SMBDIRECT_LOG_KEEP_ALIVE 0x40 86 #define SMBDIRECT_LOG_RDMA_EVENT 0x80 87 #define SMBDIRECT_LOG_RDMA_MR 0x100 88 #define SMBDIRECT_LOG_RDMA_RW 0x200 89 #define SMBDIRECT_LOG_NEGOTIATE 0x400 90 void smbdirect_socket_set_logging(struct smbdirect_socket *sc, 91 void *private_ptr, 92 bool (*needed)(struct smbdirect_socket *sc, 93 void *private_ptr, 94 unsigned int lvl, 95 unsigned int cls), 96 void (*vaprintf)(struct smbdirect_socket *sc, 97 const char *func, 98 unsigned int line, 99 void *private_ptr, 100 unsigned int lvl, 101 unsigned int cls, 102 struct va_format *vaf)); 103 104 bool smbdirect_connection_is_connected(struct smbdirect_socket *sc); 105 106 int smbdirect_connection_wait_for_connected(struct smbdirect_socket *sc); 107 108 int smbdirect_socket_bind(struct smbdirect_socket *sc, struct sockaddr *addr); 109 110 void smbdirect_socket_shutdown(struct smbdirect_socket *sc); 111 112 void smbdirect_socket_release(struct smbdirect_socket *sc); 113 114 int smbdirect_connection_send_batch_flush(struct smbdirect_socket *sc, 115 struct smbdirect_send_batch *batch, 116 bool is_last); 117 118 /* 119 * This is only temporary and only needed 120 * as long as the client still requires 121 * to use smbdirect_connection_send_single_iter() 122 */ 123 struct smbdirect_send_batch_storage { 124 union { 125 struct list_head __msg_list; 126 __aligned_u64 __space[5]; 127 }; 128 }; 129 130 struct smbdirect_send_batch * 131 smbdirect_init_send_batch_storage(struct smbdirect_send_batch_storage *storage, 132 bool need_invalidate_rkey, 133 unsigned int remote_key); 134 135 int smbdirect_connection_send_single_iter(struct smbdirect_socket *sc, 136 struct smbdirect_send_batch *batch, 137 struct iov_iter *iter, 138 unsigned int flags, 139 u32 remaining_data_length); 140 141 int smbdirect_connection_send_wait_zero_pending(struct smbdirect_socket *sc); 142 143 int smbdirect_connection_send_iter(struct smbdirect_socket *sc, 144 struct iov_iter *iter, 145 unsigned int flags, 146 bool need_invalidate, 147 unsigned int remote_key); 148 149 int smbdirect_connection_recvmsg(struct smbdirect_socket *sc, 150 struct msghdr *msg, 151 unsigned int flags); 152 153 int smbdirect_connect(struct smbdirect_socket *sc, 154 const struct sockaddr *dst); 155 156 int smbdirect_connect_sync(struct smbdirect_socket *sc, 157 const struct sockaddr *dst); 158 159 int smbdirect_socket_listen(struct smbdirect_socket *sc, int backlog); 160 161 struct smbdirect_socket *smbdirect_socket_accept(struct smbdirect_socket *lsc, 162 long timeo, 163 struct proto_accept_arg *arg); 164 165 int smbdirect_connection_rdma_xmit(struct smbdirect_socket *sc, 166 void *buf, size_t buf_len, 167 struct smbdirect_buffer_descriptor_v1 *desc, 168 size_t desc_len, 169 bool is_read); 170 171 struct smbdirect_mr_io * 172 smbdirect_connection_register_mr_io(struct smbdirect_socket *sc, 173 struct iov_iter *iter, 174 bool writing, 175 bool need_invalidate); 176 177 void smbdirect_mr_io_fill_buffer_descriptor(struct smbdirect_mr_io *mr, 178 struct smbdirect_buffer_descriptor_v1 *v1); 179 180 void smbdirect_connection_deregister_mr_io(struct smbdirect_mr_io *mr); 181 182 void smbdirect_connection_legacy_debug_proc_show(struct smbdirect_socket *sc, 183 unsigned int rdma_readwrite_threshold, 184 struct seq_file *m); 185 186 #endif /* __LINUX_SMBDIRECT_H__ */ 187