Release Open vSwitch 1.1.0
[openvswitch] / lib / ofp-util.c
index e42abc50f9a630135a956042e3ba425069661fe5..c49b07988cca4903ce10b259eedd266e3ef1d5a1 100644 (file)
@@ -19,6 +19,7 @@
 #include <errno.h>
 #include <inttypes.h>
 #include <stdlib.h>
+#include "autopath.h"
 #include "byte-order.h"
 #include "classifier.h"
 #include "dynamic-string.h"
@@ -1863,49 +1864,17 @@ make_echo_reply(const struct ofp_header *rq)
     return out;
 }
 
-const struct ofp_flow_stats *
-flow_stats_first(struct flow_stats_iterator *iter,
-                 const struct ofp_stats_reply *osr)
+/* Converts the members of 'opp' from host to network byte order. */
+void
+hton_ofp_phy_port(struct ofp_phy_port *opp)
 {
-    iter->pos = osr->body;
-    iter->end = osr->body + (ntohs(osr->header.length)
-                             - offsetof(struct ofp_stats_reply, body));
-    return flow_stats_next(iter);
-}
-
-const struct ofp_flow_stats *
-flow_stats_next(struct flow_stats_iterator *iter)
-{
-    ptrdiff_t bytes_left = iter->end - iter->pos;
-    const struct ofp_flow_stats *fs;
-    size_t length;
-
-    if (bytes_left < sizeof *fs) {
-        if (bytes_left != 0) {
-            VLOG_WARN_RL(&bad_ofmsg_rl,
-                         "%td leftover bytes in flow stats reply", bytes_left);
-        }
-        return NULL;
-    }
-
-    fs = (const void *) iter->pos;
-    length = ntohs(fs->length);
-    if (length < sizeof *fs) {
-        VLOG_WARN_RL(&bad_ofmsg_rl, "flow stats length %zu is shorter than "
-                     "min %zu", length, sizeof *fs);
-        return NULL;
-    } else if (length > bytes_left) {
-        VLOG_WARN_RL(&bad_ofmsg_rl, "flow stats length %zu but only %td "
-                     "bytes left", length, bytes_left);
-        return NULL;
-    } else if ((length - sizeof *fs) % sizeof fs->actions[0]) {
-        VLOG_WARN_RL(&bad_ofmsg_rl, "flow stats length %zu has %zu bytes "
-                     "left over in final action", length,
-                     (length - sizeof *fs) % sizeof fs->actions[0]);
-        return NULL;
-    }
-    iter->pos += length;
-    return fs;
+    opp->port_no = htons(opp->port_no);
+    opp->config = htonl(opp->config);
+    opp->state = htonl(opp->state);
+    opp->curr = htonl(opp->curr);
+    opp->advertised = htonl(opp->advertised);
+    opp->supported = htonl(opp->supported);
+    opp->peer = htonl(opp->peer);
 }
 
 static int
@@ -2046,6 +2015,14 @@ check_nicira_action(const union ofp_action *a, unsigned int len,
         }
         return multipath_check((const struct nx_action_multipath *) a);
 
+    case NXAST_AUTOPATH:
+        error = check_nx_action_exact_len(
+            nah, len, sizeof(struct nx_action_autopath));
+        if (error) {
+            return error;
+        }
+        return autopath_check((const struct nx_action_autopath *) a);
+
     case NXAST_SNAT__OBSOLETE:
     default:
         VLOG_WARN_RL(&bad_ofmsg_rl,