aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/ctld/discovery.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/ctld/discovery.c')
-rw-r--r--usr.sbin/ctld/discovery.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/usr.sbin/ctld/discovery.c b/usr.sbin/ctld/discovery.c
index b370e0be5867..88ca64c96ba7 100644
--- a/usr.sbin/ctld/discovery.c
+++ b/usr.sbin/ctld/discovery.c
@@ -162,6 +162,7 @@ logout_new_response(struct pdu *request)
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];
@@ -169,7 +170,10 @@ discovery_add_target(struct keys *response_keys, const struct target *targ)
int ret;
keys_add(response_keys, "TargetName", targ->t_name);
- TAILQ_FOREACH(portal, &targ->t_portal_group->pg_portals, p_next) {
+ 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;
ret = getnameinfo(ai->ai_addr, ai->ai_addrlen,
hbuf, sizeof(hbuf), sbuf, sizeof(sbuf),
@@ -183,13 +187,13 @@ discovery_add_target(struct keys *response_keys, const struct target *targ)
if (strcmp(hbuf, "0.0.0.0") == 0)
continue;
ret = asprintf(&buf, "%s:%s,%d", hbuf, sbuf,
- targ->t_portal_group->pg_tag);
+ port->p_portal_group->pg_tag);
break;
case AF_INET6:
if (strcmp(hbuf, "::") == 0)
continue;
ret = asprintf(&buf, "[%s]:%s,%d", hbuf, sbuf,
- targ->t_portal_group->pg_tag);
+ port->p_portal_group->pg_tag);
break;
default:
continue;
@@ -198,19 +202,24 @@ discovery_add_target(struct keys *response_keys, const struct target *targ)
log_err(1, "asprintf");
keys_add(response_keys, "TargetAddress", buf);
free(buf);
+ }
}
}
static bool
discovery_target_filtered_out(const struct connection *conn,
- const struct target *targ)
+ const struct port *port)
{
const struct auth_group *ag;
const struct portal_group *pg;
+ const struct target *targ;
const struct auth *auth;
int error;
- ag = targ->t_auth_group;
+ targ = port->p_target;
+ ag = port->p_auth_group;
+ if (ag == NULL)
+ ag = targ->t_auth_group;
pg = conn->conn_portal->p_portal_group;
assert(pg->pg_discovery_auth_group != PG_FILTER_UNKNOWN);
@@ -265,8 +274,8 @@ discovery(struct connection *conn)
{
struct pdu *request, *response;
struct keys *request_keys, *response_keys;
+ const struct port *port;
const struct portal_group *pg;
- const struct target *targ;
const char *send_targets;
pg = conn->conn_portal->p_portal_group;
@@ -284,29 +293,23 @@ discovery(struct connection *conn)
response_keys = keys_new();
if (strcmp(send_targets, "All") == 0) {
- TAILQ_FOREACH(targ, &pg->pg_conf->conf_targets, t_next) {
- if (targ->t_portal_group != pg) {
- log_debugx("not returning target \"%s\"; "
- "belongs to a different portal group",
- targ->t_name);
- continue;
- }
- if (discovery_target_filtered_out(conn, targ)) {
+ TAILQ_FOREACH(port, &pg->pg_ports, p_pgs) {
+ if (discovery_target_filtered_out(conn, port)) {
/* Ignore this target. */
continue;
}
- discovery_add_target(response_keys, targ);
+ discovery_add_target(response_keys, port->p_target);
}
} else {
- targ = target_find(pg->pg_conf, send_targets);
- if (targ == NULL) {
+ port = port_find_in_pg(pg, send_targets);
+ if (port == NULL) {
log_debugx("initiator requested information on unknown "
"target \"%s\"; returning nothing", send_targets);
} else {
- if (discovery_target_filtered_out(conn, targ)) {
+ if (discovery_target_filtered_out(conn, port)) {
/* Ignore this target. */
} else {
- discovery_add_target(response_keys, targ);
+ discovery_add_target(response_keys, port->p_target);
}
}
}