[ovs-dev] [PATCH v2 07/21] expr: Track writability as part of expr_symbol.

Ben Pfaff blp at ovn.org
Mon Aug 8 16:14:18 UTC 2016


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 <blp at 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




More information about the dev mailing list