On 01/19/2016 10:32 PM, Han Zhou wrote: > Hi Russell, > > On Mon, Jan 18, 2016 at 7:45 AM, Russell Bryant <russ...@ovn.org > <mailto:russ...@ovn.org>> wrote: >> >> Multiple logical ports on the same chassis that were connected to the >> same physical network via localnet ports were not able to send packets >> to each other. This was because ovn-controller created a single patch >> port between br-int and the physical network access bridge and used it >> for all localnet ports. >> >> The fix implemented here is to create a separate patch port for every >> logical port of type=localnet. An optimization is included where these >> ports are only created if the localnet port is on a logical switch with >> another logical port with an associated local VIF. >> >> A nice side effect of this fix is that the code in physical.c got a lot >> simpler, as localnet ports are now handled mostly like local VIFs. >> >> Fixes: c02819293d52 ("ovn: Add "localnet" logical port type.") >> Reported-by: Han Zhou <zhou...@gmail.com <mailto:zhou...@gmail.com>> >> Reported-at: http://openvswitch.org/pipermail/dev/2016-January/064413.html >> Signed-off-by: Russell Bryant <russ...@ovn.org <mailto:russ...@ovn.org>> >> --- >> ovn/controller/ovn-controller.c | 10 +- >> ovn/controller/patch.c | 80 +++++++++----- >> ovn/controller/patch.h | 4 +- >> ovn/controller/physical.c | 237 > +++++++++------------------------------- >> ovn/controller/physical.h | 3 +- >> tests/ovn-controller.at <http://ovn-controller.at> | 39 ++++--- >> tests/ovn.at <http://ovn.at> | 10 +- >> 7 files changed, 140 insertions(+), 243 deletions(-) >> > > This would require some document updatesthe reflect the change to > localnet port, at least ovn/controller/ovn-controller.8.xml and > ovn/ovn-architecture.7.xml.
Oh, right. Thanks for pointing that out. > >> >> >> diff --git a/ovn/controller/patch.c b/ovn/controller/patch.c >> >> + struct ovsrec_bridge *br_ln = > shash_find_data(&bridge_mappings, network); >> + if (!br_ln) { >> + static struct vlog_rate_limit rl = > VLOG_RATE_LIMIT_INIT(5, 1); >> + VLOG_ERR_RL(&rl, "localnet port '%s' has no bridge.", >> + binding->logical_port); > > It might be more clear to log the network name, e.g.: bridge not found > for network name '%s' for localnet port '%s' Good idea, done. > >> >> >> diff --git a/ovn/controller/physical.c b/ovn/controller/physical.c > >> >> - } else if (binding->parent_port) { >> + if (binding->parent_port && *binding->parent_port) { > > Is the change of adding condition *binding->parent_port related to this > patch? It's only related because I hit it while testing this patch. I will split it out in v2. >> >> >> + ofpbuf_clear(&ofpacts); >> + match_init_catchall(&match); >> + match_set_in_port(&match, ofport); >> + if (tag) { >> + match_set_dl_vlan(&match, htons(tag)); >> + } else if (!strcmp(binding->type, "localnet")) { >> + /* Match priority-tagged frames, e.g. VLAN ID 0. >> + * >> + * We'll add a second flow for frames that lack any > 802.1Q >> + * header later. */ >> + match_set_dl_tci_masked(&match, htons(VLAN_CFI), >> + htons(VLAN_VID_MASK | VLAN_CFI)); >> + } >> >> - if (zone_id) { >> - put_load(zone_id, MFF_LOG_CT_ZONE, 0, 32, &ofpacts); >> - } >> + /* Strip vlans. */ >> + if (tag) { >> + ofpact_put_STRIP_VLAN(&ofpacts); >> + } >> > This if block can be combined with the above if (tag). Done. >> >> @@ -530,22 +485,12 @@ physical_run(struct controller_ctx *ctx, enum > mf_field_id mff_ovn_geneve, >> - port->parent_port >> + port->parent_port && *port->parent_port > > Same question as above. I have it split out in v2. >> >> >> diff --git a/tests/ovn-controller.at <http://ovn-controller.at> > b/tests/ovn-controller.at <http://ovn-controller.at> >> +check_patches >> + >> +# Create a localnet port, but we should still have no patch ports, as > they >> +# won't be created until there's a localnet port on a logical switch with >> +# another logical port bound to this chassis. >> +ovn-sbctl \ >> + -- --id=@dp101 create Datapath_Binding tunnel_key=101 \ >> + -- create Port_Binding datapath=@dp101 logical_port=localnet1 > tunnel_key=101 \ > > For Port_Binding, tunnel_key=101 better to be tunnel_key=1. This is not > a problem but it may cause confusion for reader :). Good point. I changed it. > Thanks for the quick and nice work!! Thanks for the detailed review! I'll post v2 in a few minutes. -- Russell Bryant _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev