[PATCH rfc 1/6] nvme-fabrics: add helper to resolve ipv4/ipv6 or dns name
Sagi Grimberg
sagi at grimberg.me
Sun Aug 13 05:54:36 PDT 2023
> On 7/24/23 11:20, Sagi Grimberg wrote:
>> Allow userspace to pass in traddr as a dns name as well. This may be
>> useful for a discovery service that may have a dns name, that may also
>> change in time (with an updated dns record).
>>
>> Signed-off-by: Sagi Grimberg <sagi at grimberg.me>
>> ---
>> drivers/nvme/host/fabrics.c | 28 ++++++++++++++++++++++++++++
>> drivers/nvme/host/fabrics.h | 2 ++
>> 2 files changed, 30 insertions(+)
>>
>> diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c
>> index 8175d49f2909..fadd25538d1b 100644
>> --- a/drivers/nvme/host/fabrics.c
>> +++ b/drivers/nvme/host/fabrics.c
>> @@ -10,6 +10,7 @@
>> #include <linux/mutex.h>
>> #include <linux/parser.h>
>> #include <linux/seq_file.h>
>> +#include <linux/dns_resolver.h>
>> #include "nvme.h"
>> #include "fabrics.h"
>> @@ -1133,6 +1134,33 @@ bool nvmf_ip_options_match(struct nvme_ctrl *ctrl,
>> }
>> EXPORT_SYMBOL_GPL(nvmf_ip_options_match);
>> +int nvmf_resolve_ip_address(struct nvmf_ctrl_options *opts,
>> + struct sockaddr_storage *traddr)
>> +{
>> + char *traddr_str = NULL;
>> + int traddr_len;
>> + int ret;
>> +
>> + /* first check if traddr is ipv4/ipv6 address */
>> + ret = inet_pton_with_scope(&init_net, AF_UNSPEC,
>> + opts->traddr, opts->trsvcid, traddr);
>> + if (!ret)
>> + return ret;
>> +
>> + /* second check if traddr is dns name */
>> + traddr_len = dns_query(&init_net, NULL, opts->traddr,
>> + strlen(opts->traddr), NULL, &traddr_str,
>> + NULL, false);
>> + if (traddr_len < 0)
>> + return traddr_len;
>> +
>> + ret = inet_pton_with_scope(&init_net, AF_UNSPEC,
>> + traddr_str, opts->trsvcid, traddr);
>> + kfree(traddr_str);
>> + return ret;
>> +}
>> +EXPORT_SYMBOL_GPL(nvmf_resolve_ip_address);
>> +
>> static int nvmf_check_allowed_opts(struct nvmf_ctrl_options *opts,
>> unsigned int allowed_opts)
>> {
>> diff --git a/drivers/nvme/host/fabrics.h b/drivers/nvme/host/fabrics.h
>> index 82e7a27ffbde..603d8d176168 100644
>> --- a/drivers/nvme/host/fabrics.h
>> +++ b/drivers/nvme/host/fabrics.h
>> @@ -222,6 +222,8 @@ int nvmf_get_address(struct nvme_ctrl *ctrl, char
>> *buf, int size);
>> bool nvmf_should_reconnect(struct nvme_ctrl *ctrl);
>> bool nvmf_ip_options_match(struct nvme_ctrl *ctrl,
>> struct nvmf_ctrl_options *opts);
>> +int nvmf_resolve_ip_address(struct nvmf_ctrl_options *opts,
>> + struct sockaddr_storage *traddr);
>> void nvmf_set_io_queues(struct nvmf_ctrl_options *opts, u32
>> nr_io_queues,IS
>> u32 io_queues[HCTX_MAX_TYPES]);
>> void nvmf_map_queues(struct blk_mq_tag_set *set, struct nvme_ctrl
>> *ctrl,
>
> dns resolver is a config option, so we would need either a '#ifdef
> DNS_RESOLVER' or if (IS_ENABLED(CONFIG_DNS_RESOLVER))' somewhere ...
Probably will be hidden in nvmf_resolve_ip_address, which will else
just perform inet_pton_with_scope...
More information about the Linux-nvme
mailing list