%immutable subsysnqn;
%immutable traddr;
%immutable trsvcid;
+ %immutable dhchap_host_key;
%immutable dhchap_key;
%immutable cntrltype;
%immutable dctype;
char *traddr;
char *trsvcid;
%extend {
+ char *dhchap_host_key:
char *dhchap_key;
}
char *cntrltype;
const char *nvme_ctrl_dhchap_key_get(struct nvme_ctrl *c) {
return nvme_ctrl_get_dhchap_key(c);
}
+ const char *nvme_ctrl_dhchap_host_key_get(struct nvme_ctrl *c) {
+ return nvme_ctrl_get_dhchap_host_key(c);
+ }
%};
%extend nvme_ns {
# SPDX-License-Identifier: LGPL-2.1-or-later
+LIBNVME_1_2 {
+ global:
+ nvme_ctrl_get_dhchap_host_key;
+ nvme_ctrl_set_dhchap_host_key;
+};
+
LIBNVME_1_1 {
global:
nvme_get_version;
hostnqn = nvme_host_get_hostnqn(h);
hostid = nvme_host_get_hostid(h);
hostkey = nvme_host_get_dhchap_key(h);
+ if (!hostkey)
+ hostkey = nvme_ctrl_get_dhchap_host_key(c);
ctrlkey = nvme_ctrl_get_dhchap_key(c);
if (add_argument(argstr, "transport", transport) ||
add_argument(argstr, "traddr",
nvme_ctrl_get_trsvcid(c),
NULL);
if (fc) {
+ const char *key;
+
cfg = merge_config(c, nvme_ctrl_get_config(fc));
/*
* An authentication key might already been set
* in @cfg, so ensure to update @c with the correct
* controller key.
*/
- if (fc->dhchap_ctrl_key)
- nvme_ctrl_set_dhchap_key(c, fc->dhchap_ctrl_key);
+ key = nvme_ctrl_get_dhchap_host_key(fc);
+ if (key)
+ nvme_ctrl_set_dhchap_host_key(c, key);
+ key = nvme_ctrl_get_dhchap_key(fc);
+ if (key)
+ nvme_ctrl_set_dhchap_key(c, key);
}
}
if (!c)
return;
json_update_attributes(c, port_obj);
+ attr_obj = json_object_object_get(port_obj, "dhchap_key");
+ if (attr_obj)
+ nvme_ctrl_set_dhchap_host_key(c, json_object_get_string(attr_obj));
attr_obj = json_object_object_get(port_obj, "dhchap_ctrl_key");
if (attr_obj)
nvme_ctrl_set_dhchap_key(c, json_object_get_string(attr_obj));
if (value)
json_object_object_add(port_obj, "trsvcid",
json_object_new_string(value));
+ value = nvme_ctrl_get_dhchap_host_key(c);
+ if (value)
+ json_object_object_add(port_obj, "dhchap_key",
+ json_object_new_string(value));
value = nvme_ctrl_get_dhchap_key(c);
if (value)
json_object_object_add(port_obj, "dhchap_ctrl_key",
if (value)
json_object_object_add(ctrl_obj, "trsvcid",
json_object_new_string(value));
+ value = nvme_ctrl_get_dhchap_host_key(c);
+ if (value)
+ json_object_object_add(ctrl_obj, "dhchap_key",
+ json_object_new_string(value));
value = nvme_ctrl_get_dhchap_key(c);
if (value)
json_object_object_add(ctrl_obj, "dhchap_ctrl_key",
char *subsysnqn;
char *traddr;
char *trsvcid;
+ char *dhchap_key;
char *dhchap_ctrl_key;
char *cntrltype;
char *dctype;
return &c->cfg;
}
+const char *nvme_ctrl_get_dhchap_host_key(nvme_ctrl_t c)
+{
+ return c->dhchap_key;
+}
+
+void nvme_ctrl_set_dhchap_host_key(nvme_ctrl_t c, const char *key)
+{
+ if (c->dhchap_key) {
+ free(c->dhchap_key);
+ c->dhchap_key = NULL;
+ }
+ if (key)
+ c->dhchap_key = strdup(key);
+}
+
const char *nvme_ctrl_get_dhchap_key(nvme_ctrl_t c)
{
return c->dhchap_ctrl_key;
FREE_CTRL_ATTR(c->queue_count);
FREE_CTRL_ATTR(c->serial);
FREE_CTRL_ATTR(c->sqsize);
+ FREE_CTRL_ATTR(c->dhchap_key);
FREE_CTRL_ATTR(c->dhchap_ctrl_key);
FREE_CTRL_ATTR(c->address);
FREE_CTRL_ATTR(c->dctype);
const char *name)
{
DIR *d;
+ char *host_key;
d = opendir(path);
if (!d) {
c->queue_count = nvme_get_ctrl_attr(c, "queue_count");
c->serial = nvme_get_ctrl_attr(c, "serial");
c->sqsize = nvme_get_ctrl_attr(c, "sqsize");
+ host_key = nvme_get_ctrl_attr(c, "dhchap_secret");
+ if (host_key && (!strcmp(c->s->h->dhchap_key, host_key) ||
+ !strcmp("none", host_key))) {
+ free(host_key);
+ host_key = NULL;
+ }
+ if (host_key)
+ c->dhchap_key = host_key;
c->dhchap_ctrl_key = nvme_get_ctrl_attr(c, "dhchap_ctrl_secret");
if (c->dhchap_ctrl_key && !strcmp(c->dhchap_ctrl_key, "none")) {
free(c->dhchap_ctrl_key);
*/
const char *nvme_ctrl_get_host_iface(nvme_ctrl_t c);
+/**
+ * nvme_ctrl_get_dhchap_host_key() - Return host key
+ * @c: Controller to be checked
+ *
+ * Return: DH-HMAC-CHAP host key or NULL if not set
+ */
+const char *nvme_ctrl_get_dhchap_host_key(nvme_ctrl_t c);
+
+/**
+ * nvme_ctrl_set_dhchap_host_key() - Set host key
+ * @c: Host for which the key should be set
+ * @key: DH-HMAC-CHAP Key to set or NULL to clear existing key
+ */
+void nvme_ctrl_set_dhchap_host_key(nvme_ctrl_t c, const char *key);
+
/**
* nvme_ctrl_get_dhchap_key() - Return controller key
* @c: Controller for which the key should be set