xref: /linux/include/linux/smbdirect.h (revision 8ab992f815d6736b5c7a6f5fd7bfe7bc106bb3dc)
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