From 0a4227a47721e47e868e87c4cd6a431ee3d98fce Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 2 Mar 2009 11:09:13 -0800 Subject: [PATCH] vconn: New function check_ofp_packet_out(). --- lib/vconn.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ lib/vconn.h | 2 ++ 2 files changed, 46 insertions(+) diff --git a/lib/vconn.c b/lib/vconn.c index 1dec3073..c7342d24 100644 --- a/lib/vconn.c +++ b/lib/vconn.c @@ -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) diff --git a/lib/vconn.h b/lib/vconn.h index 7916f86d..d521a8be 100644 --- a/lib/vconn.h +++ b/lib/vconn.h @@ -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; -- 2.30.2