#include <unistd.h>
#include <time.h>
#include <stdarg.h>
-#include <asm/byteorder.h>
+#include <endian.h>
#ifdef __CYGWIN__
unsigned int portal_debug;
unsigned int portal_printk;
unsigned int portal_stack;
-unsigned int portal_cerror;
+unsigned int portal_cerror = 1;
static unsigned int g_nal = 0;
{"elan", QSWNAL},
{"gm", GMNAL},
{"ib", IBNAL},
- {"scimac", SCIMACNAL},
{NULL, -1}
};
static cfg_record_cb_t g_record_cb;
+/* Convert a string boolean to an int; "enable" -> 1 */
+int ptl_parse_bool (int *b, char *str) {
+ if (!strcasecmp (str, "no") ||
+ !strcasecmp (str, "n") ||
+ !strcasecmp (str, "off") ||
+ !strcasecmp (str, "down") ||
+ !strcasecmp (str, "disable"))
+ {
+ *b = 0;
+ return (0);
+ }
+
+ if (!strcasecmp (str, "yes") ||
+ !strcasecmp (str, "y") ||
+ !strcasecmp (str, "on") ||
+ !strcasecmp (str, "up") ||
+ !strcasecmp (str, "enable"))
+ {
+ *b = 1;
+ return (0);
+ }
+
+ return (-1);
+}
+
+/* Convert human readable size string to and int; "1k" -> 1000 */
+int ptl_parse_size (int *sizep, char *str) {
+ int size;
+ char mod[32];
+
+ switch (sscanf (str, "%d%1[gGmMkK]", &size, mod)) {
+ default:
+ return (-1);
+
+ case 1:
+ *sizep = size;
+ return (0);
+
+ case 2:
+ switch (*mod) {
+ case 'g':
+ case 'G':
+ *sizep = size << 30;
+ return (0);
+
+ case 'm':
+ case 'M':
+ *sizep = size << 20;
+ return (0);
+
+ case 'k':
+ case 'K':
+ *sizep = size << 10;
+ return (0);
+
+ default:
+ *sizep = size;
+ return (0);
+ }
+ }
+}
+
int
ptl_set_cfg_record_cb(cfg_record_cb_t cb)
{
return (-1);
}
+__u64 ptl_nid2u64(ptl_nid_t nid)
+{
+ switch (sizeof (nid)) {
+ case 8:
+ return (nid);
+ case 4:
+ return ((__u32)nid);
+ default:
+ fprintf(stderr, "Unexpected sizeof(ptl_nid_t) == %u\n", sizeof(nid));
+ abort();
+ /* notreached */
+ return (-1);
+ }
+}
+
char *
ptl_nid2str (char *buffer, ptl_nid_t nid)
{
- __u32 addr = htonl((__u32)nid); /* back to NETWORK byte order */
- struct hostent *he = gethostbyaddr ((const char *)&addr, sizeof (addr), AF_INET);
+ __u64 nid64 = ptl_nid2u64(nid);
+ struct hostent *he;
+
+ if ((nid64 & ~((__u64)((__u32)-1))) != 0) {
+ /* top bits set */
+ he = NULL;
+ } else {
+ __u32 addr = htonl((__u32)nid); /* back to NETWORK byte order */
+
+ he = gethostbyaddr ((const char *)&addr, sizeof (addr), AF_INET);
+ }
if (he != NULL)
strcpy (buffer, he->h_name);
else
- sprintf (buffer, LPX64, nid);
+ sprintf (buffer, LPX64, nid64);
return (buffer);
}
char *nidstr;
struct portals_cfg pcfg;
ptl_nid_t mynid;
-
+
if (argc > 2) {
fprintf(stderr, "usage: %s [NID]\n", argv[0]);
fprintf(stderr, "NID defaults to the primary IP address of the machine.\n");
fprintf(stderr, "setting my NID failed: %s\n",
strerror(errno));
else
- printf("registered my nid "LPX64" (%s)\n", mynid, hostname);
+ printf("registered my nid "LPX64" (%s)\n",
+ ptl_nid2u64(mynid), hostname);
return 0;
}
if (argc > 1)
{
- if (Parser_size (&size, argv[1]) != 0 || size < 0)
+ if (ptl_parse_size (&size, argv[1]) != 0 || size < 0)
{
fprintf (stderr, "Can't parse size %s\n", argv[1]);
return (0);
if (argc > 1)
{
- if (Parser_size (&size, argv[1]) != 0 || size < 0)
+ if (ptl_parse_size (&size, argv[1]) != 0 || size < 0)
{
fprintf (stderr, "Can't parse size %s\n", argv[1]);
return (0);
if (argc > 1)
{
- if (Parser_bool (&enable, argv[1]) != 0)
+ if (ptl_parse_bool (&enable, argv[1]) != 0)
{
fprintf (stderr, "Can't parse boolean %s\n", argv[1]);
return (-1);
rc = pcfg_ioctl(&pcfg);
if (rc != 0)
{
- fprintf (stderr, "NAL_CMD_DEL_ROUTE ("LPX64") failed: %s\n", nid, strerror (errno));
+ fprintf (stderr, "NAL_CMD_DEL_ROUTE ("LPX64") failed: %s\n",
+ ptl_nid2u64(nid), strerror (errno));
return (-1);
}
return (-1);
}
- if (Parser_bool (&enable, argv[2]) != 0) {
+ if (ptl_parse_bool (&enable, argv[2]) != 0) {
fprintf (stderr, "Can't parse boolean %s\n", argv[2]);
return (-1);
}
if (rc != 0)
{
fprintf (stderr, "NAL_CMD_NOTIFY_ROUTER ("LPX64") failed: %s\n",
- nid, strerror (errno));
+ ptl_nid2u64(nid), strerror (errno));
return (-1);
}
static int
lwt_print(FILE *f, cycles_t t0, cycles_t tlast, double mhz, int cpu, lwt_event_t *e)
{
- char whenstr[32];
char *where = lwt_get_string(e->lwte_where);
if (where == NULL)
return (-1);
- sprintf(whenstr, LPD64, e->lwte_when - t0);
-
fprintf(f, "%#010lx %#010lx %#010lx %#010lx: %#010lx %1d %10.6f %10.2f %s\n",
e->lwte_p1, e->lwte_p2, e->lwte_p3, e->lwte_p4,
(long)e->lwte_task, cpu, (e->lwte_when - t0) / (mhz * 1000000.0),
cycles_t tnow;
struct timeval tvnow;
int printed_date = 0;
+ int nlines = 0;
FILE *f = stdout;
if (argc < 2 ||
rc = lwt_print(f, t0, tlast, mhz, cpu, next_event[cpu]);
if (rc != 0)
break;
+
+ if (++nlines % 10000 == 0 && f != stdout) {
+ /* show some activity... */
+ printf(".");
+ fflush (stdout);
+ }
}
tlast = next_event[cpu]->lwte_when;
next_event[cpu] = NULL;
}
- if (f != stdout)
+ if (f != stdout) {
+ printf("\n");
fclose(f);
+ }
free(events);
return (0);