On Thu, Feb 23, 2017 at 11:06 PM, Mickey Spiegel <mickeys....@gmail.com> wrote: > > On Thu, Feb 23, 2017 at 6:04 AM, <nusid...@redhat.com> wrote: > >> From: Numan Siddique <nusid...@redhat.com> >> >> Having zone id per datapath is more than sufficient, because the >> CT tuple information will be unique anyway with in the logical >> datapath. >> > > This proposal conflicts with another proposal that is currently in flight ( > https://mail.openvswitch.org/pipermail/ovs-dev/2017-February/328759.html), > where we were thinking of using ct_label in SFC for load balancing between > multiple port pairs in one port pair group. In that case, for each SFC hop > we would need to pick up a different value from ct_label, so for SFC ports > we would need a different ct_zone for each logical port in one logical > switch. > > Another issue is that this breaks the current use of ct_label.blocked in > ACLs. If the ingress ACL allows a connection but the egress ACL blocks the > connection, then ingress will be clearing the bit while egress will be > setting the bit. Perhaps this could be resolved by replacing > ct_label.blocked with ct_label.blocked_ingress and ct_label.blocked_egress? > There might be other solutions, depending on the future patch that sends to > CT only once for both ingress and egress. > > Mickey > > Thanks Russel and Mickey for comments and pointing out the conflicts. I will abandon the patch for now and revisit later if it is required to optimize for the same host scenario. Or do you think it is good to optimize ? Thanks Numan >> In our testing we have observed that, the packet between two ports of >> a datapath within the same chassis is sent to the CT twice (both in >> ingress and egress pipeline) with (2 different zone ids) resulting in >> some performance hit. With this patch, the packet will use the same >> zone id. This doesn't improve the performace, but a future patch may >> optimize this scenario by sending the packet to CT only once. >> >> Signed-off-by: Numan Siddique <nusid...@redhat.com> >> --- >> ovn/controller/ovn-controller.8.xml | 8 ++++---- >> ovn/controller/ovn-controller.c | 17 +++++++---------- >> ovn/controller/physical.c | 6 ++++-- >> 3 files changed, 15 insertions(+), 16 deletions(-) >> >> diff --git a/ovn/controller/ovn-controller.8.xml >> b/ovn/controller/ovn-controller.8.xml >> index c92fd55..b8bec6c 100644 >> --- a/ovn/controller/ovn-controller.8.xml >> +++ b/ovn/controller/ovn-controller.8.xml >> @@ -209,14 +209,14 @@ >> <code>external_ids:ct-zone-*</code> in the <code>Bridge</code> >> table >> </dt> >> <dd> >> - Logical ports and gateway routers are assigned a connection >> + Logical switch and router datapaths are assigned a connection >> tracking zone by <code>ovn-controller</code> for stateful >> services. To keep state across restarts of >> <code>ovn-controller</code>, these keys are stored in the >> integration bridge's Bridge table. The name contains a prefix >> of <code>ct-zone-</code> followed by the name of the logical >> - port or gateway router's zone key. The value for this key >> - identifies the zone used for this port. >> + datapath's zone key. The value for this key identifies the zone >> used >> + for the datapath. >> </dd> >> >> <dt> >> @@ -309,7 +309,7 @@ >> >> <dt><code>ct-zone-list</code></dt> >> <dd> >> - Lists each local logical port and its connection tracking zone. >> + Lists each local logical datapath and its connection tracking >> zone. >> </dd> >> >> <dt><code>inject-pkt</code> <var>microflow</var></dt> >> diff --git a/ovn/controller/ovn-controller.c >> b/ovn/controller/ovn-controller.c >> index ea299da..696723d 100644 >> --- a/ovn/controller/ovn-controller.c >> +++ b/ovn/controller/ovn-controller.c >> @@ -307,7 +307,7 @@ get_ovnsb_remote(struct ovsdb_idl *ovs_idl) >> } >> >> static void >> -update_ct_zones(struct sset *lports, const struct hmap *local_datapaths, >> +update_ct_zones(const struct hmap *local_datapaths, >> struct simap *ct_zones, unsigned long *ct_zone_bitmap, >> struct shash *pending_ct_zones) >> { >> @@ -316,15 +316,15 @@ update_ct_zones(struct sset *lports, const struct >> hmap *local_datapaths, >> const char *user; >> struct sset all_users = SSET_INITIALIZER(&all_users); >> >> - SSET_FOR_EACH(user, lports) { >> - sset_add(&all_users, user); >> - } >> - >> /* Local patched datapath (gateway routers) need zones assigned. */ >> const struct local_datapath *ld; >> HMAP_FOR_EACH (ld, hmap_node, local_datapaths) { >> /* XXX Add method to limit zone assignment to logical router >> * datapaths with NAT */ >> + char *dp_user = xasprintf(UUID_FMT, >> + UUID_ARGS(&ld->datapath->heade >> r_.uuid)); >> + sset_add(&all_users, dp_user); >> + free(dp_user); >> char *dnat = alloc_nat_zone_key(&ld->datapath->header_.uuid, >> "dnat"); >> char *snat = alloc_nat_zone_key(&ld->datapath->header_.uuid, >> "snat"); >> sset_add(&all_users, dnat); >> @@ -350,10 +350,7 @@ update_ct_zones(struct sset *lports, const struct >> hmap *local_datapaths, >> } >> } >> >> - /* xxx This is wasteful to assign a zone to each port--even if no >> - * xxx security policy is applied. */ >> - >> - /* Assign a unique zone id for each logical port and two zones >> + /* Assign a unique zone id for each local datapath and two zones >> * to a gateway router. */ >> SSET_FOR_EACH(user, &all_users) { >> int zone; >> @@ -616,7 +613,7 @@ main(int argc, char *argv[]) >> >> &pending_ct_zones); >> >> pinctrl_run(&ctx, &lports, br_int, chassis, >> &local_datapaths); >> - update_ct_zones(&local_lports, &local_datapaths, &ct_zones, >> + update_ct_zones(&local_datapaths, &ct_zones, >> ct_zone_bitmap, &pending_ct_zones); >> if (ctx.ovs_idl_txn) { >> >> diff --git a/ovn/controller/physical.c b/ovn/controller/physical.c >> index 0f1aa63..7d44485 100644 >> --- a/ovn/controller/physical.c >> +++ b/ovn/controller/physical.c >> @@ -167,8 +167,10 @@ get_zone_ids(const struct sbrec_port_binding >> *binding, >> { >> struct zone_ids zone_ids; >> >> - zone_ids.ct = simap_get(ct_zones, binding->logical_port); >> - >> + char *dp_uuid = xasprintf(UUID_FMT, >> + UUID_ARGS(&binding->datapath-> >> header_.uuid)); >> + zone_ids.ct = simap_get(ct_zones, dp_uuid); >> + free(dp_uuid); >> const struct uuid *key = &binding->datapath->header_.uuid; >> >> char *dnat = alloc_nat_zone_key(key, "dnat"); >> -- >> 2.9.3 >> >> _______________________________________________ >> dev mailing list >> d...@openvswitch.org >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev >> > > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev