- lnet_ni_decref(ni);
- return rc;
-}
-
-int
-lnet_acceptor(void *arg)
-{
- char name[16];
- cfs_socket_t *newsock;
- int rc;
- __u32 magic;
- __u32 peer_ip;
- int peer_port;
- int secure = (int)((long_ptr_t)arg);
-
- LASSERT (lnet_acceptor_state.pta_sock == NULL);
-
- snprintf(name, sizeof(name), "acceptor_%03d", accept_port);
- cfs_daemonize(name);
- cfs_block_allsigs();
-
- rc = libcfs_sock_listen(&lnet_acceptor_state.pta_sock,
- 0, accept_port, accept_backlog);
- if (rc != 0) {
- if (rc == -EADDRINUSE)
- LCONSOLE_ERROR_MSG(0x122, "Can't start acceptor on port"
- " %d: port already in use\n",
- accept_port);
- else
- LCONSOLE_ERROR_MSG(0x123, "Can't start acceptor on port "
- "%d: unexpected error %d\n",
- accept_port, rc);
-
- lnet_acceptor_state.pta_sock = NULL;
- } else {
- LCONSOLE(0, "Accept %s, port %d\n", accept, accept_port);
- }
-
- /* set init status and unblock parent */
- lnet_acceptor_state.pta_shutdown = rc;
- mutex_up(&lnet_acceptor_state.pta_signal);
-
- if (rc != 0)
- return rc;
-
- while (!lnet_acceptor_state.pta_shutdown) {
-
- rc = libcfs_sock_accept(&newsock, lnet_acceptor_state.pta_sock);
- if (rc != 0) {
- if (rc != -EAGAIN) {
- CWARN("Accept error %d: pausing...\n", rc);
- cfs_pause(cfs_time_seconds(1));
- }
- continue;
- }
-
- rc = libcfs_sock_getaddr(newsock, 1, &peer_ip, &peer_port);
- if (rc != 0) {
- CERROR("Can't determine new connection's address\n");
- goto failed;
- }
-
- if (secure && peer_port > LNET_ACCEPTOR_MAX_RESERVED_PORT) {
- CERROR("Refusing connection from %u.%u.%u.%u: "
- "insecure port %d\n",
- HIPQUAD(peer_ip), peer_port);
- goto failed;
- }
-
- rc = libcfs_sock_read(newsock, &magic, sizeof(magic),
- accept_timeout);
- if (rc != 0) {
- CERROR("Error %d reading connection request from "
- "%u.%u.%u.%u\n", rc, HIPQUAD(peer_ip));
- goto failed;
- }
-
- rc = lnet_accept(newsock, magic);
- if (rc != 0)
- goto failed;
-
- continue;
-
- failed:
- libcfs_sock_release(newsock);
- }
-
- libcfs_sock_release(lnet_acceptor_state.pta_sock);
- lnet_acceptor_state.pta_sock = NULL;
-
- LCONSOLE(0, "Acceptor stopping\n");
-
- /* unblock lnet_acceptor_stop() */
- mutex_up(&lnet_acceptor_state.pta_signal);
- return 0;
-}
-
-int
-lnet_acceptor_start(void)
-{
- long pid;
- long secure;
-
- LASSERT (lnet_acceptor_state.pta_sock == NULL);
- init_mutex_locked(&lnet_acceptor_state.pta_signal);
-
- if (!strcmp(accept, "secure")) {
- secure = 1;
- } else if (!strcmp(accept, "all")) {
- secure = 0;
- } else if (!strcmp(accept, "none")) {
- return 0;
- } else {
- LCONSOLE_ERROR_MSG(0x124, "Can't parse 'accept=\"%s\"'\n",
- accept);
- return -EINVAL;
- }
-
- if (lnet_count_acceptor_nis() == 0) /* not required */
- return 0;
-
- pid = cfs_kernel_thread(lnet_acceptor, (void *)(ulong_ptr_t)secure, 0);
- if (pid < 0) {
- CERROR("Can't start acceptor thread: %ld\n", pid);
- return -ESRCH;
- }
-
- mutex_down(&lnet_acceptor_state.pta_signal); /* wait for acceptor to startup */
-
- if (!lnet_acceptor_state.pta_shutdown) {
- /* started OK */
- LASSERT (lnet_acceptor_state.pta_sock != NULL);
- return 0;
- }
-
- LASSERT (lnet_acceptor_state.pta_sock == NULL);
- return -ENETDOWN;
-}
-
-void
-lnet_acceptor_stop(void)
-{
- if (lnet_acceptor_state.pta_sock == NULL) /* not running */
- return;
-
- lnet_acceptor_state.pta_shutdown = 1;
- libcfs_sock_abort_accept(lnet_acceptor_state.pta_sock);
-
- /* block until acceptor signals exit */
- mutex_down(&lnet_acceptor_state.pta_signal);
-}
-
-#else /* __KERNEL__ */
-#ifdef HAVE_LIBPTHREAD
-
-static char *accept_type;
-static int accept_port = 988;
-static int accept_backlog;
-static int accept_timeout;
-
-struct {
- int pta_shutdown;
- int pta_sock;
- struct cfs_completion pta_completion;
-} lnet_acceptor_state;
-
-int
-lnet_acceptor_port(void)
-{
- return accept_port;
-}
-
-int
-lnet_parse_int_tunable(int *value, char *name, int dflt)
-{
- char *env = getenv(name);
- char *end;
-
- if (env == NULL) {
- *value = dflt;
- return 0;
- }