[ovs-dev] [PATCH] ofproto-dpif-xlate: support meter action in a group bucket

Simon Horman simon.horman at corigine.com
Wed Nov 10 16:21:34 UTC 2021


From: Louis Peens <louis.peens at corigine.com>

This patch is used to make a group bucket support a meter action.
When receiving action=meter:<id> we need to:
1) accept this - pre-patch effectively only set_actions are supported
2) use this id to lookup the meter that was added
3) populate the provider id into the ofpact_meter id.

Signed-off-by: Louis Peens <louis.peens at corigine.com>
Signed-off-by: Tianyu Yuan <tianyu.yuan at corigine.com>
Signed-off-by: Simon Horman <simon.horman at corigine.com>
---
 lib/ofp-actions.c            |  2 +-
 ofproto/ofproto-dpif-xlate.c | 15 +++++++++++++++
 ofproto/ofproto.c            | 21 +--------------------
 ofproto/ofproto.h            | 23 +++++++++++++++++++++++
 4 files changed, 40 insertions(+), 21 deletions(-)

diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
index ecf914eac..9b9968eb4 100644
--- a/lib/ofp-actions.c
+++ b/lib/ofp-actions.c
@@ -7879,6 +7879,7 @@ ofpact_copy(struct ofpbuf *out, const struct ofpact *a)
 /* The order in which actions in an action set get executed.  This is only for
  * the actions where only the last instance added is used. */
 #define ACTION_SET_ORDER                        \
+    SLOT(OFPACT_METER)                     \
     SLOT(OFPACT_STRIP_VLAN)                     \
     SLOT(OFPACT_POP_MPLS)                       \
     SLOT(OFPACT_DECAP)                          \
@@ -7970,7 +7971,6 @@ action_set_classify(const struct ofpact *a)
     case OFPACT_GOTO_TABLE:
     case OFPACT_LEARN:
     case OFPACT_CONJUNCTION:
-    case OFPACT_METER:
     case OFPACT_MULTIPATH:
     case OFPACT_NOTE:
     case OFPACT_OUTPUT_REG:
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 9d336bc6a..ff397b148 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -4497,6 +4497,21 @@ xlate_group_bucket(struct xlate_ctx *ctx, struct ofputil_bucket *bucket,
     bool old_was_mpls = ctx->was_mpls;
 
     ofpacts_execute_action_set(&action_list, &action_set);
+
+    const struct ofpact *cursor;
+    OFPACT_FOR_EACH (cursor, action_list.data, action_list.size) {
+        if (cursor->type == OFPACT_METER) {
+            struct ofpact_meter *meter = ofpact_get_METER(cursor);
+            struct ofproto *ofproto;
+            struct meter *ofmeter;
+            ofproto = &ctx->xbridge->ofproto->up;
+            ofmeter = ofproto_get_meter(ofproto, meter->meter_id);
+            if (ofmeter) {
+                meter->provider_meter_id = ofmeter->provider_meter_id.uint32;
+            }
+        }
+    }
+
     ctx->depth++;
     do_xlate_actions(action_list.data, action_list.size, ctx, is_last_action,
                      true);
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index bd6103b1c..1dad53ae8 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -6570,26 +6570,7 @@ handle_flow_monitor_cancel(struct ofconn *ofconn, const struct ofp_header *oh)
     return error;
 }
 
-/* Meters implementation.
- *
- * Meter table entry, indexed by the OpenFlow meter_id.
- * 'created' is used to compute the duration for meter stats.
- * 'list rules' is needed so that we can delete the dependent rules when the
- * meter table entry is deleted.
- * 'provider_meter_id' is for the provider's private use.
- */
-struct meter {
-    struct hmap_node node;      /* In ofproto->meters. */
-    long long int created;      /* Time created. */
-    struct ovs_list rules;      /* List of "struct rule_dpif"s. */
-    uint32_t id;                /* OpenFlow meter_id. */
-    ofproto_meter_id provider_meter_id;
-    uint16_t flags;             /* Meter flags. */
-    uint16_t n_bands;           /* Number of meter bands. */
-    struct ofputil_meter_band *bands;
-};
-
-static struct meter *
+struct meter *
 ofproto_get_meter(const struct ofproto *ofproto, uint32_t meter_id)
 {
     struct meter *meter;
diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h
index b0262da2d..9a5038b38 100644
--- a/ofproto/ofproto.h
+++ b/ofproto/ofproto.h
@@ -26,6 +26,7 @@
 #include "classifier.h"
 #include "flow.h"
 #include "openvswitch/meta-flow.h"
+#include "openvswitch/ofp-meter.h"
 #include "netflow.h"
 #include "rstp.h"
 #include "smap.h"
@@ -53,6 +54,28 @@ struct lldp_status;
 struct aa_settings;
 struct aa_mapping_settings;
 
+/* Meters implementation.
+ *
+ * Meter table entry, indexed by the OpenFlow meter_id.
+ * 'created' is used to compute the duration for meter stats.
+ * 'list rules' is needed so that we can delete the dependent rules when the
+ * meter table entry is deleted.
+ * 'provider_meter_id' is for the provider's private use.
+ */
+struct meter {
+    struct hmap_node node;      /* In ofproto->meters. */
+    long long int created;      /* Time created. */
+    struct ovs_list rules;      /* List of "struct rule_dpif"s. */
+    uint32_t id;                /* OpenFlow meter_id. */
+    ofproto_meter_id provider_meter_id;
+    uint16_t flags;             /* Meter flags. */
+    uint16_t n_bands;           /* Number of meter bands. */
+    struct ofputil_meter_band *bands;
+};
+
+struct meter *
+ofproto_get_meter(const struct ofproto *ofproto, uint32_t meter_id);
+
 /* Needed for the lock annotations. */
 extern struct ovs_mutex ofproto_mutex;
 
-- 
2.20.1



More information about the dev mailing list