Skip to content

Commit

Permalink
expr.c: Split expr_const_sets_add.
Browse files Browse the repository at this point in the history
Split this function to two functions for integers (e.g. IP addresses) and
strings (e.g. port names), because they will become more different in
next patch.

Suggested-by: Mark Gray <mark.d.gray@redhat.com>
Acked-by: Mark D. Gray <mark.d.gray@redhat.com>
Signed-off-by: Han Zhou <hzhou@ovn.org>
  • Loading branch information
hzhou8 committed Apr 29, 2021
1 parent e239324 commit 6a14469
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 58 deletions.
24 changes: 12 additions & 12 deletions controller/ovn-controller.c
Expand Up @@ -1338,9 +1338,9 @@ addr_sets_init(const struct sbrec_address_set_table *address_set_table,
{
const struct sbrec_address_set *as;
SBREC_ADDRESS_SET_TABLE_FOR_EACH (as, address_set_table) {
expr_const_sets_add(addr_sets, as->name,
(const char *const *) as->addresses,
as->n_addresses, true);
expr_const_sets_add_integers(addr_sets, as->name,
(const char *const *) as->addresses,
as->n_addresses);
}
}

Expand All @@ -1355,9 +1355,9 @@ addr_sets_update(const struct sbrec_address_set_table *address_set_table,
expr_const_sets_remove(addr_sets, as->name);
sset_add(deleted, as->name);
} else {
expr_const_sets_add(addr_sets, as->name,
(const char *const *) as->addresses,
as->n_addresses, true);
expr_const_sets_add_integers(addr_sets, as->name,
(const char *const *) as->addresses,
as->n_addresses);
if (sbrec_address_set_is_new(as)) {
sset_add(new, as->name);
} else {
Expand Down Expand Up @@ -1454,9 +1454,9 @@ port_groups_init(const struct sbrec_port_group_table *port_group_table,
{
const struct sbrec_port_group *pg;
SBREC_PORT_GROUP_TABLE_FOR_EACH (pg, port_group_table) {
expr_const_sets_add(port_groups, pg->name,
(const char *const *) pg->ports,
pg->n_ports, false);
expr_const_sets_add_strings(port_groups, pg->name,
(const char *const *) pg->ports,
pg->n_ports);
}
}

Expand All @@ -1471,9 +1471,9 @@ port_groups_update(const struct sbrec_port_group_table *port_group_table,
expr_const_sets_remove(port_groups, pg->name);
sset_add(deleted, pg->name);
} else {
expr_const_sets_add(port_groups, pg->name,
(const char *const *) pg->ports,
pg->n_ports, false);
expr_const_sets_add_strings(port_groups, pg->name,
(const char *const *) pg->ports,
pg->n_ports);
if (sbrec_port_group_is_new(pg)) {
sset_add(new, pg->name);
} else {
Expand Down
7 changes: 4 additions & 3 deletions include/ovn/expr.h
Expand Up @@ -545,9 +545,10 @@ void expr_constant_set_destroy(struct expr_constant_set *cs);
* are ignored.
*/

void expr_const_sets_add(struct shash *const_sets, const char *name,
const char * const *values, size_t n_values,
bool convert_to_integer);
void expr_const_sets_add_integers(struct shash *const_sets, const char *name,
const char * const *values, size_t n_values);
void expr_const_sets_add_strings(struct shash *const_sets, const char *name,
const char * const *values, size_t n_values);
void expr_const_sets_remove(struct shash *const_sets, const char *name);
void expr_const_sets_destroy(struct shash *const_sets);

Expand Down
78 changes: 47 additions & 31 deletions lib/expr.c
Expand Up @@ -1061,11 +1061,12 @@ expr_constant_set_destroy(struct expr_constant_set *cs)
}

/* Adds an constant set named 'name' to 'const_sets', replacing any existing
* constant set entry with the given name. */
* constant set entry with the given name. The 'values' must be strings that
* can be converted to integers or masked integers, such as IP addresses.
* Values that can't be converted are skipped. */
void
expr_const_sets_add(struct shash *const_sets, const char *name,
const char *const *values, size_t n_values,
bool convert_to_integer)
expr_const_sets_add_integers(struct shash *const_sets, const char *name,
const char *const *values, size_t n_values)
{
/* Replace any existing entry for this name. */
expr_const_sets_remove(const_sets, name);
Expand All @@ -1074,35 +1075,50 @@ expr_const_sets_add(struct shash *const_sets, const char *name,
cs->in_curlies = true;
cs->n_values = 0;
cs->values = xmalloc(n_values * sizeof *cs->values);
if (convert_to_integer) {
cs->type = EXPR_C_INTEGER;
for (size_t i = 0; i < n_values; i++) {
/* Use the lexer to convert each constant set into the proper
* integer format. */
struct lexer lex;
lexer_init(&lex, values[i]);
lexer_get(&lex);
if (lex.token.type != LEX_T_INTEGER
&& lex.token.type != LEX_T_MASKED_INTEGER) {
VLOG_WARN("Invalid constant set entry: '%s', token type: %d",
values[i], lex.token.type);
} else {
union expr_constant *c = &cs->values[cs->n_values++];
c->value = lex.token.value;
c->format = lex.token.format;
c->masked = lex.token.type == LEX_T_MASKED_INTEGER;
if (c->masked) {
c->mask = lex.token.mask;
}
}
lexer_destroy(&lex);
}
} else {
cs->type = EXPR_C_STRING;
for (size_t i = 0; i < n_values; i++) {
cs->type = EXPR_C_INTEGER;
for (size_t i = 0; i < n_values; i++) {
/* Use the lexer to convert each constant set into the proper
* integer format. */
struct lexer lex;
lexer_init(&lex, values[i]);
lexer_get(&lex);
if (lex.token.type != LEX_T_INTEGER
&& lex.token.type != LEX_T_MASKED_INTEGER) {
VLOG_WARN("Invalid constant set entry: '%s', token type: %d",
values[i], lex.token.type);
} else {
union expr_constant *c = &cs->values[cs->n_values++];
c->string = xstrdup(values[i]);
c->value = lex.token.value;
c->format = lex.token.format;
c->masked = lex.token.type == LEX_T_MASKED_INTEGER;
if (c->masked) {
c->mask = lex.token.mask;
}
}
lexer_destroy(&lex);
}

shash_add(const_sets, name, cs);
}

/* Adds an constant set named 'name' to 'const_sets', replacing any existing
* constant set entry with the given name. Unlike expr_const_sets_add_integers,
* the 'values' will not be converted but stored as is. */
void
expr_const_sets_add_strings(struct shash *const_sets, const char *name,
const char *const *values, size_t n_values)
{
/* Replace any existing entry for this name. */
expr_const_sets_remove(const_sets, name);

struct expr_constant_set *cs = xzalloc(sizeof *cs);
cs->in_curlies = true;
cs->n_values = 0;
cs->values = xmalloc(n_values * sizeof *cs->values);
cs->type = EXPR_C_STRING;
for (size_t i = 0; i < n_values; i++) {
union expr_constant *c = &cs->values[cs->n_values++];
c->string = xstrdup(values[i]);
}

shash_add(const_sets, name, cs);
Expand Down
12 changes: 6 additions & 6 deletions tests/test-ovn.c
Expand Up @@ -227,10 +227,10 @@ create_addr_sets(struct shash *addr_sets)
};
static const char *const addrs4[] = { NULL };

expr_const_sets_add(addr_sets, "set1", addrs1, 3, true);
expr_const_sets_add(addr_sets, "set2", addrs2, 3, true);
expr_const_sets_add(addr_sets, "set3", addrs3, 3, true);
expr_const_sets_add(addr_sets, "set4", addrs4, 0, true);
expr_const_sets_add_integers(addr_sets, "set1", addrs1, 3);
expr_const_sets_add_integers(addr_sets, "set2", addrs2, 3);
expr_const_sets_add_integers(addr_sets, "set3", addrs3, 3);
expr_const_sets_add_integers(addr_sets, "set4", addrs4, 0);
}

static void
Expand All @@ -243,8 +243,8 @@ create_port_groups(struct shash *port_groups)
};
static const char *const pg2[] = { NULL };

expr_const_sets_add(port_groups, "0_pg1", pg1, 3, false);
expr_const_sets_add(port_groups, "0_pg_empty", pg2, 0, false);
expr_const_sets_add_strings(port_groups, "0_pg1", pg1, 3);
expr_const_sets_add_strings(port_groups, "0_pg_empty", pg2, 0);
}

static bool
Expand Down
12 changes: 6 additions & 6 deletions utilities/ovn-trace.c
Expand Up @@ -818,9 +818,9 @@ read_address_sets(void)

const struct sbrec_address_set *sbas;
SBREC_ADDRESS_SET_FOR_EACH (sbas, ovnsb_idl) {
expr_const_sets_add(&address_sets, sbas->name,
(const char *const *) sbas->addresses,
sbas->n_addresses, true);
expr_const_sets_add_integers(&address_sets, sbas->name,
(const char *const *) sbas->addresses,
sbas->n_addresses);
}
}

Expand All @@ -831,9 +831,9 @@ read_port_groups(void)

const struct sbrec_port_group *sbpg;
SBREC_PORT_GROUP_FOR_EACH (sbpg, ovnsb_idl) {
expr_const_sets_add(&port_groups, sbpg->name,
(const char *const *) sbpg->ports,
sbpg->n_ports, false);
expr_const_sets_add_strings(&port_groups, sbpg->name,
(const char *const *) sbpg->ports,
sbpg->n_ports);
}
}

Expand Down

0 comments on commit 6a14469

Please sign in to comment.