flowadm.c (0790b6dc17a39eb1ef864e0916341fa2c88261f0) flowadm.c (da0006029e69465355313f503741ac6ebe0d513b)
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE

--- 5 unchanged lines hidden (view full) ---

14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE

--- 5 unchanged lines hidden (view full) ---

14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#include <stdio.h>
27#include <locale.h>
28#include <stdarg.h>
29#include <stdlib.h>
30#include <fcntl.h>

--- 176 unchanged lines hidden (view full) ---

207} flow_args_t;
208
209#define PROTO_MAXSTR_LEN 7
210#define PORT_MAXSTR_LEN 6
211#define DSFIELD_MAXSTR_LEN 10
212
213typedef struct flow_fields_buf_s
214{
23 * Use is subject to license terms.
24 */
25
26#include <stdio.h>
27#include <locale.h>
28#include <stdarg.h>
29#include <stdlib.h>
30#include <fcntl.h>

--- 176 unchanged lines hidden (view full) ---

207} flow_args_t;
208
209#define PROTO_MAXSTR_LEN 7
210#define PORT_MAXSTR_LEN 6
211#define DSFIELD_MAXSTR_LEN 10
212
213typedef struct flow_fields_buf_s
214{
215 char flow_name[MAXNAMELEN];
215 char flow_name[MAXFLOWNAMELEN];
216 char flow_link[MAXLINKNAMELEN];
217 char flow_ipaddr[INET6_ADDRSTRLEN+4];
218 char flow_proto[PROTO_MAXSTR_LEN];
219 char flow_port[PORT_MAXSTR_LEN];
220 char flow_dsfield[DSFIELD_MAXSTR_LEN];
221} flow_fields_buf_t;
222
223static print_field_t flow_fields[] = {

--- 492 unchanged lines hidden (view full) ---

716
717 if (status != DLADM_STATUS_OK)
718 die_dlerr(status, "show-usage");
719}
720
721static void
722do_add_flow(int argc, char *argv[])
723{
216 char flow_link[MAXLINKNAMELEN];
217 char flow_ipaddr[INET6_ADDRSTRLEN+4];
218 char flow_proto[PROTO_MAXSTR_LEN];
219 char flow_port[PORT_MAXSTR_LEN];
220 char flow_dsfield[DSFIELD_MAXSTR_LEN];
221} flow_fields_buf_t;
222
223static print_field_t flow_fields[] = {

--- 492 unchanged lines hidden (view full) ---

716
717 if (status != DLADM_STATUS_OK)
718 die_dlerr(status, "show-usage");
719}
720
721static void
722do_add_flow(int argc, char *argv[])
723{
724 char devname[MAXNAMELEN];
724 char devname[MAXLINKNAMELEN];
725 char *name = NULL;
726 uint_t index;
727 datalink_id_t linkid;
728
729 char option;
730 boolean_t l_arg = B_FALSE;
731 dladm_arg_list_t *proplist = NULL;
732 dladm_arg_list_t *attrlist = NULL;

--- 5 unchanged lines hidden (view full) ---

738 case 't':
739 t_arg = B_TRUE;
740 break;
741 case 'R':
742 altroot = optarg;
743 break;
744 case 'l':
745 if (strlcpy(devname, optarg,
725 char *name = NULL;
726 uint_t index;
727 datalink_id_t linkid;
728
729 char option;
730 boolean_t l_arg = B_FALSE;
731 dladm_arg_list_t *proplist = NULL;
732 dladm_arg_list_t *attrlist = NULL;

--- 5 unchanged lines hidden (view full) ---

738 case 't':
739 t_arg = B_TRUE;
740 break;
741 case 'R':
742 altroot = optarg;
743 break;
744 case 'l':
745 if (strlcpy(devname, optarg,
746 MAXNAMELEN) >= MAXNAMELEN) {
746 MAXLINKNAMELEN) >= MAXLINKNAMELEN) {
747 die("link name too long");
748 }
749 if (dladm_name2info(handle, devname, &linkid, NULL,
750 NULL, NULL) != DLADM_STATUS_OK)
751 die("invalid link '%s'", devname);
752 l_arg = B_TRUE;
753 break;
754 case 'a':

--- 16 unchanged lines hidden (view full) ---

771
772 opterr = 0;
773 index = optind;
774
775 if ((index != (argc - 1)) || match_attr(argv[index]) != NULL) {
776 die("flow name is required");
777 } else {
778 /* get flow name; required last argument */
747 die("link name too long");
748 }
749 if (dladm_name2info(handle, devname, &linkid, NULL,
750 NULL, NULL) != DLADM_STATUS_OK)
751 die("invalid link '%s'", devname);
752 l_arg = B_TRUE;
753 break;
754 case 'a':

--- 16 unchanged lines hidden (view full) ---

771
772 opterr = 0;
773 index = optind;
774
775 if ((index != (argc - 1)) || match_attr(argv[index]) != NULL) {
776 die("flow name is required");
777 } else {
778 /* get flow name; required last argument */
779 if (strlen(argv[index]) >= MAXFLOWNAME)
779 if (strlen(argv[index]) >= MAXFLOWNAMELEN)
780 die("flow name too long");
781 name = argv[index];
782 }
783
784 status = dladm_flow_add(handle, linkid, attrlist, proplist, name,
785 t_arg, altroot);
786 if (status != DLADM_STATUS_OK)
787 die_dlerr(status, "add flow failed");
788
789 dladm_free_attrs(attrlist);
790 dladm_free_props(proplist);
791}
792
793static void
794do_remove_flow(int argc, char *argv[])
795{
796 char option;
797 char *flowname = NULL;
780 die("flow name too long");
781 name = argv[index];
782 }
783
784 status = dladm_flow_add(handle, linkid, attrlist, proplist, name,
785 t_arg, altroot);
786 if (status != DLADM_STATUS_OK)
787 die_dlerr(status, "add flow failed");
788
789 dladm_free_attrs(attrlist);
790 dladm_free_props(proplist);
791}
792
793static void
794do_remove_flow(int argc, char *argv[])
795{
796 char option;
797 char *flowname = NULL;
798 char linkname[MAXNAMELEN];
798 char linkname[MAXLINKNAMELEN];
799 datalink_id_t linkid = DATALINK_ALL_LINKID;
800 boolean_t l_arg = B_FALSE;
801 remove_flow_state_t state;
802 dladm_status_t status;
803
804 bzero(&state, sizeof (state));
805
806 opterr = 0;

--- 23 unchanged lines hidden (view full) ---

830 }
831 }
832
833 /* when link not specified get flow name */
834 if (!l_arg) {
835 if (optind != (argc-1)) {
836 usage();
837 } else {
799 datalink_id_t linkid = DATALINK_ALL_LINKID;
800 boolean_t l_arg = B_FALSE;
801 remove_flow_state_t state;
802 dladm_status_t status;
803
804 bzero(&state, sizeof (state));
805
806 opterr = 0;

--- 23 unchanged lines hidden (view full) ---

830 }
831 }
832
833 /* when link not specified get flow name */
834 if (!l_arg) {
835 if (optind != (argc-1)) {
836 usage();
837 } else {
838 if (strlen(argv[optind]) >= MAXFLOWNAME)
838 if (strlen(argv[optind]) >= MAXFLOWNAMELEN)
839 die("flow name too long");
840 flowname = argv[optind];
841 }
842 status = dladm_flow_remove(handle, flowname, t_arg, altroot);
843 } else {
844 /* if link is specified then flow name should not be there */
845 if (optind == argc-1)
846 usage();

--- 246 unchanged lines hidden (view full) ---

1093
1094 (void) sleep(interval);
1095 }
1096}
1097
1098static void
1099do_show_flow(int argc, char *argv[])
1100{
839 die("flow name too long");
840 flowname = argv[optind];
841 }
842 status = dladm_flow_remove(handle, flowname, t_arg, altroot);
843 } else {
844 /* if link is specified then flow name should not be there */
845 if (optind == argc-1)
846 usage();

--- 246 unchanged lines hidden (view full) ---

1093
1094 (void) sleep(interval);
1095 }
1096}
1097
1098static void
1099do_show_flow(int argc, char *argv[])
1100{
1101 char flowname[MAXFLOWNAME];
1102 char linkname[MAXNAMELEN];
1101 char flowname[MAXFLOWNAMELEN];
1102 char linkname[MAXLINKNAMELEN];
1103 datalink_id_t linkid = DATALINK_ALL_LINKID;
1104 int option;
1105 boolean_t s_arg = B_FALSE;
1106 boolean_t S_arg = B_FALSE;
1107 boolean_t i_arg = B_FALSE;
1108 boolean_t l_arg = B_FALSE;
1109 boolean_t o_arg = B_FALSE;
1110 uint32_t interval = 0;

--- 65 unchanged lines hidden (view full) ---

1176 if (i_arg && !(s_arg || S_arg))
1177 die("the -i option can be used only with -s or -S");
1178
1179 if (s_arg && S_arg)
1180 die("the -s option cannot be used with -S");
1181
1182 /* get flow name (optional last argument */
1183 if (optind == (argc-1)) {
1103 datalink_id_t linkid = DATALINK_ALL_LINKID;
1104 int option;
1105 boolean_t s_arg = B_FALSE;
1106 boolean_t S_arg = B_FALSE;
1107 boolean_t i_arg = B_FALSE;
1108 boolean_t l_arg = B_FALSE;
1109 boolean_t o_arg = B_FALSE;
1110 uint32_t interval = 0;

--- 65 unchanged lines hidden (view full) ---

1176 if (i_arg && !(s_arg || S_arg))
1177 die("the -i option can be used only with -s or -S");
1178
1179 if (s_arg && S_arg)
1180 die("the -s option cannot be used with -S");
1181
1182 /* get flow name (optional last argument */
1183 if (optind == (argc-1)) {
1184 if (strlcpy(flowname, argv[optind], MAXFLOWNAME)
1185 >= MAXFLOWNAME)
1184 if (strlcpy(flowname, argv[optind], MAXFLOWNAMELEN)
1185 >= MAXFLOWNAMELEN)
1186 die("flow name too long");
1187 state.fs_flow = flowname;
1188 }
1189
1190 if (s_arg) {
1191 flow_stats(state.fs_flow, linkid, interval);
1192 return;
1193 }

--- 83 unchanged lines hidden (view full) ---

1277 break;
1278 default:
1279 die_opterr(optopt, option);
1280 break;
1281 }
1282 }
1283
1284 if (optind == (argc - 1)) {
1186 die("flow name too long");
1187 state.fs_flow = flowname;
1188 }
1189
1190 if (s_arg) {
1191 flow_stats(state.fs_flow, linkid, interval);
1192 return;
1193 }

--- 83 unchanged lines hidden (view full) ---

1277 break;
1278 default:
1279 die_opterr(optopt, option);
1280 break;
1281 }
1282 }
1283
1284 if (optind == (argc - 1)) {
1285 if (strlen(argv[optind]) >= MAXFLOWNAME)
1285 if (strlen(argv[optind]) >= MAXFLOWNAMELEN)
1286 die("flow name too long");
1287 flow = argv[optind];
1288 } else if (optind != argc) {
1289 usage();
1290 }
1291 if (flow == NULL)
1292 die("flow name must be specified");
1293

--- 444 unchanged lines hidden (view full) ---

1738 break;
1739 default:
1740 die_opterr(optopt, option);
1741 break;
1742 }
1743 }
1744
1745 if (optind == (argc - 1)) {
1286 die("flow name too long");
1287 flow = argv[optind];
1288 } else if (optind != argc) {
1289 usage();
1290 }
1291 if (flow == NULL)
1292 die("flow name must be specified");
1293

--- 444 unchanged lines hidden (view full) ---

1738 break;
1739 default:
1740 die_opterr(optopt, option);
1741 break;
1742 }
1743 }
1744
1745 if (optind == (argc - 1)) {
1746 if (strlen(argv[optind]) >= MAXFLOWNAME)
1746 if (strlen(argv[optind]) >= MAXFLOWNAMELEN)
1747 die("flow name too long");
1748 state.fs_flow = argv[optind];
1749 } else if (optind != argc) {
1750 usage();
1751 }
1752 bzero(&state.fs_print, sizeof (print_state_t));
1753 state.fs_proplist = proplist;
1754 state.fs_status = DLADM_STATUS_OK;

--- 243 unchanged lines hidden ---
1747 die("flow name too long");
1748 state.fs_flow = argv[optind];
1749 } else if (optind != argc) {
1750 usage();
1751 }
1752 bzero(&state.fs_print, sizeof (print_state_t));
1753 state.fs_proplist = proplist;
1754 state.fs_status = DLADM_STATUS_OK;

--- 243 unchanged lines hidden ---