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