aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/nvmfd/nvmfd.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/nvmfd/nvmfd.c')
-rw-r--r--usr.sbin/nvmfd/nvmfd.c271
1 files changed, 0 insertions, 271 deletions
diff --git a/usr.sbin/nvmfd/nvmfd.c b/usr.sbin/nvmfd/nvmfd.c
deleted file mode 100644
index df6f400b40e5..000000000000
--- a/usr.sbin/nvmfd/nvmfd.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2023-2024 Chelsio Communications, Inc.
- * Written by: John Baldwin <jhb@FreeBSD.org>
- */
-
-#include <sys/param.h>
-#include <sys/event.h>
-#include <sys/linker.h>
-#include <sys/module.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <assert.h>
-#include <err.h>
-#include <errno.h>
-#include <libnvmf.h>
-#include <libutil.h>
-#include <netdb.h>
-#include <signal.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "internal.h"
-
-bool data_digests = false;
-bool header_digests = false;
-bool flow_control_disable = false;
-bool kernel_io = false;
-uint32_t maxh2cdata = 256 * 1024;
-
-static const char *subnqn;
-static volatile bool quit = false;
-
-static void
-usage(void)
-{
- fprintf(stderr, "nvmfd -K [-dFGg] [-H MAXH2CDATA] [-P port] [-p port] [-t transport] [-n subnqn]\n"
- "nvmfd [-dFGg] [-H MAXH2CDATA] [-P port] [-p port] [-t transport] [-n subnqn]\n"
- "\tdevice [device [...]]\n"
- "\n"
- "Devices use one of the following syntaxes:\n"
- "\tpathame - file or disk device\n"
- "\tramdisk:size - memory disk of given size\n");
- exit(1);
-}
-
-static void
-handle_sig(int sig __unused)
-{
- quit = true;
-}
-
-static void
-register_listen_socket(int kqfd, int s, void *udata)
-{
- struct kevent kev;
-
- if (listen(s, -1) != 0)
- err(1, "listen");
-
- EV_SET(&kev, s, EVFILT_READ, EV_ADD, 0, 0, udata);
- if (kevent(kqfd, &kev, 1, NULL, 0, NULL) == -1)
- err(1, "kevent: failed to add listen socket");
-}
-
-static void
-create_passive_sockets(int kqfd, const char *port, bool discovery)
-{
- struct addrinfo hints, *ai, *list;
- bool created;
- int error, s;
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_flags = AI_PASSIVE;
- hints.ai_family = AF_UNSPEC;
- hints.ai_protocol = IPPROTO_TCP;
- error = getaddrinfo(NULL, port, &hints, &list);
- if (error != 0)
- errx(1, "%s", gai_strerror(error));
- created = false;
-
- for (ai = list; ai != NULL; ai = ai->ai_next) {
- s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
- if (s == -1)
- continue;
-
- if (bind(s, ai->ai_addr, ai->ai_addrlen) != 0) {
- close(s);
- continue;
- }
-
- if (discovery) {
- register_listen_socket(kqfd, s, (void *)1);
- } else {
- register_listen_socket(kqfd, s, (void *)2);
- discovery_add_io_controller(s, subnqn);
- }
- created = true;
- }
-
- freeaddrinfo(list);
- if (!created)
- err(1, "Failed to create any listen sockets");
-}
-
-static void
-handle_connections(int kqfd)
-{
- struct kevent ev;
- int s;
-
- signal(SIGHUP, handle_sig);
- signal(SIGINT, handle_sig);
- signal(SIGQUIT, handle_sig);
- signal(SIGTERM, handle_sig);
-
- while (!quit) {
- if (kevent(kqfd, NULL, 0, &ev, 1, NULL) == -1) {
- if (errno == EINTR)
- continue;
- err(1, "kevent");
- }
-
- assert(ev.filter == EVFILT_READ);
-
- s = accept(ev.ident, NULL, NULL);
- if (s == -1) {
- warn("accept");
- continue;
- }
-
- switch ((uintptr_t)ev.udata) {
- case 1:
- handle_discovery_socket(s);
- break;
- case 2:
- handle_io_socket(s);
- break;
- default:
- __builtin_unreachable();
- }
- }
-}
-
-int
-main(int ac, char **av)
-{
- struct pidfh *pfh;
- const char *dport, *ioport, *transport;
- pid_t pid;
- uint64_t value;
- int ch, error, kqfd;
- bool daemonize;
- static char nqn[NVMF_NQN_MAX_LEN];
-
- /* 7.4.9.3 Default port for discovery */
- dport = "8009";
-
- pfh = NULL;
- daemonize = true;
- ioport = "0";
- subnqn = NULL;
- transport = "tcp";
- while ((ch = getopt(ac, av, "dFgGH:Kn:P:p:t:")) != -1) {
- switch (ch) {
- case 'd':
- daemonize = false;
- break;
- case 'F':
- flow_control_disable = true;
- break;
- case 'G':
- data_digests = true;
- break;
- case 'g':
- header_digests = true;
- break;
- case 'H':
- if (expand_number(optarg, &value) != 0)
- errx(1, "Invalid MAXH2CDATA value %s", optarg);
- if (value < 4096 || value > UINT32_MAX ||
- value % 4 != 0)
- errx(1, "Invalid MAXH2CDATA value %s", optarg);
- maxh2cdata = value;
- break;
- case 'K':
- kernel_io = true;
- break;
- case 'n':
- subnqn = optarg;
- break;
- case 'P':
- dport = optarg;
- break;
- case 'p':
- ioport = optarg;
- break;
- case 't':
- transport = optarg;
- break;
- default:
- usage();
- }
- }
-
- av += optind;
- ac -= optind;
-
- if (kernel_io) {
- if (ac > 0)
- usage();
- if (modfind("nvmft") == -1 && kldload("nvmft") == -1)
- warn("couldn't load nvmft");
- } else {
- if (ac < 1)
- usage();
- }
-
- if (strcasecmp(transport, "tcp") == 0) {
- } else
- errx(1, "Invalid transport %s", transport);
-
- if (subnqn == NULL) {
- error = nvmf_nqn_from_hostuuid(nqn);
- if (error != 0)
- errc(1, error, "Failed to generate NQN");
- subnqn = nqn;
- }
-
- if (!kernel_io)
- register_devices(ac, av);
-
- init_discovery();
- init_io(subnqn);
-
- if (daemonize) {
- pfh = pidfile_open(NULL, 0600, &pid);
- if (pfh == NULL) {
- if (errno == EEXIST)
- errx(1, "Daemon already running, pid: %jd",
- (intmax_t)pid);
- warn("Cannot open or create pidfile");
- }
-
- if (daemon(0, 0) != 0) {
- pidfile_remove(pfh);
- err(1, "Failed to fork into the background");
- }
-
- pidfile_write(pfh);
- }
-
- kqfd = kqueue();
- if (kqfd == -1) {
- pidfile_remove(pfh);
- err(1, "kqueue");
- }
-
- create_passive_sockets(kqfd, dport, true);
- create_passive_sockets(kqfd, ioport, false);
-
- handle_connections(kqfd);
- shutdown_io();
- if (pfh != NULL)
- pidfile_remove(pfh);
- return (0);
-}