Print this page
OS-281

@@ -19,10 +19,11 @@
  * 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,13 +232,13 @@
 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>] "
+            "\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,15 +332,16 @@
         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:",
+        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,13 +351,10 @@
                 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) >=

@@ -366,18 +365,25 @@
                         (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,15 +418,16 @@
         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:",
+        while ((option = getopt_long(argc, argv, ":tR:l:z:",
             longopts, NULL)) != -1) {
                 switch (option) {
                 case 't':
                         t_arg = B_TRUE;
                         break;

@@ -430,16 +437,15 @@
                 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;
+                case 'z':
+                        zonename = optarg;
+                        break;
                 default:
                         die_opterr(optopt, option);
                         break;
                 }
         }

@@ -456,10 +462,16 @@
                 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,15 +607,16 @@
         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:",
+        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,21 +633,27 @@
                         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;
+                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");