|
21 | 21 |
|
22 | 22 | %{ |
23 | 23 | #include <ccan/list/list.h> |
| 24 | +#include <ccan/endian/endian.h> |
24 | 25 | #include "nvme/tree.h" |
25 | 26 | #include "nvme/fabrics.h" |
26 | 27 | #include "nvme/private.h" |
27 | 28 | #include "nvme/log.h" |
| 29 | +#include "nvme/ioctl.h" |
| 30 | +#include "nvme/types.h" |
28 | 31 |
|
29 | 32 | static int host_iter_err = 0; |
30 | 33 | static int subsys_iter_err = 0; |
@@ -625,25 +628,46 @@ struct nvme_ns { |
625 | 628 | } |
626 | 629 |
|
627 | 630 | %newobject discover; |
628 | | - struct nvmf_discovery_log *discover(int max_retries = 6) { |
629 | | - struct nvmf_discovery_log *logp = NULL; |
| 631 | + struct nvmf_discovery_log *discover(int lsp = 0, int max_retries = 6) { |
| 632 | + struct nvme_get_discovery_args args = { |
| 633 | + .c = $self, |
| 634 | + .args_size = sizeof(args), |
| 635 | + .max_retries = max_retries, |
| 636 | + .result = NULL, |
| 637 | + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, |
| 638 | + .lsp = lsp, |
| 639 | + }; |
| 640 | + struct nvmf_discovery_log *logp = nvmf_get_discovery_wargs(&args); |
| 641 | + if (logp == NULL) |
| 642 | + discover_err = 1; |
| 643 | + return logp; |
| 644 | + } |
| 645 | + |
| 646 | + %feature("autodoc", "@return: List of supported log pages") supported_log_pages; |
| 647 | + PyObject * supported_log_pages(bool rae=true) { |
| 648 | + struct nvme_supported_log_pages log; |
| 649 | + PyObject *obj = NULL; |
630 | 650 | int ret = 0; |
631 | | - ret = nvmf_get_discovery_log($self, &logp, max_retries); |
| 651 | + |
| 652 | + ret = nvme_get_log_supported_log_pages(nvme_ctrl_get_fd($self), rae, &log); |
632 | 653 | if (ret < 0) { |
633 | | - discover_err = 1; |
634 | | - return NULL; |
| 654 | + Py_RETURN_NONE; |
635 | 655 | } |
636 | | - return logp; |
| 656 | + |
| 657 | + obj = PyList_New(NVME_LOG_SUPPORTED_LOG_PAGES_MAX); |
| 658 | + if (!obj) |
| 659 | + Py_RETURN_NONE; |
| 660 | + |
| 661 | + for (int i = 0; i < NVME_LOG_SUPPORTED_LOG_PAGES_MAX; i++) |
| 662 | + PyList_SetItem(obj, i, PyLong_FromLong(le32_to_cpu(log.lid_support[i]))); /* steals ref. */ |
| 663 | + |
| 664 | + return obj; |
637 | 665 | } |
638 | | - char *__str__() { |
639 | | - static char tmp[1024]; |
640 | 666 |
|
641 | | - if ($self->address) |
642 | | - sprintf(tmp, "nvme_ctrl(transport=%s,%s)", $self->transport, |
643 | | - $self->address); |
644 | | - else |
645 | | - sprintf(tmp, "nvme_ctrl(transport=%s)", $self->transport); |
646 | | - return tmp; |
| 667 | + PyObject *__str__() { |
| 668 | + return $self->address ? |
| 669 | + PyUnicode_FromFormat("nvme_ctrl(transport=%s,%s)", $self->transport, $self->address) : |
| 670 | + PyUnicode_FromFormat("nvme_ctrl(transport=%s)", $self->transport); |
647 | 671 | } |
648 | 672 | struct ctrl_iter __iter__() { |
649 | 673 | struct ctrl_iter ret = { .subsystem = nvme_ctrl_get_subsystem($self), |
@@ -710,9 +734,6 @@ struct nvme_ns { |
710 | 734 |
|
711 | 735 |
|
712 | 736 | // We want to swig all the #define and enum from types.h, but none of the structs. |
713 | | -%{ |
714 | | -#include "nvme/types.h" |
715 | | -%} |
716 | 737 | #define __attribute__(x) |
717 | 738 | %rename($ignore, %$isclass) ""; // ignore all classes/structs |
718 | 739 | %rename($ignore, %$isfunction) ""; // ignore all functions |
|
0 commit comments