Whamcloud - gitweb
Land b_smallfix onto HEAD (20040512_1806)
[fs/lustre-release.git] / lustre / liblustre / tests / echo_test.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 <netinet/in.h>
6 #include <sys/socket.h>
7 #include <arpa/inet.h>
8
9 #include <portals/ptlctl.h>     /* needed for parse_dump */
10
11
12 #include <liblustre.h>
13 #include <linux/obd.h>
14 #include <linux/obd_class.h>
15 #include <procbridge.h>
16
17 #define LIBLUSTRE_TEST 1
18 #include "../utils/lctl.c"
19
20 struct ldlm_namespace;
21 struct ldlm_res_id;
22 struct obd_import;
23
24 unsigned int portal_subsystem_debug = ~0 - (S_PORTALS | S_QSWNAL | S_SOCKNAL |
25                                             S_GMNAL | S_IBNAL);
26
27 void get_random_bytes(void *ptr, int size)
28 {
29         char *p = ptr;
30
31         if (size < 1)
32                 return;
33
34         while(size--)
35                 *p++ = rand();
36 }
37
38 void *inter_module_get(char *arg)
39 {
40         if (!strcmp(arg, "tcpnal_ni"))
41                 return &tcpnal_ni;
42         else if (!strcmp(arg, "ldlm_cli_cancel_unused"))
43                 return ldlm_cli_cancel_unused;
44         else if (!strcmp(arg, "ldlm_namespace_cleanup"))
45                 return ldlm_namespace_cleanup;
46         else if (!strcmp(arg, "ldlm_replay_locks"))
47                 return ldlm_replay_locks;
48         else
49                 return NULL;
50 }
51
52 /* XXX move to proper place */
53 char *portals_nid2str(int nal, ptl_nid_t nid, char *str)
54 {
55         switch(nal){
56         case TCPNAL:
57                 /* userspace NAL */
58         case SOCKNAL:
59                 snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u.%u.%u.%u",
60                          (__u32)(nid >> 32), HIPQUAD(nid));
61                 break;
62         case QSWNAL:
63         case GMNAL:
64         case IBNAL:
65                 snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u",
66                          (__u32)(nid >> 32), (__u32)nid);
67                 break;
68         default:
69                 snprintf(str, PTL_NALFMT_SIZE - 1, "?%d? %llx",
70                          nal, (long long)nid);
71                 break;
72         }
73         return str;
74 }
75
76 ptl_handle_ni_t         tcpnal_ni;
77
78 struct pingcli_args {
79         ptl_nid_t mynid;
80         ptl_nid_t nid;
81         ptl_pid_t port;
82         int count;
83         int size;
84 };
85
86 struct task_struct *current;
87
88 int
89 libcfs_nal_cmd(struct portals_cfg *pcfg)
90 {
91         CERROR("empty function!!!\n");
92         return 0;
93 }
94
95 int in_group_p(gid_t gid)
96 {
97         return 0;
98 }
99
100 int init_current(int argc, char **argv)
101
102         current = malloc(sizeof(*current));
103         strncpy(current->comm, argv[0], sizeof(current->comm));
104         current->pid = getpid();
105         return 0;
106 }
107
108 ptl_nid_t tcpnal_mynid;
109
110 int init_lib_portals()
111 {
112         int max_interfaces;
113         int rc;
114
115         rc = PtlInit(&max_interfaces);
116         if (rc != 0) {
117                 CERROR("ksocknal: PtlNIInit failed: error %d\n", rc);
118                 RETURN (rc);
119         }
120         return rc;
121 }
122
123 extern int class_handle_ioctl(unsigned int cmd, unsigned long arg);
124
125 int liblustre_ioctl(int dev_id, unsigned int opc, void *ptr)
126 {
127         int   rc = -EINVAL;
128         
129         switch (dev_id) {
130         default:
131                 fprintf(stderr, "Unexpected device id %d\n", dev_id);
132                 abort();
133                 break;
134                 
135         case OBD_DEV_ID:
136                 rc = class_handle_ioctl(opc, (unsigned long)ptr);
137                 break;
138         }
139
140         return rc;
141 }
142
143 static void generate_random_uuid(unsigned char uuid_out[16])
144 {
145         int *arr = (int*)uuid_out;
146         int i;
147
148         for (i = 0; i < sizeof(uuid_out)/sizeof(int); i++)
149                 arr[i] = rand();
150 }
151
152 static char *echo_server_nid = NULL;
153 static char *echo_server_ostname = "obd1";
154 static char *osc_dev_name = "OSC_DEV_NAME";
155 static char *echo_dev_name = "ECHO_CLIENT_DEV_NAME";
156
157 static int connect_echo_client(void)
158 {
159         struct lustre_cfg lcfg;
160         ptl_nid_t nid;
161         char *peer = "ECHO_PEER_NID";
162         class_uuid_t osc_uuid, echo_uuid;
163         struct obd_uuid osc_uuid_str, echo_uuid_str;
164         int nal, err;
165         ENTRY;
166
167         generate_random_uuid(osc_uuid);
168         class_uuid_unparse(osc_uuid, &osc_uuid_str);
169         generate_random_uuid(echo_uuid);
170         class_uuid_unparse(echo_uuid, &echo_uuid_str);
171
172         if (ptl_parse_nid(&nid, echo_server_nid)) {
173                 CERROR("Can't parse NID %s\n", echo_server_nid);
174                 RETURN(-EINVAL);
175         }
176         nal = ptl_name2nal("tcp");
177         if (nal <= 0) {
178                 CERROR("Can't parse NAL tcp\n");
179                 RETURN(-EINVAL);
180         }
181
182         /* add uuid */
183         LCFG_INIT(lcfg, LCFG_ADD_UUID, NULL);
184         lcfg.lcfg_nid = nid;
185         lcfg.lcfg_inllen1 = strlen(peer) + 1;
186         lcfg.lcfg_inlbuf1 = peer;
187         lcfg.lcfg_nal = nal;
188         err = class_process_config(&lcfg);
189         if (err < 0) {
190                 CERROR("failed add_uuid\n");
191                 RETURN(-EINVAL);
192         }
193
194         /* attach osc */
195         LCFG_INIT(lcfg, LCFG_ATTACH, osc_dev_name);
196         lcfg.lcfg_inlbuf1 = "osc";
197         lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
198         lcfg.lcfg_inlbuf2 = osc_uuid_str.uuid;
199         lcfg.lcfg_inllen2 = strlen(lcfg.lcfg_inlbuf2) + 1;
200         err = class_process_config(&lcfg);
201         if (err < 0) {
202                 CERROR("failed attach osc\n");
203                 RETURN(-EINVAL);
204         }
205
206         /* setup osc */
207         LCFG_INIT(lcfg, LCFG_SETUP, osc_dev_name);
208         lcfg.lcfg_inlbuf1 = echo_server_ostname;
209         lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
210         lcfg.lcfg_inlbuf2 = peer;
211         lcfg.lcfg_inllen2 = strlen(lcfg.lcfg_inlbuf2) + 1;
212         err = class_process_config(&lcfg);
213         if (err < 0) {
214                 CERROR("failed setup osc\n");
215                 RETURN(-EINVAL);
216         }
217
218         /* attach echo_client */
219         LCFG_INIT(lcfg, LCFG_ATTACH, echo_dev_name);
220         lcfg.lcfg_inlbuf1 = "echo_client";
221         lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
222         lcfg.lcfg_inlbuf2 = echo_uuid_str.uuid;
223         lcfg.lcfg_inllen2 = strlen(lcfg.lcfg_inlbuf2) + 1;
224         err = class_process_config(&lcfg);
225         if (err < 0) {
226                 CERROR("failed attach echo_client\n");
227                 RETURN(-EINVAL);
228         }
229
230         /* setup echo_client */
231         LCFG_INIT(lcfg, LCFG_SETUP, echo_dev_name);
232         lcfg.lcfg_inlbuf1 = osc_dev_name;
233         lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
234         lcfg.lcfg_inlbuf2 = NULL;
235         lcfg.lcfg_inllen2 = 0;
236         err = class_process_config(&lcfg);
237         if (err < 0) {
238                 CERROR("failed setup echo_client\n");
239                 RETURN(-EINVAL);
240         }
241
242         RETURN(0);
243 }
244
245 static int disconnect_echo_client(void)
246 {
247         struct lustre_cfg lcfg;
248         int err;
249         ENTRY;
250
251         /* cleanup echo_client */
252         LCFG_INIT(lcfg, LCFG_CLEANUP, echo_dev_name);
253         err = class_process_config(&lcfg);
254         if (err < 0) {
255                 CERROR("failed cleanup echo_client\n");
256                 RETURN(-EINVAL);
257         }
258
259         /* detach echo_client */
260         LCFG_INIT(lcfg, LCFG_DETACH, echo_dev_name);
261         err = class_process_config(&lcfg);
262         if (err < 0) {
263                 CERROR("failed detach echo_client\n");
264                 RETURN(-EINVAL);
265         }
266
267         /* cleanup osc */
268         LCFG_INIT(lcfg, LCFG_CLEANUP, osc_dev_name);
269         err = class_process_config(&lcfg);
270         if (err < 0) {
271                 CERROR("failed cleanup osc device\n");
272                 RETURN(-EINVAL);
273         }
274
275         /* detach osc */
276         LCFG_INIT(lcfg, LCFG_DETACH, osc_dev_name);
277         err = class_process_config(&lcfg);
278         if (err < 0) {
279                 CERROR("failed detach osc device\n");
280                 RETURN(-EINVAL);
281         }
282
283         RETURN(0);
284 }
285
286 static void usage(const char *s)
287 {
288         printf("Usage: %s -s ost_host_name [-n ost_name]\n", s);
289         printf("    ost_host_name: the host name of echo server\n");
290         printf("    ost_name: ost name, default is \"obd1\"\n");
291 }
292
293 extern int time_ptlwait1;
294 extern int time_ptlwait2;
295 extern int time_ptlselect;
296
297 int main(int argc, char **argv) 
298 {
299         int c, rc;
300
301         while ((c = getopt(argc, argv, "s:n:")) != -1) {
302                 switch (c) {
303                 case 's':
304                         echo_server_nid = optarg;
305                         break;
306                 case 'n':
307                         echo_server_ostname = optarg;
308                         break;
309                 default:
310                         usage(argv[0]);
311                         return 1;
312                 }
313         }
314
315         if (optind != argc)
316                 usage(argv[0]);
317
318         if (!echo_server_nid) {
319                 usage(argv[0]);
320                 return 1;
321         }
322
323         srand(time(NULL));
324
325         tcpnal_mynid = rand();
326 #if 1
327         portal_debug = 0;
328         portal_subsystem_debug = 0;
329 #endif
330
331         if (init_current(argc, argv) ||
332             init_obdclass() || init_lib_portals() ||
333             ptlrpc_init() ||
334             mdc_init() ||
335             lov_init() ||
336             osc_init() ||
337             echo_client_init()) {
338                 printf("error\n");
339                 return 1;
340         }
341
342         rc = connect_echo_client();
343         if (rc)
344                 return rc;
345
346         set_ioc_handler(liblustre_ioctl);
347
348         rc = lctl_main(1, &argv[0]);
349
350         rc |= disconnect_echo_client();
351
352         return rc;
353 }