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 --- |