Signed-off-by: Alexandru Copot <[email protected]>
Cc: Daniel Baluta <[email protected]>
---
 lib/ofp-util.c | 27 +++++++++++++++++++++++++++
 lib/ofp-util.h |  2 ++
 2 files changed, 29 insertions(+)

diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 9bc30a7..cdc9f16 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -3923,6 +3923,33 @@ ofputil_encode_role_status(const struct 
ofputil_role_status *status,
 
     return buf;
 }
+
+enum ofperr
+ofputil_decode_role_status(const struct ofp_header *oh,
+                           struct ofputil_role_status *rs)
+{
+    struct ofpbuf b;
+    enum ofpraw raw;
+
+    ofpbuf_use_const(&b, oh, ntohs(oh->length));
+    raw = ofpraw_pull_assert(&b);
+    if (raw != OFPRAW_OFPT14_ROLE_STATUS)
+        NOT_REACHED();
+
+    const struct ofp14_role_status *r = b.l3; 
+    if (r->role != htonl(OFPCR12_ROLE_NOCHANGE) &&
+        r->role != htonl(OFPCR12_ROLE_EQUAL) &&
+        r->role != htonl(OFPCR12_ROLE_MASTER) &&
+        r->role != htonl(OFPCR12_ROLE_SLAVE)) {
+            return OFPERR_OFPRRFC_BAD_ROLE;
+    }
+
+    rs->role = ntohl(r->role);
+    rs->generation_id = ntohll(r->generation_id);
+
+    return 0;
+}
+
 /* Table stats. */
 
 static void
diff --git a/lib/ofp-util.h b/lib/ofp-util.h
index c3a35a7..3abfb9d 100644
--- a/lib/ofp-util.h
+++ b/lib/ofp-util.h
@@ -693,6 +693,8 @@ struct ofpbuf *ofputil_encode_role_status(
                                 const struct ofputil_role_status *status,
                                 enum ofputil_protocol protocol);
 
+enum ofperr ofputil_decode_role_status(const struct ofp_header *oh,
+                                       struct ofputil_role_status *rs);
 /* Abstract table stats.
  *
  * For now we use ofp12_table_stats as a superset of the other protocol
-- 
1.8.4

_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to