#include <limits.h>
#include <libcfs/util/ioctl.h>
#include <libcfs/util/parser.h>
-#include <cyaml.h>
+#include "lnetconfig/cyaml.h"
#include "lnetconfig/liblnetconfig.h"
#define LNET_CONFIGURE true
static int jt_show_peer(int argc, char **argv);
static int jt_show_recovery(int argc, char **argv);
static int jt_show_global(int argc, char **argv);
+static int jt_show_udsp(int argc, char **argv);
static int jt_set_tiny(int argc, char **argv);
static int jt_set_small(int argc, char **argv);
static int jt_set_large(int argc, char **argv);
static int jt_set_numa(int argc, char **argv);
static int jt_set_retry_count(int argc, char **argv);
static int jt_set_transaction_to(int argc, char **argv);
+static int jt_set_recov_intrv(int argc, char **argv);
+static int jt_set_rtr_sensitivity(int argc, char **argv);
static int jt_set_hsensitivity(int argc, char **argv);
static int jt_add_peer_nid(int argc, char **argv);
static int jt_del_peer_nid(int argc, char **argv);
static int jt_set_max_intf(int argc, char **argv);
static int jt_set_discovery(int argc, char **argv);
+static int jt_set_drop_asym_route(int argc, char **argv);
static int jt_list_peer(int argc, char **argv);
+static int jt_add_udsp(int argc, char **argv);
+static int jt_del_udsp(int argc, char **argv);
/*static int jt_show_peer(int argc, char **argv);*/
static int lnetctl_list_commands(int argc, char **argv);
static int jt_import(int argc, char **argv);
static int jt_peers(int argc, char **argv);
static int jt_set_ni_value(int argc, char **argv);
static int jt_set_peer_ni_value(int argc, char **argv);
+static int jt_calc_service_id(int argc, char **argv);
+static int jt_set_response_tracking(int argc, char **argv);
+static int jt_set_recovery_limit(int argc, char **argv);
+static int jt_udsp(int argc, char **argv);
command_t cmd_list[] = {
{"lnet", jt_lnet, 0, "lnet {configure | unconfigure} [--all]"},
{"routing", jt_routing, 0, "routing {show | help}"},
{"set", jt_set, 0, "set {tiny_buffers | small_buffers | large_buffers"
" | routing | numa_range | max_interfaces"
- " | discovery}"},
+ " | discovery | drop_asym_route | retry_count"
+ " | transaction_timeout | health_sensitivity"
+ " | recovery_interval | router_sensitivity"
+ " | response_tracking | recovery_limit}"},
{"import", jt_import, 0, "import FILE.yaml"},
{"export", jt_export, 0, "export FILE.yaml"},
{"stats", jt_stats, 0, "stats {show | help}"},
{"peer", jt_peers, 0, "peer {add | del | show | help}"},
{"ping", jt_ping, 0, "ping nid,[nid,...]"},
{"discover", jt_discover, 0, "discover nid[,nid,...]"},
+ {"service-id", jt_calc_service_id, 0, "Calculate IB Lustre service ID\n"},
+ {"udsp", jt_udsp, 0, "udsp {add | del | help}"},
{"help", Parser_help, 0, "help"},
{"exit", Parser_quit, 0, "quit"},
{"quit", Parser_quit, 0, "quit"},
"\t--net: net name (e.g. tcp0)\n"
"\t--gateway: gateway nid (e.g. 10.1.1.2@tcp)\n"
"\t--hop: number to final destination (1 < hops < 255)\n"
- "\t--priority: priority of route (0 - highest prio\n"},
+ "\t--priority: priority of route (0 - highest prio\n"
+ "\t--health_sensitivity: gateway health sensitivity (>= 1)\n"},
{"del", jt_del_route, 0, "delete a route\n"
"\t--net: net name (e.g. tcp0)\n"
"\t--gateway: gateway nid (e.g. 10.1.1.2@tcp)\n"},
"\t--gateway: gateway nid (e.g. 10.1.1.2@tcp) to filter on\n"
"\t--hop: number to final destination (1 < hops < 255) to filter on\n"
"\t--priority: priority of route (0 - highest prio to filter on\n"
+ "\t--health_sensitivity: gateway health sensitivity (>= 1)\n"
"\t--verbose: display detailed output per route\n"},
{ 0, 0, 0, NULL }
};
{"discovery", jt_set_discovery, 0, "enable/disable peer discovery\n"
"\t0 - disable peer discovery\n"
"\t1 - enable peer discovery (default)\n"},
+ {"drop_asym_route", jt_set_drop_asym_route, 0,
+ "drop/accept asymmetrical route messages\n"
+ "\t0 - accept asymmetrical route messages (default)\n"
+ "\t1 - drop asymmetrical route messages\n"},
{"retry_count", jt_set_retry_count, 0, "number of retries\n"
"\t0 - turn of retries\n"
"\t>0 - number of retries\n"},
{"health_sensitivity", jt_set_hsensitivity, 0, "sensitivity to failure\n"
"\t0 - turn off health evaluation\n"
"\t>0 - sensitivity value not more than 1000\n"},
+ {"recovery_interval", jt_set_recov_intrv, 0, "interval to ping in seconds (at least 1)\n"
+ "\t>0 - time in seconds between pings\n"},
+ {"router_sensitivity", jt_set_rtr_sensitivity, 0, "router sensitivity %\n"
+ "\t100 - router interfaces need to be fully healthy to be used\n"
+ "\t<100 - router interfaces can be used even if not healthy\n"},
+ {"response_tracking", jt_set_response_tracking, 0,
+ "Set the behavior of response tracking\n"
+ "\t0 - Only LNet pings and discovery pushes utilize response tracking\n"
+ "\t1 - GETs are eligible for response tracking\n"
+ "\t2 - PUTs are eligible for response tracking\n"
+ "\t3 - Both PUTs and GETs are eligible for response tracking (default)\n"
+ "\tNote: Regardless of the value of the response_tracking parameter LNet\n"
+ "\t pings and discovery pushes always utilize response tracking\n"},
+ {"recovery_limit", jt_set_recovery_limit, 0,
+ "Set how long LNet will attempt to recover unhealthy interfaces.\n"
+ "\t0 - Recover indefinitely (default)\n"
+ "\t>0 - Recover for the specified number of seconds.\n"},
{ 0, 0, 0, NULL }
};
command_t peer_cmds[] = {
{"add", jt_add_peer_nid, 0, "add a peer NID\n"
- "\t--prim_nid: Primary NID of the peer. If not provided then the first\n"
- "\t NID in the list becomes the Primary NID of a newly created\n"
- "\t peer. \n"
+ "\t--prim_nid: Primary NID of the peer.\n"
"\t--nid: one or more peer NIDs\n"
"\t--non_mr: create this peer as not Multi-Rail capable\n"
"\t--ip2nets: specify a range of nids per peer"},
{ 0, 0, 0, NULL }
};
+command_t udsp_cmds[] = {
+ {"add", jt_add_udsp, 0, "add a udsp\n"
+ "\t--src: ip2nets syntax specifying the local NID to match\n"
+ "\t--dst: ip2nets syntax specifying the remote NID to match\n"
+ "\t--rte: ip2nets syntax specifying the router NID to match\n"
+ "\t--priority: priority value (0 - highest priority)\n"
+ "\t--idx: index of where to insert the rule.\n"
+ "\t By default, appends to the end of the rule list.\n"},
+ {"del", jt_del_udsp, 0, "delete a udsp\n"
+ "\t--idx: index of the Policy.\n"},
+ {"show", jt_show_udsp, 0, "show udsps\n"
+ "\t --idx: index of the policy to show.\n"},
+ { 0, 0, 0, NULL }
+};
+
+static int jt_calc_service_id(int argc, char **argv)
+{
+ int rc;
+ __u64 service_id;
+
+ rc = lustre_lnet_calc_service_id(&service_id);
+ if (rc != LUSTRE_CFG_RC_NO_ERR)
+ return rc;
+
+ /*
+ * cYAML currently doesn't support printing hex values.
+ * Therefore just print it locally here
+ */
+ printf("service id:\n value: 0x%jx\n", (uintmax_t)service_id);
+
+ return rc;
+}
+
static inline void print_help(const command_t cmds[], const char *cmd_type,
const char *pc_name)
{
return rc;
}
+static int jt_set_response_tracking(int argc, char **argv)
+{
+ long int value;
+ int rc;
+ struct cYAML *err_rc = NULL;
+
+ rc = check_cmd(set_cmds, "set", "response_tracking", 2, argc, argv);
+ if (rc)
+ return rc;
+
+ rc = parse_long(argv[1], &value);
+ if (rc != 0) {
+ cYAML_build_error(-1, -1, "parser", "set",
+ "cannot parse response_tracking value",
+ &err_rc);
+ cYAML_print_tree2file(stderr, err_rc);
+ cYAML_free_tree(err_rc);
+ return -1;
+ }
+
+ rc = lustre_lnet_config_response_tracking(value, -1, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR)
+ cYAML_print_tree2file(stderr, err_rc);
+
+ cYAML_free_tree(err_rc);
+
+ return rc;
+}
+
+static int jt_set_recovery_limit(int argc, char **argv)
+{
+ long int value;
+ int rc;
+ struct cYAML *err_rc = NULL;
+
+ rc = check_cmd(set_cmds, "set", "recovery_limit", 2, argc, argv);
+ if (rc)
+ return rc;
+
+ rc = parse_long(argv[1], &value);
+ if (rc != 0) {
+ cYAML_build_error(-1, -1, "parser", "set",
+ "cannot parse recovery_limit value",
+ &err_rc);
+ cYAML_print_tree2file(stderr, err_rc);
+ cYAML_free_tree(err_rc);
+ return -1;
+ }
+
+ rc = lustre_lnet_config_recovery_limit(value, -1, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR)
+ cYAML_print_tree2file(stderr, err_rc);
+
+ cYAML_free_tree(err_rc);
+
+ return rc;
+}
+
static int jt_set_max_intf(int argc, char **argv)
{
long int value;
return rc;
}
+static int jt_set_recov_intrv(int argc, char **argv)
+{
+ long int value;
+ int rc;
+ struct cYAML *err_rc = NULL;
+
+ rc = check_cmd(set_cmds, "set", "recovery_interval", 2, argc, argv);
+ if (rc)
+ return rc;
+
+ rc = parse_long(argv[1], &value);
+ if (rc != 0) {
+ cYAML_build_error(-1, -1, "parser", "set",
+ "cannot parse recovery interval value", &err_rc);
+ cYAML_print_tree2file(stderr, err_rc);
+ cYAML_free_tree(err_rc);
+ return -1;
+ }
+
+ rc = lustre_lnet_config_recov_intrv(value, -1, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR)
+ cYAML_print_tree2file(stderr, err_rc);
+
+ cYAML_free_tree(err_rc);
+
+ return rc;
+}
+
+static int jt_set_rtr_sensitivity(int argc, char **argv)
+{
+ long int value;
+ int rc;
+ struct cYAML *err_rc = NULL;
+
+ rc = check_cmd(set_cmds, "set", "router_sensitivity", 2, argc, argv);
+ if (rc)
+ return rc;
+
+ rc = parse_long(argv[1], &value);
+ if (rc != 0) {
+ cYAML_build_error(-1, -1, "parser", "set",
+ "cannot parse router sensitivity value", &err_rc);
+ cYAML_print_tree2file(stderr, err_rc);
+ cYAML_free_tree(err_rc);
+ return -1;
+ }
+
+ rc = lustre_lnet_config_rtr_sensitivity(value, -1, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR)
+ cYAML_print_tree2file(stderr, err_rc);
+
+ cYAML_free_tree(err_rc);
+
+ return rc;
+}
+
static int jt_set_hsensitivity(int argc, char **argv)
{
long int value;
return rc;
}
+static int jt_set_drop_asym_route(int argc, char **argv)
+{
+ long int value;
+ int rc;
+ struct cYAML *err_rc = NULL;
+
+ rc = check_cmd(set_cmds, "set", "drop_asym_route", 2, argc, argv);
+ if (rc)
+ return rc;
+
+ rc = parse_long(argv[1], &value);
+ if (rc != 0) {
+ cYAML_build_error(-1, -1, "parser", "set",
+ "cannot parse drop_asym_route value",
+ &err_rc);
+ cYAML_print_tree2file(stderr, err_rc);
+ cYAML_free_tree(err_rc);
+ return -1;
+ }
+
+ rc = lustre_lnet_config_drop_asym_route(value, -1, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR)
+ cYAML_print_tree2file(stderr, err_rc);
+
+ cYAML_free_tree(err_rc);
+
+ return rc;
+}
+
static int jt_set_tiny(int argc, char **argv)
{
long int value;
static int jt_add_route(int argc, char **argv)
{
char *network = NULL, *gateway = NULL;
- long int hop = -1, prio = -1;
+ long int hop = -1, prio = -1, sen = -1;
struct cYAML *err_rc = NULL;
int rc, opt;
{ .name = "gateway", .has_arg = required_argument, .val = 'g' },
{ .name = "hop-count", .has_arg = required_argument, .val = 'c' },
{ .name = "priority", .has_arg = required_argument, .val = 'p' },
+ { .name = "health_sensitivity", .has_arg = required_argument, .val = 's' },
{ .name = NULL } };
rc = check_cmd(route_cmds, "route", "add", 0, argc, argv);
continue;
}
break;
+ case 's':
+ rc = parse_long(optarg, &sen);
+ if (rc != 0) {
+ /* ingore option */
+ sen = -1;
+ continue;
+ }
+ break;
+
case '?':
print_help(route_cmds, "route", "add");
default:
}
}
- rc = lustre_lnet_config_route(network, gateway, hop, prio, -1, &err_rc);
+ rc = lustre_lnet_config_route(network, gateway, hop, prio, sen, -1,
+ &err_rc);
if (rc != LUSTRE_CFG_RC_NO_ERR)
cYAML_print_tree2file(stderr, err_rc);
int rc, opt;
struct cYAML *err_rc = NULL;
- const char *const short_options = "h:n:a";
+ const char *const short_options = "t:n:a";
static const struct option long_options[] = {
{ .name = "nid", .has_arg = required_argument, .val = 'n' },
- { .name = "health", .has_arg = required_argument, .val = 'h' },
+ { .name = "health", .has_arg = required_argument, .val = 't' },
{ .name = "all", .has_arg = no_argument, .val = 'a' },
{ .name = NULL } };
case 'n':
nid = optarg;
break;
- case 'h':
- if (parse_long(argv[optind++], &healthv) != 0)
+ case 't':
+ if (parse_long(optarg, &healthv) != 0)
healthv = -1;
break;
case 'a':
all = true;
+ break;
default:
return 0;
}
return rc;
}
+static int jt_show_udsp(int argc, char **argv)
+{
+ int idx = -1;
+ int rc, opt;
+ struct cYAML *err_rc = NULL, *show_rc = NULL;
+
+ const char *const short_options = "i:";
+ static const struct option long_options[] = {
+ { .name = "idx", .has_arg = required_argument, .val = 'i' },
+ { .name = NULL }
+ };
+
+ rc = check_cmd(udsp_cmds, "udsp", "show", 0, argc, argv);
+ if (rc)
+ return rc;
+
+ while ((opt = getopt_long(argc, argv, short_options,
+ long_options, NULL)) != -1) {
+ switch (opt) {
+ case 'i':
+ idx = atoi(optarg);
+ break;
+ case '?':
+ print_help(net_cmds, "net", "show");
+ default:
+ return 0;
+ }
+ }
+
+ rc = lustre_lnet_show_udsp(idx, -1, &show_rc, &err_rc);
+
+ 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_show_global(int argc, char **argv)
{
int rc;
goto out;
}
+ rc = lustre_lnet_show_drop_asym_route(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ goto out;
+ }
+
rc = lustre_lnet_show_retry_count(-1, &show_rc, &err_rc);
if (rc != LUSTRE_CFG_RC_NO_ERR) {
cYAML_print_tree2file(stderr, err_rc);
goto out;
}
+ rc = lustre_lnet_show_recov_intrv(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ goto out;
+ }
+
+ rc = lustre_lnet_show_rtr_sensitivity(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ goto out;
+ }
+
+ rc = lustre_lnet_show_lnd_timeout(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ goto out;
+ }
+
+ rc = lustre_lnet_show_response_tracking(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ goto out;
+ }
+
+ rc = lustre_lnet_show_recovery_limit(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ goto out;
+ }
+
if (show_rc)
cYAML_print_tree(show_rc);
return Parser_execarg(argc - 1, &argv[1], set_cmds);
}
+static int jt_udsp(int argc, char **argv)
+{
+ int rc;
+
+ rc = check_cmd(udsp_cmds, "udsp", NULL, 2, argc, argv);
+ if (rc)
+ return rc;
+
+ return Parser_execarg(argc - 1, &argv[1], udsp_cmds);
+}
+
static int jt_import(int argc, char **argv)
{
char *file = NULL;
err_rc = NULL;
}
+ rc = lustre_lnet_show_drop_asym_route(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ cYAML_free_tree(err_rc);
+ err_rc = NULL;
+ }
+
+ rc = lustre_lnet_show_retry_count(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ err_rc = NULL;
+ }
+
+ rc = lustre_lnet_show_transaction_to(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ err_rc = NULL;
+ }
+
+ rc = lustre_lnet_show_hsensitivity(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ err_rc = NULL;
+ }
+
+ rc = lustre_lnet_show_recov_intrv(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ err_rc = NULL;
+ }
+
+ rc = lustre_lnet_show_rtr_sensitivity(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ err_rc = NULL;
+ }
+
+ rc = lustre_lnet_show_lnd_timeout(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ err_rc = NULL;
+ }
+
+ rc = lustre_lnet_show_response_tracking(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ cYAML_free_tree(err_rc);
+ err_rc = NULL;
+ }
+
+ rc = lustre_lnet_show_recovery_limit(-1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ cYAML_free_tree(err_rc);
+ err_rc = NULL;
+ }
+
+ rc = lustre_lnet_show_udsp(-1, -1, &show_rc, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_print_tree2file(stderr, err_rc);
+ cYAML_free_tree(err_rc);
+ err_rc = NULL;
+ }
+
if (show_rc != NULL) {
cYAML_print_tree2file(f, show_rc);
cYAML_free_tree(show_rc);
return 0;
}
-static int jt_add_peer_nid(int argc, char **argv)
+static int jt_peer_nid_common(int argc, char **argv, int cmd)
{
- char *prim_nid = NULL;
- char **nids = NULL, **nids2 = NULL;
- int size = 0;
+ 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;
- int rc = LUSTRE_CFG_RC_NO_ERR, opt, i;
- bool non_mr = false;
- bool ip2nets = false, nid_list = false, prim_nid_present = false;
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 = "ip2nets", .has_arg = required_argument, .val = 'i' },
{ .name = NULL } };
rc = check_cmd(peer_cmds, "peer", "add", 2, argc, argv);
long_opts, NULL)) != -1) {
switch (opt) {
case 'k':
- prim_nid_present = true;
- if (ip2nets) {
- cYAML_build_error(-1, -1, "peer", "add",
- "ip2nets can not be specified"
- " along side prim_nid parameter.",
- &err_rc);
- goto failed;
- }
prim_nid = optarg;
break;
- case 'i':
case 'n':
- if (opt == 'i')
- ip2nets = true;
-
- if (opt == 'n')
- nid_list = true;
-
- if (ip2nets && (nid_list || prim_nid_present)) {
- cYAML_build_error(-1, -1, "peer", "add",
- "ip2nets can not be specified"
- " along side nid or prim_nid"
- " parameters", &err_rc);
- goto failed;
- }
-
- size = lustre_lnet_parse_nids(optarg, nids, size,
- &nids2);
- if (nids2 == NULL)
- goto failed;
- nids = nids2;
- rc = LUSTRE_CFG_RC_OUT_OF_MEM;
+ nidstr = optarg;
break;
case 'm':
- non_mr = true;
+ 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", "add");
+ print_help(peer_cmds, "peer",
+ cmd == LNETCTL_ADD_CMD ? "add" : "del");
default:
return 0;
}
}
- for (; optind < argc; optind++) {
- size = lustre_lnet_parse_nids(argv[optind], nids, size,
- &nids2);
- if (nids2 == NULL)
- goto failed;
- nids = nids2;
- }
-
- rc = lustre_lnet_config_peer_nid(prim_nid, nids, size,
- !non_mr, ip2nets, -1, &err_rc);
+ rc = lustre_lnet_modify_peer(prim_nid, nidstr, is_mr, cmd,
+ -1, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR)
+ goto out;
-failed:
- if (nids) {
- /* free the array of nids */
- for (i = 0; i < size; i++)
- free(nids[i]);
- free(nids);
- }
+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);
return rc;
}
-static int jt_del_peer_nid(int argc, char **argv)
+static int jt_add_peer_nid(int argc, char **argv)
{
- char *prim_nid = NULL;
- char **nids = NULL, **nids2 = NULL;
- struct cYAML *err_rc = NULL;
- int rc = LUSTRE_CFG_RC_NO_ERR, opt, i, size = 0;
- bool ip2nets = false, nid_list = false, prim_nid_present = false;
-
- const char *const short_opts = "k:n:";
- const struct option long_opts[] = {
- { .name = "prim_nid", .has_arg = required_argument, .val = 'k' },
- { .name = "nid", .has_arg = required_argument, .val = 'n' },
- { .name = "ip2nets", .has_arg = required_argument, .val = 'i' },
- { .name = NULL } };
-
- rc = check_cmd(peer_cmds, "peer", "del", 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_present = true;
- if (ip2nets) {
- cYAML_build_error(-1, -1, "peer", "add",
- "ip2nets can not be specified"
- " along side prim_nid parameter.",
- &err_rc);
- goto failed;
- }
- prim_nid = optarg;
- break;
- case 'i':
- case 'n':
- if (opt == 'i')
- ip2nets = true;
-
- if (opt == 'n')
- nid_list = true;
-
- if (ip2nets && (nid_list || prim_nid_present)) {
- cYAML_build_error(-1, -1, "peer", "add",
- "ip2nets can not be specified"
- " along side nid or prim_nid"
- " parameters", &err_rc);
- goto failed;
- }
- size = lustre_lnet_parse_nids(optarg, nids, size,
- &nids2);
- if (nids2 == NULL)
- goto failed;
- nids = nids2;
- rc = LUSTRE_CFG_RC_OUT_OF_MEM;
- break;
- case '?':
- print_help(peer_cmds, "peer", "del");
- default:
- return 0;
- }
- }
-
- for (; optind < argc; optind++) {
- size = lustre_lnet_parse_nids(argv[optind], nids, size,
- &nids2);
- if (nids2 == NULL)
- goto failed;
- nids = nids2;
- }
-
- rc = lustre_lnet_del_peer_nid(prim_nid, nids, size, ip2nets, -1, &err_rc);
-
-failed:
- if (nids) {
- for (i = 0; i < size; i++)
- free(nids[i]);
- free(nids);
- }
-
- if (rc != LUSTRE_CFG_RC_NO_ERR)
- cYAML_print_tree2file(stderr, err_rc);
-
- cYAML_free_tree(err_rc);
+ return jt_peer_nid_common(argc, argv, LNETCTL_ADD_CMD);
+}
- return rc;
+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)
return rc;
}
+static int jt_add_udsp(int argc, char **argv)
+{
+ char *src = NULL, *dst = NULL, *rte = NULL;
+ struct cYAML *err_rc = NULL;
+ union lnet_udsp_action udsp_action;
+ long int idx = -1, priority = -1;
+ int opt, rc = 0;
+ char *action_type = "pref";
+
+ const char *const short_options = "s:d:r:p:i:";
+ static const struct option long_options[] = {
+ { .name = "src", .has_arg = required_argument, .val = 's' },
+ { .name = "dst", .has_arg = required_argument, .val = 'd' },
+ { .name = "rte", .has_arg = required_argument, .val = 'r' },
+ { .name = "priority", .has_arg = required_argument, .val = 'p' },
+ { .name = "idx", .has_arg = required_argument, .val = 'i' },
+ { .name = NULL } };
+
+ rc = check_cmd(udsp_cmds, "udsp", "add", 0, argc, argv);
+ if (rc)
+ return rc;
+
+ while ((opt = getopt_long(argc, argv, short_options,
+ long_options, NULL)) != -1) {
+ switch (opt) {
+ case 's':
+ src = optarg;
+ break;
+ case 'd':
+ dst = optarg;
+ break;
+ case 'r':
+ rte = optarg;
+ break;
+ case 'p':
+ rc = parse_long(optarg, &priority);
+ if (rc != 0)
+ priority = -1;
+ action_type = "priority";
+ udsp_action.udsp_priority = priority;
+ break;
+ case 'i':
+ rc = parse_long(optarg, &idx);
+ if (rc != 0)
+ idx = 0;
+ break;
+ case '?':
+ print_help(udsp_cmds, "udsp", "add");
+ default:
+ return 0;
+ }
+ }
+
+ rc = lustre_lnet_add_udsp(src, dst, rte, action_type, &udsp_action,
+ idx, -1, &err_rc);
+
+ if (rc != LUSTRE_CFG_RC_NO_ERR)
+ cYAML_print_tree2file(stderr, err_rc);
+
+ cYAML_free_tree(err_rc);
+
+ return rc;
+}
+
+static int jt_del_udsp(int argc, char **argv)
+{
+ struct cYAML *err_rc = NULL;
+ long int idx = 0;
+ int opt, rc = 0;
+
+ const char *const short_options = "i:";
+ static const struct option long_options[] = {
+ { .name = "idx", .has_arg = required_argument, .val = 'i' },
+ { .name = NULL } };
+
+ rc = check_cmd(udsp_cmds, "udsp", "del", 0, argc, argv);
+ if (rc)
+ return rc;
+
+ while ((opt = getopt_long(argc, argv, short_options,
+ long_options, NULL)) != -1) {
+ switch (opt) {
+ case 'i':
+ rc = parse_long(optarg, &idx);
+ if (rc != 0)
+ idx = 0;
+ break;
+ case '?':
+ print_help(udsp_cmds, "udsp", "add");
+ default:
+ return 0;
+ }
+ }
+
+ rc = lustre_lnet_del_udsp(idx, -1, &err_rc);
+ if (rc != LUSTRE_CFG_RC_NO_ERR)
+ cYAML_print_tree2file(stderr, err_rc);
+
+ cYAML_free_tree(err_rc);
+
+ return rc;
+}
+
static int lnetctl_list_commands(int argc, char **argv)
{
char buffer[81] = ""; /* 80 printable chars + terminating NUL */