[ovs-dev] [PATCH 1/7] ofp-actions: Factor out decode_LEARN_common().

Daniele Di Proietto diproiettod at vmware.com
Sat Feb 25 02:57:55 UTC 2017


No functional change, it will be used by next commit.

Signed-off-by: Daniele Di Proietto <diproiettod at vmware.com>
---
 lib/ofp-actions.c | 77 +++++++++++++++++++++++++++++++------------------------
 1 file changed, 43 insertions(+), 34 deletions(-)

diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
index ce80f57e8..78f8c4366 100644
--- a/lib/ofp-actions.c
+++ b/lib/ofp-actions.c
@@ -4313,43 +4313,14 @@ learn_min_len(uint16_t header)
     return min_len;
 }
 
-/* Converts 'nal' into a "struct ofpact_learn" and appends that struct to
- * 'ofpacts'.  Returns 0 if successful, otherwise an OFPERR_*. */
 static enum ofperr
-decode_NXAST_RAW_LEARN(const struct nx_action_learn *nal,
-                       enum ofp_version ofp_version OVS_UNUSED,
-                       const struct vl_mff_map *vl_mff_map,
-                       struct ofpbuf *ofpacts)
+decode_LEARN_common(const void *p, const void *end,
+                    const struct vl_mff_map *vl_mff_map,
+                    struct ofpbuf *ofpacts)
 {
-    struct ofpact_learn *learn;
-    const void *p, *end;
+    struct ofpact_learn *learn = ofpacts->header;
 
-    if (nal->pad) {
-        return OFPERR_OFPBAC_BAD_ARGUMENT;
-    }
-
-    learn = ofpact_put_LEARN(ofpacts);
-
-    learn->idle_timeout = ntohs(nal->idle_timeout);
-    learn->hard_timeout = ntohs(nal->hard_timeout);
-    learn->priority = ntohs(nal->priority);
-    learn->cookie = nal->cookie;
-    learn->table_id = nal->table_id;
-    learn->fin_idle_timeout = ntohs(nal->fin_idle_timeout);
-    learn->fin_hard_timeout = ntohs(nal->fin_hard_timeout);
-
-    learn->flags = ntohs(nal->flags);
-    if (learn->flags & ~(NX_LEARN_F_SEND_FLOW_REM |
-                         NX_LEARN_F_DELETE_LEARNED)) {
-        return OFPERR_OFPBAC_BAD_ARGUMENT;
-    }
-
-    if (learn->table_id == 0xff) {
-        return OFPERR_OFPBAC_BAD_ARGUMENT;
-    }
-
-    end = (char *) nal + ntohs(nal->len);
-    for (p = nal + 1; p != end; ) {
+    while (p != end) {
         struct ofpact_learn_spec *spec;
         uint16_t header = ntohs(get_be16(&p));
 
@@ -4422,6 +4393,44 @@ decode_NXAST_RAW_LEARN(const struct nx_action_learn *nal,
     return 0;
 }
 
+/* Converts 'nal' into a "struct ofpact_learn" and appends that struct to
+ * 'ofpacts'.  Returns 0 if successful, otherwise an OFPERR_*. */
+static enum ofperr
+decode_NXAST_RAW_LEARN(const struct nx_action_learn *nal,
+                       enum ofp_version ofp_version OVS_UNUSED,
+                       const struct vl_mff_map *vl_mff_map,
+                       struct ofpbuf *ofpacts)
+{
+    struct ofpact_learn *learn;
+
+    if (nal->pad) {
+        return OFPERR_OFPBAC_BAD_ARGUMENT;
+    }
+
+    learn = ofpact_put_LEARN(ofpacts);
+
+    learn->idle_timeout = ntohs(nal->idle_timeout);
+    learn->hard_timeout = ntohs(nal->hard_timeout);
+    learn->priority = ntohs(nal->priority);
+    learn->cookie = nal->cookie;
+    learn->table_id = nal->table_id;
+    learn->fin_idle_timeout = ntohs(nal->fin_idle_timeout);
+    learn->fin_hard_timeout = ntohs(nal->fin_hard_timeout);
+
+    learn->flags = ntohs(nal->flags);
+    if (learn->flags & ~(NX_LEARN_F_SEND_FLOW_REM |
+                         NX_LEARN_F_DELETE_LEARNED)) {
+        return OFPERR_OFPBAC_BAD_ARGUMENT;
+    }
+
+    if (learn->table_id == 0xff) {
+        return OFPERR_OFPBAC_BAD_ARGUMENT;
+    }
+
+    return decode_LEARN_common(nal + 1, (char *) nal + ntohs(nal->len),
+                               vl_mff_map, ofpacts);
+}
+
 static void
 put_be16(struct ofpbuf *b, ovs_be16 x)
 {
-- 
2.11.0



More information about the dev mailing list