Lines Matching +full:ports +full:- +full:block +full:- +full:group +full:- +full:count
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
77 fprintf(stderr, "usage: ctld [-d][-u][-f config-file]\n"); in usage()
78 fprintf(stderr, " ctld -t [-u][-f config-file]\n"); in usage()
163 return (conf_proxy_portals.size() - 1); in add_proxy_portal()
186 } else if (strcmp(str, "chap-mutual") == 0) { in set_type()
189 log_warnx("invalid auth-type \"%s\" for %s", str, label()); in set_type()
194 log_warnx("cannot set auth-type to \"%s\" for %s; " in set_type()
219 return (&it->second); in find_auth()
270 log_warnx("cannot mix \"chap-mutual\" authentication " in add_chap_mutual()
302 return (ag_host_names.count(std::string(nqn)) != 0); in host_permitted()
319 return (ag_initiator_names.count(std::string(initiator_name)) != 0); in initiator_permitted()
350 if (net[len - 1] != ']') in parse()
352 net.resize(len - 1); in parse()
360 sin6->sin6_len = sizeof(*sin6); in parse()
361 sin6->sin6_family = AF_INET6; in parse()
362 if (inet_pton(AF_INET6, net.c_str(), &sin6->sin6_addr) <= 0) in parse()
364 ap_mask = sizeof(sin6->sin6_addr) * 8; in parse()
369 sin->sin_len = sizeof(*sin); in parse()
370 sin->sin_family = AF_INET; in parse()
371 if (inet_pton(AF_INET, net.c_str(), &sin->sin_addr) <= 0) in parse()
373 ap_mask = sizeof(sin->sin_addr) * 8; in parse()
422 if (ap_sa.ss_family != sa->sa_family) in matches()
425 if (sa->sa_family == AF_INET) { in matches()
427 &((const struct sockaddr_in *)sa)->sin_addr; in matches()
429 &((const struct sockaddr_in *)&ap_sa)->sin_addr; in matches()
432 &((const struct sockaddr_in6 *)sa)->sin6_addr; in matches()
434 &((const struct sockaddr_in6 *)&ap_sa)->sin6_addr; in matches()
441 uint8_t bmask = 0xff << (8 - (ap_mask % 8)); in matches()
476 std::make_shared<auth_group>(freebsd::stringf("auth-group \"%s\"", in add_auth_group()
479 log_warnx("duplicated auth-group \"%s\"", name); in add_auth_group()
483 return (pair.first->second.get()); in add_auth_group()
487 * Make it possible to redefine the default auth-group, but only once.
493 log_warnx("duplicated auth-group \"default\""); in define_default_auth_group()
508 return (it->second); in find_auth_group()
522 log_warnx("duplicated portal-group \"%s\"", name); in add_portal_group()
526 return (pair.first->second.get()); in add_portal_group()
530 * Make it possible to redefine the default portal-group, but only
537 log_warnx("duplicated portal-group \"default\""); in define_default_portal_group()
552 return (it->second.get()); in find_portal_group()
561 log_warnx("duplicated transport-group \"%s\"", name); in add_transport_group()
565 return (pair.first->second.get()); in add_transport_group()
569 * Make it possible to redefine the default transport-group, but only
576 log_warnx("duplicated transport-group \"default\""); in define_default_transport_group()
591 return (it->second.get()); in find_transport_group()
620 if (pos < addr.length() - 1) { in parse_addr_port()
629 * Either IPv6 address without brackets - and without in parse_addr_port()
630 * a port - or IPv4 address. Just count the colons. in parse_addr_port()
635 if (pos == addr.length() - 1) in parse_addr_port()
655 pg_ports.emplace(port->target()->name(), port); in add_port()
661 auto it = pg_ports.find(port->target()->name()); in remove_port()
681 log_warnx("discovery-auth-group for %s " in set_discovery_auth_group()
685 pg_discovery_auth_group = pg_conf->find_auth_group(ag_name); in set_discovery_auth_group()
687 log_warnx("unknown discovery-auth-group \"%s\" " in set_discovery_auth_group()
764 pg_discovery_auth_group = conf->find_auth_group("default"); in verify()
820 * or portal group that was, what matters is the in open_sockets()
826 if (!portal->init_socket()) { in open_sockets()
838 if (portal->socket() < 0) in close_sockets()
841 portal->listen(), keyword(), name()); in close_sockets()
842 portal->close(); in close_sockets()
849 if (conf_isns.count(addr) > 0) { in add_isns()
875 s = socket(i_ai->ai_family, i_ai->ai_socktype, i_ai->ai_protocol); in connect()
880 if (::connect(s, i_ai->ai_addr, i_ai->ai_addrlen)) { in connect()
913 req.add_str(32, conf_first_target->name()); in isns_register_request()
916 req.add_32(2, 2); /* 2 -- iSCSI */ in isns_register_request()
921 if (!pg->assigned()) in isns_register_request()
923 for (const portal_up &portal : pg->portals()) { in isns_register_request()
924 req.add_addr(16, portal->ai()); in isns_register_request()
925 req.add_port(17, portal->ai()); in isns_register_request()
931 req.add_str(32, target->name()); in isns_register_request()
932 req.add_32(33, 1); /* 1 -- Target*/ in isns_register_request()
933 if (target->has_alias()) in isns_register_request()
934 req.add_str(34, target->alias()); in isns_register_request()
935 for (const port *port : target->ports()) { in isns_register_request()
936 pg = port->portal_group(); in isns_register_request()
939 req.add_32(51, pg->tag()); in isns_register_request()
940 for (const portal_up &portal : pg->portals()) { in isns_register_request()
941 req.add_addr(49, portal->ai()); in isns_register_request()
942 req.add_port(50, portal->ai()); in isns_register_request()
953 req.add_str(32, conf_first_target->name()); in isns_check_request()
964 req.add_str(32, conf_first_target->name()); in isns_deregister_request()
979 freebsd::fd_up s = isns->connect(); in isns_register_targets()
988 if (oldconf == nullptr || oldconf->conf_first_target == nullptr) in isns_register_targets()
990 isns->send_request(s, oldconf->isns_deregister_request(hostname)); in isns_register_targets()
991 isns->send_request(s, isns_register_request(hostname)); in isns_register_targets()
1005 freebsd::fd_up s = isns->connect(); in isns_check()
1014 if (!isns->send_request(s, isns_check_request(hostname))) { in isns_check()
1015 isns->send_request(s, isns_deregister_request(hostname)); in isns_check()
1016 isns->send_request(s, isns_register_request(hostname)); in isns_check()
1031 freebsd::fd_up s = isns->connect(); in isns_deregister_targets()
1038 isns->send_request(s, isns_deregister_request(hostname)); in isns_deregister_targets()
1076 return (pports.count(std::string(name)) > 0); in has_port()
1085 return (&it->second); in find_port()
1091 target->add_port(this); in port()
1097 p_target->remove_port(this); in clear_references()
1104 p_portal_group->add_port(this); in portal_group_port()
1112 p_portal_group->add_port(this); in portal_group_port()
1118 return (p_portal_group->is_dummy()); in is_dummy()
1124 p_portal_group->remove_port(this); in clear_references()
1131 std::string name = freebsd::stringf("%s-%s", pg->name(), in add_port()
1132 target->name()); in add_port()
1133 const auto &pair = conf_ports.try_emplace(name, pg->create_port(target, in add_port()
1147 std::string name = freebsd::stringf("%s-%s", pg->name(), in add_port()
1148 target->name()); in add_port()
1149 const auto &pair = conf_ports.try_emplace(name, pg->create_port(target, in add_port()
1162 std::string name = freebsd::stringf("%s-%s", pp->name(), in add_port()
1163 target->name()); in add_port()
1171 pp->link(); in add_port()
1186 std::string name = pname + "-" + target->name(); in add_port()
1203 return (it->second); in find_port()
1228 return pair.first->second.get(); in add_controller()
1237 return it->second.get(); in find_controller()
1267 conf_first_target = pair.first->second.get(); in add_target()
1268 return (pair.first->second.get()); in add_target()
1277 return (it->second.get()); in find_target()
1287 log_warnx("cannot use both auth-group and %s for %s", in use_private_auth()
1302 return (t_auth_group->add_chap(user, secret)); in add_chap()
1309 if (!use_private_auth("chap-mutual")) in add_chap_mutual()
1311 return (t_auth_group->add_chap_mutual(user, secret, user2, secret2)); in add_chap_mutual()
1329 t_lun = t_conf->find_lun(lun_name); in add_lun()
1356 log_warnx("cannot use both auth-group and explicit " in set_auth_group()
1359 log_warnx("auth-group for %s " in set_auth_group()
1363 t_auth_group = t_conf->find_auth_group(ag_name); in set_auth_group()
1365 log_warnx("unknown auth-group \"%s\" for %s", in set_auth_group()
1375 if (!use_private_auth("auth-type")) in set_auth_type()
1377 return (t_auth_group->set_type(type)); in set_auth_type()
1384 log_warnx("cannot set multiple physical ports for target " in set_physical_port()
1419 struct lun *new_lun = t_conf->add_lun(lun_name); in start_lun()
1423 new_lun->set_scsiname(lun_name); in start_lun()
1454 t_auth_group = t_conf->find_auth_group("default"); in verify()
1460 t_conf->add_port(this, pg, nullptr); in verify()
1486 return (pair.first->second.get()); in add_lun()
1493 kv.second->remove_lun(lun); in delete_target_luns()
1495 kv.second->remove_lun(lun); in delete_target_luns()
1504 return (it->second.get()); in find_lun()
1578 log_warnx("invalid device-type \"%u\" for lun \"%s\"", in set_device_type()
1606 log_warnx("invalid device-type \"%s\" for lun \"%s\"", in set_device_type()
1689 log_debugx("device-id for lun \"%s\", CTL lun %d changed; " in changed()
1729 l_backend = "block"; in verify()
1730 if (l_backend == "block") { in verify()
1738 log_warnx("missing size for ramdisk-backed lun \"%s\"", in verify()
1744 "for ramdisk-backed lun \"%s\"", in verify()
1776 if (!lun->verify()) in verify()
1779 const std::string &path = lun->path(); in verify()
1785 struct lun *lun2 = pair.first->second; in verify()
1789 lun->name(), lun2->name()); in verify()
1794 kv.second->verify(); in verify()
1797 kv.second->verify(); in verify()
1800 kv.second->verify(this); in verify()
1803 kv.second->verify(this); in verify()
1808 ag_name == "no-authentication" || in verify()
1809 ag_name == "no-access") in verify()
1813 log_warnx("auth-group \"%s\" not assigned " in verify()
1833 if (kevent(kqfd, &kev, 1, NULL, 0, NULL) == -1) in reuse_socket()
1851 int id = pg->conf()->add_proxy_portal(this); in init_socket()
1853 "portal id %d, using ICL proxy", listen(), pg->keyword(), in init_socket()
1854 pg->name(), id); in init_socket()
1862 log_debugx("listening on %s, %s \"%s\"", listen(), pg->keyword(), in init_socket()
1863 pg->name()); in init_socket()
1864 s = ::socket(p_ai->ai_family, p_ai->ai_socktype, p_ai->ai_protocol); in init_socket()
1871 sizeof(one)) == -1) in init_socket()
1880 if (pg->dscp() != -1) { in init_socket()
1881 /* Only allow the 6-bit DSCP field to be modified */ in init_socket()
1882 int tos = pg->dscp() << 2; in init_socket()
1883 switch (p_ai->ai_family) { in init_socket()
1886 &tos, sizeof(tos)) == -1) in init_socket()
1892 &tos, sizeof(tos)) == -1) in init_socket()
1898 if (pg->pcp() != -1) { in init_socket()
1899 int pcp = pg->pcp(); in init_socket()
1900 switch (p_ai->ai_family) { in init_socket()
1903 &pcp, sizeof(pcp)) == -1) in init_socket()
1909 &pcp, sizeof(pcp)) == -1) in init_socket()
1919 error = bind(s, p_ai->ai_addr, p_ai->ai_addrlen); in init_socket()
1924 error = ::listen(s, -1); in init_socket()
1931 if (error == -1) { in init_socket()
1962 if (oldconf->conf_debug != conf_debug) { in apply()
1975 if (!oldconf->conf_pidfile_path.empty() && in apply()
1977 if (oldconf->conf_pidfile_path != conf_pidfile_path) { in apply()
1981 if (rename(oldconf->conf_pidfile_path.c_str(), in apply()
1983 log_err(1, "renaming pidfile %s -> %s", in apply()
1984 oldconf->conf_pidfile_path.c_str(), in apply()
1988 conf_pidfile = std::move(oldconf->conf_pidfile); in apply()
1999 auto it = oldconf->conf_portal_groups.find(kv.first); in apply()
2000 if (it != oldconf->conf_portal_groups.end()) in apply()
2001 newpg.set_tag(it->second->tag()); in apply()
2010 auto it = oldconf->conf_transport_groups.find(kv.first); in apply()
2011 if (it != oldconf->conf_transport_groups.end()) in apply()
2012 newpg.set_tag(it->second->tag()); in apply()
2018 for (auto &kv : oldconf->conf_isns) { in apply()
2019 if (conf_isns.count(kv.first) == 0) in apply()
2020 oldconf->isns_deregister_targets(&kv.second); in apply()
2031 * First, remove any ports present in the old configuration in apply()
2034 for (const auto &kv : oldconf->conf_ports) { in apply()
2038 if (oldport->is_dummy()) in apply()
2041 if (it != conf_ports.end() && !it->second->is_dummy()) in apply()
2044 if (!oldport->kernel_remove()) { in apply()
2058 for (auto it = oldconf->conf_luns.begin(); in apply()
2059 it != oldconf->conf_luns.end(); ) { in apply()
2060 struct lun *oldlun = it->second.get(); in apply()
2062 auto newit = conf_luns.find(it->first); in apply()
2066 "removing", oldlun->name(), oldlun->ctl_lun()); in apply()
2067 if (!oldlun->kernel_remove()) { in apply()
2070 oldlun->name(), oldlun->ctl_lun()); in apply()
2080 struct lun *newlun = newit->second.get(); in apply()
2081 if (oldlun->changed(*newlun)) { in apply()
2082 if (!oldlun->kernel_remove()) { in apply()
2085 oldlun->name(), oldlun->ctl_lun()); in apply()
2093 it = oldconf->conf_luns.erase(it); in apply()
2097 newlun->set_ctl_lun(oldlun->ctl_lun()); in apply()
2102 struct lun *newlun = it->second.get(); in apply()
2104 auto oldit = oldconf->conf_luns.find(it->first); in apply()
2105 if (oldit != oldconf->conf_luns.end()) { in apply()
2107 newlun->name(), newlun->ctl_lun()); in apply()
2108 if (!newlun->kernel_modify()) { in apply()
2111 newlun->name(), newlun->ctl_lun()); in apply()
2118 log_debugx("adding lun \"%s\"", newlun->name()); in apply()
2119 if (!newlun->kernel_add()) { in apply()
2120 log_warnx("failed to add lun \"%s\"", newlun->name()); in apply()
2129 * Now add new ports or modify existing ones. in apply()
2132 const std::string &name = it->first; in apply()
2133 port *newport = it->second.get(); in apply()
2135 if (newport->is_dummy()) { in apply()
2139 const auto oldit = oldconf->conf_ports.find(name); in apply()
2140 if (oldit == oldconf->conf_ports.end() || in apply()
2141 oldit->second->is_dummy()) { in apply()
2143 if (!newport->kernel_add()) { in apply()
2160 newport->clear_references(); in apply()
2166 if (!newport->kernel_update(oldit->second.get())) in apply()
2177 cumulated_error += kv.second->open_sockets(*oldconf); in apply()
2180 cumulated_error += kv.second->open_sockets(*oldconf); in apply()
2186 for (auto &kv : oldconf->conf_portal_groups) { in apply()
2187 kv.second->close_sockets(); in apply()
2189 for (auto &kv : oldconf->conf_transport_groups) { in apply()
2190 kv.second->close_sockets(); in apply()
2193 /* (Re-)Register on remaining/new iSNS servers. */ in apply()
2195 auto it = oldconf->conf_isns.find(kv.first); in apply()
2196 if (it == oldconf->conf_isns.end()) in apply()
2292 wait_for_children(bool block) in wait_for_children() argument
2300 * If "block" is true, wait for at least one process. in wait_for_children()
2302 if (block && num == 0) in wait_for_children()
2303 pid = wait4(-1, &status, 0, NULL); in wait_for_children()
2305 pid = wait4(-1, &status, WNOHANG, NULL); in wait_for_children()
2333 pg = portal->portal_group(); in handle_connection()
2334 conf = pg->conf(); in handle_connection()
2337 log_debugx("incoming connection; not forking due to -d flag"); in handle_connection()
2339 nchildren -= wait_for_children(false); in handle_connection()
2342 while (conf->maxproc() > 0 && nchildren >= conf->maxproc()) { in handle_connection()
2345 conf->maxproc()); in handle_connection()
2346 nchildren -= wait_for_children(true); in handle_connection()
2357 conf->close_pidfile(); in handle_connection()
2360 error = getnameinfo(client_sa, client_sa->sa_len, in handle_connection()
2365 log_debugx("accepted connection from %s; portal group \"%s\"", in handle_connection()
2366 host, pg->name()); in handle_connection()
2370 portal->handle_connection(std::move(fd), host, client_sa); in handle_connection()
2401 portal = conf->proxy_portal(portal_id); in main_loop()
2414 if (error == -1) { in main_loop()
2423 assert(portal->socket() == (int)kev.ident); in main_loop()
2426 client_fd = accept(portal->socket(), in main_loop()
2514 log_warnx("%s is world-writable", path); in check_perms()
2516 log_warnx("%s is world-readable", path); in check_perms()
2522 log_warnx("%s is world-executable", path); in check_perms()
2541 ag = conf->add_auth_group("default"); in conf_new_from_file()
2544 ag = conf->add_auth_group("no-authentication"); in conf_new_from_file()
2546 ag->set_type(auth_type::NO_AUTHENTICATION); in conf_new_from_file()
2548 ag = conf->add_auth_group("no-access"); in conf_new_from_file()
2550 ag->set_type(auth_type::DENY); in conf_new_from_file()
2552 pg = conf->add_portal_group("default"); in conf_new_from_file()
2555 pg = conf->add_transport_group("default"); in conf_new_from_file()
2572 if (!conf->default_auth_group_defined()) { in conf_new_from_file()
2573 log_debugx("auth-group \"default\" not defined; " in conf_new_from_file()
2575 ag = conf->find_auth_group("default").get(); in conf_new_from_file()
2577 ag->set_type(auth_type::DENY); in conf_new_from_file()
2580 if (!conf->default_portal_group_defined()) { in conf_new_from_file()
2581 log_debugx("portal-group \"default\" not defined; " in conf_new_from_file()
2583 pg = conf->find_portal_group("default"); in conf_new_from_file()
2585 pg->add_default_portals(); in conf_new_from_file()
2588 if (!conf->default_portal_group_defined()) { in conf_new_from_file()
2589 log_debugx("transport-group \"default\" not defined; " in conf_new_from_file()
2591 pg = conf->find_transport_group("default"); in conf_new_from_file()
2593 pg->add_default_portals(); in conf_new_from_file()
2596 if (!conf->verify()) { in conf_new_from_file()
2605 * If the config file specifies physical ports for any target, associate them
2617 if (!targ->has_pport()) in add_pports()
2620 ret = sscanf(targ->pport(), "ioctl/%d/%d", &i_pp, &i_vp); in add_pports()
2624 "for %s", targ->label()); in add_pports()
2631 pp = kports.find_port(targ->pport()); in add_pports()
2634 targ->pport(), targ->label()); in add_pports()
2637 if (pp->linked()) { in add_pports()
2640 targ->pport(), targ->label()); in add_pports()
2645 targ->pport(), targ->label()); in add_pports()
2662 while ((ch = getopt(argc, argv, "dtuf:R")) != -1) { in main()
2689 argc -= optind; in main()
2704 newconf->open_pidfile(); in main()
2711 oldconf->set_debug(debug); in main()
2712 newconf->set_debug(debug); in main()
2715 if (!newconf->add_pports(kports)) in main()
2716 log_errx(1, "Error associating physical ports; exiting"); in main()
2720 if (daemon(0, 0) == -1) { in main()
2727 if (kqfd == -1) { in main()
2732 error = newconf->apply(oldconf.get()); in main()
2738 newconf->write_pidfile(); in main()
2740 newconf->isns_schedule_update(); in main()
2753 } else if (!tmpconf->add_pports(kports)) { in main()
2754 log_warnx("Error associating physical ports, " in main()
2758 tmpconf->set_debug(debug); in main()
2762 error = newconf->apply(oldconf.get()); in main()
2772 log_debugx("removing CTL iSCSI ports " in main()
2778 newconf->set_debug(debug); in main()
2779 error = newconf->apply(oldconf.get()); in main()
2787 nchildren -= wait_for_children(false); in main()
2790 newconf->isns_update(); in main()