1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#define KMSG_COMPONENT "smc"
20#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
21
22#include <linux/module.h>
23#include <linux/socket.h>
24#include <linux/workqueue.h>
25#include <linux/in.h>
26#include <linux/sched/signal.h>
27#include <linux/if_vlan.h>
28#include <linux/rcupdate_wait.h>
29#include <linux/ctype.h>
30
31#include <net/sock.h>
32#include <net/tcp.h>
33#include <net/smc.h>
34#include <asm/ioctls.h>
35
36#include <net/net_namespace.h>
37#include <net/netns/generic.h>
38#include "smc_netns.h"
39
40#include "smc.h"
41#include "smc_clc.h"
42#include "smc_llc.h"
43#include "smc_cdc.h"
44#include "smc_core.h"
45#include "smc_ib.h"
46#include "smc_ism.h"
47#include "smc_pnet.h"
48#include "smc_netlink.h"
49#include "smc_tx.h"
50#include "smc_rx.h"
51#include "smc_close.h"
52
53static DEFINE_MUTEX(smc_server_lgr_pending);
54
55
56static DEFINE_MUTEX(smc_client_lgr_pending);
57
58
59
60struct workqueue_struct *smc_hs_wq;
61struct workqueue_struct *smc_close_wq;
62
63static void smc_tcp_listen_work(struct work_struct *);
64static void smc_connect_work(struct work_struct *);
65
66static void smc_set_keepalive(struct sock *sk, int val)
67{
68 struct smc_sock *smc = smc_sk(sk);
69
70 smc->clcsock->sk->sk_prot->keepalive(smc->clcsock->sk, val);
71}
72
73static struct smc_hashinfo smc_v4_hashinfo = {
74 .lock = __RW_LOCK_UNLOCKED(smc_v4_hashinfo.lock),
75};
76
77static struct smc_hashinfo smc_v6_hashinfo = {
78 .lock = __RW_LOCK_UNLOCKED(smc_v6_hashinfo.lock),
79};
80
81int smc_hash_sk(struct sock *sk)
82{
83 struct smc_hashinfo *h = sk->sk_prot->h.smc_hash;
84 struct hlist_head *head;
85
86 head = &h->ht;
87
88 write_lock_bh(&h->lock);
89 sk_add_node(sk, head);
90 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
91 write_unlock_bh(&h->lock);
92
93 return 0;
94}
95EXPORT_SYMBOL_GPL(smc_hash_sk);
96
97void smc_unhash_sk(struct sock *sk)
98{
99 struct smc_hashinfo *h = sk->sk_prot->h.smc_hash;
100
101 write_lock_bh(&h->lock);
102 if (sk_del_node_init(sk))
103 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
104 write_unlock_bh(&h->lock);
105}
106EXPORT_SYMBOL_GPL(smc_unhash_sk);
107
108struct proto smc_proto = {
109 .name = "SMC",
110 .owner = THIS_MODULE,
111 .keepalive = smc_set_keepalive,
112 .hash = smc_hash_sk,
113 .unhash = smc_unhash_sk,
114 .obj_size = sizeof(struct smc_sock),
115 .h.smc_hash = &smc_v4_hashinfo,
116 .slab_flags = SLAB_TYPESAFE_BY_RCU,
117};
118EXPORT_SYMBOL_GPL(smc_proto);
119
120struct proto smc_proto6 = {
121 .name = "SMC6",
122 .owner = THIS_MODULE,
123 .keepalive = smc_set_keepalive,
124 .hash = smc_hash_sk,
125 .unhash = smc_unhash_sk,
126 .obj_size = sizeof(struct smc_sock),
127 .h.smc_hash = &smc_v6_hashinfo,
128 .slab_flags = SLAB_TYPESAFE_BY_RCU,
129};
130EXPORT_SYMBOL_GPL(smc_proto6);
131
132static void smc_restore_fallback_changes(struct smc_sock *smc)
133{
134 if (smc->clcsock->file) {
135 smc->clcsock->file->private_data = smc->sk.sk_socket;
136 smc->clcsock->file = NULL;
137 }
138}
139
140static int __smc_release(struct smc_sock *smc)
141{
142 struct sock *sk = &smc->sk;
143 int rc = 0;
144
145 if (!smc->use_fallback) {
146 rc = smc_close_active(smc);
147 sock_set_flag(sk, SOCK_DEAD);
148 sk->sk_shutdown |= SHUTDOWN_MASK;
149 } else {
150 if (sk->sk_state != SMC_LISTEN && sk->sk_state != SMC_INIT)
151 sock_put(sk);
152 if (sk->sk_state == SMC_LISTEN) {
153
154 rc = kernel_sock_shutdown(smc->clcsock, SHUT_RDWR);
155 }
156 sk->sk_state = SMC_CLOSED;
157 sk->sk_state_change(sk);
158 smc_restore_fallback_changes(smc);
159 }
160
161 sk->sk_prot->unhash(sk);
162
163 if (sk->sk_state == SMC_CLOSED) {
164 if (smc->clcsock) {
165 release_sock(sk);
166 smc_clcsock_release(smc);
167 lock_sock(sk);
168 }
169 if (!smc->use_fallback)
170 smc_conn_free(&smc->conn);
171 }
172
173 return rc;
174}
175
176static int smc_release(struct socket *sock)
177{
178 struct sock *sk = sock->sk;
179 struct smc_sock *smc;
180 int rc = 0;
181
182 if (!sk)
183 goto out;
184
185 sock_hold(sk);
186 smc = smc_sk(sk);
187
188
189 if (smc->connect_nonblock && sk->sk_state == SMC_INIT)
190 tcp_abort(smc->clcsock->sk, ECONNABORTED);
191 flush_work(&smc->connect_work);
192
193 if (sk->sk_state == SMC_LISTEN)
194
195
196
197 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
198 else
199 lock_sock(sk);
200
201 rc = __smc_release(smc);
202
203
204 sock_orphan(sk);
205 sock->sk = NULL;
206 release_sock(sk);
207
208 sock_put(sk);
209 sock_put(sk);
210out:
211 return rc;
212}
213
214static void smc_destruct(struct sock *sk)
215{
216 if (sk->sk_state != SMC_CLOSED)
217 return;
218 if (!sock_flag(sk, SOCK_DEAD))
219 return;
220
221 sk_refcnt_debug_dec(sk);
222}
223
224static struct sock *smc_sock_alloc(struct net *net, struct socket *sock,
225 int protocol)
226{
227 struct smc_sock *smc;
228 struct proto *prot;
229 struct sock *sk;
230
231 prot = (protocol == SMCPROTO_SMC6) ? &smc_proto6 : &smc_proto;
232 sk = sk_alloc(net, PF_SMC, GFP_KERNEL, prot, 0);
233 if (!sk)
234 return NULL;
235
236 sock_init_data(sock, sk);
237 sk->sk_state = SMC_INIT;
238 sk->sk_destruct = smc_destruct;
239 sk->sk_protocol = protocol;
240 smc = smc_sk(sk);
241 INIT_WORK(&smc->tcp_listen_work, smc_tcp_listen_work);
242 INIT_WORK(&smc->connect_work, smc_connect_work);
243 INIT_DELAYED_WORK(&smc->conn.tx_work, smc_tx_work);
244 INIT_LIST_HEAD(&smc->accept_q);
245 spin_lock_init(&smc->accept_q_lock);
246 spin_lock_init(&smc->conn.send_lock);
247 sk->sk_prot->hash(sk);
248 sk_refcnt_debug_inc(sk);
249 mutex_init(&smc->clcsock_release_lock);
250
251 return sk;
252}
253
254static int smc_bind(struct socket *sock, struct sockaddr *uaddr,
255 int addr_len)
256{
257 struct sockaddr_in *addr = (struct sockaddr_in *)uaddr;
258 struct sock *sk = sock->sk;
259 struct smc_sock *smc;
260 int rc;
261
262 smc = smc_sk(sk);
263
264
265 rc = -EINVAL;
266 if (addr_len < sizeof(struct sockaddr_in))
267 goto out;
268
269 rc = -EAFNOSUPPORT;
270 if (addr->sin_family != AF_INET &&
271 addr->sin_family != AF_INET6 &&
272 addr->sin_family != AF_UNSPEC)
273 goto out;
274
275 if (addr->sin_family == AF_UNSPEC &&
276 addr->sin_addr.s_addr != htonl(INADDR_ANY))
277 goto out;
278
279 lock_sock(sk);
280
281
282 rc = -EINVAL;
283 if (sk->sk_state != SMC_INIT || smc->connect_nonblock)
284 goto out_rel;
285
286 smc->clcsock->sk->sk_reuse = sk->sk_reuse;
287 rc = kernel_bind(smc->clcsock, uaddr, addr_len);
288
289out_rel:
290 release_sock(sk);
291out:
292 return rc;
293}
294
295static void smc_copy_sock_settings(struct sock *nsk, struct sock *osk,
296 unsigned long mask)
297{
298
299 nsk->sk_type = osk->sk_type;
300 nsk->sk_sndbuf = osk->sk_sndbuf;
301 nsk->sk_rcvbuf = osk->sk_rcvbuf;
302 nsk->sk_sndtimeo = osk->sk_sndtimeo;
303 nsk->sk_rcvtimeo = osk->sk_rcvtimeo;
304 nsk->sk_mark = osk->sk_mark;
305 nsk->sk_priority = osk->sk_priority;
306 nsk->sk_rcvlowat = osk->sk_rcvlowat;
307 nsk->sk_bound_dev_if = osk->sk_bound_dev_if;
308 nsk->sk_err = osk->sk_err;
309
310 nsk->sk_flags &= ~mask;
311 nsk->sk_flags |= osk->sk_flags & mask;
312}
313
314#define SK_FLAGS_SMC_TO_CLC ((1UL << SOCK_URGINLINE) | \
315 (1UL << SOCK_KEEPOPEN) | \
316 (1UL << SOCK_LINGER) | \
317 (1UL << SOCK_BROADCAST) | \
318 (1UL << SOCK_TIMESTAMP) | \
319 (1UL << SOCK_DBG) | \
320 (1UL << SOCK_RCVTSTAMP) | \
321 (1UL << SOCK_RCVTSTAMPNS) | \
322 (1UL << SOCK_LOCALROUTE) | \
323 (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE) | \
324 (1UL << SOCK_RXQ_OVFL) | \
325 (1UL << SOCK_WIFI_STATUS) | \
326 (1UL << SOCK_NOFCS) | \
327 (1UL << SOCK_FILTER_LOCKED) | \
328 (1UL << SOCK_TSTAMP_NEW))
329
330
331
332static void smc_copy_sock_settings_to_clc(struct smc_sock *smc)
333{
334 smc_copy_sock_settings(smc->clcsock->sk, &smc->sk, SK_FLAGS_SMC_TO_CLC);
335}
336
337#define SK_FLAGS_CLC_TO_SMC ((1UL << SOCK_URGINLINE) | \
338 (1UL << SOCK_KEEPOPEN) | \
339 (1UL << SOCK_LINGER) | \
340 (1UL << SOCK_DBG))
341
342static void smc_copy_sock_settings_to_smc(struct smc_sock *smc)
343{
344 smc_copy_sock_settings(&smc->sk, smc->clcsock->sk, SK_FLAGS_CLC_TO_SMC);
345}
346
347
348static int smcr_lgr_reg_rmbs(struct smc_link *link,
349 struct smc_buf_desc *rmb_desc)
350{
351 struct smc_link_group *lgr = link->lgr;
352 int i, rc = 0;
353
354 rc = smc_llc_flow_initiate(lgr, SMC_LLC_FLOW_RKEY);
355 if (rc)
356 return rc;
357
358
359
360 mutex_lock(&lgr->llc_conf_mutex);
361 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
362 if (!smc_link_active(&lgr->lnk[i]))
363 continue;
364 rc = smcr_link_reg_rmb(&lgr->lnk[i], rmb_desc);
365 if (rc)
366 goto out;
367 }
368
369
370 rc = smc_llc_do_confirm_rkey(link, rmb_desc);
371 if (rc) {
372 rc = -EFAULT;
373 goto out;
374 }
375 rmb_desc->is_conf_rkey = true;
376out:
377 mutex_unlock(&lgr->llc_conf_mutex);
378 smc_llc_flow_stop(lgr, &lgr->llc_flow_lcl);
379 return rc;
380}
381
382static int smcr_clnt_conf_first_link(struct smc_sock *smc)
383{
384 struct smc_link *link = smc->conn.lnk;
385 struct smc_llc_qentry *qentry;
386 int rc;
387
388
389 qentry = smc_llc_wait(link->lgr, NULL, SMC_LLC_WAIT_TIME,
390 SMC_LLC_CONFIRM_LINK);
391 if (!qentry) {
392 struct smc_clc_msg_decline dclc;
393
394 rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc),
395 SMC_CLC_DECLINE, CLC_WAIT_TIME_SHORT);
396 return rc == -EAGAIN ? SMC_CLC_DECL_TIMEOUT_CL : rc;
397 }
398 smc_llc_save_peer_uid(qentry);
399 rc = smc_llc_eval_conf_link(qentry, SMC_LLC_REQ);
400 smc_llc_flow_qentry_del(&link->lgr->llc_flow_lcl);
401 if (rc)
402 return SMC_CLC_DECL_RMBE_EC;
403
404 rc = smc_ib_modify_qp_rts(link);
405 if (rc)
406 return SMC_CLC_DECL_ERR_RDYLNK;
407
408 smc_wr_remember_qp_attr(link);
409
410 if (smcr_link_reg_rmb(link, smc->conn.rmb_desc))
411 return SMC_CLC_DECL_ERR_REGRMB;
412
413
414 smc->conn.rmb_desc->is_conf_rkey = true;
415
416
417 rc = smc_llc_send_confirm_link(link, SMC_LLC_RESP);
418 if (rc < 0)
419 return SMC_CLC_DECL_TIMEOUT_CL;
420
421 smc_llc_link_active(link);
422 smcr_lgr_set_type(link->lgr, SMC_LGR_SINGLE);
423
424
425 qentry = smc_llc_wait(link->lgr, NULL, SMC_LLC_WAIT_TIME,
426 SMC_LLC_ADD_LINK);
427 if (!qentry) {
428 struct smc_clc_msg_decline dclc;
429
430 rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc),
431 SMC_CLC_DECLINE, CLC_WAIT_TIME_SHORT);
432 if (rc == -EAGAIN)
433 rc = 0;
434 return rc;
435 }
436 smc_llc_flow_qentry_clr(&link->lgr->llc_flow_lcl);
437 smc_llc_cli_add_link(link, qentry);
438 return 0;
439}
440
441static void smcr_conn_save_peer_info(struct smc_sock *smc,
442 struct smc_clc_msg_accept_confirm *clc)
443{
444 int bufsize = smc_uncompress_bufsize(clc->r0.rmbe_size);
445
446 smc->conn.peer_rmbe_idx = clc->r0.rmbe_idx;
447 smc->conn.local_tx_ctrl.token = ntohl(clc->r0.rmbe_alert_token);
448 smc->conn.peer_rmbe_size = bufsize;
449 atomic_set(&smc->conn.peer_rmbe_space, smc->conn.peer_rmbe_size);
450 smc->conn.tx_off = bufsize * (smc->conn.peer_rmbe_idx - 1);
451}
452
453static bool smc_isascii(char *hostname)
454{
455 int i;
456
457 for (i = 0; i < SMC_MAX_HOSTNAME_LEN; i++)
458 if (!isascii(hostname[i]))
459 return false;
460 return true;
461}
462
463static void smcd_conn_save_peer_info(struct smc_sock *smc,
464 struct smc_clc_msg_accept_confirm *clc)
465{
466 int bufsize = smc_uncompress_bufsize(clc->d0.dmbe_size);
467
468 smc->conn.peer_rmbe_idx = clc->d0.dmbe_idx;
469 smc->conn.peer_token = clc->d0.token;
470
471 smc->conn.peer_rmbe_size = bufsize - sizeof(struct smcd_cdc_msg);
472 atomic_set(&smc->conn.peer_rmbe_space, smc->conn.peer_rmbe_size);
473 smc->conn.tx_off = bufsize * smc->conn.peer_rmbe_idx;
474 if (clc->hdr.version > SMC_V1 &&
475 (clc->hdr.typev2 & SMC_FIRST_CONTACT_MASK)) {
476 struct smc_clc_msg_accept_confirm_v2 *clc_v2 =
477 (struct smc_clc_msg_accept_confirm_v2 *)clc;
478 struct smc_clc_first_contact_ext *fce =
479 (struct smc_clc_first_contact_ext *)
480 (((u8 *)clc_v2) + sizeof(*clc_v2));
481
482 memcpy(smc->conn.lgr->negotiated_eid, clc_v2->eid,
483 SMC_MAX_EID_LEN);
484 smc->conn.lgr->peer_os = fce->os_type;
485 smc->conn.lgr->peer_smc_release = fce->release;
486 if (smc_isascii(fce->hostname))
487 memcpy(smc->conn.lgr->peer_hostname, fce->hostname,
488 SMC_MAX_HOSTNAME_LEN);
489 }
490}
491
492static void smc_conn_save_peer_info(struct smc_sock *smc,
493 struct smc_clc_msg_accept_confirm *clc)
494{
495 if (smc->conn.lgr->is_smcd)
496 smcd_conn_save_peer_info(smc, clc);
497 else
498 smcr_conn_save_peer_info(smc, clc);
499}
500
501static void smc_link_save_peer_info(struct smc_link *link,
502 struct smc_clc_msg_accept_confirm *clc)
503{
504 link->peer_qpn = ntoh24(clc->r0.qpn);
505 memcpy(link->peer_gid, clc->r0.lcl.gid, SMC_GID_SIZE);
506 memcpy(link->peer_mac, clc->r0.lcl.mac, sizeof(link->peer_mac));
507 link->peer_psn = ntoh24(clc->r0.psn);
508 link->peer_mtu = clc->r0.qp_mtu;
509}
510
511static void smc_switch_to_fallback(struct smc_sock *smc)
512{
513 smc->use_fallback = true;
514 if (smc->sk.sk_socket && smc->sk.sk_socket->file) {
515 smc->clcsock->file = smc->sk.sk_socket->file;
516 smc->clcsock->file->private_data = smc->clcsock;
517 smc->clcsock->wq.fasync_list =
518 smc->sk.sk_socket->wq.fasync_list;
519 }
520}
521
522
523static int smc_connect_fallback(struct smc_sock *smc, int reason_code)
524{
525 smc_switch_to_fallback(smc);
526 smc->fallback_rsn = reason_code;
527 smc_copy_sock_settings_to_clc(smc);
528 smc->connect_nonblock = 0;
529 if (smc->sk.sk_state == SMC_INIT)
530 smc->sk.sk_state = SMC_ACTIVE;
531 return 0;
532}
533
534
535static int smc_connect_decline_fallback(struct smc_sock *smc, int reason_code,
536 u8 version)
537{
538 int rc;
539
540 if (reason_code < 0) {
541 if (smc->sk.sk_state == SMC_INIT)
542 sock_put(&smc->sk);
543 return reason_code;
544 }
545 if (reason_code != SMC_CLC_DECL_PEERDECL) {
546 rc = smc_clc_send_decline(smc, reason_code, version);
547 if (rc < 0) {
548 if (smc->sk.sk_state == SMC_INIT)
549 sock_put(&smc->sk);
550 return rc;
551 }
552 }
553 return smc_connect_fallback(smc, reason_code);
554}
555
556static void smc_conn_abort(struct smc_sock *smc, int local_first)
557{
558 if (local_first)
559 smc_lgr_cleanup_early(&smc->conn);
560 else
561 smc_conn_free(&smc->conn);
562}
563
564
565
566static int smc_find_rdma_device(struct smc_sock *smc, struct smc_init_info *ini)
567{
568
569
570
571
572 smc_pnet_find_roce_resource(smc->clcsock->sk, ini);
573 if (!ini->ib_dev)
574 return SMC_CLC_DECL_NOSMCRDEV;
575 return 0;
576}
577
578
579
580static int smc_find_ism_device(struct smc_sock *smc, struct smc_init_info *ini)
581{
582
583 smc_pnet_find_ism_resource(smc->clcsock->sk, ini);
584 if (!ini->ism_dev[0])
585 return SMC_CLC_DECL_NOSMCDDEV;
586 else
587 ini->ism_chid[0] = smc_ism_get_chid(ini->ism_dev[0]);
588 return 0;
589}
590
591
592static bool smc_find_ism_v2_is_unique_chid(u16 chid, struct smc_init_info *ini,
593 int cnt)
594{
595 int i = (!ini->ism_dev[0]) ? 1 : 0;
596
597 for (; i < cnt; i++)
598 if (ini->ism_chid[i] == chid)
599 return false;
600 return true;
601}
602
603
604
605
606static int smc_find_ism_v2_device_clnt(struct smc_sock *smc,
607 struct smc_init_info *ini)
608{
609 int rc = SMC_CLC_DECL_NOSMCDDEV;
610 struct smcd_dev *smcd;
611 int i = 1;
612 u16 chid;
613
614 if (smcd_indicated(ini->smc_type_v1))
615 rc = 0;
616 mutex_lock(&smcd_dev_list.mutex);
617 list_for_each_entry(smcd, &smcd_dev_list.list, list) {
618 if (smcd->going_away || smcd == ini->ism_dev[0])
619 continue;
620 chid = smc_ism_get_chid(smcd);
621 if (!smc_find_ism_v2_is_unique_chid(chid, ini, i))
622 continue;
623 if (!smc_pnet_is_pnetid_set(smcd->pnetid) ||
624 smc_pnet_is_ndev_pnetid(sock_net(&smc->sk), smcd->pnetid)) {
625 ini->ism_dev[i] = smcd;
626 ini->ism_chid[i] = chid;
627 ini->is_smcd = true;
628 rc = 0;
629 i++;
630 if (i > SMC_MAX_ISM_DEVS)
631 break;
632 }
633 }
634 mutex_unlock(&smcd_dev_list.mutex);
635 ini->ism_offered_cnt = i - 1;
636 if (!ini->ism_dev[0] && !ini->ism_dev[1])
637 ini->smcd_version = 0;
638
639 return rc;
640}
641
642
643static int smc_connect_ism_vlan_setup(struct smc_sock *smc,
644 struct smc_init_info *ini)
645{
646 if (ini->vlan_id && smc_ism_get_vlan(ini->ism_dev[0], ini->vlan_id))
647 return SMC_CLC_DECL_ISMVLANERR;
648 return 0;
649}
650
651static int smc_find_proposal_devices(struct smc_sock *smc,
652 struct smc_init_info *ini)
653{
654 int rc = 0;
655
656
657 if (ini->smcd_version & SMC_V1) {
658 if (smc_find_ism_device(smc, ini) ||
659 smc_connect_ism_vlan_setup(smc, ini)) {
660 if (ini->smc_type_v1 == SMC_TYPE_B)
661 ini->smc_type_v1 = SMC_TYPE_R;
662 else
663 ini->smc_type_v1 = SMC_TYPE_N;
664 }
665 if (smc_find_rdma_device(smc, ini)) {
666 if (ini->smc_type_v1 == SMC_TYPE_B)
667 ini->smc_type_v1 = SMC_TYPE_D;
668 else
669 ini->smc_type_v1 = SMC_TYPE_N;
670 }
671 }
672 if (smc_ism_is_v2_capable() && smc_find_ism_v2_device_clnt(smc, ini))
673 ini->smc_type_v2 = SMC_TYPE_N;
674
675
676 if (!smcr_indicated(ini->smc_type_v1) &&
677 ini->smc_type_v1 == SMC_TYPE_N && ini->smc_type_v2 == SMC_TYPE_N)
678 rc = SMC_CLC_DECL_NOSMCDEV;
679
680 return rc;
681}
682
683
684
685
686static int smc_connect_ism_vlan_cleanup(struct smc_sock *smc,
687 struct smc_init_info *ini)
688{
689 if (!smcd_indicated(ini->smc_type_v1))
690 return 0;
691 if (ini->vlan_id && smc_ism_put_vlan(ini->ism_dev[0], ini->vlan_id))
692 return SMC_CLC_DECL_CNFERR;
693 return 0;
694}
695
696#define SMC_CLC_MAX_ACCEPT_LEN \
697 (sizeof(struct smc_clc_msg_accept_confirm_v2) + \
698 sizeof(struct smc_clc_first_contact_ext) + \
699 sizeof(struct smc_clc_msg_trail))
700
701
702static int smc_connect_clc(struct smc_sock *smc,
703 struct smc_clc_msg_accept_confirm_v2 *aclc2,
704 struct smc_init_info *ini)
705{
706 int rc = 0;
707
708
709 rc = smc_clc_send_proposal(smc, ini);
710 if (rc)
711 return rc;
712
713 return smc_clc_wait_msg(smc, aclc2, SMC_CLC_MAX_ACCEPT_LEN,
714 SMC_CLC_ACCEPT, CLC_WAIT_TIME);
715}
716
717
718static int smc_connect_rdma(struct smc_sock *smc,
719 struct smc_clc_msg_accept_confirm *aclc,
720 struct smc_init_info *ini)
721{
722 int i, reason_code = 0;
723 struct smc_link *link;
724
725 ini->is_smcd = false;
726 ini->ib_lcl = &aclc->r0.lcl;
727 ini->ib_clcqpn = ntoh24(aclc->r0.qpn);
728 ini->first_contact_peer = aclc->hdr.typev2 & SMC_FIRST_CONTACT_MASK;
729
730 mutex_lock(&smc_client_lgr_pending);
731 reason_code = smc_conn_create(smc, ini);
732 if (reason_code) {
733 mutex_unlock(&smc_client_lgr_pending);
734 return reason_code;
735 }
736
737 smc_conn_save_peer_info(smc, aclc);
738
739 if (ini->first_contact_local) {
740 link = smc->conn.lnk;
741 } else {
742
743 link = NULL;
744 for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
745 struct smc_link *l = &smc->conn.lgr->lnk[i];
746
747 if (l->peer_qpn == ntoh24(aclc->r0.qpn) &&
748 !memcmp(l->peer_gid, &aclc->r0.lcl.gid,
749 SMC_GID_SIZE) &&
750 !memcmp(l->peer_mac, &aclc->r0.lcl.mac,
751 sizeof(l->peer_mac))) {
752 link = l;
753 break;
754 }
755 }
756 if (!link) {
757 reason_code = SMC_CLC_DECL_NOSRVLINK;
758 goto connect_abort;
759 }
760 smc_switch_link_and_count(&smc->conn, link);
761 }
762
763
764 if (smc_buf_create(smc, false)) {
765 reason_code = SMC_CLC_DECL_MEM;
766 goto connect_abort;
767 }
768
769 if (ini->first_contact_local)
770 smc_link_save_peer_info(link, aclc);
771
772 if (smc_rmb_rtoken_handling(&smc->conn, link, aclc)) {
773 reason_code = SMC_CLC_DECL_ERR_RTOK;
774 goto connect_abort;
775 }
776
777 smc_close_init(smc);
778 smc_rx_init(smc);
779
780 if (ini->first_contact_local) {
781 if (smc_ib_ready_link(link)) {
782 reason_code = SMC_CLC_DECL_ERR_RDYLNK;
783 goto connect_abort;
784 }
785 } else {
786 if (smcr_lgr_reg_rmbs(link, smc->conn.rmb_desc)) {
787 reason_code = SMC_CLC_DECL_ERR_REGRMB;
788 goto connect_abort;
789 }
790 }
791 smc_rmb_sync_sg_for_device(&smc->conn);
792
793 reason_code = smc_clc_send_confirm(smc, ini->first_contact_local,
794 SMC_V1);
795 if (reason_code)
796 goto connect_abort;
797
798 smc_tx_init(smc);
799
800 if (ini->first_contact_local) {
801
802 smc_llc_flow_initiate(link->lgr, SMC_LLC_FLOW_ADD_LINK);
803 reason_code = smcr_clnt_conf_first_link(smc);
804 smc_llc_flow_stop(link->lgr, &link->lgr->llc_flow_lcl);
805 if (reason_code)
806 goto connect_abort;
807 }
808 mutex_unlock(&smc_client_lgr_pending);
809
810 smc_copy_sock_settings_to_clc(smc);
811 smc->connect_nonblock = 0;
812 if (smc->sk.sk_state == SMC_INIT)
813 smc->sk.sk_state = SMC_ACTIVE;
814
815 return 0;
816connect_abort:
817 smc_conn_abort(smc, ini->first_contact_local);
818 mutex_unlock(&smc_client_lgr_pending);
819 smc->connect_nonblock = 0;
820
821 return reason_code;
822}
823
824
825
826
827static int
828smc_v2_determine_accepted_chid(struct smc_clc_msg_accept_confirm_v2 *aclc,
829 struct smc_init_info *ini)
830{
831 int i;
832
833 for (i = 0; i < ini->ism_offered_cnt + 1; i++) {
834 if (ini->ism_chid[i] == ntohs(aclc->chid)) {
835 ini->ism_selected = i;
836 return 0;
837 }
838 }
839
840 return -EPROTO;
841}
842
843
844static int smc_connect_ism(struct smc_sock *smc,
845 struct smc_clc_msg_accept_confirm *aclc,
846 struct smc_init_info *ini)
847{
848 int rc = 0;
849
850 ini->is_smcd = true;
851 ini->first_contact_peer = aclc->hdr.typev2 & SMC_FIRST_CONTACT_MASK;
852
853 if (aclc->hdr.version == SMC_V2) {
854 struct smc_clc_msg_accept_confirm_v2 *aclc_v2 =
855 (struct smc_clc_msg_accept_confirm_v2 *)aclc;
856
857 rc = smc_v2_determine_accepted_chid(aclc_v2, ini);
858 if (rc)
859 return rc;
860 }
861 ini->ism_peer_gid[ini->ism_selected] = aclc->d0.gid;
862
863
864 mutex_lock(&smc_server_lgr_pending);
865 rc = smc_conn_create(smc, ini);
866 if (rc) {
867 mutex_unlock(&smc_server_lgr_pending);
868 return rc;
869 }
870
871
872 rc = smc_buf_create(smc, true);
873 if (rc) {
874 rc = (rc == -ENOSPC) ? SMC_CLC_DECL_MAX_DMB : SMC_CLC_DECL_MEM;
875 goto connect_abort;
876 }
877
878 smc_conn_save_peer_info(smc, aclc);
879 smc_close_init(smc);
880 smc_rx_init(smc);
881 smc_tx_init(smc);
882
883 rc = smc_clc_send_confirm(smc, ini->first_contact_local,
884 aclc->hdr.version);
885 if (rc)
886 goto connect_abort;
887 mutex_unlock(&smc_server_lgr_pending);
888
889 smc_copy_sock_settings_to_clc(smc);
890 smc->connect_nonblock = 0;
891 if (smc->sk.sk_state == SMC_INIT)
892 smc->sk.sk_state = SMC_ACTIVE;
893
894 return 0;
895connect_abort:
896 smc_conn_abort(smc, ini->first_contact_local);
897 mutex_unlock(&smc_server_lgr_pending);
898 smc->connect_nonblock = 0;
899
900 return rc;
901}
902
903
904static int smc_connect_check_aclc(struct smc_init_info *ini,
905 struct smc_clc_msg_accept_confirm *aclc)
906{
907 if ((aclc->hdr.typev1 == SMC_TYPE_R &&
908 !smcr_indicated(ini->smc_type_v1)) ||
909 (aclc->hdr.typev1 == SMC_TYPE_D &&
910 ((!smcd_indicated(ini->smc_type_v1) &&
911 !smcd_indicated(ini->smc_type_v2)) ||
912 (aclc->hdr.version == SMC_V1 &&
913 !smcd_indicated(ini->smc_type_v1)) ||
914 (aclc->hdr.version == SMC_V2 &&
915 !smcd_indicated(ini->smc_type_v2)))))
916 return SMC_CLC_DECL_MODEUNSUPP;
917
918 return 0;
919}
920
921
922static int __smc_connect(struct smc_sock *smc)
923{
924 u8 version = smc_ism_is_v2_capable() ? SMC_V2 : SMC_V1;
925 struct smc_clc_msg_accept_confirm_v2 *aclc2;
926 struct smc_clc_msg_accept_confirm *aclc;
927 struct smc_init_info *ini = NULL;
928 u8 *buf = NULL;
929 int rc = 0;
930
931 if (smc->use_fallback)
932 return smc_connect_fallback(smc, smc->fallback_rsn);
933
934
935 if (!tcp_sk(smc->clcsock->sk)->syn_smc)
936 return smc_connect_fallback(smc, SMC_CLC_DECL_PEERNOSMC);
937
938
939 if (using_ipsec(smc))
940 return smc_connect_decline_fallback(smc, SMC_CLC_DECL_IPSEC,
941 version);
942
943 ini = kzalloc(sizeof(*ini), GFP_KERNEL);
944 if (!ini)
945 return smc_connect_decline_fallback(smc, SMC_CLC_DECL_MEM,
946 version);
947
948 ini->smcd_version = SMC_V1;
949 ini->smcd_version |= smc_ism_is_v2_capable() ? SMC_V2 : 0;
950 ini->smc_type_v1 = SMC_TYPE_B;
951 ini->smc_type_v2 = smc_ism_is_v2_capable() ? SMC_TYPE_D : SMC_TYPE_N;
952
953
954 if (smc_vlan_by_tcpsk(smc->clcsock, ini)) {
955 ini->smcd_version &= ~SMC_V1;
956 ini->smc_type_v1 = SMC_TYPE_N;
957 if (!ini->smcd_version) {
958 rc = SMC_CLC_DECL_GETVLANERR;
959 goto fallback;
960 }
961 }
962
963 rc = smc_find_proposal_devices(smc, ini);
964 if (rc)
965 goto fallback;
966
967 buf = kzalloc(SMC_CLC_MAX_ACCEPT_LEN, GFP_KERNEL);
968 if (!buf) {
969 rc = SMC_CLC_DECL_MEM;
970 goto fallback;
971 }
972 aclc2 = (struct smc_clc_msg_accept_confirm_v2 *)buf;
973 aclc = (struct smc_clc_msg_accept_confirm *)aclc2;
974
975
976 rc = smc_connect_clc(smc, aclc2, ini);
977 if (rc)
978 goto vlan_cleanup;
979
980
981 rc = smc_connect_check_aclc(ini, aclc);
982 version = aclc->hdr.version == SMC_V1 ? SMC_V1 : SMC_V2;
983 ini->smcd_version = version;
984 if (rc)
985 goto vlan_cleanup;
986
987
988 if (aclc->hdr.typev1 == SMC_TYPE_R)
989 rc = smc_connect_rdma(smc, aclc, ini);
990 else if (aclc->hdr.typev1 == SMC_TYPE_D)
991 rc = smc_connect_ism(smc, aclc, ini);
992 if (rc)
993 goto vlan_cleanup;
994
995 smc_connect_ism_vlan_cleanup(smc, ini);
996 kfree(buf);
997 kfree(ini);
998 return 0;
999
1000vlan_cleanup:
1001 smc_connect_ism_vlan_cleanup(smc, ini);
1002 kfree(buf);
1003fallback:
1004 kfree(ini);
1005 return smc_connect_decline_fallback(smc, rc, version);
1006}
1007
1008static void smc_connect_work(struct work_struct *work)
1009{
1010 struct smc_sock *smc = container_of(work, struct smc_sock,
1011 connect_work);
1012 long timeo = smc->sk.sk_sndtimeo;
1013 int rc = 0;
1014
1015 if (!timeo)
1016 timeo = MAX_SCHEDULE_TIMEOUT;
1017 lock_sock(smc->clcsock->sk);
1018 if (smc->clcsock->sk->sk_err) {
1019 smc->sk.sk_err = smc->clcsock->sk->sk_err;
1020 } else if ((1 << smc->clcsock->sk->sk_state) &
1021 (TCPF_SYN_SENT | TCP_SYN_RECV)) {
1022 rc = sk_stream_wait_connect(smc->clcsock->sk, &timeo);
1023 if ((rc == -EPIPE) &&
1024 ((1 << smc->clcsock->sk->sk_state) &
1025 (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)))
1026 rc = 0;
1027 }
1028 release_sock(smc->clcsock->sk);
1029 lock_sock(&smc->sk);
1030 if (rc != 0 || smc->sk.sk_err) {
1031 smc->sk.sk_state = SMC_CLOSED;
1032 if (rc == -EPIPE || rc == -EAGAIN)
1033 smc->sk.sk_err = EPIPE;
1034 else if (signal_pending(current))
1035 smc->sk.sk_err = -sock_intr_errno(timeo);
1036 sock_put(&smc->sk);
1037 goto out;
1038 }
1039
1040 rc = __smc_connect(smc);
1041 if (rc < 0)
1042 smc->sk.sk_err = -rc;
1043
1044out:
1045 if (!sock_flag(&smc->sk, SOCK_DEAD)) {
1046 if (smc->sk.sk_err) {
1047 smc->sk.sk_state_change(&smc->sk);
1048 } else {
1049 smc->clcsock->sk->sk_write_space(smc->clcsock->sk);
1050 smc->sk.sk_write_space(&smc->sk);
1051 }
1052 }
1053 release_sock(&smc->sk);
1054}
1055
1056static int smc_connect(struct socket *sock, struct sockaddr *addr,
1057 int alen, int flags)
1058{
1059 struct sock *sk = sock->sk;
1060 struct smc_sock *smc;
1061 int rc = -EINVAL;
1062
1063 smc = smc_sk(sk);
1064
1065
1066 if (alen < sizeof(addr->sa_family))
1067 goto out_err;
1068 if (addr->sa_family != AF_INET && addr->sa_family != AF_INET6)
1069 goto out_err;
1070
1071 lock_sock(sk);
1072 switch (sk->sk_state) {
1073 default:
1074 goto out;
1075 case SMC_ACTIVE:
1076 rc = -EISCONN;
1077 goto out;
1078 case SMC_INIT:
1079 break;
1080 }
1081
1082 smc_copy_sock_settings_to_clc(smc);
1083 tcp_sk(smc->clcsock->sk)->syn_smc = 1;
1084 if (smc->connect_nonblock) {
1085 rc = -EALREADY;
1086 goto out;
1087 }
1088 rc = kernel_connect(smc->clcsock, addr, alen, flags);
1089 if (rc && rc != -EINPROGRESS)
1090 goto out;
1091
1092 sock_hold(&smc->sk);
1093 if (smc->use_fallback)
1094 goto out;
1095 if (flags & O_NONBLOCK) {
1096 if (queue_work(smc_hs_wq, &smc->connect_work))
1097 smc->connect_nonblock = 1;
1098 rc = -EINPROGRESS;
1099 } else {
1100 rc = __smc_connect(smc);
1101 if (rc < 0)
1102 goto out;
1103 else
1104 rc = 0;
1105 }
1106
1107out:
1108 release_sock(sk);
1109out_err:
1110 return rc;
1111}
1112
1113static int smc_clcsock_accept(struct smc_sock *lsmc, struct smc_sock **new_smc)
1114{
1115 struct socket *new_clcsock = NULL;
1116 struct sock *lsk = &lsmc->sk;
1117 struct sock *new_sk;
1118 int rc = -EINVAL;
1119
1120 release_sock(lsk);
1121 new_sk = smc_sock_alloc(sock_net(lsk), NULL, lsk->sk_protocol);
1122 if (!new_sk) {
1123 rc = -ENOMEM;
1124 lsk->sk_err = ENOMEM;
1125 *new_smc = NULL;
1126 lock_sock(lsk);
1127 goto out;
1128 }
1129 *new_smc = smc_sk(new_sk);
1130
1131 mutex_lock(&lsmc->clcsock_release_lock);
1132 if (lsmc->clcsock)
1133 rc = kernel_accept(lsmc->clcsock, &new_clcsock, SOCK_NONBLOCK);
1134 mutex_unlock(&lsmc->clcsock_release_lock);
1135 lock_sock(lsk);
1136 if (rc < 0 && rc != -EAGAIN)
1137 lsk->sk_err = -rc;
1138 if (rc < 0 || lsk->sk_state == SMC_CLOSED) {
1139 new_sk->sk_prot->unhash(new_sk);
1140 if (new_clcsock)
1141 sock_release(new_clcsock);
1142 new_sk->sk_state = SMC_CLOSED;
1143 sock_set_flag(new_sk, SOCK_DEAD);
1144 sock_put(new_sk);
1145 *new_smc = NULL;
1146 goto out;
1147 }
1148
1149
1150
1151
1152 new_clcsock->sk->sk_data_ready = lsmc->clcsk_data_ready;
1153 (*new_smc)->clcsock = new_clcsock;
1154out:
1155 return rc;
1156}
1157
1158
1159
1160
1161static void smc_accept_enqueue(struct sock *parent, struct sock *sk)
1162{
1163 struct smc_sock *par = smc_sk(parent);
1164
1165 sock_hold(sk);
1166 spin_lock(&par->accept_q_lock);
1167 list_add_tail(&smc_sk(sk)->accept_q, &par->accept_q);
1168 spin_unlock(&par->accept_q_lock);
1169 sk_acceptq_added(parent);
1170}
1171
1172
1173static void smc_accept_unlink(struct sock *sk)
1174{
1175 struct smc_sock *par = smc_sk(sk)->listen_smc;
1176
1177 spin_lock(&par->accept_q_lock);
1178 list_del_init(&smc_sk(sk)->accept_q);
1179 spin_unlock(&par->accept_q_lock);
1180 sk_acceptq_removed(&smc_sk(sk)->listen_smc->sk);
1181 sock_put(sk);
1182}
1183
1184
1185
1186
1187struct sock *smc_accept_dequeue(struct sock *parent,
1188 struct socket *new_sock)
1189{
1190 struct smc_sock *isk, *n;
1191 struct sock *new_sk;
1192
1193 list_for_each_entry_safe(isk, n, &smc_sk(parent)->accept_q, accept_q) {
1194 new_sk = (struct sock *)isk;
1195
1196 smc_accept_unlink(new_sk);
1197 if (new_sk->sk_state == SMC_CLOSED) {
1198 new_sk->sk_prot->unhash(new_sk);
1199 if (isk->clcsock) {
1200 sock_release(isk->clcsock);
1201 isk->clcsock = NULL;
1202 }
1203 sock_put(new_sk);
1204 continue;
1205 }
1206 if (new_sock) {
1207 sock_graft(new_sk, new_sock);
1208 if (isk->use_fallback) {
1209 smc_sk(new_sk)->clcsock->file = new_sock->file;
1210 isk->clcsock->file->private_data = isk->clcsock;
1211 }
1212 }
1213 return new_sk;
1214 }
1215 return NULL;
1216}
1217
1218
1219void smc_close_non_accepted(struct sock *sk)
1220{
1221 struct smc_sock *smc = smc_sk(sk);
1222
1223 sock_hold(sk);
1224 lock_sock(sk);
1225 if (!sk->sk_lingertime)
1226
1227 sk->sk_lingertime = SMC_MAX_STREAM_WAIT_TIMEOUT;
1228 __smc_release(smc);
1229 release_sock(sk);
1230 sock_put(sk);
1231 sock_put(sk);
1232}
1233
1234static int smcr_serv_conf_first_link(struct smc_sock *smc)
1235{
1236 struct smc_link *link = smc->conn.lnk;
1237 struct smc_llc_qentry *qentry;
1238 int rc;
1239
1240 if (smcr_link_reg_rmb(link, smc->conn.rmb_desc))
1241 return SMC_CLC_DECL_ERR_REGRMB;
1242
1243
1244 rc = smc_llc_send_confirm_link(link, SMC_LLC_REQ);
1245 if (rc < 0)
1246 return SMC_CLC_DECL_TIMEOUT_CL;
1247
1248
1249 qentry = smc_llc_wait(link->lgr, link, SMC_LLC_WAIT_TIME,
1250 SMC_LLC_CONFIRM_LINK);
1251 if (!qentry) {
1252 struct smc_clc_msg_decline dclc;
1253
1254 rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc),
1255 SMC_CLC_DECLINE, CLC_WAIT_TIME_SHORT);
1256 return rc == -EAGAIN ? SMC_CLC_DECL_TIMEOUT_CL : rc;
1257 }
1258 smc_llc_save_peer_uid(qentry);
1259 rc = smc_llc_eval_conf_link(qentry, SMC_LLC_RESP);
1260 smc_llc_flow_qentry_del(&link->lgr->llc_flow_lcl);
1261 if (rc)
1262 return SMC_CLC_DECL_RMBE_EC;
1263
1264
1265 smc->conn.rmb_desc->is_conf_rkey = true;
1266
1267 smc_llc_link_active(link);
1268 smcr_lgr_set_type(link->lgr, SMC_LGR_SINGLE);
1269
1270
1271 smc_llc_srv_add_link(link);
1272 return 0;
1273}
1274
1275
1276static void smc_listen_out(struct smc_sock *new_smc)
1277{
1278 struct smc_sock *lsmc = new_smc->listen_smc;
1279 struct sock *newsmcsk = &new_smc->sk;
1280
1281 if (lsmc->sk.sk_state == SMC_LISTEN) {
1282 lock_sock_nested(&lsmc->sk, SINGLE_DEPTH_NESTING);
1283 smc_accept_enqueue(&lsmc->sk, newsmcsk);
1284 release_sock(&lsmc->sk);
1285 } else {
1286 smc_close_non_accepted(newsmcsk);
1287 }
1288
1289
1290 lsmc->sk.sk_data_ready(&lsmc->sk);
1291 sock_put(&lsmc->sk);
1292}
1293
1294
1295static void smc_listen_out_connected(struct smc_sock *new_smc)
1296{
1297 struct sock *newsmcsk = &new_smc->sk;
1298
1299 sk_refcnt_debug_inc(newsmcsk);
1300 if (newsmcsk->sk_state == SMC_INIT)
1301 newsmcsk->sk_state = SMC_ACTIVE;
1302
1303 smc_listen_out(new_smc);
1304}
1305
1306
1307static void smc_listen_out_err(struct smc_sock *new_smc)
1308{
1309 struct sock *newsmcsk = &new_smc->sk;
1310
1311 if (newsmcsk->sk_state == SMC_INIT)
1312 sock_put(&new_smc->sk);
1313 newsmcsk->sk_state = SMC_CLOSED;
1314
1315 smc_listen_out(new_smc);
1316}
1317
1318
1319static void smc_listen_decline(struct smc_sock *new_smc, int reason_code,
1320 int local_first, u8 version)
1321{
1322
1323 smc_conn_abort(new_smc, local_first);
1324 if (reason_code < 0) {
1325 smc_listen_out_err(new_smc);
1326 return;
1327 }
1328 smc_switch_to_fallback(new_smc);
1329 new_smc->fallback_rsn = reason_code;
1330 if (reason_code && reason_code != SMC_CLC_DECL_PEERDECL) {
1331 if (smc_clc_send_decline(new_smc, reason_code, version) < 0) {
1332 smc_listen_out_err(new_smc);
1333 return;
1334 }
1335 }
1336 smc_listen_out_connected(new_smc);
1337}
1338
1339
1340static int smc_listen_v2_check(struct smc_sock *new_smc,
1341 struct smc_clc_msg_proposal *pclc,
1342 struct smc_init_info *ini)
1343{
1344 struct smc_clc_smcd_v2_extension *pclc_smcd_v2_ext;
1345 struct smc_clc_v2_extension *pclc_v2_ext;
1346 int rc = SMC_CLC_DECL_PEERNOSMC;
1347
1348 ini->smc_type_v1 = pclc->hdr.typev1;
1349 ini->smc_type_v2 = pclc->hdr.typev2;
1350 ini->smcd_version = ini->smc_type_v1 != SMC_TYPE_N ? SMC_V1 : 0;
1351 if (pclc->hdr.version > SMC_V1)
1352 ini->smcd_version |=
1353 ini->smc_type_v2 != SMC_TYPE_N ? SMC_V2 : 0;
1354 if (!(ini->smcd_version & SMC_V2)) {
1355 rc = SMC_CLC_DECL_PEERNOSMC;
1356 goto out;
1357 }
1358 if (!smc_ism_is_v2_capable()) {
1359 ini->smcd_version &= ~SMC_V2;
1360 rc = SMC_CLC_DECL_NOISM2SUPP;
1361 goto out;
1362 }
1363 pclc_v2_ext = smc_get_clc_v2_ext(pclc);
1364 if (!pclc_v2_ext) {
1365 ini->smcd_version &= ~SMC_V2;
1366 rc = SMC_CLC_DECL_NOV2EXT;
1367 goto out;
1368 }
1369 pclc_smcd_v2_ext = smc_get_clc_smcd_v2_ext(pclc_v2_ext);
1370 if (!pclc_smcd_v2_ext) {
1371 ini->smcd_version &= ~SMC_V2;
1372 rc = SMC_CLC_DECL_NOV2DEXT;
1373 }
1374
1375out:
1376 if (!ini->smcd_version)
1377 return rc;
1378
1379 return 0;
1380}
1381
1382
1383static int smc_listen_prfx_check(struct smc_sock *new_smc,
1384 struct smc_clc_msg_proposal *pclc)
1385{
1386 struct smc_clc_msg_proposal_prefix *pclc_prfx;
1387 struct socket *newclcsock = new_smc->clcsock;
1388
1389 if (pclc->hdr.typev1 == SMC_TYPE_N)
1390 return 0;
1391 pclc_prfx = smc_clc_proposal_get_prefix(pclc);
1392 if (smc_clc_prfx_match(newclcsock, pclc_prfx))
1393 return SMC_CLC_DECL_DIFFPREFIX;
1394
1395 return 0;
1396}
1397
1398
1399static int smc_listen_rdma_init(struct smc_sock *new_smc,
1400 struct smc_init_info *ini)
1401{
1402 int rc;
1403
1404
1405 rc = smc_conn_create(new_smc, ini);
1406 if (rc)
1407 return rc;
1408
1409
1410 if (smc_buf_create(new_smc, false))
1411 return SMC_CLC_DECL_MEM;
1412
1413 return 0;
1414}
1415
1416
1417static int smc_listen_ism_init(struct smc_sock *new_smc,
1418 struct smc_init_info *ini)
1419{
1420 int rc;
1421
1422 rc = smc_conn_create(new_smc, ini);
1423 if (rc)
1424 return rc;
1425
1426
1427 rc = smc_buf_create(new_smc, true);
1428 if (rc) {
1429 smc_conn_abort(new_smc, ini->first_contact_local);
1430 return (rc == -ENOSPC) ? SMC_CLC_DECL_MAX_DMB :
1431 SMC_CLC_DECL_MEM;
1432 }
1433
1434 return 0;
1435}
1436
1437static bool smc_is_already_selected(struct smcd_dev *smcd,
1438 struct smc_init_info *ini,
1439 int matches)
1440{
1441 int i;
1442
1443 for (i = 0; i < matches; i++)
1444 if (smcd == ini->ism_dev[i])
1445 return true;
1446
1447 return false;
1448}
1449
1450
1451static void smc_check_ism_v2_match(struct smc_init_info *ini,
1452 u16 proposed_chid, u64 proposed_gid,
1453 unsigned int *matches)
1454{
1455 struct smcd_dev *smcd;
1456
1457 list_for_each_entry(smcd, &smcd_dev_list.list, list) {
1458 if (smcd->going_away)
1459 continue;
1460 if (smc_is_already_selected(smcd, ini, *matches))
1461 continue;
1462 if (smc_ism_get_chid(smcd) == proposed_chid &&
1463 !smc_ism_cantalk(proposed_gid, ISM_RESERVED_VLANID, smcd)) {
1464 ini->ism_peer_gid[*matches] = proposed_gid;
1465 ini->ism_dev[*matches] = smcd;
1466 (*matches)++;
1467 break;
1468 }
1469 }
1470}
1471
1472static void smc_find_ism_store_rc(u32 rc, struct smc_init_info *ini)
1473{
1474 if (!ini->rc)
1475 ini->rc = rc;
1476}
1477
1478static void smc_find_ism_v2_device_serv(struct smc_sock *new_smc,
1479 struct smc_clc_msg_proposal *pclc,
1480 struct smc_init_info *ini)
1481{
1482 struct smc_clc_smcd_v2_extension *smcd_v2_ext;
1483 struct smc_clc_v2_extension *smc_v2_ext;
1484 struct smc_clc_msg_smcd *pclc_smcd;
1485 unsigned int matches = 0;
1486 u8 smcd_version;
1487 u8 *eid = NULL;
1488 int i, rc;
1489
1490 if (!(ini->smcd_version & SMC_V2) || !smcd_indicated(ini->smc_type_v2))
1491 goto not_found;
1492
1493 pclc_smcd = smc_get_clc_msg_smcd(pclc);
1494 smc_v2_ext = smc_get_clc_v2_ext(pclc);
1495 smcd_v2_ext = smc_get_clc_smcd_v2_ext(smc_v2_ext);
1496 if (!smcd_v2_ext ||
1497 !smc_v2_ext->hdr.flag.seid) {
1498 smc_find_ism_store_rc(SMC_CLC_DECL_NOSEID, ini);
1499 goto not_found;
1500 }
1501
1502 mutex_lock(&smcd_dev_list.mutex);
1503 if (pclc_smcd->ism.chid)
1504
1505 smc_check_ism_v2_match(ini, ntohs(pclc_smcd->ism.chid),
1506 ntohll(pclc_smcd->ism.gid), &matches);
1507 for (i = 1; i <= smc_v2_ext->hdr.ism_gid_cnt; i++) {
1508
1509
1510
1511 smc_check_ism_v2_match(ini,
1512 ntohs(smcd_v2_ext->gidchid[i - 1].chid),
1513 ntohll(smcd_v2_ext->gidchid[i - 1].gid),
1514 &matches);
1515 }
1516 mutex_unlock(&smcd_dev_list.mutex);
1517
1518 if (ini->ism_dev[0]) {
1519 smc_ism_get_system_eid(ini->ism_dev[0], &eid);
1520 if (memcmp(eid, smcd_v2_ext->system_eid, SMC_MAX_EID_LEN))
1521 goto not_found;
1522 } else {
1523 goto not_found;
1524 }
1525
1526
1527 smcd_version = ini->smcd_version;
1528 for (i = 0; i < matches; i++) {
1529 ini->smcd_version = SMC_V2;
1530 ini->is_smcd = true;
1531 ini->ism_selected = i;
1532 rc = smc_listen_ism_init(new_smc, ini);
1533 if (rc) {
1534 smc_find_ism_store_rc(rc, ini);
1535
1536 continue;
1537 }
1538 return;
1539 }
1540
1541 ini->smcd_version = smcd_version;
1542
1543not_found:
1544 ini->smcd_version &= ~SMC_V2;
1545 ini->ism_dev[0] = NULL;
1546 ini->is_smcd = false;
1547}
1548
1549static void smc_find_ism_v1_device_serv(struct smc_sock *new_smc,
1550 struct smc_clc_msg_proposal *pclc,
1551 struct smc_init_info *ini)
1552{
1553 struct smc_clc_msg_smcd *pclc_smcd = smc_get_clc_msg_smcd(pclc);
1554 int rc = 0;
1555
1556
1557 if (!(ini->smcd_version & SMC_V1) || !smcd_indicated(ini->smc_type_v1))
1558 goto not_found;
1559 ini->is_smcd = true;
1560 ini->ism_peer_gid[0] = ntohll(pclc_smcd->ism.gid);
1561 rc = smc_find_ism_device(new_smc, ini);
1562 if (rc)
1563 goto not_found;
1564 ini->ism_selected = 0;
1565 rc = smc_listen_ism_init(new_smc, ini);
1566 if (!rc)
1567 return;
1568
1569not_found:
1570 smc_find_ism_store_rc(rc, ini);
1571 ini->ism_dev[0] = NULL;
1572 ini->is_smcd = false;
1573}
1574
1575
1576static int smc_listen_rdma_reg(struct smc_sock *new_smc, bool local_first)
1577{
1578 struct smc_connection *conn = &new_smc->conn;
1579
1580 if (!local_first) {
1581 if (smcr_lgr_reg_rmbs(conn->lnk, conn->rmb_desc))
1582 return SMC_CLC_DECL_ERR_REGRMB;
1583 }
1584 smc_rmb_sync_sg_for_device(&new_smc->conn);
1585
1586 return 0;
1587}
1588
1589static int smc_find_rdma_v1_device_serv(struct smc_sock *new_smc,
1590 struct smc_clc_msg_proposal *pclc,
1591 struct smc_init_info *ini)
1592{
1593 int rc;
1594
1595 if (!smcr_indicated(ini->smc_type_v1))
1596 return SMC_CLC_DECL_NOSMCDEV;
1597
1598
1599 ini->ib_lcl = &pclc->lcl;
1600 rc = smc_find_rdma_device(new_smc, ini);
1601 if (rc) {
1602
1603 if (ini->smc_type_v1 == SMC_TYPE_B)
1604
1605 rc = SMC_CLC_DECL_NOSMCDEV;
1606 return rc;
1607 }
1608 rc = smc_listen_rdma_init(new_smc, ini);
1609 if (rc)
1610 return rc;
1611 return smc_listen_rdma_reg(new_smc, ini->first_contact_local);
1612}
1613
1614
1615static int smc_listen_find_device(struct smc_sock *new_smc,
1616 struct smc_clc_msg_proposal *pclc,
1617 struct smc_init_info *ini)
1618{
1619 int rc;
1620
1621
1622 smc_find_ism_v2_device_serv(new_smc, pclc, ini);
1623 if (ini->ism_dev[0])
1624 return 0;
1625
1626 if (!(ini->smcd_version & SMC_V1))
1627 return ini->rc ?: SMC_CLC_DECL_NOSMCD2DEV;
1628
1629
1630 rc = smc_listen_prfx_check(new_smc, pclc);
1631 if (rc)
1632 return ini->rc ?: rc;
1633
1634
1635 if (smc_vlan_by_tcpsk(new_smc->clcsock, ini))
1636 return ini->rc ?: SMC_CLC_DECL_GETVLANERR;
1637
1638
1639 smc_find_ism_v1_device_serv(new_smc, pclc, ini);
1640 if (ini->ism_dev[0])
1641 return 0;
1642
1643 if (pclc->hdr.typev1 == SMC_TYPE_D)
1644
1645 return ini->rc ?: SMC_CLC_DECL_NOSMCDDEV;
1646
1647
1648 rc = smc_find_rdma_v1_device_serv(new_smc, pclc, ini);
1649 smc_find_ism_store_rc(rc, ini);
1650
1651 return (!rc) ? 0 : ini->rc;
1652}
1653
1654
1655static int smc_listen_rdma_finish(struct smc_sock *new_smc,
1656 struct smc_clc_msg_accept_confirm *cclc,
1657 bool local_first)
1658{
1659 struct smc_link *link = new_smc->conn.lnk;
1660 int reason_code = 0;
1661
1662 if (local_first)
1663 smc_link_save_peer_info(link, cclc);
1664
1665 if (smc_rmb_rtoken_handling(&new_smc->conn, link, cclc))
1666 return SMC_CLC_DECL_ERR_RTOK;
1667
1668 if (local_first) {
1669 if (smc_ib_ready_link(link))
1670 return SMC_CLC_DECL_ERR_RDYLNK;
1671
1672 smc_llc_flow_initiate(link->lgr, SMC_LLC_FLOW_ADD_LINK);
1673 reason_code = smcr_serv_conf_first_link(new_smc);
1674 smc_llc_flow_stop(link->lgr, &link->lgr->llc_flow_lcl);
1675 }
1676 return reason_code;
1677}
1678
1679
1680static void smc_listen_work(struct work_struct *work)
1681{
1682 struct smc_sock *new_smc = container_of(work, struct smc_sock,
1683 smc_listen_work);
1684 u8 version = smc_ism_is_v2_capable() ? SMC_V2 : SMC_V1;
1685 struct socket *newclcsock = new_smc->clcsock;
1686 struct smc_clc_msg_accept_confirm *cclc;
1687 struct smc_clc_msg_proposal_area *buf;
1688 struct smc_clc_msg_proposal *pclc;
1689 struct smc_init_info *ini = NULL;
1690 int rc = 0;
1691
1692 if (new_smc->listen_smc->sk.sk_state != SMC_LISTEN)
1693 return smc_listen_out_err(new_smc);
1694
1695 if (new_smc->use_fallback) {
1696 smc_listen_out_connected(new_smc);
1697 return;
1698 }
1699
1700
1701 if (!tcp_sk(newclcsock->sk)->syn_smc) {
1702 smc_switch_to_fallback(new_smc);
1703 new_smc->fallback_rsn = SMC_CLC_DECL_PEERNOSMC;
1704 smc_listen_out_connected(new_smc);
1705 return;
1706 }
1707
1708
1709
1710
1711 buf = kzalloc(sizeof(*buf), GFP_KERNEL);
1712 if (!buf) {
1713 rc = SMC_CLC_DECL_MEM;
1714 goto out_decl;
1715 }
1716 pclc = (struct smc_clc_msg_proposal *)buf;
1717 rc = smc_clc_wait_msg(new_smc, pclc, sizeof(*buf),
1718 SMC_CLC_PROPOSAL, CLC_WAIT_TIME);
1719 if (rc)
1720 goto out_decl;
1721 version = pclc->hdr.version == SMC_V1 ? SMC_V1 : version;
1722
1723
1724 if (using_ipsec(new_smc)) {
1725 rc = SMC_CLC_DECL_IPSEC;
1726 goto out_decl;
1727 }
1728
1729 ini = kzalloc(sizeof(*ini), GFP_KERNEL);
1730 if (!ini) {
1731 rc = SMC_CLC_DECL_MEM;
1732 goto out_decl;
1733 }
1734
1735
1736 rc = smc_listen_v2_check(new_smc, pclc, ini);
1737 if (rc)
1738 goto out_decl;
1739
1740 mutex_lock(&smc_server_lgr_pending);
1741 smc_close_init(new_smc);
1742 smc_rx_init(new_smc);
1743 smc_tx_init(new_smc);
1744
1745
1746 rc = smc_listen_find_device(new_smc, pclc, ini);
1747 if (rc)
1748 goto out_unlock;
1749
1750
1751 rc = smc_clc_send_accept(new_smc, ini->first_contact_local,
1752 ini->smcd_version == SMC_V2 ? SMC_V2 : SMC_V1);
1753 if (rc)
1754 goto out_unlock;
1755
1756
1757 if (ini->is_smcd)
1758 mutex_unlock(&smc_server_lgr_pending);
1759
1760
1761 memset(buf, 0, sizeof(*buf));
1762 cclc = (struct smc_clc_msg_accept_confirm *)buf;
1763 rc = smc_clc_wait_msg(new_smc, cclc, sizeof(*buf),
1764 SMC_CLC_CONFIRM, CLC_WAIT_TIME);
1765 if (rc) {
1766 if (!ini->is_smcd)
1767 goto out_unlock;
1768 goto out_decl;
1769 }
1770
1771
1772 if (!ini->is_smcd) {
1773 rc = smc_listen_rdma_finish(new_smc, cclc,
1774 ini->first_contact_local);
1775 if (rc)
1776 goto out_unlock;
1777 mutex_unlock(&smc_server_lgr_pending);
1778 }
1779 smc_conn_save_peer_info(new_smc, cclc);
1780 smc_listen_out_connected(new_smc);
1781 goto out_free;
1782
1783out_unlock:
1784 mutex_unlock(&smc_server_lgr_pending);
1785out_decl:
1786 smc_listen_decline(new_smc, rc, ini ? ini->first_contact_local : 0,
1787 version);
1788out_free:
1789 kfree(ini);
1790 kfree(buf);
1791}
1792
1793static void smc_tcp_listen_work(struct work_struct *work)
1794{
1795 struct smc_sock *lsmc = container_of(work, struct smc_sock,
1796 tcp_listen_work);
1797 struct sock *lsk = &lsmc->sk;
1798 struct smc_sock *new_smc;
1799 int rc = 0;
1800
1801 lock_sock(lsk);
1802 while (lsk->sk_state == SMC_LISTEN) {
1803 rc = smc_clcsock_accept(lsmc, &new_smc);
1804 if (rc)
1805 goto out;
1806 if (!new_smc)
1807 continue;
1808
1809 new_smc->listen_smc = lsmc;
1810 new_smc->use_fallback = lsmc->use_fallback;
1811 new_smc->fallback_rsn = lsmc->fallback_rsn;
1812 sock_hold(lsk);
1813 INIT_WORK(&new_smc->smc_listen_work, smc_listen_work);
1814 smc_copy_sock_settings_to_smc(new_smc);
1815 new_smc->sk.sk_sndbuf = lsmc->sk.sk_sndbuf;
1816 new_smc->sk.sk_rcvbuf = lsmc->sk.sk_rcvbuf;
1817 sock_hold(&new_smc->sk);
1818 if (!queue_work(smc_hs_wq, &new_smc->smc_listen_work))
1819 sock_put(&new_smc->sk);
1820 }
1821
1822out:
1823 release_sock(lsk);
1824 sock_put(&lsmc->sk);
1825}
1826
1827static void smc_clcsock_data_ready(struct sock *listen_clcsock)
1828{
1829 struct smc_sock *lsmc;
1830
1831 lsmc = (struct smc_sock *)
1832 ((uintptr_t)listen_clcsock->sk_user_data & ~SK_USER_DATA_NOCOPY);
1833 if (!lsmc)
1834 return;
1835 lsmc->clcsk_data_ready(listen_clcsock);
1836 if (lsmc->sk.sk_state == SMC_LISTEN) {
1837 sock_hold(&lsmc->sk);
1838 if (!queue_work(smc_hs_wq, &lsmc->tcp_listen_work))
1839 sock_put(&lsmc->sk);
1840 }
1841}
1842
1843static int smc_listen(struct socket *sock, int backlog)
1844{
1845 struct sock *sk = sock->sk;
1846 struct smc_sock *smc;
1847 int rc;
1848
1849 smc = smc_sk(sk);
1850 lock_sock(sk);
1851
1852 rc = -EINVAL;
1853 if ((sk->sk_state != SMC_INIT && sk->sk_state != SMC_LISTEN) ||
1854 smc->connect_nonblock)
1855 goto out;
1856
1857 rc = 0;
1858 if (sk->sk_state == SMC_LISTEN) {
1859 sk->sk_max_ack_backlog = backlog;
1860 goto out;
1861 }
1862
1863
1864
1865 smc_copy_sock_settings_to_clc(smc);
1866 if (!smc->use_fallback)
1867 tcp_sk(smc->clcsock->sk)->syn_smc = 1;
1868
1869
1870
1871
1872 smc->clcsk_data_ready = smc->clcsock->sk->sk_data_ready;
1873 smc->clcsock->sk->sk_data_ready = smc_clcsock_data_ready;
1874 smc->clcsock->sk->sk_user_data =
1875 (void *)((uintptr_t)smc | SK_USER_DATA_NOCOPY);
1876 rc = kernel_listen(smc->clcsock, backlog);
1877 if (rc)
1878 goto out;
1879 sk->sk_max_ack_backlog = backlog;
1880 sk->sk_ack_backlog = 0;
1881 sk->sk_state = SMC_LISTEN;
1882
1883out:
1884 release_sock(sk);
1885 return rc;
1886}
1887
1888static int smc_accept(struct socket *sock, struct socket *new_sock,
1889 int flags, bool kern)
1890{
1891 struct sock *sk = sock->sk, *nsk;
1892 DECLARE_WAITQUEUE(wait, current);
1893 struct smc_sock *lsmc;
1894 long timeo;
1895 int rc = 0;
1896
1897 lsmc = smc_sk(sk);
1898 sock_hold(sk);
1899 lock_sock(sk);
1900
1901 if (lsmc->sk.sk_state != SMC_LISTEN) {
1902 rc = -EINVAL;
1903 release_sock(sk);
1904 goto out;
1905 }
1906
1907
1908 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
1909 add_wait_queue_exclusive(sk_sleep(sk), &wait);
1910 while (!(nsk = smc_accept_dequeue(sk, new_sock))) {
1911 set_current_state(TASK_INTERRUPTIBLE);
1912 if (!timeo) {
1913 rc = -EAGAIN;
1914 break;
1915 }
1916 release_sock(sk);
1917 timeo = schedule_timeout(timeo);
1918
1919 sched_annotate_sleep();
1920 lock_sock(sk);
1921 if (signal_pending(current)) {
1922 rc = sock_intr_errno(timeo);
1923 break;
1924 }
1925 }
1926 set_current_state(TASK_RUNNING);
1927 remove_wait_queue(sk_sleep(sk), &wait);
1928
1929 if (!rc)
1930 rc = sock_error(nsk);
1931 release_sock(sk);
1932 if (rc)
1933 goto out;
1934
1935 if (lsmc->sockopt_defer_accept && !(flags & O_NONBLOCK)) {
1936
1937 timeo = msecs_to_jiffies(lsmc->sockopt_defer_accept *
1938 MSEC_PER_SEC);
1939 if (smc_sk(nsk)->use_fallback) {
1940 struct sock *clcsk = smc_sk(nsk)->clcsock->sk;
1941
1942 lock_sock(clcsk);
1943 if (skb_queue_empty(&clcsk->sk_receive_queue))
1944 sk_wait_data(clcsk, &timeo, NULL);
1945 release_sock(clcsk);
1946 } else if (!atomic_read(&smc_sk(nsk)->conn.bytes_to_rcv)) {
1947 lock_sock(nsk);
1948 smc_rx_wait(smc_sk(nsk), &timeo, smc_rx_data_available);
1949 release_sock(nsk);
1950 }
1951 }
1952
1953out:
1954 sock_put(sk);
1955 return rc;
1956}
1957
1958static int smc_getname(struct socket *sock, struct sockaddr *addr,
1959 int peer)
1960{
1961 struct smc_sock *smc;
1962
1963 if (peer && (sock->sk->sk_state != SMC_ACTIVE) &&
1964 (sock->sk->sk_state != SMC_APPCLOSEWAIT1))
1965 return -ENOTCONN;
1966
1967 smc = smc_sk(sock->sk);
1968
1969 return smc->clcsock->ops->getname(smc->clcsock, addr, peer);
1970}
1971
1972static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
1973{
1974 struct sock *sk = sock->sk;
1975 struct smc_sock *smc;
1976 int rc = -EPIPE;
1977
1978 smc = smc_sk(sk);
1979 lock_sock(sk);
1980 if ((sk->sk_state != SMC_ACTIVE) &&
1981 (sk->sk_state != SMC_APPCLOSEWAIT1) &&
1982 (sk->sk_state != SMC_INIT))
1983 goto out;
1984
1985 if (msg->msg_flags & MSG_FASTOPEN) {
1986 if (sk->sk_state == SMC_INIT && !smc->connect_nonblock) {
1987 smc_switch_to_fallback(smc);
1988 smc->fallback_rsn = SMC_CLC_DECL_OPTUNSUPP;
1989 } else {
1990 rc = -EINVAL;
1991 goto out;
1992 }
1993 }
1994
1995 if (smc->use_fallback)
1996 rc = smc->clcsock->ops->sendmsg(smc->clcsock, msg, len);
1997 else
1998 rc = smc_tx_sendmsg(smc, msg, len);
1999out:
2000 release_sock(sk);
2001 return rc;
2002}
2003
2004static int smc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
2005 int flags)
2006{
2007 struct sock *sk = sock->sk;
2008 struct smc_sock *smc;
2009 int rc = -ENOTCONN;
2010
2011 smc = smc_sk(sk);
2012 lock_sock(sk);
2013 if (sk->sk_state == SMC_CLOSED && (sk->sk_shutdown & RCV_SHUTDOWN)) {
2014
2015 rc = 0;
2016 goto out;
2017 }
2018 if ((sk->sk_state == SMC_INIT) ||
2019 (sk->sk_state == SMC_LISTEN) ||
2020 (sk->sk_state == SMC_CLOSED))
2021 goto out;
2022
2023 if (sk->sk_state == SMC_PEERFINCLOSEWAIT) {
2024 rc = 0;
2025 goto out;
2026 }
2027
2028 if (smc->use_fallback) {
2029 rc = smc->clcsock->ops->recvmsg(smc->clcsock, msg, len, flags);
2030 } else {
2031 msg->msg_namelen = 0;
2032 rc = smc_rx_recvmsg(smc, msg, NULL, len, flags);
2033 }
2034
2035out:
2036 release_sock(sk);
2037 return rc;
2038}
2039
2040static __poll_t smc_accept_poll(struct sock *parent)
2041{
2042 struct smc_sock *isk = smc_sk(parent);
2043 __poll_t mask = 0;
2044
2045 spin_lock(&isk->accept_q_lock);
2046 if (!list_empty(&isk->accept_q))
2047 mask = EPOLLIN | EPOLLRDNORM;
2048 spin_unlock(&isk->accept_q_lock);
2049
2050 return mask;
2051}
2052
2053static __poll_t smc_poll(struct file *file, struct socket *sock,
2054 poll_table *wait)
2055{
2056 struct sock *sk = sock->sk;
2057 struct smc_sock *smc;
2058 __poll_t mask = 0;
2059
2060 if (!sk)
2061 return EPOLLNVAL;
2062
2063 smc = smc_sk(sock->sk);
2064 if (smc->use_fallback) {
2065
2066 mask = smc->clcsock->ops->poll(file, smc->clcsock, wait);
2067 sk->sk_err = smc->clcsock->sk->sk_err;
2068 } else {
2069 if (sk->sk_state != SMC_CLOSED)
2070 sock_poll_wait(file, sock, wait);
2071 if (sk->sk_err)
2072 mask |= EPOLLERR;
2073 if ((sk->sk_shutdown == SHUTDOWN_MASK) ||
2074 (sk->sk_state == SMC_CLOSED))
2075 mask |= EPOLLHUP;
2076 if (sk->sk_state == SMC_LISTEN) {
2077
2078 mask |= smc_accept_poll(sk);
2079 } else if (smc->use_fallback) {
2080 mask |= smc->clcsock->ops->poll(file, smc->clcsock,
2081 wait);
2082 sk->sk_err = smc->clcsock->sk->sk_err;
2083 } else {
2084 if ((sk->sk_state != SMC_INIT &&
2085 atomic_read(&smc->conn.sndbuf_space)) ||
2086 sk->sk_shutdown & SEND_SHUTDOWN) {
2087 mask |= EPOLLOUT | EPOLLWRNORM;
2088 } else {
2089 sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
2090 set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
2091 }
2092 if (atomic_read(&smc->conn.bytes_to_rcv))
2093 mask |= EPOLLIN | EPOLLRDNORM;
2094 if (sk->sk_shutdown & RCV_SHUTDOWN)
2095 mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP;
2096 if (sk->sk_state == SMC_APPCLOSEWAIT1)
2097 mask |= EPOLLIN;
2098 if (smc->conn.urg_state == SMC_URG_VALID)
2099 mask |= EPOLLPRI;
2100 }
2101 }
2102
2103 return mask;
2104}
2105
2106static int smc_shutdown(struct socket *sock, int how)
2107{
2108 struct sock *sk = sock->sk;
2109 struct smc_sock *smc;
2110 int rc = -EINVAL;
2111 int rc1 = 0;
2112
2113 smc = smc_sk(sk);
2114
2115 if ((how < SHUT_RD) || (how > SHUT_RDWR))
2116 return rc;
2117
2118 lock_sock(sk);
2119
2120 rc = -ENOTCONN;
2121 if ((sk->sk_state != SMC_ACTIVE) &&
2122 (sk->sk_state != SMC_PEERCLOSEWAIT1) &&
2123 (sk->sk_state != SMC_PEERCLOSEWAIT2) &&
2124 (sk->sk_state != SMC_APPCLOSEWAIT1) &&
2125 (sk->sk_state != SMC_APPCLOSEWAIT2) &&
2126 (sk->sk_state != SMC_APPFINCLOSEWAIT))
2127 goto out;
2128 if (smc->use_fallback) {
2129 rc = kernel_sock_shutdown(smc->clcsock, how);
2130 sk->sk_shutdown = smc->clcsock->sk->sk_shutdown;
2131 if (sk->sk_shutdown == SHUTDOWN_MASK)
2132 sk->sk_state = SMC_CLOSED;
2133 goto out;
2134 }
2135 switch (how) {
2136 case SHUT_RDWR:
2137 rc = smc_close_active(smc);
2138 break;
2139 case SHUT_WR:
2140 rc = smc_close_shutdown_write(smc);
2141 break;
2142 case SHUT_RD:
2143 rc = 0;
2144
2145 break;
2146 }
2147 if (smc->clcsock)
2148 rc1 = kernel_sock_shutdown(smc->clcsock, how);
2149
2150 sk->sk_shutdown |= how + 1;
2151
2152out:
2153 release_sock(sk);
2154 return rc ? rc : rc1;
2155}
2156
2157static int smc_setsockopt(struct socket *sock, int level, int optname,
2158 sockptr_t optval, unsigned int optlen)
2159{
2160 struct sock *sk = sock->sk;
2161 struct smc_sock *smc;
2162 int val, rc;
2163
2164 if (level == SOL_TCP && optname == TCP_ULP)
2165 return -EOPNOTSUPP;
2166
2167 smc = smc_sk(sk);
2168
2169
2170
2171
2172 if (unlikely(!smc->clcsock->ops->setsockopt))
2173 rc = -EOPNOTSUPP;
2174 else
2175 rc = smc->clcsock->ops->setsockopt(smc->clcsock, level, optname,
2176 optval, optlen);
2177 if (smc->clcsock->sk->sk_err) {
2178 sk->sk_err = smc->clcsock->sk->sk_err;
2179 sk->sk_error_report(sk);
2180 }
2181
2182 if (optlen < sizeof(int))
2183 return -EINVAL;
2184 if (copy_from_sockptr(&val, optval, sizeof(int)))
2185 return -EFAULT;
2186
2187 lock_sock(sk);
2188 if (rc || smc->use_fallback)
2189 goto out;
2190 switch (optname) {
2191 case TCP_FASTOPEN:
2192 case TCP_FASTOPEN_CONNECT:
2193 case TCP_FASTOPEN_KEY:
2194 case TCP_FASTOPEN_NO_COOKIE:
2195
2196 if (sk->sk_state == SMC_INIT && !smc->connect_nonblock) {
2197 smc_switch_to_fallback(smc);
2198 smc->fallback_rsn = SMC_CLC_DECL_OPTUNSUPP;
2199 } else {
2200 rc = -EINVAL;
2201 }
2202 break;
2203 case TCP_NODELAY:
2204 if (sk->sk_state != SMC_INIT &&
2205 sk->sk_state != SMC_LISTEN &&
2206 sk->sk_state != SMC_CLOSED) {
2207 if (val)
2208 mod_delayed_work(smc->conn.lgr->tx_wq,
2209 &smc->conn.tx_work, 0);
2210 }
2211 break;
2212 case TCP_CORK:
2213 if (sk->sk_state != SMC_INIT &&
2214 sk->sk_state != SMC_LISTEN &&
2215 sk->sk_state != SMC_CLOSED) {
2216 if (!val)
2217 mod_delayed_work(smc->conn.lgr->tx_wq,
2218 &smc->conn.tx_work, 0);
2219 }
2220 break;
2221 case TCP_DEFER_ACCEPT:
2222 smc->sockopt_defer_accept = val;
2223 break;
2224 default:
2225 break;
2226 }
2227out:
2228 release_sock(sk);
2229
2230 return rc;
2231}
2232
2233static int smc_getsockopt(struct socket *sock, int level, int optname,
2234 char __user *optval, int __user *optlen)
2235{
2236 struct smc_sock *smc;
2237
2238 smc = smc_sk(sock->sk);
2239
2240 if (unlikely(!smc->clcsock->ops->getsockopt))
2241 return -EOPNOTSUPP;
2242 return smc->clcsock->ops->getsockopt(smc->clcsock, level, optname,
2243 optval, optlen);
2244}
2245
2246static int smc_ioctl(struct socket *sock, unsigned int cmd,
2247 unsigned long arg)
2248{
2249 union smc_host_cursor cons, urg;
2250 struct smc_connection *conn;
2251 struct smc_sock *smc;
2252 int answ;
2253
2254 smc = smc_sk(sock->sk);
2255 conn = &smc->conn;
2256 lock_sock(&smc->sk);
2257 if (smc->use_fallback) {
2258 if (!smc->clcsock) {
2259 release_sock(&smc->sk);
2260 return -EBADF;
2261 }
2262 answ = smc->clcsock->ops->ioctl(smc->clcsock, cmd, arg);
2263 release_sock(&smc->sk);
2264 return answ;
2265 }
2266 switch (cmd) {
2267 case SIOCINQ:
2268 if (smc->sk.sk_state == SMC_LISTEN) {
2269 release_sock(&smc->sk);
2270 return -EINVAL;
2271 }
2272 if (smc->sk.sk_state == SMC_INIT ||
2273 smc->sk.sk_state == SMC_CLOSED)
2274 answ = 0;
2275 else
2276 answ = atomic_read(&smc->conn.bytes_to_rcv);
2277 break;
2278 case SIOCOUTQ:
2279
2280 if (smc->sk.sk_state == SMC_LISTEN) {
2281 release_sock(&smc->sk);
2282 return -EINVAL;
2283 }
2284 if (smc->sk.sk_state == SMC_INIT ||
2285 smc->sk.sk_state == SMC_CLOSED)
2286 answ = 0;
2287 else
2288 answ = smc->conn.sndbuf_desc->len -
2289 atomic_read(&smc->conn.sndbuf_space);
2290 break;
2291 case SIOCOUTQNSD:
2292
2293 if (smc->sk.sk_state == SMC_LISTEN) {
2294 release_sock(&smc->sk);
2295 return -EINVAL;
2296 }
2297 if (smc->sk.sk_state == SMC_INIT ||
2298 smc->sk.sk_state == SMC_CLOSED)
2299 answ = 0;
2300 else
2301 answ = smc_tx_prepared_sends(&smc->conn);
2302 break;
2303 case SIOCATMARK:
2304 if (smc->sk.sk_state == SMC_LISTEN) {
2305 release_sock(&smc->sk);
2306 return -EINVAL;
2307 }
2308 if (smc->sk.sk_state == SMC_INIT ||
2309 smc->sk.sk_state == SMC_CLOSED) {
2310 answ = 0;
2311 } else {
2312 smc_curs_copy(&cons, &conn->local_tx_ctrl.cons, conn);
2313 smc_curs_copy(&urg, &conn->urg_curs, conn);
2314 answ = smc_curs_diff(conn->rmb_desc->len,
2315 &cons, &urg) == 1;
2316 }
2317 break;
2318 default:
2319 release_sock(&smc->sk);
2320 return -ENOIOCTLCMD;
2321 }
2322 release_sock(&smc->sk);
2323
2324 return put_user(answ, (int __user *)arg);
2325}
2326
2327static ssize_t smc_sendpage(struct socket *sock, struct page *page,
2328 int offset, size_t size, int flags)
2329{
2330 struct sock *sk = sock->sk;
2331 struct smc_sock *smc;
2332 int rc = -EPIPE;
2333
2334 smc = smc_sk(sk);
2335 lock_sock(sk);
2336 if (sk->sk_state != SMC_ACTIVE) {
2337 release_sock(sk);
2338 goto out;
2339 }
2340 release_sock(sk);
2341 if (smc->use_fallback)
2342 rc = kernel_sendpage(smc->clcsock, page, offset,
2343 size, flags);
2344 else
2345 rc = sock_no_sendpage(sock, page, offset, size, flags);
2346
2347out:
2348 return rc;
2349}
2350
2351
2352
2353
2354
2355
2356
2357static ssize_t smc_splice_read(struct socket *sock, loff_t *ppos,
2358 struct pipe_inode_info *pipe, size_t len,
2359 unsigned int flags)
2360{
2361 struct sock *sk = sock->sk;
2362 struct smc_sock *smc;
2363 int rc = -ENOTCONN;
2364
2365 smc = smc_sk(sk);
2366 lock_sock(sk);
2367 if (sk->sk_state == SMC_CLOSED && (sk->sk_shutdown & RCV_SHUTDOWN)) {
2368
2369 rc = 0;
2370 goto out;
2371 }
2372 if (sk->sk_state == SMC_INIT ||
2373 sk->sk_state == SMC_LISTEN ||
2374 sk->sk_state == SMC_CLOSED)
2375 goto out;
2376
2377 if (sk->sk_state == SMC_PEERFINCLOSEWAIT) {
2378 rc = 0;
2379 goto out;
2380 }
2381
2382 if (smc->use_fallback) {
2383 rc = smc->clcsock->ops->splice_read(smc->clcsock, ppos,
2384 pipe, len, flags);
2385 } else {
2386 if (*ppos) {
2387 rc = -ESPIPE;
2388 goto out;
2389 }
2390 if (flags & SPLICE_F_NONBLOCK)
2391 flags = MSG_DONTWAIT;
2392 else
2393 flags = 0;
2394 rc = smc_rx_recvmsg(smc, NULL, pipe, len, flags);
2395 }
2396out:
2397 release_sock(sk);
2398
2399 return rc;
2400}
2401
2402
2403static const struct proto_ops smc_sock_ops = {
2404 .family = PF_SMC,
2405 .owner = THIS_MODULE,
2406 .release = smc_release,
2407 .bind = smc_bind,
2408 .connect = smc_connect,
2409 .socketpair = sock_no_socketpair,
2410 .accept = smc_accept,
2411 .getname = smc_getname,
2412 .poll = smc_poll,
2413 .ioctl = smc_ioctl,
2414 .listen = smc_listen,
2415 .shutdown = smc_shutdown,
2416 .setsockopt = smc_setsockopt,
2417 .getsockopt = smc_getsockopt,
2418 .sendmsg = smc_sendmsg,
2419 .recvmsg = smc_recvmsg,
2420 .mmap = sock_no_mmap,
2421 .sendpage = smc_sendpage,
2422 .splice_read = smc_splice_read,
2423};
2424
2425static int smc_create(struct net *net, struct socket *sock, int protocol,
2426 int kern)
2427{
2428 int family = (protocol == SMCPROTO_SMC6) ? PF_INET6 : PF_INET;
2429 struct smc_sock *smc;
2430 struct sock *sk;
2431 int rc;
2432
2433 rc = -ESOCKTNOSUPPORT;
2434 if (sock->type != SOCK_STREAM)
2435 goto out;
2436
2437 rc = -EPROTONOSUPPORT;
2438 if (protocol != SMCPROTO_SMC && protocol != SMCPROTO_SMC6)
2439 goto out;
2440
2441 rc = -ENOBUFS;
2442 sock->ops = &smc_sock_ops;
2443 sk = smc_sock_alloc(net, sock, protocol);
2444 if (!sk)
2445 goto out;
2446
2447
2448 smc = smc_sk(sk);
2449 smc->use_fallback = false;
2450 smc->fallback_rsn = 0;
2451 rc = sock_create_kern(net, family, SOCK_STREAM, IPPROTO_TCP,
2452 &smc->clcsock);
2453 if (rc) {
2454 sk_common_release(sk);
2455 goto out;
2456 }
2457 smc->sk.sk_sndbuf = max(smc->clcsock->sk->sk_sndbuf, SMC_BUF_MIN_SIZE);
2458 smc->sk.sk_rcvbuf = max(smc->clcsock->sk->sk_rcvbuf, SMC_BUF_MIN_SIZE);
2459
2460out:
2461 return rc;
2462}
2463
2464static const struct net_proto_family smc_sock_family_ops = {
2465 .family = PF_SMC,
2466 .owner = THIS_MODULE,
2467 .create = smc_create,
2468};
2469
2470unsigned int smc_net_id;
2471
2472static __net_init int smc_net_init(struct net *net)
2473{
2474 return smc_pnet_net_init(net);
2475}
2476
2477static void __net_exit smc_net_exit(struct net *net)
2478{
2479 smc_pnet_net_exit(net);
2480}
2481
2482static struct pernet_operations smc_net_ops = {
2483 .init = smc_net_init,
2484 .exit = smc_net_exit,
2485 .id = &smc_net_id,
2486 .size = sizeof(struct smc_net),
2487};
2488
2489static int __init smc_init(void)
2490{
2491 int rc;
2492
2493 rc = register_pernet_subsys(&smc_net_ops);
2494 if (rc)
2495 return rc;
2496
2497 smc_ism_init();
2498 smc_clc_init();
2499
2500 rc = smc_nl_init();
2501 if (rc)
2502 goto out_pernet_subsys;
2503
2504 rc = smc_pnet_init();
2505 if (rc)
2506 goto out_nl;
2507
2508 rc = -ENOMEM;
2509 smc_hs_wq = alloc_workqueue("smc_hs_wq", 0, 0);
2510 if (!smc_hs_wq)
2511 goto out_pnet;
2512
2513 smc_close_wq = alloc_workqueue("smc_close_wq", 0, 0);
2514 if (!smc_close_wq)
2515 goto out_alloc_hs_wq;
2516
2517 rc = smc_core_init();
2518 if (rc) {
2519 pr_err("%s: smc_core_init fails with %d\n", __func__, rc);
2520 goto out_alloc_wqs;
2521 }
2522
2523 rc = smc_llc_init();
2524 if (rc) {
2525 pr_err("%s: smc_llc_init fails with %d\n", __func__, rc);
2526 goto out_core;
2527 }
2528
2529 rc = smc_cdc_init();
2530 if (rc) {
2531 pr_err("%s: smc_cdc_init fails with %d\n", __func__, rc);
2532 goto out_core;
2533 }
2534
2535 rc = proto_register(&smc_proto, 1);
2536 if (rc) {
2537 pr_err("%s: proto_register(v4) fails with %d\n", __func__, rc);
2538 goto out_core;
2539 }
2540
2541 rc = proto_register(&smc_proto6, 1);
2542 if (rc) {
2543 pr_err("%s: proto_register(v6) fails with %d\n", __func__, rc);
2544 goto out_proto;
2545 }
2546
2547 rc = sock_register(&smc_sock_family_ops);
2548 if (rc) {
2549 pr_err("%s: sock_register fails with %d\n", __func__, rc);
2550 goto out_proto6;
2551 }
2552 INIT_HLIST_HEAD(&smc_v4_hashinfo.ht);
2553 INIT_HLIST_HEAD(&smc_v6_hashinfo.ht);
2554
2555 rc = smc_ib_register_client();
2556 if (rc) {
2557 pr_err("%s: ib_register fails with %d\n", __func__, rc);
2558 goto out_sock;
2559 }
2560
2561 static_branch_enable(&tcp_have_smc);
2562 return 0;
2563
2564out_sock:
2565 sock_unregister(PF_SMC);
2566out_proto6:
2567 proto_unregister(&smc_proto6);
2568out_proto:
2569 proto_unregister(&smc_proto);
2570out_core:
2571 smc_core_exit();
2572out_alloc_wqs:
2573 destroy_workqueue(smc_close_wq);
2574out_alloc_hs_wq:
2575 destroy_workqueue(smc_hs_wq);
2576out_pnet:
2577 smc_pnet_exit();
2578out_nl:
2579 smc_nl_exit();
2580out_pernet_subsys:
2581 unregister_pernet_subsys(&smc_net_ops);
2582
2583 return rc;
2584}
2585
2586static void __exit smc_exit(void)
2587{
2588 static_branch_disable(&tcp_have_smc);
2589 sock_unregister(PF_SMC);
2590 smc_core_exit();
2591 smc_ib_unregister_client();
2592 destroy_workqueue(smc_close_wq);
2593 destroy_workqueue(smc_hs_wq);
2594 proto_unregister(&smc_proto6);
2595 proto_unregister(&smc_proto);
2596 smc_pnet_exit();
2597 smc_nl_exit();
2598 unregister_pernet_subsys(&smc_net_ops);
2599 rcu_barrier();
2600}
2601
2602module_init(smc_init);
2603module_exit(smc_exit);
2604
2605MODULE_AUTHOR("Ursula Braun <ubraun@linux.vnet.ibm.com>");
2606MODULE_DESCRIPTION("smc socket address family");
2607MODULE_LICENSE("GPL");
2608MODULE_ALIAS_NETPROTO(PF_SMC);
2609