#include "ofp-parse.h"
+#include <ctype.h>
#include <errno.h>
#include <stdlib.h>
}
}
+static void
+parse_reg_value(struct cls_rule *rule, int reg_idx, const char *value)
+{
+ uint32_t reg_value, reg_mask;
+
+ if (!strcmp(value, "ANY") || !strcmp(value, "*")) {
+ cls_rule_set_reg_masked(rule, reg_idx, 0, 0);
+ } else if (sscanf(value, "%"SCNi32"/%"SCNi32,
+ ®_value, ®_mask) == 2) {
+ cls_rule_set_reg_masked(rule, reg_idx, reg_value, reg_mask);
+ } else if (sscanf(value, "%"SCNi32, ®_value)) {
+ cls_rule_set_reg(rule, reg_idx, reg_value);
+ } else {
+ ovs_fatal(0, "register fields must take the form <value> "
+ "or <value>/<mask>");
+ }
+}
+
/* Convert 'string' (as described in the Flow Syntax section of the ovs-ofctl
* man page) into 'pf'. If 'actions' is specified, an action must be in
* 'string' and may be expanded or reallocated. */
} else {
parse_field_value(&pf->rule, f->index, value);
}
+ } else if (!strncmp(name, "reg", 3) && isdigit(name[3])) {
+ unsigned int reg_idx = atoi(name + 3);
+ if (reg_idx >= FLOW_N_REGS) {
+ ovs_fatal(0, "only %d registers supported", FLOW_N_REGS);
+ }
+ parse_reg_value(&pf->rule, reg_idx, value);
} else {
ovs_fatal(0, "unknown keyword %s", name);
}
attempt to negotiate use of one of these extensions, preferring NXM.
If the switch does not support either extension, then \fBovs\-ofctl\fR
will report a fatal error.
+.IP "\fBreg\fIidx\fB=\fIvalue\fR[\fB/\fImask\fR]"
+Matches \fIvalue\fR either exactly or with optional \fImask\fR in
+register number \fIidx\fR. The valid range of \fIidx\fR depends on
+the switch. \fIvalue\fR and \fImask\fR are 32-bit integers, by
+default in decimal (use a \fB0x\fR prefix to specify hexadecimal).
+Arbitrary \fImask\fR values are allowed: a 1-bit in \fImask\fR
+indicates that the corresponding bit in \fIvalue\fR must match
+exactly, and a 0-bit wildcards that bit.
+.IP
+When a packet enters an OpenFlow switch, all of the registers are set
+to 0. Only explicit Nicira extension actions change register values.
+.IP
+Register matches require support for the NXM (Nicira Extended Match)
+extension to OpenFlow. When a register match is specified,
+\fBovs\-ofctl\fR will automatically attempt to negotiate use of this
+extension. If the switch does not support NXM, then \fBovs\-ofctl\fR
+will report a fatal error.
.
.PP
The following shorthand notations are also available: