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>
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);
* 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. */
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);
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);
}
}
}
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);
}
/* 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);
}
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
echo $expected | trim_zeros > expout
AT_CHECK([cat received1.packets], [0], [expout])
+# Delete the router and re-create it. Things should work as before.
+ovn-nbctl lr-del R2
+ovn-nbctl create Logical_Router name=R2 options:chassis="hv2"
+# Connect alice to R2
+ovn-nbctl lrp-add R2 alice 00:00:02:01:02:03 172.16.1.1/24
+# Connect R2 to join
+ovn-nbctl lrp-add R2 R2_join 00:00:04:01:02:04 20.0.0.2/24
+
+ovn-nbctl -- --id=@lrt create Logical_Router_Static_Route \
+ip_prefix=192.168.1.0/24 nexthop=20.0.0.1 -- add Logical_Router \
+R2 static_routes @lrt
+
+# Wait for ovn-controller to catch up.
+sleep 1
+
+# Send the packet again.
+as hv1 ovs-appctl netdev-dummy/receive hv1-vif1 $packet
+$PYTHON "$top_srcdir/utilities/ovs-pcap.in" hv2/vif1-tx.pcap | trim_zeros > received1.packets
+echo $expected | trim_zeros >> expout
+AT_CHECK([cat received1.packets], [0], [expout])
+
OVN_CLEANUP([hv1],[hv2])
AT_CLEANUP