@@ -2366,8 +2366,9 @@ en_lflow_output_init(struct engine_node *node OVS_UNUSED,
{
struct ed_type_lflow_output *data = xzalloc(sizeof *data);
ovn_desired_flow_table_init(&data->flow_table);
- ovn_extend_table_init(&data->group_table);
- ovn_extend_table_init(&data->meter_table);
+ ovn_extend_table_init(&data->group_table, 0, MAX_EXT_TABLE_ID);
+ ovn_extend_table_init(&data->meter_table, MAX_EXT_TABLE_ID / 2,
+ MAX_EXT_TABLE_ID / 2);
lflow_resource_init(&data->lflow_resource_ref);
lflow_conj_ids_init(&data->conj_ids);
hmap_init(&data->lflows_processed);
@@ -30,9 +30,12 @@ ovn_extend_table_delete_desired(struct ovn_extend_table *table,
struct ovn_extend_table_lflow_to_desired *l);
void
-ovn_extend_table_init(struct ovn_extend_table *table)
+ovn_extend_table_init(struct ovn_extend_table *table,
+ size_t offset, size_t size)
{
- table->table_ids = bitmap_allocate(MAX_EXT_TABLE_ID);
+ table->table_ids = bitmap_allocate(size);
+ table->table_ids_offset = offset;
+ table->table_ids_size = size;
bitmap_set1(table->table_ids, 0); /* table id 0 is invalid. */
hmap_init(&table->desired);
hmap_init(&table->lflow_to_desired);
@@ -187,7 +190,8 @@ ovn_extend_table_clear(struct ovn_extend_table *table, bool existing)
/* Don't unset bitmap for desired group_info if the group_id
* was not freshly reserved. */
if (existing || g->new_table_id) {
- bitmap_set0(table->table_ids, g->table_id);
+ bitmap_set0(table->table_ids,
+ g->table_id - table->table_ids_offset);
}
ovn_extend_table_info_destroy(g);
}
@@ -213,7 +217,8 @@ ovn_extend_table_remove_existing(struct ovn_extend_table *table,
hmap_remove(&table->existing, &existing->hmap_node);
/* Dealloc group_id. */
- bitmap_set0(table->table_ids, existing->table_id);
+ bitmap_set0(table->table_ids,
+ existing->table_id - table->table_ids_offset);
ovn_extend_table_info_destroy(existing);
}
@@ -231,7 +236,8 @@ ovn_extend_table_delete_desired(struct ovn_extend_table *table,
e->name, UUID_ARGS(&l->lflow_uuid));
hmap_remove(&table->desired, &e->hmap_node);
if (e->new_table_id) {
- bitmap_set0(table->table_ids, e->table_id);
+ bitmap_set0(table->table_ids,
+ e->table_id - table->table_ids_offset);
}
ovn_extend_table_info_destroy(e);
}
@@ -316,16 +322,18 @@ ovn_extend_table_assign_id(struct ovn_extend_table *table, const char *name,
bool new_table_id = false;
if (!table_id) {
/* Reserve a new group_id. */
- table_id = bitmap_scan(table->table_ids, 0, 1, MAX_EXT_TABLE_ID + 1);
+ table_id = bitmap_scan(table->table_ids, 0, 1,
+ table->table_ids_size + 1);
new_table_id = true;
}
- if (table_id == MAX_EXT_TABLE_ID + 1) {
+ if (table_id == table->table_ids_size + 1) {
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
VLOG_ERR_RL(&rl, "%"PRIu32" out of table ids.", table_id);
return EXT_TABLE_ID_INVALID;
}
bitmap_set1(table->table_ids, table_id);
+ table_id += table->table_ids_offset;
table_info = ovn_extend_table_info_alloc(name, table_id, new_table_id,
hash);
@@ -30,6 +30,8 @@ struct ovn_extend_table {
unsigned long *table_ids; /* Used as a bitmap with value set
* for allocated group ids in either
* desired or existing. */
+ size_t table_ids_offset; /* table first id offset */
+ size_t table_ids_size; /* table ids size */
struct hmap desired;
struct hmap lflow_to_desired; /* Index for looking up desired table
* items from given lflow uuid, with
@@ -72,7 +74,7 @@ struct ovn_extend_table_lflow_ref {
struct ovn_extend_table_info *desired;
};
-void ovn_extend_table_init(struct ovn_extend_table *);
+void ovn_extend_table_init(struct ovn_extend_table *, size_t, size_t);
void ovn_extend_table_destroy(struct ovn_extend_table *);
@@ -725,7 +725,7 @@ check ovn-nbctl meter-add event-elb drop 100 pktps 10
check ovn-nbctl --wait=hv copp-add copp0 event-elb event-elb
check ovn-nbctl --wait=hv ls-copp-add copp0 ls1
-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep controller | grep userdata=00.00.00.0f | grep -q meter_id=1])
+AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep controller | grep userdata=00.00.00.0f | grep -q meter_id=32768])
check ovn-nbctl copp-del copp0
AT_CHECK([ovn-nbctl copp-list copp0], [0], [dnl
@@ -738,13 +738,13 @@ check ovn-nbctl --wait=hv copp-add copp1 reject acl-meter
check ovn-nbctl ls-copp-add copp1 ls1
check ovn-nbctl --wait=hv acl-add ls1 from-lport 1002 'inport == "lsp1" && ip && udp' reject
-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep controller | grep userdata=00.00.00.16 | grep -q meter_id=1])
+AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep controller | grep userdata=00.00.00.16 | grep -q meter_id=32768])
# arp metering
check ovn-nbctl meter-add arp-meter drop 200 pktps 0
check ovn-nbctl --wait=hv copp-add copp2 arp-resolve arp-meter
check ovn-nbctl --wait=hv lr-copp-add copp2 lr1
-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep controller | grep userdata=00.00.00.00 | grep -q meter_id=2])
+AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep controller | grep userdata=00.00.00.00 | grep -q meter_id=32769])
OVN_CLEANUP([hv1])
AT_CLEANUP
@@ -1584,13 +1584,13 @@ reg1[0] = dns_lookup("foo");
set_meter(0);
Rate 0 for set_meter is not in valid.
set_meter(1);
- encodes as meter:1
+ encodes as meter:32768
set_meter(100, 1000);
- encodes as meter:2
+ encodes as meter:32769
set_meter(100, 1000, );
Syntax error at `,' expecting `)'.
set_meter(4294967295, 4294967295);
- encodes as meter:3
+ encodes as meter:32770
# log
log(verdict=allow, severity=warning);
@@ -9159,8 +9159,8 @@ AT_SKIP_IF([test $d_secs -gt 9])
# Print some information that may help debugging.
AT_CHECK([as hv ovs-appctl -t ovn-controller meter-table-list], [0], [dnl
-http-rl1: 1
-http-rl2: 2
+http-rl1: 32768
+http-rl2: 32769
])
as hv ovs-ofctl -O OpenFlow13 meter-stats br-int
@@ -1290,11 +1290,12 @@ test_parse_actions(struct ovs_cmdl_context *ctx OVS_UNUSED)
/* Initialize group ids. */
struct ovn_extend_table group_table;
- ovn_extend_table_init(&group_table);
+ ovn_extend_table_init(&group_table, 0, MAX_EXT_TABLE_ID);
/* Initialize meter ids for QoS. */
struct ovn_extend_table meter_table;
- ovn_extend_table_init(&meter_table);
+ ovn_extend_table_init(&meter_table, MAX_EXT_TABLE_ID / 2,
+ MAX_EXT_TABLE_ID / 2);
simap_init(&ports);
simap_put(&ports, "eth0", 5);
This is a preliminary patch to move metering management in IP engine. Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com> --- controller/ovn-controller.c | 5 +++-- lib/extend-table.c | 22 +++++++++++++++------- lib/extend-table.h | 4 +++- tests/ovn-controller.at | 6 +++--- tests/ovn.at | 10 +++++----- tests/test-ovn.c | 5 +++-- 6 files changed, 32 insertions(+), 20 deletions(-)