X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Futils%2Fportals.c;h=fb031ae1b52070b5511587d573a8ed281d4a6920;hb=a70eb6ff289cd2984f1e5af94e65cdc882606a23;hp=4a05234e9a1838b827ca22baf08763a6415c1eeb;hpb=f569e36c2c16090108dfdeaf380c3dd237c546ec;p=fs%2Flustre-release.git diff --git a/lnet/utils/portals.c b/lnet/utils/portals.c index 4a05234..fb031ae 100644 --- a/lnet/utils/portals.c +++ b/lnet/utils/portals.c @@ -36,16 +36,32 @@ #include #include +#ifdef __CYGWIN__ + +#include + +#warning assuming little endian + +#define __cpu_to_le64(x) ((__u64)(x)) +#define __le64_to_cpu(x) ((__u64)(x)) +#define __cpu_to_le32(x) ((__u32)(x)) +#define __le32_to_cpu(x) ((__u32)(x)) +#define __cpu_to_le16(x) ((__u16)(x)) +#define __le16_to_cpu(x) ((__u16)(x)) + +#endif /* __CYGWIN__ */ + #include #include #include #include +#include #include "parser.h" unsigned int portal_debug; unsigned int portal_printk; unsigned int portal_stack; - +unsigned int portal_cerror; static unsigned int g_nal = 0; @@ -60,14 +76,51 @@ typedef struct } name2num_t; static name2num_t nalnames[] = { + {"any", 0}, {"tcp", SOCKNAL}, - {"toe", TOENAL}, {"elan", QSWNAL}, {"gm", GMNAL}, + {"ib", IBNAL}, {"scimac", SCIMACNAL}, {NULL, -1} }; +static cfg_record_cb_t g_record_cb; + +int +ptl_set_cfg_record_cb(cfg_record_cb_t cb) +{ + g_record_cb = cb; + return 0; +} + +int +pcfg_ioctl(struct portals_cfg *pcfg) +{ + int rc; + + if (pcfg->pcfg_nal ==0) + pcfg->pcfg_nal = g_nal; + + if (g_record_cb) { + rc = g_record_cb(PORTALS_CFG_TYPE, sizeof(*pcfg), pcfg); + } else { + struct portal_ioctl_data data; + PORTAL_IOC_INIT (data); + data.ioc_pbuf1 = (char*)pcfg; + data.ioc_plen1 = sizeof(*pcfg); + /* XXX liblustre hack XXX */ + data.ioc_nal_cmd = pcfg->pcfg_command; + data.ioc_nid = pcfg->pcfg_nid; + + rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + } + + return (rc); +} + + + static name2num_t * name2num_lookup_name (name2num_t *table, char *str) { @@ -95,7 +148,7 @@ ptl_name2nal (char *str) { name2num_t *e = name2num_lookup_name (nalnames, str); - return ((e == NULL) ? 0 : e->num); + return ((e == NULL) ? -1 : e->num); } static char * @@ -128,6 +181,49 @@ ptl_gethostbyname(char * hname) { } int +ptl_parse_port (int *port, char *str) +{ + char *end; + + *port = strtol (str, &end, 0); + + if (*end == 0 && /* parsed whole string */ + *port > 0 && *port < 65536) /* minimal sanity check */ + return (0); + + return (-1); +} + +int +ptl_parse_time (time_t *t, char *str) +{ + char *end; + int n; + struct tm tm; + + *t = strtol (str, &end, 0); + if (*end == 0) /* parsed whole string */ + return (0); + + memset (&tm, 0, sizeof (tm)); + n = sscanf (str, "%d-%d-%d-%d:%d:%d", + &tm.tm_year, &tm.tm_mon, &tm.tm_mday, + &tm.tm_hour, &tm.tm_min, &tm.tm_sec); + if (n != 6) + return (-1); + + tm.tm_mon--; /* convert to 0 == Jan */ + tm.tm_year -= 1900; /* y2k quirk */ + tm.tm_isdst = -1; /* dunno if it's daylight savings... */ + + *t = mktime (&tm); + if (*t == (time_t)-1) + return (-1); + + return (0); +} + +int ptl_parse_ipaddr (__u32 *ipaddrp, char *str) { struct hostent *he; @@ -183,8 +279,9 @@ ptl_ipaddr_2_str (__u32 ipaddr, char *str) int ptl_parse_nid (ptl_nid_t *nidp, char *str) { - __u32 ipaddr; - long lval; + __u32 ipaddr; + char *end; + unsigned long long ullval; if (!strcmp (str, "_all_")) { *nidp = PTL_NID_ANY; @@ -196,15 +293,10 @@ ptl_parse_nid (ptl_nid_t *nidp, char *str) return (0); } - if (sscanf (str, "%li", &lval) == 1) - { - *nidp = (ptl_nid_t)lval; - return (0); - } - - if (sscanf (str, "%lx", &lval) == 1) - { - *nidp = (ptl_nid_t)lval; + ullval = strtoull(str, &end, 0); + if (*end == 0) { + /* parsed whole string */ + *nidp = (ptl_nid_t)ullval; return (0); } @@ -220,21 +312,29 @@ ptl_nid2str (char *buffer, ptl_nid_t nid) if (he != NULL) strcpy (buffer, he->h_name); else - sprintf (buffer, "0x"LPX64, nid); + sprintf (buffer, LPX64, nid); return (buffer); } -int g_nal_is_compatible (char *cmd, ...) +int g_nal_is_set () { - va_list ap; - int nal; - if (g_nal == 0) { fprintf (stderr, "Error: you must run the 'network' command first.\n"); return (0); } - + + return (1); +} + +int g_nal_is_compatible (char *cmd, ...) +{ + va_list ap; + int nal; + + if (!g_nal_is_set ()) + return (0); + va_start (ap, cmd); do { @@ -245,9 +345,13 @@ int g_nal_is_compatible (char *cmd, ...) if (g_nal == nal) return (1); - - fprintf (stderr, "Command %s not compatible with nal %s\n", - cmd, nal2name (g_nal)); + + if (cmd != NULL) { + /* Don't complain verbosely if we've not been passed a command + * name to complain about! */ + fprintf (stderr, "Command %s not compatible with nal %s\n", + cmd, nal2name (g_nal)); + } return (0); } @@ -320,7 +424,7 @@ int jt_ptl_network(int argc, char **argv) int nal; if (argc == 2 && - (nal = ptl_name2nal (argv[1])) != 0) { + (nal = ptl_name2nal (argv[1])) >= 0) { g_nal = nal; return (0); } @@ -335,7 +439,7 @@ int jt_ptl_network(int argc, char **argv) int jt_ptl_print_autoconnects (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; char buffer[64]; int index; int rc; @@ -344,22 +448,21 @@ jt_ptl_print_autoconnects (int argc, char **argv) return -1; for (index = 0;;index++) { - PORTAL_IOC_INIT (data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_GET_AUTOCONN; - data.ioc_count = index; - - rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + PCFG_INIT (pcfg, NAL_CMD_GET_AUTOCONN); + pcfg.pcfg_count = index; + + rc = pcfg_ioctl (&pcfg); if (rc != 0) break; - printf (LPX64"@%s:%d #%d buffer %d nonagle %s xchg %s affinity %s share %d\n", - data.ioc_nid, ptl_ipaddr_2_str (data.ioc_id, buffer), - data.ioc_misc, data.ioc_count, data.ioc_size, - (data.ioc_flags & 1) ? "on" : "off", - (data.ioc_flags & 2) ? "on" : "off", - (data.ioc_flags & 4) ? "on" : "off", - data.ioc_wait); + printf (LPX64"@%s:%d #%d buffer %d " + "nonagle %s affinity %s eager %s share %d\n", + pcfg.pcfg_nid, ptl_ipaddr_2_str (pcfg.pcfg_id, buffer), + pcfg.pcfg_misc, pcfg.pcfg_count, pcfg.pcfg_size, + (pcfg.pcfg_flags & 1) ? "on" : "off", + (pcfg.pcfg_flags & 2) ? "on" : "off", + (pcfg.pcfg_flags & 4) ? "on" : "off", + pcfg.pcfg_wait); } if (index == 0) @@ -370,17 +473,17 @@ jt_ptl_print_autoconnects (int argc, char **argv) int jt_ptl_add_autoconnect (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; ptl_nid_t nid; __u32 ip; int port; - int xchange_nids = 0; int irq_affinity = 0; int share = 0; + int eager = 0; int rc; if (argc < 4 || argc > 5) { - fprintf (stderr, "usage: %s nid ipaddr port [ixs]\n", argv[0]); + fprintf (stderr, "usage: %s nid ipaddr port [ise]\n", argv[0]); return 0; } @@ -398,22 +501,25 @@ jt_ptl_add_autoconnect (int argc, char **argv) return -1; } - port = atol (argv[3]); - + if (ptl_parse_port (&port, argv[3]) != 0) { + fprintf (stderr, "Can't parse port: %s\n", argv[3]); + return -1; + } + if (argc > 4) { char *opts = argv[4]; while (*opts != 0) switch (*opts++) { - case 'x': - xchange_nids = 1; - break; case 'i': irq_affinity = 1; break; case 's': share = 1; break; + case 'e': + eager = 1; + break; default: fprintf (stderr, "Can't parse options: %s\n", argv[4]); @@ -421,20 +527,18 @@ jt_ptl_add_autoconnect (int argc, char **argv) } } - PORTAL_IOC_INIT (data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_ADD_AUTOCONN; - data.ioc_nid = nid; - data.ioc_id = ip; - data.ioc_misc = port; + PCFG_INIT(pcfg, NAL_CMD_ADD_AUTOCONN); + pcfg.pcfg_nid = nid; + pcfg.pcfg_id = ip; + pcfg.pcfg_misc = port; /* only passing one buffer size! */ - data.ioc_size = MAX (g_socket_rxmem, g_socket_txmem); - data.ioc_flags = (g_socket_nonagle ? 1 : 0) | - (xchange_nids ? 2 : 0) | - (irq_affinity ? 4 : 0) | - (share ? 8 : 0); + pcfg.pcfg_size = MAX (g_socket_rxmem, g_socket_txmem); + pcfg.pcfg_flags = (g_socket_nonagle ? 0x01 : 0) | + (irq_affinity ? 0x02 : 0) | + (share ? 0x04 : 0) | + (eager ? 0x08 : 0); - rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + rc = pcfg_ioctl (&pcfg); if (rc != 0) { fprintf (stderr, "failed to enable autoconnect: %s\n", strerror (errno)); @@ -447,7 +551,7 @@ jt_ptl_add_autoconnect (int argc, char **argv) int jt_ptl_del_autoconnect (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; ptl_nid_t nid = PTL_NID_ANY; __u32 ip = 0; int share = 0; @@ -493,15 +597,13 @@ jt_ptl_del_autoconnect (int argc, char **argv) } } - PORTAL_IOC_INIT (data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_DEL_AUTOCONN; - data.ioc_nid = nid; - data.ioc_id = ip; - data.ioc_flags = (share ? 1 : 0) | + PCFG_INIT(pcfg, NAL_CMD_DEL_AUTOCONN); + pcfg.pcfg_nid = nid; + pcfg.pcfg_id = ip; + pcfg.pcfg_flags = (share ? 1 : 0) | (keep_conn ? 2 : 0); - - rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + + rc = pcfg_ioctl (&pcfg); if (rc != 0) { fprintf (stderr, "failed to remove autoconnect route: %s\n", strerror (errno)); @@ -514,7 +616,7 @@ jt_ptl_del_autoconnect (int argc, char **argv) int jt_ptl_print_connections (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; char buffer[64]; int index; int rc; @@ -523,19 +625,21 @@ jt_ptl_print_connections (int argc, char **argv) return -1; for (index = 0;;index++) { - PORTAL_IOC_INIT (data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_GET_CONN; - data.ioc_count = index; + PCFG_INIT (pcfg, NAL_CMD_GET_CONN); + pcfg.pcfg_count = index; - rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + rc = pcfg_ioctl (&pcfg); if (rc != 0) break; - printf (LPD64"@%s:%d\n", - data.ioc_nid, - ptl_ipaddr_2_str (data.ioc_id, buffer), - data.ioc_misc); + printf (LPX64"@%s:%d:%s\n", + pcfg.pcfg_nid, + ptl_ipaddr_2_str (pcfg.pcfg_id, buffer), + pcfg.pcfg_misc, + (pcfg.pcfg_flags == SOCKNAL_CONN_ANY) ? "A" : + (pcfg.pcfg_flags == SOCKNAL_CONN_CONTROL) ? "C" : + (pcfg.pcfg_flags == SOCKNAL_CONN_BULK_IN) ? "I" : + (pcfg.pcfg_flags == SOCKNAL_CONN_BULK_OUT) ? "O" : "?"); } if (index == 0) @@ -543,82 +647,9 @@ jt_ptl_print_connections (int argc, char **argv) return 0; } -int -exchange_nids (int cfd, ptl_nid_t my_nid, ptl_nid_t *peer_nid) -{ - int rc; - ptl_hdr_t hdr; - ptl_magicversion_t *hmv = (ptl_magicversion_t *)&hdr.dest_nid; - - LASSERT (sizeof (*hmv) == sizeof (hdr.dest_nid)); - - memset (&hdr, 0, sizeof (hdr)); - - hmv->magic = __cpu_to_le32 (PORTALS_PROTO_MAGIC); - hmv->version_major = __cpu_to_le16 (PORTALS_PROTO_VERSION_MAJOR); - hmv->version_minor = __cpu_to_le16 (PORTALS_PROTO_VERSION_MINOR); - - hdr.src_nid = __cpu_to_le64 (my_nid); - hdr.type = __cpu_to_le32 (PTL_MSG_HELLO); - - /* Assume there's sufficient socket buffering for a portals HELLO header */ - rc = sock_write (cfd, &hdr, sizeof (hdr)); - if (rc != 0) { - perror ("Can't send initial HELLO"); - return (-1); - } - - /* First few bytes down the wire are the portals protocol magic and - * version, no matter what protocol version we're running. */ - - rc = sock_read (cfd, hmv, sizeof (*hmv)); - if (rc != 0) { - perror ("Can't read from peer"); - return (-1); - } - - if (hmv->magic != __cpu_to_le32 (PORTALS_PROTO_MAGIC)) { - fprintf (stderr, "Bad magic %#08x (%#08x expected)\n", - __le32_to_cpu (hmv->magic), PORTALS_PROTO_MAGIC); - return (-1); - } - - if (hmv->version_major != __cpu_to_le16 (PORTALS_PROTO_VERSION_MAJOR) || - hmv->version_minor != __cpu_to_le16 (PORTALS_PROTO_VERSION_MINOR)) { - fprintf (stderr, "Incompatible protocol version %d.%d (%d.%d expected)\n", - __le16_to_cpu (hmv->version_major), - __le16_to_cpu (hmv->version_minor), - PORTALS_PROTO_VERSION_MAJOR, - PORTALS_PROTO_VERSION_MINOR); - } - - /* version 0 sends magic/version as the dest_nid of a 'hello' header, - * so read the rest of it in now... */ - LASSERT (PORTALS_PROTO_VERSION_MAJOR == 0); - rc = sock_read (cfd, hmv + 1, sizeof (hdr) - sizeof (*hmv)); - if (rc != 0) { - perror ("Can't read rest of HELLO hdr"); - return (-1); - } - - /* ...and check we got what we expected */ - if (hdr.type != __cpu_to_le32 (PTL_MSG_HELLO) || - PTL_HDR_LENGTH (&hdr) != __cpu_to_le32 (0)) { - fprintf (stderr, "Expecting a HELLO hdr with 0 payload," - " but got type %d with %d payload\n", - __le32_to_cpu (hdr.type), - __le32_to_cpu (PTL_HDR_LENGTH (&hdr))); - return (-1); - } - - *peer_nid = __le64_to_cpu (hdr.src_nid); - return (0); -} - int jt_ptl_connect(int argc, char **argv) { - ptl_nid_t peer_nid; - struct portal_ioctl_data data; + struct portals_cfg pcfg; struct sockaddr_in srvaddr; __u32 ipaddr; char *flag; @@ -627,17 +658,17 @@ int jt_ptl_connect(int argc, char **argv) int rxmem = 0; int txmem = 0; int bind_irq = 0; - int xchange_nids = 0; + int type = SOCKNAL_CONN_ANY; int port; int o; int olen; if (argc < 3) { - fprintf(stderr, "usage: %s ip port [xi]\n", argv[0]); + fprintf(stderr, "usage: %s ip port [xibctr]\n", argv[0]); return 0; } - if (!g_nal_is_compatible (argv[0], SOCKNAL, TOENAL, 0)) + if (!g_nal_is_compatible (argv[0], SOCKNAL, 0)) return -1; rc = ptl_parse_ipaddr (&ipaddr, argv[1]); @@ -646,7 +677,11 @@ int jt_ptl_connect(int argc, char **argv) return -1; } - port = atol(argv[2]); + if (ptl_parse_port (&port, argv[2]) != 0) { + fprintf (stderr, "Can't parse port: %s\n", argv[2]); + return -1; + } + if (argc > 3) for (flag = argv[3]; *flag != 0; flag++) switch (*flag) @@ -655,8 +690,28 @@ int jt_ptl_connect(int argc, char **argv) bind_irq = 1; break; - case 'x': - xchange_nids = 1; + case 'I': + if (type != SOCKNAL_CONN_ANY) { + fprintf(stderr, "Can't flag type twice\n"); + return -1; + } + type = SOCKNAL_CONN_BULK_IN; + break; + + case 'O': + if (type != SOCKNAL_CONN_ANY) { + fprintf(stderr, "Can't flag type twice\n"); + return -1; + } + type = SOCKNAL_CONN_BULK_OUT; + break; + + case 'C': + if (type != SOCKNAL_CONN_ANY) { + fprintf(stderr, "Can't flag type twice\n"); + return -1; + } + type = SOCKNAL_CONN_CONTROL; break; default: @@ -717,36 +772,20 @@ int jt_ptl_connect(int argc, char **argv) if (getsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &nonagle, &olen) != 0) fprintf (stderr, "Can't get nagle: %s\n", strerror (errno)); - if (!xchange_nids) - peer_nid = ipaddr; - else { - PORTAL_IOC_INIT (data); - data.ioc_nal = g_nal; - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_NID, &data); - if (rc != 0) { - fprintf (stderr, "failed to get my nid: %s\n", - strerror (errno)); - close (fd); - return (-1); - } - - rc = exchange_nids (fd, data.ioc_nid, &peer_nid); - if (rc != 0) { - close (fd); - return (-1); - } - } - printf("Connected host: %s NID "LPX64" snd: %d rcv: %d nagle: %s\n", argv[1], - peer_nid, txmem, rxmem, nonagle ? "Disabled" : "Enabled"); - - PORTAL_IOC_INIT(data); - data.ioc_fd = fd; - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_REGISTER_PEER_FD; - data.ioc_nid = peer_nid; - data.ioc_flags = bind_irq; - - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + printf("Connected host: %s snd: %d rcv: %d nagle: %s type: %s\n", + argv[1], txmem, rxmem, nonagle ? "Disabled" : "Enabled", + (type == SOCKNAL_CONN_ANY) ? "A" : + (type == SOCKNAL_CONN_CONTROL) ? "C" : + (type == SOCKNAL_CONN_BULK_IN) ? "I" : + (type == SOCKNAL_CONN_BULK_OUT) ? "O" : "?"); + + PCFG_INIT(pcfg, NAL_CMD_REGISTER_PEER_FD); + pcfg.pcfg_nal = g_nal; + pcfg.pcfg_fd = fd; + pcfg.pcfg_flags = bind_irq; + pcfg.pcfg_misc = type; + + rc = pcfg_ioctl(&pcfg); if (rc) { fprintf(stderr, "failed to register fd with portals: %s\n", strerror(errno)); @@ -754,7 +793,7 @@ int jt_ptl_connect(int argc, char **argv) return -1; } - printf("Connection to "LPX64" registered with socknal\n", peer_nid); + printf("Connection to %s registered with socknal\n", argv[1]); rc = close(fd); if (rc) @@ -765,7 +804,7 @@ int jt_ptl_connect(int argc, char **argv) int jt_ptl_disconnect(int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; ptl_nid_t nid = PTL_NID_ANY; __u32 ipaddr = 0; int rc; @@ -775,8 +814,8 @@ int jt_ptl_disconnect(int argc, char **argv) return 0; } - if (!g_nal_is_compatible (argv[0], SOCKNAL, TOENAL, 0)) - return -1; + if (!g_nal_is_compatible (NULL, SOCKNAL, 0)) + return 0; if (argc >= 2 && ptl_parse_nid (&nid, argv[1]) != 0) { @@ -790,13 +829,11 @@ int jt_ptl_disconnect(int argc, char **argv) return -1; } - PORTAL_IOC_INIT(data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_CLOSE_CONNECTION; - data.ioc_nid = nid; - data.ioc_id = ipaddr; + PCFG_INIT(pcfg, NAL_CMD_CLOSE_CONNECTION); + pcfg.pcfg_nid = nid; + pcfg.pcfg_id = ipaddr; - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + rc = pcfg_ioctl(&pcfg); if (rc) { fprintf(stderr, "failed to remove connection: %s\n", strerror(errno)); @@ -808,7 +845,7 @@ int jt_ptl_disconnect(int argc, char **argv) int jt_ptl_push_connection (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; int rc; ptl_nid_t nid = PTL_NID_ANY; __u32 ipaddr = 0; @@ -818,7 +855,7 @@ int jt_ptl_push_connection (int argc, char **argv) return 0; } - if (!g_nal_is_compatible (argv[0], SOCKNAL, TOENAL, 0)) + if (!g_nal_is_compatible (argv[0], SOCKNAL, 0)) return -1; if (argc > 1 && @@ -832,13 +869,11 @@ int jt_ptl_push_connection (int argc, char **argv) fprintf(stderr, "Can't parse ipaddr: %s\n", argv[2]); } - PORTAL_IOC_INIT(data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_PUSH_CONNECTION; - data.ioc_nid = nid; - data.ioc_id = ipaddr; - - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + PCFG_INIT(pcfg, NAL_CMD_PUSH_CONNECTION); + pcfg.pcfg_nid = nid; + pcfg.pcfg_id = ipaddr; + + rc = pcfg_ioctl(&pcfg); if (rc) { fprintf(stderr, "failed to push connection: %s\n", strerror(errno)); @@ -851,7 +886,7 @@ int jt_ptl_push_connection (int argc, char **argv) int jt_ptl_print_active_txs (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; int index; int rc; @@ -859,28 +894,26 @@ jt_ptl_print_active_txs (int argc, char **argv) return -1; for (index = 0;;index++) { - PORTAL_IOC_INIT (data); - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_GET_TXDESC; - data.ioc_count = index; - - rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + PCFG_INIT(pcfg, NAL_CMD_GET_TXDESC); + pcfg.pcfg_count = index; + + rc = pcfg_ioctl(&pcfg); if (rc != 0) break; - printf ("%p: %5s payload %6d bytes to "LPX64" via "LPX64" by pid %6d: %s,%s,%s\n", - data.ioc_pbuf1, - data.ioc_count == PTL_MSG_ACK ? "ACK" : - data.ioc_count == PTL_MSG_PUT ? "PUT" : - data.ioc_count == PTL_MSG_GET ? "GET" : - data.ioc_count == PTL_MSG_REPLY ? "REPLY" : "", - data.ioc_size, - data.ioc_nid, - data.ioc_nid2, - data.ioc_misc, - (data.ioc_flags & 1) ? "delayed" : "active", - (data.ioc_flags & 2) ? "forwarding" : "sending", - (data.ioc_flags & 4) ? "nblk" : "normal"); + printf ("%p: %5s payload %6d bytes to "LPX64" via "LPX64" by pid %6d: %s, %s, state %d\n", + pcfg.pcfg_pbuf1, + pcfg.pcfg_count == PTL_MSG_ACK ? "ACK" : + pcfg.pcfg_count == PTL_MSG_PUT ? "PUT" : + pcfg.pcfg_count == PTL_MSG_GET ? "GET" : + pcfg.pcfg_count == PTL_MSG_REPLY ? "REPLY" : "", + pcfg.pcfg_size, + pcfg.pcfg_nid, + pcfg.pcfg_nid2, + pcfg.pcfg_misc, + (pcfg.pcfg_flags & 1) ? "delayed" : "immediate", + (pcfg.pcfg_flags & 2) ? "nblk" : "normal", + pcfg.pcfg_flags >> 2); } if (index == 0) @@ -902,11 +935,8 @@ int jt_ptl_ping(int argc, char **argv) return 0; } - if (g_nal == 0) { - fprintf(stderr, "Error: you must run the 'network' command " - "first.\n"); + if (!g_nal_is_set()) return -1; - } if (ptl_parse_nid (&nid, argv[1]) != 0) { @@ -957,11 +987,9 @@ int jt_ptl_shownid(int argc, char **argv) return 0; } - if (g_nal == 0) { - fprintf(stderr, "Error: you must run the 'network' command first\n"); + if (!g_nal_is_set()) return -1; - } - + PORTAL_IOC_INIT (data); data.ioc_nal = g_nal; rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_NID, &data); @@ -978,7 +1006,7 @@ int jt_ptl_mynid(int argc, char **argv) int rc; char hostname[1024]; char *nidstr; - struct portal_ioctl_data data; + struct portals_cfg pcfg; ptl_nid_t mynid; if (argc > 2) { @@ -987,11 +1015,8 @@ int jt_ptl_mynid(int argc, char **argv) return 0; } - if (g_nal == 0) { - fprintf(stderr, "Error: you must run the 'network' command " - "first.\n"); + if (!g_nal_is_set()) return -1; - } if (argc >= 2) nidstr = argv[1]; @@ -1009,12 +1034,10 @@ int jt_ptl_mynid(int argc, char **argv) return -1; } - PORTAL_IOC_INIT(data); - data.ioc_nid = mynid; - data.ioc_nal = g_nal; - data.ioc_nal_cmd = NAL_CMD_REGISTER_MYNID; + PCFG_INIT(pcfg, NAL_CMD_REGISTER_MYNID); + pcfg.pcfg_nid = mynid; - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + rc = pcfg_ioctl(&pcfg); if (rc < 0) fprintf(stderr, "setting my NID failed: %s\n", strerror(errno)); @@ -1037,11 +1060,8 @@ jt_ptl_fail_nid (int argc, char **argv) return (0); } - if (g_nal == 0) { - fprintf(stderr, "Error: you must run the 'network' command " - "first.\n"); + if (!g_nal_is_set()) return (-1); - } if (!strcmp (argv[1], "_all_")) nid = PTL_NID_ANY; @@ -1120,7 +1140,7 @@ jt_ptl_nagle (int argc, char **argv) if (Parser_bool (&enable, argv[1]) != 0) { fprintf (stderr, "Can't parse boolean %s\n", argv[1]); - return (0); + return (-1); } g_socket_nonagle = !enable; } @@ -1131,7 +1151,7 @@ jt_ptl_nagle (int argc, char **argv) int jt_ptl_add_route (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; ptl_nid_t nid1; ptl_nid_t nid2; ptl_nid_t gateway_nid; @@ -1143,11 +1163,8 @@ jt_ptl_add_route (int argc, char **argv) return (0); } - if (g_nal == 0) { - fprintf(stderr, "Error: you must run the 'network' command " - "first.\n"); + if (!g_nal_is_set()) return (-1); - } if (ptl_parse_nid (&gateway_nid, argv[1]) != 0) { @@ -1169,16 +1186,17 @@ jt_ptl_add_route (int argc, char **argv) return (-1); } - PORTAL_IOC_INIT(data); - data.ioc_nid = gateway_nid; - data.ioc_nal = g_nal; - data.ioc_nid2 = MIN (nid1, nid2); - data.ioc_nid3 = MAX (nid1, nid2); + PCFG_INIT(pcfg, NAL_CMD_ADD_ROUTE); + pcfg.pcfg_nid = gateway_nid; + pcfg.pcfg_nal = ROUTER; + pcfg.pcfg_gw_nal = g_nal; + pcfg.pcfg_nid2 = MIN (nid1, nid2); + pcfg.pcfg_nid3 = MAX (nid1, nid2); - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_ADD_ROUTE, &data); + rc = pcfg_ioctl(&pcfg); if (rc != 0) { - fprintf (stderr, "IOC_PORTAL_ADD_ROUTE failed: %s\n", strerror (errno)); + fprintf (stderr, "NAL_CMD_ADD_ROUTE failed: %s\n", strerror (errno)); return (-1); } @@ -1188,8 +1206,10 @@ jt_ptl_add_route (int argc, char **argv) int jt_ptl_del_route (int argc, char **argv) { - struct portal_ioctl_data data; + struct portals_cfg pcfg; ptl_nid_t nid; + ptl_nid_t nid1 = PTL_NID_ANY; + ptl_nid_t nid2 = PTL_NID_ANY; int rc; if (argc < 2) @@ -1198,19 +1218,111 @@ jt_ptl_del_route (int argc, char **argv) return (0); } + if (!g_nal_is_set()) + return (-1); + + if (ptl_parse_nid (&nid, argv[1]) != 0) + { + fprintf (stderr, "Can't parse gateway NID \"%s\"\n", argv[1]); + return (-1); + } + + if (argc >= 3 && + ptl_parse_nid (&nid1, argv[2]) != 0) + { + fprintf (stderr, "Can't parse target NID \"%s\"\n", argv[2]); + return (-1); + } + + if (argc < 4) { + nid2 = nid1; + } else { + if (ptl_parse_nid (&nid2, argv[3]) != 0) { + fprintf (stderr, "Can't parse target NID \"%s\"\n", argv[3]); + return (-1); + } + + if (nid1 > nid2) { + ptl_nid_t tmp = nid1; + + nid1 = nid2; + nid2 = tmp; + } + } + + PCFG_INIT(pcfg, NAL_CMD_DEL_ROUTE); + pcfg.pcfg_nal = ROUTER; + pcfg.pcfg_gw_nal = g_nal; + pcfg.pcfg_nid = nid; + pcfg.pcfg_nid2 = nid1; + pcfg.pcfg_nid3 = nid2; + + rc = pcfg_ioctl(&pcfg); + if (rc != 0) + { + fprintf (stderr, "NAL_CMD_DEL_ROUTE ("LPX64") failed: %s\n", nid, strerror (errno)); + return (-1); + } + + return (0); +} + +int +jt_ptl_notify_router (int argc, char **argv) +{ + struct portals_cfg pcfg; + int enable; + ptl_nid_t nid; + int rc; + struct timeval now; + time_t when; + + if (argc < 3) + { + fprintf (stderr, "usage: %s targetNID [