diff options
Diffstat (limited to 'usr.sbin/ctld')
-rw-r--r-- | usr.sbin/ctld/ctl.conf.5 | 19 | ||||
-rw-r--r-- | usr.sbin/ctld/ctld.c | 35 | ||||
-rw-r--r-- | usr.sbin/ctld/ctld.h | 6 | ||||
-rw-r--r-- | usr.sbin/ctld/discovery.c | 4 | ||||
-rw-r--r-- | usr.sbin/ctld/kernel.c | 19 | ||||
-rw-r--r-- | usr.sbin/ctld/login.c | 2 | ||||
-rw-r--r-- | usr.sbin/ctld/parse.y | 31 |
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); |