Deleted Added
full compact
vale-ctl.c (261909) vale-ctl.c (270063)
1/*
2 * Copyright (C) 2013-2014 Michio Honda. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.

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

18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 */
25
1/*
2 * Copyright (C) 2013-2014 Michio Honda. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.

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

18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 */
25
26/* $FreeBSD: head/tools/tools/netmap/vale-ctl.c 261909 2014-02-15 04:53:04Z luigi $ */
26/* $FreeBSD: head/tools/tools/netmap/vale-ctl.c 270063 2014-08-16 15:00:01Z luigi $ */
27
28#include <errno.h>
29#include <stdio.h>
30#include <inttypes.h> /* PRI* macros */
31#include <string.h> /* strcmp */
32#include <fcntl.h> /* open */
33#include <unistd.h> /* close */
34#include <sys/ioctl.h> /* ioctl */
35#include <sys/param.h>
36#include <sys/socket.h> /* apple needs sockaddr */
37#include <net/if.h> /* ifreq */
38#include <net/netmap.h>
39#include <net/netmap_user.h>
40#include <libgen.h> /* basename */
27
28#include <errno.h>
29#include <stdio.h>
30#include <inttypes.h> /* PRI* macros */
31#include <string.h> /* strcmp */
32#include <fcntl.h> /* open */
33#include <unistd.h> /* close */
34#include <sys/ioctl.h> /* ioctl */
35#include <sys/param.h>
36#include <sys/socket.h> /* apple needs sockaddr */
37#include <net/if.h> /* ifreq */
38#include <net/netmap.h>
39#include <net/netmap_user.h>
40#include <libgen.h> /* basename */
41#include <stdlib.h> /* atoi, free */
41
42/* debug support */
43#define ND(format, ...) do {} while(0)
44#define D(format, ...) \
45 fprintf(stderr, "%s [%d] " format "\n", \
46 __FUNCTION__, __LINE__, ##__VA_ARGS__)
47
42
43/* debug support */
44#define ND(format, ...) do {} while(0)
45#define D(format, ...) \
46 fprintf(stderr, "%s [%d] " format "\n", \
47 __FUNCTION__, __LINE__, ##__VA_ARGS__)
48
49/* XXX cut and paste from pkt-gen.c because I'm not sure whether this
50 * program may include nm_util.h
51 */
52void parse_nmr_config(const char* conf, struct nmreq *nmr)
53{
54 char *w, *tok;
55 int i, v;
56
57 nmr->nr_tx_rings = nmr->nr_rx_rings = 0;
58 nmr->nr_tx_slots = nmr->nr_rx_slots = 0;
59 if (conf == NULL || ! *conf)
60 return;
61 w = strdup(conf);
62 for (i = 0, tok = strtok(w, ","); tok; i++, tok = strtok(NULL, ",")) {
63 v = atoi(tok);
64 switch (i) {
65 case 0:
66 nmr->nr_tx_slots = nmr->nr_rx_slots = v;
67 break;
68 case 1:
69 nmr->nr_rx_slots = v;
70 break;
71 case 2:
72 nmr->nr_tx_rings = nmr->nr_rx_rings = v;
73 break;
74 case 3:
75 nmr->nr_rx_rings = v;
76 break;
77 default:
78 D("ignored config: %s", tok);
79 break;
80 }
81 }
82 D("txr %d txd %d rxr %d rxd %d",
83 nmr->nr_tx_rings, nmr->nr_tx_slots,
84 nmr->nr_rx_rings, nmr->nr_rx_slots);
85 free(w);
86}
87
48static int
88static int
49bdg_ctl(const char *name, int nr_cmd, int nr_arg)
89bdg_ctl(const char *name, int nr_cmd, int nr_arg, char *nmr_config)
50{
51 struct nmreq nmr;
52 int error = 0;
53 int fd = open("/dev/netmap", O_RDWR);
54
55 if (fd == -1) {
56 D("Unable to open /dev/netmap");
57 return -1;
58 }
59
60 bzero(&nmr, sizeof(nmr));
61 nmr.nr_version = NETMAP_API;
62 if (name != NULL) /* might be NULL */
63 strncpy(nmr.nr_name, name, sizeof(nmr.nr_name));
64 nmr.nr_cmd = nr_cmd;
90{
91 struct nmreq nmr;
92 int error = 0;
93 int fd = open("/dev/netmap", O_RDWR);
94
95 if (fd == -1) {
96 D("Unable to open /dev/netmap");
97 return -1;
98 }
99
100 bzero(&nmr, sizeof(nmr));
101 nmr.nr_version = NETMAP_API;
102 if (name != NULL) /* might be NULL */
103 strncpy(nmr.nr_name, name, sizeof(nmr.nr_name));
104 nmr.nr_cmd = nr_cmd;
105 parse_nmr_config(nmr_config, &nmr);
65
66 switch (nr_cmd) {
106
107 switch (nr_cmd) {
108 case NETMAP_BDG_DELIF:
109 case NETMAP_BDG_NEWIF:
110 error = ioctl(fd, NIOCREGIF, &nmr);
111 if (error == -1) {
112 ND("Unable to %s %s", nr_cmd == NETMAP_BDG_DELIF ? "delete":"create", name);
113 perror(name);
114 } else {
115 ND("Success to %s %s", nr_cmd == NETMAP_BDG_DELIF ? "delete":"create", name);
116 }
117 break;
67 case NETMAP_BDG_ATTACH:
68 case NETMAP_BDG_DETACH:
69 if (nr_arg && nr_arg != NETMAP_BDG_HOST)
70 nr_arg = 0;
71 nmr.nr_arg1 = nr_arg;
72 error = ioctl(fd, NIOCREGIF, &nmr);
73 if (error == -1) {
74 ND("Unable to %s %s to the bridge", nr_cmd ==

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

115 return error;
116}
117
118int
119main(int argc, char *argv[])
120{
121 int ch, nr_cmd = 0, nr_arg = 0;
122 const char *command = basename(argv[0]);
118 case NETMAP_BDG_ATTACH:
119 case NETMAP_BDG_DETACH:
120 if (nr_arg && nr_arg != NETMAP_BDG_HOST)
121 nr_arg = 0;
122 nmr.nr_arg1 = nr_arg;
123 error = ioctl(fd, NIOCREGIF, &nmr);
124 if (error == -1) {
125 ND("Unable to %s %s to the bridge", nr_cmd ==

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

166 return error;
167}
168
169int
170main(int argc, char *argv[])
171{
172 int ch, nr_cmd = 0, nr_arg = 0;
173 const char *command = basename(argv[0]);
123 char *name = NULL;
174 char *name = NULL, *nmr_config = NULL;
124
125 if (argc > 3) {
126usage:
127 fprintf(stderr,
128 "Usage:\n"
129 "%s arguments\n"
130 "\t-g interface interface name to get info\n"
131 "\t-d interface interface name to be detached\n"
132 "\t-a interface interface name to be attached\n"
133 "\t-h interface interface name to be attached with the host stack\n"
175
176 if (argc > 3) {
177usage:
178 fprintf(stderr,
179 "Usage:\n"
180 "%s arguments\n"
181 "\t-g interface interface name to get info\n"
182 "\t-d interface interface name to be detached\n"
183 "\t-a interface interface name to be attached\n"
184 "\t-h interface interface name to be attached with the host stack\n"
185 "\t-n interface interface name to be created\n"
186 "\t-r interface interface name to be deleted\n"
134 "\t-l list all or specified bridge's interfaces (default)\n"
187 "\t-l list all or specified bridge's interfaces (default)\n"
188 "\t-C string ring/slot setting of an interface creating by -n\n"
135 "", command);
136 return 0;
137 }
138
189 "", command);
190 return 0;
191 }
192
139 while ((ch = getopt(argc, argv, "d:a:h:g:l")) != -1) {
193 while ((ch = getopt(argc, argv, "d:a:h:g:l:n:r:C:")) != -1) {
140 name = optarg; /* default */
141 switch (ch) {
142 default:
143 fprintf(stderr, "bad option %c %s", ch, optarg);
144 goto usage;
145 case 'd':
146 nr_cmd = NETMAP_BDG_DETACH;
147 break;
148 case 'a':
149 nr_cmd = NETMAP_BDG_ATTACH;
150 break;
151 case 'h':
152 nr_cmd = NETMAP_BDG_ATTACH;
153 nr_arg = NETMAP_BDG_HOST;
154 break;
194 name = optarg; /* default */
195 switch (ch) {
196 default:
197 fprintf(stderr, "bad option %c %s", ch, optarg);
198 goto usage;
199 case 'd':
200 nr_cmd = NETMAP_BDG_DETACH;
201 break;
202 case 'a':
203 nr_cmd = NETMAP_BDG_ATTACH;
204 break;
205 case 'h':
206 nr_cmd = NETMAP_BDG_ATTACH;
207 nr_arg = NETMAP_BDG_HOST;
208 break;
209 case 'n':
210 nr_cmd = NETMAP_BDG_NEWIF;
211 break;
212 case 'r':
213 nr_cmd = NETMAP_BDG_DELIF;
214 break;
155 case 'g':
156 nr_cmd = 0;
157 break;
158 case 'l':
159 nr_cmd = NETMAP_BDG_LIST;
160 if (optind < argc && argv[optind][0] == '-')
161 name = NULL;
162 break;
215 case 'g':
216 nr_cmd = 0;
217 break;
218 case 'l':
219 nr_cmd = NETMAP_BDG_LIST;
220 if (optind < argc && argv[optind][0] == '-')
221 name = NULL;
222 break;
223 case 'C':
224 nmr_config = strdup(optarg);
225 break;
163 }
164 if (optind != argc) {
165 // fprintf(stderr, "optind %d argc %d\n", optind, argc);
166 goto usage;
167 }
168 }
169 if (argc == 1)
170 nr_cmd = NETMAP_BDG_LIST;
226 }
227 if (optind != argc) {
228 // fprintf(stderr, "optind %d argc %d\n", optind, argc);
229 goto usage;
230 }
231 }
232 if (argc == 1)
233 nr_cmd = NETMAP_BDG_LIST;
171 return bdg_ctl(name, nr_cmd, nr_arg) ? 1 : 0;
234 return bdg_ctl(name, nr_cmd, nr_arg, nmr_config) ? 1 : 0;
172}
235}