projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Debian: make debian/copyright more friendly to the ftpmasters
[openvswitch]
/
ofproto
/
ofproto.c
diff --git
a/ofproto/ofproto.c
b/ofproto/ofproto.c
index b6c83f865747408d4e6ce429f08be1c6ff8954aa..91ff02388c3b09d72d8c0a45a7317437c01558f9 100644
(file)
--- a/
ofproto/ofproto.c
+++ b/
ofproto/ofproto.c
@@
-2414,6
+2414,10
@@
struct action_xlate_ctx {
uint16_t nf_output_iface; /* Output interface index for NetFlow. */
};
uint16_t nf_output_iface; /* Output interface index for NetFlow. */
};
+/* Maximum depth of flow table recursion (due to NXAST_RESUBMIT actions) in a
+ * flow translation. */
+#define MAX_RESUBMIT_RECURSION 8
+
static void do_xlate_actions(const union ofp_action *in, size_t n_in,
struct action_xlate_ctx *ctx);
static void do_xlate_actions(const union ofp_action *in, size_t n_in,
struct action_xlate_ctx *ctx);
@@
-2461,7
+2465,7
@@
lookup_valid_rule(struct ofproto *ofproto, const flow_t *flow)
static void
xlate_table_action(struct action_xlate_ctx *ctx, uint16_t in_port)
{
static void
xlate_table_action(struct action_xlate_ctx *ctx, uint16_t in_port)
{
- if (
!ctx->recurse
) {
+ if (
ctx->recurse < MAX_RESUBMIT_RECURSION
) {
uint16_t old_in_port;
struct rule *rule;
uint16_t old_in_port;
struct rule *rule;
@@
-2482,6
+2486,11
@@
xlate_table_action(struct action_xlate_ctx *ctx, uint16_t in_port)
do_xlate_actions(rule->actions, rule->n_actions, ctx);
ctx->recurse--;
}
do_xlate_actions(rule->actions, rule->n_actions, ctx);
ctx->recurse--;
}
+ } else {
+ struct vlog_rate_limit recurse_rl = VLOG_RATE_LIMIT_INIT(1, 1);
+
+ VLOG_ERR_RL(&recurse_rl, "NXAST_RESUBMIT recursed over %d times",
+ MAX_RESUBMIT_RECURSION);
}
}
}
}
@@
-2763,6
+2772,7
@@
xlate_actions(const union ofp_action *in, size_t n_in,
*nf_output_iface = ctx.nf_output_iface;
}
if (odp_actions_overflow(out)) {
*nf_output_iface = ctx.nf_output_iface;
}
if (odp_actions_overflow(out)) {
+ COVERAGE_INC(odp_overflow);
odp_actions_init(out);
return ofp_mkerr(OFPET_BAD_ACTION, OFPBAC_TOO_MANY);
}
odp_actions_init(out);
return ofp_mkerr(OFPET_BAD_ACTION, OFPBAC_TOO_MANY);
}