netmap: add man page for the vale-ctl program

Added man page for vale-ctl program.
Small fixes to vale-ctl, including the support for -m option
(to specify the netmap memory allocator id).

Reviewed by:	0mp
Approved by:	gnn (mentor)
Differential Revision:	https://reviews.freebsd.org/D17683
This commit is contained in:
Vincenzo Maffione 2018-10-24 16:01:56 +00:00
parent d4e77c31a2
commit dde8fe66d6
2 changed files with 202 additions and 33 deletions

View File

@ -0,0 +1,163 @@
.\" Copyright (c) 2016 Michio Honda.
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" $FreeBSD$
.\"
.Dd October 24, 2018
.Dt VALE-CTL 4
.Os
.Sh NAME
.Nm vale-ctl
.Nd manage VALE switches provided by netmap
.Sh SYNOPSIS
.Bk -words
.Bl -tag -width "vale-ctl"
.It Nm
.Op Fl g Ar valeSSS:PPP
.Op Fl a Ar valeSSS:interface
.Op Fl h Ar valeSSS:interface
.Op Fl d Ar valeSSS:interface
.Op Fl n Ar interface
.Op Fl r Ar interface
.Op Fl l Ar valeSSS:PPP
.Op Fl l
.Op Fl p Ar valeSSS:PPP
.Op Fl P Ar valeSSS:PPP
.Op Fl C Ar spec
.Op Fl m Ar memid
.El
.Ek
.Sh DESCRIPTION
.Nm
manages and inspects
.Xr vale 4
switches, for instance attaching and detaching interfaces, creating
and deleting persistent VALE ports, or listing the existing switches
and their ports.
In the following,
.Ar valeSSS
is the name of a VALE switch, while
.Ar valeSSS:PPP
is the name of a VALE port of
.Ar valeSSS .
.Pp
When issued without options it lists all the existing switch ports together
with their internal bridge number and port number.
.Bl -tag -width Ds
.It Fl g Ar valeSSS:PPP
Print the number of receive rings of
.Ar valeSSS:PPP .
.It Fl a Ar valeSSS:interface
Attach
.Ar interface
(which must be an existing network interface) to
.Ar valeSSS
and detach it from the host stack.
.It Fl h Ar valeSSS:interface
Attach
.Ar interface
(which must be an existing network interface) to
.Ar valeSSS
while keeping it attached to the host stack.
More precisely, packets coming from
the host stack and directed to the interface will go through the switch, where
they can still reach the interface if the switch rules allow it.
Conversely, packets coming from the interface will go through the switch and,
if appropriate, will reach the host stack.
.It Fl d Ar valeSSS:interface
Detach
.Ar interface
from
.Ar valeSSS .
.It Fl n Ar interface
Create a new persistent VALE port with name
.Ar interface .
The name must be different from any other network interface
already present in the system.
.It Fl d Ar interface
Destroy the persistent VALE port with name
.Ar inteface .
.It Fl l Ar valeSSS:PPP
Show the internal bridge number and port number of the given switch port.
.It Fl p Ar valeSSS:PPP
Enable polling mode for
.Ar valeSSS:PPP .
In polling mode, a dedicated kernel thread is spawned to handle packets
received from
.Ar valeSSS:PPP
and push them into the switch.
The kernel thread busy waits on the switch port rather than relying on
interrupts or notifications.
Polling mode can only be used on physical NICs attached to a VALE switch.
.It Fl P Ar valeSSS:PPP
Disable polling mode for
.Ar valeSSS:PPP .
.It Fl C Ar x | Ar x,y | Ar x,y,z | Ar x,y,z,w
When used in conjunction with
.Fl n
it supplies the number of tx and rx rings and slots.
The full format with four numbers gives, in order, number of tx slots, number
of rx slots, number of tx rings and number of rx rings.
The form with three numbers uses
.Ar z
for both the number of tx and the number of rx rings.
The forms with less than two numbers use the default values for the number
of rings.
The form with two numbers supplies the numbers of tx and rx slots.
The form with only one number uses
.Ar x
for both the number of tx and the number of rx slots.
.Pp
When used in conjunction with
.Fl p
only the first three forms are used.
The first number may be either 0 or 1.
If 0, then all interface rings will be polled by a single thread, running
on the core id given by the second number (the third number, if present,
must be 1).
If the first number is 1, then the ring identified by the second number will
be polled by the core with the same id.
If a third number is given, then this is repeated for as many consecutive
rings and cores.
.It Fl m Ar memid
Used in conjunction with
.Fl n
supplies the netmap memory region identifier to use together with the newly
created persistent VALE port.
These ports use a private memory region by default.
Using this option you can let them share memory with other ports.
Pass 1 as
.Ar memid
to use the global memory region already shared by all
harware netmap ports.
.El
.Sh SEE ALSO
.Xr netmap 4 ,
.Xr vale 4
.Sh AUTHORS
.An -nosplit
.Nm
has been written by
.An Michio Honda
at NetApp.

View File

@ -82,7 +82,7 @@ void parse_nmr_config(const char* conf, struct nmreq *nmr)
}
static int
bdg_ctl(const char *name, int nr_cmd, int nr_arg, char *nmr_config)
bdg_ctl(const char *name, int nr_cmd, int nr_arg, char *nmr_config, int nr_arg2)
{
struct nmreq nmr;
int error = 0;
@ -96,9 +96,10 @@ bdg_ctl(const char *name, int nr_cmd, int nr_arg, char *nmr_config)
bzero(&nmr, sizeof(nmr));
nmr.nr_version = NETMAP_API;
if (name != NULL) /* might be NULL */
strncpy(nmr.nr_name, name, sizeof(nmr.nr_name));
strncpy(nmr.nr_name, name, sizeof(nmr.nr_name)-1);
nmr.nr_cmd = nr_cmd;
parse_nmr_config(nmr_config, &nmr);
nmr.nr_arg2 = nr_arg2;
switch (nr_cmd) {
case NETMAP_BDG_DELIF:
@ -195,42 +196,44 @@ bdg_ctl(const char *name, int nr_cmd, int nr_arg, char *nmr_config)
return error;
}
static void
usage(int errcode)
{
fprintf(stderr,
"Usage:\n"
"vale-ctl arguments\n"
"\t-g interface interface name to get info\n"
"\t-d interface interface name to be detached\n"
"\t-a interface interface name to be attached\n"
"\t-h interface interface name to be attached with the host stack\n"
"\t-n interface interface name to be created\n"
"\t-r interface interface name to be deleted\n"
"\t-l list all or specified bridge's interfaces (default)\n"
"\t-C string ring/slot setting of an interface creating by -n\n"
"\t-p interface start polling. Additional -C x,y,z configures\n"
"\t\t x: 0 (REG_ALL_NIC) or 1 (REG_ONE_NIC),\n"
"\t\t y: CPU core id for ALL_NIC and core/ring for ONE_NIC\n"
"\t\t z: (ONE_NIC only) num of total cores/rings\n"
"\t-P interface stop polling\n"
"\t-m memid to use when creating a new interface\n");
exit(errcode);
}
int
main(int argc, char *argv[])
{
int ch, nr_cmd = 0, nr_arg = 0;
const char *command = basename(argv[0]);
char *name = NULL, *nmr_config = NULL;
int nr_arg2 = 0;
if (argc > 5) {
usage:
fprintf(stderr,
"Usage:\n"
"%s arguments\n"
"\t-g interface interface name to get info\n"
"\t-d interface interface name to be detached\n"
"\t-a interface interface name to be attached\n"
"\t-h interface interface name to be attached with the host stack\n"
"\t-n interface interface name to be created\n"
"\t-r interface interface name to be deleted\n"
"\t-l list all or specified bridge's interfaces (default)\n"
"\t-C string ring/slot setting of an interface creating by -n\n"
"\t-p interface start polling. Additional -C x,y,z configures\n"
"\t\t x: 0 (REG_ALL_NIC) or 1 (REG_ONE_NIC),\n"
"\t\t y: CPU core id for ALL_NIC and core/ring for ONE_NIC\n"
"\t\t z: (ONE_NIC only) num of total cores/rings\n"
"\t-P interface stop polling\n"
"", command);
return 0;
}
while ((ch = getopt(argc, argv, "d:a:h:g:l:n:r:C:p:P:")) != -1) {
if (ch != 'C')
while ((ch = getopt(argc, argv, "d:a:h:g:l:n:r:C:p:P:m:")) != -1) {
if (ch != 'C' && ch != 'm')
name = optarg; /* default */
switch (ch) {
default:
fprintf(stderr, "bad option %c %s", ch, optarg);
goto usage;
usage(-1);
break;
case 'd':
nr_cmd = NETMAP_BDG_DETACH;
break;
@ -252,8 +255,6 @@ main(int argc, char *argv[])
break;
case 'l':
nr_cmd = NETMAP_BDG_LIST;
if (optind < argc && argv[optind][0] == '-')
name = NULL;
break;
case 'C':
nmr_config = strdup(optarg);
@ -264,13 +265,18 @@ main(int argc, char *argv[])
case 'P':
nr_cmd = NETMAP_BDG_POLLING_OFF;
break;
case 'm':
nr_arg2 = atoi(optarg);
break;
}
}
if (optind != argc) {
// fprintf(stderr, "optind %d argc %d\n", optind, argc);
goto usage;
usage(-1);
}
if (argc == 1)
if (argc == 1) {
nr_cmd = NETMAP_BDG_LIST;
return bdg_ctl(name, nr_cmd, nr_arg, nmr_config) ? 1 : 0;
name = NULL;
}
return bdg_ctl(name, nr_cmd, nr_arg, nmr_config, nr_arg2) ? 1 : 0;
}