1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Copyright (C) 2025, Stefan Metzmacher 4 */ 5 6 #ifndef __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_PUBLIC_H__ 7 #define __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_PUBLIC_H__ 8 9 struct smbdirect_buffer_descriptor_v1; 10 struct smbdirect_socket_parameters; 11 12 struct smbdirect_socket; 13 struct smbdirect_send_batch; 14 struct smbdirect_mr_io; 15 16 #define __SMBDIRECT_EXPORT_SYMBOL__(__sym) EXPORT_SYMBOL_FOR_MODULES(__sym, "cifs,ksmbd") 17 18 #include <rdma/rw.h> 19 20 u8 smbdirect_netdev_rdma_capable_node_type(struct net_device *netdev); 21 22 bool smbdirect_frwr_is_supported(const struct ib_device_attr *attrs); 23 24 int smbdirect_socket_create_kern(struct net *net, struct smbdirect_socket **_sc); 25 26 int smbdirect_socket_create_accepting(struct rdma_cm_id *id, struct smbdirect_socket **_sc); 27 28 int smbdirect_socket_set_initial_parameters(struct smbdirect_socket *sc, 29 const struct smbdirect_socket_parameters *sp); 30 31 const struct smbdirect_socket_parameters * 32 smbdirect_socket_get_current_parameters(struct smbdirect_socket *sc); 33 34 int smbdirect_socket_set_kernel_settings(struct smbdirect_socket *sc, 35 enum ib_poll_context poll_ctx, 36 gfp_t gfp_mask); 37 38 #define SMBDIRECT_LOG_ERR 0x0 39 #define SMBDIRECT_LOG_INFO 0x1 40 41 #define SMBDIRECT_LOG_OUTGOING 0x1 42 #define SMBDIRECT_LOG_INCOMING 0x2 43 #define SMBDIRECT_LOG_READ 0x4 44 #define SMBDIRECT_LOG_WRITE 0x8 45 #define SMBDIRECT_LOG_RDMA_SEND 0x10 46 #define SMBDIRECT_LOG_RDMA_RECV 0x20 47 #define SMBDIRECT_LOG_KEEP_ALIVE 0x40 48 #define SMBDIRECT_LOG_RDMA_EVENT 0x80 49 #define SMBDIRECT_LOG_RDMA_MR 0x100 50 #define SMBDIRECT_LOG_RDMA_RW 0x200 51 #define SMBDIRECT_LOG_NEGOTIATE 0x400 52 void smbdirect_socket_set_logging(struct smbdirect_socket *sc, 53 void *private_ptr, 54 bool (*needed)(struct smbdirect_socket *sc, 55 void *private_ptr, 56 unsigned int lvl, 57 unsigned int cls), 58 void (*vaprintf)(struct smbdirect_socket *sc, 59 const char *func, 60 unsigned int line, 61 void *private_ptr, 62 unsigned int lvl, 63 unsigned int cls, 64 struct va_format *vaf)); 65 66 bool smbdirect_connection_is_connected(struct smbdirect_socket *sc); 67 68 int smbdirect_connection_wait_for_connected(struct smbdirect_socket *sc); 69 70 int smbdirect_socket_bind(struct smbdirect_socket *sc, struct sockaddr *addr); 71 72 void smbdirect_socket_shutdown(struct smbdirect_socket *sc); 73 74 void smbdirect_socket_release(struct smbdirect_socket *sc); 75 76 int smbdirect_connection_send_batch_flush(struct smbdirect_socket *sc, 77 struct smbdirect_send_batch *batch, 78 bool is_last); 79 80 /* 81 * This is only temporary and only needed 82 * as long as the client still requires 83 * to use smbdirect_connection_send_single_iter() 84 */ 85 struct smbdirect_send_batch_storage { 86 union { 87 struct list_head __msg_list; 88 __aligned_u64 __space[5]; 89 }; 90 }; 91 92 struct smbdirect_send_batch * 93 smbdirect_init_send_batch_storage(struct smbdirect_send_batch_storage *storage, 94 bool need_invalidate_rkey, 95 unsigned int remote_key); 96 97 int smbdirect_connection_send_single_iter(struct smbdirect_socket *sc, 98 struct smbdirect_send_batch *batch, 99 struct iov_iter *iter, 100 unsigned int flags, 101 u32 remaining_data_length); 102 103 int smbdirect_connection_send_wait_zero_pending(struct smbdirect_socket *sc); 104 105 int smbdirect_connection_send_iter(struct smbdirect_socket *sc, 106 struct iov_iter *iter, 107 unsigned int flags, 108 bool need_invalidate, 109 unsigned int remote_key); 110 111 int smbdirect_connection_recvmsg(struct smbdirect_socket *sc, 112 struct msghdr *msg, 113 unsigned int flags); 114 115 int smbdirect_connect(struct smbdirect_socket *sc, 116 const struct sockaddr *dst); 117 118 int smbdirect_connect_sync(struct smbdirect_socket *sc, 119 const struct sockaddr *dst); 120 121 int smbdirect_socket_listen(struct smbdirect_socket *sc, int backlog); 122 123 struct smbdirect_socket *smbdirect_socket_accept(struct smbdirect_socket *lsc, 124 long timeo, 125 struct proto_accept_arg *arg); 126 127 int smbdirect_connection_rdma_xmit(struct smbdirect_socket *sc, 128 void *buf, size_t buf_len, 129 struct smbdirect_buffer_descriptor_v1 *desc, 130 size_t desc_len, 131 bool is_read); 132 133 struct smbdirect_mr_io * 134 smbdirect_connection_register_mr_io(struct smbdirect_socket *sc, 135 struct iov_iter *iter, 136 bool writing, 137 bool need_invalidate); 138 139 void smbdirect_mr_io_fill_buffer_descriptor(struct smbdirect_mr_io *mr, 140 struct smbdirect_buffer_descriptor_v1 *v1); 141 142 void smbdirect_connection_deregister_mr_io(struct smbdirect_mr_io *mr); 143 144 void smbdirect_connection_legacy_debug_proc_show(struct smbdirect_socket *sc, 145 unsigned int rdma_readwrite_threshold, 146 struct seq_file *m); 147 148 #endif /* __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_PUBLIC_H__ */ 149