xref: /linux/fs/smb/smbdirect/public.h (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
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