svn commit: r321319 - head/sys/net
Luiz Otavio O Souza
loos at FreeBSD.org
Fri Jul 21 03:42:10 UTC 2017
Author: loos
Date: Fri Jul 21 03:42:09 2017
New Revision: 321319
URL: https://svnweb.freebsd.org/changeset/base/321319
Log:
Update netmap_user.h with the current version of netmap. This file should
have been committed together with r319881.
MFC after: 1 week
MFC with: r319881
Pointy hat to: loos
Modified:
head/sys/net/netmap_user.h
Modified: head/sys/net/netmap_user.h
==============================================================================
--- head/sys/net/netmap_user.h Fri Jul 21 03:40:05 2017 (r321318)
+++ head/sys/net/netmap_user.h Fri Jul 21 03:42:09 2017 (r321319)
@@ -309,16 +309,16 @@ typedef void (*nm_cb_t)(u_char *, const struct nm_pkth
* ifname (netmap:foo or vale:foo) is the port name
* a suffix can indicate the follwing:
* ^ bind the host (sw) ring pair
- * * bind host and NIC ring pairs (transparent)
+ * * bind host and NIC ring pairs
* -NN bind individual NIC ring pair
* {NN bind master side of pipe NN
* }NN bind slave side of pipe NN
* a suffix starting with / and the following flags,
* in any order:
* x exclusive access
- * z zero copy monitor
- * t monitor tx side
- * r monitor rx side
+ * z zero copy monitor (both tx and rx)
+ * t monitor tx side (copy monitor)
+ * r monitor rx side (copy monitor)
* R bind only RX ring(s)
* T bind only TX ring(s)
*
@@ -634,9 +634,10 @@ nm_open(const char *ifname, const struct nmreq *req,
const char *vpname = NULL;
#define MAXERRMSG 80
char errmsg[MAXERRMSG] = "";
- enum { P_START, P_RNGSFXOK, P_GETNUM, P_FLAGS, P_FLAGSOK } p_state;
+ enum { P_START, P_RNGSFXOK, P_GETNUM, P_FLAGS, P_FLAGSOK, P_MEMID } p_state;
int is_vale;
long num;
+ uint16_t nr_arg2 = 0;
if (strncmp(ifname, "netmap:", 7) &&
strncmp(ifname, NM_BDG_NAME, strlen(NM_BDG_NAME))) {
@@ -665,7 +666,7 @@ nm_open(const char *ifname, const struct nmreq *req,
}
/* scan for a separator */
- for (; *port && !index("-*^{}/", *port); port++)
+ for (; *port && !index("-*^{}/@", *port); port++)
;
if (is_vale && !nm_is_identifier(vpname, port)) {
@@ -707,6 +708,9 @@ nm_open(const char *ifname, const struct nmreq *req,
case '/': /* start of flags */
p_state = P_FLAGS;
break;
+ case '@': /* start of memid */
+ p_state = P_MEMID;
+ break;
default:
snprintf(errmsg, MAXERRMSG, "unknown modifier: '%c'", *port);
goto fail;
@@ -718,6 +722,9 @@ nm_open(const char *ifname, const struct nmreq *req,
case '/':
p_state = P_FLAGS;
break;
+ case '@':
+ p_state = P_MEMID;
+ break;
default:
snprintf(errmsg, MAXERRMSG, "unexpected character: '%c'", *port);
goto fail;
@@ -736,6 +743,11 @@ nm_open(const char *ifname, const struct nmreq *req,
break;
case P_FLAGS:
case P_FLAGSOK:
+ if (*port == '@') {
+ port++;
+ p_state = P_MEMID;
+ break;
+ }
switch (*port) {
case 'x':
nr_flags |= NR_EXCLUSIVE;
@@ -762,17 +774,25 @@ nm_open(const char *ifname, const struct nmreq *req,
port++;
p_state = P_FLAGSOK;
break;
+ case P_MEMID:
+ if (nr_arg2 != 0) {
+ snprintf(errmsg, MAXERRMSG, "double setting of memid");
+ goto fail;
+ }
+ num = strtol(port, (char **)&port, 10);
+ if (num <= 0) {
+ snprintf(errmsg, MAXERRMSG, "invalid memid %ld, must be >0", num);
+ goto fail;
+ }
+ nr_arg2 = num;
+ p_state = P_RNGSFXOK;
+ break;
}
}
if (p_state != P_START && p_state != P_RNGSFXOK && p_state != P_FLAGSOK) {
snprintf(errmsg, MAXERRMSG, "unexpected end of port name");
goto fail;
}
- if ((nr_flags & NR_ZCOPY_MON) &&
- !(nr_flags & (NR_MONITOR_TX|NR_MONITOR_RX))) {
- snprintf(errmsg, MAXERRMSG, "'z' used but neither 'r', nor 't' found");
- goto fail;
- }
ND("flags: %s %s %s %s",
(nr_flags & NR_EXCLUSIVE) ? "EXCLUSIVE" : "",
(nr_flags & NR_ZCOPY_MON) ? "ZCOPY_MON" : "",
@@ -799,6 +819,8 @@ nm_open(const char *ifname, const struct nmreq *req,
/* these fields are overridden by ifname and flags processing */
d->req.nr_ringid |= nr_ringid;
d->req.nr_flags |= nr_flags;
+ if (nr_arg2)
+ d->req.nr_arg2 = nr_arg2;
memcpy(d->req.nr_name, ifname, namelen);
d->req.nr_name[namelen] = '\0';
/* optionally import info from parent */
@@ -848,7 +870,7 @@ nm_open(const char *ifname, const struct nmreq *req,
nr_reg = d->req.nr_flags & NR_REG_MASK;
- if (nr_reg == NR_REG_SW) { /* host stack */
+ if (nr_reg == NR_REG_SW) { /* host stack */
d->first_tx_ring = d->last_tx_ring = d->req.nr_tx_rings;
d->first_rx_ring = d->last_rx_ring = d->req.nr_rx_rings;
} else if (nr_reg == NR_REG_ALL_NIC) { /* only nic */
More information about the svn-src-all
mailing list