mirror of
https://github.com/openvswitch/ovs
synced 2025-09-04 16:25:17 +00:00
netdev-offload-tc: Fix parse_tc_flower_to_actions() reporting errors.
parse_tc_flower_to_actions() was not reporting errors, which would
cause parse_tc_flower_to_match() to ignore them.
Fixes: dd03672f7b
("netdev-offload-tc: Move flower_to_match action handling to isolated function.")
Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
committed by
Ilya Maximets
parent
b3935cf90e
commit
d53ee36aa6
@@ -871,7 +871,7 @@ parse_tc_flower_to_actions__(struct tc_flower *flower, struct ofpbuf *buf,
|
|||||||
outport =
|
outport =
|
||||||
netdev_ifindex_to_odp_port(action->out.ifindex_out);
|
netdev_ifindex_to_odp_port(action->out.ifindex_out);
|
||||||
if (!outport) {
|
if (!outport) {
|
||||||
return ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nl_msg_put_u32(buf, OVS_ACTION_ATTR_OUTPUT, odp_to_u32(outport));
|
nl_msg_put_u32(buf, OVS_ACTION_ATTR_OUTPUT, odp_to_u32(outport));
|
||||||
@@ -964,7 +964,7 @@ parse_tc_flower_to_actions__(struct tc_flower *flower, struct ofpbuf *buf,
|
|||||||
uint32_t meter_id;
|
uint32_t meter_id;
|
||||||
|
|
||||||
if (police_idx_lookup(action->police.index, &meter_id)) {
|
if (police_idx_lookup(action->police.index, &meter_id)) {
|
||||||
return ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
nl_msg_put_u32(buf, OVS_ACTION_ATTR_METER, meter_id);
|
nl_msg_put_u32(buf, OVS_ACTION_ATTR_METER, meter_id);
|
||||||
}
|
}
|
||||||
@@ -983,6 +983,9 @@ parse_tc_flower_to_actions__(struct tc_flower *flower, struct ofpbuf *buf,
|
|||||||
buf, OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER);
|
buf, OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER);
|
||||||
i = parse_tc_flower_to_actions__(flower, buf, i + 1,
|
i = parse_tc_flower_to_actions__(flower, buf, i + 1,
|
||||||
action->police.result_jump);
|
action->police.result_jump);
|
||||||
|
if (i < 0) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
nl_msg_end_nested(buf, act_offset);
|
nl_msg_end_nested(buf, act_offset);
|
||||||
|
|
||||||
act_offset = nl_msg_start_nested(
|
act_offset = nl_msg_start_nested(
|
||||||
@@ -994,6 +997,9 @@ parse_tc_flower_to_actions__(struct tc_flower *flower, struct ofpbuf *buf,
|
|||||||
}
|
}
|
||||||
if (jump != 0) {
|
if (jump != 0) {
|
||||||
i = parse_tc_flower_to_actions__(flower, buf, i, jump);
|
i = parse_tc_flower_to_actions__(flower, buf, i, jump);
|
||||||
|
if (i < 0) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
nl_msg_end_nested(buf, act_offset);
|
nl_msg_end_nested(buf, act_offset);
|
||||||
|
|
||||||
@@ -1013,11 +1019,11 @@ parse_tc_flower_to_actions__(struct tc_flower *flower, struct ofpbuf *buf,
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
parse_tc_flower_to_actions(struct tc_flower *flower,
|
parse_tc_flower_to_actions(struct tc_flower *flower,
|
||||||
struct ofpbuf *buf)
|
struct ofpbuf *buf)
|
||||||
{
|
{
|
||||||
parse_tc_flower_to_actions__(flower, buf, 0, 0);
|
return parse_tc_flower_to_actions__(flower, buf, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -1030,9 +1036,10 @@ parse_tc_flower_to_match(const struct netdev *netdev,
|
|||||||
struct ofpbuf *buf,
|
struct ofpbuf *buf,
|
||||||
bool terse)
|
bool terse)
|
||||||
{
|
{
|
||||||
size_t act_off;
|
|
||||||
struct tc_flower_key *key = &flower->key;
|
struct tc_flower_key *key = &flower->key;
|
||||||
struct tc_flower_key *mask = &flower->mask;
|
struct tc_flower_key *mask = &flower->mask;
|
||||||
|
size_t act_off;
|
||||||
|
int err;
|
||||||
|
|
||||||
if (terse) {
|
if (terse) {
|
||||||
return parse_tc_flower_terse_to_match(flower, match, stats, attrs);
|
return parse_tc_flower_terse_to_match(flower, match, stats, attrs);
|
||||||
@@ -1229,7 +1236,10 @@ parse_tc_flower_to_match(const struct netdev *netdev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
act_off = nl_msg_start_nested(buf, OVS_FLOW_ATTR_ACTIONS);
|
act_off = nl_msg_start_nested(buf, OVS_FLOW_ATTR_ACTIONS);
|
||||||
parse_tc_flower_to_actions(flower, buf);
|
err = parse_tc_flower_to_actions(flower, buf);
|
||||||
|
if (err < 0) {
|
||||||
|
return -err;
|
||||||
|
}
|
||||||
nl_msg_end_nested(buf, act_off);
|
nl_msg_end_nested(buf, act_off);
|
||||||
|
|
||||||
*actions = ofpbuf_at_assert(buf, act_off, sizeof(struct nlattr));
|
*actions = ofpbuf_at_assert(buf, act_off, sizeof(struct nlattr));
|
||||||
@@ -2490,15 +2500,23 @@ netdev_tc_flow_get(struct netdev *netdev,
|
|||||||
|
|
||||||
err = tc_get_flower(&id, &flower);
|
err = tc_get_flower(&id, &flower);
|
||||||
if (err) {
|
if (err) {
|
||||||
VLOG_ERR_RL(&error_rl, "flow get failed (dev %s prio %d handle %d): %s",
|
VLOG_ERR_RL(&error_rl,
|
||||||
|
"flow get failed (dev %s prio %d handle %d): %s",
|
||||||
netdev_get_name(netdev), id.prio, id.handle,
|
netdev_get_name(netdev), id.prio, id.handle,
|
||||||
ovs_strerror(err));
|
ovs_strerror(err));
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
in_port = netdev_ifindex_to_odp_port(id.ifindex);
|
in_port = netdev_ifindex_to_odp_port(id.ifindex);
|
||||||
parse_tc_flower_to_match(netdev, &flower, match, actions,
|
err = parse_tc_flower_to_match(netdev, &flower, match, actions,
|
||||||
stats, attrs, buf, false);
|
stats, attrs, buf, false);
|
||||||
|
if (err) {
|
||||||
|
VLOG_ERR_RL(&error_rl,
|
||||||
|
"flow get parse failed (dev %s prio %d handle %d): %s",
|
||||||
|
netdev_get_name(netdev), id.prio, id.handle,
|
||||||
|
ovs_strerror(err));
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
if (stats) {
|
if (stats) {
|
||||||
struct dpif_flow_stats adjust_stats;
|
struct dpif_flow_stats adjust_stats;
|
||||||
|
Reference in New Issue
Block a user