1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
5 #include <netinet/in.h>
6 #include <sys/socket.h>
9 #include <portals/ptlctl.h> /* needed for parse_dump */
12 #include <liblustre.h>
13 #include <linux/obd.h>
14 #include <linux/obd_class.h>
15 #include <procbridge.h>
17 #define LIBLUSTRE_TEST 1
18 #include "../utils/lctl.c"
20 struct ldlm_namespace;
24 unsigned int portal_subsystem_debug = ~0 - (S_PORTALS | S_QSWNAL | S_SOCKNAL |
27 void get_random_bytes(void *ptr, int size)
38 void *inter_module_get(char *arg)
40 if (!strcmp(arg, "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;
52 /* XXX move to proper place */
53 char *portals_nid2str(int nal, ptl_nid_t nid, char *str)
59 snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u.%u.%u.%u",
60 (__u32)(nid >> 32), HIPQUAD(nid));
65 snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u",
66 (__u32)(nid >> 32), (__u32)nid);
69 snprintf(str, PTL_NALFMT_SIZE - 1, "?%d? %llx",
76 ptl_handle_ni_t tcpnal_ni;
86 char *portals_id2str(int nal, ptl_process_id_t id, char *str)
92 snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u.%u.%u.%u,%u",
93 (__u32)(id.nid >> 32), HIPQUAD((id.nid)) , id.pid);
98 snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u,%u",
99 (__u32)(id.nid >> 32), (__u32)id.nid, id.pid);
102 snprintf(str, PTL_NALFMT_SIZE - 1, "?%d? %llx,%lx",
103 nal, (long long)id.nid, (long)id.pid );
109 struct task_struct *current;
112 libcfs_nal_cmd(struct portals_cfg *pcfg)
114 CERROR("empty function!!!\n");
118 int in_group_p(gid_t gid)
123 int init_current(int argc, char **argv)
125 current = malloc(sizeof(*current));
126 strncpy(current->comm, argv[0], sizeof(current->comm));
127 current->pid = getpid();
131 ptl_nid_t tcpnal_mynid;
133 int init_lib_portals()
138 rc = PtlInit(&max_interfaces);
140 CERROR("ksocknal: PtlNIInit failed: error %d\n", rc);
146 extern int class_handle_ioctl(unsigned int cmd, unsigned long arg);
148 int liblustre_ioctl(int dev_id, unsigned int opc, void *ptr)
154 fprintf(stderr, "Unexpected device id %d\n", dev_id);
159 rc = class_handle_ioctl(opc, (unsigned long)ptr);
166 static void generate_random_uuid(unsigned char uuid_out[16])
168 int *arr = (int*)uuid_out;
171 for (i = 0; i < sizeof(uuid_out)/sizeof(int); i++)
175 static char *echo_server_nid = NULL;
176 static char *echo_server_ostname = "obd1";
177 static char *osc_dev_name = "OSC_DEV_NAME";
178 static char *echo_dev_name = "ECHO_CLIENT_DEV_NAME";
180 static int connect_echo_client(void)
182 struct lustre_cfg lcfg;
184 char *peer = "ECHO_PEER_NID";
185 class_uuid_t osc_uuid, echo_uuid;
186 struct obd_uuid osc_uuid_str, echo_uuid_str;
190 generate_random_uuid(osc_uuid);
191 class_uuid_unparse(osc_uuid, &osc_uuid_str);
192 generate_random_uuid(echo_uuid);
193 class_uuid_unparse(echo_uuid, &echo_uuid_str);
195 if (ptl_parse_nid(&nid, echo_server_nid)) {
196 CERROR("Can't parse NID %s\n", echo_server_nid);
199 nal = ptl_name2nal("tcp");
201 CERROR("Can't parse NAL tcp\n");
206 LCFG_INIT(lcfg, LCFG_ADD_UUID, NULL);
208 lcfg.lcfg_inllen1 = strlen(peer) + 1;
209 lcfg.lcfg_inlbuf1 = peer;
211 err = class_process_config(&lcfg);
213 CERROR("failed add_uuid\n");
218 LCFG_INIT(lcfg, LCFG_ATTACH, osc_dev_name);
219 lcfg.lcfg_inlbuf1 = "osc";
220 lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
221 lcfg.lcfg_inlbuf2 = osc_uuid_str.uuid;
222 lcfg.lcfg_inllen2 = strlen(lcfg.lcfg_inlbuf2) + 1;
223 err = class_process_config(&lcfg);
225 CERROR("failed attach osc\n");
230 LCFG_INIT(lcfg, LCFG_SETUP, osc_dev_name);
231 lcfg.lcfg_inlbuf1 = echo_server_ostname;
232 lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
233 lcfg.lcfg_inlbuf2 = peer;
234 lcfg.lcfg_inllen2 = strlen(lcfg.lcfg_inlbuf2) + 1;
235 err = class_process_config(&lcfg);
237 CERROR("failed setup osc\n");
241 /* attach echo_client */
242 LCFG_INIT(lcfg, LCFG_ATTACH, echo_dev_name);
243 lcfg.lcfg_inlbuf1 = "echo_client";
244 lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
245 lcfg.lcfg_inlbuf2 = echo_uuid_str.uuid;
246 lcfg.lcfg_inllen2 = strlen(lcfg.lcfg_inlbuf2) + 1;
247 err = class_process_config(&lcfg);
249 CERROR("failed attach echo_client\n");
253 /* setup echo_client */
254 LCFG_INIT(lcfg, LCFG_SETUP, echo_dev_name);
255 lcfg.lcfg_inlbuf1 = osc_dev_name;
256 lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
257 lcfg.lcfg_inlbuf2 = NULL;
258 lcfg.lcfg_inllen2 = 0;
259 err = class_process_config(&lcfg);
261 CERROR("failed setup echo_client\n");
268 static int disconnect_echo_client(void)
270 struct lustre_cfg lcfg;
274 /* cleanup echo_client */
275 LCFG_INIT(lcfg, LCFG_CLEANUP, echo_dev_name);
276 err = class_process_config(&lcfg);
278 CERROR("failed cleanup echo_client\n");
282 /* detach echo_client */
283 LCFG_INIT(lcfg, LCFG_DETACH, echo_dev_name);
284 err = class_process_config(&lcfg);
286 CERROR("failed detach echo_client\n");
291 LCFG_INIT(lcfg, LCFG_CLEANUP, osc_dev_name);
292 err = class_process_config(&lcfg);
294 CERROR("failed cleanup osc device\n");
299 LCFG_INIT(lcfg, LCFG_DETACH, osc_dev_name);
300 err = class_process_config(&lcfg);
302 CERROR("failed detach osc device\n");
309 static void usage(const char *s)
311 printf("Usage: %s -s ost_host_name [-n ost_name]\n", s);
312 printf(" ost_host_name: the host name of echo server\n");
313 printf(" ost_name: ost name, default is \"obd1\"\n");
316 extern int time_ptlwait1;
317 extern int time_ptlwait2;
318 extern int time_ptlselect;
320 int main(int argc, char **argv)
324 while ((c = getopt(argc, argv, "s:n:")) != -1) {
327 echo_server_nid = optarg;
330 echo_server_ostname = optarg;
341 if (!echo_server_nid) {
348 tcpnal_mynid = rand();
351 portal_subsystem_debug = 0;
354 if (init_current(argc, argv) ||
355 init_obdclass() || init_lib_portals() ||
360 echo_client_init()) {
365 rc = connect_echo_client();
369 set_ioc_handler(liblustre_ioctl);
371 rc = lctl_main(1, &argv[0]);
373 rc |= disconnect_echo_client();