Whamcloud - gitweb
land portals part of b_hd_sec on HEAD.
[fs/lustre-release.git] / lnet / utils / wirecheck.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  */
4 #include <stdio.h>
5 #include <sys/types.h>
6 #include <sys/wait.h>
7 #include <portals/api-support.h>
8 #include <portals/lib-types.h>
9
10 #include <string.h>
11
12 #ifndef HAVE_STRNLEN
13 #define strnlen(s, i) strlen(s)
14 #endif
15
16 #define BLANK_LINE()                            \
17 do {                                            \
18         printf ("\n");                          \
19 } while (0)
20
21 #define COMMENT(c)                              \
22 do {                                            \
23         printf ("        /* "c" */\n");         \
24 } while (0)
25
26 #define STRINGIFY(a) #a
27
28 #define CHECK_DEFINE(a)                                         \
29 do {                                                            \
30         printf ("        LASSERT ("#a" == "STRINGIFY(a)");\n"); \
31 } while (0)
32
33 #define CHECK_VALUE(a)                                  \
34 do {                                                    \
35         printf ("        LASSERT ("#a" == %d);\n", a);  \
36 } while (0)
37
38 #define CHECK_MEMBER_OFFSET(s,m)                \
39 do {                                            \
40         CHECK_VALUE((int)offsetof(s, m));       \
41 } while (0)
42
43 #define CHECK_MEMBER_SIZEOF(s,m)                \
44 do {                                            \
45         CHECK_VALUE((int)sizeof(((s *)0)->m));  \
46 } while (0)
47
48 #define CHECK_MEMBER(s,m)                       \
49 do {                                            \
50         CHECK_MEMBER_OFFSET(s, m);              \
51         CHECK_MEMBER_SIZEOF(s, m);              \
52 } while (0)
53
54 #define CHECK_STRUCT(s)                         \
55 do {                                            \
56         BLANK_LINE ();                          \
57         COMMENT ("Checks for struct "#s);       \
58         CHECK_VALUE((int)sizeof(s));            \
59 } while (0)
60
61 void
62 check_ptl_handle_wire (void)
63 {
64         CHECK_STRUCT (ptl_handle_wire_t);
65         CHECK_MEMBER (ptl_handle_wire_t, wh_interface_cookie);
66         CHECK_MEMBER (ptl_handle_wire_t, wh_object_cookie);
67 }
68
69 void
70 check_ptl_magicversion (void)
71 {
72         CHECK_STRUCT (ptl_magicversion_t);
73         CHECK_MEMBER (ptl_magicversion_t, magic);
74         CHECK_MEMBER (ptl_magicversion_t, version_major);
75         CHECK_MEMBER (ptl_magicversion_t, version_minor);
76 }
77
78 void
79 check_ptl_hdr (void)
80 {
81         CHECK_STRUCT (ptl_hdr_t);
82         CHECK_MEMBER (ptl_hdr_t, dest_nid);
83         CHECK_MEMBER (ptl_hdr_t, src_nid);
84         CHECK_MEMBER (ptl_hdr_t, dest_pid);
85         CHECK_MEMBER (ptl_hdr_t, src_pid);
86         CHECK_MEMBER (ptl_hdr_t, type);
87         CHECK_MEMBER (ptl_hdr_t, payload_length);
88         CHECK_MEMBER (ptl_hdr_t, msg);
89
90         BLANK_LINE ();
91         COMMENT ("Ack");
92         CHECK_MEMBER (ptl_hdr_t, msg.ack.dst_wmd);
93         CHECK_MEMBER (ptl_hdr_t, msg.ack.match_bits);
94         CHECK_MEMBER (ptl_hdr_t, msg.ack.mlength);
95
96         BLANK_LINE ();
97         COMMENT ("Put");
98         CHECK_MEMBER (ptl_hdr_t, msg.put.ack_wmd);
99         CHECK_MEMBER (ptl_hdr_t, msg.put.match_bits);
100         CHECK_MEMBER (ptl_hdr_t, msg.put.hdr_data);
101         CHECK_MEMBER (ptl_hdr_t, msg.put.ptl_index);
102         CHECK_MEMBER (ptl_hdr_t, msg.put.offset);
103
104         BLANK_LINE ();
105         COMMENT ("Get");
106         CHECK_MEMBER (ptl_hdr_t, msg.get.return_wmd);
107         CHECK_MEMBER (ptl_hdr_t, msg.get.match_bits);
108         CHECK_MEMBER (ptl_hdr_t, msg.get.ptl_index);
109         CHECK_MEMBER (ptl_hdr_t, msg.get.src_offset);
110         CHECK_MEMBER (ptl_hdr_t, msg.get.sink_length);
111
112         BLANK_LINE ();
113         COMMENT ("Reply");
114         CHECK_MEMBER (ptl_hdr_t, msg.reply.dst_wmd);
115
116         BLANK_LINE ();
117         COMMENT ("Hello");
118         CHECK_MEMBER (ptl_hdr_t, msg.hello.incarnation);
119         CHECK_MEMBER (ptl_hdr_t, msg.hello.type);
120 }
121
122 void
123 system_string (char *cmdline, char *str, int len)
124 {
125         int   fds[2];
126         int   rc;
127         pid_t pid;
128
129         rc = pipe (fds);
130         if (rc != 0)
131                 abort ();
132
133         pid = fork ();
134         if (pid == 0) {
135                 /* child */
136                 int   fd = fileno(stdout);
137
138                 rc = dup2(fds[1], fd);
139                 if (rc != fd)
140                         abort();
141
142                 exit(system(cmdline));
143                 /* notreached */
144         } else if ((int)pid < 0) {
145                 abort();
146         } else {
147                 FILE *f = fdopen (fds[0], "r");
148
149                 if (f == NULL)
150                         abort();
151
152                 close(fds[1]);
153
154                 if (fgets(str, len, f) == NULL)
155                         abort();
156
157                 if (waitpid(pid, &rc, 0) != pid)
158                         abort();
159
160                 if (!WIFEXITED(rc) ||
161                     WEXITSTATUS(rc) != 0)
162                         abort();
163
164                 if (strnlen(str, len) == len)
165                         str[len - 1] = 0;
166
167                 if (str[strlen(str) - 1] == '\n')
168                         str[strlen(str) - 1] = 0;
169
170                 fclose(f);
171         }
172 }
173
174 int
175 main (int argc, char **argv)
176 {
177         char unameinfo[80];
178         char gccinfo[80];
179
180         system_string("uname -a", unameinfo, sizeof(unameinfo));
181         system_string("gcc -v 2>&1 | tail -1", gccinfo, sizeof(gccinfo));
182
183         printf ("void lib_assert_wire_constants (void)\n"
184                 "{\n"
185                 "        /* Wire protocol assertions generated by 'wirecheck'\n"
186                 "         * running on %s\n"
187                 "         * with %s */\n"
188                 "\n", unameinfo, gccinfo);
189
190         BLANK_LINE ();
191
192         COMMENT ("Constants...");
193         CHECK_DEFINE (PORTALS_PROTO_MAGIC);
194         CHECK_DEFINE (PORTALS_PROTO_VERSION_MAJOR);
195         CHECK_DEFINE (PORTALS_PROTO_VERSION_MINOR);
196
197         CHECK_VALUE (PTL_MSG_ACK);
198         CHECK_VALUE (PTL_MSG_PUT);
199         CHECK_VALUE (PTL_MSG_GET);
200         CHECK_VALUE (PTL_MSG_REPLY);
201         CHECK_VALUE (PTL_MSG_HELLO);
202
203         check_ptl_handle_wire ();
204         check_ptl_magicversion ();
205         check_ptl_hdr ();
206
207         printf ("}\n\n");
208
209         return (0);
210 }