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