+ return 0;
+}
+
+int
+jt_ptl_del_peer (int argc, char **argv)
+{
+ struct libcfs_ioctl_data data;
+ lnet_nid_t nid = LNET_NID_ANY;
+ lnet_pid_t pid = LNET_PID_ANY;
+ __u32 ip = 0;
+ char *end;
+ int rc;
+
+ if (!g_net_is_compatible (argv[0], SOCKLND, RALND, MXLND, PTLLND,
+ O2IBLND, GNILND, 0))
+ return -1;
+
+ if (g_net_is_compatible(NULL, SOCKLND, 0)) {
+ if (argc > 3) {
+ fprintf (stderr, "usage: %s [nid] [ipaddr]\n",
+ argv[0]);
+ return 0;
+ }
+ } else if (g_net_is_compatible(NULL, PTLLND, 0)) {
+ if (argc > 3) {
+ fprintf (stderr, "usage: %s [nid] [pid]\n",
+ argv[0]);
+ return 0;
+ }
+ } else if (argc > 2) {
+ fprintf (stderr, "usage: %s [nid]\n", argv[0]);
+ return 0;
+ }
+
+ if (argc > 1 &&
+ !libcfs_str2anynid(&nid, argv[1])) {
+ fprintf (stderr, "Can't parse nid: %s\n", argv[1]);
+ return -1;
+ }
+
+ if (g_net_is_compatible(NULL, SOCKLND, 0)) {
+ if (argc > 2 &&
+ lnet_parse_ipaddr (&ip, argv[2]) != 0) {
+ fprintf (stderr, "Can't parse ip addr: %s\n",
+ argv[2]);
+ return -1;
+ }
+ } else if (g_net_is_compatible(NULL, PTLLND, 0)) {
+ if (argc > 2) {
+ pid = strtol(argv[2], &end, 0);
+ if (end == argv[2] || *end == 0) {
+ fprintf(stderr, "Can't parse pid %s\n",
+ argv[2]);
+ return -1;
+ }
+ }
+ }
+
+ LIBCFS_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_nid = nid;
+ data.ioc_u32[0] = ip;
+ data.ioc_u32[1] = pid;
+
+ rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_DEL_PEER, &data);
+ if (rc != 0) {
+ fprintf (stderr, "failed to remove peer: %s\n",
+ strerror (errno));
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+jt_ptl_print_connections (int argc, char **argv)
+{
+ struct libcfs_ioctl_data data;
+ lnet_process_id_t id;
+ char buffer[2][HOST_NAME_MAX + 1];
+ int index;
+ int rc;
+
+ if (!g_net_is_compatible (argv[0], SOCKLND, RALND, MXLND, O2IBLND,
+ GNILND, 0))
+ return -1;
+
+ for (index = 0; ; index++) {
+ LIBCFS_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_count = index;
+
+ rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_GET_CONN, &data);
+ if (rc != 0)
+ break;
+
+ if (g_net_is_compatible (NULL, SOCKLND, 0)) {
+ id.nid = data.ioc_nid;
+ id.pid = data.ioc_u32[6];
+ printf ("%-20s %s[%d]%s->%s:%d %d/%d %s\n",
+ libcfs_id2str(id),
+ (data.ioc_u32[3] == SOCKLND_CONN_ANY) ? "A" :
+ (data.ioc_u32[3] == SOCKLND_CONN_CONTROL) ? "C" :
+ (data.ioc_u32[3] == SOCKLND_CONN_BULK_IN) ? "I" :
+ (data.ioc_u32[3] == SOCKLND_CONN_BULK_OUT) ? "O" : "?",
+ data.ioc_u32[4], /* scheduler */
+ /* local IP addr */
+ ptl_ipaddr_2_str(data.ioc_u32[2], buffer[0],
+ sizeof(buffer[0]), 1),
+ /* remote IP addr */
+ ptl_ipaddr_2_str(data.ioc_u32[0], buffer[1],
+ sizeof(buffer[1]), 1),
+ data.ioc_u32[1], /* remote port */
+ data.ioc_count, /* tx buffer size */
+ data.ioc_u32[5], /* rx buffer size */
+ data.ioc_flags ? "nagle" : "nonagle");
+ } else if (g_net_is_compatible (NULL, RALND, 0)) {
+ printf ("%-20s [%d]\n",
+ libcfs_nid2str(data.ioc_nid),
+ data.ioc_u32[0] /* device id */);
+ } else if (g_net_is_compatible (NULL, O2IBLND, 0)) {
+ printf ("%s mtu %d\n",
+ libcfs_nid2str(data.ioc_nid),
+ data.ioc_u32[0]); /* path MTU */
+ } else if (g_net_is_compatible (NULL, GNILND, 0)) {
+ printf ("%-20s [%d]\n",
+ libcfs_nid2str(data.ioc_nid),
+ data.ioc_u32[0] /* device id */);
+ } else {
+ printf ("%s\n", libcfs_nid2str(data.ioc_nid));
+ }
+ }
+
+ if (index == 0) {
+ if (errno == ENOENT) {
+ printf ("<no connections>\n");
+ } else {
+ fprintf(stderr, "Error getting connection list: %s: "
+ "check dmesg.\n",
+ strerror(errno));
+ }
+ }
+ return 0;
+}
+
+int jt_ptl_disconnect(int argc, char **argv)
+{
+ struct libcfs_ioctl_data data;
+ lnet_nid_t nid = LNET_NID_ANY;
+ __u32 ipaddr = 0;
+ int rc;
+
+ if (argc > 3) {
+ fprintf(stderr, "usage: %s [nid] [ipaddr]\n", argv[0]);
+ return 0;
+ }
+
+ if (!g_net_is_compatible (NULL, SOCKLND, RALND, MXLND, O2IBLND,
+ GNILND, 0))
+ return 0;
+
+ if (argc >= 2 &&
+ !libcfs_str2anynid(&nid, argv[1])) {
+ fprintf (stderr, "Can't parse nid %s\n", argv[1]);
+ return -1;
+ }
+
+ if (g_net_is_compatible (NULL, SOCKLND, 0) &&
+ argc >= 3 &&
+ lnet_parse_ipaddr (&ipaddr, argv[2]) != 0) {
+ fprintf (stderr, "Can't parse ip addr %s\n", argv[2]);
+ return -1;
+ }
+
+ LIBCFS_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_nid = nid;
+ data.ioc_u32[0] = ipaddr;
+
+ rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_CLOSE_CONNECTION, &data);
+ if (rc != 0) {
+ fprintf(stderr, "failed to remove connection: %s\n",
+ strerror(errno));
+ return -1;
+ }
+
+ return 0;
+}
+
+int jt_ptl_push_connection (int argc, char **argv)
+{
+ struct libcfs_ioctl_data data;
+ int rc;
+ lnet_nid_t nid = LNET_NID_ANY;
+
+ if (argc > 2) {
+ fprintf(stderr, "usage: %s [nid]\n", argv[0]);
+ return 0;
+ }
+
+ if (!g_net_is_compatible (argv[0], SOCKLND, GNILND, 0))
+ return -1;
+
+ if (argc > 1 &&
+ !libcfs_str2anynid(&nid, argv[1])) {
+ fprintf(stderr, "Can't parse nid: %s\n", argv[1]);
+ return -1;
+ }
+
+ LIBCFS_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_nid = nid;
+
+ rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_PUSH_CONNECTION, &data);
+ if (rc != 0) {
+ fprintf(stderr, "failed to push connection: %s\n",
+ strerror(errno));
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+jt_ptl_print_active_txs (int argc, char **argv)
+{
+ struct libcfs_ioctl_data data;
+ int index;
+ int rc;
+
+ if (!g_net_is_compatible (argv[0], QSWLND, 0))
+ return -1;
+
+ for (index = 0;;index++) {
+ LIBCFS_IOC_INIT(data);
+ data.ioc_net = g_net;
+ data.ioc_count = index;
+
+ rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_GET_TXDESC, &data);
+ if (rc != 0)
+ break;
+
+ printf ("type %u payload %6d to %s via %s by pid %6d: "
+ "%s, %s, state %d\n",
+ data.ioc_u32[0],
+ data.ioc_count,
+ libcfs_nid2str(data.ioc_nid),
+ libcfs_nid2str(data.ioc_u64[0]),
+ data.ioc_u32[1],
+ (data.ioc_flags & 1) ? "delayed" : "immediate",
+ (data.ioc_flags & 2) ? "nblk" : "normal",
+ data.ioc_flags >> 2);
+ }
+
+ if (index == 0) {
+ if (errno == ENOENT) {
+ printf ("<no active descs>\n");
+ } else {
+ fprintf(stderr, "Error getting active transmits list: "
+ "%s: check dmesg.\n",
+ strerror(errno));
+ }
+ }
+ return 0;
+}
+
+int jt_ptl_ping(int argc, char **argv)
+{
+ int rc;
+ int timeout;
+ lnet_process_id_t id;
+ lnet_process_id_t ids[16];
+ int maxids = sizeof(ids)/sizeof(ids[0]);
+ struct libcfs_ioctl_data data;
+ char *sep;
+ int i;
+
+ if (argc < 2) {
+ fprintf(stderr, "usage: %s id [timeout (secs)]\n", argv[0]);
+ return 0;
+ }
+
+ sep = strchr(argv[1], '-');
+ if (sep == NULL) {
+ rc = lnet_parse_nid(argv[1], &id);
+ if (rc != 0)
+ return -1;
+ } else {
+ char *end;
+
+ if (argv[1][0] == 'u' ||
+ argv[1][0] == 'U')
+ id.pid = strtoul(&argv[1][1], &end, 0) | LNET_PID_USERFLAG;
+ else
+ id.pid = strtoul(argv[1], &end, 0);
+
+ if (end != sep) { /* assuming '-' is part of hostname */
+ rc = lnet_parse_nid(argv[1], &id);
+ if (rc != 0)
+ return -1;
+ } else {
+ id.nid = libcfs_str2nid(sep + 1);
+
+ if (id.nid == LNET_NID_ANY) {
+ fprintf(stderr,
+ "Can't parse process id \"%s\"\n",
+ argv[1]);
+ return -1;
+ }
+ }
+ }
+
+ if (argc > 2)
+ timeout = 1000 * atol(argv[2]);
+ else
+ timeout = 1000; /* default 1 second timeout */
+
+ LIBCFS_IOC_INIT (data);
+ data.ioc_nid = id.nid;
+ data.ioc_u32[0] = id.pid;
+ data.ioc_u32[1] = timeout;
+ data.ioc_plen1 = sizeof(ids);
+ data.ioc_pbuf1 = (char *)ids;
+
+ rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_PING, &data);
+ if (rc != 0) {
+ fprintf(stderr, "failed to ping %s: %s\n",
+ id.pid == LNET_PID_ANY ?
+ libcfs_nid2str(id.nid) : libcfs_id2str(id),
+ strerror(errno));
+ return -1;
+ }
+
+ for (i = 0; i < data.ioc_count && i < maxids; i++)
+ printf("%s\n", libcfs_id2str(ids[i]));
+
+ if (data.ioc_count > maxids)
+ printf("%d out of %d ids listed\n", maxids, data.ioc_count);
+
+ return 0;
+}
+
+int jt_ptl_mynid(int argc, char **argv)
+{
+ struct libcfs_ioctl_data data;
+ lnet_nid_t nid;
+ int rc;
+
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s NID\n", argv[0]);
+ return 0;
+ }
+
+ nid = libcfs_str2nid(argv[1]);
+ if (nid == LNET_NID_ANY) {
+ fprintf(stderr, "Can't parse NID '%s'\n", argv[1]);
+ return -1;
+ }
+
+ LIBCFS_IOC_INIT(data);
+ data.ioc_net = LNET_NIDNET(nid);
+ data.ioc_nid = nid;
+
+ rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_REGISTER_MYNID, &data);
+ if (rc < 0)
+ fprintf(stderr, "setting my NID failed: %s\n",
+ strerror(errno));
+ else
+ printf("registered my nid %s\n", libcfs_nid2str(nid));
+