1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Lustre Light user test program
6 * Copyright (c) 2002-2004 Cluster File Systems, Inc.
8 * This file is part of Lustre, http://www.lustre.org.
10 * Lustre is free software; you can redistribute it and/or
11 * modify it under the terms of version 2 of the GNU General Public
12 * License as published by the Free Software Foundation.
14 * Lustre is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with Lustre; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include <liblustre.h>
25 #include <linux/obd.h>
26 #include <linux/obd_class.h>
28 #define LIBLUSTRE_TEST 1
29 #include "../utils/lctl.c"
33 extern int class_handle_ioctl(unsigned int cmd, unsigned long arg);
45 char *portals_id2str(int nal, ptl_process_id_t id, char *str)
55 snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u.%u.%u.%u,%u",
56 (__u32)(id.nid >> 32), HIPQUAD((id.nid)) , id.pid);
61 snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u,%u",
62 (__u32)(id.nid >> 32), (__u32)id.nid, id.pid);
65 snprintf(str, PTL_NALFMT_SIZE - 1, "?%d? %llx,%lx",
66 nal, (long long)id.nid, (long)id.pid );
73 static int liblustre_ioctl(int dev_id, unsigned int opc, void *ptr)
79 fprintf(stderr, "Unexpected device id %d\n", dev_id);
84 rc = class_handle_ioctl(opc, (unsigned long)ptr);
91 static char *echo_server_nid = NULL;
92 static char *echo_server_ostname = "obd1";
93 static char *osc_dev_name = "OSC_DEV_NAME";
94 static char *echo_dev_name = "ECHO_CLIENT_DEV_NAME";
96 static int connect_echo_client(void)
98 struct lustre_cfg lcfg;
100 char *peer = "ECHO_PEER_NID";
101 class_uuid_t osc_uuid, echo_uuid;
102 struct obd_uuid osc_uuid_str, echo_uuid_str;
106 generate_random_uuid(osc_uuid);
107 class_uuid_unparse(osc_uuid, &osc_uuid_str);
108 generate_random_uuid(echo_uuid);
109 class_uuid_unparse(echo_uuid, &echo_uuid_str);
111 if (ptl_parse_nid(&nid, echo_server_nid)) {
112 CERROR("Can't parse NID %s\n", echo_server_nid);
115 nal = ptl_name2nal("tcp");
117 CERROR("Can't parse NAL tcp\n");
122 LCFG_INIT(lcfg, LCFG_ADD_UUID, NULL);
124 lcfg.lcfg_inllen1 = strlen(peer) + 1;
125 lcfg.lcfg_inlbuf1 = peer;
127 err = class_process_config(&lcfg);
129 CERROR("failed add_uuid\n");
134 LCFG_INIT(lcfg, LCFG_ATTACH, osc_dev_name);
135 lcfg.lcfg_inlbuf1 = "osc";
136 lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
137 lcfg.lcfg_inlbuf2 = osc_uuid_str.uuid;
138 lcfg.lcfg_inllen2 = strlen(lcfg.lcfg_inlbuf2) + 1;
139 err = class_process_config(&lcfg);
141 CERROR("failed attach osc\n");
146 LCFG_INIT(lcfg, LCFG_SETUP, osc_dev_name);
147 lcfg.lcfg_inlbuf1 = echo_server_ostname;
148 lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
149 lcfg.lcfg_inlbuf2 = peer;
150 lcfg.lcfg_inllen2 = strlen(lcfg.lcfg_inlbuf2) + 1;
151 err = class_process_config(&lcfg);
153 CERROR("failed setup osc\n");
157 /* attach echo_client */
158 LCFG_INIT(lcfg, LCFG_ATTACH, echo_dev_name);
159 lcfg.lcfg_inlbuf1 = "echo_client";
160 lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
161 lcfg.lcfg_inlbuf2 = echo_uuid_str.uuid;
162 lcfg.lcfg_inllen2 = strlen(lcfg.lcfg_inlbuf2) + 1;
163 err = class_process_config(&lcfg);
165 CERROR("failed attach echo_client\n");
169 /* setup echo_client */
170 LCFG_INIT(lcfg, LCFG_SETUP, echo_dev_name);
171 lcfg.lcfg_inlbuf1 = osc_dev_name;
172 lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
173 lcfg.lcfg_inlbuf2 = NULL;
174 lcfg.lcfg_inllen2 = 0;
175 err = class_process_config(&lcfg);
177 CERROR("failed setup echo_client\n");
184 static int disconnect_echo_client(void)
186 struct lustre_cfg lcfg;
190 /* cleanup echo_client */
191 LCFG_INIT(lcfg, LCFG_CLEANUP, echo_dev_name);
192 err = class_process_config(&lcfg);
194 CERROR("failed cleanup echo_client\n");
198 /* detach echo_client */
199 LCFG_INIT(lcfg, LCFG_DETACH, echo_dev_name);
200 err = class_process_config(&lcfg);
202 CERROR("failed detach echo_client\n");
207 LCFG_INIT(lcfg, LCFG_CLEANUP, osc_dev_name);
208 err = class_process_config(&lcfg);
210 CERROR("failed cleanup osc device\n");
215 LCFG_INIT(lcfg, LCFG_DETACH, osc_dev_name);
216 err = class_process_config(&lcfg);
218 CERROR("failed detach osc device\n");
225 static void usage(const char *s)
227 printf("Usage: %s -s ost_host_name [-n ost_name]\n", s);
228 printf(" ost_host_name: the host name of echo server\n");
229 printf(" ost_name: ost name, default is \"obd1\"\n");
232 extern int time_ptlwait1;
233 extern int time_ptlwait2;
234 extern int time_ptlselect;
236 int main(int argc, char **argv)
240 while ((c = getopt(argc, argv, "s:n:")) != -1) {
243 echo_server_nid = optarg;
246 echo_server_ostname = optarg;
257 if (!echo_server_nid) {
263 portal_subsystem_debug = 0;
265 liblustre_init_random();
266 liblustre_set_nal_nid();
268 if (liblustre_init_current(argv[0]) ||
269 init_obdclass() || init_lib_portals() ||
274 echo_client_init()) {
279 rc = connect_echo_client();
283 set_ioc_handler(liblustre_ioctl);
285 rc = lctl_main(1, &argv[0]);
287 rc |= disconnect_echo_client();