-command_t list[] = {
- {"lnet", jt_lnet, 0, "lnet {configure | unconfigure} [--all]"},
- {"route", jt_route, 0, "route {add | del | show | help}"},
- {"net", jt_net, 0, "net {add | del | show | help}"},
- {"routing", jt_routing, 0, "routing {show | help}"},
- {"set", jt_set, 0, "set {tiny_buffers | small_buffers | large_buffers"
- " | routing}"},
- {"import", jt_import, 0, "import {--add | --del | --show | "
- "--help} FILE.yaml"},
- {"export", jt_export, 0, "export {--help} FILE.yaml"},
- {"stats", jt_stats, 0, "stats {show | help}"},
- {"peer_credits", jt_peer_credits, 0, "peer_credits {show | help}"},
- {"help", Parser_help, 0, "help"},
- {"exit", Parser_quit, 0, "quit"},
- {"quit", Parser_quit, 0, "quit"},
- { 0, 0, 0, NULL }
-};
+static int jt_peer_nid_common(int argc, char **argv, int cmd)
+{
+ int rc = LUSTRE_CFG_RC_NO_ERR, opt;
+ bool is_mr = true;
+ char *prim_nid = NULL, *nidstr = NULL;
+ char err_str[LNET_MAX_STR_LEN] = "Error";
+ struct cYAML *err_rc = NULL;
+
+ const char *const short_opts = "k:mn:";
+ const struct option long_opts[] = {
+ { .name = "prim_nid", .has_arg = required_argument, .val = 'k' },
+ { .name = "non_mr", .has_arg = no_argument, .val = 'm' },
+ { .name = "nid", .has_arg = required_argument, .val = 'n' },
+ { .name = NULL } };
+
+ rc = check_cmd(peer_cmds, "peer", "add", 2, argc, argv);
+ if (rc)
+ return rc;
+
+ while ((opt = getopt_long(argc, argv, short_opts,
+ long_opts, NULL)) != -1) {
+ switch (opt) {
+ case 'k':
+ prim_nid = optarg;
+ break;
+ case 'n':
+ nidstr = optarg;
+ break;
+ case 'm':
+ if (cmd == LNETCTL_DEL_CMD) {
+ rc = LUSTRE_CFG_RC_BAD_PARAM;
+ snprintf(err_str, LNET_MAX_STR_LEN,
+ "Unrecognized option '-%c'", opt);
+ goto build_error;
+ }
+ is_mr = false;
+ break;
+ case '?':
+ print_help(peer_cmds, "peer",
+ cmd == LNETCTL_ADD_CMD ? "add" : "del");
+ default:
+ return 0;
+ }
+ }
+
+ rc = lustre_lnet_modify_peer(prim_nid, nidstr, is_mr, cmd,
+ -1, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR)
+ goto out;
+
+build_error:
+ cYAML_build_error(rc, -1, "peer",
+ cmd == LNETCTL_ADD_CMD ? "add" : "del",
+ err_str, &err_rc);
+
+out:
+ if (rc != LUSTRE_CFG_RC_NO_ERR)
+ cYAML_print_tree2file(stderr, err_rc);
+
+ cYAML_free_tree(err_rc);
+
+ return rc;
+}
+
+static int jt_add_peer_nid(int argc, char **argv)
+{
+ return jt_peer_nid_common(argc, argv, LNETCTL_ADD_CMD);
+}
+
+static int jt_del_peer_nid(int argc, char **argv)
+{
+ return jt_peer_nid_common(argc, argv, LNETCTL_DEL_CMD);
+}
+
+static int jt_show_peer(int argc, char **argv)
+{
+ char *nid = NULL;
+ int rc, opt;
+ struct cYAML *err_rc = NULL, *show_rc = NULL;
+ long int detail = 0;
+
+ const char *const short_opts = "hn:v::";
+ const struct option long_opts[] = {
+ { .name = "help", .has_arg = no_argument, .val = 'h' },
+ { .name = "nid", .has_arg = required_argument, .val = 'n' },
+ { .name = "verbose", .has_arg = optional_argument, .val = 'v' },
+ { .name = NULL } };
+
+ rc = check_cmd(peer_cmds, "peer", "show", 1, argc, argv);
+ if (rc)
+ return rc;
+
+ while ((opt = getopt_long(argc, argv, short_opts,
+ long_opts, NULL)) != -1) {
+ switch (opt) {
+ case 'n':
+ nid = optarg;
+ break;
+ case 'v':
+ if ((!optarg) && (argv[optind] != NULL) &&
+ (argv[optind][0] != '-')) {
+ if (parse_long(argv[optind++], &detail) != 0)
+ detail = 1;
+ } else {
+ detail = 1;
+ }
+ break;
+ case '?':
+ print_help(peer_cmds, "peer", "show");
+ default:
+ return 0;
+ }
+ }
+
+ rc = lustre_lnet_show_peer(nid, (int) detail, -1, &show_rc, &err_rc,
+ false);
+
+ if (rc != LUSTRE_CFG_RC_NO_ERR)
+ cYAML_print_tree2file(stderr, err_rc);
+ else if (show_rc)
+ cYAML_print_tree(show_rc);
+
+ cYAML_free_tree(err_rc);
+ cYAML_free_tree(show_rc);
+
+ return rc;
+}
+
+static int jt_list_peer(int argc, char **argv)
+{
+ int rc;
+ struct cYAML *err_rc = NULL, *list_rc = NULL;
+
+ rc = check_cmd(peer_cmds, "peer", "list", 0, argc, argv);
+ if (rc)
+ return rc;
+
+ rc = lustre_lnet_list_peer(-1, &list_rc, &err_rc);
+
+ if (rc != LUSTRE_CFG_RC_NO_ERR)
+ cYAML_print_tree2file(stderr, err_rc);
+ else if (list_rc)
+ cYAML_print_tree(list_rc);
+
+ cYAML_free_tree(err_rc);
+ cYAML_free_tree(list_rc);
+
+ return rc;
+}
+
+static int jt_ping(int argc, char **argv)
+{
+ struct cYAML *err_rc = NULL;
+ struct cYAML *show_rc = NULL;
+ int timeout = 1000;
+ int rc = 0, opt;
+
+ const char *const short_options = "ht:";
+ const struct option long_options[] = {
+ { .name = "help", .has_arg = no_argument, .val = 'h' },
+ { .name = "timeout", .has_arg = required_argument, .val = 't' },
+ { .name = NULL } };
+
+ while ((opt = getopt_long(argc, argv, short_options,
+ long_options, NULL)) != -1) {
+ switch (opt) {
+ case 't':
+ timeout = 1000 * atol(optarg);
+ break;
+ case 'h':
+ printf("ping nid[,nid,...]\n"
+ "\t --timeout: ping timeout\n"
+ "\t --help: display this help\n");
+ return 0;
+ default:
+ return 0;
+ }
+ }
+
+ for (; optind < argc; optind++)
+ rc = lustre_lnet_ping_nid(argv[optind], timeout, -1, &show_rc, &err_rc);
+
+ if (show_rc)
+ cYAML_print_tree(show_rc);
+
+ if (err_rc)
+ cYAML_print_tree2file(stderr, err_rc);
+
+ cYAML_free_tree(err_rc);
+ cYAML_free_tree(show_rc);
+
+ return rc;
+}
+
+static int jt_discover(int argc, char **argv)
+{
+ struct cYAML *err_rc = NULL;
+ struct cYAML *show_rc = NULL;
+ int force = 0;
+ int rc = 0, opt;
+
+ const char *const short_options = "fh";
+ const struct option long_options[] = {
+ { .name = "force", .has_arg = no_argument, .val = 'f' },
+ { .name = "help", .has_arg = no_argument, .val = 'h' },
+ { .name = NULL } };
+
+ while ((opt = getopt_long(argc, argv, short_options,
+ long_options, NULL)) != -1) {
+ switch (opt) {
+ case 'f':
+ force = 1;
+ break;
+ case 'h':
+ printf("discover nid[,nid,...]\n"
+ "\t --force: force discovery\n"
+ "\t --help: display this help\n");
+ return 0;
+ default:
+ return 0;
+ }
+ }
+
+ for (; optind < argc; optind++)
+ rc = lustre_lnet_discover_nid(argv[optind], force, -1, &show_rc,
+ &err_rc);
+
+ if (show_rc)
+ cYAML_print_tree(show_rc);
+
+ if (err_rc)
+ cYAML_print_tree2file(stderr, err_rc);
+
+ cYAML_free_tree(err_rc);
+ cYAML_free_tree(show_rc);
+
+ return rc;
+}
+
+static int lnetctl_list_commands(int argc, char **argv)
+{
+ char buffer[81] = ""; /* 80 printable chars + terminating NUL */
+
+ Parser_list_commands(cmd_list, buffer, sizeof(buffer), NULL, 0, 4);
+
+ return 0;
+}