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,27 **** --- 18,28 ---- * * 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,161 **** --- 153,163 ---- 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,273 **** const char *c_usage; } cmd_t; static cmd_t cmds[] = { { "rename-link", do_rename_link, ! " rename-link <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>] " --- 265,275 ---- const char *c_usage; } cmd_t; static cmd_t cmds[] = { { "rename-link", do_rename_link, ! " 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,313 **** { "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>" }, { "reset-linkprop", do_reset_linkprop, ! " reset-linkprop [-t] [-p <prop>,...] <name>" }, { "show-linkprop", do_show_linkprop, ! " show-linkprop [-cP] [-o <field>,...] [-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, --- 300,316 ---- { "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] [-z zonename] -p <prop>=<value>[,...] " ! "<name>" }, { "reset-linkprop", do_reset_linkprop, ! " reset-linkprop [-t] [-z zonename] [-p <prop>,...] <name>"}, { "show-linkprop", do_show_linkprop, ! " 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,358 **** " 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>" }, { "show-vnic", do_show_vnic, ! " show-vnic [-pP] [-l <link>] [-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, --- 348,361 ---- " 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] [-z zonename] <vnic-link>" }, { "show-vnic", do_show_vnic, ! " 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,966 **** --- 960,970 ---- 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,1033 **** char vnic_over[DLPI_LINKNAME_MAX]; char vnic_speed[6]; char vnic_macaddr[18]; char vnic_macaddrtype[19]; char vnic_vid[6]; } 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, offsetof(vnic_fields_buf_t, vnic_over), print_default_cb}, ! { "SPEED", 7, offsetof(vnic_fields_buf_t, vnic_speed), print_default_cb}, { "MACADDRESS", 18, offsetof(vnic_fields_buf_t, vnic_macaddr), print_default_cb}, ! { "MACADDRTYPE", 20, offsetof(vnic_fields_buf_t, vnic_macaddrtype), print_default_cb}, ! { "VID", 7, offsetof(vnic_fields_buf_t, vnic_vid), print_default_cb}, { NULL, 0, 0, NULL}} ; /* * structures for 'dladm show-ib' --- 1013,1040 ---- 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", 11, offsetof(vnic_fields_buf_t, vnic_over), print_default_cb}, ! { "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", 12, offsetof(vnic_fields_buf_t, vnic_macaddrtype), print_default_cb}, ! { "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,2509 **** { int option; char *link1, *link2; char *altroot = NULL; dladm_status_t status; opterr = 0; ! while ((option = getopt_long(argc, argv, ":R:", lopts, NULL)) != -1) { switch (option) { case 'R': altroot = optarg; break; default: die_opterr(optopt, option, use); break; } } --- 2500,2520 ---- { int option; char *link1, *link2; char *altroot = NULL; dladm_status_t status; + char *zonename = NULL; opterr = 0; ! 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,2525 **** if (altroot != NULL) altroot_cmd(altroot, argc, argv); link1 = argv[optind++]; link2 = argv[optind]; ! if ((status = dladm_rename_link(handle, link1, link2)) != DLADM_STATUS_OK) die_dlerr(status, "rename operation failed"); } /*ARGSUSED*/ --- 2526,2536 ---- if (altroot != NULL) altroot_cmd(altroot, argc, argv); link1 = argv[optind++]; link2 = argv[optind]; ! if ((status = dladm_rename_link(handle, zonename, link1, link2)) != DLADM_STATUS_OK) die_dlerr(status, "rename operation failed"); } /*ARGSUSED*/
*** 3405,3419 **** char *allstat_fields = "link,ipackets,rbytes,ierrors,opackets,obytes,oerrors"; ofmt_handle_t ofmt; ofmt_status_t oferr; uint_t ofmtflags = 0; bzero(&state, sizeof (state)); opterr = 0; ! while ((option = getopt_long(argc, argv, ":pPsSi:o:", show_lopts, NULL)) != -1) { switch (option) { case 'p': if (p_arg) die_optdup(option); --- 3416,3431 ---- 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:z:", show_lopts, NULL)) != -1) { switch (option) { case 'p': if (p_arg) die_optdup(option);
*** 3448,3457 **** --- 3460,3472 ---- 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,3484 **** 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) { die_dlerr(status, "link %s is not valid", linkname); } if (!(f & flags)) { die_dlerr(DLADM_STATUS_BADARG, "link %s is %s", --- 3488,3499 ---- uint32_t f; if (strlcpy(linkname, argv[optind], MAXLINKNAMELEN) >= MAXLINKNAMELEN) die("link name too long"); ! 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,4748 **** --- 4754,4769 ---- * '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,4850 **** int option; uint32_t flags = DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST; datalink_id_t linkid; char *altroot = NULL; dladm_status_t status; opterr = 0; ! while ((option = getopt_long(argc, argv, ":R:t", lopts, NULL)) != -1) { switch (option) { case 't': flags &= ~DLADM_OPT_PERSIST; break; case 'R': altroot = optarg; break; default: die_opterr(optopt, option, use); } } --- 4851,4875 ---- 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: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,4864 **** usage(); if (altroot != NULL) altroot_cmd(altroot, argc, argv); ! status = dladm_name2info(handle, 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, --- 4878,4889 ---- usage(); if (altroot != NULL) altroot_cmd(altroot, argc, argv); ! 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,4995 **** --- 5011,5023 ---- 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,5024 **** --- 5043,5064 ---- 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,5099 **** --- 5130,5146 ---- 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,5141 **** const ofmt_field_t *pf; char *all_e_fields = "link"; ofmt_handle_t ofmt; ofmt_status_t oferr; uint_t ofmtflags = 0; bzero(&state, sizeof (state)); opterr = 0; ! while ((option = getopt_long(argc, argv, ":pPl:si:o:", lopts, NULL)) != -1) { switch (option) { case 'p': state.vs_parsable = B_TRUE; break; --- 5175,5189 ---- 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:z:", lopts, NULL)) != -1) { switch (option) { case 'p': state.vs_parsable = B_TRUE; break;
*** 5170,5179 **** --- 5218,5230 ---- break; case 'o': o_arg = B_TRUE; fields_str = optarg; break; + case 'z': + zonename = optarg; + break; default: die_opterr(optopt, option, use); } }
*** 5180,5191 **** 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); if (status != DLADM_STATUS_OK) { die_dlerr(status, "invalid vnic name '%s'", argv[optind]); } (void) strlcpy(state.vs_vnic, argv[optind], MAXLINKNAMELEN); --- 5231,5242 ---- 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_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,5203 **** } else if (optind != argc) { usage(); } if (l_arg) { ! status = dladm_name2info(handle, state.vs_link, &dev_linkid, ! NULL, NULL, NULL); if (status != DLADM_STATUS_OK) { die_dlerr(status, "invalid link name '%s'", state.vs_link); } } --- 5243,5254 ---- } else if (optind != argc) { usage(); } if (l_arg) { ! 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,5214 **** --- 5256,5266 ---- 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,6702 **** --- 6745,6755 ---- 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,6713 **** 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:", prop_longopts, NULL)) != -1) { switch (option) { case 'p': (void) strlcat(propstr, optarg, DLADM_STRSIZE); if (strlcat(propstr, ",", DLADM_STRSIZE) >= --- 6756,6766 ---- 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:z:", prop_longopts, NULL)) != -1) { switch (option) { case 'p': (void) strlcat(propstr, optarg, DLADM_STRSIZE); if (strlcat(propstr, ",", DLADM_STRSIZE) >=
*** 6722,6740 **** flags = DLADM_OPT_PERSIST; break; case 'o': fields_str = 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) { die_dlerr(status, "link %s is not valid", argv[optind]); } } else if (optind != argc) { usage(); } --- 6775,6796 ---- 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_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,6750 **** --- 6797,6807 ---- 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,6794 **** --- 6842,6862 ---- 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,6881 **** 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; opterr = 0; bzero(propstr, DLADM_STRSIZE); ! while ((option = getopt_long(argc, argv, ":p:R:t", prop_longopts, NULL)) != -1) { switch (option) { case 'p': (void) strlcat(propstr, optarg, DLADM_STRSIZE); if (strlcat(propstr, ",", DLADM_STRSIZE) >= --- 6935,6950 ---- 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:tz:", prop_longopts, NULL)) != -1) { switch (option) { case 'p': (void) strlcat(propstr, optarg, DLADM_STRSIZE); if (strlcat(propstr, ",", DLADM_STRSIZE) >=
*** 6886,6895 **** --- 6955,6967 ---- temp = B_TRUE; break; case 'R': altroot = optarg; break; + case 'z': + zonename = optarg; + break; default: die_opterr(optopt, option, use); } }
*** 6908,6919 **** if (altroot != NULL) { dladm_free_props(proplist); altroot_cmd(altroot, argc, argv); } ! status = dladm_name2info(handle, 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; --- 6980,6991 ---- if (altroot != NULL) { dladm_free_props(proplist); altroot_cmd(altroot, argc, argv); } ! 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;