Whamcloud - gitweb
5a0e060a4ee6102f8cd6e5b07fb5a7e0e5f5ab6b
[fs/lustre-release.git] / lnet / klnds / viblnd / 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 <string.h>
6 #include <sys/types.h>
7 #include <sys/wait.h>
8
9 #include <lnet/api-support.h>
10
11 /* This ghastly hack to allows me to include lib-types.h It doesn't affect any
12  * assertions generated here (but fails-safe if it ever does) */
13 typedef struct {
14         int     counter;
15 } atomic_t;
16
17 #include <lnet/lib-types.h>
18
19 #define IBNAL_USE_FMR 1
20 #include "viblnd_wire.h"
21
22 #ifndef HAVE_STRNLEN
23 #define strnlen(s, i) strlen(s)
24 #endif
25
26 #define BLANK_LINE()                            \
27 do {                                            \
28         printf ("\n");                          \
29 } while (0)
30
31 #define COMMENT(c)                              \
32 do {                                            \
33         printf ("        /* "c" */\n");         \
34 } while (0)
35
36 #undef STRINGIFY
37 #define STRINGIFY(a) #a
38
39 #define CHECK_DEFINE(a)                                         \
40 do {                                                            \
41         printf ("        CLASSERT ("#a" == "STRINGIFY(a)");\n"); \
42 } while (0)
43
44 #define CHECK_VALUE(a)                                  \
45 do {                                                    \
46         printf ("        CLASSERT ("#a" == %d);\n", a);  \
47 } while (0)
48
49 #define CHECK_MEMBER_OFFSET(s,m)                \
50 do {                                            \
51         CHECK_VALUE((int)offsetof(s, m));       \
52 } while (0)
53
54 #define CHECK_MEMBER_SIZEOF(s,m)                \
55 do {                                            \
56         CHECK_VALUE((int)sizeof(((s *)0)->m));  \
57 } while (0)
58
59 #define CHECK_MEMBER(s,m)                       \
60 do {                                            \
61         CHECK_MEMBER_OFFSET(s, m);              \
62         CHECK_MEMBER_SIZEOF(s, m);              \
63 } while (0)
64
65 #define CHECK_STRUCT(s)                         \
66 do {                                            \
67         BLANK_LINE ();                          \
68         COMMENT ("Checks for struct "#s);       \
69         CHECK_VALUE((int)sizeof(s));            \
70 } while (0)
71
72 void
73 system_string (char *cmdline, char *str, int len)
74 {
75         int   fds[2];
76         int   rc;
77         pid_t pid;
78
79         rc = pipe (fds);
80         if (rc != 0)
81                 abort ();
82
83         pid = fork ();
84         if (pid == 0) {
85                 /* child */
86                 int   fd = fileno(stdout);
87
88                 rc = dup2(fds[1], fd);
89                 if (rc != fd)
90                         abort();
91
92                 exit(system(cmdline));
93                 /* notreached */
94         } else if ((int)pid < 0) {
95                 abort();
96         } else {
97                 FILE *f = fdopen (fds[0], "r");
98
99                 if (f == NULL)
100                         abort();
101
102                 close(fds[1]);
103
104                 if (fgets(str, len, f) == NULL)
105                         abort();
106
107                 if (waitpid(pid, &rc, 0) != pid)
108                         abort();
109
110                 if (!WIFEXITED(rc) ||
111                     WEXITSTATUS(rc) != 0)
112                         abort();
113
114                 if (strnlen(str, len) == len)
115                         str[len - 1] = 0;
116
117                 if (str[strlen(str) - 1] == '\n')
118                         str[strlen(str) - 1] = 0;
119
120                 fclose(f);
121         }
122 }
123
124 int
125 main (int argc, char **argv)
126 {
127         char unameinfo[80];
128         char gccinfo[80];
129
130         system_string("uname -a", unameinfo, sizeof(unameinfo));
131         system_string("gcc -v 2>&1 | tail -1", gccinfo, sizeof(gccinfo));
132
133         printf ("void vibnal_assert_wire_constants (void)\n"
134                 "{\n"
135                 "        /* Wire protocol assertions generated by 'wirecheck'\n"
136                 "         * running on %s\n"
137                 "         * with %s */\n"
138                 "\n", unameinfo, gccinfo);
139
140         BLANK_LINE ();
141         
142         COMMENT ("Constants...");
143         CHECK_DEFINE (IBNAL_MSG_MAGIC);
144         CHECK_DEFINE (IBNAL_MSG_VERSION);
145
146         CHECK_DEFINE (IBNAL_MSG_CONNREQ);
147         CHECK_DEFINE (IBNAL_MSG_CONNACK);
148         CHECK_DEFINE (IBNAL_MSG_NOOP);
149         CHECK_DEFINE (IBNAL_MSG_IMMEDIATE);
150         CHECK_DEFINE (IBNAL_MSG_PUT_REQ);
151         CHECK_DEFINE (IBNAL_MSG_PUT_NAK);
152         CHECK_DEFINE (IBNAL_MSG_PUT_ACK);
153         CHECK_DEFINE (IBNAL_MSG_PUT_DONE);
154         CHECK_DEFINE (IBNAL_MSG_GET_REQ);
155         CHECK_DEFINE (IBNAL_MSG_GET_DONE);
156
157         CHECK_DEFINE (IBNAL_REJECT_CONN_RACE);
158         CHECK_DEFINE (IBNAL_REJECT_NO_RESOURCES);
159         CHECK_DEFINE (IBNAL_REJECT_FATAL);
160
161         CHECK_STRUCT (kib_connparams_t);
162         CHECK_MEMBER (kib_connparams_t, ibcp_queue_depth);
163         CHECK_MEMBER (kib_connparams_t, ibcp_max_msg_size);
164         CHECK_MEMBER (kib_connparams_t, ibcp_max_frags);
165
166         CHECK_STRUCT (kib_immediate_msg_t);
167         CHECK_MEMBER (kib_immediate_msg_t, ibim_hdr);
168         CHECK_MEMBER (kib_immediate_msg_t, ibim_payload[13]);
169
170         CHECK_DEFINE (IBNAL_USE_FMR);
171 #if IBNAL_USE_FMR
172         CHECK_STRUCT (kib_rdma_desc_t);
173         CHECK_MEMBER (kib_rdma_desc_t, rd_addr);
174         CHECK_MEMBER (kib_rdma_desc_t, rd_nob);
175         CHECK_MEMBER (kib_rdma_desc_t, rd_key);
176 #else
177         CHECK_STRUCT (kib_rdma_frag_t);
178         CHECK_MEMBER (kib_rdma_frag_t, rf_nob);
179         CHECK_MEMBER (kib_rdma_frag_t, rf_addr_lo);
180         CHECK_MEMBER (kib_rdma_frag_t, rf_addr_hi);
181
182         CHECK_STRUCT (kib_rdma_desc_t);
183         CHECK_MEMBER (kib_rdma_desc_t, rd_key);
184         CHECK_MEMBER (kib_rdma_desc_t, rd_nfrag);
185         CHECK_MEMBER (kib_rdma_desc_t, rd_frags[13]);
186 #endif
187         CHECK_STRUCT (kib_putreq_msg_t);
188         CHECK_MEMBER (kib_putreq_msg_t, ibprm_hdr);
189         CHECK_MEMBER (kib_putreq_msg_t, ibprm_cookie);
190
191         CHECK_STRUCT (kib_putack_msg_t);
192         CHECK_MEMBER (kib_putack_msg_t, ibpam_src_cookie);
193         CHECK_MEMBER (kib_putack_msg_t, ibpam_dst_cookie);
194         CHECK_MEMBER (kib_putack_msg_t, ibpam_rd);
195
196         CHECK_STRUCT (kib_get_msg_t);
197         CHECK_MEMBER (kib_get_msg_t, ibgm_hdr);
198         CHECK_MEMBER (kib_get_msg_t, ibgm_cookie);
199         CHECK_MEMBER (kib_get_msg_t, ibgm_rd);
200
201         CHECK_STRUCT (kib_completion_msg_t);
202         CHECK_MEMBER (kib_completion_msg_t, ibcm_cookie);
203         CHECK_MEMBER (kib_completion_msg_t, ibcm_status);
204
205         CHECK_STRUCT (kib_msg_t);
206         CHECK_MEMBER (kib_msg_t, ibm_magic);
207         CHECK_MEMBER (kib_msg_t, ibm_version);
208         CHECK_MEMBER (kib_msg_t, ibm_type);
209         CHECK_MEMBER (kib_msg_t, ibm_credits);
210         CHECK_MEMBER (kib_msg_t, ibm_nob);
211         CHECK_MEMBER (kib_msg_t, ibm_cksum);
212         CHECK_MEMBER (kib_msg_t, ibm_srcnid);
213         CHECK_MEMBER (kib_msg_t, ibm_srcstamp);
214         CHECK_MEMBER (kib_msg_t, ibm_dstnid);
215         CHECK_MEMBER (kib_msg_t, ibm_dststamp);
216         CHECK_MEMBER (kib_msg_t, ibm_seq);
217         CHECK_MEMBER (kib_msg_t, ibm_u.connparams);
218         CHECK_MEMBER (kib_msg_t, ibm_u.immediate);
219         CHECK_MEMBER (kib_msg_t, ibm_u.putreq);
220         CHECK_MEMBER (kib_msg_t, ibm_u.putack);
221         CHECK_MEMBER (kib_msg_t, ibm_u.get);
222         CHECK_MEMBER (kib_msg_t, ibm_u.completion);
223
224         printf ("}\n\n");
225
226         return (0);
227 }