Print this page
OS-792 dladm show-linkprop -z zonename doesn't restrict output to that zone, unless you also specify the vnic name
OS-406
OS-249

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/dladm/dladm.c
          +++ new/usr/src/cmd/dladm/dladm.c
↓ open down ↓ 12 lines elided ↑ open up ↑
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
       23 + * Copyright (c) 2012 Joyent, Inc. All rights reserved.
  23   24   */
  24   25  
  25   26  #include <stdio.h>
  26   27  #include <ctype.h>
  27   28  #include <dlfcn.h>
  28   29  #include <locale.h>
  29   30  #include <signal.h>
  30   31  #include <stdarg.h>
  31   32  #include <stdlib.h>
  32   33  #include <fcntl.h>
↓ open down ↓ 114 lines elided ↑ open up ↑
 147  148          boolean_t       vs_firstonly;
 148  149          boolean_t       vs_donefirst;
 149  150          boolean_t       vs_stats;
 150  151          boolean_t       vs_printstats;
 151  152          pktsum_t        vs_totalstats;
 152  153          pktsum_t        vs_prevstats[MAXVNIC];
 153  154          boolean_t       vs_etherstub;
 154  155          dladm_status_t  vs_status;
 155  156          uint32_t        vs_flags;
 156  157          ofmt_handle_t   vs_ofmt;
      158 +        char            *vs_zonename;
 157  159  } show_vnic_state_t;
 158  160  
 159  161  typedef struct show_part_state {
 160  162          datalink_id_t   ps_over_id;
 161  163          char            ps_part[MAXLINKNAMELEN];
 162  164          boolean_t       ps_parsable;
 163  165          boolean_t       ps_found;
 164  166          dladm_status_t  ps_status;
 165  167          uint32_t        ps_flags;
 166  168          ofmt_handle_t   ps_ofmt;
↓ open down ↓ 91 lines elided ↑ open up ↑
 258  260  static void     warn_dlerr(dladm_status_t, const char *, ...);
 259  261  
 260  262  typedef struct  cmd {
 261  263          char            *c_name;
 262  264          cmdfunc_t       *c_fn;
 263  265          const char      *c_usage;
 264  266  } cmd_t;
 265  267  
 266  268  static cmd_t    cmds[] = {
 267  269          { "rename-link",        do_rename_link,
 268      -            "    rename-link      <oldlink> <newlink>"                  },
      270 +            "    rename-link      [-z zonename] <oldlink> <newlink>"    },
 269  271          { "show-link",          do_show_link,
 270  272              "    show-link        [-pP] [-o <field>,..] [-s [-i <interval>]] "
 271  273              "[<link>]\n"                                                },
 272  274          { "create-aggr",        do_create_aggr,
 273  275              "    create-aggr      [-t] [-P <policy>] [-L <mode>] [-T <time>] "
 274  276              "[-u <address>]\n"
 275  277              "\t\t     -l <link> [-l <link>...] <link>"                  },
 276  278          { "delete-aggr",        do_delete_aggr,
 277  279              "    delete-aggr      [-t] <link>"                          },
 278  280          { "add-aggr",           do_add_aggr,
↓ open down ↓ 14 lines elided ↑ open up ↑
 293  295              "    connect-wifi     [-e <essid>] [-i <bssid>] [-k <key>,...] "
 294  296              "[-s wep|wpa]\n"
 295  297              "\t\t     [-a open|shared] [-b bss|ibss] [-c] [-m a|b|g] "
 296  298              "[-T <time>]\n"
 297  299              "\t\t     [<link>]"                                         },
 298  300          { "disconnect-wifi",    do_disconnect_wifi,
 299  301              "    disconnect-wifi  [-a] [<link>]"                        },
 300  302          { "show-wifi",          do_show_wifi,
 301  303              "    show-wifi        [-p] [-o <field>,...] [<link>]\n"     },
 302  304          { "set-linkprop",       do_set_linkprop,
 303      -            "    set-linkprop     [-t] -p <prop>=<value>[,...] <name>"  },
      305 +            "    set-linkprop     [-t] [-z zonename] -p <prop>=<value>[,...] "
      306 +            "<name>"                                                    },
 304  307          { "reset-linkprop",     do_reset_linkprop,
 305      -            "    reset-linkprop   [-t] [-p <prop>,...] <name>"          },
      308 +            "    reset-linkprop   [-t] [-z zonename] [-p <prop>,...] <name>"},
 306  309          { "show-linkprop",      do_show_linkprop,
 307      -            "    show-linkprop    [-cP] [-o <field>,...] [-p <prop>,...] "
 308      -            "<name>\n"                                                  },
      310 +            "    show-linkprop    [-cP] [-o <field>,...] [-z zonename] "
      311 +            "[-p <prop>,...] <name>\n"                                  },
 309  312          { "show-ether",         do_show_ether,
 310  313              "    show-ether       [-px][-o <field>,...] <link>\n"       },
 311  314          { "create-secobj",      do_create_secobj,
 312  315              "    create-secobj    [-t] [-f <file>] -c <class> <secobj>" },
 313  316          { "delete-secobj",      do_delete_secobj,
 314  317              "    delete-secobj    [-t] <secobj>[,...]"                  },
 315  318          { "show-secobj",        do_show_secobj,
 316  319              "    show-secobj      [-pP] [-o <field>,...] [<secobj>,...]\n" },
 317  320          { "init-linkprop",      do_init_linkprop,       NULL            },
 318  321          { "init-secobj",        do_init_secobj,         NULL            },
↓ open down ↓ 21 lines elided ↑ open up ↑
 340  343              "    show-phys        [-m | -H | -P] [[-p] [-o <field>[,...]] "
 341  344              "[<link>]\n"                                                },
 342  345          { "init-phys",          do_init_phys,           NULL            },
 343  346          { "show-linkmap",       do_show_linkmap,        NULL            },
 344  347          { "create-vnic",        do_create_vnic,
 345  348              "    create-vnic      [-t] -l <link> [-m <value> | auto |\n"
 346  349              "\t\t     {factory [-n <slot-id>]} | {random [-r <prefix>]} |\n"
 347  350              "\t\t     {vrrp -V <vrid> -A {inet | inet6}} [-v <vid> [-f]]\n"
 348  351              "\t\t     [-p <prop>=<value>[,...]] <vnic-link>"    },
 349  352          { "delete-vnic",        do_delete_vnic,
 350      -            "    delete-vnic      [-t] <vnic-link>"                     },
      353 +            "    delete-vnic      [-t] [-z zonename] <vnic-link>"       },
 351  354          { "show-vnic",          do_show_vnic,
 352      -            "    show-vnic        [-pP] [-l <link>] [-s [-i <interval>]] "
 353      -            "[<link>]\n"                                                },
      355 +            "    show-vnic        [-pP] [-l <link>] [-z zonename] "
      356 +            "[-s [-i <interval>]] [<link>]\n"                                           },
 354  357          { "up-vnic",            do_up_vnic,             NULL            },
 355  358          { "create-part",        do_create_part,
 356  359              "    create-part      [-t] [-f] -l <link> [-P <pkey>]\n"
 357  360              "\t\t     [-R <root-dir>] <part-link>"                      },
 358  361          { "delete-part",        do_delete_part,
 359  362              "    delete-part      [-t] [-R <root-dir>] <part-link>"},
 360  363          { "show-part",          do_show_part,
 361  364              "    show-part        [-pP] [-o <field>,...][-l <linkover>]\n"
 362  365              "\t\t     [<part-link>]"            },
 363  366          { "show-ib",            do_show_ib,
↓ open down ↓ 588 lines elided ↑ open up ↑
 952  955  { "POSSIBLE",   20,     LINKPROP_POSSIBLE,      print_linkprop_cb},
 953  956  { NULL,         0,      0,                      NULL}}
 954  957  ;
 955  958  
 956  959  #define MAX_PROP_LINE           512
 957  960  
 958  961  typedef struct show_linkprop_state {
 959  962          char                    ls_link[MAXLINKNAMELEN];
 960  963          char                    *ls_line;
 961  964          char                    **ls_propvals;
      965 +        char                    *ls_zonename;
 962  966          dladm_arg_list_t        *ls_proplist;
 963  967          boolean_t               ls_parsable;
 964  968          boolean_t               ls_persist;
 965  969          boolean_t               ls_header;
 966  970          dladm_status_t          ls_status;
 967  971          dladm_status_t          ls_retstatus;
 968  972          ofmt_handle_t           ls_ofmt;
 969  973  } show_linkprop_state_t;
 970  974  
 971  975  typedef struct set_linkprop_state {
↓ open down ↓ 32 lines elided ↑ open up ↑
1004 1008   * structures for 'dladm show-vnic'
1005 1009   */
1006 1010  typedef struct vnic_fields_buf_s
1007 1011  {
1008 1012          char vnic_link[DLPI_LINKNAME_MAX];
1009 1013          char vnic_over[DLPI_LINKNAME_MAX];
1010 1014          char vnic_speed[6];
1011 1015          char vnic_macaddr[18];
1012 1016          char vnic_macaddrtype[19];
1013 1017          char vnic_vid[6];
     1018 +        char vnic_zone[ZONENAME_MAX];
1014 1019  } vnic_fields_buf_t;
1015 1020  
1016 1021  static const ofmt_field_t vnic_fields[] = {
1017 1022  { "LINK",               13,
1018 1023          offsetof(vnic_fields_buf_t, vnic_link), print_default_cb},
1019      -{ "OVER",               13,
     1024 +{ "OVER",               11,
1020 1025          offsetof(vnic_fields_buf_t, vnic_over), print_default_cb},
1021      -{ "SPEED",              7,
     1026 +{ "SPEED",              6,
1022 1027          offsetof(vnic_fields_buf_t, vnic_speed), print_default_cb},
1023 1028  { "MACADDRESS",         18,
1024 1029          offsetof(vnic_fields_buf_t, vnic_macaddr), print_default_cb},
1025      -{ "MACADDRTYPE",        20,
     1030 +{ "MACADDRTYPE",        12,
1026 1031          offsetof(vnic_fields_buf_t, vnic_macaddrtype), print_default_cb},
1027      -{ "VID",                7,
     1032 +{ "VID",                5,
1028 1033          offsetof(vnic_fields_buf_t, vnic_vid), print_default_cb},
     1034 +{ "ZONE",               20,
     1035 +        offsetof(vnic_fields_buf_t, vnic_zone), print_default_cb},
1029 1036  { NULL,                 0, 0, NULL}}
1030 1037  ;
1031 1038  
1032 1039  /*
1033 1040   * structures for 'dladm show-ib'
1034 1041   */
1035 1042  typedef struct ib_fields_buf_s
1036 1043  {
1037 1044          char ib_link[DLPI_LINKNAME_MAX];
1038 1045          char ib_hcaguid[17];
↓ open down ↓ 1449 lines elided ↑ open up ↑
2488 2495          do_up_vnic_common(argc, argv, use, B_TRUE);
2489 2496  }
2490 2497  
2491 2498  static void
2492 2499  do_rename_link(int argc, char *argv[], const char *use)
2493 2500  {
2494 2501          int             option;
2495 2502          char            *link1, *link2;
2496 2503          char            *altroot = NULL;
2497 2504          dladm_status_t  status;
     2505 +        char            *zonename = NULL;
2498 2506  
2499 2507          opterr = 0;
2500      -        while ((option = getopt_long(argc, argv, ":R:", lopts, NULL)) != -1) {
     2508 +        while ((option = getopt_long(argc, argv, ":R:z:", lopts, NULL)) != -1) {
2501 2509                  switch (option) {
2502 2510                  case 'R':
2503 2511                          altroot = optarg;
2504 2512                          break;
     2513 +                case 'z':
     2514 +                        zonename = optarg;
     2515 +                        break;
2505 2516                  default:
2506 2517                          die_opterr(optopt, option, use);
2507 2518                          break;
2508 2519                  }
2509 2520          }
2510 2521  
2511 2522          /* get link1 and link2 name (required the last 2 arguments) */
2512 2523          if (optind != (argc - 2))
2513 2524                  usage();
2514 2525  
2515 2526          if (altroot != NULL)
2516 2527                  altroot_cmd(altroot, argc, argv);
2517 2528  
2518 2529          link1 = argv[optind++];
2519 2530          link2 = argv[optind];
2520      -        if ((status = dladm_rename_link(handle, link1, link2)) !=
     2531 +        if ((status = dladm_rename_link(handle, zonename, link1, link2)) !=
2521 2532              DLADM_STATUS_OK)
2522 2533                  die_dlerr(status, "rename operation failed");
2523 2534  }
2524 2535  
2525 2536  /*ARGSUSED*/
2526 2537  static void
2527 2538  do_delete_phys(int argc, char *argv[], const char *use)
2528 2539  {
2529 2540          datalink_id_t   linkid = DATALINK_ALL_LINKID;
2530 2541          dladm_status_t  status;
↓ open down ↓ 869 lines elided ↑ open up ↑
3400 3411          dladm_status_t  status;
3401 3412          boolean_t       o_arg = B_FALSE;
3402 3413          char            *fields_str = NULL;
3403 3414          char            *all_active_fields = "link,class,mtu,state,bridge,over";
3404 3415          char            *all_inactive_fields = "link,class,bridge,over";
3405 3416          char            *allstat_fields =
3406 3417              "link,ipackets,rbytes,ierrors,opackets,obytes,oerrors";
3407 3418          ofmt_handle_t   ofmt;
3408 3419          ofmt_status_t   oferr;
3409 3420          uint_t          ofmtflags = 0;
     3421 +        char            *zonename = NULL;
3410 3422  
3411 3423          bzero(&state, sizeof (state));
3412 3424  
3413 3425          opterr = 0;
3414      -        while ((option = getopt_long(argc, argv, ":pPsSi:o:",
     3426 +        while ((option = getopt_long(argc, argv, ":pPsSi:o:z:",
3415 3427              show_lopts, NULL)) != -1) {
3416 3428                  switch (option) {
3417 3429                  case 'p':
3418 3430                          if (p_arg)
3419 3431                                  die_optdup(option);
3420 3432  
3421 3433                          p_arg = B_TRUE;
3422 3434                          break;
3423 3435                  case 's':
3424 3436                          if (s_arg)
↓ open down ↓ 18 lines elided ↑ open up ↑
3443 3455                          fields_str = optarg;
3444 3456                          break;
3445 3457                  case 'i':
3446 3458                          if (i_arg)
3447 3459                                  die_optdup(option);
3448 3460  
3449 3461                          i_arg = B_TRUE;
3450 3462                          if (!dladm_str2interval(optarg, &interval))
3451 3463                                  die("invalid interval value '%s'", optarg);
3452 3464                          break;
     3465 +                case 'z':
     3466 +                        zonename = optarg;
     3467 +                        break;
3453 3468                  default:
3454 3469                          die_opterr(optopt, option, use);
3455 3470                          break;
3456 3471                  }
3457 3472          }
3458 3473  
3459 3474          if (i_arg && !(s_arg || S_arg))
3460 3475                  die("the option -i can be used only with -s or -S");
3461 3476  
3462 3477          if (s_arg && S_arg)
↓ open down ↓ 5 lines elided ↑ open up ↑
3468 3483          if (S_arg && (p_arg || flags != DLADM_OPT_ACTIVE))
3469 3484                  die("the option -%c cannot be used with -S", p_arg ? 'p' : 'P');
3470 3485  
3471 3486          /* get link name (optional last argument) */
3472 3487          if (optind == (argc-1)) {
3473 3488                  uint32_t        f;
3474 3489  
3475 3490                  if (strlcpy(linkname, argv[optind], MAXLINKNAMELEN) >=
3476 3491                      MAXLINKNAMELEN)
3477 3492                          die("link name too long");
3478      -                if ((status = dladm_name2info(handle, linkname, &linkid, &f,
3479      -                    NULL, NULL)) != DLADM_STATUS_OK) {
     3493 +                if ((status = dladm_zname2info(handle, zonename, linkname,
     3494 +                    &linkid, &f, NULL, NULL)) != DLADM_STATUS_OK) {
3480 3495                          die_dlerr(status, "link %s is not valid", linkname);
3481 3496                  }
3482 3497  
3483 3498                  if (!(f & flags)) {
3484 3499                          die_dlerr(DLADM_STATUS_BADARG, "link %s is %s",
3485 3500                              argv[optind], flags == DLADM_OPT_PERSIST ?
3486 3501                              "a temporary link" : "temporarily removed");
3487 3502                  }
3488 3503          } else if (optind != argc) {
3489 3504                  usage();
↓ open down ↓ 1244 lines elided ↑ open up ↑
4734 4749  
4735 4750          if (mac_addr_type == VNIC_MAC_ADDR_TYPE_UNKNOWN)
4736 4751                  mac_addr_type = VNIC_MAC_ADDR_TYPE_AUTO;
4737 4752  
4738 4753          /*
4739 4754           * 'f' - force, flag can be specified only with 'v' - vlan.
4740 4755           */
4741 4756          if ((flags & DLADM_OPT_FORCE) != 0 && vid == 0)
4742 4757                  die("-f option can only be used with -v");
4743 4758  
     4759 +        /*
     4760 +         * If creating a transient VNIC for a zone, mark it in the kernel.
     4761 +         */
     4762 +        if (strstr(propstr, "zone=") != NULL && !(flags & DLADM_OPT_PERSIST))
     4763 +                flags |= DLADM_OPT_TRANSIENT;
     4764 +
4744 4765          if (mac_prefix_len != 0 && mac_addr_type != VNIC_MAC_ADDR_TYPE_RANDOM &&
4745 4766              mac_addr_type != VNIC_MAC_ADDR_TYPE_FIXED)
4746 4767                  usage();
4747 4768  
4748 4769          if (mac_addr_type == VNIC_MAC_ADDR_TYPE_VRID) {
4749 4770                  if (vrid == VRRP_VRID_NONE || af == AF_UNSPEC ||
4750 4771                      mac_addr != NULL || maclen != 0 || mac_slot != -1 ||
4751 4772                      mac_prefix_len != 0) {
4752 4773                          usage();
4753 4774                  }
↓ open down ↓ 71 lines elided ↑ open up ↑
4825 4846  
4826 4847  static void
4827 4848  do_delete_vnic_common(int argc, char *argv[], const char *use,
4828 4849      boolean_t etherstub)
4829 4850  {
4830 4851          int option;
4831 4852          uint32_t flags = DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST;
4832 4853          datalink_id_t linkid;
4833 4854          char *altroot = NULL;
4834 4855          dladm_status_t status;
     4856 +        char    *zonename = NULL;
4835 4857  
4836 4858          opterr = 0;
4837      -        while ((option = getopt_long(argc, argv, ":R:t", lopts,
     4859 +        while ((option = getopt_long(argc, argv, ":R:tz:", lopts,
4838 4860              NULL)) != -1) {
4839 4861                  switch (option) {
4840 4862                  case 't':
4841 4863                          flags &= ~DLADM_OPT_PERSIST;
4842 4864                          break;
4843 4865                  case 'R':
4844 4866                          altroot = optarg;
4845 4867                          break;
     4868 +                case 'z':
     4869 +                        zonename = optarg;
     4870 +                        break;
4846 4871                  default:
4847 4872                          die_opterr(optopt, option, use);
4848 4873                  }
4849 4874          }
4850 4875  
4851 4876          /* get vnic name (required last argument) */
4852 4877          if (optind != (argc - 1))
4853 4878                  usage();
4854 4879  
4855 4880          if (altroot != NULL)
4856 4881                  altroot_cmd(altroot, argc, argv);
4857 4882  
4858      -        status = dladm_name2info(handle, argv[optind], &linkid, NULL, NULL,
4859      -            NULL);
     4883 +        status = dladm_zname2info(handle, zonename, argv[optind], &linkid, NULL,
     4884 +            NULL, NULL);
4860 4885          if (status != DLADM_STATUS_OK)
4861 4886                  die("invalid link name '%s'", argv[optind]);
4862 4887  
4863 4888          if ((flags & DLADM_OPT_ACTIVE) != 0) {
4864 4889                  do_etherstub_check(argv[optind], linkid, etherstub,
4865 4890                      DLADM_OPT_ACTIVE);
4866 4891          }
4867 4892          if ((flags & DLADM_OPT_PERSIST) != 0) {
4868 4893                  do_etherstub_check(argv[optind], linkid, etherstub,
4869 4894                      DLADM_OPT_PERSIST);
↓ open down ↓ 111 lines elided ↑ open up ↑
4981 5006  static dladm_status_t
4982 5007  print_vnic(show_vnic_state_t *state, datalink_id_t linkid)
4983 5008  {
4984 5009          dladm_vnic_attr_t       attr, *vnic = &attr;
4985 5010          dladm_status_t          status;
4986 5011          boolean_t               is_etherstub;
4987 5012          char                    devname[MAXLINKNAMELEN];
4988 5013          char                    vnic_name[MAXLINKNAMELEN];
4989 5014          char                    mstr[MAXMACADDRLEN * 3];
4990 5015          vnic_fields_buf_t       vbuf;
     5016 +        uint_t                  valcnt = 1;
     5017 +        char                    zonename[DLADM_PROP_VAL_MAX + 1];
     5018 +        char                    *valptr[1];
4991 5019  
4992 5020          if ((status = dladm_vnic_info(handle, linkid, vnic, state->vs_flags)) !=
4993 5021              DLADM_STATUS_OK)
4994 5022                  return (status);
4995 5023  
4996 5024          is_etherstub = (vnic->va_link_id == DATALINK_INVALID_LINKID);
4997 5025          if (state->vs_etherstub != is_etherstub) {
4998 5026                  /*
4999 5027                   * Want all etherstub but it's not one, or want
5000 5028                   * non-etherstub and it's one.
↓ open down ↓ 9 lines elided ↑ open up ↑
5010 5038          if (dladm_datalink_id2info(handle, linkid, NULL, NULL,
5011 5039              NULL, vnic_name, sizeof (vnic_name)) != DLADM_STATUS_OK)
5012 5040                  return (DLADM_STATUS_BADARG);
5013 5041  
5014 5042          bzero(devname, sizeof (devname));
5015 5043          if (!is_etherstub &&
5016 5044              dladm_datalink_id2info(handle, vnic->va_link_id, NULL, NULL,
5017 5045              NULL, devname, sizeof (devname)) != DLADM_STATUS_OK)
5018 5046                  (void) sprintf(devname, "?");
5019 5047  
     5048 +        
     5049 +        zonename[0] = '\0';
     5050 +        if (!is_etherstub) {
     5051 +                valptr[0] = zonename;
     5052 +                (void) dladm_get_linkprop(handle, linkid,
     5053 +                    DLADM_PROP_VAL_CURRENT, "zone", (char **)valptr, &valcnt);
     5054 +        }
     5055 +
     5056 +        if (state->vs_zonename != NULL &&
     5057 +             strcmp(state->vs_zonename, zonename) != 0)
     5058 +                return (DLADM_STATUS_OK);
     5059 +
5020 5060          state->vs_found = B_TRUE;
5021 5061          if (state->vs_stats) {
5022 5062                  /* print vnic statistics */
5023 5063                  pktsum_t vnic_stats;
5024 5064  
5025 5065                  if (state->vs_firstonly) {
5026 5066                          if (state->vs_donefirst)
5027 5067                                  return (0);
5028 5068                          state->vs_donefirst = B_TRUE;
5029 5069                  }
↓ open down ↓ 55 lines elided ↑ open up ↑
5085 5125  
5086 5126                          if (strlen(vbuf.vnic_macaddrtype) > 0) {
5087 5127                                  (void) snprintf(vbuf.vnic_macaddr,
5088 5128                                      sizeof (vbuf.vnic_macaddr), "%s",
5089 5129                                      dladm_aggr_macaddr2str(vnic->va_mac_addr,
5090 5130                                      mstr));
5091 5131                          }
5092 5132  
5093 5133                          (void) snprintf(vbuf.vnic_vid, sizeof (vbuf.vnic_vid),
5094 5134                              "%d", vnic->va_vid);
     5135 +
     5136 +                        if (zonename[0] != '\0')
     5137 +                                (void) snprintf(vbuf.vnic_zone,
     5138 +                                    sizeof (vbuf.vnic_zone), "%s", zonename);
     5139 +                        else
     5140 +                                (void) strlcpy(vbuf.vnic_zone, "--",
     5141 +                                     sizeof (vbuf.vnic_zone));
5095 5142                  }
5096 5143  
5097 5144                  ofmt_print(state->vs_ofmt, &vbuf);
5098 5145  
5099 5146                  return (DLADM_STATUS_OK);
5100 5147          }
5101 5148  }
5102 5149  
5103 5150  /* ARGSUSED */
5104 5151  static int
↓ open down ↓ 18 lines elided ↑ open up ↑
5123 5170          datalink_id_t           dev_linkid = DATALINK_ALL_LINKID;
5124 5171          show_vnic_state_t       state;
5125 5172          dladm_status_t          status;
5126 5173          boolean_t               o_arg = B_FALSE;
5127 5174          char                    *fields_str = NULL;
5128 5175          const ofmt_field_t      *pf;
5129 5176          char                    *all_e_fields = "link";
5130 5177          ofmt_handle_t           ofmt;
5131 5178          ofmt_status_t           oferr;
5132 5179          uint_t                  ofmtflags = 0;
     5180 +        char                    *zonename = NULL;
5133 5181  
5134 5182          bzero(&state, sizeof (state));
5135 5183          opterr = 0;
5136      -        while ((option = getopt_long(argc, argv, ":pPl:si:o:", lopts,
     5184 +        while ((option = getopt_long(argc, argv, ":pPl:si:o:z:", lopts,
5137 5185              NULL)) != -1) {
5138 5186                  switch (option) {
5139 5187                  case 'p':
5140 5188                          state.vs_parsable = B_TRUE;
5141 5189                          break;
5142 5190                  case 'P':
5143 5191                          flags = DLADM_OPT_PERSIST;
5144 5192                          break;
5145 5193                  case 'l':
5146 5194                          if (etherstub)
↓ open down ↓ 18 lines elided ↑ open up ↑
5165 5213                                      "more than once");
5166 5214                          }
5167 5215                          i_arg = B_TRUE;
5168 5216                          if (!dladm_str2interval(optarg, &interval))
5169 5217                                  die("invalid interval value '%s'", optarg);
5170 5218                          break;
5171 5219                  case 'o':
5172 5220                          o_arg = B_TRUE;
5173 5221                          fields_str = optarg;
5174 5222                          break;
     5223 +                case 'z':
     5224 +                        zonename = optarg;
     5225 +                        break;
5175 5226                  default:
5176 5227                          die_opterr(optopt, option, use);
5177 5228                  }
5178 5229          }
5179 5230  
5180 5231          if (i_arg && !s_arg)
5181 5232                  die("the option -i can be used only with -s");
5182 5233  
5183 5234          /* get vnic ID (optional last argument) */
5184 5235          if (optind == (argc - 1)) {
5185      -                status = dladm_name2info(handle, argv[optind], &linkid, NULL,
5186      -                    NULL, NULL);
     5236 +                status = dladm_zname2info(handle, zonename, argv[optind],
     5237 +                    &linkid, NULL, NULL, NULL);
5187 5238                  if (status != DLADM_STATUS_OK) {
5188 5239                          die_dlerr(status, "invalid vnic name '%s'",
5189 5240                              argv[optind]);
5190 5241                  }
5191 5242                  (void) strlcpy(state.vs_vnic, argv[optind], MAXLINKNAMELEN);
5192 5243          } else if (optind != argc) {
5193 5244                  usage();
5194 5245          }
5195 5246  
5196 5247          if (l_arg) {
5197      -                status = dladm_name2info(handle, state.vs_link, &dev_linkid,
5198      -                    NULL, NULL, NULL);
     5248 +                status = dladm_zname2info(handle, zonename, state.vs_link,
     5249 +                    &dev_linkid, NULL, NULL, NULL);
5199 5250                  if (status != DLADM_STATUS_OK) {
5200 5251                          die_dlerr(status, "invalid link name '%s'",
5201 5252                              state.vs_link);
5202 5253                  }
5203 5254          }
5204 5255  
5205 5256          state.vs_vnic_id = linkid;
5206 5257          state.vs_link_id = dev_linkid;
5207 5258          state.vs_etherstub = etherstub;
5208 5259          state.vs_found = B_FALSE;
5209 5260          state.vs_flags = flags;
     5261 +        state.vs_zonename = zonename;
5210 5262  
5211 5263          if (!o_arg || (o_arg && strcasecmp(fields_str, "all") == 0)) {
5212 5264                  if (etherstub)
5213 5265                          fields_str = all_e_fields;
5214 5266          }
5215 5267          pf = vnic_fields;
5216 5268  
5217 5269          if (state.vs_parsable)
5218 5270                  ofmtflags |= OFMT_PARSABLE;
5219 5271          oferr = ofmt_open(fields_str, pf, ofmtflags, 0, &ofmt);
↓ open down ↓ 1468 lines elided ↑ open up ↑
6688 6740          char                    propstr[DLADM_STRSIZE];
6689 6741          dladm_arg_list_t        *proplist = NULL;
6690 6742          datalink_id_t           linkid = DATALINK_ALL_LINKID;
6691 6743          show_linkprop_state_t   state;
6692 6744          uint32_t                flags = DLADM_OPT_ACTIVE;
6693 6745          dladm_status_t          status;
6694 6746          char                    *fields_str = NULL;
6695 6747          ofmt_handle_t           ofmt;
6696 6748          ofmt_status_t           oferr;
6697 6749          uint_t                  ofmtflags = 0;
     6750 +        char                    *zonename = NULL;
6698 6751  
6699 6752          bzero(propstr, DLADM_STRSIZE);
6700 6753          opterr = 0;
6701 6754          state.ls_propvals = NULL;
6702 6755          state.ls_line = NULL;
6703 6756          state.ls_parsable = B_FALSE;
6704 6757          state.ls_persist = B_FALSE;
6705 6758          state.ls_header = B_TRUE;
6706 6759          state.ls_retstatus = DLADM_STATUS_OK;
6707 6760  
6708      -        while ((option = getopt_long(argc, argv, ":p:cPo:",
     6761 +        while ((option = getopt_long(argc, argv, ":p:cPo:z:",
6709 6762              prop_longopts, NULL)) != -1) {
6710 6763                  switch (option) {
6711 6764                  case 'p':
6712 6765                          (void) strlcat(propstr, optarg, DLADM_STRSIZE);
6713 6766                          if (strlcat(propstr, ",", DLADM_STRSIZE) >=
6714 6767                              DLADM_STRSIZE)
6715 6768                                  die("property list too long '%s'", propstr);
6716 6769                          break;
6717 6770                  case 'c':
6718 6771                          state.ls_parsable = B_TRUE;
6719 6772                          break;
6720 6773                  case 'P':
6721 6774                          state.ls_persist = B_TRUE;
6722 6775                          flags = DLADM_OPT_PERSIST;
6723 6776                          break;
6724 6777                  case 'o':
6725 6778                          fields_str = optarg;
6726 6779                          break;
     6780 +                case 'z':
     6781 +                        zonename = optarg;
     6782 +                        break;
6727 6783                  default:
6728 6784                          die_opterr(optopt, option, use);
6729 6785                          break;
6730 6786                  }
6731 6787          }
6732 6788  
6733 6789          if (optind == (argc - 1)) {
6734      -                if ((status = dladm_name2info(handle, argv[optind], &linkid,
6735      -                    NULL, NULL, NULL)) != DLADM_STATUS_OK) {
     6790 +                if ((status = dladm_zname2info(handle, zonename, argv[optind],
     6791 +                    &linkid, NULL, NULL, NULL)) != DLADM_STATUS_OK) {
6736 6792                          die_dlerr(status, "link %s is not valid", argv[optind]);
6737 6793                  }
6738 6794          } else if (optind != argc) {
6739 6795                  usage();
6740 6796          }
6741 6797  
6742 6798          if (dladm_parse_link_props(propstr, &proplist, B_TRUE)
6743 6799              != DLADM_STATUS_OK)
6744 6800                  die("invalid link properties specified");
6745 6801          state.ls_proplist = proplist;
     6802 +        state.ls_zonename = zonename;
6746 6803          state.ls_status = DLADM_STATUS_OK;
6747 6804  
6748 6805          if (state.ls_parsable)
6749 6806                  ofmtflags |= OFMT_PARSABLE;
6750 6807          else
6751 6808                  ofmtflags |= OFMT_WRAP;
6752 6809  
6753 6810          oferr = ofmt_open(fields_str, linkprop_fields, ofmtflags, 0, &ofmt);
6754 6811          dladm_ofmt_check(oferr, state.ls_parsable, ofmt);
6755 6812          state.ls_ofmt = ofmt;
↓ open down ↓ 24 lines elided ↑ open up ↑
6780 6837          dlpi_handle_t           dh = NULL;
6781 6838  
6782 6839          statep->ls_status = DLADM_STATUS_OK;
6783 6840  
6784 6841          if (dladm_datalink_id2info(hdl, linkid, &flags, NULL, NULL,
6785 6842              statep->ls_link, MAXLINKNAMELEN) != DLADM_STATUS_OK) {
6786 6843                  statep->ls_status = DLADM_STATUS_NOTFOUND;
6787 6844                  return (DLADM_WALK_CONTINUE);
6788 6845          }
6789 6846  
     6847 +        if (statep->ls_zonename != NULL) {
     6848 +                datalink_id_t   tlinkid;
     6849 +
     6850 +                if (dladm_zname2info(hdl, statep->ls_zonename, statep->ls_link,
     6851 +                    &tlinkid, NULL, NULL, NULL) != DLADM_STATUS_OK ||
     6852 +                    linkid != tlinkid) {
     6853 +                        statep->ls_status = DLADM_STATUS_NOTFOUND;
     6854 +                        return (DLADM_WALK_CONTINUE);
     6855 +                }
     6856 +        }
     6857 +
6790 6858          if ((statep->ls_persist && !(flags & DLADM_OPT_PERSIST)) ||
6791 6859              (!statep->ls_persist && !(flags & DLADM_OPT_ACTIVE))) {
6792 6860                  statep->ls_status = DLADM_STATUS_BADARG;
6793 6861                  return (DLADM_WALK_CONTINUE);
6794 6862          }
6795 6863  
6796 6864          proplist = statep->ls_proplist;
6797 6865  
6798 6866          /*
6799 6867           * When some WiFi links are opened for the first time, their hardware
↓ open down ↓ 62 lines elided ↑ open up ↑
6862 6930  set_linkprop(int argc, char **argv, boolean_t reset, const char *use)
6863 6931  {
6864 6932          int                     i, option;
6865 6933          char                    errmsg[DLADM_STRSIZE];
6866 6934          char                    *altroot = NULL;
6867 6935          datalink_id_t           linkid;
6868 6936          boolean_t               temp = B_FALSE;
6869 6937          dladm_status_t          status = DLADM_STATUS_OK;
6870 6938          char                    propstr[DLADM_STRSIZE];
6871 6939          dladm_arg_list_t        *proplist = NULL;
     6940 +        char                    *zonename = NULL;
6872 6941  
6873 6942          opterr = 0;
6874 6943          bzero(propstr, DLADM_STRSIZE);
6875 6944  
6876      -        while ((option = getopt_long(argc, argv, ":p:R:t",
     6945 +        while ((option = getopt_long(argc, argv, ":p:R:tz:",
6877 6946              prop_longopts, NULL)) != -1) {
6878 6947                  switch (option) {
6879 6948                  case 'p':
6880 6949                          (void) strlcat(propstr, optarg, DLADM_STRSIZE);
6881 6950                          if (strlcat(propstr, ",", DLADM_STRSIZE) >=
6882 6951                              DLADM_STRSIZE)
6883 6952                                  die("property list too long '%s'", propstr);
6884 6953                          break;
6885 6954                  case 't':
6886 6955                          temp = B_TRUE;
6887 6956                          break;
6888 6957                  case 'R':
6889 6958                          altroot = optarg;
6890 6959                          break;
     6960 +                case 'z':
     6961 +                        zonename = optarg;
     6962 +                        break;
6891 6963                  default:
6892 6964                          die_opterr(optopt, option, use);
6893 6965  
6894 6966                  }
6895 6967          }
6896 6968  
6897 6969          /* get link name (required last argument) */
6898 6970          if (optind != (argc - 1))
6899 6971                  usage();
6900 6972  
↓ open down ↓ 2 lines elided ↑ open up ↑
6903 6975                  die("invalid link properties specified");
6904 6976  
6905 6977          if (proplist == NULL && !reset)
6906 6978                  die("link property must be specified");
6907 6979  
6908 6980          if (altroot != NULL) {
6909 6981                  dladm_free_props(proplist);
6910 6982                  altroot_cmd(altroot, argc, argv);
6911 6983          }
6912 6984  
6913      -        status = dladm_name2info(handle, argv[optind], &linkid, NULL, NULL,
6914      -            NULL);
     6985 +        status = dladm_zname2info(handle, zonename, argv[optind], &linkid,
     6986 +            NULL, NULL, NULL);
6915 6987          if (status != DLADM_STATUS_OK)
6916 6988                  die_dlerr(status, "link %s is not valid", argv[optind]);
6917 6989  
6918 6990          if (proplist == NULL) {
6919 6991                  set_linkprop_state_t    state;
6920 6992  
6921 6993                  state.ls_name = argv[optind];
6922 6994                  state.ls_reset = reset;
6923 6995                  state.ls_temp = temp;
6924 6996                  state.ls_status = DLADM_STATUS_OK;
↓ open down ↓ 2767 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX