projects
/
cascardo
/
ovs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ofproto: Infra for table versioning.
[cascardo/ovs.git]
/
ofproto
/
ofproto-dpif-xlate.c
diff --git
a/ofproto/ofproto-dpif-xlate.c
b/ofproto/ofproto-dpif-xlate.c
index
59cd088
..
337d6f8
100644
(file)
--- a/
ofproto/ofproto-dpif-xlate.c
+++ b/
ofproto/ofproto-dpif-xlate.c
@@
-159,6
+159,9
@@
struct xlate_ctx {
const struct xbridge *xbridge;
const struct xbridge *xbridge;
+ /* Flow tables version at the beginning of the translation. */
+ long long tables_version;
+
/* Flow at the last commit. */
struct flow base_flow;
/* Flow at the last commit. */
struct flow base_flow;
@@
-2774,6
+2777,7
@@
compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
const struct xport *peer = xport->peer;
struct flow old_flow = ctx->xin->flow;
bool old_was_mpls = ctx->was_mpls;
const struct xport *peer = xport->peer;
struct flow old_flow = ctx->xin->flow;
bool old_was_mpls = ctx->was_mpls;
+ long long old_version = ctx->tables_version;
enum slow_path_reason special;
struct ofpbuf old_stack = ctx->stack;
union mf_subvalue new_stack[1024 / sizeof(union mf_subvalue)];
enum slow_path_reason special;
struct ofpbuf old_stack = ctx->stack;
union mf_subvalue new_stack[1024 / sizeof(union mf_subvalue)];
@@
-2789,6
+2793,10
@@
compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
memset(flow->regs, 0, sizeof flow->regs);
flow->actset_output = OFPP_UNSET;
memset(flow->regs, 0, sizeof flow->regs);
flow->actset_output = OFPP_UNSET;
+ /* The bridge is now known so obtain its table version. */
+ ctx->tables_version
+ = ofproto_dpif_get_tables_version(ctx->xbridge->ofproto);
+
special = process_special(ctx, &ctx->xin->flow, peer,
ctx->xin->packet);
if (special) {
special = process_special(ctx, &ctx->xin->flow, peer,
ctx->xin->packet);
if (special) {
@@
-2835,6
+2843,9
@@
compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
ofpbuf_uninit(&ctx->stack);
ctx->stack = old_stack;
ofpbuf_uninit(&ctx->stack);
ctx->stack = old_stack;
+ /* Restore calling bridge's lookup version. */
+ ctx->tables_version = old_version;
+
/* The peer bridge popping MPLS should have no effect on the original
* bridge. */
ctx->was_mpls = old_was_mpls;
/* The peer bridge popping MPLS should have no effect on the original
* bridge. */
ctx->was_mpls = old_was_mpls;
@@
-3056,6
+3067,7
@@
xlate_table_action(struct xlate_ctx *ctx, ofp_port_t in_port, uint8_t table_id,
wc = (ctx->xin->skip_wildcards) ? NULL : &ctx->xout->wc;
rule = rule_dpif_lookup_from_table(ctx->xbridge->ofproto,
wc = (ctx->xin->skip_wildcards) ? NULL : &ctx->xout->wc;
rule = rule_dpif_lookup_from_table(ctx->xbridge->ofproto,
+ ctx->tables_version,
&ctx->xin->flow, wc,
ctx->xin->xcache != NULL,
ctx->xin->resubmit_stats,
&ctx->xin->flow, wc,
ctx->xin->xcache != NULL,
ctx->xin->resubmit_stats,
@@
-4826,9
+4838,12
@@
xlate_actions(struct xlate_in *xin, struct xlate_out *xout)
flow->recirc_id);
return;
}
flow->recirc_id);
return;
}
+ /* The bridge is now known so obtain its table version. */
+ ctx.tables_version = ofproto_dpif_get_tables_version(ctx.xbridge->ofproto);
if (!xin->ofpacts && !ctx.rule) {
if (!xin->ofpacts && !ctx.rule) {
- rule = rule_dpif_lookup_from_table(ctx.xbridge->ofproto, flow, wc,
+ rule = rule_dpif_lookup_from_table(ctx.xbridge->ofproto,
+ ctx.tables_version, flow, wc,
ctx.xin->xcache != NULL,
ctx.xin->resubmit_stats,
&ctx.table_id,
ctx.xin->xcache != NULL,
ctx.xin->resubmit_stats,
&ctx.table_id,