1 1.3 joerg /* $NetBSD: iscsic_daemonif.c,v 1.3 2015/05/30 15:57:32 joerg Exp $ */ 2 1.1 agc 3 1.1 agc /*- 4 1.1 agc * Copyright (c) 2005,2006,2011 The NetBSD Foundation, Inc. 5 1.1 agc * All rights reserved. 6 1.1 agc * 7 1.1 agc * This code is derived from software contributed to The NetBSD Foundation 8 1.1 agc * by Wasabi Systems, Inc. 9 1.1 agc * 10 1.1 agc * Redistribution and use in source and binary forms, with or without 11 1.1 agc * modification, are permitted provided that the following conditions 12 1.1 agc * are met: 13 1.1 agc * 1. Redistributions of source code must retain the above copyright 14 1.1 agc * notice, this list of conditions and the following disclaimer. 15 1.1 agc * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 agc * notice, this list of conditions and the following disclaimer in the 17 1.1 agc * documentation and/or other materials provided with the distribution. 18 1.1 agc * 19 1.1 agc * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 agc * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 agc * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 agc * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 agc * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 agc * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 agc * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 agc * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 agc * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 agc * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 agc * POSSIBILITY OF SUCH DAMAGE. 30 1.1 agc */ 31 1.1 agc #include "iscsic_globals.h" 32 1.1 agc 33 1.1 agc /* 34 1.1 agc * do_add_target: 35 1.1 agc * Handle both the add_target and add_send_target commands. 36 1.1 agc * 37 1.1 agc * Parameter: 38 1.1 agc * argc, argv Shifted arguments 39 1.1 agc * kind Which list 40 1.1 agc * 41 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 42 1.1 agc */ 43 1.1 agc 44 1.1 agc STATIC int 45 1.1 agc do_add_target(int argc, char **argv, iscsid_list_kind_t kind) 46 1.1 agc { 47 1.1 agc iscsid_add_target_req_t *targ; 48 1.1 agc iscsid_set_target_authentication_req_t auth; 49 1.1 agc iscsid_get_set_target_options_t opt; 50 1.1 agc iscsid_response_t *rsp; 51 1.1 agc iscsid_add_target_rsp_t *res; 52 1.1 agc unsigned i; 53 1.1 agc int opts, auths, tlen; 54 1.1 agc uint32_t tid; 55 1.1 agc 56 1.1 agc tlen = cl_get_target(&targ, argc, argv, kind != SEND_TARGETS_LIST); 57 1.1 agc if (tlen == 0) { 58 1.1 agc arg_missing("Target"); 59 1.1 agc } 60 1.1 agc if (kind == SEND_TARGETS_LIST && !targ->num_portals) { 61 1.1 agc arg_missing("Target Address"); 62 1.1 agc } 63 1.1 agc opts = cl_get_target_opts(&opt, argc, argv); 64 1.1 agc auths = cl_get_auth_opts(&auth, argc, argv); 65 1.1 agc cl_get_symname(targ->sym_name, argc, argv); 66 1.1 agc check_extra_args(argc, argv); 67 1.1 agc 68 1.1 agc targ->list_kind = kind; 69 1.1 agc 70 1.1 agc send_request(ISCSID_ADD_TARGET, tlen, targ); 71 1.1 agc rsp = get_response(FALSE); 72 1.1 agc 73 1.1 agc if (rsp->status) { 74 1.1 agc status_error(rsp->status); 75 1.1 agc } 76 1.2 christos res = (iscsid_add_target_rsp_t *)(void *)rsp->parameter; 77 1.1 agc tid = res->target_id; 78 1.1 agc 79 1.1 agc if (kind == SEND_TARGETS_LIST) { 80 1.1 agc printf("Added Send Target %d\n", res->target_id); 81 1.1 agc } else { 82 1.1 agc printf("Added Target %d", res->target_id); 83 1.1 agc if (res->num_portals) { 84 1.1 agc printf(", Portal "); 85 1.1 agc for (i = 0; i < res->num_portals; i++) 86 1.1 agc printf("%d ", res->portal_id[i]); 87 1.1 agc } 88 1.1 agc printf("\n"); 89 1.1 agc } 90 1.1 agc 91 1.1 agc free_response(rsp); 92 1.1 agc 93 1.1 agc if (opts) { 94 1.1 agc opt.list_kind = kind; 95 1.1 agc opt.target_id.id = tid; 96 1.1 agc send_request(ISCSID_SET_TARGET_OPTIONS, sizeof(opt), &opt); 97 1.1 agc rsp = get_response(FALSE); 98 1.1 agc if (rsp->status) { 99 1.1 agc status_error(rsp->status); 100 1.1 agc } 101 1.1 agc free_response(rsp); 102 1.1 agc } 103 1.1 agc 104 1.1 agc if (auths) { 105 1.1 agc auth.list_kind = kind; 106 1.1 agc auth.target_id.id = tid; 107 1.1 agc send_request(ISCSID_SET_TARGET_AUTHENTICATION, sizeof(auth), &auth); 108 1.1 agc rsp = get_response(FALSE); 109 1.1 agc if (rsp->status) { 110 1.1 agc status_error(rsp->status); 111 1.1 agc } 112 1.1 agc free_response(rsp); 113 1.1 agc } 114 1.1 agc 115 1.1 agc return 0; 116 1.1 agc } 117 1.1 agc 118 1.1 agc 119 1.1 agc /* 120 1.1 agc * do_remove_target: 121 1.1 agc * Handle both the remove_target and remove_send_target commands. 122 1.1 agc * 123 1.1 agc * Parameter: 124 1.1 agc * argc, argv Shifted arguments 125 1.1 agc * kind Which list 126 1.1 agc * 127 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 128 1.1 agc */ 129 1.1 agc 130 1.1 agc STATIC int 131 1.1 agc do_remove_target(int argc, char **argv, iscsid_list_kind_t kind) 132 1.1 agc { 133 1.1 agc iscsid_list_id_t req; 134 1.1 agc iscsid_search_list_req_t srch; 135 1.1 agc iscsid_response_t *rsp; 136 1.1 agc 137 1.1 agc if (!cl_get_id('I', &req.id, argc, argv)) { 138 1.1 agc if (!cl_get_string('n', (char *)srch.strval, argc, argv)) { 139 1.1 agc arg_missing("Target ID or Name"); 140 1.1 agc } 141 1.1 agc check_extra_args(argc, argv); 142 1.1 agc 143 1.1 agc srch.search_kind = FIND_TARGET_NAME; 144 1.1 agc srch.list_kind = kind; 145 1.1 agc 146 1.1 agc send_request(ISCSID_SEARCH_LIST, sizeof(srch), &srch); 147 1.1 agc rsp = get_response(FALSE); 148 1.1 agc if (rsp->status) { 149 1.1 agc status_error_slist(rsp->status); 150 1.1 agc } 151 1.1 agc GET_SYM_ID(req.id.id, rsp->parameter); 152 1.1 agc free_response(rsp); 153 1.1 agc } else { 154 1.1 agc check_extra_args(argc, argv); 155 1.1 agc } 156 1.1 agc req.list_kind = kind; 157 1.1 agc send_request(ISCSID_REMOVE_TARGET, sizeof(req), &req); 158 1.1 agc rsp = get_response(TRUE); 159 1.1 agc if (rsp->status) { 160 1.1 agc status_error(rsp->status); 161 1.1 agc } 162 1.1 agc free_response(rsp); 163 1.1 agc printf("OK\n"); 164 1.1 agc return 0; 165 1.1 agc } 166 1.1 agc 167 1.1 agc 168 1.1 agc /* 169 1.1 agc * do_refresh: 170 1.1 agc * Handle the refresh_targets and refresh_isns commands. 171 1.1 agc * 172 1.1 agc * Parameter: 173 1.1 agc * argc, argv Shifted arguments 174 1.1 agc * kind Which list 175 1.1 agc * 176 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 177 1.1 agc */ 178 1.1 agc 179 1.1 agc STATIC int 180 1.1 agc do_refresh(int argc, char **argv, iscsid_list_kind_t kind) 181 1.1 agc { 182 1.1 agc iscsid_sym_id_t id; 183 1.1 agc iscsid_response_t *rsp; 184 1.1 agc iscsid_refresh_req_t req; 185 1.1 agc 186 1.1 agc req.kind = kind; 187 1.1 agc 188 1.1 agc if (cl_get_id('I', &id, argc, argv)) { 189 1.1 agc check_extra_args(argc, argv); 190 1.1 agc 191 1.1 agc if (!id.id) { 192 1.1 agc iscsid_search_list_req_t srch; 193 1.1 agc 194 1.1 agc srch.search_kind = FIND_NAME; 195 1.1 agc srch.list_kind = kind; 196 1.1 agc strlcpy((char *)srch.strval, (char *)id.name, 197 1.1 agc sizeof(srch.strval)); 198 1.1 agc 199 1.1 agc send_request(ISCSID_SEARCH_LIST, sizeof(srch), &srch); 200 1.1 agc rsp = get_response(FALSE); 201 1.1 agc if (rsp->status) { 202 1.1 agc status_error_slist(rsp->status); 203 1.1 agc } 204 1.1 agc GET_SYM_ID(req.id[0], rsp->parameter); 205 1.1 agc free_response(rsp); 206 1.1 agc } else { 207 1.1 agc req.id[0] = id.id; 208 1.1 agc } 209 1.1 agc req.num_ids = 1; 210 1.1 agc } else { 211 1.1 agc req.num_ids = 0; 212 1.1 agc check_extra_args(argc, argv); 213 1.1 agc } 214 1.1 agc 215 1.1 agc req.kind = kind; 216 1.1 agc send_request(ISCSID_REFRESH_TARGETS, sizeof(req), &req); 217 1.1 agc 218 1.1 agc rsp = get_response(FALSE); 219 1.1 agc if (rsp->status) { 220 1.1 agc status_error(rsp->status); 221 1.1 agc } 222 1.1 agc printf("OK\n"); 223 1.1 agc free_response(rsp); 224 1.1 agc return 0; 225 1.1 agc } 226 1.1 agc 227 1.1 agc 228 1.1 agc /* 229 1.1 agc * add_target: 230 1.1 agc * Handle the add_target command. 231 1.1 agc * 232 1.1 agc * Parameter: argc, argv (shifted) 233 1.1 agc * 234 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 235 1.1 agc */ 236 1.1 agc 237 1.1 agc int 238 1.1 agc add_target(int argc, char **argv) 239 1.1 agc { 240 1.1 agc return do_add_target(argc, argv, TARGET_LIST); 241 1.1 agc } 242 1.1 agc 243 1.1 agc 244 1.1 agc /* 245 1.1 agc * remove_target: 246 1.1 agc * Handle the remove_target command. 247 1.1 agc * 248 1.1 agc * Parameter: argc, argv (shifted) 249 1.1 agc * 250 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 251 1.1 agc */ 252 1.1 agc 253 1.1 agc int 254 1.1 agc remove_target(int argc, char **argv) 255 1.1 agc { 256 1.1 agc return do_remove_target(argc, argv, TARGET_LIST); 257 1.1 agc } 258 1.1 agc 259 1.1 agc 260 1.1 agc /* 261 1.1 agc * slp_find_targets: 262 1.1 agc * Handle the slp_find_targets command. 263 1.1 agc * 264 1.1 agc * Parameter: argc, argv (shifted) 265 1.1 agc * 266 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 267 1.1 agc * 268 1.1 agc * ToDo: Implement. 269 1.1 agc */ 270 1.1 agc 271 1.1 agc int 272 1.2 christos /*ARGSUSED*/ 273 1.1 agc slp_find_targets(int argc, char **argv) 274 1.1 agc { 275 1.1 agc printf("Not implemented\n"); 276 1.1 agc return 5; 277 1.1 agc } 278 1.1 agc 279 1.1 agc 280 1.1 agc /* 281 1.1 agc * refresh_targets: 282 1.1 agc * Handle the refresh_targets command. 283 1.1 agc * 284 1.1 agc * Parameter: argc, argv (shifted) 285 1.1 agc * 286 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 287 1.1 agc */ 288 1.1 agc 289 1.1 agc int 290 1.1 agc refresh_targets(int argc, char **argv) 291 1.1 agc { 292 1.1 agc return do_refresh(argc, argv, SEND_TARGETS_LIST); 293 1.1 agc } 294 1.1 agc 295 1.1 agc 296 1.1 agc /* 297 1.1 agc * add_portal: 298 1.1 agc * Handle the add_portal command. 299 1.1 agc * 300 1.1 agc * Parameter: 301 1.1 agc * argc, argv Shifted arguments 302 1.1 agc * 303 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 304 1.1 agc */ 305 1.1 agc 306 1.1 agc int 307 1.1 agc add_portal(int argc, char **argv) 308 1.1 agc { 309 1.1 agc iscsid_add_portal_req_t port; 310 1.1 agc iscsid_response_t *rsp; 311 1.1 agc iscsid_add_portal_rsp_t *res; 312 1.1 agc 313 1.1 agc if (!cl_get_portal(&port, argc, argv)) { 314 1.1 agc arg_missing("Portal Address"); 315 1.1 agc } 316 1.1 agc if (!cl_get_id('I', &port.target_id, argc, argv)) { 317 1.1 agc arg_missing("Target ID"); 318 1.1 agc } 319 1.1 agc cl_get_symname(port.sym_name, argc, argv); 320 1.1 agc check_extra_args(argc, argv); 321 1.1 agc 322 1.1 agc send_request(ISCSID_ADD_PORTAL, sizeof(port), &port); 323 1.1 agc rsp = get_response(FALSE); 324 1.1 agc 325 1.1 agc if (rsp->status) { 326 1.1 agc status_error(rsp->status); 327 1.1 agc } 328 1.2 christos res = (iscsid_add_portal_rsp_t *)(void *)rsp->parameter; 329 1.1 agc 330 1.1 agc printf("Added Portal %d to Target %d\n", 331 1.1 agc res->portal_id.id, res->target_id.id); 332 1.1 agc free_response(rsp); 333 1.1 agc return 0; 334 1.1 agc } 335 1.1 agc 336 1.1 agc 337 1.1 agc /* 338 1.1 agc * show_target: 339 1.1 agc * Get information about and display a target entry (including its portals). 340 1.1 agc * 341 1.1 agc * Parameter: 342 1.1 agc * target ID 343 1.1 agc * list kind 344 1.1 agc */ 345 1.1 agc 346 1.1 agc STATIC void 347 1.1 agc show_target(uint32_t id, iscsid_list_kind_t kind) 348 1.1 agc { 349 1.1 agc iscsid_list_id_t req; 350 1.1 agc iscsid_response_t *trsp, *prsp; 351 1.1 agc iscsid_get_target_rsp_t *targ; 352 1.1 agc iscsid_get_portal_rsp_t *port; 353 1.1 agc unsigned i; 354 1.1 agc 355 1.1 agc /* get target info */ 356 1.1 agc req.list_kind = kind; 357 1.1 agc req.id.id = id; 358 1.1 agc req.id.name[0] = '\0'; 359 1.1 agc send_request(ISCSID_GET_TARGET_INFO, sizeof(req), &req); 360 1.1 agc 361 1.1 agc trsp = get_response(TRUE); 362 1.1 agc if (trsp->status) { 363 1.1 agc status_error(trsp->status); 364 1.1 agc } 365 1.2 christos targ = (iscsid_get_target_rsp_t *)(void *)trsp->parameter; 366 1.1 agc 367 1.1 agc /* display basic target info */ 368 1.1 agc printf("%6d", targ->target_id.id); 369 1.1 agc if (targ->target_id.name[0]) { 370 1.1 agc printf(" [%s]", targ->target_id.name); 371 1.1 agc } 372 1.1 agc printf(": %s", targ->TargetName); 373 1.1 agc if (targ->TargetAlias[0]) { 374 1.1 agc printf(" (%s)", targ->TargetAlias); 375 1.1 agc } 376 1.1 agc printf("\n"); 377 1.1 agc 378 1.1 agc /* now get and display info on the target's portals */ 379 1.1 agc for (i = 0; i < targ->num_portals; i++) { 380 1.1 agc req.id.id = targ->portal[i]; 381 1.1 agc send_request(ISCSID_GET_PORTAL_INFO, sizeof(req), &req); 382 1.1 agc prsp = get_response(FALSE); 383 1.1 agc if (prsp->status) { 384 1.1 agc status_error(prsp->status); 385 1.1 agc } 386 1.2 christos port = (iscsid_get_portal_rsp_t *)(void *)prsp->parameter; 387 1.1 agc 388 1.1 agc printf(" %6d", port->portal_id.id); 389 1.1 agc if (port->portal_id.name[0]) { 390 1.1 agc printf(" [%s]", port->portal_id.name); 391 1.1 agc } 392 1.1 agc printf(": %s:%d", port->portal.address, port->portal.port); 393 1.1 agc if (kind != SEND_TARGETS_LIST) { 394 1.1 agc printf(",%d", port->portal.group_tag); 395 1.1 agc } 396 1.1 agc printf("\n"); 397 1.1 agc free_response(prsp); 398 1.1 agc } 399 1.1 agc free_response(trsp); 400 1.1 agc } 401 1.1 agc 402 1.1 agc 403 1.1 agc /* 404 1.1 agc * do_list_targets: 405 1.1 agc * Handle both the list_targets and list_send_targets commands. 406 1.1 agc * 407 1.1 agc * Parameter: 408 1.1 agc * argc, argv Shifted arguments 409 1.1 agc * kind Which list 410 1.1 agc * 411 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 412 1.1 agc */ 413 1.1 agc 414 1.1 agc STATIC int 415 1.1 agc do_list_targets(int argc, char **argv, iscsid_list_kind_t kind) 416 1.1 agc { 417 1.1 agc iscsid_get_list_req_t lst; 418 1.1 agc iscsid_response_t *rsp; 419 1.1 agc iscsid_get_list_rsp_t *list; 420 1.1 agc unsigned i; 421 1.1 agc 422 1.1 agc check_extra_args(argc, argv); 423 1.1 agc 424 1.1 agc /* get the list of targets */ 425 1.1 agc lst.list_kind = kind; 426 1.1 agc send_request(ISCSID_GET_LIST, sizeof(lst), &lst); 427 1.1 agc rsp = get_response(TRUE); 428 1.1 agc if (rsp->status) { 429 1.1 agc status_error(rsp->status); 430 1.1 agc } 431 1.2 christos list = (iscsid_get_list_rsp_t *)(void *)rsp->parameter; 432 1.1 agc 433 1.1 agc /* display all targets */ 434 1.1 agc for (i = 0; i < list->num_entries; i++) { 435 1.1 agc show_target(list->id[i], kind); 436 1.1 agc } 437 1.1 agc free_response(rsp); 438 1.1 agc return 0; 439 1.1 agc } 440 1.1 agc 441 1.1 agc 442 1.1 agc /* 443 1.1 agc * list_targets: 444 1.1 agc * Handle the list_targets command. 445 1.1 agc * 446 1.1 agc * Parameter: argc, argv (shifted) 447 1.1 agc * 448 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 449 1.1 agc */ 450 1.1 agc 451 1.1 agc int 452 1.1 agc list_targets(int argc, char **argv) 453 1.1 agc { 454 1.1 agc return do_list_targets(argc, argv, TARGET_LIST); 455 1.1 agc } 456 1.1 agc 457 1.1 agc 458 1.1 agc /* 459 1.1 agc * add_send_target: 460 1.1 agc * Handle the add_target command. 461 1.1 agc * 462 1.1 agc * Parameter: argc, argv (shifted) 463 1.1 agc * 464 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 465 1.1 agc */ 466 1.1 agc 467 1.1 agc int 468 1.1 agc add_send_target(int argc, char **argv) 469 1.1 agc { 470 1.1 agc return do_add_target(argc, argv, SEND_TARGETS_LIST); 471 1.1 agc } 472 1.1 agc 473 1.1 agc 474 1.1 agc /* 475 1.1 agc * remove_send_target: 476 1.1 agc * Handle the remove_target command. 477 1.1 agc * 478 1.1 agc * Parameter: argc, argv (shifted) 479 1.1 agc * 480 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 481 1.1 agc */ 482 1.1 agc 483 1.1 agc int 484 1.1 agc remove_send_target(int argc, char **argv) 485 1.1 agc { 486 1.1 agc return do_remove_target(argc, argv, SEND_TARGETS_LIST); 487 1.1 agc } 488 1.1 agc 489 1.1 agc 490 1.1 agc /* 491 1.1 agc * list_send_targets: 492 1.1 agc * Handle the list_send_targets command. 493 1.1 agc * 494 1.1 agc * Parameter: argc, argv (shifted) 495 1.1 agc * 496 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 497 1.1 agc */ 498 1.1 agc 499 1.1 agc int 500 1.1 agc list_send_targets(int argc, char **argv) 501 1.1 agc { 502 1.1 agc return do_list_targets(argc, argv, SEND_TARGETS_LIST); 503 1.1 agc } 504 1.1 agc 505 1.1 agc 506 1.1 agc /* 507 1.1 agc * add_isns_server: 508 1.1 agc * Handle the add_isns_server command. 509 1.1 agc * 510 1.1 agc * Parameter: argc, argv (shifted) 511 1.1 agc * 512 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 513 1.1 agc */ 514 1.1 agc 515 1.1 agc int 516 1.1 agc add_isns_server(int argc, char **argv) 517 1.1 agc { 518 1.1 agc iscsid_add_isns_server_req_t arg; 519 1.1 agc iscsid_add_isns_server_rsp_t *res; 520 1.1 agc iscsid_response_t *rsp; 521 1.1 agc 522 1.1 agc memset(&arg, 0x0, sizeof(arg)); 523 1.1 agc if (!(cl_get_isns(&arg, argc, argv))) { 524 1.1 agc arg_missing("Server Address"); 525 1.1 agc } 526 1.1 agc check_extra_args(argc, argv); 527 1.1 agc 528 1.1 agc send_request(ISCSID_ADD_ISNS_SERVER, sizeof(arg), &arg); 529 1.1 agc rsp = get_response(FALSE); 530 1.1 agc 531 1.1 agc if (rsp->status) { 532 1.1 agc status_error(rsp->status); 533 1.1 agc } 534 1.2 christos res = (iscsid_add_isns_server_rsp_t *)(void *)rsp->parameter; 535 1.1 agc 536 1.1 agc printf("Added iSNS Server ID %d\n", res->server_id); 537 1.1 agc 538 1.1 agc free_response(rsp); 539 1.1 agc return 0; 540 1.1 agc } 541 1.1 agc 542 1.1 agc 543 1.1 agc /* 544 1.1 agc * remove_isns_server: 545 1.1 agc * Handle the add_isns_server command. 546 1.1 agc * 547 1.1 agc * Parameter: argc, argv (shifted) 548 1.1 agc * 549 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 550 1.1 agc */ 551 1.1 agc 552 1.1 agc int 553 1.1 agc remove_isns_server(int argc, char **argv) 554 1.1 agc { 555 1.1 agc iscsid_sym_id_t req; 556 1.1 agc iscsid_search_list_req_t srch; 557 1.1 agc iscsid_response_t *rsp; 558 1.1 agc 559 1.1 agc if (!cl_get_id('I', &req, argc, argv)) { 560 1.1 agc if (!cl_get_string('a', (char *)srch.strval, argc, argv)) { 561 1.1 agc arg_missing("Server Address"); 562 1.1 agc } 563 1.1 agc check_extra_args(argc, argv); 564 1.1 agc srch.search_kind = FIND_ADDRESS; 565 1.1 agc srch.list_kind = ISNS_LIST; 566 1.1 agc 567 1.1 agc send_request(ISCSID_SEARCH_LIST, sizeof(srch), &srch); 568 1.1 agc rsp = get_response(FALSE); 569 1.1 agc if (rsp->status) { 570 1.1 agc status_error_slist(rsp->status); 571 1.1 agc } 572 1.1 agc GET_SYM_ID(req.id, rsp->parameter); 573 1.1 agc free_response(rsp); 574 1.1 agc } else { 575 1.1 agc check_extra_args(argc, argv); 576 1.1 agc } 577 1.1 agc send_request(ISCSID_REMOVE_ISNS_SERVER, sizeof(req), &req); 578 1.1 agc rsp = get_response(TRUE); 579 1.1 agc if (rsp->status) { 580 1.1 agc status_error(rsp->status); 581 1.1 agc } 582 1.1 agc free_response(rsp); 583 1.1 agc 584 1.1 agc printf("OK\n"); 585 1.1 agc return 0; 586 1.1 agc } 587 1.1 agc 588 1.1 agc 589 1.1 agc /* 590 1.1 agc * find_isns_servers: 591 1.1 agc * Handle the find_isns_servers command. 592 1.1 agc * 593 1.1 agc * Parameter: argc, argv (shifted) 594 1.1 agc * 595 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 596 1.1 agc */ 597 1.1 agc 598 1.1 agc int 599 1.2 christos /*ARGSUSED*/ 600 1.1 agc find_isns_servers(int argc, char **argv) 601 1.1 agc { 602 1.1 agc printf("Not implemented\n"); 603 1.1 agc return 5; 604 1.1 agc } 605 1.1 agc 606 1.1 agc 607 1.1 agc /* 608 1.1 agc * list_isns_servers: 609 1.1 agc * Handle the list_isns_servers command. 610 1.1 agc * 611 1.1 agc * Parameter: argc, argv (shifted) 612 1.1 agc * 613 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 614 1.1 agc */ 615 1.1 agc 616 1.1 agc int 617 1.1 agc list_isns_servers(int argc, char **argv) 618 1.1 agc { 619 1.1 agc iscsid_get_list_req_t lst; 620 1.1 agc iscsid_response_t *rsp, *prsp; 621 1.1 agc iscsid_get_list_rsp_t *list; 622 1.1 agc iscsid_get_isns_server_rsp_t *isns; 623 1.1 agc iscsid_sym_id_t req; 624 1.1 agc unsigned i; 625 1.1 agc 626 1.1 agc memset(&req, 0x0, sizeof(req)); 627 1.1 agc check_extra_args(argc, argv); 628 1.1 agc 629 1.1 agc /* get the list of servers */ 630 1.1 agc lst.list_kind = ISNS_LIST; 631 1.1 agc send_request(ISCSID_GET_LIST, sizeof(lst), &lst); 632 1.1 agc rsp = get_response(TRUE); 633 1.1 agc if (rsp->status) { 634 1.1 agc status_error(rsp->status); 635 1.1 agc } 636 1.2 christos list = (iscsid_get_list_rsp_t *)(void *)rsp->parameter; 637 1.1 agc 638 1.1 agc /* display all servers */ 639 1.1 agc for (i = 0; i < list->num_entries; i++) { 640 1.1 agc req.id = list->id[i]; 641 1.1 agc send_request(ISCSID_GET_ISNS_SERVER, sizeof(req), &req); 642 1.1 agc prsp = get_response(FALSE); 643 1.1 agc if (prsp->status) 644 1.1 agc status_error(prsp->status); 645 1.1 agc 646 1.2 christos isns = (iscsid_get_isns_server_rsp_t *)(void *)prsp->parameter; 647 1.1 agc printf("%6d: %s\n", list->id[i], isns->address); 648 1.1 agc free_response(prsp); 649 1.1 agc } 650 1.1 agc free_response(rsp); 651 1.1 agc return 0; 652 1.1 agc } 653 1.1 agc 654 1.1 agc 655 1.1 agc /* 656 1.1 agc * refresh_isns: 657 1.1 agc * Handle the refresh_isns command. 658 1.1 agc * 659 1.1 agc * Parameter: argc, argv (shifted) 660 1.1 agc * 661 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 662 1.1 agc */ 663 1.1 agc 664 1.1 agc int 665 1.1 agc refresh_isns(int argc, char **argv) 666 1.1 agc { 667 1.1 agc return do_refresh(argc, argv, ISNS_LIST); 668 1.1 agc } 669 1.1 agc 670 1.1 agc 671 1.1 agc /* 672 1.1 agc * add_initiator: 673 1.1 agc * Handle the add_initiator command. 674 1.1 agc * 675 1.1 agc * Parameter: argc, argv (shifted) 676 1.1 agc * 677 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 678 1.1 agc */ 679 1.1 agc 680 1.1 agc int 681 1.1 agc add_initiator(int argc, char **argv) 682 1.1 agc { 683 1.1 agc iscsid_add_initiator_req_t req; 684 1.1 agc iscsid_add_initiator_rsp_t *res; 685 1.1 agc iscsid_response_t *rsp; 686 1.1 agc 687 1.1 agc memset(&req, 0x0, sizeof(req)); 688 1.1 agc if (!cl_get_string('a', (char *)req.address, argc, argv)) { 689 1.1 agc arg_missing("Interface Address"); 690 1.1 agc } 691 1.1 agc cl_get_symname(req.name, argc, argv); 692 1.1 agc check_extra_args(argc, argv); 693 1.1 agc 694 1.1 agc send_request(ISCSID_ADD_INITIATOR_PORTAL, sizeof(req), &req); 695 1.1 agc rsp = get_response(FALSE); 696 1.1 agc if (rsp->status) { 697 1.1 agc status_error(rsp->status); 698 1.1 agc } 699 1.2 christos res = (iscsid_add_initiator_rsp_t *)(void *)rsp->parameter; 700 1.1 agc printf("Added Initiator Portal %d\n", res->portal_id); 701 1.1 agc 702 1.1 agc free_response(rsp); 703 1.1 agc return 0; 704 1.1 agc } 705 1.1 agc 706 1.1 agc 707 1.1 agc /* 708 1.1 agc * remove_initiator: 709 1.1 agc * Handle the remove_initiator command. 710 1.1 agc * 711 1.1 agc * Parameter: argc, argv (shifted) 712 1.1 agc * 713 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 714 1.1 agc */ 715 1.1 agc 716 1.1 agc int 717 1.1 agc remove_initiator(int argc, char **argv) 718 1.1 agc { 719 1.1 agc iscsid_sym_id_t req; 720 1.1 agc iscsid_response_t *rsp; 721 1.1 agc 722 1.1 agc memset(&req, 0x0, sizeof(req)); 723 1.1 agc if (!cl_get_id('I', &req, argc, argv)) { 724 1.1 agc arg_missing("Initiator Portal ID"); 725 1.1 agc } 726 1.1 agc check_extra_args(argc, argv); 727 1.1 agc 728 1.1 agc send_request(ISCSID_REMOVE_INITIATOR_PORTAL, sizeof(req), &req); 729 1.1 agc rsp = get_response(FALSE); 730 1.1 agc if (rsp->status) { 731 1.1 agc status_error(rsp->status); 732 1.1 agc } 733 1.1 agc free_response(rsp); 734 1.1 agc 735 1.1 agc printf("OK\n"); 736 1.1 agc return 0; 737 1.1 agc } 738 1.1 agc 739 1.1 agc /* 740 1.1 agc * list_initiators: 741 1.1 agc * Handle the list_initiators command. 742 1.1 agc * 743 1.1 agc * Parameter: argc, argv (shifted) 744 1.1 agc * 745 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 746 1.1 agc */ 747 1.1 agc 748 1.1 agc int 749 1.1 agc list_initiators(int argc, char **argv) 750 1.1 agc { 751 1.1 agc iscsid_get_list_req_t lst; 752 1.1 agc iscsid_response_t *rsp, *prsp; 753 1.1 agc iscsid_get_list_rsp_t *list; 754 1.1 agc iscsid_get_initiator_rsp_t *init; 755 1.1 agc iscsid_sym_id_t req; 756 1.1 agc unsigned i; 757 1.1 agc 758 1.1 agc memset(&req, 0x0, sizeof(req)); 759 1.1 agc check_extra_args(argc, argv); 760 1.1 agc 761 1.1 agc /* get the list of servers */ 762 1.1 agc lst.list_kind = INITIATOR_LIST; 763 1.1 agc send_request(ISCSID_GET_LIST, sizeof(lst), &lst); 764 1.1 agc rsp = get_response(TRUE); 765 1.1 agc if (rsp->status) { 766 1.1 agc status_error(rsp->status); 767 1.1 agc } 768 1.2 christos list = (iscsid_get_list_rsp_t *)(void *)rsp->parameter; 769 1.1 agc 770 1.1 agc /* display all servers */ 771 1.1 agc for (i = 0; i < list->num_entries; i++) { 772 1.1 agc req.id = list->id[i]; 773 1.1 agc send_request(ISCSID_GET_INITIATOR_PORTAL, sizeof(req), &req); 774 1.1 agc prsp = get_response(FALSE); 775 1.1 agc if (prsp->status) { 776 1.1 agc status_error(prsp->status); 777 1.1 agc } 778 1.2 christos init = (iscsid_get_initiator_rsp_t *)(void *)prsp->parameter; 779 1.1 agc printf("%6d", init->portal_id.id); 780 1.1 agc if (init->portal_id.name[0]) { 781 1.1 agc printf("[%s]", init->portal_id.name); 782 1.1 agc } 783 1.1 agc printf(": %s\n", init->address); 784 1.1 agc free_response(prsp); 785 1.1 agc } 786 1.1 agc free_response(rsp); 787 1.1 agc return 0; 788 1.1 agc } 789 1.1 agc 790 1.1 agc 791 1.1 agc /* 792 1.1 agc * login_or_add: 793 1.1 agc * Common routine for login and add_connection. Handles the actual command, 794 1.1 agc * the only pre-initialized component is the session ID in the login request 795 1.1 agc * for add_connection. 796 1.1 agc * 797 1.1 agc * Parameters: the login request, plus argc & argv 798 1.1 agc */ 799 1.1 agc 800 1.1 agc STATIC void 801 1.1 agc login_or_add(iscsid_login_req_t * loginp, int argc, char **argv) 802 1.1 agc { 803 1.1 agc iscsid_add_target_req_t *targ = NULL; 804 1.1 agc iscsid_add_target_rsp_t *tgtrsp; 805 1.1 agc iscsid_set_target_authentication_req_t auth; 806 1.1 agc iscsid_get_set_target_options_t opt; 807 1.1 agc iscsid_search_list_req_t srch; 808 1.1 agc iscsid_response_t *rsp; 809 1.1 agc int opts, auths, tlen; 810 1.1 agc 811 1.1 agc /* get the remaining parameters */ 812 1.1 agc opts = cl_get_target_opts(&opt, argc, argv); 813 1.1 agc auths = cl_get_auth_opts(&auth, argc, argv); 814 1.1 agc cl_get_symname(loginp->sym_name, argc, argv); 815 1.1 agc cl_get_id ('i', &loginp->initiator_id, argc, argv); 816 1.1 agc 817 1.1 agc /* do we have a portal ID? */ 818 1.1 agc if (!cl_get_id('P', &loginp->portal_id, argc, argv)) { 819 1.1 agc /* No portal ID - then we must have a target name */ 820 1.1 agc if (!(tlen = cl_get_target(&targ, argc, argv, TRUE))) { 821 1.1 agc if (NO_ID(&loginp->session_id)) { 822 1.1 agc arg_missing("Target"); 823 1.1 agc } 824 1.1 agc } 825 1.1 agc 826 1.1 agc check_extra_args(argc, argv); 827 1.1 agc 828 1.1 agc if (targ != NULL) { 829 1.1 agc /* was a complete target with portal specified? */ 830 1.1 agc if (targ->num_portals) { 831 1.1 agc /* then add it like in an add_target command */ 832 1.1 agc targ->list_kind = TARGET_LIST; 833 1.1 agc send_request(ISCSID_ADD_TARGET, tlen, targ); 834 1.1 agc rsp = get_response(FALSE); 835 1.1 agc if (rsp->status) { 836 1.1 agc status_error(rsp->status); 837 1.1 agc } 838 1.1 agc tgtrsp = (iscsid_add_target_rsp_t *)(void *)(rsp->parameter); 839 1.1 agc (void) memcpy(&loginp->portal_id.id, &tgtrsp->target_id, 840 1.1 agc sizeof(loginp->portal_id.id)); 841 1.1 agc } else { 842 1.1 agc /* else find the target by its TargetName */ 843 1.1 agc srch.search_kind = FIND_TARGET_NAME; 844 1.1 agc srch.list_kind = TARGET_LIST; 845 1.1 agc strlcpy((char *)srch.strval, (char *)targ->TargetName, 846 1.1 agc sizeof(srch.strval)); 847 1.1 agc 848 1.1 agc send_request(ISCSID_SEARCH_LIST, sizeof(srch), &srch); 849 1.1 agc rsp = get_response(FALSE); 850 1.1 agc if (rsp->status) { 851 1.1 agc status_error_slist(rsp->status); 852 1.1 agc } 853 1.1 agc GET_SYM_ID(loginp->portal_id.id, rsp->parameter); 854 1.1 agc } 855 1.1 agc free_response(rsp); 856 1.1 agc } 857 1.1 agc } else 858 1.1 agc check_extra_args(argc, argv); 859 1.1 agc 860 1.1 agc /* Options specified? Then set them */ 861 1.1 agc if (opts) { 862 1.1 agc opt.target_id = loginp->portal_id; 863 1.1 agc opt.list_kind = TARGET_LIST; 864 1.1 agc send_request(ISCSID_SET_TARGET_OPTIONS, sizeof(opt), &opt); 865 1.1 agc rsp = get_response(FALSE); 866 1.1 agc if (rsp->status) { 867 1.1 agc status_error(rsp->status); 868 1.1 agc } 869 1.1 agc free_response(rsp); 870 1.1 agc } 871 1.1 agc /* Authentication options specified? Then set them */ 872 1.1 agc if (auths) { 873 1.1 agc auth.target_id = loginp->portal_id; 874 1.1 agc auth.list_kind = TARGET_LIST; 875 1.1 agc send_request(ISCSID_SET_TARGET_AUTHENTICATION, sizeof(auth), &auth); 876 1.1 agc rsp = get_response(FALSE); 877 1.1 agc if (rsp->status) { 878 1.1 agc status_error(rsp->status); 879 1.1 agc } 880 1.1 agc free_response(rsp); 881 1.1 agc } 882 1.1 agc } 883 1.1 agc 884 1.1 agc 885 1.1 agc /* 886 1.1 agc * login: 887 1.1 agc * Handle login command. 888 1.1 agc * 889 1.1 agc * Parameter: argc, argv (shifted) 890 1.1 agc * 891 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 892 1.1 agc */ 893 1.1 agc 894 1.1 agc int 895 1.1 agc login(int argc, char **argv) 896 1.1 agc { 897 1.1 agc iscsid_login_req_t loginp; 898 1.1 agc iscsid_login_rsp_t *res; 899 1.1 agc iscsid_response_t *rsp; 900 1.1 agc 901 1.1 agc memset(&loginp, 0x0, sizeof(loginp)); 902 1.1 agc loginp.login_type = (cl_get_opt('m', argc, argv)) 903 1.1 agc ? ISCSI_LOGINTYPE_NOMAP : ISCSI_LOGINTYPE_MAP; 904 1.1 agc 905 1.1 agc login_or_add(&loginp, argc, argv); 906 1.1 agc 907 1.1 agc send_request(ISCSID_LOGIN, sizeof(loginp), &loginp); 908 1.1 agc 909 1.1 agc rsp = get_response(FALSE); 910 1.1 agc if (rsp->status) { 911 1.1 agc status_error(rsp->status); 912 1.1 agc } 913 1.2 christos res = (iscsid_login_rsp_t *)(void *)rsp->parameter; 914 1.1 agc printf("Created Session %d, Connection %d\n", 915 1.1 agc res->session_id.id, res->connection_id.id); 916 1.1 agc 917 1.1 agc free_response(rsp); 918 1.1 agc return 0; 919 1.1 agc } 920 1.1 agc 921 1.1 agc 922 1.1 agc /* 923 1.1 agc * logout: 924 1.1 agc * Handle logout command. 925 1.1 agc * 926 1.1 agc * Parameter: argc, argv (shifted) 927 1.1 agc * 928 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 929 1.1 agc */ 930 1.1 agc 931 1.1 agc int 932 1.1 agc logout(int argc, char **argv) 933 1.1 agc { 934 1.1 agc iscsid_sym_id_t req; 935 1.1 agc iscsid_response_t *rsp; 936 1.1 agc 937 1.1 agc if (!cl_get_id('I', &req, argc, argv)) { 938 1.1 agc arg_missing("Session"); 939 1.1 agc } 940 1.1 agc check_extra_args(argc, argv); 941 1.1 agc 942 1.1 agc send_request(ISCSID_LOGOUT, sizeof(req), &req); 943 1.1 agc rsp = get_response(FALSE); 944 1.1 agc if (rsp->status) { 945 1.1 agc status_error(rsp->status); 946 1.1 agc } 947 1.1 agc free_response(rsp); 948 1.1 agc 949 1.1 agc printf("OK\n"); 950 1.1 agc return 0; 951 1.1 agc } 952 1.1 agc 953 1.1 agc 954 1.1 agc /* 955 1.1 agc * add_connection: 956 1.1 agc * Handle add_connection command. 957 1.1 agc * 958 1.1 agc * Parameter: argc, argv (shifted) 959 1.1 agc * 960 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 961 1.1 agc */ 962 1.1 agc 963 1.1 agc int 964 1.1 agc add_connection(int argc, char **argv) 965 1.1 agc { 966 1.1 agc iscsid_login_req_t loginp; 967 1.1 agc iscsid_login_rsp_t *loginrsp; 968 1.1 agc iscsid_response_t *rsp; 969 1.1 agc 970 1.1 agc memset(&loginp, 0x0, sizeof(loginp)); 971 1.1 agc loginp.login_type = ISCSI_LOGINTYPE_MAP; 972 1.1 agc cl_get_id('I', &loginp.session_id, argc, argv); 973 1.1 agc 974 1.1 agc login_or_add(&loginp, argc, argv); 975 1.1 agc 976 1.1 agc send_request(ISCSID_ADD_CONNECTION, sizeof(loginp), &loginp); 977 1.1 agc 978 1.1 agc rsp = get_response(FALSE); 979 1.1 agc if (rsp->status) { 980 1.1 agc status_error(rsp->status); 981 1.1 agc } 982 1.1 agc loginrsp = (iscsid_login_rsp_t *)(void *)(rsp->parameter); 983 1.1 agc printf("Added Connection %d\n", loginrsp->connection_id.id); 984 1.1 agc 985 1.1 agc free_response(rsp); 986 1.1 agc return 0; 987 1.1 agc } 988 1.1 agc 989 1.1 agc 990 1.1 agc /* 991 1.1 agc * remove_connection: 992 1.1 agc * Handle remove connection command 993 1.1 agc * 994 1.1 agc * Parameter: argc, argv (shifted) 995 1.1 agc * 996 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 997 1.1 agc */ 998 1.1 agc 999 1.1 agc int 1000 1.1 agc remove_connection(int argc, char **argv) 1001 1.1 agc { 1002 1.1 agc iscsid_remove_connection_req_t req; 1003 1.1 agc iscsid_response_t *rsp; 1004 1.1 agc 1005 1.1 agc if (!cl_get_id('I', &req.session_id, argc, argv)) { 1006 1.1 agc arg_missing("Session"); 1007 1.1 agc } 1008 1.1 agc if (!cl_get_id('C', &req.connection_id, argc, argv)) { 1009 1.1 agc arg_missing("Connection"); 1010 1.1 agc } 1011 1.1 agc check_extra_args(argc, argv); 1012 1.1 agc 1013 1.1 agc send_request(ISCSID_REMOVE_CONNECTION, sizeof(req), &req); 1014 1.1 agc rsp = get_response(FALSE); 1015 1.1 agc if (rsp->status) { 1016 1.1 agc status_error(rsp->status); 1017 1.1 agc } 1018 1.1 agc free_response(rsp); 1019 1.1 agc 1020 1.1 agc printf("OK\n"); 1021 1.1 agc return 0; 1022 1.1 agc } 1023 1.1 agc 1024 1.1 agc 1025 1.1 agc /* 1026 1.1 agc * list_sessions: 1027 1.1 agc * Handle list_sessions command. 1028 1.1 agc * 1029 1.1 agc * Parameter: argc, argv (shifted) 1030 1.1 agc * 1031 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 1032 1.1 agc * 1033 1.1 agc * ToDo: initiator portals, connection recurse 1034 1.1 agc */ 1035 1.1 agc 1036 1.1 agc int 1037 1.1 agc list_sessions(int argc, char **argv) 1038 1.1 agc { 1039 1.1 agc iscsid_response_t *lrsp, *rsp; 1040 1.1 agc iscsid_get_session_list_rsp_t *list; 1041 1.1 agc iscsid_session_list_entry_t *ent; 1042 1.1 agc iscsid_get_connection_info_req_t creq; 1043 1.1 agc iscsid_get_connection_info_rsp_t *info; 1044 1.1 agc iscsid_sym_id_t clreq; 1045 1.1 agc iscsid_get_connection_list_rsp_t *clinfo; 1046 1.1 agc iscsid_connection_list_entry_t *clent; 1047 1.1 agc unsigned i; 1048 1.1 agc unsigned j; 1049 1.1 agc int lconn; 1050 1.1 agc 1051 1.1 agc memset(&creq, 0x0, sizeof(creq)); 1052 1.1 agc memset(&clreq, 0x0, sizeof(clreq)); 1053 1.1 agc lconn = cl_get_opt('c', argc, argv); 1054 1.1 agc 1055 1.1 agc check_extra_args(argc, argv); 1056 1.1 agc 1057 1.1 agc send_request(ISCSID_GET_SESSION_LIST, 0, NULL); 1058 1.1 agc lrsp = get_response(TRUE); 1059 1.1 agc if (lrsp->status) { 1060 1.1 agc status_error(lrsp->status); 1061 1.1 agc } 1062 1.2 christos list = (iscsid_get_session_list_rsp_t *)(void *)lrsp->parameter; 1063 1.1 agc 1064 1.1 agc for (i = 0, ent = list->session; i < list->num_entries; i++, ent++) { 1065 1.1 agc creq.session_id.id = ent->session_id.id; 1066 1.1 agc send_request(ISCSID_GET_CONNECTION_INFO, sizeof(creq), &creq); 1067 1.1 agc rsp = get_response(FALSE); 1068 1.1 agc if (rsp->status) { 1069 1.1 agc status_error(rsp->status); 1070 1.1 agc } 1071 1.2 christos info = (iscsid_get_connection_info_rsp_t *)(void *)rsp->parameter; 1072 1.1 agc 1073 1.1 agc printf("Session %d", info->session_id.id); 1074 1.1 agc if (info->session_id.name[0]) { 1075 1.1 agc printf("[%s]", info->session_id.name); 1076 1.1 agc } 1077 1.1 agc printf(": Target %s", info->TargetName); 1078 1.1 agc if (info->target_portal_id.name[0]) { 1079 1.1 agc printf(" [%s]", info->target_portal_id.name); 1080 1.1 agc } 1081 1.1 agc printf("\n"); 1082 1.1 agc 1083 1.1 agc if (lconn) { 1084 1.1 agc clreq.id = info->session_id.id; 1085 1.1 agc send_request(ISCSID_GET_CONNECTION_LIST, sizeof(clreq), &clreq); 1086 1.1 agc rsp = get_response(FALSE); 1087 1.1 agc if (rsp->status) { 1088 1.1 agc status_error(rsp->status); 1089 1.1 agc } 1090 1.2 christos clinfo = (iscsid_get_connection_list_rsp_t *)(void *)rsp->parameter; 1091 1.1 agc 1092 1.1 agc for (j = 0, clent = clinfo->connection; 1093 1.1 agc j < clinfo->num_connections; j++, clent++) { 1094 1.1 agc printf(" Connection %d", clent->connection_id.id); 1095 1.1 agc if (clent->connection_id.name[0]) { 1096 1.1 agc printf("[%s]", clent->connection_id.name); 1097 1.1 agc } 1098 1.1 agc printf(" Address %s:%d,%d\n", clent->target_portal.address, 1099 1.1 agc clent->target_portal.port, 1100 1.1 agc clent->target_portal.group_tag); 1101 1.1 agc } 1102 1.1 agc } 1103 1.1 agc } 1104 1.1 agc 1105 1.1 agc return 0; 1106 1.1 agc } 1107 1.1 agc 1108 1.1 agc 1109 1.1 agc /* 1110 1.1 agc * set_node_name: 1111 1.1 agc * Handle the set_node_name command. 1112 1.1 agc * 1113 1.1 agc * Parameter: argc, argv (shifted) 1114 1.1 agc * 1115 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 1116 1.1 agc */ 1117 1.1 agc 1118 1.1 agc int 1119 1.1 agc set_node_name(int argc, char **argv) 1120 1.1 agc { 1121 1.1 agc iscsid_set_node_name_req_t req; 1122 1.1 agc iscsid_response_t *rsp; 1123 1.1 agc uint64_t isid; 1124 1.1 agc 1125 1.1 agc memset(&req, 0x0, sizeof(req)); 1126 1.1 agc if (!cl_get_string('n', (char *)req.InitiatorName, argc, argv)) { 1127 1.1 agc arg_missing("Initiator Name"); 1128 1.1 agc } 1129 1.1 agc cl_get_string('A', (char *)req.InitiatorAlias, argc, argv); 1130 1.1 agc isid = cl_get_longlong('i', argc, argv); 1131 1.1 agc hton6(req.ISID, isid); 1132 1.1 agc 1133 1.1 agc check_extra_args(argc, argv); 1134 1.1 agc 1135 1.1 agc send_request(ISCSID_SET_NODE_NAME, sizeof(req), &req); 1136 1.1 agc 1137 1.1 agc rsp = get_response(FALSE); 1138 1.1 agc if (rsp->status) { 1139 1.1 agc status_error(rsp->status); 1140 1.1 agc } 1141 1.1 agc free_response(rsp); 1142 1.1 agc 1143 1.1 agc printf("OK\n"); 1144 1.1 agc return 0; 1145 1.1 agc } 1146 1.1 agc 1147 1.1 agc /* 1148 1.1 agc * get_version: 1149 1.1 agc * Handle the version command. 1150 1.1 agc * 1151 1.1 agc * Parameter: argc, argv (shifted) 1152 1.1 agc * 1153 1.1 agc * Returns: 0 if OK - else it doesn't return at all. 1154 1.1 agc */ 1155 1.1 agc 1156 1.1 agc int 1157 1.2 christos /*ARGSUSED*/ 1158 1.1 agc get_version(int argc, char **argv) 1159 1.1 agc { 1160 1.1 agc iscsid_response_t *rsp; 1161 1.1 agc iscsid_get_version_rsp_t *ver; 1162 1.1 agc 1163 1.1 agc send_request(ISCSID_GET_VERSION, 0, NULL); 1164 1.1 agc rsp = get_response(FALSE); 1165 1.1 agc if (rsp->status) { 1166 1.1 agc status_error(rsp->status); 1167 1.1 agc } 1168 1.2 christos ver = (iscsid_get_version_rsp_t *)(void *)rsp->parameter; 1169 1.1 agc printf("%s\n%s\n%s\n", VERSION_STRING, ver->version_string, 1170 1.1 agc ver->driver_version_string); 1171 1.1 agc 1172 1.1 agc return 0; 1173 1.1 agc } 1174