]> git.proxmox.com Git - mirror_ovs.git/commitdiff
ofp-actions: Factor out decode_LEARN_{common,spec}().
authorDaniele Di Proietto <diproiettod@vmware.com>
Fri, 10 Mar 2017 23:44:39 +0000 (15:44 -0800)
committerBen Pfaff <blp@ovn.org>
Thu, 16 Mar 2017 20:42:26 +0000 (13:42 -0700)
No functional change, they will be used by next commit.

Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
lib/ofp-actions.c

index ef04d7b4be589c12f1578c2598cdd55415358270..8f0a0a27f70dc05db9650b5a03aebe41d184c9e0 100644 (file)
@@ -4379,23 +4379,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,
-                       uint64_t *tlv_bitmap, struct ofpbuf *ofpacts)
+decode_LEARN_common(const struct nx_action_learn *nal,
+                    struct ofpact_learn *learn)
 {
-    struct ofpact_learn *learn;
-    const void *p, *end;
-
     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);
@@ -4403,19 +4394,23 @@ decode_NXAST_RAW_LEARN(const struct nx_action_learn *nal,
     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; ) {
+    return 0;
+}
+
+static enum ofperr
+decode_LEARN_specs(const void *p, const void *end,
+                   const struct vl_mff_map *vl_mff_map, uint64_t *tlv_bitmap,
+                   struct ofpbuf *ofpacts)
+{
+    struct ofpact_learn *learn = ofpacts->header;
+
+    while (p != end) {
         struct ofpact_learn_spec *spec;
         uint16_t header = ntohs(get_be16(&p));
 
@@ -4490,6 +4485,33 @@ 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,
+                       uint64_t *tlv_bitmap, struct ofpbuf *ofpacts)
+{
+    struct ofpact_learn *learn;
+    enum ofperr error;
+
+    learn = ofpact_put_LEARN(ofpacts);
+
+    error = decode_LEARN_common(nal, learn);
+    if (error) {
+        return error;
+    }
+
+    if (learn->flags & ~(NX_LEARN_F_SEND_FLOW_REM |
+                         NX_LEARN_F_DELETE_LEARNED)) {
+        return OFPERR_OFPBAC_BAD_ARGUMENT;
+    }
+
+    return decode_LEARN_specs(nal + 1, (char *) nal + ntohs(nal->len),
+                              vl_mff_map, tlv_bitmap, ofpacts);
+}
+
 static void
 put_be16(struct ofpbuf *b, ovs_be16 x)
 {