Whamcloud - gitweb
b=1987
[fs/lustre-release.git] / lnet / utils / portals.c
index dbe264b..d874486 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 #include <fcntl.h>
-#include "ioctl.h"
 #include <sys/ioctl.h>
 #include <errno.h>
 #include <unistd.h>
 #include <time.h>
 #include <stdarg.h>
+#ifdef HAVE_ENDIAN_H
 #include <endian.h>
+#endif
 #if CRAY_PORTALS
 #ifdef REDSTORM
 #define __QK__
 #include <portals/ipmap.h>
 #endif
 
-#ifdef __CYGWIN__
-
-#include <netinet/in.h>
-
-#endif /* __CYGWIN__ */
+#include <libcfs/portals_utils.h>
 #include <portals/api-support.h>
 #include <portals/ptlctl.h>
-#include <portals/list.h>
 #include <portals/lib-types.h>
 #include <portals/socknal.h>
 #include "parser.h"
@@ -238,8 +233,8 @@ ptl_gethostbyname(char * hname) {
                                 hname);
                         break;
                 default:
-                        fprintf(stderr, "gethostbyname error: %s\n",
-                                strerror(errno));
+                        fprintf(stderr, "gethostbyname error for %s: %s\n",
+                                hname, strerror(h_errno));
                         break;
                 }
                 return NULL;
@@ -317,8 +312,7 @@ ptl_parse_ipaddr (__u32 *ipaddrp, char *str)
         struct hostent *he;
 #endif
 
-        if (!strcmp (str, "_all_")) 
-        {
+        if (!strcmp (str, "_all_")) {
                 *ipaddrp = 0;
                 return (0);
         }
@@ -326,11 +320,10 @@ ptl_parse_ipaddr (__u32 *ipaddrp, char *str)
         if (ptl_parse_ipquad(ipaddrp, str) == 0)
                 return (0);
 
-#if HAVE_GETHOSTBYNAME        
+#ifdef HAVE_GETHOSTBYNAME
         if ((('a' <= str[0] && str[0] <= 'z') ||
              ('A' <= str[0] && str[0] <= 'Z')) &&
-             (he = ptl_gethostbyname (str)) != NULL)
-        {
+             (he = ptl_gethostbyname (str)) != NULL) {
                 __u32 addr = *(__u32 *)he->h_addr;
 
                 *ipaddrp = ntohl(addr);         /* HOST byte order */
@@ -371,11 +364,6 @@ ptl_parse_nid (ptl_nid_t *nidp, char *str)
         char               *end;
         unsigned long long  ullval;
         
-        if (!strcmp (str, "_all_")) {
-                *nidp = PTL_NID_ANY;
-                return (0);
-        }
-
         if (ptl_parse_ipaddr (&ipaddr, str) == 0) {
 #if !CRAY_PORTALS
                 *nidp = (ptl_nid_t)ipaddr;
@@ -386,8 +374,8 @@ ptl_parse_nid (ptl_nid_t *nidp, char *str)
         }
 
         ullval = strtoull(str, &end, 0);
-        if (*end == 0) {
-                /* parsed whole string */
+        if (end != str && *end == 0) {
+                /* parsed whole non-empty string */
                 *nidp = (ptl_nid_t)ullval;
                 return (0);
         }
@@ -395,6 +383,17 @@ ptl_parse_nid (ptl_nid_t *nidp, char *str)
         return (-1);
 }
 
+int
+ptl_parse_anynid (ptl_nid_t *nidp, char *str)
+{
+        if (!strcmp (str, "_all_")) {
+                *nidp = PTL_NID_ANY;
+                return 0;
+        }
+
+        return ptl_parse_nid(nidp, str);
+}
+
 __u64 ptl_nid2u64(ptl_nid_t nid)
 {
         switch (sizeof (nid)) {
@@ -423,7 +422,7 @@ ptl_nid2str (char *buffer, ptl_nid_t nid)
         if (nid & 0xff000000) {
                 __u32 addr = htonl((__u32)nid); /* back to NETWORK byte order */
 
-                he = gethostbyaddr ((const char *)&addr, sizeof (addr), AF_INET);
+                he = gethostbyaddr((const char *)&addr, sizeof(addr), AF_INET);
         }
 
         if (he != NULL)
@@ -695,7 +694,7 @@ jt_ptl_print_peers (int argc, char **argv)
                                 ptl_ipaddr_2_str (pcfg.pcfg_size, buffer[0], 1),
                                 ptl_ipaddr_2_str (pcfg.pcfg_id, buffer[1], 1),
                                 pcfg.pcfg_misc, pcfg.pcfg_count);
-                else if (g_nal_is_compatible(NULL, RANAL, 0))
+                else if (g_nal_is_compatible(NULL, RANAL, OPENIBNAL, VIBNAL, 0))
                         printf (LPX64"[%d]@%s:%d\n",
                                 pcfg.pcfg_nid, pcfg.pcfg_wait,
                                 ptl_ipaddr_2_str (pcfg.pcfg_id, buffer[1], 1),
@@ -723,14 +722,20 @@ jt_ptl_add_peer (int argc, char **argv)
                                   OPENIBNAL, IIBNAL, VIBNAL, 0))
                 return -1;
 
-        if (g_nal_is_compatible(NULL, SOCKNAL, RANAL, 0)) {
+        if (g_nal_is_compatible(NULL, SOCKNAL, OPENIBNAL, RANAL, 0)) {
                 if (argc != 4) {
-                        fprintf (stderr, "usage(tcp,ra): %s nid ipaddr port\n", 
+                        fprintf (stderr, "usage(tcp,openib,ra): %s nid ipaddr port\n", 
+                                 argv[0]);
+                        return 0;
+                }
+        } else if (g_nal_is_compatible(NULL, VIBNAL, 0)) {
+                if (argc != 3) {
+                        fprintf (stderr, "usage(vib): %s nid ipaddr\n", 
                                  argv[0]);
                         return 0;
                 }
         } else if (argc != 2) {
-                fprintf (stderr, "usage(openib,iib,vib): %s nid\n", argv[0]);
+                fprintf (stderr, "usage(iib): %s nid\n", argv[0]);
                 return 0;
         }
 
@@ -740,16 +745,16 @@ jt_ptl_add_peer (int argc, char **argv)
                 return -1;
         }
 
-        if (g_nal_is_compatible (NULL, SOCKNAL, RANAL, 0)) {
-                if (ptl_parse_ipaddr (&ip, argv[2]) != 0) {
-                        fprintf (stderr, "Can't parse ip addr: %s\n", argv[2]);
-                        return -1;
-                }
+        if (g_nal_is_compatible (NULL, SOCKNAL, OPENIBNAL, VIBNAL, RANAL, 0) &&
+            ptl_parse_ipaddr (&ip, argv[2]) != 0) {
+                fprintf (stderr, "Can't parse ip addr: %s\n", argv[2]);
+                return -1;
+        }
 
-                if (ptl_parse_port (&port, argv[3]) != 0) {
-                        fprintf (stderr, "Can't parse port: %s\n", argv[3]);
-                        return -1;
-                }
+        if (g_nal_is_compatible (NULL, SOCKNAL, OPENIBNAL, RANAL, 0) &&
+            ptl_parse_port (&port, argv[3]) != 0) {
+                fprintf (stderr, "Can't parse port: %s\n", argv[3]);
+                return -1;
         }
 
         PCFG_INIT(pcfg, NAL_CMD_ADD_PEER);
@@ -793,7 +798,7 @@ jt_ptl_del_peer (int argc, char **argv)
         }
                 
         if (argc > 1 &&
-            ptl_parse_nid (&nid, argv[1]) != 0) {
+            ptl_parse_anynid (&nid, argv[1]) != 0) {
                 fprintf (stderr, "Can't parse nid: %s\n", argv[1]);
                 return -1;
         }
@@ -1042,7 +1047,7 @@ int jt_ptl_disconnect(int argc, char **argv)
                 return 0;
 
         if (argc >= 2 &&
-            ptl_parse_nid (&nid, argv[1]) != 0) {
+            ptl_parse_anynid (&nid, argv[1]) != 0) {
                 fprintf (stderr, "Can't parse nid %s\n", argv[1]);
                 return -1;
         }
@@ -1084,7 +1089,7 @@ int jt_ptl_push_connection (int argc, char **argv)
                 return -1;
         
         if (argc > 1 &&
-            ptl_parse_nid (&nid, argv[1]) != 0) {
+            ptl_parse_anynid (&nid, argv[1]) != 0) {
                 fprintf(stderr, "Can't parse nid: %s\n", argv[1]);
                 return -1;
         }
@@ -1291,7 +1296,7 @@ jt_ptl_fail_nid (int argc, char **argv)
 
         if (!strcmp (argv[1], "_all_"))
                 nid = PTL_NID_ANY;
-        else if (ptl_parse_nid (&nid, argv[1]) != 0)
+        else if (ptl_parse_anynid (&nid, argv[1]) != 0)
         {
                 fprintf (stderr, "Can't parse nid \"%s\"\n", argv[1]);
                 return (-1);
@@ -1320,6 +1325,46 @@ jt_ptl_fail_nid (int argc, char **argv)
 }
 
 int
+jt_ptl_loopback (int argc, char **argv)
+{
+        int                      rc;
+        ptl_nid_t                nid;
+        unsigned int             threshold;
+        int                      set;
+        int                      enable;
+        struct portal_ioctl_data data;
+
+        if (argc > 2)
+        {
+                fprintf (stderr, "usage: %s [on|off]\n", argv[0]);
+                return (0);
+        }
+        
+        if (!g_nal_is_set())
+                return (-1);
+
+        set = argc > 1;
+        if (set && ptl_parse_bool (&enable, argv[1]) != 0) {
+                fprintf (stderr, "Can't parse boolean %s\n", argv[1]);
+                return (-1);
+        }
+
+        PORTAL_IOC_INIT (data);
+        data.ioc_nal = g_nal;
+        data.ioc_flags = enable;
+        data.ioc_misc = set;
+        
+        rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_LOOPBACK, &data);
+        if (rc < 0)
+                fprintf (stderr, "IOC_PORTAL_FAIL_NID failed: %s\n",
+                         strerror (errno));
+        else
+                printf ("loopback %s\n", data.ioc_flags ? "enabled" : "disabled");
+        
+        return (0);
+}
+
+int
 jt_ptl_add_route (int argc, char **argv)
 {
         struct portals_cfg       pcfg;