This is a preliminary patch to move metering management in IP engine.
Signed-off-by: Lorenzo Bianconi <[email protected]>
---
controller/lflow.c | 2 +-
lib/actions.c | 10 +++++-----
lib/extend-table.c | 6 ++++--
lib/extend-table.h | 2 +-
tests/ovn-controller.at | 6 +++---
tests/ovn.at | 10 +++++-----
6 files changed, 19 insertions(+), 17 deletions(-)
diff --git a/controller/lflow.c b/controller/lflow.c
index e169edef1..e87b1c66e 100644
--- a/controller/lflow.c
+++ b/controller/lflow.c
@@ -1094,7 +1094,7 @@ lflow_parse_ctrl_meter(const struct sbrec_logical_flow
*lflow,
if (lflow->controller_meter) {
*meter_id = ovn_extend_table_assign_id(meter_table,
lflow->controller_meter,
- lflow->header_.uuid);
+ lflow->header_.uuid, true);
if (*meter_id == EXT_TABLE_ID_INVALID) {
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
VLOG_WARN_RL(&rl, "Unable to assign id for meter: %s",
diff --git a/lib/actions.c b/lib/actions.c
index 5d3caaf2b..a49d07b04 100644
--- a/lib/actions.c
+++ b/lib/actions.c
@@ -1307,7 +1307,7 @@ encode_CT_LB(const struct ovnact_ct_lb *cl,
}
table_id = ovn_extend_table_assign_id(ep->group_table, ds_cstr(&ds),
- ep->lflow_uuid);
+ ep->lflow_uuid, false);
ds_destroy(&ds);
if (table_id == EXT_TABLE_ID_INVALID) {
return;
@@ -1447,7 +1447,7 @@ encode_SELECT(const struct ovnact_select *select,
}
table_id = ovn_extend_table_assign_id(ep->group_table, ds_cstr(&ds),
- ep->lflow_uuid);
+ ep->lflow_uuid, false);
ds_destroy(&ds);
if (table_id == EXT_TABLE_ID_INVALID) {
return;
@@ -3413,7 +3413,7 @@ encode_LOG(const struct ovnact_log *log,
if (log->meter) {
meter_id = ovn_extend_table_assign_id(ep->meter_table, log->meter,
- ep->lflow_uuid);
+ ep->lflow_uuid, true);
if (meter_id == EXT_TABLE_ID_INVALID) {
VLOG_WARN("Unable to assign id for log meter: %s", log->meter);
return;
@@ -3508,7 +3508,7 @@ encode_SET_METER(const struct ovnact_set_meter *cl,
}
table_id = ovn_extend_table_assign_id(ep->meter_table, name,
- ep->lflow_uuid);
+ ep->lflow_uuid, true);
free(name);
if (table_id == EXT_TABLE_ID_INVALID) {
return;
@@ -3849,7 +3849,7 @@ encode_FWD_GROUP(const struct ovnact_fwd_group *fwd_group,
uint32_t table_id = 0;
struct ofpact_group *og;
table_id = ovn_extend_table_assign_id(ep->group_table, ds_cstr(&ds),
- ep->lflow_uuid);
+ ep->lflow_uuid, false);
ds_destroy(&ds);
if (table_id == EXT_TABLE_ID_INVALID) {
return;
diff --git a/lib/extend-table.c b/lib/extend-table.c
index c708e24b9..219624cc3 100644
--- a/lib/extend-table.c
+++ b/lib/extend-table.c
@@ -286,7 +286,7 @@ ovn_extend_table_sync(struct ovn_extend_table *table)
* If it already exists, return the old ID. */
uint32_t
ovn_extend_table_assign_id(struct ovn_extend_table *table, const char *name,
- struct uuid lflow_uuid)
+ struct uuid lflow_uuid, bool is_meter)
{
uint32_t table_id = 0, hash;
struct ovn_extend_table_info *table_info;
@@ -315,8 +315,10 @@ ovn_extend_table_assign_id(struct ovn_extend_table *table,
const char *name,
bool new_table_id = false;
if (!table_id) {
+ size_t start = is_meter ? MAX_EXT_TABLE_ID / 2 : 1;
/* 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, start,
+ MAX_EXT_TABLE_ID + 1);
new_table_id = true;
}
diff --git a/lib/extend-table.h b/lib/extend-table.h
index 4d80cfd80..05d4271c0 100644
--- a/lib/extend-table.h
+++ b/lib/extend-table.h
@@ -92,7 +92,7 @@ void ovn_extend_table_sync(struct ovn_extend_table *);
uint32_t ovn_extend_table_assign_id(struct ovn_extend_table *,
const char *name,
- struct uuid lflow_uuid);
+ struct uuid lflow_uuid, bool is_meter);
/* Iterates 'DESIRED' through all of the 'ovn_extend_table_info's in
* 'TABLE'->desired that are not in 'TABLE'->existing. (The loop body
diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at
index 6e4c24f0f..3d1fbd26f 100644
--- a/tests/ovn-controller.at
+++ b/tests/ovn-controller.at
@@ -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=32767])
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=32767])
# 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=32768])
OVN_CLEANUP([hv1])
AT_CLEANUP
diff --git a/tests/ovn.at b/tests/ovn.at
index fa0e0a4a2..d2be9f946 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -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:32767
set_meter(100, 1000);
- encodes as meter:2
+ encodes as meter:32768
set_meter(100, 1000, );
Syntax error at `,' expecting `)'.
set_meter(4294967295, 4294967295);
- encodes as meter:3
+ encodes as meter:32769
# 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: 32767
+http-rl2: 32768
])
as hv ovs-ofctl -O OpenFlow13 meter-stats br-int
--
2.35.1
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev