dladm.c (c7e4935f) dladm.c (f595a68a)
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE

--- 32 unchanged lines hidden (view full) ---

41#include <unistd.h>
42#include <priv.h>
43#include <termios.h>
44#include <pwd.h>
45#include <auth_attr.h>
46#include <auth_list.h>
47#include <libintl.h>
48#include <libdlpi.h>
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE

--- 32 unchanged lines hidden (view full) ---

41#include <unistd.h>
42#include <priv.h>
43#include <termios.h>
44#include <pwd.h>
45#include <auth_attr.h>
46#include <auth_list.h>
47#include <libintl.h>
48#include <libdlpi.h>
49#include <libdladm.h>
50#include <liblaadm.h>
51#include <libmacadm.h>
52#include <libwladm.h>
49#include <libdllink.h>
50#include <libdlaggr.h>
51#include <libdlwlan.h>
53#include <libinetutil.h>
54#include <bsm/adt.h>
55#include <bsm/adt_event.h>
56
57#define AGGR_DRV "aggr"
58#define MAXPORT 256
59#define DUMP_LACP_FORMAT " %-9s %-8s %-7s %-12s " \
60 "%-5s %-4s %-4s %-9s %-7s\n"

--- 27 unchanged lines hidden (view full) ---

88
89typedef struct show_mac_state {
90 boolean_t ms_firstonly;
91 boolean_t ms_donefirst;
92 pktsum_t ms_prevstats;
93 boolean_t ms_parseable;
94} show_mac_state_t;
95
52#include <libinetutil.h>
53#include <bsm/adt.h>
54#include <bsm/adt_event.h>
55
56#define AGGR_DRV "aggr"
57#define MAXPORT 256
58#define DUMP_LACP_FORMAT " %-9s %-8s %-7s %-12s " \
59 "%-5s %-4s %-4s %-9s %-7s\n"

--- 27 unchanged lines hidden (view full) ---

87
88typedef struct show_mac_state {
89 boolean_t ms_firstonly;
90 boolean_t ms_donefirst;
91 pktsum_t ms_prevstats;
92 boolean_t ms_parseable;
93} show_mac_state_t;
94
96typedef struct port_state {
97 char *state_name;
98 aggr_port_state_t state_num;
99} port_state_t;
100
101static port_state_t port_states[] = {
102 {"standby", AGGR_PORT_STATE_STANDBY },
103 {"attached", AGGR_PORT_STATE_ATTACHED }
104};
105
106#define NPORTSTATES (sizeof (port_states) / sizeof (port_state_t))
107
108typedef void cmdfunc_t(int, char **);
109
110static cmdfunc_t do_show_link, do_show_dev, do_show_wifi;
111static cmdfunc_t do_create_aggr, do_delete_aggr, do_add_aggr, do_remove_aggr;
112static cmdfunc_t do_modify_aggr, do_show_aggr, do_up_aggr, do_down_aggr;
113static cmdfunc_t do_scan_wifi, do_connect_wifi, do_disconnect_wifi;
114static cmdfunc_t do_show_linkprop, do_set_linkprop, do_reset_linkprop;
115static cmdfunc_t do_create_secobj, do_delete_secobj, do_show_secobj;
116static cmdfunc_t do_init_linkprop, do_init_secobj;
117
118static void show_linkprop_onelink(void *, const char *);
119
120static void link_stats(const char *, uint_t);
121static void aggr_stats(uint32_t, uint_t);
122static void dev_stats(const char *dev, uint32_t);
123
124static void get_mac_stats(const char *, pktsum_t *);
125static void get_link_stats(const char *, pktsum_t *);
126static uint64_t mac_ifspeed(const char *);
95typedef void cmdfunc_t(int, char **);
96
97static cmdfunc_t do_show_link, do_show_dev, do_show_wifi;
98static cmdfunc_t do_create_aggr, do_delete_aggr, do_add_aggr, do_remove_aggr;
99static cmdfunc_t do_modify_aggr, do_show_aggr, do_up_aggr, do_down_aggr;
100static cmdfunc_t do_scan_wifi, do_connect_wifi, do_disconnect_wifi;
101static cmdfunc_t do_show_linkprop, do_set_linkprop, do_reset_linkprop;
102static cmdfunc_t do_create_secobj, do_delete_secobj, do_show_secobj;
103static cmdfunc_t do_init_linkprop, do_init_secobj;
104
105static void show_linkprop_onelink(void *, const char *);
106
107static void link_stats(const char *, uint_t);
108static void aggr_stats(uint32_t, uint_t);
109static void dev_stats(const char *dev, uint32_t);
110
111static void get_mac_stats(const char *, pktsum_t *);
112static void get_link_stats(const char *, pktsum_t *);
113static uint64_t mac_ifspeed(const char *);
127static char *mac_link_state(const char *);
128static char *mac_link_duplex(const char *);
129static void stats_total(pktsum_t *, pktsum_t *, pktsum_t *);
130static void stats_diff(pktsum_t *, pktsum_t *, pktsum_t *);
114static void stats_total(pktsum_t *, pktsum_t *, pktsum_t *);
115static void stats_diff(pktsum_t *, pktsum_t *, pktsum_t *);
116static const char *mac_link_state(const char *);
117static const char *mac_link_duplex(const char *);
131
132static boolean_t str2int(const char *, int *);
133static void die(const char *, ...);
134static void die_optdup(int);
135static void die_opterr(int, int);
118
119static boolean_t str2int(const char *, int *);
120static void die(const char *, ...);
121static void die_optdup(int);
122static void die_opterr(int, int);
136static void die_laerr(laadm_diag_t, const char *, ...);
137static void die_wlerr(wladm_status_t, const char *, ...);
138static void die_dlerr(dladm_status_t, const char *, ...);
139static void warn(const char *, ...);
123static void die_dlerr(dladm_status_t, const char *, ...);
124static void warn(const char *, ...);
140static void warn_wlerr(wladm_status_t, const char *, ...);
141static void warn_dlerr(dladm_status_t, const char *, ...);
142
143typedef struct cmd {
144 char *c_name;
145 cmdfunc_t *c_fn;
146} cmd_t;
147
148static cmd_t cmds[] = {

--- 138 unchanged lines hidden (view full) ---

287 usage();
288
289 return (0);
290}
291
292static void
293do_create_aggr(int argc, char *argv[])
294{
125static void warn_dlerr(dladm_status_t, const char *, ...);
126
127typedef struct cmd {
128 char *c_name;
129 cmdfunc_t *c_fn;
130} cmd_t;
131
132static cmd_t cmds[] = {

--- 138 unchanged lines hidden (view full) ---

271 usage();
272
273 return (0);
274}
275
276static void
277do_create_aggr(int argc, char *argv[])
278{
295 char option;
296 int key;
297 uint32_t policy = AGGR_POLICY_L4;
298 aggr_lacp_mode_t lacp_mode = AGGR_LACP_OFF;
299 aggr_lacp_timer_t lacp_timer = AGGR_LACP_TIMER_SHORT;
300 laadm_port_attr_db_t port[MAXPORT];
301 uint_t nport = 0;
302 uint8_t mac_addr[ETHERADDRL];
303 boolean_t mac_addr_fixed = B_FALSE;
304 boolean_t P_arg = B_FALSE;
305 boolean_t l_arg = B_FALSE;
306 boolean_t t_arg = B_FALSE;
307 boolean_t u_arg = B_FALSE;
308 boolean_t T_arg = B_FALSE;
309 char *altroot = NULL;
310 laadm_diag_t diag = 0;
279 char option;
280 int key;
281 uint32_t policy = AGGR_POLICY_L4;
282 aggr_lacp_mode_t lacp_mode = AGGR_LACP_OFF;
283 aggr_lacp_timer_t lacp_timer = AGGR_LACP_TIMER_SHORT;
284 dladm_aggr_port_attr_db_t port[MAXPORT];
285 uint_t nport = 0;
286 uint8_t mac_addr[ETHERADDRL];
287 boolean_t mac_addr_fixed = B_FALSE;
288 boolean_t P_arg = B_FALSE;
289 boolean_t l_arg = B_FALSE;
290 boolean_t t_arg = B_FALSE;
291 boolean_t u_arg = B_FALSE;
292 boolean_t T_arg = B_FALSE;
293 char *altroot = NULL;
294 dladm_status_t status;
311
312 opterr = 0;
313 while ((option = getopt_long(argc, argv, ":d:l:P:R:tu:T:",
314 longopts, NULL)) != -1) {
315 switch (option) {
316 case 'd':
317 if (nport >= MAXPORT)
318 die("too many <dev> arguments");

--- 4 unchanged lines hidden (view full) ---

323
324 nport++;
325 break;
326 case 'P':
327 if (P_arg)
328 die_optdup(option);
329
330 P_arg = B_TRUE;
295
296 opterr = 0;
297 while ((option = getopt_long(argc, argv, ":d:l:P:R:tu:T:",
298 longopts, NULL)) != -1) {
299 switch (option) {
300 case 'd':
301 if (nport >= MAXPORT)
302 die("too many <dev> arguments");

--- 4 unchanged lines hidden (view full) ---

307
308 nport++;
309 break;
310 case 'P':
311 if (P_arg)
312 die_optdup(option);
313
314 P_arg = B_TRUE;
331 if (!laadm_str_to_policy(optarg, &policy))
315 if (!dladm_aggr_str2policy(optarg, &policy))
332 die("invalid policy '%s'", optarg);
333 break;
334 case 'u':
335 if (u_arg)
336 die_optdup(option);
337
338 u_arg = B_TRUE;
316 die("invalid policy '%s'", optarg);
317 break;
318 case 'u':
319 if (u_arg)
320 die_optdup(option);
321
322 u_arg = B_TRUE;
339 if (!laadm_str_to_mac_addr(optarg, &mac_addr_fixed,
323 if (!dladm_aggr_str2macaddr(optarg, &mac_addr_fixed,
340 mac_addr))
341 die("invalid MAC address '%s'", optarg);
342 break;
343 case 'l':
344 if (l_arg)
345 die_optdup(option);
346
347 l_arg = B_TRUE;
324 mac_addr))
325 die("invalid MAC address '%s'", optarg);
326 break;
327 case 'l':
328 if (l_arg)
329 die_optdup(option);
330
331 l_arg = B_TRUE;
348 if (!laadm_str_to_lacp_mode(optarg, &lacp_mode))
332 if (!dladm_aggr_str2lacpmode(optarg, &lacp_mode))
349 die("invalid LACP mode '%s'", optarg);
350 break;
351 case 'T':
352 if (T_arg)
353 die_optdup(option);
354
355 T_arg = B_TRUE;
333 die("invalid LACP mode '%s'", optarg);
334 break;
335 case 'T':
336 if (T_arg)
337 die_optdup(option);
338
339 T_arg = B_TRUE;
356 if (!laadm_str_to_lacp_timer(optarg, &lacp_timer))
340 if (!dladm_aggr_str2lacptimer(optarg, &lacp_timer))
357 die("invalid LACP timer value '%s'", optarg);
358 break;
359 case 't':
360 t_arg = B_TRUE;
361 break;
362 case 'R':
363 altroot = optarg;
364 break;

--- 8 unchanged lines hidden (view full) ---

373
374 /* get key value (required last argument) */
375 if (optind != (argc-1))
376 usage();
377
378 if (!str2int(argv[optind], &key) || key < 1)
379 die("invalid key value '%s'", argv[optind]);
380
341 die("invalid LACP timer value '%s'", optarg);
342 break;
343 case 't':
344 t_arg = B_TRUE;
345 break;
346 case 'R':
347 altroot = optarg;
348 break;

--- 8 unchanged lines hidden (view full) ---

357
358 /* get key value (required last argument) */
359 if (optind != (argc-1))
360 usage();
361
362 if (!str2int(argv[optind], &key) || key < 1)
363 die("invalid key value '%s'", argv[optind]);
364
381 if (laadm_create(key, nport, port, policy, mac_addr_fixed,
382 mac_addr, lacp_mode, lacp_timer, t_arg, altroot, &diag) < 0)
383 die_laerr(diag, "create operation failed");
365 status = dladm_aggr_create(key, nport, port, policy, mac_addr_fixed,
366 mac_addr, lacp_mode, lacp_timer, t_arg, altroot);
367 if (status != DLADM_STATUS_OK)
368 die_dlerr(status, "create operation failed");
384}
385
386static void
387do_delete_aggr(int argc, char *argv[])
388{
389 int key;
390 char option;
391 boolean_t t_arg = B_FALSE;
392 char *altroot = NULL;
369}
370
371static void
372do_delete_aggr(int argc, char *argv[])
373{
374 int key;
375 char option;
376 boolean_t t_arg = B_FALSE;
377 char *altroot = NULL;
393 laadm_diag_t diag = 0;
378 dladm_status_t status;
394
395 opterr = 0;
396 while ((option = getopt_long(argc, argv, ":R:t", longopts,
397 NULL)) != -1) {
398 switch (option) {
399 case 't':
400 t_arg = B_TRUE;
401 break;

--- 8 unchanged lines hidden (view full) ---

410
411 /* get key value (required last argument) */
412 if (optind != (argc-1))
413 usage();
414
415 if (!str2int(argv[optind], &key) || key < 1)
416 die("invalid key value '%s'", argv[optind]);
417
379
380 opterr = 0;
381 while ((option = getopt_long(argc, argv, ":R:t", longopts,
382 NULL)) != -1) {
383 switch (option) {
384 case 't':
385 t_arg = B_TRUE;
386 break;

--- 8 unchanged lines hidden (view full) ---

395
396 /* get key value (required last argument) */
397 if (optind != (argc-1))
398 usage();
399
400 if (!str2int(argv[optind], &key) || key < 1)
401 die("invalid key value '%s'", argv[optind]);
402
418 if (laadm_delete(key, t_arg, altroot, &diag) < 0)
419 die_laerr(diag, "delete operation failed");
403 status = dladm_aggr_delete(key, t_arg, altroot);
404 if (status != DLADM_STATUS_OK)
405 die_dlerr(status, "delete operation failed");
420}
421
422static void
423do_add_aggr(int argc, char *argv[])
424{
406}
407
408static void
409do_add_aggr(int argc, char *argv[])
410{
425 char option;
426 int key;
427 laadm_port_attr_db_t port[MAXPORT];
428 uint_t nport = 0;
429 boolean_t t_arg = B_FALSE;
430 char *altroot = NULL;
431 laadm_diag_t diag = 0;
411 char option;
412 int key;
413 dladm_aggr_port_attr_db_t port[MAXPORT];
414 uint_t nport = 0;
415 boolean_t t_arg = B_FALSE;
416 char *altroot = NULL;
417 dladm_status_t status;
432
433 opterr = 0;
434 while ((option = getopt_long(argc, argv, ":d:R:t", longopts,
435 NULL)) != -1) {
436 switch (option) {
437 case 'd':
438 if (nport >= MAXPORT)
439 die("too many <dev> arguments");

--- 21 unchanged lines hidden (view full) ---

461
462 /* get key value (required last argument) */
463 if (optind != (argc-1))
464 usage();
465
466 if (!str2int(argv[optind], &key) || key < 1)
467 die("invalid key value '%s'", argv[optind]);
468
418
419 opterr = 0;
420 while ((option = getopt_long(argc, argv, ":d:R:t", longopts,
421 NULL)) != -1) {
422 switch (option) {
423 case 'd':
424 if (nport >= MAXPORT)
425 die("too many <dev> arguments");

--- 21 unchanged lines hidden (view full) ---

447
448 /* get key value (required last argument) */
449 if (optind != (argc-1))
450 usage();
451
452 if (!str2int(argv[optind], &key) || key < 1)
453 die("invalid key value '%s'", argv[optind]);
454
469 if (laadm_add(key, nport, port, t_arg, altroot, &diag) < 0) {
455 status = dladm_aggr_add(key, nport, port, t_arg, altroot);
456 if (status != DLADM_STATUS_OK) {
470 /*
457 /*
471 * checking ENOTSUP is a temporary workaround
458 * checking DLADM_STATUS_NOTSUP is a temporary workaround
472 * and should be removed once 6399681 is fixed.
473 */
459 * and should be removed once 6399681 is fixed.
460 */
474 if (errno == ENOTSUP) {
461 if (status == DLADM_STATUS_NOTSUP) {
475 (void) fprintf(stderr,
476 gettext("%s: add operation failed: %s\n"),
477 progname,
478 gettext("device capabilities don't match"));
479 exit(ENOTSUP);
480 }
462 (void) fprintf(stderr,
463 gettext("%s: add operation failed: %s\n"),
464 progname,
465 gettext("device capabilities don't match"));
466 exit(ENOTSUP);
467 }
481 die_laerr(diag, "add operation failed");
468 die_dlerr(status, "add operation failed");
482 }
483}
484
485static void
486do_remove_aggr(int argc, char *argv[])
487{
469 }
470}
471
472static void
473do_remove_aggr(int argc, char *argv[])
474{
488 char option;
489 int key;
490 laadm_port_attr_db_t port[MAXPORT];
491 uint_t nport = 0;
492 boolean_t t_arg = B_FALSE;
493 char *altroot = NULL;
494 laadm_diag_t diag = 0;
475 char option;
476 int key;
477 dladm_aggr_port_attr_db_t port[MAXPORT];
478 uint_t nport = 0;
479 boolean_t t_arg = B_FALSE;
480 char *altroot = NULL;
481 dladm_status_t status;
495
496 opterr = 0;
497 while ((option = getopt_long(argc, argv, ":d:R:t",
498 longopts, NULL)) != -1) {
499 switch (option) {
500 case 'd':
501 if (nport >= MAXPORT)
502 die("too many <dev> arguments");

--- 21 unchanged lines hidden (view full) ---

524
525 /* get key value (required last argument) */
526 if (optind != (argc-1))
527 usage();
528
529 if (!str2int(argv[optind], &key) || key < 1)
530 die("invalid key value '%s'", argv[optind]);
531
482
483 opterr = 0;
484 while ((option = getopt_long(argc, argv, ":d:R:t",
485 longopts, NULL)) != -1) {
486 switch (option) {
487 case 'd':
488 if (nport >= MAXPORT)
489 die("too many <dev> arguments");

--- 21 unchanged lines hidden (view full) ---

511
512 /* get key value (required last argument) */
513 if (optind != (argc-1))
514 usage();
515
516 if (!str2int(argv[optind], &key) || key < 1)
517 die("invalid key value '%s'", argv[optind]);
518
532 if (laadm_remove(key, nport, port, t_arg, altroot, &diag) < 0)
533 die_laerr(diag, "remove operation failed");
519 status = dladm_aggr_remove(key, nport, port, t_arg, altroot);
520 if (status != DLADM_STATUS_OK)
521 die_dlerr(status, "remove operation failed");
534}
535
536static void
537do_modify_aggr(int argc, char *argv[])
538{
539 char option;
540 int key;
541 uint32_t policy = AGGR_POLICY_L4;
542 aggr_lacp_mode_t lacp_mode = AGGR_LACP_OFF;
543 aggr_lacp_timer_t lacp_timer = AGGR_LACP_TIMER_SHORT;
544 uint8_t mac_addr[ETHERADDRL];
545 boolean_t mac_addr_fixed = B_FALSE;
546 uint8_t modify_mask = 0;
547 boolean_t t_arg = B_FALSE;
548 char *altroot = NULL;
522}
523
524static void
525do_modify_aggr(int argc, char *argv[])
526{
527 char option;
528 int key;
529 uint32_t policy = AGGR_POLICY_L4;
530 aggr_lacp_mode_t lacp_mode = AGGR_LACP_OFF;
531 aggr_lacp_timer_t lacp_timer = AGGR_LACP_TIMER_SHORT;
532 uint8_t mac_addr[ETHERADDRL];
533 boolean_t mac_addr_fixed = B_FALSE;
534 uint8_t modify_mask = 0;
535 boolean_t t_arg = B_FALSE;
536 char *altroot = NULL;
549 laadm_diag_t diag = 0;
537 dladm_status_t status;
550
551 opterr = 0;
552 while ((option = getopt_long(argc, argv, ":l:P:R:tu:T:", longopts,
553 NULL)) != -1) {
554 switch (option) {
555 case 'P':
538
539 opterr = 0;
540 while ((option = getopt_long(argc, argv, ":l:P:R:tu:T:", longopts,
541 NULL)) != -1) {
542 switch (option) {
543 case 'P':
556 if (modify_mask & LAADM_MODIFY_POLICY)
544 if (modify_mask & DLADM_AGGR_MODIFY_POLICY)
557 die_optdup(option);
558
545 die_optdup(option);
546
559 modify_mask |= LAADM_MODIFY_POLICY;
547 modify_mask |= DLADM_AGGR_MODIFY_POLICY;
560
548
561 if (!laadm_str_to_policy(optarg, &policy))
549 if (!dladm_aggr_str2policy(optarg, &policy))
562 die("invalid policy '%s'", optarg);
563 break;
564 case 'u':
550 die("invalid policy '%s'", optarg);
551 break;
552 case 'u':
565 if (modify_mask & LAADM_MODIFY_MAC)
553 if (modify_mask & DLADM_AGGR_MODIFY_MAC)
566 die_optdup(option);
567
554 die_optdup(option);
555
568 modify_mask |= LAADM_MODIFY_MAC;
556 modify_mask |= DLADM_AGGR_MODIFY_MAC;
569
557
570 if (!laadm_str_to_mac_addr(optarg, &mac_addr_fixed,
558 if (!dladm_aggr_str2macaddr(optarg, &mac_addr_fixed,
571 mac_addr))
572 die("invalid MAC address '%s'", optarg);
573 break;
574 case 'l':
559 mac_addr))
560 die("invalid MAC address '%s'", optarg);
561 break;
562 case 'l':
575 if (modify_mask & LAADM_MODIFY_LACP_MODE)
563 if (modify_mask & DLADM_AGGR_MODIFY_LACP_MODE)
576 die_optdup(option);
577
564 die_optdup(option);
565
578 modify_mask |= LAADM_MODIFY_LACP_MODE;
566 modify_mask |= DLADM_AGGR_MODIFY_LACP_MODE;
579
567
580 if (!laadm_str_to_lacp_mode(optarg, &lacp_mode))
568 if (!dladm_aggr_str2lacpmode(optarg, &lacp_mode))
581 die("invalid LACP mode '%s'", optarg);
582 break;
583 case 'T':
569 die("invalid LACP mode '%s'", optarg);
570 break;
571 case 'T':
584 if (modify_mask & LAADM_MODIFY_LACP_TIMER)
572 if (modify_mask & DLADM_AGGR_MODIFY_LACP_TIMER)
585 die_optdup(option);
586
573 die_optdup(option);
574
587 modify_mask |= LAADM_MODIFY_LACP_TIMER;
575 modify_mask |= DLADM_AGGR_MODIFY_LACP_TIMER;
588
576
589 if (!laadm_str_to_lacp_timer(optarg, &lacp_timer))
577 if (!dladm_aggr_str2lacptimer(optarg, &lacp_timer))
590 die("invalid LACP timer value '%s'", optarg);
591 break;
592 case 't':
593 t_arg = B_TRUE;
594 break;
595 case 'R':
596 altroot = optarg;
597 break;

--- 8 unchanged lines hidden (view full) ---

606
607 /* get key value (required last argument) */
608 if (optind != (argc-1))
609 usage();
610
611 if (!str2int(argv[optind], &key) || key < 1)
612 die("invalid key value '%s'", argv[optind]);
613
578 die("invalid LACP timer value '%s'", optarg);
579 break;
580 case 't':
581 t_arg = B_TRUE;
582 break;
583 case 'R':
584 altroot = optarg;
585 break;

--- 8 unchanged lines hidden (view full) ---

594
595 /* get key value (required last argument) */
596 if (optind != (argc-1))
597 usage();
598
599 if (!str2int(argv[optind], &key) || key < 1)
600 die("invalid key value '%s'", argv[optind]);
601
614 if (laadm_modify(key, modify_mask, policy, mac_addr_fixed, mac_addr,
615 lacp_mode, lacp_timer, t_arg, altroot, &diag) < 0)
616 die_laerr(diag, "modify operation failed");
602 status = dladm_aggr_modify(key, modify_mask, policy, mac_addr_fixed,
603 mac_addr, lacp_mode, lacp_timer, t_arg, altroot);
604 if (status != DLADM_STATUS_OK)
605 die_dlerr(status, "modify operation failed");
617}
618
619static void
620do_up_aggr(int argc, char *argv[])
621{
622 int key = 0;
606}
607
608static void
609do_up_aggr(int argc, char *argv[])
610{
611 int key = 0;
623 laadm_diag_t diag = 0;
612 dladm_status_t status;
624
625 /* get aggregation key (optional last argument) */
626 if (argc == 2) {
627 if (!str2int(argv[1], &key) || key < 1)
628 die("invalid key value '%s'", argv[1]);
629 } else if (argc > 2) {
630 usage();
631 }
632
613
614 /* get aggregation key (optional last argument) */
615 if (argc == 2) {
616 if (!str2int(argv[1], &key) || key < 1)
617 die("invalid key value '%s'", argv[1]);
618 } else if (argc > 2) {
619 usage();
620 }
621
633 if (laadm_up(key, NULL, &diag) < 0) {
622 if ((status = dladm_aggr_up(key, NULL)) != DLADM_STATUS_OK) {
634 if (key != 0) {
623 if (key != 0) {
635 die_laerr(diag, "could not bring up aggregation '%u'",
624 die_dlerr(status, "could not bring up aggregation '%u'",
636 key);
637 } else {
625 key);
626 } else {
638 die_laerr(diag, "could not bring aggregations up");
627 die_dlerr(status, "could not bring aggregations up");
639 }
640 }
641}
642
643static void
644do_down_aggr(int argc, char *argv[])
645{
628 }
629 }
630}
631
632static void
633do_down_aggr(int argc, char *argv[])
634{
646 int key = 0;
635 dladm_status_t status;
636 int key = 0;
647
648 /* get aggregation key (optional last argument) */
649 if (argc == 2) {
650 if (!str2int(argv[1], &key) || key < 1)
651 die("invalid key value '%s'", argv[1]);
652 } else if (argc > 2) {
653 usage();
654 }
655
637
638 /* get aggregation key (optional last argument) */
639 if (argc == 2) {
640 if (!str2int(argv[1], &key) || key < 1)
641 die("invalid key value '%s'", argv[1]);
642 } else if (argc > 2) {
643 usage();
644 }
645
656 if (laadm_down(key) < 0) {
646 if ((status = dladm_aggr_down(key)) != DLADM_STATUS_OK) {
657 if (key != 0) {
647 if (key != 0) {
658 die("could not bring down aggregation '%u': %s",
659 key, strerror(errno));
648 die_dlerr(status,
649 "could not bring down aggregation '%u'", key);
660 } else {
650 } else {
661 die("could not bring down aggregations: %s",
662 strerror(errno));
651 die_dlerr(status, "could not bring down aggregations");
663 }
664 }
665}
666
667#define TYPE_WIDTH 10
668
669static void
670print_link_parseable(const char *name, dladm_attr_t *dap, boolean_t legacy)

--- 143 unchanged lines hidden (view full) ---

814 (void) printf("%-10llu", diff_stats.opackets);
815 (void) printf("%-12llu", diff_stats.obytes);
816 (void) printf("%-8u\n", diff_stats.oerrors);
817
818 state->ls_prevstats = stats;
819}
820
821static void
652 }
653 }
654}
655
656#define TYPE_WIDTH 10
657
658static void
659print_link_parseable(const char *name, dladm_attr_t *dap, boolean_t legacy)

--- 143 unchanged lines hidden (view full) ---

803 (void) printf("%-10llu", diff_stats.opackets);
804 (void) printf("%-12llu", diff_stats.obytes);
805 (void) printf("%-8u\n", diff_stats.oerrors);
806
807 state->ls_prevstats = stats;
808}
809
810static void
822dump_grp(laadm_grp_attr_sys_t *grp, boolean_t parseable)
811dump_grp(dladm_aggr_grp_attr_t *grp, boolean_t parseable)
823{
812{
824 char policy_str[LAADM_POLICY_STR_LEN];
813 char buf[DLADM_STRSIZE];
825 char addr_str[ETHERADDRL * 3];
826
827 if (!parseable) {
828 (void) printf(gettext("key: %d (0x%04x)"),
829 grp->lg_key, grp->lg_key);
830
831 (void) printf(gettext("\tpolicy: %s"),
814 char addr_str[ETHERADDRL * 3];
815
816 if (!parseable) {
817 (void) printf(gettext("key: %d (0x%04x)"),
818 grp->lg_key, grp->lg_key);
819
820 (void) printf(gettext("\tpolicy: %s"),
832 laadm_policy_to_str(grp->lg_policy, policy_str));
821 dladm_aggr_policy2str(grp->lg_policy, buf));
833
834 (void) printf(gettext("\taddress: %s (%s)\n"),
822
823 (void) printf(gettext("\taddress: %s (%s)\n"),
835 laadm_mac_addr_to_str(grp->lg_mac, addr_str),
824 dladm_aggr_macaddr2str(grp->lg_mac, addr_str),
836 (grp->lg_mac_fixed) ? gettext("fixed") : gettext("auto"));
837 } else {
838 (void) printf("aggr key=%d", grp->lg_key);
839
840 (void) printf(" policy=%s",
825 (grp->lg_mac_fixed) ? gettext("fixed") : gettext("auto"));
826 } else {
827 (void) printf("aggr key=%d", grp->lg_key);
828
829 (void) printf(" policy=%s",
841 laadm_policy_to_str(grp->lg_policy, policy_str));
830 dladm_aggr_policy2str(grp->lg_policy, buf));
842
843 (void) printf(" address=%s",
831
832 (void) printf(" address=%s",
844 laadm_mac_addr_to_str(grp->lg_mac, addr_str));
833 dladm_aggr_macaddr2str(grp->lg_mac, addr_str));
845
846 (void) printf(" address-type=%s\n",
847 (grp->lg_mac_fixed) ? "fixed" : "auto");
848 }
849}
850
851static void
834
835 (void) printf(" address-type=%s\n",
836 (grp->lg_mac_fixed) ? "fixed" : "auto");
837 }
838}
839
840static void
852dump_grp_lacp(laadm_grp_attr_sys_t *grp, boolean_t parseable)
841dump_grp_lacp(dladm_aggr_grp_attr_t *grp, boolean_t parseable)
853{
842{
854 const char *lacp_mode_str = laadm_lacp_mode_to_str(grp->lg_lacp_mode);
855 const char *lacp_timer_str =
856 laadm_lacp_timer_to_str(grp->lg_lacp_timer);
843 char lacp_mode_str[DLADM_STRSIZE];
844 char lacp_timer_str[DLADM_STRSIZE];
857
845
846 (void) dladm_aggr_lacpmode2str(grp->lg_lacp_mode, lacp_mode_str);
847 (void) dladm_aggr_lacptimer2str(grp->lg_lacp_timer, lacp_timer_str);
848
858 if (!parseable) {
859 (void) printf(gettext("\t\tLACP mode: %s"), lacp_mode_str);
860 (void) printf(gettext("\tLACP timer: %s\n"), lacp_timer_str);
861 } else {
862 (void) printf(" lacp-mode=%s", lacp_mode_str);
863 (void) printf(" lacp-timer=%s\n", lacp_timer_str);
864 }
865}
866
867static void
849 if (!parseable) {
850 (void) printf(gettext("\t\tLACP mode: %s"), lacp_mode_str);
851 (void) printf(gettext("\tLACP timer: %s\n"), lacp_timer_str);
852 } else {
853 (void) printf(" lacp-mode=%s", lacp_mode_str);
854 (void) printf(" lacp-timer=%s\n", lacp_timer_str);
855 }
856}
857
858static void
868dump_grp_stats(laadm_grp_attr_sys_t *grp)
859dump_grp_stats(dladm_aggr_grp_attr_t *grp)
869{
870 (void) printf("key: %d", grp->lg_key);
871 (void) printf("\tipackets rbytes opackets obytes ");
872 (void) printf("%%ipkts %%opkts\n");
873}
874
875static void
876dump_ports_lacp_head(void)

--- 6 unchanged lines hidden (view full) ---

883
884static void
885dump_ports_head(void)
886{
887 (void) printf(gettext(" device\taddress\t\t speed\t\tduplex\tlink\t"
888 "state\n"));
889}
890
860{
861 (void) printf("key: %d", grp->lg_key);
862 (void) printf("\tipackets rbytes opackets obytes ");
863 (void) printf("%%ipkts %%opkts\n");
864}
865
866static void
867dump_ports_lacp_head(void)

--- 6 unchanged lines hidden (view full) ---

874
875static void
876dump_ports_head(void)
877{
878 (void) printf(gettext(" device\taddress\t\t speed\t\tduplex\tlink\t"
879 "state\n"));
880}
881
891static char *
892port_state_to_str(aggr_port_state_t state_num)
893{
894 int i;
895 port_state_t *state;
896
897 for (i = 0; i < NPORTSTATES; i++) {
898 state = &port_states[i];
899 if (state->state_num == state_num)
900 return (state->state_name);
901 }
902
903 return ("unknown");
904}
905
906static void
882static void
907dump_port(laadm_port_attr_sys_t *port, boolean_t parseable)
883dump_port(dladm_aggr_port_attr_t *port, boolean_t parseable)
908{
909 char *dev = port->lp_devname;
884{
885 char *dev = port->lp_devname;
910 char buf[ETHERADDRL * 3];
886 char mac_addr[ETHERADDRL * 3];
887 char buf[DLADM_STRSIZE];
911
912 if (!parseable) {
888
889 if (!parseable) {
913 (void) printf(" %-9s\t%s", dev, laadm_mac_addr_to_str(
914 port->lp_mac, buf));
890 (void) printf(" %-9s\t%s", dev, dladm_aggr_macaddr2str(
891 port->lp_mac, mac_addr));
915 (void) printf("\t %5uMb", (int)(mac_ifspeed(dev) /
916 1000000ull));
917 (void) printf("\t%s", mac_link_duplex(dev));
918 (void) printf("\t%s", mac_link_state(dev));
892 (void) printf("\t %5uMb", (int)(mac_ifspeed(dev) /
893 1000000ull));
894 (void) printf("\t%s", mac_link_duplex(dev));
895 (void) printf("\t%s", mac_link_state(dev));
919 (void) printf("\t%s\n", port_state_to_str(port->lp_state));
896 (void) printf("\t%s\n",
897 dladm_aggr_portstate2str(port->lp_state, buf));
920
921 } else {
922 (void) printf(" device=%s address=%s", dev,
898
899 } else {
900 (void) printf(" device=%s address=%s", dev,
923 laadm_mac_addr_to_str(port->lp_mac, buf));
901 dladm_aggr_macaddr2str(port->lp_mac, mac_addr));
924 (void) printf(" speed=%u", (int)(mac_ifspeed(dev) /
925 1000000ull));
926 (void) printf(" duplex=%s", mac_link_duplex(dev));
927 (void) printf(" link=%s", mac_link_state(dev));
902 (void) printf(" speed=%u", (int)(mac_ifspeed(dev) /
903 1000000ull));
904 (void) printf(" duplex=%s", mac_link_duplex(dev));
905 (void) printf(" link=%s", mac_link_state(dev));
928 (void) printf(" port=%s", port_state_to_str(port->lp_state));
906 (void) printf(" port=%s",
907 dladm_aggr_portstate2str(port->lp_state, buf));
929 }
930}
931
932static void
908 }
909}
910
911static void
933dump_port_lacp(laadm_port_attr_sys_t *port)
912dump_port_lacp(dladm_aggr_port_attr_t *port)
934{
935 aggr_lacp_state_t *state = &port->lp_lacp_state;
936
937 (void) printf(DUMP_LACP_FORMAT,
938 port->lp_devname, state->bit.activity ? "active" : "passive",
939 state->bit.timeout ? "short" : "long",
940 state->bit.aggregation ? "yes" : "no",
941 state->bit.sync ? "yes" : "no",

--- 30 unchanged lines hidden (view full) ---

972 (double)tot_stats->opackets * 100);
973
974 (void) printf("\n");
975
976 *old_stats = *port_stats;
977}
978
979static int
913{
914 aggr_lacp_state_t *state = &port->lp_lacp_state;
915
916 (void) printf(DUMP_LACP_FORMAT,
917 port->lp_devname, state->bit.activity ? "active" : "passive",
918 state->bit.timeout ? "short" : "long",
919 state->bit.aggregation ? "yes" : "no",
920 state->bit.sync ? "yes" : "no",

--- 30 unchanged lines hidden (view full) ---

951 (double)tot_stats->opackets * 100);
952
953 (void) printf("\n");
954
955 *old_stats = *port_stats;
956}
957
958static int
980show_key(void *arg, laadm_grp_attr_sys_t *grp)
959show_key(void *arg, dladm_aggr_grp_attr_t *grp)
981{
982 show_grp_state_t *state = (show_grp_state_t *)arg;
983 int i;
984 pktsum_t pktsumtot, port_stat;
985
986 if (state->gs_key != 0 && state->gs_key != grp->lg_key)
987 return (0);
988 if (state->gs_firstonly) {

--- 262 unchanged lines hidden (view full) ---

1251 if (s_arg) {
1252 aggr_stats(key, interval);
1253 return;
1254 }
1255
1256 state.gs_key = key;
1257 state.gs_found = B_FALSE;
1258
960{
961 show_grp_state_t *state = (show_grp_state_t *)arg;
962 int i;
963 pktsum_t pktsumtot, port_stat;
964
965 if (state->gs_key != 0 && state->gs_key != grp->lg_key)
966 return (0);
967 if (state->gs_firstonly) {

--- 262 unchanged lines hidden (view full) ---

1230 if (s_arg) {
1231 aggr_stats(key, interval);
1232 return;
1233 }
1234
1235 state.gs_key = key;
1236 state.gs_found = B_FALSE;
1237
1259 (void) laadm_walk_sys(show_key, &state);
1238 (void) dladm_aggr_walk(show_key, &state);
1260
1261 if (key != 0 && !state.gs_found)
1262 die("non-existent aggregation key '%u'", key);
1263}
1264
1265static void
1266do_show_dev(int argc, char *argv[])
1267{

--- 59 unchanged lines hidden (view full) ---

1327 }
1328
1329 if (s_arg) {
1330 dev_stats(dev, interval);
1331 return;
1332 }
1333
1334 if (dev == NULL)
1239
1240 if (key != 0 && !state.gs_found)
1241 die("non-existent aggregation key '%u'", key);
1242}
1243
1244static void
1245do_show_dev(int argc, char *argv[])
1246{

--- 59 unchanged lines hidden (view full) ---

1306 }
1307
1308 if (s_arg) {
1309 dev_stats(dev, interval);
1310 return;
1311 }
1312
1313 if (dev == NULL)
1335 (void) macadm_walk(show_dev, &state, B_TRUE);
1314 (void) dladm_mac_walk(show_dev, &state);
1336 else
1337 show_dev(&state, dev);
1338}
1339
1340/* ARGSUSED */
1341static void
1342link_stats(const char *link, uint_t interval)
1343{

--- 42 unchanged lines hidden (view full) ---

1386 /*
1387 * If an interval is specified, continuously show the stats
1388 * only for the first group.
1389 */
1390 state.gs_firstonly = (interval != 0);
1391
1392 for (;;) {
1393 state.gs_found = B_FALSE;
1315 else
1316 show_dev(&state, dev);
1317}
1318
1319/* ARGSUSED */
1320static void
1321link_stats(const char *link, uint_t interval)
1322{

--- 42 unchanged lines hidden (view full) ---

1365 /*
1366 * If an interval is specified, continuously show the stats
1367 * only for the first group.
1368 */
1369 state.gs_firstonly = (interval != 0);
1370
1371 for (;;) {
1372 state.gs_found = B_FALSE;
1394 (void) laadm_walk_sys(show_key, &state);
1373 (void) dladm_aggr_walk(show_key, &state);
1395 if (state.gs_key != 0 && !state.gs_found)
1396 die("non-existent aggregation key '%u'", key);
1397
1398 if (interval == 0)
1399 break;
1400
1401 (void) sleep(interval);
1402 }

--- 15 unchanged lines hidden (view full) ---

1418
1419 for (;;) {
1420
1421 (void) printf("\t\tipackets rbytes ierrors ");
1422 (void) printf("opackets obytes oerrors\n");
1423
1424 state.ms_donefirst = B_FALSE;
1425 if (dev == NULL)
1374 if (state.gs_key != 0 && !state.gs_found)
1375 die("non-existent aggregation key '%u'", key);
1376
1377 if (interval == 0)
1378 break;
1379
1380 (void) sleep(interval);
1381 }

--- 15 unchanged lines hidden (view full) ---

1397
1398 for (;;) {
1399
1400 (void) printf("\t\tipackets rbytes ierrors ");
1401 (void) printf("opackets obytes oerrors\n");
1402
1403 state.ms_donefirst = B_FALSE;
1404 if (dev == NULL)
1426 (void) macadm_walk(show_dev_stats, &state, B_TRUE);
1405 (void) dladm_mac_walk(show_dev_stats, &state);
1427 else
1428 show_dev_stats(&state, dev);
1429
1430 if (interval == 0)
1431 break;
1432
1433 (void) sleep(interval);
1434 }

--- 156 unchanged lines hidden (view full) ---

1591mac_ifspeed(const char *dev)
1592{
1593 uint64_t ifspeed = 0;
1594
1595 (void) get_single_mac_stat(dev, "ifspeed", KSTAT_DATA_UINT64, &ifspeed);
1596 return (ifspeed);
1597}
1598
1406 else
1407 show_dev_stats(&state, dev);
1408
1409 if (interval == 0)
1410 break;
1411
1412 (void) sleep(interval);
1413 }

--- 156 unchanged lines hidden (view full) ---

1570mac_ifspeed(const char *dev)
1571{
1572 uint64_t ifspeed = 0;
1573
1574 (void) get_single_mac_stat(dev, "ifspeed", KSTAT_DATA_UINT64, &ifspeed);
1575 return (ifspeed);
1576}
1577
1599static char *
1578static const char *
1600mac_link_state(const char *dev)
1601{
1602 link_state_t link_state;
1579mac_link_state(const char *dev)
1580{
1581 link_state_t link_state;
1603 char *state_str = "unknown";
1582 char buf[DLADM_STRSIZE];
1604
1605 if (get_single_mac_stat(dev, "link_state", KSTAT_DATA_UINT32,
1606 &link_state) != 0) {
1583
1584 if (get_single_mac_stat(dev, "link_state", KSTAT_DATA_UINT32,
1585 &link_state) != 0) {
1607 return (state_str);
1586 return ("unknown");
1608 }
1609
1587 }
1588
1610 switch (link_state) {
1611 case LINK_STATE_UP:
1612 state_str = "up";
1613 break;
1614 case LINK_STATE_DOWN:
1615 state_str = "down";
1616 break;
1617 default:
1618 break;
1619 }
1620
1621 return (state_str);
1589 return (dladm_linkstate2str(link_state, buf));
1622}
1623
1624
1590}
1591
1592
1625static char *
1593static const char *
1626mac_link_duplex(const char *dev)
1627{
1628 link_duplex_t link_duplex;
1594mac_link_duplex(const char *dev)
1595{
1596 link_duplex_t link_duplex;
1629 char *duplex_str = "unknown";
1597 char buf[DLADM_STRSIZE];
1630
1631 if (get_single_mac_stat(dev, "link_duplex", KSTAT_DATA_UINT32,
1632 &link_duplex) != 0) {
1598
1599 if (get_single_mac_stat(dev, "link_duplex", KSTAT_DATA_UINT32,
1600 &link_duplex) != 0) {
1633 return (duplex_str);
1601 return ("unknown");
1634 }
1635
1602 }
1603
1636 switch (link_duplex) {
1637 case LINK_DUPLEX_FULL:
1638 duplex_str = "full";
1639 break;
1640 case LINK_DUPLEX_HALF:
1641 duplex_str = "half";
1642 break;
1643 default:
1644 break;
1645 }
1646
1647 return (duplex_str);
1604 return (dladm_linkduplex2str(link_duplex, buf));
1648}
1649
1650#define WIFI_CMD_SCAN 0x00000001
1651#define WIFI_CMD_SHOW 0x00000002
1652#define WIFI_CMD_ALL (WIFI_CMD_SCAN | WIFI_CMD_SHOW)
1653typedef struct wifi_field {
1654 const char *wf_name;
1655 const char *wf_header;
1656 uint_t wf_width;
1657 uint_t wf_mask;
1658 uint_t wf_cmdtype;
1659} wifi_field_t;
1660
1661static wifi_field_t wifi_fields[] = {
1605}
1606
1607#define WIFI_CMD_SCAN 0x00000001
1608#define WIFI_CMD_SHOW 0x00000002
1609#define WIFI_CMD_ALL (WIFI_CMD_SCAN | WIFI_CMD_SHOW)
1610typedef struct wifi_field {
1611 const char *wf_name;
1612 const char *wf_header;
1613 uint_t wf_width;
1614 uint_t wf_mask;
1615 uint_t wf_cmdtype;
1616} wifi_field_t;
1617
1618static wifi_field_t wifi_fields[] = {
1662{ "link", "LINK", 10, 0, WIFI_CMD_ALL},
1663{ "essid", "ESSID", 19, WLADM_WLAN_ATTR_ESSID, WIFI_CMD_ALL},
1664{ "bssid", "BSSID/IBSSID", 17, WLADM_WLAN_ATTR_BSSID, WIFI_CMD_ALL},
1665{ "ibssid", "BSSID/IBSSID", 17, WLADM_WLAN_ATTR_BSSID, WIFI_CMD_ALL},
1666{ "mode", "MODE", 6, WLADM_WLAN_ATTR_MODE, WIFI_CMD_ALL},
1667{ "speed", "SPEED", 6, WLADM_WLAN_ATTR_SPEED, WIFI_CMD_ALL},
1668{ "auth", "AUTH", 8, WLADM_WLAN_ATTR_AUTH, WIFI_CMD_SHOW},
1669{ "bsstype", "BSSTYPE", 8, WLADM_WLAN_ATTR_BSSTYPE, WIFI_CMD_ALL},
1670{ "sec", "SEC", 6, WLADM_WLAN_ATTR_SECMODE, WIFI_CMD_ALL},
1671{ "status", "STATUS", 17, WLADM_LINK_ATTR_STATUS, WIFI_CMD_SHOW},
1672{ "strength", "STRENGTH", 10, WLADM_WLAN_ATTR_STRENGTH, WIFI_CMD_ALL}}
1619{ "link", "LINK", 10, 0, WIFI_CMD_ALL},
1620{ "essid", "ESSID", 19, DLADM_WLAN_ATTR_ESSID, WIFI_CMD_ALL},
1621{ "bssid", "BSSID/IBSSID", 17, DLADM_WLAN_ATTR_BSSID, WIFI_CMD_ALL},
1622{ "ibssid", "BSSID/IBSSID", 17, DLADM_WLAN_ATTR_BSSID, WIFI_CMD_ALL},
1623{ "mode", "MODE", 6, DLADM_WLAN_ATTR_MODE, WIFI_CMD_ALL},
1624{ "speed", "SPEED", 6, DLADM_WLAN_ATTR_SPEED, WIFI_CMD_ALL},
1625{ "auth", "AUTH", 8, DLADM_WLAN_ATTR_AUTH, WIFI_CMD_SHOW},
1626{ "bsstype", "BSSTYPE", 8, DLADM_WLAN_ATTR_BSSTYPE, WIFI_CMD_ALL},
1627{ "sec", "SEC", 6, DLADM_WLAN_ATTR_SECMODE, WIFI_CMD_ALL},
1628{ "status", "STATUS", 17, DLADM_WLAN_LINKATTR_STATUS, WIFI_CMD_SHOW},
1629{ "strength", "STRENGTH", 10, DLADM_WLAN_ATTR_STRENGTH, WIFI_CMD_ALL}}
1673;
1674
1675static char *all_scan_wifi_fields =
1676 "link,essid,bssid,sec,strength,mode,speed,bsstype";
1677static char *all_show_wifi_fields =
1678 "link,status,essid,sec,strength,mode,speed,auth,bssid,bsstype";
1679static char *def_scan_wifi_fields =
1680 "link,essid,bssid,sec,strength,mode,speed";

--- 167 unchanged lines hidden (view full) ---

1848 }
1849
1850 if (!statep->ws_lastfield)
1851 (void) putchar(' ');
1852}
1853
1854static void
1855print_wlan_attr(print_wifi_state_t *statep, wifi_field_t *wfp,
1630;
1631
1632static char *all_scan_wifi_fields =
1633 "link,essid,bssid,sec,strength,mode,speed,bsstype";
1634static char *all_show_wifi_fields =
1635 "link,status,essid,sec,strength,mode,speed,auth,bssid,bsstype";
1636static char *def_scan_wifi_fields =
1637 "link,essid,bssid,sec,strength,mode,speed";

--- 167 unchanged lines hidden (view full) ---

1805 }
1806
1807 if (!statep->ws_lastfield)
1808 (void) putchar(' ');
1809}
1810
1811static void
1812print_wlan_attr(print_wifi_state_t *statep, wifi_field_t *wfp,
1856 wladm_wlan_attr_t *attrp)
1813 dladm_wlan_attr_t *attrp)
1857{
1814{
1858 char buf[WLADM_STRSIZE];
1815 char buf[DLADM_STRSIZE];
1859 const char *str = "";
1860
1861 if (wfp->wf_mask == 0) {
1862 print_wifi_field(statep, wfp, statep->ws_link);
1863 return;
1864 }
1865
1866 if ((wfp->wf_mask & attrp->wa_valid) == 0) {
1867 print_wifi_field(statep, wfp, "");
1868 return;
1869 }
1870
1871 switch (wfp->wf_mask) {
1816 const char *str = "";
1817
1818 if (wfp->wf_mask == 0) {
1819 print_wifi_field(statep, wfp, statep->ws_link);
1820 return;
1821 }
1822
1823 if ((wfp->wf_mask & attrp->wa_valid) == 0) {
1824 print_wifi_field(statep, wfp, "");
1825 return;
1826 }
1827
1828 switch (wfp->wf_mask) {
1872 case WLADM_WLAN_ATTR_ESSID:
1873 str = wladm_essid2str(&attrp->wa_essid, buf);
1829 case DLADM_WLAN_ATTR_ESSID:
1830 str = dladm_wlan_essid2str(&attrp->wa_essid, buf);
1874 break;
1831 break;
1875 case WLADM_WLAN_ATTR_BSSID:
1876 str = wladm_bssid2str(&attrp->wa_bssid, buf);
1832 case DLADM_WLAN_ATTR_BSSID:
1833 str = dladm_wlan_bssid2str(&attrp->wa_bssid, buf);
1877 break;
1834 break;
1878 case WLADM_WLAN_ATTR_SECMODE:
1879 str = wladm_secmode2str(&attrp->wa_secmode, buf);
1835 case DLADM_WLAN_ATTR_SECMODE:
1836 str = dladm_wlan_secmode2str(&attrp->wa_secmode, buf);
1880 break;
1837 break;
1881 case WLADM_WLAN_ATTR_STRENGTH:
1882 str = wladm_strength2str(&attrp->wa_strength, buf);
1838 case DLADM_WLAN_ATTR_STRENGTH:
1839 str = dladm_wlan_strength2str(&attrp->wa_strength, buf);
1883 break;
1840 break;
1884 case WLADM_WLAN_ATTR_MODE:
1885 str = wladm_mode2str(&attrp->wa_mode, buf);
1841 case DLADM_WLAN_ATTR_MODE:
1842 str = dladm_wlan_mode2str(&attrp->wa_mode, buf);
1886 break;
1843 break;
1887 case WLADM_WLAN_ATTR_SPEED:
1888 str = wladm_speed2str(&attrp->wa_speed, buf);
1844 case DLADM_WLAN_ATTR_SPEED:
1845 str = dladm_wlan_speed2str(&attrp->wa_speed, buf);
1889 (void) strlcat(buf, "Mb", sizeof (buf));
1890 break;
1846 (void) strlcat(buf, "Mb", sizeof (buf));
1847 break;
1891 case WLADM_WLAN_ATTR_AUTH:
1892 str = wladm_auth2str(&attrp->wa_auth, buf);
1848 case DLADM_WLAN_ATTR_AUTH:
1849 str = dladm_wlan_auth2str(&attrp->wa_auth, buf);
1893 break;
1850 break;
1894 case WLADM_WLAN_ATTR_BSSTYPE:
1895 str = wladm_bsstype2str(&attrp->wa_bsstype, buf);
1851 case DLADM_WLAN_ATTR_BSSTYPE:
1852 str = dladm_wlan_bsstype2str(&attrp->wa_bsstype, buf);
1896 break;
1897 }
1898
1899 print_wifi_field(statep, wfp, str);
1900}
1901
1902static boolean_t
1853 break;
1854 }
1855
1856 print_wifi_field(statep, wfp, str);
1857}
1858
1859static boolean_t
1903print_scan_results(void *arg, wladm_wlan_attr_t *attrp)
1860print_scan_results(void *arg, dladm_wlan_attr_t *attrp)
1904{
1905 print_wifi_state_t *statep = arg;
1906 int i;
1907
1908 if (statep->ws_header) {
1909 statep->ws_header = B_FALSE;
1910 if (!statep->ws_parseable)
1911 print_wifi_head(statep);

--- 7 unchanged lines hidden (view full) ---

1919 (void) putchar('\n');
1920 return (B_TRUE);
1921}
1922
1923static boolean_t
1924scan_wifi(void *arg, const char *link)
1925{
1926 print_wifi_state_t *statep = arg;
1861{
1862 print_wifi_state_t *statep = arg;
1863 int i;
1864
1865 if (statep->ws_header) {
1866 statep->ws_header = B_FALSE;
1867 if (!statep->ws_parseable)
1868 print_wifi_head(statep);

--- 7 unchanged lines hidden (view full) ---

1876 (void) putchar('\n');
1877 return (B_TRUE);
1878}
1879
1880static boolean_t
1881scan_wifi(void *arg, const char *link)
1882{
1883 print_wifi_state_t *statep = arg;
1927 wladm_status_t status;
1884 dladm_status_t status;
1928
1929 statep->ws_link = link;
1885
1886 statep->ws_link = link;
1930 status = wladm_scan(link, statep, print_scan_results);
1931 if (status != WLADM_STATUS_OK)
1932 die_wlerr(status, "cannot scan link '%s'", link);
1887 status = dladm_wlan_scan(link, statep, print_scan_results);
1888 if (status != DLADM_STATUS_OK)
1889 die_dlerr(status, "cannot scan link '%s'", link);
1933
1934 return (B_TRUE);
1935}
1936
1937static void
1938print_link_attr(print_wifi_state_t *statep, wifi_field_t *wfp,
1890
1891 return (B_TRUE);
1892}
1893
1894static void
1895print_link_attr(print_wifi_state_t *statep, wifi_field_t *wfp,
1939 wladm_link_attr_t *attrp)
1896 dladm_wlan_linkattr_t *attrp)
1940{
1897{
1941 char buf[WLADM_STRSIZE];
1898 char buf[DLADM_STRSIZE];
1942 const char *str = "";
1943
1944 if (strcmp(wfp->wf_name, "status") == 0) {
1945 if ((wfp->wf_mask & attrp->la_valid) != 0)
1899 const char *str = "";
1900
1901 if (strcmp(wfp->wf_name, "status") == 0) {
1902 if ((wfp->wf_mask & attrp->la_valid) != 0)
1946 str = wladm_linkstatus2str(&attrp->la_status, buf);
1903 str = dladm_wlan_linkstatus2str(&attrp->la_status, buf);
1947 print_wifi_field(statep, wfp, str);
1948 return;
1949 }
1950 print_wlan_attr(statep, wfp, &attrp->la_wlan_attr);
1951}
1952
1953static boolean_t
1954show_wifi(void *arg, const char *link)
1955{
1956 int i;
1957 print_wifi_state_t *statep = arg;
1904 print_wifi_field(statep, wfp, str);
1905 return;
1906 }
1907 print_wlan_attr(statep, wfp, &attrp->la_wlan_attr);
1908}
1909
1910static boolean_t
1911show_wifi(void *arg, const char *link)
1912{
1913 int i;
1914 print_wifi_state_t *statep = arg;
1958 wladm_link_attr_t attr;
1959 wladm_status_t status;
1915 dladm_wlan_linkattr_t attr;
1916 dladm_status_t status;
1960
1917
1961 status = wladm_get_link_attr(link, &attr);
1962 if (status != WLADM_STATUS_OK)
1963 die_wlerr(status, "cannot get link attributes for '%s'", link);
1918 status = dladm_wlan_get_linkattr(link, &attr);
1919 if (status != DLADM_STATUS_OK)
1920 die_dlerr(status, "cannot get link attributes for '%s'", link);
1964
1965 if (statep->ws_header) {
1966 statep->ws_header = B_FALSE;
1967 if (!statep->ws_parseable)
1968 print_wifi_head(statep);
1969 }
1970
1971 statep->ws_link = link;

--- 10 unchanged lines hidden (view full) ---

1982do_display_wifi(int argc, char **argv, int cmd)
1983{
1984 int option;
1985 char *fields_str = NULL;
1986 wifi_field_t **fields;
1987 boolean_t (*callback)(void *, const char *);
1988 uint_t nfields;
1989 print_wifi_state_t state;
1921
1922 if (statep->ws_header) {
1923 statep->ws_header = B_FALSE;
1924 if (!statep->ws_parseable)
1925 print_wifi_head(statep);
1926 }
1927
1928 statep->ws_link = link;

--- 10 unchanged lines hidden (view full) ---

1939do_display_wifi(int argc, char **argv, int cmd)
1940{
1941 int option;
1942 char *fields_str = NULL;
1943 wifi_field_t **fields;
1944 boolean_t (*callback)(void *, const char *);
1945 uint_t nfields;
1946 print_wifi_state_t state;
1990 wladm_status_t status;
1947 dladm_status_t status;
1991
1992 if (cmd == WIFI_CMD_SCAN)
1993 callback = scan_wifi;
1994 else if (cmd == WIFI_CMD_SHOW)
1995 callback = show_wifi;
1996 else
1997 return;
1998

--- 25 unchanged lines hidden (view full) ---

2024
2025 if (parse_wifi_fields(fields_str, &fields, &nfields, cmd) < 0)
2026 die("invalid field(s) specified");
2027
2028 state.ws_fields = fields;
2029 state.ws_nfields = nfields;
2030
2031 if (state.ws_link == NULL) {
1948
1949 if (cmd == WIFI_CMD_SCAN)
1950 callback = scan_wifi;
1951 else if (cmd == WIFI_CMD_SHOW)
1952 callback = show_wifi;
1953 else
1954 return;
1955

--- 25 unchanged lines hidden (view full) ---

1981
1982 if (parse_wifi_fields(fields_str, &fields, &nfields, cmd) < 0)
1983 die("invalid field(s) specified");
1984
1985 state.ws_fields = fields;
1986 state.ws_nfields = nfields;
1987
1988 if (state.ws_link == NULL) {
2032 status = wladm_walk(&state, callback);
2033 if (status != WLADM_STATUS_OK)
2034 die_wlerr(status, "cannot walk wifi links");
1989 status = dladm_wlan_walk(&state, callback);
1990 if (status != DLADM_STATUS_OK)
1991 die_dlerr(status, "cannot walk wifi links");
2035 } else {
2036 (void) (*callback)(&state, state.ws_link);
2037 }
2038 free(fields);
2039}
2040
2041static void
2042do_scan_wifi(int argc, char **argv)

--- 19 unchanged lines hidden (view full) ---

2062
2063 if (cp->wc_count == 0)
2064 cp->wc_link = strdup(link);
2065 cp->wc_count++;
2066 return (B_TRUE);
2067}
2068
2069static int
1992 } else {
1993 (void) (*callback)(&state, state.ws_link);
1994 }
1995 free(fields);
1996}
1997
1998static void
1999do_scan_wifi(int argc, char **argv)

--- 19 unchanged lines hidden (view full) ---

2019
2020 if (cp->wc_count == 0)
2021 cp->wc_link = strdup(link);
2022 cp->wc_count++;
2023 return (B_TRUE);
2024}
2025
2026static int
2070parse_wep_keys(char *str, wladm_wep_key_t **keys, uint_t *key_countp)
2027parse_wep_keys(char *str, dladm_wlan_wepkey_t **keys, uint_t *key_countp)
2071{
2028{
2072 uint_t i;
2073 split_t *sp;
2074 wladm_wep_key_t *wk;
2029 uint_t i;
2030 split_t *sp;
2031 dladm_wlan_wepkey_t *wk;
2075
2032
2076 sp = split(str, WLADM_MAX_WEPKEYS, WLADM_MAX_WEPKEYNAME_LEN);
2033 sp = split(str, DLADM_WLAN_MAX_WEPKEYS, DLADM_WLAN_MAX_WEPKEYNAME_LEN);
2077 if (sp == NULL)
2078 return (-1);
2079
2034 if (sp == NULL)
2035 return (-1);
2036
2080 wk = malloc(sp->s_nfields * sizeof (wladm_wep_key_t));
2037 wk = malloc(sp->s_nfields * sizeof (dladm_wlan_wepkey_t));
2081 if (wk == NULL)
2082 goto fail;
2083
2084 for (i = 0; i < sp->s_nfields; i++) {
2085 char *s;
2086 dladm_secobj_class_t class;
2087 dladm_status_t status;
2088
2089 (void) strlcpy(wk[i].wk_name, sp->s_fields[i],
2038 if (wk == NULL)
2039 goto fail;
2040
2041 for (i = 0; i < sp->s_nfields; i++) {
2042 char *s;
2043 dladm_secobj_class_t class;
2044 dladm_status_t status;
2045
2046 (void) strlcpy(wk[i].wk_name, sp->s_fields[i],
2090 WLADM_MAX_WEPKEYNAME_LEN);
2047 DLADM_WLAN_MAX_WEPKEYNAME_LEN);
2091
2092 wk[i].wk_idx = 1;
2093 if ((s = strrchr(wk[i].wk_name, ':')) != NULL) {
2094 if (s[1] == '\0' || s[2] != '\0' || !isdigit(s[1]))
2095 goto fail;
2096
2097 wk[i].wk_idx = (uint_t)(s[1] - '0');
2098 *s = '\0';
2099 }
2048
2049 wk[i].wk_idx = 1;
2050 if ((s = strrchr(wk[i].wk_name, ':')) != NULL) {
2051 if (s[1] == '\0' || s[2] != '\0' || !isdigit(s[1]))
2052 goto fail;
2053
2054 wk[i].wk_idx = (uint_t)(s[1] - '0');
2055 *s = '\0';
2056 }
2100 wk[i].wk_len = WLADM_MAX_WEPKEY_LEN;
2057 wk[i].wk_len = DLADM_WLAN_MAX_WEPKEY_LEN;
2101
2102 status = dladm_get_secobj(wk[i].wk_name, &class,
2103 wk[i].wk_val, &wk[i].wk_len, 0);
2104 if (status != DLADM_STATUS_OK) {
2105 if (status == DLADM_STATUS_NOTFOUND) {
2106 status = dladm_get_secobj(wk[i].wk_name,
2107 &class, wk[i].wk_val, &wk[i].wk_len,
2108 DLADM_OPT_PERSIST);

--- 11 unchanged lines hidden (view full) ---

2120 splitfree(sp);
2121 return (-1);
2122}
2123
2124static void
2125do_connect_wifi(int argc, char **argv)
2126{
2127 int option;
2058
2059 status = dladm_get_secobj(wk[i].wk_name, &class,
2060 wk[i].wk_val, &wk[i].wk_len, 0);
2061 if (status != DLADM_STATUS_OK) {
2062 if (status == DLADM_STATUS_NOTFOUND) {
2063 status = dladm_get_secobj(wk[i].wk_name,
2064 &class, wk[i].wk_val, &wk[i].wk_len,
2065 DLADM_OPT_PERSIST);

--- 11 unchanged lines hidden (view full) ---

2077 splitfree(sp);
2078 return (-1);
2079}
2080
2081static void
2082do_connect_wifi(int argc, char **argv)
2083{
2084 int option;
2128 wladm_wlan_attr_t attr, *attrp;
2129 wladm_status_t status = WLADM_STATUS_OK;
2130 int timeout = WLADM_CONNECT_TIMEOUT_DEFAULT;
2085 dladm_wlan_attr_t attr, *attrp;
2086 dladm_status_t status = DLADM_STATUS_OK;
2087 int timeout = DLADM_WLAN_CONNECT_TIMEOUT_DEFAULT;
2131 const char *link = NULL;
2088 const char *link = NULL;
2132 wladm_wep_key_t *keys = NULL;
2089 dladm_wlan_wepkey_t *keys = NULL;
2133 uint_t key_count = 0;
2134 uint_t flags = 0;
2090 uint_t key_count = 0;
2091 uint_t flags = 0;
2135 wladm_secmode_t keysecmode = WLADM_SECMODE_NONE;
2092 dladm_wlan_secmode_t keysecmode = DLADM_WLAN_SECMODE_NONE;
2136
2137 opterr = 0;
2138 (void) memset(&attr, 0, sizeof (attr));
2139 while ((option = getopt_long(argc, argv, ":e:i:a:m:b:s:k:T:c",
2140 wifi_longopts, NULL)) != -1) {
2141 switch (option) {
2142 case 'e':
2093
2094 opterr = 0;
2095 (void) memset(&attr, 0, sizeof (attr));
2096 while ((option = getopt_long(argc, argv, ":e:i:a:m:b:s:k:T:c",
2097 wifi_longopts, NULL)) != -1) {
2098 switch (option) {
2099 case 'e':
2143 status = wladm_str2essid(optarg, &attr.wa_essid);
2144 if (status != WLADM_STATUS_OK)
2100 status = dladm_wlan_str2essid(optarg, &attr.wa_essid);
2101 if (status != DLADM_STATUS_OK)
2145 die("invalid ESSID '%s'", optarg);
2146
2102 die("invalid ESSID '%s'", optarg);
2103
2147 attr.wa_valid |= WLADM_WLAN_ATTR_ESSID;
2104 attr.wa_valid |= DLADM_WLAN_ATTR_ESSID;
2148 /*
2149 * Try to connect without doing a scan.
2150 */
2105 /*
2106 * Try to connect without doing a scan.
2107 */
2151 flags |= WLADM_OPT_NOSCAN;
2108 flags |= DLADM_WLAN_CONNECT_NOSCAN;
2152 break;
2153 case 'i':
2109 break;
2110 case 'i':
2154 status = wladm_str2bssid(optarg, &attr.wa_bssid);
2155 if (status != WLADM_STATUS_OK)
2111 status = dladm_wlan_str2bssid(optarg, &attr.wa_bssid);
2112 if (status != DLADM_STATUS_OK)
2156 die("invalid BSSID %s", optarg);
2157
2113 die("invalid BSSID %s", optarg);
2114
2158 attr.wa_valid |= WLADM_WLAN_ATTR_BSSID;
2115 attr.wa_valid |= DLADM_WLAN_ATTR_BSSID;
2159 break;
2160 case 'a':
2116 break;
2117 case 'a':
2161 status = wladm_str2auth(optarg, &attr.wa_auth);
2162 if (status != WLADM_STATUS_OK)
2118 status = dladm_wlan_str2auth(optarg, &attr.wa_auth);
2119 if (status != DLADM_STATUS_OK)
2163 die("invalid authentication mode '%s'", optarg);
2164
2120 die("invalid authentication mode '%s'", optarg);
2121
2165 attr.wa_valid |= WLADM_WLAN_ATTR_AUTH;
2122 attr.wa_valid |= DLADM_WLAN_ATTR_AUTH;
2166 break;
2167 case 'm':
2123 break;
2124 case 'm':
2168 status = wladm_str2mode(optarg, &attr.wa_mode);
2169 if (status != WLADM_STATUS_OK)
2125 status = dladm_wlan_str2mode(optarg, &attr.wa_mode);
2126 if (status != DLADM_STATUS_OK)
2170 die("invalid mode '%s'", optarg);
2171
2127 die("invalid mode '%s'", optarg);
2128
2172 attr.wa_valid |= WLADM_WLAN_ATTR_MODE;
2129 attr.wa_valid |= DLADM_WLAN_ATTR_MODE;
2173 break;
2174 case 'b':
2130 break;
2131 case 'b':
2175 status = wladm_str2bsstype(optarg, &attr.wa_bsstype);
2176 if (status != WLADM_STATUS_OK)
2132 if ((status = dladm_wlan_str2bsstype(optarg,
2133 &attr.wa_bsstype)) != DLADM_STATUS_OK) {
2177 die("invalid bsstype '%s'", optarg);
2134 die("invalid bsstype '%s'", optarg);
2135 }
2178
2136
2179 attr.wa_valid |= WLADM_WLAN_ATTR_BSSTYPE;
2137 attr.wa_valid |= DLADM_WLAN_ATTR_BSSTYPE;
2180 break;
2181 case 's':
2138 break;
2139 case 's':
2182 status = wladm_str2secmode(optarg, &attr.wa_secmode);
2183 if (status != WLADM_STATUS_OK)
2140 if ((status = dladm_wlan_str2secmode(optarg,
2141 &attr.wa_secmode)) != DLADM_STATUS_OK) {
2184 die("invalid security mode '%s'", optarg);
2142 die("invalid security mode '%s'", optarg);
2143 }
2185
2144
2186 attr.wa_valid |= WLADM_WLAN_ATTR_SECMODE;
2145 attr.wa_valid |= DLADM_WLAN_ATTR_SECMODE;
2187 break;
2188 case 'k':
2189 if (parse_wep_keys(optarg, &keys, &key_count) < 0)
2190 die("invalid key(s) '%s'", optarg);
2191
2146 break;
2147 case 'k':
2148 if (parse_wep_keys(optarg, &keys, &key_count) < 0)
2149 die("invalid key(s) '%s'", optarg);
2150
2192 keysecmode = WLADM_SECMODE_WEP;
2151 keysecmode = DLADM_WLAN_SECMODE_WEP;
2193 break;
2194 case 'T':
2195 if (strcasecmp(optarg, "forever") == 0) {
2196 timeout = -1;
2197 break;
2198 }
2199 if (!str2int(optarg, &timeout) || timeout < 0)
2200 die("invalid timeout value '%s'", optarg);
2201 break;
2202 case 'c':
2152 break;
2153 case 'T':
2154 if (strcasecmp(optarg, "forever") == 0) {
2155 timeout = -1;
2156 break;
2157 }
2158 if (!str2int(optarg, &timeout) || timeout < 0)
2159 die("invalid timeout value '%s'", optarg);
2160 break;
2161 case 'c':
2203 flags |= WLADM_OPT_CREATEIBSS;
2162 flags |= DLADM_WLAN_CONNECT_CREATEIBSS;
2204 break;
2205 default:
2206 die_opterr(optopt, option);
2207 break;
2208 }
2209 }
2210
2163 break;
2164 default:
2165 die_opterr(optopt, option);
2166 break;
2167 }
2168 }
2169
2211 if (keysecmode == WLADM_SECMODE_NONE) {
2212 if ((attr.wa_valid & WLADM_WLAN_ATTR_SECMODE) != 0 &&
2213 attr.wa_secmode == WLADM_SECMODE_WEP)
2170 if (keysecmode == DLADM_WLAN_SECMODE_NONE) {
2171 if ((attr.wa_valid & DLADM_WLAN_ATTR_SECMODE) != 0 &&
2172 attr.wa_secmode == DLADM_WLAN_SECMODE_WEP)
2214 die("key required for security mode 'wep'");
2215 } else {
2173 die("key required for security mode 'wep'");
2174 } else {
2216 if ((attr.wa_valid & WLADM_WLAN_ATTR_SECMODE) != 0 &&
2175 if ((attr.wa_valid & DLADM_WLAN_ATTR_SECMODE) != 0 &&
2217 attr.wa_secmode != keysecmode)
2218 die("incompatible -s and -k options");
2219 }
2220 attr.wa_secmode = keysecmode;
2176 attr.wa_secmode != keysecmode)
2177 die("incompatible -s and -k options");
2178 }
2179 attr.wa_secmode = keysecmode;
2221 attr.wa_valid |= WLADM_WLAN_ATTR_SECMODE;
2180 attr.wa_valid |= DLADM_WLAN_ATTR_SECMODE;
2222
2223 if (optind == (argc - 1))
2224 link = argv[optind];
2225 else if (optind != argc)
2226 usage();
2227
2228 if (link == NULL) {
2229 wlan_count_attr_t wcattr;
2230
2231 wcattr.wc_link = NULL;
2232 wcattr.wc_count = 0;
2181
2182 if (optind == (argc - 1))
2183 link = argv[optind];
2184 else if (optind != argc)
2185 usage();
2186
2187 if (link == NULL) {
2188 wlan_count_attr_t wcattr;
2189
2190 wcattr.wc_link = NULL;
2191 wcattr.wc_count = 0;
2233 (void) wladm_walk(&wcattr, do_count_wlan);
2192 (void) dladm_wlan_walk(&wcattr, do_count_wlan);
2234 if (wcattr.wc_count == 0) {
2235 die("no wifi links are available");
2236 } else if (wcattr.wc_count > 1) {
2237 die("link name is required when more than one wifi "
2238 "link is available");
2239 }
2240 link = wcattr.wc_link;
2241 }
2242 attrp = (attr.wa_valid == 0) ? NULL : &attr;
2243again:
2193 if (wcattr.wc_count == 0) {
2194 die("no wifi links are available");
2195 } else if (wcattr.wc_count > 1) {
2196 die("link name is required when more than one wifi "
2197 "link is available");
2198 }
2199 link = wcattr.wc_link;
2200 }
2201 attrp = (attr.wa_valid == 0) ? NULL : &attr;
2202again:
2244 status = wladm_connect(link, attrp, timeout, keys, key_count, flags);
2245 if (status != WLADM_STATUS_OK) {
2246 if ((flags & WLADM_OPT_NOSCAN) != 0) {
2203 if ((status = dladm_wlan_connect(link, attrp, timeout, keys,
2204 key_count, flags)) != DLADM_STATUS_OK) {
2205 if ((flags & DLADM_WLAN_CONNECT_NOSCAN) != 0) {
2247 /*
2248 * Try again with scanning and filtering.
2249 */
2206 /*
2207 * Try again with scanning and filtering.
2208 */
2250 flags &= ~WLADM_OPT_NOSCAN;
2209 flags &= ~DLADM_WLAN_CONNECT_NOSCAN;
2251 goto again;
2252 }
2253
2210 goto again;
2211 }
2212
2254 if (status == WLADM_STATUS_NOTFOUND) {
2213 if (status == DLADM_STATUS_NOTFOUND) {
2255 if (attr.wa_valid == 0) {
2256 die("no wifi networks are available");
2257 } else {
2258 die("no wifi networks with the specified "
2259 "criteria are available");
2260 }
2261 }
2214 if (attr.wa_valid == 0) {
2215 die("no wifi networks are available");
2216 } else {
2217 die("no wifi networks with the specified "
2218 "criteria are available");
2219 }
2220 }
2262 die_wlerr(status, "cannot connect link '%s'", link);
2221 die_dlerr(status, "cannot connect link '%s'", link);
2263 }
2264 free(keys);
2265}
2266
2267/* ARGSUSED */
2268static boolean_t
2269do_all_disconnect_wifi(void *arg, const char *link)
2270{
2222 }
2223 free(keys);
2224}
2225
2226/* ARGSUSED */
2227static boolean_t
2228do_all_disconnect_wifi(void *arg, const char *link)
2229{
2271 wladm_status_t status;
2230 dladm_status_t status;
2272
2231
2273 status = wladm_disconnect(link);
2274 if (status != WLADM_STATUS_OK)
2275 warn_wlerr(status, "cannot disconnect link '%s'", link);
2232 status = dladm_wlan_disconnect(link);
2233 if (status != DLADM_STATUS_OK)
2234 warn_dlerr(status, "cannot disconnect link '%s'", link);
2276
2277 return (B_TRUE);
2278}
2279
2280static void
2281do_disconnect_wifi(int argc, char **argv)
2282{
2283 int option;
2284 const char *link = NULL;
2285 boolean_t all_links = B_FALSE;
2235
2236 return (B_TRUE);
2237}
2238
2239static void
2240do_disconnect_wifi(int argc, char **argv)
2241{
2242 int option;
2243 const char *link = NULL;
2244 boolean_t all_links = B_FALSE;
2286 wladm_status_t status;
2245 dladm_status_t status;
2287 wlan_count_attr_t wcattr;
2288
2289 opterr = 0;
2290 while ((option = getopt_long(argc, argv, ":a",
2291 wifi_longopts, NULL)) != -1) {
2292 switch (option) {
2293 case 'a':
2294 all_links = B_TRUE;

--- 8 unchanged lines hidden (view full) ---

2303 link = argv[optind];
2304 else if (optind != argc)
2305 usage();
2306
2307 if (link == NULL) {
2308 if (!all_links) {
2309 wcattr.wc_link = NULL;
2310 wcattr.wc_count = 0;
2246 wlan_count_attr_t wcattr;
2247
2248 opterr = 0;
2249 while ((option = getopt_long(argc, argv, ":a",
2250 wifi_longopts, NULL)) != -1) {
2251 switch (option) {
2252 case 'a':
2253 all_links = B_TRUE;

--- 8 unchanged lines hidden (view full) ---

2262 link = argv[optind];
2263 else if (optind != argc)
2264 usage();
2265
2266 if (link == NULL) {
2267 if (!all_links) {
2268 wcattr.wc_link = NULL;
2269 wcattr.wc_count = 0;
2311 (void) wladm_walk(&wcattr, do_count_wlan);
2270 (void) dladm_wlan_walk(&wcattr, do_count_wlan);
2312 if (wcattr.wc_count == 0) {
2313 die("no wifi links are available");
2314 } else if (wcattr.wc_count > 1) {
2315 die("link name is required when more than "
2316 "one wifi link is available");
2317 }
2318 link = wcattr.wc_link;
2319 } else {
2271 if (wcattr.wc_count == 0) {
2272 die("no wifi links are available");
2273 } else if (wcattr.wc_count > 1) {
2274 die("link name is required when more than "
2275 "one wifi link is available");
2276 }
2277 link = wcattr.wc_link;
2278 } else {
2320 (void) wladm_walk(&all_links, do_all_disconnect_wifi);
2279 (void) dladm_wlan_walk(&all_links,
2280 do_all_disconnect_wifi);
2321 return;
2322 }
2323 }
2281 return;
2282 }
2283 }
2324 status = wladm_disconnect(link);
2325 if (status != WLADM_STATUS_OK)
2326 die_wlerr(status, "cannot disconnect link '%s'", link);
2284 status = dladm_wlan_disconnect(link);
2285 if (status != DLADM_STATUS_OK)
2286 die_dlerr(status, "cannot disconnect link '%s'", link);
2327}
2328
2329#define MAX_PROPS 32
2330#define MAX_PROP_VALS 32
2331#define MAX_PROP_LINE 512
2332
2333typedef struct prop_info {
2334 char *pi_name;

--- 7 unchanged lines hidden (view full) ---

2342 char *pl_buf;
2343} prop_list_t;
2344
2345typedef struct show_linkprop_state {
2346 const char *ls_link;
2347 char *ls_line;
2348 char **ls_propvals;
2349 prop_list_t *ls_proplist;
2287}
2288
2289#define MAX_PROPS 32
2290#define MAX_PROP_VALS 32
2291#define MAX_PROP_LINE 512
2292
2293typedef struct prop_info {
2294 char *pi_name;

--- 7 unchanged lines hidden (view full) ---

2302 char *pl_buf;
2303} prop_list_t;
2304
2305typedef struct show_linkprop_state {
2306 const char *ls_link;
2307 char *ls_line;
2308 char **ls_propvals;
2309 prop_list_t *ls_proplist;
2350 boolean_t ls_parseable;
2351 boolean_t ls_persist;
2352 boolean_t ls_header;
2310 uint32_t ls_parseable : 1,
2311 ls_persist : 1,
2312 ls_header : 1,
2313 ls_pad_bits : 29;
2314 dladm_status_t ls_status;
2353} show_linkprop_state_t;
2354
2355static void
2356free_props(prop_list_t *list)
2357{
2358 if (list != NULL) {
2359 free(list->pl_buf);
2360 free(list);

--- 81 unchanged lines hidden (view full) ---

2442 char *unknown = "?", *notsup = "";
2443 char **propvals = statep->ls_propvals;
2444 uint_t valcnt = MAX_PROP_VALS;
2445 dladm_status_t status;
2446
2447 status = dladm_get_prop(statep->ls_link, type, propname,
2448 propvals, &valcnt);
2449 if (status != DLADM_STATUS_OK) {
2315} show_linkprop_state_t;
2316
2317static void
2318free_props(prop_list_t *list)
2319{
2320 if (list != NULL) {
2321 free(list->pl_buf);
2322 free(list);

--- 81 unchanged lines hidden (view full) ---

2404 char *unknown = "?", *notsup = "";
2405 char **propvals = statep->ls_propvals;
2406 uint_t valcnt = MAX_PROP_VALS;
2407 dladm_status_t status;
2408
2409 status = dladm_get_prop(statep->ls_link, type, propname,
2410 propvals, &valcnt);
2411 if (status != DLADM_STATUS_OK) {
2450 if (status == DLADM_STATUS_NOTSUP || statep->ls_persist) {
2412 if (status == DLADM_STATUS_TEMPONLY) {
2413 statep->ls_status = status;
2414 return;
2415 } else if (status == DLADM_STATUS_NOTSUP ||
2416 statep->ls_persist) {
2451 valcnt = 1;
2452 if (type == DLADM_PROP_VAL_CURRENT)
2453 propvals = &unknown;
2454 else
2455 propvals = &notsup;
2456 } else {
2417 valcnt = 1;
2418 if (type == DLADM_PROP_VAL_CURRENT)
2419 propvals = &unknown;
2420 else
2421 propvals = &notsup;
2422 } else {
2457 die_dlerr(status, "cannot get link property '%s'",
2458 propname);
2423 statep->ls_status = status;
2424 warn_dlerr(status,
2425 "cannot get link property '%s' for %s",
2426 propname, statep->ls_link);
2427 return;
2459 }
2460 }
2461
2462 ptr = buf;
2463 lim = buf + DLADM_STRSIZE;
2464 for (i = 0; i < valcnt; i++) {
2465 if (propvals[i][0] == '\0' && !statep->ls_parseable)
2466 ptr += snprintf(ptr, lim - ptr, "--,");

--- 16 unchanged lines hidden (view full) ---

2483
2484static boolean_t
2485show_linkprop(void *arg, const char *propname)
2486{
2487 show_linkprop_state_t *statep = arg;
2488 char *ptr = statep->ls_line;
2489 char *lim = ptr + MAX_PROP_LINE;
2490
2428 }
2429 }
2430
2431 ptr = buf;
2432 lim = buf + DLADM_STRSIZE;
2433 for (i = 0; i < valcnt; i++) {
2434 if (propvals[i][0] == '\0' && !statep->ls_parseable)
2435 ptr += snprintf(ptr, lim - ptr, "--,");

--- 16 unchanged lines hidden (view full) ---

2452
2453static boolean_t
2454show_linkprop(void *arg, const char *propname)
2455{
2456 show_linkprop_state_t *statep = arg;
2457 char *ptr = statep->ls_line;
2458 char *lim = ptr + MAX_PROP_LINE;
2459
2491 if (statep->ls_persist && dladm_is_prop_temponly(propname, NULL))
2492 return (B_TRUE);
2493
2494 if (statep->ls_parseable)
2495 ptr += snprintf(ptr, lim - ptr, "LINK=\"%s\" ",
2496 statep->ls_link);
2497 else
2498 ptr += snprintf(ptr, lim - ptr, "%-12s ", statep->ls_link);
2499
2500 if (statep->ls_parseable)
2501 ptr += snprintf(ptr, lim - ptr, "PROPERTY=\"%s\" ", propname);
2502 else
2503 ptr += snprintf(ptr, lim - ptr, "%-15s ", propname);
2504
2505 print_linkprop(statep, propname,
2506 statep->ls_persist ? DLADM_PROP_VAL_PERSISTENT :
2507 DLADM_PROP_VAL_CURRENT, "VALUE", "%-14s ", &ptr);
2460 if (statep->ls_parseable)
2461 ptr += snprintf(ptr, lim - ptr, "LINK=\"%s\" ",
2462 statep->ls_link);
2463 else
2464 ptr += snprintf(ptr, lim - ptr, "%-12s ", statep->ls_link);
2465
2466 if (statep->ls_parseable)
2467 ptr += snprintf(ptr, lim - ptr, "PROPERTY=\"%s\" ", propname);
2468 else
2469 ptr += snprintf(ptr, lim - ptr, "%-15s ", propname);
2470
2471 print_linkprop(statep, propname,
2472 statep->ls_persist ? DLADM_PROP_VAL_PERSISTENT :
2473 DLADM_PROP_VAL_CURRENT, "VALUE", "%-14s ", &ptr);
2474
2475 /*
2476 * If we failed to query the link property, for example, query
2477 * the persistent value of a non-persistable link property, simply
2478 * skip the output.
2479 */
2480 if (statep->ls_status != DLADM_STATUS_OK)
2481 return (B_TRUE);
2482
2508 print_linkprop(statep, propname, DLADM_PROP_VAL_DEFAULT,
2509 "DEFAULT", "%-14s ", &ptr);
2483 print_linkprop(statep, propname, DLADM_PROP_VAL_DEFAULT,
2484 "DEFAULT", "%-14s ", &ptr);
2485 if (statep->ls_status != DLADM_STATUS_OK)
2486 return (B_TRUE);
2487
2510 print_linkprop(statep, propname, DLADM_PROP_VAL_MODIFIABLE,
2511 "POSSIBLE", "%-20s ", &ptr);
2488 print_linkprop(statep, propname, DLADM_PROP_VAL_MODIFIABLE,
2489 "POSSIBLE", "%-20s ", &ptr);
2490 if (statep->ls_status != DLADM_STATUS_OK)
2491 return (B_TRUE);
2512
2513 if (statep->ls_header) {
2514 statep->ls_header = B_FALSE;
2515 if (!statep->ls_parseable)
2516 print_linkprop_head();
2517 }
2518 (void) printf("%s\n", statep->ls_line);
2519 return (B_TRUE);

--- 33 unchanged lines hidden (view full) ---

2553 }
2554
2555 if (optind == (argc - 1))
2556 state.ls_link = argv[optind];
2557 else if (optind != argc)
2558 usage();
2559
2560 state.ls_proplist = proplist;
2492
2493 if (statep->ls_header) {
2494 statep->ls_header = B_FALSE;
2495 if (!statep->ls_parseable)
2496 print_linkprop_head();
2497 }
2498 (void) printf("%s\n", statep->ls_line);
2499 return (B_TRUE);

--- 33 unchanged lines hidden (view full) ---

2533 }
2534
2535 if (optind == (argc - 1))
2536 state.ls_link = argv[optind];
2537 else if (optind != argc)
2538 usage();
2539
2540 state.ls_proplist = proplist;
2541 state.ls_status = DLADM_STATUS_OK;
2561
2562 if (state.ls_link == NULL) {
2563 (void) dladm_walk(show_linkprop_onelink, &state);
2564 } else {
2565 show_linkprop_onelink(&state, state.ls_link);
2566 }
2567 free_props(proplist);
2542
2543 if (state.ls_link == NULL) {
2544 (void) dladm_walk(show_linkprop_onelink, &state);
2545 } else {
2546 show_linkprop_onelink(&state, state.ls_link);
2547 }
2548 free_props(proplist);
2549
2550 if (state.ls_status != DLADM_STATUS_OK)
2551 exit(EXIT_FAILURE);
2568}
2569
2570static void
2571show_linkprop_onelink(void *arg, const char *link)
2572{
2573 int i, fd;
2574 char linkname[MAXPATHLEN];
2575 char *buf;

--- 9 unchanged lines hidden (view full) ---

2585
2586 /*
2587 * When some WiFi links are opened for the first time, their hardware
2588 * automatically scans for APs and does other slow operations. Thus,
2589 * if there are no open links, the retrieval of link properties
2590 * (below) will proceed slowly unless we hold the link open.
2591 */
2592 (void) snprintf(linkname, MAXPATHLEN, "/dev/%s", link);
2552}
2553
2554static void
2555show_linkprop_onelink(void *arg, const char *link)
2556{
2557 int i, fd;
2558 char linkname[MAXPATHLEN];
2559 char *buf;

--- 9 unchanged lines hidden (view full) ---

2569
2570 /*
2571 * When some WiFi links are opened for the first time, their hardware
2572 * automatically scans for APs and does other slow operations. Thus,
2573 * if there are no open links, the retrieval of link properties
2574 * (below) will proceed slowly unless we hold the link open.
2575 */
2576 (void) snprintf(linkname, MAXPATHLEN, "/dev/%s", link);
2593 if ((fd = open(linkname, O_RDWR)) < 0)
2594 die("cannot open %s: %s", link, strerror(errno));
2577 if ((fd = open(linkname, O_RDWR)) < 0) {
2578 warn("cannot open %s: %s", link, strerror(errno));
2579 statep->ls_status = DLADM_STATUS_NOTFOUND;
2580 return;
2581 }
2595
2596 buf = malloc((sizeof (char *) + DLADM_PROP_VAL_MAX) * MAX_PROP_VALS +
2597 MAX_PROP_LINE);
2598 if (buf == NULL)
2599 die("insufficient memory");
2600
2601 statep->ls_propvals = (char **)(void *)buf;
2602 for (i = 0; i < MAX_PROP_VALS; i++) {
2603 statep->ls_propvals[i] = buf + sizeof (char *) * MAX_PROP_VALS +
2604 i * DLADM_PROP_VAL_MAX;
2605 }
2606 statep->ls_line = buf +
2607 (sizeof (char *) + DLADM_PROP_VAL_MAX) * MAX_PROP_VALS;
2608
2609 if (proplist != NULL) {
2582
2583 buf = malloc((sizeof (char *) + DLADM_PROP_VAL_MAX) * MAX_PROP_VALS +
2584 MAX_PROP_LINE);
2585 if (buf == NULL)
2586 die("insufficient memory");
2587
2588 statep->ls_propvals = (char **)(void *)buf;
2589 for (i = 0; i < MAX_PROP_VALS; i++) {
2590 statep->ls_propvals[i] = buf + sizeof (char *) * MAX_PROP_VALS +
2591 i * DLADM_PROP_VAL_MAX;
2592 }
2593 statep->ls_line = buf +
2594 (sizeof (char *) + DLADM_PROP_VAL_MAX) * MAX_PROP_VALS;
2595
2596 if (proplist != NULL) {
2610 for (i = 0; i < proplist->pl_count; i++) {
2611 if (!show_linkprop(statep,
2612 proplist->pl_info[i].pi_name))
2613 break;
2614 }
2597 for (i = 0; i < proplist->pl_count; i++)
2598 (void) show_linkprop(statep,
2599 proplist->pl_info[i].pi_name);
2615 } else {
2616 status = dladm_walk_prop(link, statep, show_linkprop);
2617 if (status != DLADM_STATUS_OK)
2600 } else {
2601 status = dladm_walk_prop(link, statep, show_linkprop);
2602 if (status != DLADM_STATUS_OK)
2618 die_dlerr(status, "show-linkprop");
2603 warn_dlerr(status, "show-linkprop failed for %s", link);
2619 }
2620 (void) close(fd);
2621 free(buf);
2622 statep->ls_link = savep;
2623}
2624
2625static dladm_status_t
2626set_linkprop_persist(const char *link, const char *prop_name, char **prop_val,

--- 722 unchanged lines hidden (view full) ---

3349 (void) vfprintf(stderr, format, alist);
3350 va_end(alist);
3351
3352 (void) putchar('\n');
3353}
3354
3355/* PRINTFLIKE2 */
3356static void
2604 }
2605 (void) close(fd);
2606 free(buf);
2607 statep->ls_link = savep;
2608}
2609
2610static dladm_status_t
2611set_linkprop_persist(const char *link, const char *prop_name, char **prop_val,

--- 722 unchanged lines hidden (view full) ---

3334 (void) vfprintf(stderr, format, alist);
3335 va_end(alist);
3336
3337 (void) putchar('\n');
3338}
3339
3340/* PRINTFLIKE2 */
3341static void
3357warn_wlerr(wladm_status_t err, const char *format, ...)
3358{
3359 va_list alist;
3360 char errmsg[WLADM_STRSIZE];
3361
3362 format = gettext(format);
3363 (void) fprintf(stderr, gettext("%s: warning: "), progname);
3364
3365 va_start(alist, format);
3366 (void) vfprintf(stderr, format, alist);
3367 va_end(alist);
3368 (void) fprintf(stderr, ": %s\n", wladm_status2str(err, errmsg));
3369}
3370
3371/* PRINTFLIKE2 */
3372static void
3373warn_dlerr(dladm_status_t err, const char *format, ...)
3374{
3375 va_list alist;
3376 char errmsg[DLADM_STRSIZE];
3377
3378 format = gettext(format);
3379 (void) fprintf(stderr, gettext("%s: warning: "), progname);
3380
3381 va_start(alist, format);
3382 (void) vfprintf(stderr, format, alist);
3383 va_end(alist);
3384 (void) fprintf(stderr, ": %s\n", dladm_status2str(err, errmsg));
3385}
3386
3387/* PRINTFLIKE2 */
3388static void
3342warn_dlerr(dladm_status_t err, const char *format, ...)
3343{
3344 va_list alist;
3345 char errmsg[DLADM_STRSIZE];
3346
3347 format = gettext(format);
3348 (void) fprintf(stderr, gettext("%s: warning: "), progname);
3349
3350 va_start(alist, format);
3351 (void) vfprintf(stderr, format, alist);
3352 va_end(alist);
3353 (void) fprintf(stderr, ": %s\n", dladm_status2str(err, errmsg));
3354}
3355
3356/* PRINTFLIKE2 */
3357static void
3389die_laerr(laadm_diag_t diag, const char *format, ...)
3390{
3391 va_list alist;
3392 char *errstr = strerror(errno);
3393
3394 format = gettext(format);
3395 (void) fprintf(stderr, "%s: ", progname);
3396
3397 va_start(alist, format);
3398 (void) vfprintf(stderr, format, alist);
3399 va_end(alist);
3400
3401 if (diag == 0)
3402 (void) fprintf(stderr, ": %s\n", errstr);
3403 else
3404 (void) fprintf(stderr, ": %s (%s)\n", errstr, laadm_diag(diag));
3405
3406 exit(EXIT_FAILURE);
3407}
3408
3409/* PRINTFLIKE2 */
3410static void
3411die_wlerr(wladm_status_t err, const char *format, ...)
3412{
3413 va_list alist;
3414 char errmsg[WLADM_STRSIZE];
3415
3416 format = gettext(format);
3417 (void) fprintf(stderr, "%s: ", progname);
3418
3419 va_start(alist, format);
3420 (void) vfprintf(stderr, format, alist);
3421 va_end(alist);
3422 (void) fprintf(stderr, ": %s\n", wladm_status2str(err, errmsg));
3423
3424 exit(EXIT_FAILURE);
3425}
3426
3427/* PRINTFLIKE2 */
3428static void
3429die_dlerr(dladm_status_t err, const char *format, ...)
3430{
3431 va_list alist;
3432 char errmsg[DLADM_STRSIZE];
3433
3434 format = gettext(format);
3435 (void) fprintf(stderr, "%s: ", progname);
3436

--- 44 unchanged lines hidden ---
3358die_dlerr(dladm_status_t err, const char *format, ...)
3359{
3360 va_list alist;
3361 char errmsg[DLADM_STRSIZE];
3362
3363 format = gettext(format);
3364 (void) fprintf(stderr, "%s: ", progname);
3365

--- 44 unchanged lines hidden ---