xref: /linux/fs/smb/common/smbdirect/smbdirect_public.h (revision 3cd8b194bf3428dfa53120fee47e827a7c495815)
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