Print this page
OS-281
        
*** 19,28 ****
--- 19,29 ----
   * CDDL HEADER END
   */
  /*
   * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
+  * Copyright 2011 Joyent, Inc.  All rights reserved.
   */
  
  #include <stdio.h>
  #include <locale.h>
  #include <stdarg.h>
*** 231,243 ****
  usage(void)
  {
          (void) fprintf(stderr, gettext("usage: flowadm <subcommand>"
              " <args>...\n"
              "    add-flow       [-t] -l <link> -a <attr>=<value>[,...]\n"
!             "\t\t   [-p <prop>=<value>,...] <flow>\n"
!             "    remove-flow    [-t] {-l <link> | <flow>}\n"
!             "    show-flow      [-p] [-l <link>] "
              "[<flow>]\n\n"
              "    set-flowprop   [-t] -p <prop>=<value>[,...] <flow>\n"
              "    reset-flowprop [-t] [-p <prop>,...] <flow>\n"
              "    show-flowprop  [-cP] [-l <link>] [-p <prop>,...] "
              "[<flow>]\n"));
--- 232,244 ----
  usage(void)
  {
          (void) fprintf(stderr, gettext("usage: flowadm <subcommand>"
              " <args>...\n"
              "    add-flow       [-t] -l <link> -a <attr>=<value>[,...]\n"
!             "\t\t   [-p <prop>=<value>,...] [-z zonename] <flow>\n"
!             "    remove-flow    [-t] [-z zonename] {-l <link> | <flow>}\n"
!             "    show-flow      [-p] [-l <link>] [-z zonename] "
              "[<flow>]\n\n"
              "    set-flowprop   [-t] -p <prop>=<value>[,...] <flow>\n"
              "    reset-flowprop [-t] [-p <prop>,...] <flow>\n"
              "    show-flowprop  [-cP] [-l <link>] [-p <prop>,...] "
              "[<flow>]\n"));
*** 331,345 ****
          char                    propstr[DLADM_STRSIZE];
          char                    attrstr[DLADM_STRSIZE];
          dladm_arg_list_t        *proplist = NULL;
          dladm_arg_list_t        *attrlist = NULL;
          dladm_status_t          status;
  
          bzero(propstr, DLADM_STRSIZE);
          bzero(attrstr, DLADM_STRSIZE);
  
!         while ((option = getopt_long(argc, argv, "tR:l:a:p:",
              prop_longopts, NULL)) != -1) {
                  switch (option) {
                  case 't':
                          t_arg = B_TRUE;
                          break;
--- 332,347 ----
          char                    propstr[DLADM_STRSIZE];
          char                    attrstr[DLADM_STRSIZE];
          dladm_arg_list_t        *proplist = NULL;
          dladm_arg_list_t        *attrlist = NULL;
          dladm_status_t          status;
+         char                    *zonename = NULL;
  
          bzero(propstr, DLADM_STRSIZE);
          bzero(attrstr, DLADM_STRSIZE);
  
!         while ((option = getopt_long(argc, argv, "tR:l:a:p:z:",
              prop_longopts, NULL)) != -1) {
                  switch (option) {
                  case 't':
                          t_arg = B_TRUE;
                          break;
*** 349,361 ****
                  case 'l':
                          if (strlcpy(devname, optarg,
                              MAXLINKNAMELEN) >= MAXLINKNAMELEN) {
                                  die("link name too long");
                          }
-                         if (dladm_name2info(handle, devname, &linkid, NULL,
-                             NULL, NULL) != DLADM_STATUS_OK)
-                                 die("invalid link '%s'", devname);
                          l_arg = B_TRUE;
                          break;
                  case 'a':
                          (void) strlcat(attrstr, optarg, DLADM_STRSIZE);
                          if (strlcat(attrstr, ",", DLADM_STRSIZE) >=
--- 351,360 ----
*** 366,383 ****
--- 365,389 ----
                          (void) strlcat(propstr, optarg, DLADM_STRSIZE);
                          if (strlcat(propstr, ",", DLADM_STRSIZE) >=
                              DLADM_STRSIZE)
                                  die("property list too long '%s'", propstr);
                          break;
+                 case 'z':
+                         zonename = optarg;
+                         break;
                  default:
                          die_opterr(optopt, option);
                  }
          }
          if (!l_arg) {
                  die("link is required");
          }
  
+         if (dladm_zname2info(handle, zonename, devname, &linkid, NULL,
+             NULL, NULL) != DLADM_STATUS_OK)
+                 die("invalid link '%s'", devname);
+ 
          opterr = 0;
          index = optind;
  
          if ((index != (argc - 1)) || match_attr(argv[index]) != NULL) {
                  die("flow name is required");
*** 412,426 ****
          char                    linkname[MAXLINKNAMELEN];
          datalink_id_t           linkid = DATALINK_ALL_LINKID;
          boolean_t               l_arg = B_FALSE;
          remove_flow_state_t     state;
          dladm_status_t          status;
  
          bzero(&state, sizeof (state));
  
          opterr = 0;
!         while ((option = getopt_long(argc, argv, ":tR:l:",
              longopts, NULL)) != -1) {
                  switch (option) {
                  case 't':
                          t_arg = B_TRUE;
                          break;
--- 418,433 ----
          char                    linkname[MAXLINKNAMELEN];
          datalink_id_t           linkid = DATALINK_ALL_LINKID;
          boolean_t               l_arg = B_FALSE;
          remove_flow_state_t     state;
          dladm_status_t          status;
+         char                    *zonename = NULL;
  
          bzero(&state, sizeof (state));
  
          opterr = 0;
!         while ((option = getopt_long(argc, argv, ":tR:l:z:",
              longopts, NULL)) != -1) {
                  switch (option) {
                  case 't':
                          t_arg = B_TRUE;
                          break;
*** 430,445 ****
                  case 'l':
                          if (strlcpy(linkname, optarg,
                              MAXLINKNAMELEN) >= MAXLINKNAMELEN) {
                                  die("link name too long");
                          }
-                         if (dladm_name2info(handle, linkname, &linkid, NULL,
-                             NULL, NULL) != DLADM_STATUS_OK) {
-                                 die("invalid link '%s'", linkname);
-                         }
                          l_arg = B_TRUE;
                          break;
                  default:
                          die_opterr(optopt, option);
                          break;
                  }
          }
--- 437,451 ----
                  case 'l':
                          if (strlcpy(linkname, optarg,
                              MAXLINKNAMELEN) >= MAXLINKNAMELEN) {
                                  die("link name too long");
                          }
                          l_arg = B_TRUE;
                          break;
+                 case 'z':
+                         zonename = optarg;
+                         break;
                  default:
                          die_opterr(optopt, option);
                          break;
                  }
          }
*** 456,465 ****
--- 462,477 ----
                  status = dladm_flow_remove(handle, flowname, t_arg, altroot);
          } else {
                  /* if link is specified then flow name should not be there */
                  if (optind == argc-1)
                          usage();
+ 
+                 if (dladm_zname2info(handle, zonename, linkname, &linkid, NULL,
+                     NULL, NULL) != DLADM_STATUS_OK) {
+                         die("invalid link '%s'", linkname);
+                 }
+ 
                  /* walk the link to find flows and remove them */
                  state.fs_tempop = t_arg;
                  state.fs_altroot = altroot;
                  state.fs_status = DLADM_STATUS_OK;
                  status = dladm_walk_flow(remove_flow, handle, linkid, &state,
*** 595,609 ****
          show_flow_state_t       state;
          char                    *fields_str = NULL;
          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:o:",
              longopts, NULL)) != -1) {
                  switch (option) {
                  case 'p':
                          state.fs_parsable = B_TRUE;
                          ofmtflags |= OFMT_PARSABLE;
--- 607,622 ----
          show_flow_state_t       state;
          char                    *fields_str = NULL;
          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:o:z:",
              longopts, NULL)) != -1) {
                  switch (option) {
                  case 'p':
                          state.fs_parsable = B_TRUE;
                          ofmtflags |= OFMT_PARSABLE;
*** 620,640 ****
                          break;
                  case 'l':
                          if (strlcpy(linkname, optarg, MAXLINKNAMELEN)
                              >= MAXLINKNAMELEN)
                                  die("link name too long\n");
-                         if (dladm_name2info(handle, linkname, &linkid, NULL,
-                             NULL, NULL) != DLADM_STATUS_OK)
-                                 die("invalid link '%s'", linkname);
                          l_arg = B_TRUE;
                          break;
                  default:
                          die_opterr(optopt, option);
                          break;
                  }
          }
  
          /* get flow name (optional last argument */
          if (optind == (argc-1)) {
                  if (strlcpy(flowname, argv[optind], MAXFLOWNAMELEN)
                      >= MAXFLOWNAMELEN)
                          die("flow name too long");
--- 633,659 ----
                          break;
                  case 'l':
                          if (strlcpy(linkname, optarg, MAXLINKNAMELEN)
                              >= MAXLINKNAMELEN)
                                  die("link name too long\n");
                          l_arg = B_TRUE;
                          break;
+                 case 'z':
+                         zonename = optarg;
+                         break;
                  default:
                          die_opterr(optopt, option);
                          break;
                  }
          }
  
+         if (l_arg) {
+                 if (dladm_zname2info(handle, zonename, linkname, &linkid, NULL,
+                     NULL, NULL) != DLADM_STATUS_OK)
+                         die("invalid link '%s'", linkname);
+         }
+ 
          /* get flow name (optional last argument */
          if (optind == (argc-1)) {
                  if (strlcpy(flowname, argv[optind], MAXFLOWNAMELEN)
                      >= MAXFLOWNAMELEN)
                          die("flow name too long");