Whamcloud - gitweb
LU-13722 utils: lnetctl discrepancy in YAML output
[fs/lustre-release.git] / lnet / utils / lnetconfig / liblnetconfig.c
index 22bb91a..e371771 100644 (file)
@@ -1458,7 +1458,7 @@ lustre_lnet_ioctl_config_ni(struct list_head *intf_list,
                LIBCFS_IOC_INIT_V2(*conf, lic_cfg_hdr);
                conf->lic_cfg_hdr.ioc_len = len;
                conf->lic_nid = nids[i];
-               strncpy(conf->lic_ni_intf[0], intf_descr->intf_name,
+               strncpy(conf->lic_ni_intf, intf_descr->intf_name,
                        LNET_MAX_STR_LEN);
 
                if (intf_descr->cpt_expr != NULL)
@@ -1879,6 +1879,114 @@ get_counts(struct lnet_ioctl_element_msg_stats *msg_stats, int idx)
        return NULL;
 }
 
+static int
+create_local_udsp_info(struct lnet_ioctl_construct_udsp_info *udsp_info,
+                      struct cYAML *net_node)
+{
+       char tmp[LNET_MAX_STR_LEN];
+       struct cYAML *udsp_net;
+       bool created = false;
+       struct cYAML *pref;
+       int i;
+
+       /* add the UDSP info */
+       udsp_net = cYAML_create_object(net_node, "udsp info");
+       if (!udsp_net)
+               return LUSTRE_CFG_RC_OUT_OF_MEM;
+
+       if (!cYAML_create_number(udsp_net, "net priority",
+                                (int) udsp_info->cud_net_priority))
+               return LUSTRE_CFG_RC_OUT_OF_MEM;
+
+       if (!cYAML_create_number(udsp_net, "nid priority",
+                                (int)udsp_info->cud_nid_priority))
+               return LUSTRE_CFG_RC_OUT_OF_MEM;
+
+       pref = udsp_net;
+
+       for (i = 0; i < LNET_MAX_SHOW_NUM_NID; i++) {
+               memset(tmp, 0, LNET_MAX_STR_LEN);
+               if (udsp_info->cud_pref_rtr_nid[i] == 0)
+                       break;
+               if (!created) {
+                       pref = cYAML_create_object(udsp_net,
+                                       "Preferred gateway NIDs");
+                       if (!pref)
+                               return LUSTRE_CFG_RC_OUT_OF_MEM;
+                       created = true;
+               }
+               snprintf(tmp, sizeof(tmp), "NID-%d", i);
+               if (!cYAML_create_string(pref, tmp,
+                       libcfs_nid2str(udsp_info->cud_pref_rtr_nid[i])))
+                       return LUSTRE_CFG_RC_OUT_OF_MEM;
+       }
+
+       return LUSTRE_CFG_RC_NO_ERR;
+}
+
+static int
+create_remote_udsp_info(struct lnet_ioctl_construct_udsp_info *udsp_info,
+                       struct cYAML *nid_node)
+{
+       char tmp[LNET_MAX_STR_LEN];
+       struct cYAML *udsp_nid;
+       bool created = false;
+       struct cYAML *pref;
+       int i;
+
+       /* add the UDSP info */
+       udsp_nid = cYAML_create_object(nid_node, "udsp info");
+       if (!udsp_nid)
+               return LUSTRE_CFG_RC_OUT_OF_MEM;
+
+       if (!cYAML_create_number(udsp_nid, "net priority",
+                                (int) udsp_info->cud_net_priority))
+               return LUSTRE_CFG_RC_OUT_OF_MEM;
+
+       if (!cYAML_create_number(udsp_nid, "nid priority",
+                                (int) udsp_info->cud_nid_priority))
+               return LUSTRE_CFG_RC_OUT_OF_MEM;
+
+       pref = udsp_nid;
+       for (i = 0; i < LNET_MAX_SHOW_NUM_NID; i++) {
+               memset(tmp, 0, LNET_MAX_STR_LEN);
+               if (udsp_info->cud_pref_rtr_nid[i] == 0)
+                       break;
+               if (!created) {
+                       pref = cYAML_create_object(udsp_nid,
+                                       "Preferred gateway NIDs");
+                       if (!pref)
+                               return LUSTRE_CFG_RC_OUT_OF_MEM;
+                       created = true;
+               }
+               snprintf(tmp, sizeof(tmp), "NID-%d", i);
+               if (!cYAML_create_string(pref, tmp,
+                       libcfs_nid2str(udsp_info->cud_pref_rtr_nid[i])))
+                       return LUSTRE_CFG_RC_OUT_OF_MEM;
+       }
+
+       pref = udsp_nid;
+       created = false;
+       for (i = 0; i < LNET_MAX_SHOW_NUM_NID; i++) {
+               memset(tmp, 0, LNET_MAX_STR_LEN);
+               if (udsp_info->cud_pref_nid[i] == 0)
+                       break;
+               if (!created) {
+                       pref = cYAML_create_object(udsp_nid,
+                                       "Preferred source NIDs");
+                       if (!pref)
+                               return LUSTRE_CFG_RC_OUT_OF_MEM;
+                       created = true;
+               }
+               snprintf(tmp, sizeof(tmp), "NID-%d", i);
+               if (!cYAML_create_string(pref, tmp,
+                       libcfs_nid2str(udsp_info->cud_pref_nid[i])))
+                       return LUSTRE_CFG_RC_OUT_OF_MEM;
+       }
+
+       return LUSTRE_CFG_RC_NO_ERR;
+}
+
 int lustre_lnet_show_net(char *nw, int detail, int seq_no,
                         struct cYAML **show_rc, struct cYAML **err_rc,
                         bool backup)
@@ -1889,6 +1997,7 @@ int lustre_lnet_show_net(char *nw, int detail, int seq_no,
        struct lnet_ioctl_element_stats *stats;
        struct lnet_ioctl_element_msg_stats msg_stats;
        struct lnet_ioctl_local_ni_hstats hstats;
+       struct lnet_ioctl_construct_udsp_info udsp_info;
        __u32 net = LNET_NET_ANY;
        __u32 prev_net = LNET_NET_ANY;
        int rc = LUSTRE_CFG_RC_OUT_OF_MEM, i, j;
@@ -2009,22 +2118,15 @@ int lustre_lnet_show_net(char *nw, int detail, int seq_no,
 
                /* don't add interfaces unless there is at least one
                 * interface */
-               if (strlen(ni_data->lic_ni_intf[0]) > 0) {
+               if (strlen(ni_data->lic_ni_intf) > 0) {
                        interfaces = cYAML_create_object(item, "interfaces");
                        if (interfaces == NULL)
                                goto out;
 
-                       for (j = 0; j < LNET_INTERFACES_NUM; j++) {
-                               if (strlen(ni_data->lic_ni_intf[j]) > 0) {
-                                       snprintf(str_buf,
-                                                sizeof(str_buf), "%d", j);
-                                       if (cYAML_create_string(interfaces,
-                                               str_buf,
-                                               ni_data->lic_ni_intf[j]) ==
-                                                       NULL)
-                                               goto out;
-                               }
-                       }
+                       snprintf(str_buf, sizeof(str_buf), "%d", 0);
+                       if (cYAML_create_string(interfaces, str_buf,
+                                               ni_data->lic_ni_intf) == NULL)
+                               goto out;
                }
 
                if (detail) {
@@ -2053,6 +2155,27 @@ int lustre_lnet_show_net(char *nw, int detail, int seq_no,
                                                        == NULL)
                                goto out;
 
+                       if (detail < 4)
+                               goto continue_without_udsp_info;
+
+                       LIBCFS_IOC_INIT_V2(udsp_info, cud_hdr);
+                       udsp_info.cud_nid = ni_data->lic_nid;
+                       udsp_info.cud_peer = false;
+                       rc = l_ioctl(LNET_DEV_ID,
+                                    IOC_LIBCFS_GET_CONST_UDSP_INFO,
+                                    &udsp_info);
+                       if (rc != 0) {
+                               l_errno = errno;
+                               goto continue_without_udsp_info;
+                       }
+
+                       rc = create_local_udsp_info(&udsp_info, item);
+                       if (rc) {
+                               l_errno = errno;
+                               goto out;
+                       }
+
+continue_without_udsp_info:
                        if (detail < 2)
                                goto continue_without_msg_stats;
 
@@ -2155,12 +2278,6 @@ continue_without_msg_stats:
                                                ni_data->lic_dev_cpt) == NULL)
                                goto out;
 
-                       if (!backup &&
-                           cYAML_create_number(item, "tcp bonding",
-                                               ni_data->lic_tcp_bonding)
-                                                       == NULL)
-                               goto out;
-
                        /* out put the CPTs in the format: "[x,x,x,...]" */
                        pos = str_buf;
                        limit = str_buf + str_buf_len - 3;
@@ -2730,6 +2847,7 @@ int lustre_lnet_show_peer(char *knid, int detail, int seq_no,
        struct lnet_ioctl_element_stats *lpni_stats;
        struct lnet_ioctl_element_msg_stats *msg_stats;
        struct lnet_ioctl_peer_ni_hstats *hstats;
+       struct lnet_ioctl_construct_udsp_info udsp_info;
        lnet_nid_t *nidp;
        int rc = LUSTRE_CFG_RC_OUT_OF_MEM;
        int i, j, k;
@@ -2891,6 +3009,27 @@ int lustre_lnet_show_peer(char *knid, int detail, int seq_no,
                        if (backup)
                                continue;
 
+                       if (detail < 4)
+                               goto continue_without_udsp_info;
+
+                       LIBCFS_IOC_INIT_V2(udsp_info, cud_hdr);
+                       udsp_info.cud_nid = *nidp;
+                       udsp_info.cud_peer = true;
+                       rc = l_ioctl(LNET_DEV_ID,
+                                       IOC_LIBCFS_GET_CONST_UDSP_INFO,
+                                       &udsp_info);
+                       if (rc != 0) {
+                               l_errno = errno;
+                               goto continue_without_udsp_info;
+                       }
+
+                       rc = create_remote_udsp_info(&udsp_info, peer_ni);
+                       if (rc) {
+                               l_errno = errno;
+                               goto out;
+                       }
+
+continue_without_udsp_info:
                        if (cYAML_create_string(peer_ni, "state",
                                                lpni_cri->cr_aliveness)
                            == NULL)
@@ -3571,7 +3710,7 @@ int lustre_lnet_show_max_intf(int seq_no, struct cYAML **show_rc,
        }
 
        return build_global_yaml_entry(err_str, sizeof(err_str), seq_no,
-                                      "max_intf", max_intf, show_rc,
+                                      "max_interfaces", max_intf, show_rc,
                                       err_rc, l_errno);
 }
 
@@ -4572,6 +4711,20 @@ static int handle_yaml_config_udsp(struct cYAML *tree, struct cYAML **show_rc,
                                    err_rc);
 }
 
+static int handle_yaml_show_udsp(struct cYAML *tree, struct cYAML **show_rc,
+                                struct cYAML **err_rc)
+{
+       struct cYAML *seq_no;
+       struct cYAML *idx;
+
+       seq_no = cYAML_get_object_item(tree, "seq_no");
+       idx = cYAML_get_object_item(tree, "idx");
+
+       return lustre_lnet_show_udsp(idx ? idx->cy_valueint : -1,
+                                    seq_no ? seq_no->cy_valueint : -1,
+                                    show_rc, err_rc);
+}
+
 static int handle_yaml_config_global_settings(struct cYAML *tree,
                                              struct cYAML **show_rc,
                                              struct cYAML **err_rc)
@@ -4582,7 +4735,9 @@ static int handle_yaml_config_global_settings(struct cYAML *tree,
        int rc = 0;
 
        seq_no = cYAML_get_object_item(tree, "seq_no");
-       max_intf = cYAML_get_object_item(tree, "max_intf");
+       max_intf = cYAML_get_object_item(tree, "max_interfaces");
+       if (!max_intf) /* try legacy name */
+               max_intf = cYAML_get_object_item(tree, "max_intf");
        if (max_intf)
                rc = lustre_lnet_config_max_intf(max_intf->cy_valueint,
                                                 seq_no ? seq_no->cy_valueint
@@ -4670,7 +4825,9 @@ static int handle_yaml_del_global_settings(struct cYAML *tree,
        int rc = 0;
 
        seq_no = cYAML_get_object_item(tree, "seq_no");
-       max_intf = cYAML_get_object_item(tree, "max_intf");
+       max_intf = cYAML_get_object_item(tree, "max_interfaces");
+       if (!max_intf) /* try legacy name */
+               max_intf = cYAML_get_object_item(tree, "max_intf");
        if (max_intf)
                rc = lustre_lnet_config_max_intf(LNET_INTERFACES_MAX_DEFAULT,
                                                 seq_no ? seq_no->cy_valueint
@@ -4711,7 +4868,9 @@ static int handle_yaml_show_global_settings(struct cYAML *tree,
        int rc = 0;
 
        seq_no = cYAML_get_object_item(tree, "seq_no");
-       max_intf = cYAML_get_object_item(tree, "max_intf");
+       max_intf = cYAML_get_object_item(tree, "max_interfaces");
+       if (!max_intf) /* try legacy name */
+               max_intf = cYAML_get_object_item(tree, "max_intf");
        if (max_intf)
                rc = lustre_lnet_show_max_intf(seq_no ? seq_no->cy_valueint
                                                        : -1,
@@ -4864,6 +5023,7 @@ static struct lookup_cmd_hdlr_tbl lookup_show_tbl[] = {
        { .name = "numa",       .cb = handle_yaml_show_numa },
        { .name = "ping",       .cb = handle_yaml_no_op },
        { .name = "discover",   .cb = handle_yaml_no_op },
+       { .name = "udsp",       .cb = handle_yaml_show_udsp },
        { .name = NULL } };
 
 static struct lookup_cmd_hdlr_tbl lookup_exec_tbl[] = {