This source file includes following definitions.
- smc_sk
- hton24
- ntoh24
- using_ipsec
- using_ipsec
1
2
3
4
5
6
7
8
9
10
11 #ifndef __SMC_H
12 #define __SMC_H
13
14 #include <linux/socket.h>
15 #include <linux/types.h>
16 #include <linux/compiler.h>
17 #include <net/sock.h>
18
19 #include "smc_ib.h"
20
21 #define SMCPROTO_SMC 0
22 #define SMCPROTO_SMC6 1
23
24 extern struct proto smc_proto;
25 extern struct proto smc_proto6;
26
27 #ifdef ATOMIC64_INIT
28 #define KERNEL_HAS_ATOMIC64
29 #endif
30
31 enum smc_state {
32 SMC_ACTIVE = 1,
33 SMC_INIT = 2,
34 SMC_CLOSED = 7,
35 SMC_LISTEN = 10,
36
37 SMC_PEERCLOSEWAIT1 = 20,
38 SMC_PEERCLOSEWAIT2 = 21,
39 SMC_APPFINCLOSEWAIT = 24,
40 SMC_APPCLOSEWAIT1 = 22,
41 SMC_APPCLOSEWAIT2 = 23,
42 SMC_PEERFINCLOSEWAIT = 25,
43
44 SMC_PEERABORTWAIT = 26,
45 SMC_PROCESSABORT = 27,
46 };
47
48 struct smc_link_group;
49
50 struct smc_wr_rx_hdr {
51 u8 type;
52 } __aligned(1);
53
54 struct smc_cdc_conn_state_flags {
55 #if defined(__BIG_ENDIAN_BITFIELD)
56 u8 peer_done_writing : 1;
57 u8 peer_conn_closed : 1;
58 u8 peer_conn_abort : 1;
59 u8 reserved : 5;
60 #elif defined(__LITTLE_ENDIAN_BITFIELD)
61 u8 reserved : 5;
62 u8 peer_conn_abort : 1;
63 u8 peer_conn_closed : 1;
64 u8 peer_done_writing : 1;
65 #endif
66 };
67
68 struct smc_cdc_producer_flags {
69 #if defined(__BIG_ENDIAN_BITFIELD)
70 u8 write_blocked : 1;
71 u8 urg_data_pending : 1;
72 u8 urg_data_present : 1;
73 u8 cons_curs_upd_req : 1;
74 u8 failover_validation : 1;
75 u8 reserved : 3;
76 #elif defined(__LITTLE_ENDIAN_BITFIELD)
77 u8 reserved : 3;
78 u8 failover_validation : 1;
79 u8 cons_curs_upd_req : 1;
80 u8 urg_data_present : 1;
81 u8 urg_data_pending : 1;
82 u8 write_blocked : 1;
83 #endif
84 };
85
86
87 union smc_host_cursor {
88 struct {
89 u16 reserved;
90 u16 wrap;
91 u32 count;
92 };
93 #ifdef KERNEL_HAS_ATOMIC64
94 atomic64_t acurs;
95 #else
96 u64 acurs;
97 #endif
98 } __aligned(8);
99
100
101 struct smc_host_cdc_msg {
102 struct smc_wr_rx_hdr common;
103 u8 len;
104 u16 seqno;
105 u32 token;
106 union smc_host_cursor prod;
107 union smc_host_cursor cons;
108
109
110 struct smc_cdc_producer_flags prod_flags;
111 struct smc_cdc_conn_state_flags conn_state_flags;
112 u8 reserved[18];
113 } __aligned(8);
114
115 enum smc_urg_state {
116 SMC_URG_VALID = 1,
117 SMC_URG_NOTYET = 2,
118 SMC_URG_READ = 3,
119 };
120
121 struct smc_connection {
122 struct rb_node alert_node;
123 struct smc_link_group *lgr;
124 u32 alert_token_local;
125 u8 peer_rmbe_idx;
126 int peer_rmbe_size;
127 atomic_t peer_rmbe_space;
128
129
130 int rtoken_idx;
131
132 struct smc_buf_desc *sndbuf_desc;
133 struct smc_buf_desc *rmb_desc;
134 int rmbe_size_short;
135 int rmbe_update_limit;
136
137
138
139
140 struct smc_host_cdc_msg local_tx_ctrl;
141
142
143
144
145 union smc_host_cursor tx_curs_prep;
146
147
148 union smc_host_cursor tx_curs_sent;
149
150
151 union smc_host_cursor tx_curs_fin;
152
153
154 atomic_t sndbuf_space;
155 u16 tx_cdc_seq;
156 spinlock_t send_lock;
157 struct delayed_work tx_work;
158 u32 tx_off;
159
160 struct smc_host_cdc_msg local_rx_ctrl;
161
162
163
164 union smc_host_cursor rx_curs_confirmed;
165
166
167 union smc_host_cursor urg_curs;
168 enum smc_urg_state urg_state;
169 bool urg_tx_pend;
170 bool urg_rx_skip_pend;
171
172
173
174
175 char urg_rx_byte;
176 atomic_t bytes_to_rcv;
177
178
179 atomic_t splice_pending;
180
181
182 #ifndef KERNEL_HAS_ATOMIC64
183 spinlock_t acurs_lock;
184 #endif
185 struct work_struct close_work;
186 struct tasklet_struct rx_tsklet;
187 u8 rx_off;
188
189
190 u64 peer_token;
191 };
192
193 struct smc_sock {
194 struct sock sk;
195 struct socket *clcsock;
196 struct smc_connection conn;
197 struct smc_sock *listen_smc;
198 struct work_struct connect_work;
199 struct work_struct tcp_listen_work;
200 struct work_struct smc_listen_work;
201 struct list_head accept_q;
202 spinlock_t accept_q_lock;
203 bool use_fallback;
204 int fallback_rsn;
205 u32 peer_diagnosis;
206 int sockopt_defer_accept;
207
208
209
210 u8 wait_close_tx_prepared : 1;
211
212
213
214
215 u8 connect_nonblock : 1;
216
217
218
219 struct mutex clcsock_release_lock;
220
221
222
223 };
224
225 static inline struct smc_sock *smc_sk(const struct sock *sk)
226 {
227 return (struct smc_sock *)sk;
228 }
229
230 #define SMC_SYSTEMID_LEN 8
231
232 extern u8 local_systemid[SMC_SYSTEMID_LEN];
233
234
235 static inline void hton24(u8 *net, u32 host)
236 {
237 __be32 t;
238
239 t = cpu_to_be32(host);
240 memcpy(net, ((u8 *)&t) + 1, 3);
241 }
242
243
244 static inline u32 ntoh24(u8 *net)
245 {
246 __be32 t = 0;
247
248 memcpy(((u8 *)&t) + 1, net, 3);
249 return be32_to_cpu(t);
250 }
251
252 #ifdef CONFIG_XFRM
253 static inline bool using_ipsec(struct smc_sock *smc)
254 {
255 return (smc->clcsock->sk->sk_policy[0] ||
256 smc->clcsock->sk->sk_policy[1]) ? true : false;
257 }
258 #else
259 static inline bool using_ipsec(struct smc_sock *smc)
260 {
261 return false;
262 }
263 #endif
264
265 struct sock *smc_accept_dequeue(struct sock *parent, struct socket *new_sock);
266 void smc_close_non_accepted(struct sock *sk);
267
268 #endif