2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 06:15:47 +00:00

ofproto: Refactor handle_packet_out().

An upcoming commit will require the flow to be passed in as part of
OpenFlow action validation, but handle_packet_out() has until now been
structured to make this difficult.  This commit refactors it to better
suit this purpose.
This commit is contained in:
Ben Pfaff
2010-10-27 21:20:50 -07:00
parent 09246b99d1
commit ac51afaf4c
3 changed files with 36 additions and 58 deletions

View File

@@ -415,50 +415,6 @@ 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, int max_ports)
{
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 %u bytes of actions "
"but message has room for only %zu bytes",
actions_len, extra);
return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LEN);
}
if (actions_len % sizeof(union ofp_action)) {
VLOG_WARN_RL(&bad_ofmsg_rl, "packet-out claims %u bytes of actions, "
"which is not a multiple of %zu",
actions_len, sizeof(union ofp_action));
return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LEN);
}
n_actions = actions_len / sizeof(union ofp_action);
error = validate_actions((const union ofp_action *) opo->actions,
n_actions, max_ports);
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)