Whamcloud - gitweb
LU-6245 libcfs: cleanup libcfs lock handling
[fs/lustre-release.git] / lnet / utils / wirecheck.c
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  *
30  * Copyright (c) 2014, Intel Corporation.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  */
36
37 #ifndef _GNU_SOURCE
38 #define _GNU_SOURCE
39 #endif
40
41 #include <stddef.h>
42 #include <stdio.h>
43 #include <stdlib.h>
44 #include <string.h>
45 #include <unistd.h>
46 #include <sys/types.h>
47 #include <sys/wait.h>
48 #include <lnet/types.h>
49
50 #ifndef HAVE_STRNLEN
51 #define strnlen(s, i) strlen(s)
52 #endif
53
54 #define BLANK_LINE()                            \
55 do {                                            \
56         printf ("\n");                          \
57 } while (0)
58
59 #define COMMENT(c)                              \
60 do {                                            \
61         printf ("        /* "c" */\n");         \
62 } while (0)
63
64 #define STRINGIFY(a) #a
65
66 #define CHECK_DEFINE(a)                                                 \
67 do {                                                                    \
68         printf ("        CLASSERT ("#a" == "STRINGIFY(a)");\n");        \
69 } while (0)
70
71 #define CHECK_VALUE(a)                                  \
72 do {                                                    \
73         printf ("        CLASSERT ("#a" == %d);\n", a); \
74 } while (0)
75
76 #define CHECK_MEMBER_OFFSET(s,m)                \
77 do {                                            \
78         CHECK_VALUE((int)offsetof(s, m));       \
79 } while (0)
80
81 #define CHECK_MEMBER_SIZEOF(s,m)                \
82 do {                                            \
83         CHECK_VALUE((int)sizeof(((s *)0)->m));  \
84 } while (0)
85
86 #define CHECK_MEMBER(s,m)                       \
87 do {                                            \
88         CHECK_MEMBER_OFFSET(s, m);              \
89         CHECK_MEMBER_SIZEOF(s, m);              \
90 } while (0)
91
92 #define CHECK_STRUCT(s)                         \
93 do {                                            \
94         BLANK_LINE ();                          \
95         COMMENT ("Checks for struct "#s);       \
96         CHECK_VALUE((int)sizeof(s));            \
97 } while (0)
98
99 void
100 check_lnet_handle_wire (void)
101 {
102         CHECK_STRUCT (lnet_handle_wire_t);
103         CHECK_MEMBER (lnet_handle_wire_t, wh_interface_cookie);
104         CHECK_MEMBER (lnet_handle_wire_t, wh_object_cookie);
105 }
106
107 void
108 check_lnet_magicversion (void)
109 {
110         CHECK_STRUCT (lnet_magicversion_t);
111         CHECK_MEMBER (lnet_magicversion_t, magic);
112         CHECK_MEMBER (lnet_magicversion_t, version_major);
113         CHECK_MEMBER (lnet_magicversion_t, version_minor);
114 }
115
116 void
117 check_lnet_hdr (void)
118 {
119         CHECK_STRUCT (lnet_hdr_t);
120         CHECK_MEMBER (lnet_hdr_t, dest_nid);
121         CHECK_MEMBER (lnet_hdr_t, src_nid);
122         CHECK_MEMBER (lnet_hdr_t, dest_pid);
123         CHECK_MEMBER (lnet_hdr_t, src_pid);
124         CHECK_MEMBER (lnet_hdr_t, type);
125         CHECK_MEMBER (lnet_hdr_t, payload_length);
126         CHECK_MEMBER (lnet_hdr_t, msg);
127
128         BLANK_LINE ();
129         COMMENT ("Ack");
130         CHECK_MEMBER (lnet_hdr_t, msg.ack.dst_wmd);
131         CHECK_MEMBER (lnet_hdr_t, msg.ack.match_bits);
132         CHECK_MEMBER (lnet_hdr_t, msg.ack.mlength);
133
134         BLANK_LINE ();
135         COMMENT ("Put");
136         CHECK_MEMBER (lnet_hdr_t, msg.put.ack_wmd);
137         CHECK_MEMBER (lnet_hdr_t, msg.put.match_bits);
138         CHECK_MEMBER (lnet_hdr_t, msg.put.hdr_data);
139         CHECK_MEMBER (lnet_hdr_t, msg.put.ptl_index);
140         CHECK_MEMBER (lnet_hdr_t, msg.put.offset);
141
142         BLANK_LINE ();
143         COMMENT ("Get");
144         CHECK_MEMBER (lnet_hdr_t, msg.get.return_wmd);
145         CHECK_MEMBER (lnet_hdr_t, msg.get.match_bits);
146         CHECK_MEMBER (lnet_hdr_t, msg.get.ptl_index);
147         CHECK_MEMBER (lnet_hdr_t, msg.get.src_offset);
148         CHECK_MEMBER (lnet_hdr_t, msg.get.sink_length);
149
150         BLANK_LINE ();
151         COMMENT ("Reply");
152         CHECK_MEMBER (lnet_hdr_t, msg.reply.dst_wmd);
153
154         BLANK_LINE ();
155         COMMENT ("Hello");
156         CHECK_MEMBER (lnet_hdr_t, msg.hello.incarnation);
157         CHECK_MEMBER (lnet_hdr_t, msg.hello.type);
158 }
159
160 void
161 system_string (char *cmdline, char *str, int len)
162 {
163         int   fds[2];
164         int   rc;
165         pid_t pid;
166
167         rc = pipe (fds);
168         if (rc != 0)
169                 abort ();
170
171         pid = fork ();
172         if (pid == 0) {
173                 /* child */
174                 int   fd = fileno(stdout);
175
176                 rc = dup2(fds[1], fd);
177                 if (rc != fd)
178                         abort();
179
180                 exit(system(cmdline));
181                 /* notreached */
182         } else if ((int)pid < 0) {
183                 abort();
184         } else {
185                 FILE *f = fdopen (fds[0], "r");
186
187                 if (f == NULL)
188                         abort();
189
190                 close(fds[1]);
191
192                 if (fgets(str, len, f) == NULL)
193                         abort();
194
195                 if (waitpid(pid, &rc, 0) != pid)
196                         abort();
197
198                 if (!WIFEXITED(rc) ||
199                     WEXITSTATUS(rc) != 0)
200                         abort();
201
202                 if (strnlen(str, len) == len)
203                         str[len - 1] = 0;
204
205                 if (str[strlen(str) - 1] == '\n')
206                         str[strlen(str) - 1] = 0;
207
208                 fclose(f);
209         }
210 }
211
212 int
213 main (int argc, char **argv)
214 {
215         char unameinfo[256];
216         char gccinfo[256];
217
218         system_string("uname -a", unameinfo, sizeof(unameinfo));
219         system_string("gcc -v 2>&1 | tail -1", gccinfo, sizeof(gccinfo));
220
221         printf ("void lnet_assert_wire_constants (void)\n"
222                 "{\n"
223                 "        /* Wire protocol assertions generated by 'wirecheck'\n"
224                 "         * running on %s\n"
225                 "         * with %s */\n"
226                 "\n", unameinfo, gccinfo);
227
228         BLANK_LINE ();
229
230         COMMENT ("Constants...");
231
232         CHECK_DEFINE (LNET_PROTO_RA_MAGIC);
233
234         CHECK_DEFINE (LNET_PROTO_TCP_MAGIC);
235         CHECK_DEFINE (LNET_PROTO_TCP_VERSION_MAJOR);
236         CHECK_DEFINE (LNET_PROTO_TCP_VERSION_MINOR);
237
238         CHECK_VALUE (LNET_MSG_ACK);
239         CHECK_VALUE (LNET_MSG_PUT);
240         CHECK_VALUE (LNET_MSG_GET);
241         CHECK_VALUE (LNET_MSG_REPLY);
242         CHECK_VALUE (LNET_MSG_HELLO);
243
244         check_lnet_handle_wire ();
245         check_lnet_magicversion ();
246         check_lnet_hdr ();
247
248         printf ("}\n\n");
249
250         return (0);
251 }