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

@@ -18,10 +18,11 @@
  *
  * CDDL HEADER END
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012 Joyent, Inc. All rights reserved.
  */
 
 #include <stdio.h>
 #include <ctype.h>
 #include <dlfcn.h>

@@ -152,10 +153,11 @@
         pktsum_t        vs_prevstats[MAXVNIC];
         boolean_t       vs_etherstub;
         dladm_status_t  vs_status;
         uint32_t        vs_flags;
         ofmt_handle_t   vs_ofmt;
+        char            *vs_zonename;
 } show_vnic_state_t;
 
 typedef struct show_part_state {
         datalink_id_t   ps_over_id;
         char            ps_part[MAXLINKNAMELEN];

@@ -263,11 +265,11 @@
         const char      *c_usage;
 } cmd_t;
 
 static cmd_t    cmds[] = {
         { "rename-link",        do_rename_link,
-            "    rename-link      <oldlink> <newlink>"                  },
+            "    rename-link      [-z zonename] <oldlink> <newlink>"    },
         { "show-link",          do_show_link,
             "    show-link        [-pP] [-o <field>,..] [-s [-i <interval>]] "
             "[<link>]\n"                                                },
         { "create-aggr",        do_create_aggr,
             "    create-aggr      [-t] [-P <policy>] [-L <mode>] [-T <time>] "

@@ -298,16 +300,17 @@
         { "disconnect-wifi",    do_disconnect_wifi,
             "    disconnect-wifi  [-a] [<link>]"                        },
         { "show-wifi",          do_show_wifi,
             "    show-wifi        [-p] [-o <field>,...] [<link>]\n"     },
         { "set-linkprop",       do_set_linkprop,
-            "    set-linkprop     [-t] -p <prop>=<value>[,...] <name>"  },
+            "    set-linkprop     [-t] [-z zonename] -p <prop>=<value>[,...] "
+            "<name>"                                                    },
         { "reset-linkprop",     do_reset_linkprop,
-            "    reset-linkprop   [-t] [-p <prop>,...] <name>"          },
+            "    reset-linkprop   [-t] [-z zonename] [-p <prop>,...] <name>"},
         { "show-linkprop",      do_show_linkprop,
-            "    show-linkprop    [-cP] [-o <field>,...] [-p <prop>,...] "
-            "<name>\n"                                                  },
+            "    show-linkprop    [-cP] [-o <field>,...] [-z zonename] "
+            "[-p <prop>,...] <name>\n"                                  },
         { "show-ether",         do_show_ether,
             "    show-ether       [-px][-o <field>,...] <link>\n"       },
         { "create-secobj",      do_create_secobj,
             "    create-secobj    [-t] [-f <file>] -c <class> <secobj>" },
         { "delete-secobj",      do_delete_secobj,

@@ -345,14 +348,14 @@
             "    create-vnic      [-t] -l <link> [-m <value> | auto |\n"
             "\t\t     {factory [-n <slot-id>]} | {random [-r <prefix>]} |\n"
             "\t\t     {vrrp -V <vrid> -A {inet | inet6}} [-v <vid> [-f]]\n"
             "\t\t     [-p <prop>=<value>[,...]] <vnic-link>"    },
         { "delete-vnic",        do_delete_vnic,
-            "    delete-vnic      [-t] <vnic-link>"                     },
+            "    delete-vnic      [-t] [-z zonename] <vnic-link>"       },
         { "show-vnic",          do_show_vnic,
-            "    show-vnic        [-pP] [-l <link>] [-s [-i <interval>]] "
-            "[<link>]\n"                                                },
+            "    show-vnic        [-pP] [-l <link>] [-z zonename] "
+            "[-s [-i <interval>]] [<link>]\n"                                           },
         { "up-vnic",            do_up_vnic,             NULL            },
         { "create-part",        do_create_part,
             "    create-part      [-t] [-f] -l <link> [-P <pkey>]\n"
             "\t\t     [-R <root-dir>] <part-link>"                      },
         { "delete-part",        do_delete_part,

@@ -957,10 +960,11 @@
 
 typedef struct show_linkprop_state {
         char                    ls_link[MAXLINKNAMELEN];
         char                    *ls_line;
         char                    **ls_propvals;
+        char                    *ls_zonename;
         dladm_arg_list_t        *ls_proplist;
         boolean_t               ls_parsable;
         boolean_t               ls_persist;
         boolean_t               ls_header;
         dladm_status_t          ls_status;

@@ -1009,25 +1013,28 @@
         char vnic_over[DLPI_LINKNAME_MAX];
         char vnic_speed[6];
         char vnic_macaddr[18];
         char vnic_macaddrtype[19];
         char vnic_vid[6];
+        char vnic_zone[ZONENAME_MAX];
 } vnic_fields_buf_t;
 
 static const ofmt_field_t vnic_fields[] = {
 { "LINK",               13,
         offsetof(vnic_fields_buf_t, vnic_link), print_default_cb},
-{ "OVER",               13,
+{ "OVER",               11,
         offsetof(vnic_fields_buf_t, vnic_over), print_default_cb},
-{ "SPEED",              7,
+{ "SPEED",              6,
         offsetof(vnic_fields_buf_t, vnic_speed), print_default_cb},
 { "MACADDRESS",         18,
         offsetof(vnic_fields_buf_t, vnic_macaddr), print_default_cb},
-{ "MACADDRTYPE",        20,
+{ "MACADDRTYPE",        12,
         offsetof(vnic_fields_buf_t, vnic_macaddrtype), print_default_cb},
-{ "VID",                7,
+{ "VID",                5,
         offsetof(vnic_fields_buf_t, vnic_vid), print_default_cb},
+{ "ZONE",               20,
+        offsetof(vnic_fields_buf_t, vnic_zone), print_default_cb},
 { NULL,                 0, 0, NULL}}
 ;
 
 /*
  * structures for 'dladm show-ib'

@@ -2493,17 +2500,21 @@
 {
         int             option;
         char            *link1, *link2;
         char            *altroot = NULL;
         dladm_status_t  status;
+        char            *zonename = NULL;
 
         opterr = 0;
-        while ((option = getopt_long(argc, argv, ":R:", lopts, NULL)) != -1) {
+        while ((option = getopt_long(argc, argv, ":R:z:", lopts, NULL)) != -1) {
                 switch (option) {
                 case 'R':
                         altroot = optarg;
                         break;
+                case 'z':
+                        zonename = optarg;
+                        break;
                 default:
                         die_opterr(optopt, option, use);
                         break;
                 }
         }

@@ -2515,11 +2526,11 @@
         if (altroot != NULL)
                 altroot_cmd(altroot, argc, argv);
 
         link1 = argv[optind++];
         link2 = argv[optind];
-        if ((status = dladm_rename_link(handle, link1, link2)) !=
+        if ((status = dladm_rename_link(handle, zonename, link1, link2)) !=
             DLADM_STATUS_OK)
                 die_dlerr(status, "rename operation failed");
 }
 
 /*ARGSUSED*/

@@ -3405,15 +3416,16 @@
         char            *allstat_fields =
             "link,ipackets,rbytes,ierrors,opackets,obytes,oerrors";
         ofmt_handle_t   ofmt;
         ofmt_status_t   oferr;
         uint_t          ofmtflags = 0;
+        char            *zonename = NULL;
 
         bzero(&state, sizeof (state));
 
         opterr = 0;
-        while ((option = getopt_long(argc, argv, ":pPsSi:o:",
+        while ((option = getopt_long(argc, argv, ":pPsSi:o:z:",
             show_lopts, NULL)) != -1) {
                 switch (option) {
                 case 'p':
                         if (p_arg)
                                 die_optdup(option);

@@ -3448,10 +3460,13 @@
 
                         i_arg = B_TRUE;
                         if (!dladm_str2interval(optarg, &interval))
                                 die("invalid interval value '%s'", optarg);
                         break;
+                case 'z':
+                        zonename = optarg;
+                        break;
                 default:
                         die_opterr(optopt, option, use);
                         break;
                 }
         }

@@ -3473,12 +3488,12 @@
                 uint32_t        f;
 
                 if (strlcpy(linkname, argv[optind], MAXLINKNAMELEN) >=
                     MAXLINKNAMELEN)
                         die("link name too long");
-                if ((status = dladm_name2info(handle, linkname, &linkid, &f,
-                    NULL, NULL)) != DLADM_STATUS_OK) {
+                if ((status = dladm_zname2info(handle, zonename, linkname,
+                    &linkid, &f, NULL, NULL)) != DLADM_STATUS_OK) {
                         die_dlerr(status, "link %s is not valid", linkname);
                 }
 
                 if (!(f & flags)) {
                         die_dlerr(DLADM_STATUS_BADARG, "link %s is %s",

@@ -4739,10 +4754,16 @@
          * 'f' - force, flag can be specified only with 'v' - vlan.
          */
         if ((flags & DLADM_OPT_FORCE) != 0 && vid == 0)
                 die("-f option can only be used with -v");
 
+        /*
+         * If creating a transient VNIC for a zone, mark it in the kernel.
+         */
+        if (strstr(propstr, "zone=") != NULL && !(flags & DLADM_OPT_PERSIST))
+                flags |= DLADM_OPT_TRANSIENT;
+
         if (mac_prefix_len != 0 && mac_addr_type != VNIC_MAC_ADDR_TYPE_RANDOM &&
             mac_addr_type != VNIC_MAC_ADDR_TYPE_FIXED)
                 usage();
 
         if (mac_addr_type == VNIC_MAC_ADDR_TYPE_VRID) {

@@ -4830,21 +4851,25 @@
         int option;
         uint32_t flags = DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST;
         datalink_id_t linkid;
         char *altroot = NULL;
         dladm_status_t status;
+        char    *zonename = NULL;
 
         opterr = 0;
-        while ((option = getopt_long(argc, argv, ":R:t", lopts,
+        while ((option = getopt_long(argc, argv, ":R:tz:", lopts,
             NULL)) != -1) {
                 switch (option) {
                 case 't':
                         flags &= ~DLADM_OPT_PERSIST;
                         break;
                 case 'R':
                         altroot = optarg;
                         break;
+                case 'z':
+                        zonename = optarg;
+                        break;
                 default:
                         die_opterr(optopt, option, use);
                 }
         }
 

@@ -4853,12 +4878,12 @@
                 usage();
 
         if (altroot != NULL)
                 altroot_cmd(altroot, argc, argv);
 
-        status = dladm_name2info(handle, argv[optind], &linkid, NULL, NULL,
-            NULL);
+        status = dladm_zname2info(handle, zonename, argv[optind], &linkid, NULL,
+            NULL, NULL);
         if (status != DLADM_STATUS_OK)
                 die("invalid link name '%s'", argv[optind]);
 
         if ((flags & DLADM_OPT_ACTIVE) != 0) {
                 do_etherstub_check(argv[optind], linkid, etherstub,

@@ -4986,10 +5011,13 @@
         boolean_t               is_etherstub;
         char                    devname[MAXLINKNAMELEN];
         char                    vnic_name[MAXLINKNAMELEN];
         char                    mstr[MAXMACADDRLEN * 3];
         vnic_fields_buf_t       vbuf;
+        uint_t                  valcnt = 1;
+        char                    zonename[DLADM_PROP_VAL_MAX + 1];
+        char                    *valptr[1];
 
         if ((status = dladm_vnic_info(handle, linkid, vnic, state->vs_flags)) !=
             DLADM_STATUS_OK)
                 return (status);
 

@@ -5015,10 +5043,22 @@
         if (!is_etherstub &&
             dladm_datalink_id2info(handle, vnic->va_link_id, NULL, NULL,
             NULL, devname, sizeof (devname)) != DLADM_STATUS_OK)
                 (void) sprintf(devname, "?");
 
+        
+        zonename[0] = '\0';
+        if (!is_etherstub) {
+                valptr[0] = zonename;
+                (void) dladm_get_linkprop(handle, linkid,
+                    DLADM_PROP_VAL_CURRENT, "zone", (char **)valptr, &valcnt);
+        }
+
+        if (state->vs_zonename != NULL &&
+             strcmp(state->vs_zonename, zonename) != 0)
+                return (DLADM_STATUS_OK);
+
         state->vs_found = B_TRUE;
         if (state->vs_stats) {
                 /* print vnic statistics */
                 pktsum_t vnic_stats;
 

@@ -5090,10 +5130,17 @@
                                     mstr));
                         }
 
                         (void) snprintf(vbuf.vnic_vid, sizeof (vbuf.vnic_vid),
                             "%d", vnic->va_vid);
+
+                        if (zonename[0] != '\0')
+                                (void) snprintf(vbuf.vnic_zone,
+                                    sizeof (vbuf.vnic_zone), "%s", zonename);
+                        else
+                                (void) strlcpy(vbuf.vnic_zone, "--",
+                                     sizeof (vbuf.vnic_zone));
                 }
 
                 ofmt_print(state->vs_ofmt, &vbuf);
 
                 return (DLADM_STATUS_OK);

@@ -5128,14 +5175,15 @@
         const ofmt_field_t      *pf;
         char                    *all_e_fields = "link";
         ofmt_handle_t           ofmt;
         ofmt_status_t           oferr;
         uint_t                  ofmtflags = 0;
+        char                    *zonename = NULL;
 
         bzero(&state, sizeof (state));
         opterr = 0;
-        while ((option = getopt_long(argc, argv, ":pPl:si:o:", lopts,
+        while ((option = getopt_long(argc, argv, ":pPl:si:o:z:", lopts,
             NULL)) != -1) {
                 switch (option) {
                 case 'p':
                         state.vs_parsable = B_TRUE;
                         break;

@@ -5170,10 +5218,13 @@
                         break;
                 case 'o':
                         o_arg = B_TRUE;
                         fields_str = optarg;
                         break;
+                case 'z':
+                        zonename = optarg;
+                        break;
                 default:
                         die_opterr(optopt, option, use);
                 }
         }
 

@@ -5180,12 +5231,12 @@
         if (i_arg && !s_arg)
                 die("the option -i can be used only with -s");
 
         /* get vnic ID (optional last argument) */
         if (optind == (argc - 1)) {
-                status = dladm_name2info(handle, argv[optind], &linkid, NULL,
-                    NULL, NULL);
+                status = dladm_zname2info(handle, zonename, argv[optind],
+                    &linkid, NULL, NULL, NULL);
                 if (status != DLADM_STATUS_OK) {
                         die_dlerr(status, "invalid vnic name '%s'",
                             argv[optind]);
                 }
                 (void) strlcpy(state.vs_vnic, argv[optind], MAXLINKNAMELEN);

@@ -5192,12 +5243,12 @@
         } else if (optind != argc) {
                 usage();
         }
 
         if (l_arg) {
-                status = dladm_name2info(handle, state.vs_link, &dev_linkid,
-                    NULL, NULL, NULL);
+                status = dladm_zname2info(handle, zonename, state.vs_link,
+                    &dev_linkid, NULL, NULL, NULL);
                 if (status != DLADM_STATUS_OK) {
                         die_dlerr(status, "invalid link name '%s'",
                             state.vs_link);
                 }
         }

@@ -5205,10 +5256,11 @@
         state.vs_vnic_id = linkid;
         state.vs_link_id = dev_linkid;
         state.vs_etherstub = etherstub;
         state.vs_found = B_FALSE;
         state.vs_flags = flags;
+        state.vs_zonename = zonename;
 
         if (!o_arg || (o_arg && strcasecmp(fields_str, "all") == 0)) {
                 if (etherstub)
                         fields_str = all_e_fields;
         }

@@ -6693,10 +6745,11 @@
         dladm_status_t          status;
         char                    *fields_str = NULL;
         ofmt_handle_t           ofmt;
         ofmt_status_t           oferr;
         uint_t                  ofmtflags = 0;
+        char                    *zonename = NULL;
 
         bzero(propstr, DLADM_STRSIZE);
         opterr = 0;
         state.ls_propvals = NULL;
         state.ls_line = NULL;

@@ -6703,11 +6756,11 @@
         state.ls_parsable = B_FALSE;
         state.ls_persist = B_FALSE;
         state.ls_header = B_TRUE;
         state.ls_retstatus = DLADM_STATUS_OK;
 
-        while ((option = getopt_long(argc, argv, ":p:cPo:",
+        while ((option = getopt_long(argc, argv, ":p:cPo:z:",
             prop_longopts, NULL)) != -1) {
                 switch (option) {
                 case 'p':
                         (void) strlcat(propstr, optarg, DLADM_STRSIZE);
                         if (strlcat(propstr, ",", DLADM_STRSIZE) >=

@@ -6722,19 +6775,22 @@
                         flags = DLADM_OPT_PERSIST;
                         break;
                 case 'o':
                         fields_str = optarg;
                         break;
+                case 'z':
+                        zonename = optarg;
+                        break;
                 default:
                         die_opterr(optopt, option, use);
                         break;
                 }
         }
 
         if (optind == (argc - 1)) {
-                if ((status = dladm_name2info(handle, argv[optind], &linkid,
-                    NULL, NULL, NULL)) != DLADM_STATUS_OK) {
+                if ((status = dladm_zname2info(handle, zonename, argv[optind],
+                    &linkid, NULL, NULL, NULL)) != DLADM_STATUS_OK) {
                         die_dlerr(status, "link %s is not valid", argv[optind]);
                 }
         } else if (optind != argc) {
                 usage();
         }

@@ -6741,10 +6797,11 @@
 
         if (dladm_parse_link_props(propstr, &proplist, B_TRUE)
             != DLADM_STATUS_OK)
                 die("invalid link properties specified");
         state.ls_proplist = proplist;
+        state.ls_zonename = zonename;
         state.ls_status = DLADM_STATUS_OK;
 
         if (state.ls_parsable)
                 ofmtflags |= OFMT_PARSABLE;
         else

@@ -6785,10 +6842,21 @@
             statep->ls_link, MAXLINKNAMELEN) != DLADM_STATUS_OK) {
                 statep->ls_status = DLADM_STATUS_NOTFOUND;
                 return (DLADM_WALK_CONTINUE);
         }
 
+        if (statep->ls_zonename != NULL) {
+                datalink_id_t   tlinkid;
+
+                if (dladm_zname2info(hdl, statep->ls_zonename, statep->ls_link,
+                    &tlinkid, NULL, NULL, NULL) != DLADM_STATUS_OK ||
+                    linkid != tlinkid) {
+                        statep->ls_status = DLADM_STATUS_NOTFOUND;
+                        return (DLADM_WALK_CONTINUE);
+                }
+        }
+
         if ((statep->ls_persist && !(flags & DLADM_OPT_PERSIST)) ||
             (!statep->ls_persist && !(flags & DLADM_OPT_ACTIVE))) {
                 statep->ls_status = DLADM_STATUS_BADARG;
                 return (DLADM_WALK_CONTINUE);
         }

@@ -6867,15 +6935,16 @@
         datalink_id_t           linkid;
         boolean_t               temp = B_FALSE;
         dladm_status_t          status = DLADM_STATUS_OK;
         char                    propstr[DLADM_STRSIZE];
         dladm_arg_list_t        *proplist = NULL;
+        char                    *zonename = NULL;
 
         opterr = 0;
         bzero(propstr, DLADM_STRSIZE);
 
-        while ((option = getopt_long(argc, argv, ":p:R:t",
+        while ((option = getopt_long(argc, argv, ":p:R:tz:",
             prop_longopts, NULL)) != -1) {
                 switch (option) {
                 case 'p':
                         (void) strlcat(propstr, optarg, DLADM_STRSIZE);
                         if (strlcat(propstr, ",", DLADM_STRSIZE) >=

@@ -6886,10 +6955,13 @@
                         temp = B_TRUE;
                         break;
                 case 'R':
                         altroot = optarg;
                         break;
+                case 'z':
+                        zonename = optarg;
+                        break;
                 default:
                         die_opterr(optopt, option, use);
 
                 }
         }

@@ -6908,12 +6980,12 @@
         if (altroot != NULL) {
                 dladm_free_props(proplist);
                 altroot_cmd(altroot, argc, argv);
         }
 
-        status = dladm_name2info(handle, argv[optind], &linkid, NULL, NULL,
-            NULL);
+        status = dladm_zname2info(handle, zonename, argv[optind], &linkid,
+            NULL, NULL, NULL);
         if (status != DLADM_STATUS_OK)
                 die_dlerr(status, "link %s is not valid", argv[optind]);
 
         if (proplist == NULL) {
                 set_linkprop_state_t    state;