Table features replies can be packed back-to-back within a single
multipart reply.  The code here didn't properly parse properties when this
occurred.  This fixes the problem.

Signed-off-by: Ben Pfaff <b...@nicira.com>
---
 lib/ofp-util.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 7217d46..1e641bd 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -4607,6 +4607,7 @@ ofputil_decode_table_features(struct ofpbuf *msg,
 {
     const struct ofp_header *oh;
     struct ofp13_table_features *otf;
+    struct ofpbuf properties;
     unsigned int len;
 
     memset(tf, 0, sizeof *tf);
@@ -4629,7 +4630,8 @@ ofputil_decode_table_features(struct ofpbuf *msg,
     if (len < sizeof *otf || len % 8 || len > ofpbuf_size(msg)) {
         return OFPERR_OFPBPC_BAD_LEN;
     }
-    ofpbuf_pull(msg, sizeof *otf);
+    ofpbuf_use_const(&properties, ofpbuf_pull(msg, len), len);
+    ofpbuf_pull(&properties, sizeof *otf);
 
     tf->table_id = otf->table_id;
     if (tf->table_id == OFPTT_ALL) {
@@ -4642,12 +4644,12 @@ ofputil_decode_table_features(struct ofpbuf *msg,
     tf->miss_config = ofputil_table_miss_from_config(otf->config, oh->version);
     tf->max_entries = ntohl(otf->max_entries);
 
-    while (ofpbuf_size(msg) > 0) {
+    while (ofpbuf_size(&properties) > 0) {
         struct ofpbuf payload;
         enum ofperr error;
         uint16_t type;
 
-        error = pull_table_feature_property(msg, &payload, &type);
+        error = pull_table_feature_property(&properties, &payload, &type);
         if (error) {
             return error;
         }
-- 
1.9.1

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to