Print this page
OS-281

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/flowadm/flowadm.c
          +++ new/usr/src/cmd/flowadm/flowadm.c
↓ open down ↓ 13 lines elided ↑ open up ↑
  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 2010 Sun Microsystems, Inc.  All rights reserved.
  23   23   * Use is subject to license terms.
       24 + * Copyright 2011 Joyent, Inc.  All rights reserved.
  24   25   */
  25   26  
  26   27  #include <stdio.h>
  27   28  #include <locale.h>
  28   29  #include <stdarg.h>
  29   30  #include <stdlib.h>
  30   31  #include <fcntl.h>
  31   32  #include <string.h>
  32   33  #include <stropts.h>
  33   34  #include <errno.h>
↓ open down ↓ 192 lines elided ↑ open up ↑
 226  227              "dsfield"};
 227  228  
 228  229  #define NATTR   (sizeof (attr_table)/sizeof (char *))
 229  230  
 230  231  static void
 231  232  usage(void)
 232  233  {
 233  234          (void) fprintf(stderr, gettext("usage: flowadm <subcommand>"
 234  235              " <args>...\n"
 235  236              "    add-flow       [-t] -l <link> -a <attr>=<value>[,...]\n"
 236      -            "\t\t   [-p <prop>=<value>,...] <flow>\n"
 237      -            "    remove-flow    [-t] {-l <link> | <flow>}\n"
 238      -            "    show-flow      [-p] [-l <link>] "
      237 +            "\t\t   [-p <prop>=<value>,...] [-z zonename] <flow>\n"
      238 +            "    remove-flow    [-t] [-z zonename] {-l <link> | <flow>}\n"
      239 +            "    show-flow      [-p] [-l <link>] [-z zonename] "
 239  240              "[<flow>]\n\n"
 240  241              "    set-flowprop   [-t] -p <prop>=<value>[,...] <flow>\n"
 241  242              "    reset-flowprop [-t] [-p <prop>,...] <flow>\n"
 242  243              "    show-flowprop  [-cP] [-l <link>] [-p <prop>,...] "
 243  244              "[<flow>]\n"));
 244  245  
 245  246          /* close dladm handle if it was opened */
 246  247          if (handle != NULL)
 247  248                  dladm_close(handle);
 248  249  
↓ open down ↓ 77 lines elided ↑ open up ↑
 326  327          uint_t                  index;
 327  328          datalink_id_t           linkid;
 328  329  
 329  330          char                    option;
 330  331          boolean_t               l_arg = B_FALSE;
 331  332          char                    propstr[DLADM_STRSIZE];
 332  333          char                    attrstr[DLADM_STRSIZE];
 333  334          dladm_arg_list_t        *proplist = NULL;
 334  335          dladm_arg_list_t        *attrlist = NULL;
 335  336          dladm_status_t          status;
      337 +        char                    *zonename = NULL;
 336  338  
 337  339          bzero(propstr, DLADM_STRSIZE);
 338  340          bzero(attrstr, DLADM_STRSIZE);
 339  341  
 340      -        while ((option = getopt_long(argc, argv, "tR:l:a:p:",
      342 +        while ((option = getopt_long(argc, argv, "tR:l:a:p:z:",
 341  343              prop_longopts, NULL)) != -1) {
 342  344                  switch (option) {
 343  345                  case 't':
 344  346                          t_arg = B_TRUE;
 345  347                          break;
 346  348                  case 'R':
 347  349                          altroot = optarg;
 348  350                          break;
 349  351                  case 'l':
 350  352                          if (strlcpy(devname, optarg,
 351  353                              MAXLINKNAMELEN) >= MAXLINKNAMELEN) {
 352  354                                  die("link name too long");
 353  355                          }
 354      -                        if (dladm_name2info(handle, devname, &linkid, NULL,
 355      -                            NULL, NULL) != DLADM_STATUS_OK)
 356      -                                die("invalid link '%s'", devname);
 357  356                          l_arg = B_TRUE;
 358  357                          break;
 359  358                  case 'a':
 360  359                          (void) strlcat(attrstr, optarg, DLADM_STRSIZE);
 361  360                          if (strlcat(attrstr, ",", DLADM_STRSIZE) >=
 362  361                              DLADM_STRSIZE)
 363  362                                  die("attribute list too long '%s'", attrstr);
 364  363                          break;
 365  364                  case 'p':
 366  365                          (void) strlcat(propstr, optarg, DLADM_STRSIZE);
 367  366                          if (strlcat(propstr, ",", DLADM_STRSIZE) >=
 368  367                              DLADM_STRSIZE)
 369  368                                  die("property list too long '%s'", propstr);
 370  369                          break;
      370 +                case 'z':
      371 +                        zonename = optarg;
      372 +                        break;
 371  373                  default:
 372  374                          die_opterr(optopt, option);
 373  375                  }
 374  376          }
 375  377          if (!l_arg) {
 376  378                  die("link is required");
 377  379          }
 378  380  
      381 +        if (dladm_zname2info(handle, zonename, devname, &linkid, NULL,
      382 +            NULL, NULL) != DLADM_STATUS_OK)
      383 +                die("invalid link '%s'", devname);
      384 +
 379  385          opterr = 0;
 380  386          index = optind;
 381  387  
 382  388          if ((index != (argc - 1)) || match_attr(argv[index]) != NULL) {
 383  389                  die("flow name is required");
 384  390          } else {
 385  391                  /* get flow name; required last argument */
 386  392                  if (strlen(argv[index]) >= MAXFLOWNAMELEN)
 387  393                          die("flow name too long");
 388  394                  name = argv[index];
↓ open down ↓ 18 lines elided ↑ open up ↑
 407  413  static void
 408  414  do_remove_flow(int argc, char *argv[])
 409  415  {
 410  416          char                    option;
 411  417          char                    *flowname = NULL;
 412  418          char                    linkname[MAXLINKNAMELEN];
 413  419          datalink_id_t           linkid = DATALINK_ALL_LINKID;
 414  420          boolean_t               l_arg = B_FALSE;
 415  421          remove_flow_state_t     state;
 416  422          dladm_status_t          status;
      423 +        char                    *zonename = NULL;
 417  424  
 418  425          bzero(&state, sizeof (state));
 419  426  
 420  427          opterr = 0;
 421      -        while ((option = getopt_long(argc, argv, ":tR:l:",
      428 +        while ((option = getopt_long(argc, argv, ":tR:l:z:",
 422  429              longopts, NULL)) != -1) {
 423  430                  switch (option) {
 424  431                  case 't':
 425  432                          t_arg = B_TRUE;
 426  433                          break;
 427  434                  case 'R':
 428  435                          altroot = optarg;
 429  436                          break;
 430  437                  case 'l':
 431  438                          if (strlcpy(linkname, optarg,
 432  439                              MAXLINKNAMELEN) >= MAXLINKNAMELEN) {
 433  440                                  die("link name too long");
 434  441                          }
 435      -                        if (dladm_name2info(handle, linkname, &linkid, NULL,
 436      -                            NULL, NULL) != DLADM_STATUS_OK) {
 437      -                                die("invalid link '%s'", linkname);
 438      -                        }
 439  442                          l_arg = B_TRUE;
 440  443                          break;
      444 +                case 'z':
      445 +                        zonename = optarg;
      446 +                        break;
 441  447                  default:
 442  448                          die_opterr(optopt, option);
 443  449                          break;
 444  450                  }
 445  451          }
 446  452  
 447  453          /* when link not specified get flow name */
 448  454          if (!l_arg) {
 449  455                  if (optind != (argc-1)) {
 450  456                          usage();
 451  457                  } else {
 452  458                          if (strlen(argv[optind]) >= MAXFLOWNAMELEN)
 453  459                                  die("flow name too long");
 454  460                          flowname = argv[optind];
 455  461                  }
 456  462                  status = dladm_flow_remove(handle, flowname, t_arg, altroot);
 457  463          } else {
 458  464                  /* if link is specified then flow name should not be there */
 459  465                  if (optind == argc-1)
 460  466                          usage();
      467 +
      468 +                if (dladm_zname2info(handle, zonename, linkname, &linkid, NULL,
      469 +                    NULL, NULL) != DLADM_STATUS_OK) {
      470 +                        die("invalid link '%s'", linkname);
      471 +                }
      472 +
 461  473                  /* walk the link to find flows and remove them */
 462  474                  state.fs_tempop = t_arg;
 463  475                  state.fs_altroot = altroot;
 464  476                  state.fs_status = DLADM_STATUS_OK;
 465  477                  status = dladm_walk_flow(remove_flow, handle, linkid, &state,
 466  478                      B_FALSE);
 467  479                  /*
 468  480                   * check if dladm_walk_flow terminated early and see if the
 469  481                   * walker function as any status for us
 470  482                   */
↓ open down ↓ 119 lines elided ↑ open up ↑
 590  602          char                    linkname[MAXLINKNAMELEN];
 591  603          datalink_id_t           linkid = DATALINK_ALL_LINKID;
 592  604          int                     option;
 593  605          boolean_t               l_arg = B_FALSE;
 594  606          boolean_t               o_arg = B_FALSE;
 595  607          show_flow_state_t       state;
 596  608          char                    *fields_str = NULL;
 597  609          ofmt_handle_t           ofmt;
 598  610          ofmt_status_t           oferr;
 599  611          uint_t                  ofmtflags = 0;
      612 +        char                    *zonename = NULL;
 600  613  
 601  614          bzero(&state, sizeof (state));
 602  615  
 603  616          opterr = 0;
 604      -        while ((option = getopt_long(argc, argv, ":pPl:o:",
      617 +        while ((option = getopt_long(argc, argv, ":pPl:o:z:",
 605  618              longopts, NULL)) != -1) {
 606  619                  switch (option) {
 607  620                  case 'p':
 608  621                          state.fs_parsable = B_TRUE;
 609  622                          ofmtflags |= OFMT_PARSABLE;
 610  623                          break;
 611  624                  case 'P':
 612  625                          state.fs_persist = B_TRUE;
 613  626                          break;
 614  627                  case 'o':
 615  628                          if (o_arg)
 616  629                                  die_optdup(option);
 617  630  
 618  631                          o_arg = B_TRUE;
 619  632                          fields_str = optarg;
 620  633                          break;
 621  634                  case 'l':
 622  635                          if (strlcpy(linkname, optarg, MAXLINKNAMELEN)
 623  636                              >= MAXLINKNAMELEN)
 624  637                                  die("link name too long\n");
 625      -                        if (dladm_name2info(handle, linkname, &linkid, NULL,
 626      -                            NULL, NULL) != DLADM_STATUS_OK)
 627      -                                die("invalid link '%s'", linkname);
 628  638                          l_arg = B_TRUE;
 629  639                          break;
      640 +                case 'z':
      641 +                        zonename = optarg;
      642 +                        break;
 630  643                  default:
 631  644                          die_opterr(optopt, option);
 632  645                          break;
 633  646                  }
 634  647          }
 635  648  
      649 +        if (l_arg) {
      650 +                if (dladm_zname2info(handle, zonename, linkname, &linkid, NULL,
      651 +                    NULL, NULL) != DLADM_STATUS_OK)
      652 +                        die("invalid link '%s'", linkname);
      653 +        }
      654 +
 636  655          /* get flow name (optional last argument */
 637  656          if (optind == (argc-1)) {
 638  657                  if (strlcpy(flowname, argv[optind], MAXFLOWNAMELEN)
 639  658                      >= MAXFLOWNAMELEN)
 640  659                          die("flow name too long");
 641  660                  state.fs_flow = flowname;
 642  661          }
 643  662  
 644  663          oferr = ofmt_open(fields_str, flow_fields, ofmtflags, 0, &ofmt);
 645  664          flowadm_ofmt_check(oferr, state.fs_parsable, ofmt);
↓ open down ↓ 657 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX