summaryrefslogtreecommitdiff
path: root/ovn
diff options
context:
space:
mode:
authorGurucharan Shetty <guru@ovn.org>2016-07-08 00:15:49 -0700
committerGurucharan Shetty <guru@ovn.org>2016-07-09 09:36:15 -0700
commit34114cf8165b6134a556d07ed22d03e9eac2fe4f (patch)
treed64b1eb5507a64bcc41e43522ddc77bbfd1fbf91 /ovn
parent50c61d46c49756ef7474951ee586fd7ae252484c (diff)
downloadopenvswitch-34114cf8165b6134a556d07ed22d03e9eac2fe4f.tar.gz
ovn-controller: Change strategy for gateway conntrack zone allocation.
Commit 263064aeaa31e7 (Convert binding_run to incremental processing.) changed the way patched_datapaths were handled. Previously we would destroy the datastructure in every run and re-create it fresh. The new way causes problems with the way conntrack zones are allocated as now we can have stale port_binding entries causing segmentation faults. With this commit, we simply don't depend on port_binding records in conntrack zone allocation and instead store the UUID as a string in the patch_datapath datastructure. (The test enhanced with this commit would fail without the changes in the commit. i.e. ovn-controller would crash. ) Signed-off-by: Gurucharan Shetty <guru@ovn.org> Acked-by: Ryan Moats <rmoats@us.ibm.com>
Diffstat (limited to 'ovn')
-rw-r--r--ovn/controller/ovn-controller.c4
-rw-r--r--ovn/controller/ovn-controller.h2
-rw-r--r--ovn/controller/patch.c4
-rw-r--r--ovn/controller/physical.c8
-rw-r--r--ovn/lib/ovn-util.c8
-rw-r--r--ovn/lib/ovn-util.h3
6 files changed, 16 insertions, 13 deletions
diff --git a/ovn/controller/ovn-controller.c b/ovn/controller/ovn-controller.c
index 8471f64e3..28ee13e95 100644
--- a/ovn/controller/ovn-controller.c
+++ b/ovn/controller/ovn-controller.c
@@ -251,8 +251,8 @@ update_ct_zones(struct sset *lports, struct hmap *patched_datapaths,
continue;
}
- char *dnat = alloc_nat_zone_key(pd->port_binding, "dnat");
- char *snat = alloc_nat_zone_key(pd->port_binding, "snat");
+ char *dnat = alloc_nat_zone_key(pd->key, "dnat");
+ char *snat = alloc_nat_zone_key(pd->key, "snat");
sset_add(&all_users, dnat);
sset_add(&all_users, snat);
free(dnat);
diff --git a/ovn/controller/ovn-controller.h b/ovn/controller/ovn-controller.h
index f3edc43f1..470b1f569 100644
--- a/ovn/controller/ovn-controller.h
+++ b/ovn/controller/ovn-controller.h
@@ -51,7 +51,7 @@ struct local_datapath *get_local_datapath(const struct hmap *,
* with at least one logical patch port binding. */
struct patched_datapath {
struct hmap_node hmap_node;
- const struct sbrec_port_binding *port_binding;
+ char *key; /* Holds the uuid of the corresponding datapath. */
bool local; /* 'True' if the datapath is for gateway router. */
bool stale; /* 'True' if the datapath is not referenced by any patch
* port. */
diff --git a/ovn/controller/patch.c b/ovn/controller/patch.c
index 1906cf30e..52d9e8df3 100644
--- a/ovn/controller/patch.c
+++ b/ovn/controller/patch.c
@@ -263,7 +263,8 @@ add_patched_datapath(struct hmap *patched_datapaths,
pd = xzalloc(sizeof *pd);
pd->local = local;
- pd->port_binding = binding_rec;
+ pd->key = xasprintf(UUID_FMT,
+ UUID_ARGS(&binding_rec->datapath->header_.uuid));
/* stale is set to false. */
hmap_insert(patched_datapaths, &pd->hmap_node,
binding_rec->datapath->tunnel_key);
@@ -291,6 +292,7 @@ add_logical_patch_ports_postprocess(struct hmap *patched_datapaths)
patched_datapaths) {
if (pd_cur_node->stale == true) {
hmap_remove(patched_datapaths, &pd_cur_node->hmap_node);
+ free(pd_cur_node->key);
free(pd_cur_node);
}
}
diff --git a/ovn/controller/physical.c b/ovn/controller/physical.c
index f7389ea26..d1b40c2b8 100644
--- a/ovn/controller/physical.c
+++ b/ovn/controller/physical.c
@@ -297,8 +297,12 @@ consider_port_binding(struct hmap *flow_table,
}
int zone_id_dnat, zone_id_snat;
- char *dnat = alloc_nat_zone_key(binding, "dnat");
- char *snat = alloc_nat_zone_key(binding, "snat");
+ char *key = xasprintf(UUID_FMT,
+ UUID_ARGS(&binding->datapath->header_.uuid));
+ char *dnat = alloc_nat_zone_key(key, "dnat");
+ char *snat = alloc_nat_zone_key(key, "snat");
+ free(key);
+
zone_id_dnat = simap_get(ct_zones, dnat);
if (zone_id_dnat) {
put_load(zone_id_dnat, MFF_LOG_DNAT_ZONE, 0, 32, ofpacts_p);
diff --git a/ovn/lib/ovn-util.c b/ovn/lib/ovn-util.c
index 611308744..6e940830e 100644
--- a/ovn/lib/ovn-util.c
+++ b/ovn/lib/ovn-util.c
@@ -105,13 +105,11 @@ extract_lsp_addresses(char *address, struct lport_addresses *laddrs,
}
/* Allocates a key for NAT conntrack zone allocation for a provided
- * 'port_binding' record and a 'type'.
+ * 'key' record and a 'type'.
*
* It is the caller's responsibility to free the allocated memory. */
char *
-alloc_nat_zone_key(const struct sbrec_port_binding *port_binding,
- const char *type)
+alloc_nat_zone_key(const char *key, const char *type)
{
- return xasprintf(UUID_FMT"_%s",
- UUID_ARGS(&port_binding->datapath->header_.uuid), type);
+ return xasprintf("%s_%s", key, type);
}
diff --git a/ovn/lib/ovn-util.h b/ovn/lib/ovn-util.h
index d23f4aff2..98b1426b6 100644
--- a/ovn/lib/ovn-util.h
+++ b/ovn/lib/ovn-util.h
@@ -43,6 +43,5 @@ extract_lsp_addresses(char *address, struct lport_addresses *laddrs,
bool store_ipv6);
char *
-alloc_nat_zone_key(const struct sbrec_port_binding *port_binding,
- const char *type);
+alloc_nat_zone_key(const char *key, const char *type);
#endif