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