vconn: New function check_ofp_packet_out().
authorBen Pfaff <blp@nicira.com>
Mon, 2 Mar 2009 19:09:13 +0000 (11:09 -0800)
committerBen Pfaff <blp@nicira.com>
Mon, 2 Mar 2009 21:42:06 +0000 (13:42 -0800)
lib/vconn.c
lib/vconn.h

index 1dec3073e162f4f03e05ce9673ce12bd9d8a1b75..c7342d249596e6025c46eabcb9daa551b91ac94a 100644 (file)
@@ -1088,6 +1088,50 @@ check_ofp_message_array(const struct ofp_header *msg, uint8_t type,
     return 0;
 }
 
+int
+check_ofp_packet_out(const struct ofp_header *oh, struct ofpbuf *data,
+                     int *n_actionsp)
+{
+    const struct ofp_packet_out *opo;
+    unsigned int actions_len, n_actions;
+    size_t extra;
+    int error;
+
+    *n_actionsp = 0;
+    error = check_ofp_message_array(oh, OFPT_PACKET_OUT,
+                                    sizeof *opo, 1, &extra);
+    if (error) {
+        return error;
+    }
+    opo = (const struct ofp_packet_out *) oh;
+
+    actions_len = ntohs(opo->actions_len);
+    if (actions_len > extra) {
+        VLOG_WARN_RL(&bad_ofmsg_rl, "packet-out claims %zu bytes of actions "
+                     "but message has room for only %zu bytes",
+                     actions_len, extra);
+        return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LENGTH);
+    }
+    if (actions_len % sizeof(union ofp_action)) {
+        VLOG_WARN_RL(&bad_ofmsg_rl, "packet-out claims %zu bytes of actions, "
+                     "which is not a multiple of %zu",
+                     actions_len, sizeof(union ofp_action));
+        return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LENGTH);
+    }
+
+    n_actions = actions_len / sizeof(union ofp_action);
+    error = validate_actions((const union ofp_action *) opo->actions,
+                             n_actions);
+    if (error) {
+        return error;
+    }
+
+    data->data = (void *) &opo->actions[n_actions];
+    data->size = extra - actions_len;
+    *n_actionsp = n_actions;
+    return 0;
+}
+
 const struct ofp_flow_stats *
 flow_stats_first(struct flow_stats_iterator *iter,
                  const struct ofp_stats_reply *osr)
index 7916f86dfd711a150eafc34f7a5cdcc339caa1d0..d521a8be320b2bc2a488ea683956709fbaa52bfc 100644 (file)
@@ -110,6 +110,8 @@ int check_ofp_message(const struct ofp_header *, uint8_t type, size_t size);
 int check_ofp_message_array(const struct ofp_header *, uint8_t type,
                             size_t size, size_t array_elt_size,
                             size_t *n_array_elts);
+int check_ofp_packet_out(const struct ofp_header *, struct ofpbuf *data,
+                         int *n_actions);
 
 struct flow_stats_iterator {
     const uint8_t *pos, *end;