projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
datapath: Remove skb->len >= ETH_HLEN check from flow_extract().
[openvswitch]
/
ofproto
/
ofproto.c
diff --git
a/ofproto/ofproto.c
b/ofproto/ofproto.c
index a466c9caec46dbecc7fffc102e6500275ef28cba..91ff02388c3b09d72d8c0a45a7317437c01558f9 100644
(file)
--- a/
ofproto/ofproto.c
+++ b/
ofproto/ofproto.c
@@
-50,7
+50,6
@@
#include "rconn.h"
#include "shash.h"
#include "status.h"
#include "rconn.h"
#include "shash.h"
#include "status.h"
-#include "stp.h"
#include "stream-ssl.h"
#include "svec.h"
#include "tag.h"
#include "stream-ssl.h"
#include "svec.h"
#include "tag.h"
@@
-900,18
+899,6
@@
ofproto_set_sflow(struct ofproto *ofproto,
}
}
}
}
-int
-ofproto_set_stp(struct ofproto *ofproto OVS_UNUSED, bool enable_stp)
-{
- /* XXX */
- if (enable_stp) {
- VLOG_WARN("STP is not yet implemented");
- return EINVAL;
- } else {
- return 0;
- }
-}
-
uint64_t
ofproto_get_datapath_id(const struct ofproto *ofproto)
{
uint64_t
ofproto_get_datapath_id(const struct ofproto *ofproto)
{
@@
-2427,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);
@@
-2474,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;
@@
-2495,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);
}
}
}
}
@@
-2654,7
+2650,7
@@
do_xlate_actions(const union ofp_action *in, size_t n_in,
port = port_array_get(&ctx->ofproto->ports, ctx->flow.in_port);
if (port && port->opp.config & (OFPPC_NO_RECV | OFPPC_NO_RECV_STP) &&
port = port_array_get(&ctx->ofproto->ports, ctx->flow.in_port);
if (port && port->opp.config & (OFPPC_NO_RECV | OFPPC_NO_RECV_STP) &&
- port->opp.config & (eth_addr_equals(ctx->flow.dl_dst,
stp_eth_addr
)
+ port->opp.config & (eth_addr_equals(ctx->flow.dl_dst,
eth_addr_stp
)
? OFPPC_NO_RECV_STP : OFPPC_NO_RECV)) {
/* Drop this flow. */
return;
? OFPPC_NO_RECV_STP : OFPPC_NO_RECV)) {
/* Drop this flow. */
return;
@@
-2776,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);
}