Until now it was only possible to find out whether an expr_symbol was read/write or read-only, for subfields, by chasing down whether the eventual parent field was read/write or read-only. This commit adds a new 'rw' member that indicates directly.
Signed-off-by: Ben Pfaff <b...@ovn.org> --- include/ovn/expr.h | 1 + ovn/lib/expr.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/include/ovn/expr.h b/include/ovn/expr.h index d790c49..569c524 100644 --- a/include/ovn/expr.h +++ b/include/ovn/expr.h @@ -246,6 +246,7 @@ struct expr_symbol { char *prereqs; bool must_crossproduct; + bool rw; }; /* A reference to a symbol or a subfield of a symbol. diff --git a/ovn/lib/expr.c b/ovn/lib/expr.c index 86ea75a..771765a 100644 --- a/ovn/lib/expr.c +++ b/ovn/lib/expr.c @@ -1119,7 +1119,7 @@ expr_parse_string(const char *s, const struct shash *symtab, static struct expr_symbol * add_symbol(struct shash *symtab, const char *name, int width, const char *prereqs, enum expr_level level, - bool must_crossproduct) + bool must_crossproduct, bool rw) { struct expr_symbol *symbol = xzalloc(sizeof *symbol); symbol->name = xstrdup(name); @@ -1127,6 +1127,7 @@ add_symbol(struct shash *symtab, const char *name, int width, symbol->width = width; symbol->level = level; symbol->must_crossproduct = must_crossproduct; + symbol->rw = rw; shash_add_assert(symtab, symbol->name, symbol); return symbol; } @@ -1153,7 +1154,7 @@ expr_symtab_add_field(struct shash *symtab, const char *name, (field->maskable == MFM_FULLY ? EXPR_L_ORDINAL : EXPR_L_NOMINAL), - must_crossproduct); + must_crossproduct, field->writable); symbol->field = field; return symbol; } @@ -1206,7 +1207,8 @@ expr_symtab_add_subfield(struct shash *symtab, const char *name, name, expr_level_to_string(level), f.symbol->name); } - symbol = add_symbol(symtab, name, f.n_bits, prereqs, level, false); + symbol = add_symbol(symtab, name, f.n_bits, prereqs, level, false, + f.symbol->rw); symbol->expansion = xstrdup(subfield); return symbol; } @@ -1220,7 +1222,8 @@ expr_symtab_add_string(struct shash *symtab, const char *name, const struct mf_field *field = mf_from_id(id); struct expr_symbol *symbol; - symbol = add_symbol(symtab, name, 0, prereqs, EXPR_L_NOMINAL, false); + symbol = add_symbol(symtab, name, 0, prereqs, EXPR_L_NOMINAL, false, + field->writable); symbol->field = field; return symbol; } @@ -1281,7 +1284,7 @@ expr_symtab_add_predicate(struct shash *symtab, const char *name, return NULL; } - symbol = add_symbol(symtab, name, 1, NULL, level, false); + symbol = add_symbol(symtab, name, 1, NULL, level, false, false); symbol->expansion = xstrdup(expansion); return symbol; } -- 2.1.3 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev