projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
debian: Fix filename for ovs-vlan-test manpage.
[openvswitch]
/
lib
/
nx-match.c
diff --git
a/lib/nx-match.c
b/lib/nx-match.c
index 0b87fc92f7ef1916f726a39b8f4798f2130a681c..47cce83358dc94f39e10282d755446be8e93bcd2 100644
(file)
--- a/
lib/nx-match.c
+++ b/
lib/nx-match.c
@@
-123,7
+123,7
@@
nxm_field_lookup(uint32_t header)
/* Returns the width of the data for a field with the given 'header', in
* bytes. */
/* Returns the width of the data for a field with the given 'header', in
* bytes. */
-
static
int
+int
nxm_field_bytes(uint32_t header)
{
unsigned int length = NXM_LENGTH(header);
nxm_field_bytes(uint32_t header)
{
unsigned int length = NXM_LENGTH(header);
@@
-132,7
+132,7
@@
nxm_field_bytes(uint32_t header)
/* Returns the width of the data for a field with the given 'header', in
* bits. */
/* Returns the width of the data for a field with the given 'header', in
* bits. */
-
static
int
+int
nxm_field_bits(uint32_t header)
{
return nxm_field_bytes(header) * 8;
nxm_field_bits(uint32_t header)
{
return nxm_field_bytes(header) * 8;
@@
-824,8
+824,8
@@
nx_match_from_string(const char *s, struct ofpbuf *b)
return match_len;
}
\f
return match_len;
}
\f
-
static
const char *
-
parse_nxm
_field_bits(const char *s, uint32_t *headerp, int *ofsp, int *n_bitsp)
+const char *
+
nxm_parse
_field_bits(const char *s, uint32_t *headerp, int *ofsp, int *n_bitsp)
{
const char *full_s = s;
const char *name;
{
const char *full_s = s;
const char *name;
@@
-886,12
+886,12
@@
nxm_parse_reg_move(struct nx_action_reg_move *move, const char *s)
int src_ofs, dst_ofs;
int src_n_bits, dst_n_bits;
int src_ofs, dst_ofs;
int src_n_bits, dst_n_bits;
- s =
parse_nxm
_field_bits(s, &src, &src_ofs, &src_n_bits);
+ s =
nxm_parse
_field_bits(s, &src, &src_ofs, &src_n_bits);
if (strncmp(s, "->", 2)) {
ovs_fatal(0, "%s: missing `->' following source", full_s);
}
s += 2;
if (strncmp(s, "->", 2)) {
ovs_fatal(0, "%s: missing `->' following source", full_s);
}
s += 2;
- s =
parse_nxm
_field_bits(s, &dst, &dst_ofs, &dst_n_bits);
+ s =
nxm_parse
_field_bits(s, &dst, &dst_ofs, &dst_n_bits);
if (*s != '\0') {
ovs_fatal(0, "%s: trailing garbage following destination", full_s);
}
if (*s != '\0') {
ovs_fatal(0, "%s: trailing garbage following destination", full_s);
}
@@
-925,7
+925,7
@@
nxm_parse_reg_load(struct nx_action_reg_load *load, const char *s)
ovs_fatal(0, "%s: missing `->' following value", full_s);
}
s += 2;
ovs_fatal(0, "%s: missing `->' following value", full_s);
}
s += 2;
- s =
parse_nxm
_field_bits(s, &dst, &ofs, &n_bits);
+ s =
nxm_parse
_field_bits(s, &dst, &ofs, &n_bits);
if (*s != '\0') {
ovs_fatal(0, "%s: trailing garbage following destination", full_s);
}
if (*s != '\0') {
ovs_fatal(0, "%s: trailing garbage following destination", full_s);
}
@@
-939,21
+939,23
@@
nxm_parse_reg_load(struct nx_action_reg_load *load, const char *s)
load->len = htons(sizeof *load);
load->vendor = htonl(NX_VENDOR_ID);
load->subtype = htons(NXAST_REG_LOAD);
load->len = htons(sizeof *load);
load->vendor = htonl(NX_VENDOR_ID);
load->subtype = htons(NXAST_REG_LOAD);
- load->ofs_nbits =
htons((ofs << 6) | (n_bits - 1)
);
+ load->ofs_nbits =
nxm_encode_ofs_nbits(ofs, n_bits
);
load->dst = htonl(dst);
load->value = htonll(value);
}
\f
/* nxm_format_reg_move(), nxm_format_reg_load(). */
load->dst = htonl(dst);
load->value = htonll(value);
}
\f
/* nxm_format_reg_move(), nxm_format_reg_load(). */
-
static
void
-
format_nxm
_field_bits(struct ds *s, uint32_t header, int ofs, int n_bits)
+void
+
nxm_format
_field_bits(struct ds *s, uint32_t header, int ofs, int n_bits)
{
format_nxm_field_name(s, header);
{
format_nxm_field_name(s, header);
- if (
n_bits != 1
) {
- ds_put_
format(s, "[%d..%d]", ofs, ofs + n_bits - 1
);
- } else {
+ if (
ofs == 0 && n_bits == nxm_field_bits(header)
) {
+ ds_put_
cstr(s, "[]"
);
+ } else
if (n_bits == 1)
{
ds_put_format(s, "[%d]", ofs);
ds_put_format(s, "[%d]", ofs);
+ } else {
+ ds_put_format(s, "[%d..%d]", ofs, ofs + n_bits - 1);
}
}
}
}
@@
-967,22
+969,21
@@
nxm_format_reg_move(const struct nx_action_reg_move *move, struct ds *s)
uint32_t dst = ntohl(move->dst);
ds_put_format(s, "move:");
uint32_t dst = ntohl(move->dst);
ds_put_format(s, "move:");
-
format_nxm
_field_bits(s, src, src_ofs, n_bits);
+
nxm_format
_field_bits(s, src, src_ofs, n_bits);
ds_put_cstr(s, "->");
ds_put_cstr(s, "->");
-
format_nxm
_field_bits(s, dst, dst_ofs, n_bits);
+
nxm_format
_field_bits(s, dst, dst_ofs, n_bits);
}
void
nxm_format_reg_load(const struct nx_action_reg_load *load, struct ds *s)
{
}
void
nxm_format_reg_load(const struct nx_action_reg_load *load, struct ds *s)
{
- uint16_t ofs_nbits = ntohs(load->ofs_nbits);
- int ofs = ofs_nbits >> 6;
- int n_bits = (ofs_nbits & 0x3f) + 1;
+ int ofs = nxm_decode_ofs(load->ofs_nbits);
+ int n_bits = nxm_decode_n_bits(load->ofs_nbits);
uint32_t dst = ntohl(load->dst);
uint64_t value = ntohll(load->value);
ds_put_format(s, "load:%"PRIu64"->", value);
uint32_t dst = ntohl(load->dst);
uint64_t value = ntohll(load->value);
ds_put_format(s, "load:%"PRIu64"->", value);
-
format_nxm
_field_bits(s, dst, ofs, n_bits);
+
nxm_format
_field_bits(s, dst, ofs, n_bits);
}
\f
/* nxm_check_reg_move(), nxm_check_reg_load(). */
}
\f
/* nxm_check_reg_move(), nxm_check_reg_load(). */
@@
-1031,8
+1032,8
@@
nxm_check_reg_load(const struct nx_action_reg_load *action,
const struct nxm_field *dst;
int ofs, n_bits;
const struct nxm_field *dst;
int ofs, n_bits;
- ofs = n
tohs(action->ofs_nbits) >> 6
;
- n_bits =
(ntohs(action->ofs_nbits) & 0x3f) + 1
;
+ ofs = n
xm_decode_ofs(action->ofs_nbits)
;
+ n_bits =
nxm_decode_n_bits(action->ofs_nbits)
;
dst = nxm_field_lookup(ntohl(action->dst));
if (!field_ok(dst, flow, ofs + n_bits)) {
return BAD_ARGUMENT;
dst = nxm_field_lookup(ntohl(action->dst));
if (!field_ok(dst, flow, ofs + n_bits)) {
return BAD_ARGUMENT;
@@
-1175,7
+1176,7
@@
nxm_execute_reg_load(const struct nx_action_reg_load *action,
struct flow *flow)
{
/* Preparation. */
struct flow *flow)
{
/* Preparation. */
- int n_bits =
(ntohs(action->ofs_nbits) & 0x3f) + 1
;
+ int n_bits =
nxm_decode_n_bits(action->ofs_nbits)
;
uint32_t mask = n_bits == 32 ? UINT32_MAX : (UINT32_C(1) << n_bits) - 1;
uint32_t *reg = &flow->regs[NXM_NX_REG_IDX(ntohl(action->dst))];
uint32_t mask = n_bits == 32 ? UINT32_MAX : (UINT32_C(1) << n_bits) - 1;
uint32_t *reg = &flow->regs[NXM_NX_REG_IDX(ntohl(action->dst))];
@@
-1183,7
+1184,7
@@
nxm_execute_reg_load(const struct nx_action_reg_load *action,
uint32_t src_data = ntohll(action->value);
/* Get remaining bits of the destination field. */
uint32_t src_data = ntohll(action->value);
/* Get remaining bits of the destination field. */
- int dst_ofs = n
tohs(action->ofs_nbits) >> 6
;
+ int dst_ofs = n
xm_decode_ofs(action->ofs_nbits)
;
uint32_t dst_data = *reg & ~(mask << dst_ofs);
*reg = dst_data | (src_data << dst_ofs);
uint32_t dst_data = *reg & ~(mask << dst_ofs);
*reg = dst_data | (src_data << dst_ofs);