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