aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/ctld
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/ctld')
-rw-r--r--usr.sbin/ctld/ctl.conf.519
-rw-r--r--usr.sbin/ctld/ctld.c35
-rw-r--r--usr.sbin/ctld/ctld.h6
-rw-r--r--usr.sbin/ctld/discovery.c4
-rw-r--r--usr.sbin/ctld/kernel.c19
-rw-r--r--usr.sbin/ctld/login.c2
-rw-r--r--usr.sbin/ctld/parse.y31
7 files changed, 69 insertions, 47 deletions
diff --git a/usr.sbin/ctld/ctl.conf.5 b/usr.sbin/ctld/ctl.conf.5
index 6854f873d177..ef21919bcd98 100644
--- a/usr.sbin/ctld/ctl.conf.5
+++ b/usr.sbin/ctld/ctl.conf.5
@@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd February 11, 2015
+.Dd March 4, 2015
.Dt CTL.CONF 5
.Os
.Sh NAME
@@ -228,6 +228,9 @@ An IPv4 or IPv6 address and port to listen on for incoming connections.
.\".It Ic listen-iser Ar address
.\"An IPv4 or IPv6 address and port to listen on for incoming connections
.\"using iSER (iSCSI over RDMA) protocol.
+.It Ic offload Ar driver
+Define iSCSI hardware offload driver to use for this
+.Sy portal-group .
.It Ic redirect Ar address
IPv4 or IPv6 address to redirect initiators to.
When configured, all initiators attempting to connect to portal
@@ -311,8 +314,6 @@ This clause is mutually exclusive with
.Sy auth-group ;
one cannot use
both in a single target.
-.It Ic offload Ar driver
-Define iSCSI hardware offload driver to use for this target.
.It Ic portal-group Ar name Op Ar agname
Assign a previously defined portal group to the target.
The default portal group is
@@ -412,14 +413,10 @@ target iqn.2012-06.com.example:target0 {
lun example_1 {
path /dev/zvol/tank/example_1
+ option naa 0x50015178f369f093
}
target iqn.2012-06.com.example:target1 {
- chap chapuser chapsecret
- lun 0 example_1
-}
-
-target iqn.2012-06.com.example:target2 {
auth-group ag0
portal-group pg0
lun 0 example_1
@@ -428,6 +425,12 @@ target iqn.2012-06.com.example:target2 {
option foo bar
}
}
+
+target naa.50015178f369f092 {
+ port isp0
+ port isp1
+ lun 0 example_1
+}
.Ed
.Sh SEE ALSO
.Xr ctl 4 ,
diff --git a/usr.sbin/ctld/ctld.c b/usr.sbin/ctld/ctld.c
index 425f59137b88..2f4f147e2ac8 100644
--- a/usr.sbin/ctld/ctld.c
+++ b/usr.sbin/ctld/ctld.c
@@ -637,6 +637,7 @@ portal_group_delete(struct portal_group *pg)
TAILQ_FOREACH_SAFE(portal, &pg->pg_portals, p_next, tmp)
portal_delete(portal);
free(pg->pg_name);
+ free(pg->pg_offload);
free(pg->pg_redirection);
free(pg);
}
@@ -1023,6 +1024,22 @@ portal_group_set_filter(struct portal_group *pg, const char *str)
}
int
+portal_group_set_offload(struct portal_group *pg, const char *offload)
+{
+
+ if (pg->pg_offload != NULL) {
+ log_warnx("cannot set offload to \"%s\" for "
+ "portal-group \"%s\"; already defined",
+ offload, pg->pg_name);
+ return (1);
+ }
+
+ pg->pg_offload = checked_strdup(offload);
+
+ return (0);
+}
+
+int
portal_group_set_redirection(struct portal_group *pg, const char *addr)
{
@@ -1361,22 +1378,6 @@ target_set_redirection(struct target *target, const char *addr)
return (0);
}
-int
-target_set_offload(struct target *target, const char *offload)
-{
-
- if (target->t_offload != NULL) {
- log_warnx("cannot set offload to \"%s\" for "
- "target \"%s\"; already defined",
- offload, target->t_name);
- return (1);
- }
-
- target->t_offload = checked_strdup(offload);
-
- return (0);
-}
-
struct lun *
lun_new(struct conf *conf, const char *name)
{
@@ -1619,8 +1620,6 @@ conf_print(struct conf *conf)
fprintf(stderr, "target %s {\n", targ->t_name);
if (targ->t_alias != NULL)
fprintf(stderr, "\t alias %s\n", targ->t_alias);
- if (targ->t_offload != NULL)
- fprintf(stderr, "\t offload %s\n", targ->t_offload);
fprintf(stderr, "}\n");
}
}
diff --git a/usr.sbin/ctld/ctld.h b/usr.sbin/ctld/ctld.h
index 36e6bc492d80..52ffad0583ed 100644
--- a/usr.sbin/ctld/ctld.h
+++ b/usr.sbin/ctld/ctld.h
@@ -120,6 +120,7 @@ struct portal_group {
bool pg_unassigned;
TAILQ_HEAD(, portal) pg_portals;
TAILQ_HEAD(, port) pg_ports;
+ char *pg_offload;
char *pg_redirection;
uint16_t pg_tag;
@@ -180,7 +181,6 @@ struct target {
TAILQ_HEAD(, port) t_ports;
char *t_name;
char *t_alias;
- char *t_offload;
char *t_redirection;
};
@@ -336,6 +336,8 @@ int portal_group_add_listen(struct portal_group *pg,
const char *listen, bool iser);
int portal_group_set_filter(struct portal_group *pg,
const char *filter);
+int portal_group_set_offload(struct portal_group *pg,
+ const char *offload);
int portal_group_set_redirection(struct portal_group *pg,
const char *addr);
@@ -366,8 +368,6 @@ struct target *target_find(struct conf *conf,
const char *name);
int target_set_redirection(struct target *target,
const char *addr);
-int target_set_offload(struct target *target,
- const char *offload);
struct lun *lun_new(struct conf *conf, const char *name);
void lun_delete(struct lun *lun);
diff --git a/usr.sbin/ctld/discovery.c b/usr.sbin/ctld/discovery.c
index 88ca64c96ba7..15eaa76cf58b 100644
--- a/usr.sbin/ctld/discovery.c
+++ b/usr.sbin/ctld/discovery.c
@@ -75,6 +75,8 @@ text_receive(struct connection *conn)
conn->conn_statsn);
}
conn->conn_cmdsn = ntohl(bhstr->bhstr_cmdsn);
+ if ((bhstr->bhstr_opcode & ISCSI_BHS_OPCODE_IMMEDIATE) == 0)
+ conn->conn_cmdsn++;
return (request);
}
@@ -131,6 +133,8 @@ logout_receive(struct connection *conn)
conn->conn_statsn);
}
conn->conn_cmdsn = ntohl(bhslr->bhslr_cmdsn);
+ if ((bhslr->bhslr_opcode & ISCSI_BHS_OPCODE_IMMEDIATE) == 0)
+ conn->conn_cmdsn++;
return (request);
}
diff --git a/usr.sbin/ctld/kernel.c b/usr.sbin/ctld/kernel.c
index 129c7250b3e9..95bc89ceb99a 100644
--- a/usr.sbin/ctld/kernel.c
+++ b/usr.sbin/ctld/kernel.c
@@ -816,9 +816,10 @@ kernel_handoff(struct 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_target->t_offload != NULL) {
+ if (conn->conn_portal->p_portal_group->pg_offload != NULL) {
strlcpy(req.data.handoff.offload,
- conn->conn_target->t_offload, sizeof(req.data.handoff.offload));
+ conn->conn_portal->p_portal_group->pg_offload,
+ sizeof(req.data.handoff.offload));
}
#ifdef ICL_KERNEL_PROXY
if (proxy_mode)
@@ -934,9 +935,21 @@ kernel_port_add(struct port *port)
req.status);
return (1);
}
- } else if (port->p_pport)
+ } else if (port->p_pport) {
port->p_ctl_port = port->p_pport->pp_ctl_port;
+ if (strncmp(targ->t_name, "naa.", 4) == 0 &&
+ strlen(targ->t_name) == 20) {
+ bzero(&entry, sizeof(entry));
+ entry.port_type = CTL_PORT_NONE;
+ entry.targ_port = port->p_ctl_port;
+ entry.flags |= CTL_PORT_WWNN_VALID;
+ entry.wwnn = strtoull(targ->t_name + 4, NULL, 16);
+ if (ioctl(ctl_fd, CTL_SET_PORT_WWNS, &entry) == -1)
+ log_warn("CTL_SET_PORT_WWNS ioctl failed");
+ }
+ }
+
/* Explicitly enable mapping to block any access except allowed. */
lm.port = port->p_ctl_port;
lm.plun = UINT32_MAX;
diff --git a/usr.sbin/ctld/login.c b/usr.sbin/ctld/login.c
index 11d97cfae793..9f9ef3c28035 100644
--- a/usr.sbin/ctld/login.c
+++ b/usr.sbin/ctld/login.c
@@ -687,7 +687,7 @@ login_negotiate(struct connection *conn, struct pdu *request)
* In case of offload, it depends on hardware capabilities.
*/
assert(conn->conn_target != NULL);
- kernel_limits(conn->conn_target->t_offload,
+ kernel_limits(conn->conn_portal->p_portal_group->pg_offload,
&conn->conn_data_segment_limit);
} else {
conn->conn_data_segment_limit = MAX_DATA_SEGMENT_LENGTH;
diff --git a/usr.sbin/ctld/parse.y b/usr.sbin/ctld/parse.y
index a7807eff1434..76873d4ee54f 100644
--- a/usr.sbin/ctld/parse.y
+++ b/usr.sbin/ctld/parse.y
@@ -342,6 +342,8 @@ portal_group_entry:
|
portal_group_listen_iser
|
+ portal_group_offload
+ |
portal_group_redirect
;
@@ -398,6 +400,17 @@ portal_group_listen_iser: LISTEN_ISER STR
}
;
+portal_group_offload: OFFLOAD STR
+ {
+ int error;
+
+ error = portal_group_set_offload(portal_group, $2);
+ free($2);
+ if (error != 0)
+ return (1);
+ }
+ ;
+
portal_group_redirect: REDIRECT STR
{
int error;
@@ -463,8 +476,6 @@ target_entry:
|
target_initiator_portal
|
- target_offload
- |
target_portal_group
|
target_port
@@ -656,17 +667,6 @@ target_initiator_portal: INITIATOR_PORTAL STR
}
;
-target_offload: OFFLOAD STR
- {
- int error;
-
- error = target_set_offload(target, $2);
- free($2);
- if (error != 0)
- return (1);
- }
- ;
-
target_portal_group: PORTAL_GROUP STR STR
{
struct portal_group *tpg;
@@ -774,6 +774,7 @@ target_lun: LUN lun_number
lun_number: STR
{
uint64_t tmp;
+ int ret;
char *name;
if (expand_number($1, &tmp) != 0) {
@@ -782,7 +783,9 @@ lun_number: STR
return (1);
}
- asprintf(&name, "%s,lun,%ju", target->t_name, tmp);
+ ret = asprintf(&name, "%s,lun,%ju", target->t_name, tmp);
+ if (ret <= 0)
+ log_err(1, "asprintf");
lun = lun_new(conf, name);
if (lun == NULL)
return (1);