]>
Commit | Line | Data |
---|---|---|
064af421 | 1 | /* |
ac64794a | 2 | * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc. |
064af421 | 3 | * |
a14bc59f BP |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | * you may not use this file except in compliance with the License. | |
6 | * You may obtain a copy of the License at: | |
064af421 | 7 | * |
a14bc59f BP |
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | * | |
10 | * Unless required by applicable law or agreed to in writing, software | |
11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | * See the License for the specific language governing permissions and | |
14 | * limitations under the License. | |
064af421 BP |
15 | */ |
16 | ||
17 | #include <config.h> | |
18 | #include <arpa/inet.h> | |
19 | #include <errno.h> | |
20 | #include <getopt.h> | |
21 | #include <inttypes.h> | |
9d82ec47 | 22 | #include <sys/socket.h> |
064af421 BP |
23 | #include <net/if.h> |
24 | #include <netinet/in.h> | |
25 | #include <signal.h> | |
26 | #include <stdarg.h> | |
27 | #include <stdlib.h> | |
28 | #include <string.h> | |
29 | #include <unistd.h> | |
30 | #include <sys/stat.h> | |
31 | #include <sys/time.h> | |
32 | ||
33 | #include "command-line.h" | |
34 | #include "compiler.h" | |
35 | #include "dirs.h" | |
fceef209 | 36 | #include "dpctl.h" |
8a777cf6 | 37 | #include "fatal-signal.h" |
064af421 | 38 | #include "odp-util.h" |
becffb86 | 39 | #include "packets.h" |
064af421 BP |
40 | #include "timeval.h" |
41 | #include "util.h" | |
7888d2a6 | 42 | #include "openvswitch/ofp-parse.h" |
e6211adc | 43 | #include "openvswitch/vlog.h" |
5136ce49 | 44 | |
fceef209 | 45 | static struct dpctl_params dpctl_p; |
032aa6a3 | 46 | |
cab50449 | 47 | OVS_NO_RETURN static void usage(void *userdata OVS_UNUSED); |
064af421 BP |
48 | static void parse_options(int argc, char *argv[]); |
49 | ||
fceef209 DDP |
50 | static void |
51 | dpctl_print(void *userdata OVS_UNUSED, bool error, const char *msg) | |
52 | { | |
53 | FILE *outfile = error ? stderr : stdout; | |
54 | fputs(msg, outfile); | |
55 | } | |
56 | ||
675febfa BP |
57 | int |
58 | main(int argc, char *argv[]) | |
064af421 | 59 | { |
fceef209 | 60 | int error; |
064af421 | 61 | set_program_name(argv[0]); |
064af421 | 62 | parse_options(argc, argv); |
8a777cf6 | 63 | fatal_ignore_sigpipe(); |
fceef209 | 64 | |
56cad666 | 65 | dpctl_p.is_appctl = false; |
fceef209 DDP |
66 | dpctl_p.output = dpctl_print; |
67 | dpctl_p.usage = usage; | |
68 | ||
69 | error = dpctl_run_command(argc - optind, (const char **) argv + optind, | |
70 | &dpctl_p); | |
71 | return error ? EXIT_FAILURE : EXIT_SUCCESS; | |
064af421 BP |
72 | } |
73 | ||
74 | static void | |
75 | parse_options(int argc, char *argv[]) | |
76 | { | |
87c84891 | 77 | enum { |
186afbfe BP |
78 | OPT_CLEAR = UCHAR_MAX + 1, |
79 | OPT_MAY_CREATE, | |
1f4a7252 | 80 | OPT_READ_ONLY, |
87c84891 JP |
81 | VLOG_OPTION_ENUMS |
82 | }; | |
07fc4ed3 | 83 | static const struct option long_options[] = { |
e3c17733 | 84 | {"statistics", no_argument, NULL, 's'}, |
186afbfe BP |
85 | {"clear", no_argument, NULL, OPT_CLEAR}, |
86 | {"may-create", no_argument, NULL, OPT_MAY_CREATE}, | |
1f4a7252 | 87 | {"read-only", no_argument, NULL, OPT_READ_ONLY}, |
becffb86 | 88 | {"more", no_argument, NULL, 'm'}, |
e3c17733 BP |
89 | {"timeout", required_argument, NULL, 't'}, |
90 | {"help", no_argument, NULL, 'h'}, | |
66fa2c88 | 91 | {"option", no_argument, NULL, 'o'}, |
e3c17733 | 92 | {"version", no_argument, NULL, 'V'}, |
87c84891 | 93 | VLOG_LONG_OPTIONS, |
e3c17733 | 94 | {NULL, 0, NULL, 0}, |
064af421 | 95 | }; |
5f383751 | 96 | char *short_options = ovs_cmdl_long_options_to_short_options(long_options); |
064af421 BP |
97 | |
98 | for (;;) { | |
99 | unsigned long int timeout; | |
100 | int c; | |
101 | ||
102 | c = getopt_long(argc, argv, short_options, long_options, NULL); | |
103 | if (c == -1) { | |
104 | break; | |
105 | } | |
106 | ||
107 | switch (c) { | |
032aa6a3 | 108 | case 's': |
fceef209 | 109 | dpctl_p.print_statistics = true; |
032aa6a3 BP |
110 | break; |
111 | ||
186afbfe | 112 | case OPT_CLEAR: |
fceef209 | 113 | dpctl_p.zero_statistics = true; |
186afbfe BP |
114 | break; |
115 | ||
116 | case OPT_MAY_CREATE: | |
fceef209 | 117 | dpctl_p.may_create = true; |
186afbfe BP |
118 | break; |
119 | ||
1f4a7252 RM |
120 | case OPT_READ_ONLY: |
121 | dpctl_p.read_only = true; | |
122 | break; | |
123 | ||
becffb86 | 124 | case 'm': |
fceef209 | 125 | dpctl_p.verbosity++; |
becffb86 BP |
126 | break; |
127 | ||
064af421 BP |
128 | case 't': |
129 | timeout = strtoul(optarg, NULL, 10); | |
130 | if (timeout <= 0) { | |
131 | ovs_fatal(0, "value %s on -t or --timeout is not at least 1", | |
132 | optarg); | |
133 | } else { | |
134 | time_alarm(timeout); | |
135 | } | |
136 | break; | |
137 | ||
138 | case 'h': | |
fceef209 | 139 | usage(NULL); |
064af421 | 140 | |
66fa2c88 | 141 | case 'o': |
5f383751 | 142 | ovs_cmdl_print_options(long_options); |
66fa2c88 AW |
143 | exit(EXIT_SUCCESS); |
144 | ||
064af421 | 145 | case 'V': |
55d5bb44 | 146 | ovs_print_version(0, 0); |
064af421 BP |
147 | exit(EXIT_SUCCESS); |
148 | ||
87c84891 | 149 | VLOG_OPTION_HANDLERS |
064af421 BP |
150 | |
151 | case '?': | |
152 | exit(EXIT_FAILURE); | |
153 | ||
154 | default: | |
155 | abort(); | |
156 | } | |
157 | } | |
158 | free(short_options); | |
159 | } | |
160 | ||
161 | static void | |
fceef209 | 162 | usage(void *userdata OVS_UNUSED) |
064af421 BP |
163 | { |
164 | printf("%s: Open vSwitch datapath management utility\n" | |
165 | "usage: %s [OPTIONS] COMMAND [ARG...]\n" | |
166 | " add-dp DP [IFACE...] add new datapath DP (with IFACEs)\n" | |
167 | " del-dp DP delete local datapath DP\n" | |
168 | " add-if DP IFACE... add each IFACE as a port on DP\n" | |
10500639 | 169 | " set-if DP IFACE... reconfigure each IFACE within DP\n" |
064af421 | 170 | " del-if DP IFACE... delete each IFACE from DP\n" |
b566902b | 171 | " dump-dps display names of all datapaths\n" |
064af421 BP |
172 | " show show basic info on all datapaths\n" |
173 | " show DP... show basic info on each DP\n" | |
2e6d002d GS |
174 | " dump-flows [DP] display flows in DP\n" |
175 | " add-flow [DP] FLOW ACTIONS add FLOW with ACTIONS to DP\n" | |
176 | " mod-flow [DP] FLOW ACTIONS change FLOW actions to ACTIONS in DP\n" | |
818650e6 | 177 | " get-flow [DP] ufid:UFID fetch flow corresponding to UFID\n" |
2e6d002d GS |
178 | " del-flow [DP] FLOW delete FLOW from DP\n" |
179 | " del-flows [DP] delete all flows from DP\n" | |
bc8f7c35 JP |
180 | " dump-conntrack [DP] [zone=ZONE] display conntrack entries for ZONE\n" |
181 | " flush-conntrack [DP] [zone=ZONE] delete all conntrack entries in ZONE\n" | |
10500639 BP |
182 | "Each IFACE on add-dp, add-if, and set-if may be followed by\n" |
183 | "comma-separated options. See ovs-dpctl(8) for syntax, or the\n" | |
2e6d002d GS |
184 | "Interface table in ovs-vswitchd.conf.db(5) for an options list.\n" |
185 | "For COMMAND dump-flows, add-flow, mod-flow, del-flow and\n" | |
186 | "del-flows, DP is optional if there is only one datapath.\n", | |
064af421 BP |
187 | program_name, program_name); |
188 | vlog_usage(); | |
186afbfe BP |
189 | printf("\nOptions for show and mod-flow:\n" |
190 | " -s, --statistics print statistics for port or flow\n" | |
041e7168 AZ |
191 | "\nOptions for dump-flows:\n" |
192 | " -m, --more increase verbosity of output\n" | |
186afbfe BP |
193 | "\nOptions for mod-flow:\n" |
194 | " --may-create create flow if it doesn't exist\n" | |
1f4a7252 | 195 | " --read-only do not run read/write commands\n" |
186afbfe | 196 | " --clear reset existing stats to zero\n" |
733970eb | 197 | "\nOther options:\n" |
064af421 BP |
198 | " -t, --timeout=SECS give up after SECS seconds\n" |
199 | " -h, --help display this help message\n" | |
200 | " -V, --version display version information\n"); | |
201 | exit(EXIT_SUCCESS); | |
202 | } |