From 9a9961d239bd5be010d52cd2bad3b9efbaf414ea Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 19 Jul 2016 09:07:13 -0700 Subject: [PATCH 1/1] ovn-northd: Ensure that flows are added to correct types of datapaths. A DP_TYPE_SWITCH_* flow should only be added to a logical switch datapath, and a DP_TYPE_ROUTER_* flow should only be added to a logical router datapath, but the code previously did not verify this and it caused a problem in practice. Suggested-by: Guru Shetty Suggested-at: http://openvswitch.org/pipermail/dev/2016-July/075557.html Signed-off-by: Ben Pfaff --- ovn/northd/ovn-northd.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c index 7ce509dab..905f6a796 100644 --- a/ovn/northd/ovn-northd.c +++ b/ovn/northd/ovn-northd.c @@ -175,6 +175,20 @@ ovn_stage_to_str(enum ovn_stage stage) default: return ""; } } + +/* Returns the type of the datapath to which a flow with the given 'stage' may + * be added. */ +static enum ovn_datapath_type +ovn_stage_to_datapath_type(enum ovn_stage stage) +{ + switch (stage) { +#define PIPELINE_STAGE(DP_TYPE, PIPELINE, STAGE, TABLE, NAME) \ + case S_##DP_TYPE##_##PIPELINE##_##STAGE: return DP_##DP_TYPE; + PIPELINE_STAGES +#undef PIPELINE_STAGE + default: OVS_NOT_REACHED(); + } +} static void usage(void) @@ -303,6 +317,13 @@ ovn_datapath_destroy(struct hmap *datapaths, struct ovn_datapath *od) } } +/* Returns 'od''s datapath type. */ +static enum ovn_datapath_type +ovn_datapath_get_type(const struct ovn_datapath *od) +{ + return od->nbs ? DP_SWITCH : DP_ROUTER; +} + static struct ovn_datapath * ovn_datapath_find(struct hmap *datapaths, const struct uuid *uuid) { @@ -985,6 +1006,8 @@ ovn_lflow_add(struct hmap *lflow_map, struct ovn_datapath *od, enum ovn_stage stage, uint16_t priority, const char *match, const char *actions) { + ovs_assert(ovn_stage_to_datapath_type(stage) == ovn_datapath_get_type(od)); + struct ovn_lflow *lflow = xmalloc(sizeof *lflow); ovn_lflow_init(lflow, od, stage, priority, xstrdup(match), xstrdup(actions)); -- 2.20.1