aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/iscsi/iscsi_ioctl.h3
-rw-r--r--usr.bin/iscsictl/iscsi.conf.57
-rw-r--r--usr.bin/iscsictl/iscsictl.c5
-rw-r--r--usr.bin/iscsictl/iscsictl.h1
-rw-r--r--usr.bin/iscsictl/parse.y25
-rw-r--r--usr.bin/iscsictl/token.l1
-rw-r--r--usr.sbin/iscsid/iscsid.c19
7 files changed, 60 insertions, 1 deletions
diff --git a/sys/dev/iscsi/iscsi_ioctl.h b/sys/dev/iscsi/iscsi_ioctl.h
index 27c51c12736e..e74f9c503af8 100644
--- a/sys/dev/iscsi/iscsi_ioctl.h
+++ b/sys/dev/iscsi/iscsi_ioctl.h
@@ -71,7 +71,8 @@ struct iscsi_session_conf {
char isc_offload[ISCSI_OFFLOAD_LEN];
int isc_enable;
int isc_dscp;
- int isc_spare[3];
+ int isc_pcp;
+ int isc_spare[2];
};
/*
diff --git a/usr.bin/iscsictl/iscsi.conf.5 b/usr.bin/iscsictl/iscsi.conf.5
index f8b4bca4a4c9..8b2c08cb47a0 100644
--- a/usr.bin/iscsictl/iscsi.conf.5
+++ b/usr.bin/iscsictl/iscsi.conf.5
@@ -155,6 +155,13 @@ and
codepoints.
Default is no specified dscp codepoint, which means the default
of the outgoing interface is used.
+.It Cm pcp
+The 802.1Q Priority CodePoint used for sending packets.
+The PCP can be set to a value in the range between
+.Qq Ar 0
+to
+.Qq Ar 7 .
+When omitted, the default for the outgoing interface is used.
.El
.Sh FILES
.Bl -tag -width indent
diff --git a/usr.bin/iscsictl/iscsictl.c b/usr.bin/iscsictl/iscsictl.c
index fa5754d3581f..de7725401dcf 100644
--- a/usr.bin/iscsictl/iscsictl.c
+++ b/usr.bin/iscsictl/iscsictl.c
@@ -88,6 +88,7 @@ target_new(struct conf *conf)
xo_err(1, "calloc");
targ->t_conf = conf;
targ->t_dscp = -1;
+ targ->t_pcp = -1;
TAILQ_INSERT_TAIL(&conf->conf_targets, targ, t_next);
return (targ);
@@ -360,6 +361,7 @@ conf_from_target(struct iscsi_session_conf *conf,
else
conf->isc_data_digest = ISCSI_DIGEST_NONE;
conf->isc_dscp = targ->t_dscp;
+ conf->isc_pcp = targ->t_pcp;
}
static int
@@ -540,6 +542,9 @@ kernel_list(int iscsi_fd, const struct target *targ __unused,
if (conf->isc_dscp != -1)
xo_emit("{L:/%-26s}{V:dscp/0x%02x}\n",
"Target DSCP:", conf->isc_dscp);
+ if (conf->isc_pcp != -1)
+ xo_emit("{L:/%-26s}{V:pcp/0x%02x}\n",
+ "Target PCP:", conf->isc_pcp);
xo_close_container("target");
xo_open_container("auth");
diff --git a/usr.bin/iscsictl/iscsictl.h b/usr.bin/iscsictl/iscsictl.h
index d5e2fd25c218..9718581c06d6 100644
--- a/usr.bin/iscsictl/iscsictl.h
+++ b/usr.bin/iscsictl/iscsictl.h
@@ -79,6 +79,7 @@ struct target {
int t_enable;
int t_protocol;
int t_dscp;
+ int t_pcp;
char *t_offload;
char *t_user;
char *t_secret;
diff --git a/usr.bin/iscsictl/parse.y b/usr.bin/iscsictl/parse.y
index 9e4a28b50fed..e28c8e82a115 100644
--- a/usr.bin/iscsictl/parse.y
+++ b/usr.bin/iscsictl/parse.y
@@ -133,6 +133,8 @@ target_entry:
ignored
|
dscp
+ |
+ pcp
;
target_name: TARGET_NAME EQUALS STR
@@ -306,6 +308,8 @@ dscp: DSCP EQUALS STR
{
uint64_t tmp;
+ if (target->t_dscp != -1)
+ xo_errx(1, "duplicated dscp at line %d", lineno);
if (strcmp($3, "0x") == 0) {
tmp = strtol($3 + 2, NULL, 16);
} else if (expand_number($3, &tmp) != 0) {
@@ -344,6 +348,27 @@ dscp: DSCP EQUALS STR
| DSCP EQUALS AF43 { target->t_dscp = IPTOS_DSCP_AF43 >> 2 ; }
;
+pcp: PCP EQUALS STR
+ {
+ uint64_t tmp;
+
+ if (target->t_pcp != -1)
+ xo_errx(1, "duplicated pcp at line %d", lineno);
+
+ if (expand_number($3, &tmp) != 0) {
+ yyerror("invalid numeric value");
+ free($3);
+ return(1);
+ }
+ if (!((tmp >=0) && (tmp <= 7))) {
+ yyerror("invalid pcp value");
+ return(1);
+ }
+
+ target->t_pcp = tmp;
+ }
+ ;
+
%%
void
diff --git a/usr.bin/iscsictl/token.l b/usr.bin/iscsictl/token.l
index 9f6a0d707fb0..d3e5f25d21c1 100644
--- a/usr.bin/iscsictl/token.l
+++ b/usr.bin/iscsictl/token.l
@@ -69,6 +69,7 @@ protocol { return PROTOCOL; }
offload { return OFFLOAD; }
port { return IGNORED; }
dscp { return DSCP; }
+pcp { return PCP; }
MaxConnections { return IGNORED; }
TargetAlias { return IGNORED; }
TargetPortalGroupTag { return IGNORED; }
diff --git a/usr.sbin/iscsid/iscsid.c b/usr.sbin/iscsid/iscsid.c
index 92c3cddba57f..9b3300c5c4dd 100644
--- a/usr.sbin/iscsid/iscsid.c
+++ b/usr.sbin/iscsid/iscsid.c
@@ -297,6 +297,25 @@ connection_new(int iscsi_fd, const struct iscsi_daemon_request *request)
from_addr);
}
}
+ if (conn->conn_conf.isc_pcp != -1) {
+ int pcp = conn->conn_conf.isc_pcp;
+ if (to_ai->ai_family == AF_INET) {
+ if (setsockopt(conn->conn_socket,
+ IPPROTO_IP, IP_VLAN_PCP,
+ &pcp, sizeof(pcp)) == -1)
+ log_warn("setsockopt(IP_VLAN_PCP) "
+ "failed for %s",
+ from_addr);
+ } else
+ if (to_ai->ai_family == AF_INET6) {
+ if (setsockopt(conn->conn_socket,
+ IPPROTO_IPV6, IPV6_VLAN_PCP,
+ &pcp, sizeof(pcp)) == -1)
+ log_warn("setsockopt(IPV6_VLAN_PCP) "
+ "failed for %s",
+ from_addr);
+ }
+ }
if (from_ai != NULL) {
error = bind(conn->conn_socket, from_ai->ai_addr,
from_ai->ai_addrlen);