Skip to content

Commit

Permalink
controller: ofctrl: Use index for meter lookups.
Browse files Browse the repository at this point in the history
Signed-off-by: Ilya Maximets <[email protected]>
  • Loading branch information
igsilya committed Feb 25, 2024
1 parent 68acb36 commit fb38e9c
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 17 deletions.
37 changes: 22 additions & 15 deletions controller/ofctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -2257,18 +2257,29 @@ ofctrl_meter_bands_erase(struct ovn_extend_table_info *entry,
}
}

static const struct sbrec_meter *
meter_lookup_by_name(struct ovsdb_idl_index *sbrec_meter_by_name,
const char *name)
{
const struct sbrec_meter *sb_meter;
struct sbrec_meter *meter;

meter = sbrec_meter_index_init_row(sbrec_meter_by_name);
sbrec_meter_index_set_name(meter, name);
sb_meter = sbrec_meter_index_find(sbrec_meter_by_name, meter);
sbrec_meter_index_destroy_row(meter);

return sb_meter;
}

static void
ofctrl_meter_bands_sync(struct ovn_extend_table_info *m_existing,
const struct sbrec_meter_table *meter_table,
struct ovsdb_idl_index *sbrec_meter_by_name,
struct ovs_list *msgs)
{
const struct sbrec_meter *sb_meter;
SBREC_METER_TABLE_FOR_EACH (sb_meter, meter_table) {
if (!strcmp(m_existing->name, sb_meter->name)) {
break;
}
}

sb_meter = meter_lookup_by_name(sbrec_meter_by_name, m_existing->name);
if (sb_meter) {
/* OFPMC13_ADD or OFPMC13_MODIFY */
ofctrl_meter_bands_update(sb_meter, m_existing, msgs);
Expand All @@ -2280,16 +2291,12 @@ ofctrl_meter_bands_sync(struct ovn_extend_table_info *m_existing,

static void
add_meter(struct ovn_extend_table_info *m_desired,
const struct sbrec_meter_table *meter_table,
struct ovsdb_idl_index *sbrec_meter_by_name,
struct ovs_list *msgs)
{
const struct sbrec_meter *sb_meter;
SBREC_METER_TABLE_FOR_EACH (sb_meter, meter_table) {
if (!strcmp(m_desired->name, sb_meter->name)) {
break;
}
}

sb_meter = meter_lookup_by_name(sbrec_meter_by_name, m_desired->name);
if (!sb_meter) {
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
VLOG_ERR_RL(&rl, "could not find meter named \"%s\"", m_desired->name);
Expand Down Expand Up @@ -2656,7 +2663,7 @@ ofctrl_put(struct ovn_desired_flow_table *lflow_table,
struct ovn_desired_flow_table *pflow_table,
struct shash *pending_ct_zones,
struct hmap *pending_lb_tuples,
const struct sbrec_meter_table *meter_table,
struct ovsdb_idl_index *sbrec_meter_by_name,
uint64_t req_cfg,
bool lflows_changed,
bool pflows_changed)
Expand Down Expand Up @@ -2733,10 +2740,10 @@ ofctrl_put(struct ovn_desired_flow_table *lflow_table,
* describes the meter itself. */
add_meter_string(m_desired, &msgs);
} else {
add_meter(m_desired, meter_table, &msgs);
add_meter(m_desired, sbrec_meter_by_name, &msgs);
}
} else {
ofctrl_meter_bands_sync(m_existing, meter_table, &msgs);
ofctrl_meter_bands_sync(m_existing, sbrec_meter_by_name, &msgs);
}
}

Expand Down
2 changes: 1 addition & 1 deletion controller/ofctrl.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ void ofctrl_put(struct ovn_desired_flow_table *lflow_table,
struct ovn_desired_flow_table *pflow_table,
struct shash *pending_ct_zones,
struct hmap *pending_lb_tuples,
const struct sbrec_meter_table *,
struct ovsdb_idl_index *sbrec_meter_by_name,
uint64_t nb_cfg,
bool lflow_changed,
bool pflow_changed);
Expand Down
4 changes: 3 additions & 1 deletion controller/ovn-controller.c
Original file line number Diff line number Diff line change
Expand Up @@ -5129,6 +5129,8 @@ main(int argc, char *argv[])
= chassis_private_index_create(ovnsb_idl_loop.idl);
struct ovsdb_idl_index *sbrec_multicast_group_by_name_datapath
= mcast_group_index_create(ovnsb_idl_loop.idl);
struct ovsdb_idl_index *sbrec_meter_by_name
= ovsdb_idl_index_create1(ovnsb_idl_loop.idl, &sbrec_meter_col_name);
struct ovsdb_idl_index *sbrec_logical_flow_by_logical_datapath
= ovsdb_idl_index_create1(ovnsb_idl_loop.idl,
&sbrec_logical_flow_col_logical_datapath);
Expand Down Expand Up @@ -5942,7 +5944,7 @@ main(int argc, char *argv[])
&pflow_output_data->flow_table,
&ct_zones_data->pending,
&lb_data->removed_tuples,
sbrec_meter_table_get(ovnsb_idl_loop.idl),
sbrec_meter_by_name,
ofctrl_seqno_get_req_cfg(),
engine_node_changed(&en_lflow_output),
engine_node_changed(&en_pflow_output));
Expand Down

0 comments on commit fb38e9c

Please sign in to comment.