The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=5b0f19262952e7d39fe9a94a0e21c739275e643b
commit 5b0f19262952e7d39fe9a94a0e21c739275e643b Author: John Baldwin <j...@freebsd.org> AuthorDate: 2025-08-04 19:38:07 +0000 Commit: John Baldwin <j...@freebsd.org> CommitDate: 2025-08-04 19:38:07 +0000 ctld: Convert struct portal to a C++ class - Convert portal_init_socket and portal_reuse_socket into class methods. Move the logic to handle proxy portal setup into the init_socket method so that some fields can remain private. - Add accessors for a few other members (most are const) so that all the fields can be private. - Use std::string, freebsd::addrinfo_up, and freebsd::fd_up classes to manage fields owned exclusively. - Add a vector of proxy portal pointers to struct conf and use the index into the vector as the portal ID. This replaces an O(n^2) loop to find the portal for a portal ID returned by kernel_accept with a direct lookup. Sponsored by: Chelsio Communications Pull Request: https://github.com/freebsd/freebsd-src/pull/1794 --- usr.sbin/ctld/ctld.cc | 248 +++++++++++++++++++-------------------------- usr.sbin/ctld/ctld.hh | 41 +++++--- usr.sbin/ctld/discovery.cc | 11 +- usr.sbin/ctld/kernel.cc | 9 +- usr.sbin/ctld/login.cc | 11 +- 5 files changed, 146 insertions(+), 174 deletions(-) diff --git a/usr.sbin/ctld/ctld.cc b/usr.sbin/ctld/ctld.cc index 2c385baa8c5a..bb35d5ad68de 100644 --- a/usr.sbin/ctld/ctld.cc +++ b/usr.sbin/ctld/ctld.cc @@ -139,6 +139,23 @@ conf_delete(struct conf *conf) delete conf; } +#ifdef ICL_KERNEL_PROXY +int +conf::add_proxy_portal(portal *portal) +{ + conf_proxy_portals.push_back(portal); + return (conf_proxy_portals.size() - 1); +} + +portal * +conf::proxy_portal(int id) +{ + if (id >= conf_proxy_portals.size()) + return (nullptr); + return (conf_proxy_portals[id]); +} +#endif + bool auth_group::set_type(const char *str) { @@ -424,31 +441,6 @@ auth_group_find(const struct conf *conf, const char *name) return (it->second); } -static struct portal * -portal_new(struct portal_group *pg) -{ - struct portal *portal; - - portal = reinterpret_cast<struct portal *>(calloc(1, sizeof(*portal))); - if (portal == NULL) - log_err(1, "calloc"); - TAILQ_INIT(&portal->p_targets); - portal->p_portal_group = pg; - TAILQ_INSERT_TAIL(&pg->pg_portals, portal, p_next); - return (portal); -} - -static void -portal_delete(struct portal *portal) -{ - - TAILQ_REMOVE(&portal->p_portal_group->pg_portals, portal, p_next); - if (portal->p_ai != NULL) - freeaddrinfo(portal->p_ai); - free(portal->p_listen); - free(portal); -} - struct portal_group * portal_group_new(struct conf *conf, const char *name) { @@ -463,7 +455,6 @@ portal_group_new(struct conf *conf, const char *name) pg = new portal_group(); pg->pg_name = checked_strdup(name); pg->pg_options = nvlist_create(0); - TAILQ_INIT(&pg->pg_portals); TAILQ_INIT(&pg->pg_ports); pg->pg_conf = conf; pg->pg_tag = 0; /* Assigned later in conf_apply(). */ @@ -477,15 +468,12 @@ portal_group_new(struct conf *conf, const char *name) void portal_group_delete(struct portal_group *pg) { - struct portal *portal, *tmp; struct port *port, *tport; TAILQ_FOREACH_SAFE(port, &pg->pg_ports, p_pgs, tport) port_delete(port); TAILQ_REMOVE(&pg->pg_conf->conf_portal_groups, pg, pg_next); - TAILQ_FOREACH_SAFE(portal, &pg->pg_portals, p_next, tmp) - portal_delete(portal); nvlist_destroy(pg->pg_options); free(pg->pg_name); free(pg->pg_offload); @@ -557,16 +545,9 @@ parse_addr_port(const char *address, const char *def_port) bool portal_group_add_portal(struct portal_group *pg, const char *value, bool iser) { - struct portal *portal; - - portal = portal_new(pg); - portal->p_listen = checked_strdup(value); - portal->p_iser = iser; - - freebsd::addrinfo_up ai = parse_addr_port(portal->p_listen, "3260"); + freebsd::addrinfo_up ai = parse_addr_port(value, "3260"); if (!ai) { - log_warnx("invalid listen address %s", portal->p_listen); - portal_delete(portal); + log_warnx("invalid listen address %s", value); return (false); } @@ -575,7 +556,8 @@ portal_group_add_portal(struct portal_group *pg, const char *value, bool iser) * those into multiple portals. */ - portal->p_ai = ai.release(); + pg->pg_portals.emplace_back(std::make_unique<portal>(pg, value, iser, + std::move(ai))); return (true); } @@ -642,7 +624,6 @@ isns_do_register(struct isns *isns, int s, const char *hostname) { struct conf *conf = isns->i_conf; struct target *target; - struct portal *portal; struct portal_group *pg; struct port *port; uint32_t error; @@ -656,9 +637,9 @@ isns_do_register(struct isns *isns, int s, const char *hostname) TAILQ_FOREACH(pg, &conf->conf_portal_groups, pg_next) { if (pg->pg_unassigned) continue; - TAILQ_FOREACH(portal, &pg->pg_portals, p_next) { - req.add_addr(16, portal->p_ai); - req.add_port(17, portal->p_ai); + for (const portal_up &portal : pg->pg_portals) { + req.add_addr(16, portal->ai()); + req.add_port(17, portal->ai()); } } TAILQ_FOREACH(target, &conf->conf_targets, t_next) { @@ -670,9 +651,9 @@ isns_do_register(struct isns *isns, int s, const char *hostname) if ((pg = port->p_portal_group) == NULL) continue; req.add_32(51, pg->pg_tag); - TAILQ_FOREACH(portal, &pg->pg_portals, p_next) { - req.add_addr(49, portal->p_ai); - req.add_port(50, portal->p_ai); + for (const portal_up &portal : pg->pg_portals) { + req.add_addr(49, portal->ai()); + req.add_port(50, portal->ai()); } } } @@ -1013,7 +994,7 @@ port_is_dummy(struct port *port) if (port->p_portal_group) { if (port->p_portal_group->pg_foreign) return (true); - if (TAILQ_EMPTY(&port->p_portal_group->pg_portals)) + if (port->p_portal_group->pg_portals.empty()) return (true); } return (false); @@ -1363,124 +1344,126 @@ conf_verify(struct conf *conf) return (true); } -static bool -portal_reuse_socket(struct portal *oldp, struct portal *newp) +bool +portal::reuse_socket(struct portal &oldp) { struct kevent kev; - if (strcmp(newp->p_listen, oldp->p_listen) != 0) + if (p_listen != oldp.p_listen) return (false); - if (oldp->p_socket <= 0) + if (!oldp.p_socket) return (false); - EV_SET(&kev, oldp->p_socket, EVFILT_READ, EV_ADD, 0, 0, newp); + EV_SET(&kev, oldp.p_socket, EVFILT_READ, EV_ADD, 0, 0, this); if (kevent(kqfd, &kev, 1, NULL, 0, NULL) == -1) return (false); - newp->p_socket = oldp->p_socket; - oldp->p_socket = 0; + p_socket = std::move(oldp.p_socket); return (true); } -static bool -portal_init_socket(struct portal *p) +bool +portal::init_socket() { - struct portal_group *pg = p->p_portal_group; + struct portal_group *pg = portal_group(); struct kevent kev; + freebsd::fd_up s; int error, sockbuf; int one = 1; - log_debugx("listening on %s, portal-group \"%s\"", - p->p_listen, pg->pg_name); - p->p_socket = socket(p->p_ai->ai_family, p->p_ai->ai_socktype, - p->p_ai->ai_protocol); - if (p->p_socket < 0) { - log_warn("socket(2) failed for %s", - p->p_listen); +#ifdef ICL_KERNEL_PROXY + if (proxy_mode) { + int id = pg->pg_conf->add_proxy_portal(this); + log_debugx("listening on %s, portal-group \"%s\", " + "portal id %d, using ICL proxy", listen(), pg->pg_name, + id); + kernel_listen(ai(), p_iser, id); + return (true); + } +#endif + assert(proxy_mode == false); + assert(p_iser == false); + + log_debugx("listening on %s, portal-group \"%s\"", listen(), + pg->pg_name); + s = ::socket(p_ai->ai_family, p_ai->ai_socktype, p_ai->ai_protocol); + if (!s) { + log_warn("socket(2) failed for %s", listen()); return (false); } sockbuf = SOCKBUF_SIZE; - if (setsockopt(p->p_socket, SOL_SOCKET, SO_RCVBUF, &sockbuf, + if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &sockbuf, sizeof(sockbuf)) == -1) - log_warn("setsockopt(SO_RCVBUF) failed for %s", - p->p_listen); + log_warn("setsockopt(SO_RCVBUF) failed for %s", listen()); sockbuf = SOCKBUF_SIZE; - if (setsockopt(p->p_socket, SOL_SOCKET, SO_SNDBUF, &sockbuf, + if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, &sockbuf, sizeof(sockbuf)) == -1) - log_warn("setsockopt(SO_SNDBUF) failed for %s", p->p_listen); - if (setsockopt(p->p_socket, SOL_SOCKET, SO_NO_DDP, &one, + log_warn("setsockopt(SO_SNDBUF) failed for %s", listen()); + if (setsockopt(s, SOL_SOCKET, SO_NO_DDP, &one, sizeof(one)) == -1) - log_warn("setsockopt(SO_NO_DDP) failed for %s", p->p_listen); - error = setsockopt(p->p_socket, SOL_SOCKET, SO_REUSEADDR, &one, + log_warn("setsockopt(SO_NO_DDP) failed for %s", listen()); + error = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); if (error != 0) { - log_warn("setsockopt(SO_REUSEADDR) failed for %s", p->p_listen); - close(p->p_socket); - p->p_socket = 0; + log_warn("setsockopt(SO_REUSEADDR) failed for %s", listen()); return (false); } if (pg->pg_dscp != -1) { /* Only allow the 6-bit DSCP field to be modified */ int tos = pg->pg_dscp << 2; - switch (p->p_ai->ai_family) { + switch (p_ai->ai_family) { case AF_INET: - if (setsockopt(p->p_socket, IPPROTO_IP, IP_TOS, + if (setsockopt(s, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) == -1) log_warn("setsockopt(IP_TOS) failed for %s", - p->p_listen); + listen()); break; case AF_INET6: - if (setsockopt(p->p_socket, IPPROTO_IPV6, IPV6_TCLASS, + if (setsockopt(s, IPPROTO_IPV6, IPV6_TCLASS, &tos, sizeof(tos)) == -1) log_warn("setsockopt(IPV6_TCLASS) failed for %s", - p->p_listen); + listen()); break; } } if (pg->pg_pcp != -1) { int pcp = pg->pg_pcp; - switch (p->p_ai->ai_family) { + switch (p_ai->ai_family) { case AF_INET: - if (setsockopt(p->p_socket, IPPROTO_IP, IP_VLAN_PCP, + if (setsockopt(s, IPPROTO_IP, IP_VLAN_PCP, &pcp, sizeof(pcp)) == -1) log_warn("setsockopt(IP_VLAN_PCP) failed for %s", - p->p_listen); + listen()); break; case AF_INET6: - if (setsockopt(p->p_socket, IPPROTO_IPV6, IPV6_VLAN_PCP, + if (setsockopt(s, IPPROTO_IPV6, IPV6_VLAN_PCP, &pcp, sizeof(pcp)) == -1) log_warn("setsockopt(IPV6_VLAN_PCP) failed for %s", - p->p_listen); + listen()); break; } } - error = bind(p->p_socket, p->p_ai->ai_addr, - p->p_ai->ai_addrlen); + error = bind(s, p_ai->ai_addr, p_ai->ai_addrlen); if (error != 0) { - log_warn("bind(2) failed for %s", p->p_listen); - close(p->p_socket); - p->p_socket = 0; + log_warn("bind(2) failed for %s", listen()); return (false); } - error = listen(p->p_socket, -1); + error = ::listen(s, -1); if (error != 0) { - log_warn("listen(2) failed for %s", p->p_listen); - close(p->p_socket); - p->p_socket = 0; + log_warn("listen(2) failed for %s", listen()); return (false); } - EV_SET(&kev, p->p_socket, EVFILT_READ, EV_ADD, 0, 0, p); + EV_SET(&kev, s, EVFILT_READ, EV_ADD, 0, 0, this); error = kevent(kqfd, &kev, 1, NULL, 0, NULL); if (error == -1) { - log_warn("kevent(2) failed to register for %s", p->p_listen); - close(p->p_socket); - p->p_socket = 0; + log_warn("kevent(2) failed to register for %s", listen()); return (false); } + p_socket = std::move(s); return (true); } @@ -1489,7 +1472,6 @@ conf_apply(struct conf *oldconf, struct conf *newconf) { struct lun *oldlun, *newlun, *tmplun; struct portal_group *oldpg, *newpg; - struct portal *oldp, *newp; struct port *oldport, *newport, *tmpport; struct isns *oldns, *newns; int changed, cumulated_error = 0, error; @@ -1716,7 +1698,7 @@ conf_apply(struct conf *oldconf, struct conf *newconf) newpg->pg_name); continue; } - TAILQ_FOREACH(newp, &newpg->pg_portals, p_next) { + for (portal_up &newp : newpg->pg_portals) { /* * Try to find already open portal and reuse * the listening socket. We don't care about @@ -1725,39 +1707,18 @@ conf_apply(struct conf *oldconf, struct conf *newconf) */ TAILQ_FOREACH(oldpg, &oldconf->conf_portal_groups, pg_next) { - TAILQ_FOREACH(oldp, &oldpg->pg_portals, - p_next) { - if (portal_reuse_socket(oldp, newp)) + for (portal_up &oldp : oldpg->pg_portals) { + if (newp->reuse_socket(*oldp)) goto reused; } } - reused: - if (newp->p_socket > 0) { - /* - * We're done with this portal. - */ - continue; - } -#ifdef ICL_KERNEL_PROXY - if (proxy_mode) { - newpg->pg_conf->conf_portal_id++; - newp->p_id = newpg->pg_conf->conf_portal_id; - log_debugx("listening on %s, portal-group " - "\"%s\", portal id %d, using ICL proxy", - newp->p_listen, newpg->pg_name, newp->p_id); - kernel_listen(newp->p_ai, newp->p_iser, - newp->p_id); - continue; - } -#endif - assert(proxy_mode == false); - assert(newp->p_iser == false); - - if (!portal_init_socket(newp)) { + if (!newp->init_socket()) { cumulated_error++; continue; } + reused: + ; } } @@ -1765,13 +1726,12 @@ conf_apply(struct conf *oldconf, struct conf *newconf) * Go through the no longer used sockets, closing them. */ TAILQ_FOREACH(oldpg, &oldconf->conf_portal_groups, pg_next) { - TAILQ_FOREACH(oldp, &oldpg->pg_portals, p_next) { - if (oldp->p_socket <= 0) + for (portal_up &oldp : oldpg->pg_portals) { + if (oldp->socket() < 0) continue; log_debugx("closing socket for %s, portal-group \"%s\"", - oldp->p_listen, oldpg->pg_name); - close(oldp->p_socket); - oldp->p_socket = 0; + oldp->listen(), oldpg->pg_name); + oldp->close(); } } @@ -1903,12 +1863,14 @@ handle_connection(struct portal *portal, int fd, const struct sockaddr *client_sa, bool dont_fork) { struct ctld_connection *conn; + struct portal_group *pg; int error; pid_t pid; char host[NI_MAXHOST + 1]; struct conf *conf; - conf = portal->p_portal_group->pg_conf; + pg = portal->portal_group(); + conf = pg->pg_conf; if (dont_fork) { log_debugx("incoming connection; not forking due to -d flag"); @@ -1941,7 +1903,7 @@ handle_connection(struct portal *portal, int fd, log_errx(1, "getnameinfo: %s", gai_strerror(error)); log_debugx("accepted connection from %s; portal group \"%s\"", - host, portal->p_portal_group->pg_name); + host, pg->pg_name); log_set_peer_addr(host); setproctitle("%s", host); @@ -1986,18 +1948,12 @@ main_loop(bool dont_fork) log_debugx("incoming connection, id %d, portal id %d", connection_id, portal_id); - TAILQ_FOREACH(pg, &conf->conf_portal_groups, pg_next) { - TAILQ_FOREACH(portal, &pg->pg_portals, p_next) { - if (portal->p_id == portal_id) { - goto found; - } - } - } - - log_errx(1, "kernel returned invalid portal_id %d", - portal_id); + portal = conf->proxy_portal(portal_id); + if (portal == nullptr) + log_errx(1, + "kernel returned invalid portal_id %d", + portal_id); -found: handle_connection(portal, connection_id, (struct sockaddr *)&client_sa, dont_fork); } else { @@ -2014,10 +1970,10 @@ found: switch (kev.filter) { case EVFILT_READ: portal = reinterpret_cast<struct portal *>(kev.udata); - assert(portal->p_socket == (int)kev.ident); + assert(portal->socket() == (int)kev.ident); client_salen = sizeof(client_sa); - client_fd = accept(portal->p_socket, + client_fd = accept(portal->socket(), (struct sockaddr *)&client_sa, &client_salen); if (client_fd < 0) { diff --git a/usr.sbin/ctld/ctld.hh b/usr.sbin/ctld/ctld.hh index 585e5d24663d..ea7f41f707b9 100644 --- a/usr.sbin/ctld/ctld.hh +++ b/usr.sbin/ctld/ctld.hh @@ -47,6 +47,7 @@ #include <string_view> #include <unordered_map> #include <unordered_set> +#include <libutil++.hh> #define DEFAULT_CONFIG_PATH "/etc/ctl.conf" #define DEFAULT_PIDFILE "/var/run/ctld.pid" @@ -126,19 +127,31 @@ private: using auth_group_sp = std::shared_ptr<auth_group>; struct portal { - TAILQ_ENTRY(portal) p_next; + portal(struct portal_group *pg, std::string_view listen, bool iser, + freebsd::addrinfo_up ai) : + p_portal_group(pg), p_listen(listen), p_ai(std::move(ai)), + p_iser(iser) {} + + bool reuse_socket(portal &oldp); + bool init_socket(); + + portal_group *portal_group() { return p_portal_group; } + const char *listen() const { return p_listen.c_str(); } + const addrinfo *ai() const { return p_ai.get(); } + int socket() const { return p_socket; } + void close() { p_socket.reset(); } + +private: struct portal_group *p_portal_group; + std::string p_listen; + freebsd::addrinfo_up p_ai; bool p_iser; - char *p_listen; - struct addrinfo *p_ai; -#ifdef ICL_KERNEL_PROXY - int p_id; -#endif - TAILQ_HEAD(, target) p_targets; - int p_socket; + freebsd::fd_up p_socket; }; +using portal_up = std::unique_ptr<portal>; + #define PG_FILTER_UNKNOWN 0 #define PG_FILTER_NONE 1 #define PG_FILTER_PORTAL 2 @@ -154,7 +167,7 @@ struct portal_group { int pg_discovery_filter = PG_FILTER_UNKNOWN; bool pg_foreign = false; bool pg_unassigned = false; - TAILQ_HEAD(, portal) pg_portals; + std::list<portal_up> pg_portals; TAILQ_HEAD(, port) pg_ports; char *pg_offload = nullptr; char *pg_redirection = nullptr; @@ -244,14 +257,18 @@ struct conf { int conf_timeout; int conf_maxproc; -#ifdef ICL_KERNEL_PROXY - int conf_portal_id = 0; -#endif struct pidfh *conf_pidfh = nullptr; bool conf_default_pg_defined = false; bool conf_default_ag_defined = false; bool conf_kernel_port_on = false; + +#ifdef ICL_KERNEL_PROXY + int add_proxy_portal(portal *); + portal *proxy_portal(int); +private: + std::vector<portal *> conf_proxy_portals; +#endif }; /* Physical ports exposed by the kernel */ diff --git a/usr.sbin/ctld/discovery.cc b/usr.sbin/ctld/discovery.cc index 5ef8a7e7027b..59bdadb29eb2 100644 --- a/usr.sbin/ctld/discovery.cc +++ b/usr.sbin/ctld/discovery.cc @@ -102,18 +102,17 @@ static void discovery_add_target(struct keys *response_keys, const struct target *targ) { struct port *port; - struct portal *portal; char *buf; char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; - struct addrinfo *ai; + const struct addrinfo *ai; int ret; keys_add(response_keys, "TargetName", targ->t_name); TAILQ_FOREACH(port, &targ->t_ports, p_ts) { if (port->p_portal_group == NULL) continue; - TAILQ_FOREACH(portal, &port->p_portal_group->pg_portals, p_next) { - ai = portal->p_ai; + for (portal_up &portal : port->p_portal_group->pg_portals) { + ai = portal->ai(); ret = getnameinfo(ai->ai_addr, ai->ai_addrlen, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV); @@ -159,7 +158,7 @@ discovery_target_filtered_out(const struct ctld_connection *conn, ag = port->p_auth_group.get(); if (ag == nullptr) ag = targ->t_auth_group.get(); - pg = conn->conn_portal->p_portal_group; + pg = conn->conn_portal->portal_group(); assert(pg->pg_discovery_filter != PG_FILTER_UNKNOWN); @@ -217,7 +216,7 @@ discovery(struct ctld_connection *conn) const struct portal_group *pg; const char *send_targets; - pg = conn->conn_portal->p_portal_group; + pg = conn->conn_portal->portal_group(); log_debugx("beginning discovery session; waiting for TextRequest PDU"); request_keys = text_read_request(&conn->conn, &request); diff --git a/usr.sbin/ctld/kernel.cc b/usr.sbin/ctld/kernel.cc index fbe6d9a2f22a..5a9a9f3c991f 100644 --- a/usr.sbin/ctld/kernel.cc +++ b/usr.sbin/ctld/kernel.cc @@ -841,6 +841,7 @@ kernel_lun_remove(struct lun *lun) void kernel_handoff(struct ctld_connection *conn) { + struct portal_group *pg = conn->conn_portal->portal_group(); struct ctl_iscsi req; bzero(&req, sizeof(req)); @@ -858,9 +859,8 @@ kernel_handoff(struct ctld_connection *conn) sizeof(req.data.handoff.initiator_isid)); strlcpy(req.data.handoff.target_name, conn->conn_target->t_name, sizeof(req.data.handoff.target_name)); - if (conn->conn_portal->p_portal_group->pg_offload != NULL) { - strlcpy(req.data.handoff.offload, - conn->conn_portal->p_portal_group->pg_offload, + if (pg->pg_offload != NULL) { + strlcpy(req.data.handoff.offload, pg->pg_offload, sizeof(req.data.handoff.offload)); } #ifdef ICL_KERNEL_PROXY @@ -871,8 +871,7 @@ kernel_handoff(struct ctld_connection *conn) #else req.data.handoff.socket = conn->conn.conn_socket; #endif - req.data.handoff.portal_group_tag = - conn->conn_portal->p_portal_group->pg_tag; + req.data.handoff.portal_group_tag = pg->pg_tag; if (conn->conn.conn_header_digest == CONN_DIGEST_CRC32C) req.data.handoff.header_digest = CTL_ISCSI_DIGEST_CRC32C; if (conn->conn.conn_data_digest == CONN_DIGEST_CRC32C) diff --git a/usr.sbin/ctld/login.cc b/usr.sbin/ctld/login.cc index 221a7af56cc6..416c867df08d 100644 --- a/usr.sbin/ctld/login.cc +++ b/usr.sbin/ctld/login.cc @@ -703,7 +703,7 @@ login_portal_redirect(struct ctld_connection *conn, struct pdu *request) { const struct portal_group *pg; - pg = conn->conn_portal->p_portal_group; + pg = conn->conn_portal->portal_group(); if (pg->pg_redirection == NULL) return (false); @@ -719,7 +719,7 @@ login_target_redirect(struct ctld_connection *conn, struct pdu *request) { const char *target_address; - assert(conn->conn_portal->p_portal_group->pg_redirection == NULL); + assert(conn->conn_portal->portal_group()->pg_redirection == NULL); if (conn->conn_target == NULL) return (false); @@ -738,6 +738,7 @@ login_target_redirect(struct ctld_connection *conn, struct pdu *request) static void login_negotiate(struct ctld_connection *conn, struct pdu *request) { + struct portal_group *pg = conn->conn_portal->portal_group(); struct pdu *response; struct iscsi_bhs_login_response *bhslr2; struct keys *request_keys, *response_keys; @@ -754,7 +755,7 @@ login_negotiate(struct ctld_connection *conn, struct pdu *request) conn->conn_max_send_data_segment_limit = (1 << 24) - 1; conn->conn_max_burst_limit = (1 << 24) - 1; conn->conn_first_burst_limit = (1 << 24) - 1; - kernel_limits(conn->conn_portal->p_portal_group->pg_offload, + kernel_limits(pg->pg_offload, conn->conn.conn_socket, &conn->conn_max_recv_data_segment_limit, &conn->conn_max_send_data_segment_limit, @@ -826,7 +827,7 @@ login_negotiate(struct ctld_connection *conn, struct pdu *request) keys_add(response_keys, "TargetAlias", conn->conn_target->t_alias); keys_add_int(response_keys, "TargetPortalGroupTag", - conn->conn_portal->p_portal_group->pg_tag); + pg->pg_tag); } for (i = 0; i < KEYS_MAX; i++) { @@ -916,7 +917,7 @@ login(struct ctld_connection *conn) log_errx(1, "received Login PDU with non-zero TSIH"); } - pg = conn->conn_portal->p_portal_group; + pg = conn->conn_portal->portal_group(); memcpy(conn->conn_initiator_isid, bhslr->bhslr_isid, sizeof(conn->conn_initiator_isid));