1 // SPDX-License-Identifier: GPL-2.0
3 /* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
4 * Use is subject to license terms.
6 * Copyright (c) 2011, 2017, Intel Corporation.
9 /* This file is part of Lustre, http://www.lustre.org/ */
11 #define DEBUG_SUBSYSTEM S_LNET
13 #include <linux/completion.h>
15 #include <lnet/lib-lnet.h>
16 #include <linux/sunrpc/addr.h>
18 static int accept_port = 988;
19 static int accept_backlog = 127;
20 static int accept_timeout = 5;
24 struct socket *pta_sock;
25 struct completion pta_signal;
27 wait_queue_head_t pta_waitq;
29 #ifdef HAVE_SK_DATA_READY_ONE_ARG
30 void (*pta_odata)(struct sock *);
32 void (*pta_odata)(struct sock *, int);
34 } lnet_acceptor_state = {
39 lnet_acceptor_port(void)
45 lnet_accept_magic(__u32 magic, __u32 constant)
47 return (magic == constant ||
48 magic == __swab32(constant));
51 EXPORT_SYMBOL(lnet_acceptor_port);
53 static char *accept_type = "secure";
55 module_param_named(accept, accept_type, charp, 0444);
56 MODULE_PARM_DESC(accept, "Accept connections (secure|all|none)");
57 module_param(accept_port, int, 0444);
58 MODULE_PARM_DESC(accept_port, "Acceptor's port (same on all nodes)");
59 module_param(accept_backlog, int, 0444);
60 MODULE_PARM_DESC(accept_backlog, "Acceptor's listen backlog");
61 module_param(accept_timeout, int, 0644);
62 MODULE_PARM_DESC(accept_timeout, "Acceptor's timeout (seconds)");
65 lnet_acceptor_timeout(void)
67 return accept_timeout;
69 EXPORT_SYMBOL(lnet_acceptor_timeout);
72 lnet_connect_console_error(int rc, struct lnet_nid *peer_nid,
78 CNETERR("Connection to %s at host %pIScp was refused: check that Lustre is running on that node.\n",
79 libcfs_nidstr(peer_nid), sa);
83 CNETERR("Connection to %s at host %pISc was unreachable: the network or that node may be down, or Lustre may be misconfigured.\n",
84 libcfs_nidstr(peer_nid), sa);
87 CNETERR("Connection to %s at host %pIScp took too long: that node may be hung or experiencing high load.\n",
88 libcfs_nidstr(peer_nid), sa);
91 LCONSOLE_ERROR_MSG(0x11b,
92 "Connection to %s at host %pIScp was reset: is it running a compatible version of Lustre and is %s one of its NIDs?\n",
93 libcfs_nidstr(peer_nid), sa,
94 libcfs_nidstr(peer_nid));
97 LCONSOLE_ERROR_MSG(0x11c,
98 "Protocol error connecting to %s at host %pIScp: is it running a compatible version of Lustre?\n",
99 libcfs_nidstr(peer_nid), sa);
102 LCONSOLE_ERROR_MSG(0x11d,
103 "No privileged ports available to connect to %s at host %pIScp\n",
104 libcfs_nidstr(peer_nid), sa);
107 LCONSOLE_ERROR_MSG(0x11e,
108 "Unexpected error %d connecting to %s at host %pIScp\n",
109 rc, libcfs_nidstr(peer_nid), sa);
113 EXPORT_SYMBOL(lnet_connect_console_error);
116 lnet_connect(struct lnet_nid *peer_nid, int interface,
117 struct sockaddr *peeraddr,
120 struct lnet_acceptor_connreq cr1;
121 struct lnet_acceptor_connreq_v2 cr2;
128 BUILD_BUG_ON(sizeof(cr) > 16); /* not too big to be on the stack */
130 LASSERT(peeraddr->sa_family == AF_INET ||
131 peeraddr->sa_family == AF_INET6);
133 for (port = LNET_ACCEPTOR_MAX_RESERVED_PORT;
134 port >= LNET_ACCEPTOR_MIN_RESERVED_PORT;
136 /* Iterate through reserved ports. */
137 sock = lnet_sock_connect(interface, port, peeraddr, ns);
140 if (rc == -EADDRINUSE || rc == -EADDRNOTAVAIL)
145 BUILD_BUG_ON(LNET_PROTO_ACCEPTOR_VERSION != 1);
147 if (nid_is_nid4(peer_nid)) {
148 cr1.acr_magic = LNET_PROTO_ACCEPTOR_MAGIC;
149 cr1.acr_version = LNET_PROTO_ACCEPTOR_VERSION;
150 cr1.acr_nid = lnet_nid_to_nid4(peer_nid);
152 crsize = sizeof(cr1);
154 if (the_lnet.ln_testprotocompat) {
155 /* single-shot proto check */
156 if (test_and_clear_bit(
157 2, &the_lnet.ln_testprotocompat))
159 if (test_and_clear_bit(
160 3, &the_lnet.ln_testprotocompat))
161 cr1.acr_magic = LNET_PROTO_MAGIC;
165 cr2.acr_magic = LNET_PROTO_ACCEPTOR_MAGIC;
166 cr2.acr_version = LNET_PROTO_ACCEPTOR_VERSION_16;
167 cr2.acr_nid = *peer_nid;
169 crsize = sizeof(cr2);
172 rc = lnet_sock_write(sock, cr, crsize, accept_timeout);
185 lnet_connect_console_error(rc, peer_nid, peeraddr);
188 EXPORT_SYMBOL(lnet_connect);
191 lnet_accept(struct socket *sock, __u32 magic)
193 struct lnet_acceptor_connreq cr;
194 struct lnet_acceptor_connreq_v2 cr2;
196 struct sockaddr_storage peer;
203 LASSERT(sizeof(cr) <= 16); /* not too big for the stack */
205 rc = lnet_sock_getaddr(sock, true, &peer);
207 CERROR("Can't determine new connection's address\n");
211 if (!lnet_accept_magic(magic, LNET_PROTO_ACCEPTOR_MAGIC)) {
213 if (lnet_accept_magic(magic, LNET_PROTO_MAGIC)) {
214 /* future version compatibility!
215 * When LNET unifies protocols over all LNDs, the first
216 * thing sent will be a version query. I send back
217 * LNET_PROTO_ACCEPTOR_MAGIC to tell her I'm "old" */
219 memset(&cr, 0, sizeof(cr));
220 cr.acr_magic = LNET_PROTO_ACCEPTOR_MAGIC;
221 cr.acr_version = LNET_PROTO_ACCEPTOR_VERSION;
222 rc = lnet_sock_write(sock, &cr, sizeof(cr),
226 CERROR("Error sending magic+version in response to LNET magic from %pISc: %d\n",
231 if (lnet_accept_magic(magic, LNET_PROTO_TCP_MAGIC))
232 str = "'old' socknal/tcpnal";
234 str = "unrecognised";
236 LCONSOLE_ERROR_MSG(0x11f, "Refusing connection from %pISc"
237 " magic %08x: %s acceptor protocol\n",
242 flip = (magic != LNET_PROTO_ACCEPTOR_MAGIC);
244 rc = lnet_sock_read(sock, &cr.acr_version,
245 sizeof(cr.acr_version),
248 CERROR("Error %d reading connection request version from %pISc\n",
254 __swab32s(&cr.acr_version);
256 switch (cr.acr_version) {
258 /* future version compatibility!
259 * An acceptor-specific protocol rev will first send a version
260 * query. I send back my current version to tell her I'm
262 peer_version = cr.acr_version;
264 memset(&cr, 0, sizeof(cr));
265 cr.acr_magic = LNET_PROTO_ACCEPTOR_MAGIC;
266 cr.acr_version = LNET_PROTO_ACCEPTOR_VERSION;
268 rc = lnet_sock_write(sock, &cr, sizeof(cr),
272 CERROR("Error sending magic+version in response to version %d from %pISc: %d\n",
273 peer_version, &peer, rc);
276 case LNET_PROTO_ACCEPTOR_VERSION:
278 rc = lnet_sock_read(sock, &cr.acr_nid,
280 offsetof(struct lnet_acceptor_connreq,
286 __swab64s(&cr.acr_nid);
288 lnet_nid4_to_nid(cr.acr_nid, &nid);
291 case LNET_PROTO_ACCEPTOR_VERSION_16:
292 rc = lnet_sock_read(sock, &cr2.acr_nid,
294 offsetof(struct lnet_acceptor_connreq_v2,
303 CERROR("Error %d reading connection request from %pISc\n",
308 ni = lnet_nid_to_ni_addref(&nid);
309 if (ni == NULL || /* no matching net */
310 !nid_same(&ni->ni_nid, &nid)) {
311 /* right NET, wrong NID! */
314 LCONSOLE_ERROR_MSG(0x120,
315 "Refusing connection from %pISc for %s: No matching NI\n",
316 &peer, libcfs_nidstr(&nid));
320 if (ni->ni_net->net_lnd->lnd_accept == NULL) {
321 /* This catches a request for the loopback LND */
323 LCONSOLE_ERROR_MSG(0x121,
324 "Refusing connection from %pISc for %s: NI doesn not accept IP connections\n",
325 &peer, libcfs_nidstr(&nid));
329 CDEBUG(D_NET, "Accept %s from %pI4h\n", libcfs_nidstr(&nid), &peer);
331 rc = ni->ni_net->net_lnd->lnd_accept(ni, sock);
337 #ifdef HAVE_SK_DATA_READY_ONE_ARG
338 static void lnet_acceptor_ready(struct sock *sk)
340 static void lnet_acceptor_ready(struct sock *sk, int len)
343 /* Ensure pta_odata has actually been set before calling it */
345 #ifdef HAVE_SK_DATA_READY_ONE_ARG
346 lnet_acceptor_state.pta_odata(sk);
348 lnet_acceptor_state.pta_odata(sk, 0);
351 atomic_set(&lnet_acceptor_state.pta_ready, 1);
352 wake_up(&lnet_acceptor_state.pta_waitq);
356 lnet_acceptor(void *arg)
358 struct socket *newsock;
361 struct sockaddr_storage peer;
362 int secure = (int)((uintptr_t)arg);
364 LASSERT(lnet_acceptor_state.pta_sock == NULL);
366 lnet_acceptor_state.pta_sock =
367 lnet_sock_listen(accept_port, accept_backlog,
368 lnet_acceptor_state.pta_ns);
369 if (IS_ERR(lnet_acceptor_state.pta_sock)) {
370 rc = PTR_ERR(lnet_acceptor_state.pta_sock);
371 if (rc == -EADDRINUSE)
372 LCONSOLE_ERROR_MSG(0x122, "Can't start acceptor on port"
373 " %d: port already in use\n",
376 LCONSOLE_ERROR_MSG(0x123, "Can't start acceptor on port "
377 "%d: unexpected error %d\n",
380 lnet_acceptor_state.pta_sock = NULL;
383 LCONSOLE(0, "Accept %s, port %d\n", accept_type, accept_port);
384 init_waitqueue_head(&lnet_acceptor_state.pta_waitq);
385 lnet_acceptor_state.pta_odata =
386 lnet_acceptor_state.pta_sock->sk->sk_data_ready;
387 /* ensure pta_odata gets set before there is any chance of
388 * lnet_accept_ready() trying to read it.
391 lnet_acceptor_state.pta_sock->sk->sk_data_ready =
393 atomic_set(&lnet_acceptor_state.pta_ready, 1);
396 /* set init status and unblock parent */
397 lnet_acceptor_state.pta_shutdown = rc;
398 complete(&lnet_acceptor_state.pta_signal);
403 while (!lnet_acceptor_state.pta_shutdown) {
405 wait_event_idle(lnet_acceptor_state.pta_waitq,
406 lnet_acceptor_state.pta_shutdown ||
407 atomic_read(&lnet_acceptor_state.pta_ready));
408 if (!atomic_read(&lnet_acceptor_state.pta_ready))
410 atomic_set(&lnet_acceptor_state.pta_ready, 0);
411 rc = kernel_accept(lnet_acceptor_state.pta_sock, &newsock,
415 CWARN("Accept error %d: pausing...\n", rc);
416 schedule_timeout_uninterruptible(
417 cfs_time_seconds(1));
422 /* make sure we call lnet_sock_accept() again, until it fails */
423 atomic_set(&lnet_acceptor_state.pta_ready, 1);
425 rc = lnet_sock_getaddr(newsock, true, &peer);
427 CERROR("Can't determine new connection's address\n");
432 rpc_get_port((struct sockaddr *)&peer) >
433 LNET_ACCEPTOR_MAX_RESERVED_PORT) {
434 CERROR("Refusing connection from %pIScp: insecure port.\n",
439 rc = lnet_sock_read(newsock, &magic, sizeof(magic),
442 CERROR("Error %d reading connection request from %pISc\n",
447 rc = lnet_accept(newsock, magic);
454 sock_release(newsock);
457 lnet_acceptor_state.pta_sock->sk->sk_data_ready =
458 lnet_acceptor_state.pta_odata;
459 sock_release(lnet_acceptor_state.pta_sock);
460 lnet_acceptor_state.pta_sock = NULL;
462 CDEBUG(D_NET, "Acceptor stopping\n");
464 /* unblock lnet_acceptor_stop() */
465 complete(&lnet_acceptor_state.pta_signal);
470 accept2secure(const char *acc, long *sec)
472 if (!strcmp(acc, "secure")) {
475 } else if (!strcmp(acc, "all")) {
478 } else if (!strcmp(acc, "none")) {
481 LCONSOLE_ERROR_MSG(0x124, "Can't parse 'accept=\"%s\"'\n",
488 lnet_acceptor_start(void)
490 struct task_struct *task;
495 /* if acceptor is already running return immediately */
496 if (!lnet_acceptor_state.pta_shutdown)
499 LASSERT(lnet_acceptor_state.pta_sock == NULL);
501 init_completion(&lnet_acceptor_state.pta_signal);
502 rc = accept2secure(accept_type, &secure);
506 if (lnet_count_acceptor_nets() == 0) /* not required */
508 if (current->nsproxy && current->nsproxy->net_ns)
509 lnet_acceptor_state.pta_ns = current->nsproxy->net_ns;
511 lnet_acceptor_state.pta_ns = &init_net;
512 task = kthread_run(lnet_acceptor, (void *)(uintptr_t)secure,
513 "acceptor_%03ld", secure);
516 CERROR("Can't start acceptor thread: %ld\n", rc2);
520 /* wait for acceptor to startup */
521 wait_for_completion(&lnet_acceptor_state.pta_signal);
523 if (!lnet_acceptor_state.pta_shutdown) {
525 LASSERT(lnet_acceptor_state.pta_sock != NULL);
529 LASSERT(lnet_acceptor_state.pta_sock == NULL);
535 lnet_acceptor_stop(void)
537 if (lnet_acceptor_state.pta_shutdown) /* not running */
540 /* If still required, return immediately */
541 if (the_lnet.ln_refcount && lnet_count_acceptor_nets() > 0)
544 lnet_acceptor_state.pta_shutdown = 1;
545 wake_up(&lnet_acceptor_state.pta_waitq);
547 /* block until acceptor signals exit */
548 wait_for_completion(&lnet_acceptor_state.pta_signal);