X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lnet%2Futils%2Fwirecheck.c;h=d37a734c4238182809c22bd89d6657a76bc1fe11;hp=6a4377b300c91510be79ad1ec6abd08c2284e946;hb=65e067d5d90270d4237a7271008561a4b432b94d;hpb=96ec6856f91f7f9031cfce4273c714d72cfe59ae diff --git a/lnet/utils/wirecheck.c b/lnet/utils/wirecheck.c index 6a4377b..d37a734 100644 --- a/lnet/utils/wirecheck.c +++ b/lnet/utils/wirecheck.c @@ -1,141 +1,252 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: +/* + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END */ +/* + * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. + * + * Copyright (c) 2014, Intel Corporation. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + #include -#include -#include -#include +#include +#include +#include +#include +#include +#include + +#include -#define BLANK_LINE() \ -do { \ - printf ("\n"); \ +#ifndef HAVE_STRNLEN +#define strnlen(s, i) strlen(s) +#endif + +#define BLANK_LINE() \ +do { \ + printf ("\n"); \ } while (0) -#define COMMENT(c) \ -do { \ - printf (" /* "c" */\n"); \ +#define COMMENT(c) \ +do { \ + printf (" /* "c" */\n"); \ } while (0) #define STRINGIFY(a) #a -#define CHECK_DEFINE(a) \ -do { \ - printf (" LASSERT ("#a" == "STRINGIFY(a)");\n"); \ +#define CHECK_DEFINE(a) \ +do { \ + printf (" CLASSERT ("#a" == "STRINGIFY(a)");\n"); \ } while (0) -#define CHECK_VALUE(a) \ -do { \ - printf (" LASSERT ("#a" == %d);\n", a); \ +#define CHECK_VALUE(a) \ +do { \ + printf (" CLASSERT ("#a" == %d);\n", a); \ } while (0) -#define CHECK_MEMBER_OFFSET(s,m) \ -do { \ - CHECK_VALUE(offsetof(s, m)); \ +#define CHECK_MEMBER_OFFSET(s,m) \ +do { \ + CHECK_VALUE((int)offsetof(s, m)); \ } while (0) -#define CHECK_MEMBER_SIZEOF(s,m) \ -do { \ - CHECK_VALUE((int)sizeof(((s *)0)->m)); \ +#define CHECK_MEMBER_SIZEOF(s,m) \ +do { \ + CHECK_VALUE((int)sizeof(((s *)0)->m)); \ } while (0) -#define CHECK_MEMBER(s,m) \ -do { \ - CHECK_MEMBER_OFFSET(s, m); \ - CHECK_MEMBER_SIZEOF(s, m); \ +#define CHECK_MEMBER(s,m) \ +do { \ + CHECK_MEMBER_OFFSET(s, m); \ + CHECK_MEMBER_SIZEOF(s, m); \ } while (0) #define CHECK_STRUCT(s) \ do { \ BLANK_LINE (); \ COMMENT ("Checks for struct "#s); \ - CHECK_VALUE((int)sizeof(s)); \ + CHECK_VALUE((int)sizeof(s)); \ } while (0) void -check_ptl_handle_wire (void) +check_lnet_handle_wire (void) { - CHECK_STRUCT (ptl_handle_wire_t); - CHECK_MEMBER (ptl_handle_wire_t, wh_interface_cookie); - CHECK_MEMBER (ptl_handle_wire_t, wh_object_cookie); + CHECK_STRUCT (lnet_handle_wire_t); + CHECK_MEMBER (lnet_handle_wire_t, wh_interface_cookie); + CHECK_MEMBER (lnet_handle_wire_t, wh_object_cookie); } void -check_ptl_magicversion (void) +check_lnet_magicversion (void) { - CHECK_STRUCT (ptl_magicversion_t); - CHECK_MEMBER (ptl_magicversion_t, magic); - CHECK_MEMBER (ptl_magicversion_t, version_major); - CHECK_MEMBER (ptl_magicversion_t, version_minor); + CHECK_STRUCT (lnet_magicversion_t); + CHECK_MEMBER (lnet_magicversion_t, magic); + CHECK_MEMBER (lnet_magicversion_t, version_major); + CHECK_MEMBER (lnet_magicversion_t, version_minor); } void -check_ptl_hdr (void) +check_lnet_hdr (void) { - CHECK_STRUCT (ptl_hdr_t); - CHECK_MEMBER (ptl_hdr_t, dest_nid); - CHECK_MEMBER (ptl_hdr_t, src_nid); - CHECK_MEMBER (ptl_hdr_t, dest_pid); - CHECK_MEMBER (ptl_hdr_t, src_pid); - CHECK_MEMBER (ptl_hdr_t, type); + CHECK_STRUCT (lnet_hdr_t); + CHECK_MEMBER (lnet_hdr_t, dest_nid); + CHECK_MEMBER (lnet_hdr_t, src_nid); + CHECK_MEMBER (lnet_hdr_t, dest_pid); + CHECK_MEMBER (lnet_hdr_t, src_pid); + CHECK_MEMBER (lnet_hdr_t, type); + CHECK_MEMBER (lnet_hdr_t, payload_length); + CHECK_MEMBER (lnet_hdr_t, msg); BLANK_LINE (); COMMENT ("Ack"); - CHECK_MEMBER (ptl_hdr_t, msg.ack.mlength); - CHECK_MEMBER (ptl_hdr_t, msg.ack.dst_wmd); - CHECK_MEMBER (ptl_hdr_t, msg.ack.match_bits); - CHECK_MEMBER (ptl_hdr_t, msg.ack.length); + CHECK_MEMBER (lnet_hdr_t, msg.ack.dst_wmd); + CHECK_MEMBER (lnet_hdr_t, msg.ack.match_bits); + CHECK_MEMBER (lnet_hdr_t, msg.ack.mlength); BLANK_LINE (); COMMENT ("Put"); - CHECK_MEMBER (ptl_hdr_t, msg.put.ptl_index); - CHECK_MEMBER (ptl_hdr_t, msg.put.ack_wmd); - CHECK_MEMBER (ptl_hdr_t, msg.put.match_bits); - CHECK_MEMBER (ptl_hdr_t, msg.put.length); - CHECK_MEMBER (ptl_hdr_t, msg.put.offset); - CHECK_MEMBER (ptl_hdr_t, msg.put.hdr_data); + CHECK_MEMBER (lnet_hdr_t, msg.put.ack_wmd); + CHECK_MEMBER (lnet_hdr_t, msg.put.match_bits); + CHECK_MEMBER (lnet_hdr_t, msg.put.hdr_data); + CHECK_MEMBER (lnet_hdr_t, msg.put.ptl_index); + CHECK_MEMBER (lnet_hdr_t, msg.put.offset); BLANK_LINE (); COMMENT ("Get"); - CHECK_MEMBER (ptl_hdr_t, msg.get.ptl_index); - CHECK_MEMBER (ptl_hdr_t, msg.get.return_wmd); - CHECK_MEMBER (ptl_hdr_t, msg.get.match_bits); - CHECK_MEMBER (ptl_hdr_t, msg.get.length); - CHECK_MEMBER (ptl_hdr_t, msg.get.src_offset); - CHECK_MEMBER (ptl_hdr_t, msg.get.return_offset); - CHECK_MEMBER (ptl_hdr_t, msg.get.sink_length); + CHECK_MEMBER (lnet_hdr_t, msg.get.return_wmd); + CHECK_MEMBER (lnet_hdr_t, msg.get.match_bits); + CHECK_MEMBER (lnet_hdr_t, msg.get.ptl_index); + CHECK_MEMBER (lnet_hdr_t, msg.get.src_offset); + CHECK_MEMBER (lnet_hdr_t, msg.get.sink_length); BLANK_LINE (); COMMENT ("Reply"); - CHECK_MEMBER (ptl_hdr_t, msg.reply.dst_wmd); - CHECK_MEMBER (ptl_hdr_t, msg.reply.dst_offset); - CHECK_MEMBER (ptl_hdr_t, msg.reply.length); + CHECK_MEMBER (lnet_hdr_t, msg.reply.dst_wmd); + + BLANK_LINE (); + COMMENT ("Hello"); + CHECK_MEMBER (lnet_hdr_t, msg.hello.incarnation); + CHECK_MEMBER (lnet_hdr_t, msg.hello.type); +} + +void +system_string (char *cmdline, char *str, int len) +{ + int fds[2]; + int rc; + pid_t pid; + + rc = pipe (fds); + if (rc != 0) + abort (); + + pid = fork (); + if (pid == 0) { + /* child */ + int fd = fileno(stdout); + + rc = dup2(fds[1], fd); + if (rc != fd) + abort(); + + exit(system(cmdline)); + /* notreached */ + } else if ((int)pid < 0) { + abort(); + } else { + FILE *f = fdopen (fds[0], "r"); + + if (f == NULL) + abort(); + + close(fds[1]); + + if (fgets(str, len, f) == NULL) + abort(); + + if (waitpid(pid, &rc, 0) != pid) + abort(); + + if (!WIFEXITED(rc) || + WEXITSTATUS(rc) != 0) + abort(); + + if (strnlen(str, len) == len) + str[len - 1] = 0; + + if (str[strlen(str) - 1] == '\n') + str[strlen(str) - 1] = 0; + + fclose(f); + } } int main (int argc, char **argv) { - printf ("void lib_assert_wire_constants (void)\n" - "{\n"); - - COMMENT ("Wire protocol assertions generated by 'wirecheck'"); - BLANK_LINE (); - - COMMENT ("Constants..."); - CHECK_DEFINE (PORTALS_PROTO_MAGIC); - CHECK_DEFINE (PORTALS_PROTO_VERSION_MAJOR); - CHECK_DEFINE (PORTALS_PROTO_VERSION_MINOR); - - CHECK_VALUE (PTL_MSG_ACK); - CHECK_VALUE (PTL_MSG_PUT); - CHECK_VALUE (PTL_MSG_GET); - CHECK_VALUE (PTL_MSG_REPLY); - CHECK_VALUE (PTL_MSG_HELLO); - - check_ptl_handle_wire (); - check_ptl_magicversion (); - check_ptl_hdr (); - - printf ("}\n\n"); - - return (0); + char unameinfo[256]; + char gccinfo[256]; + + system_string("uname -a", unameinfo, sizeof(unameinfo)); + system_string("gcc -v 2>&1 | tail -1", gccinfo, sizeof(gccinfo)); + + printf ("void lnet_assert_wire_constants (void)\n" + "{\n" + " /* Wire protocol assertions generated by 'wirecheck'\n" + " * running on %s\n" + " * with %s */\n" + "\n", unameinfo, gccinfo); + + BLANK_LINE (); + + COMMENT ("Constants..."); + + CHECK_DEFINE (LNET_PROTO_RA_MAGIC); + + CHECK_DEFINE (LNET_PROTO_TCP_MAGIC); + CHECK_DEFINE (LNET_PROTO_TCP_VERSION_MAJOR); + CHECK_DEFINE (LNET_PROTO_TCP_VERSION_MINOR); + + CHECK_VALUE (LNET_MSG_ACK); + CHECK_VALUE (LNET_MSG_PUT); + CHECK_VALUE (LNET_MSG_GET); + CHECK_VALUE (LNET_MSG_REPLY); + CHECK_VALUE (LNET_MSG_HELLO); + + check_lnet_handle_wire (); + check_lnet_magicversion (); + check_lnet_hdr (); + + printf ("}\n\n"); + + return (0); }