From 69d60aea7969b0ba4b6c55c01c376a2047259fc3 Mon Sep 17 00:00:00 2001 From: Andy Zhou Date: Fri, 9 May 2014 19:13:47 -0700 Subject: [PATCH] ofproto-dpif: Install internal rule should not change the match content. Without this patch, the match passed into to ofproto_dpif_add_internal_flow() are modified. The mask of dl_type will always be converted from wildcarded match into exact match due to calling rule_dpif_lookup_in_table(). The fix makes sure ofproto_dpif_add_internal_flow() does not change the original match, and makes the match passed as const in the ofproto_dpif_add_internal_flow() API. This bug prevents bond module from properly tracking the post recirculation rules installed in the internal table. The existing rule is always deleted followed by reinstalling of the same rule. The observable behavior of the bug is that bond module losses track of the slave's stats, after the slave is rebalanced. Although traffic flows through the slave just fine. Bug #1229225 Signed-off-by: Andy Zhou Acked-by: Ben Pfaff --- ofproto/ofproto-dpif.c | 6 +++--- ofproto/ofproto-dpif.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 926f3d6a3..fdb4cd624 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -4801,7 +4801,7 @@ ofproto_dpif_free_recirc_id(struct ofproto_dpif *ofproto, uint32_t recirc_id) int ofproto_dpif_add_internal_flow(struct ofproto_dpif *ofproto, - struct match *match, int priority, + const struct match *match, int priority, const struct ofpbuf *ofpacts, struct rule **rulep) { @@ -4833,8 +4833,8 @@ ofproto_dpif_add_internal_flow(struct ofproto_dpif *ofproto, return error; } - rule = rule_dpif_lookup_in_table(ofproto, TBL_INTERNAL, &match->flow, - &match->wc, false); + rule = rule_dpif_lookup_in_table(ofproto, TBL_INTERNAL, &fm.match.flow, + &fm.match.wc, false); if (rule) { *rulep = &rule->up; } else { diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h index 679a41e13..e49616e14 100644 --- a/ofproto/ofproto-dpif.h +++ b/ofproto/ofproto-dpif.h @@ -218,7 +218,7 @@ struct ofport_dpif *odp_port_to_ofport(const struct dpif_backer *, odp_port_t); uint32_t ofproto_dpif_alloc_recirc_id(struct ofproto_dpif *ofproto); void ofproto_dpif_free_recirc_id(struct ofproto_dpif *ofproto, uint32_t recirc_id); int ofproto_dpif_add_internal_flow(struct ofproto_dpif *, - struct match *, int priority, + const struct match *, int priority, const struct ofpbuf *ofpacts, struct rule **rulep); int ofproto_dpif_delete_internal_flow(struct ofproto_dpif *, struct match *, -- 2.20.1