[ovs-dev] [PATCH v4 1/2] OVN: Add multicast keep-local flag.
Numan Siddique
nusiddiq at redhat.com
Tue Nov 14 08:15:02 UTC 2017
On Mon, Nov 13, 2017 at 8:50 AM, Mark Michelson <mmichels at redhat.com> wrote:
> When this flag is set, then a multicast packet that would normally be
> delivered to ports on multiple hypervisors is only delivered to ports
> on the local hypervisor.
>
> The primary known use case for this is when multicast packets originate
> from ovn-controller. Multiple ovn-controllers will be attempting to send
> out those multicast packets, and so each should only be responsible for
> delivering those packets to their local ports.
>
> Signed-off-by: Mark Michelson <mmichels at redhat.com>
>
Acked-by: Numan Siddique <nusiddiq at redhat.com>
> ---
> ovn/controller/physical.c | 15 +++++++++++++++
> ovn/lib/logical-fields.h | 6 ++++++
> ovn/ovn-architecture.7.xml | 10 ++++++++++
> 3 files changed, 31 insertions(+)
>
> diff --git a/ovn/controller/physical.c b/ovn/controller/physical.c
> index df71979f9..b2216457f 100644
> --- a/ovn/controller/physical.c
> +++ b/ovn/controller/physical.c
> @@ -995,6 +995,21 @@ physical_run(struct controller_ctx *ctx, enum
> mf_field_id mff_ovn_geneve,
> struct ofpbuf remote_ofpacts;
> ofpbuf_init(&remote_ofpacts, 0);
> SBREC_MULTICAST_GROUP_FOR_EACH (mc, ctx->ovnsb_idl) {
> + /* Table 32, priority 150.
> + * =======================
> + *
> + * Multicast packets that should not be sent to other hypervisors.
> + */
> + struct match match = MATCH_CATCHALL_INITIALIZER;
> + match_set_metadata(&match, htonll(mc->datapath->tunnel_key));
> + match_set_reg(&match, MFF_LOG_OUTPORT - MFF_REG0, mc->tunnel_key);
> + match_set_reg_masked(&match, MFF_LOG_FLAGS - MFF_REG0,
> + MLF_KEEP_LOCAL, MLF_KEEP_LOCAL);
> + ofpbuf_clear(&ofpacts);
> + put_resubmit(OFTABLE_LOCAL_OUTPUT, &ofpacts);
> + ofctrl_add_flow(flow_table, OFTABLE_REMOTE_OUTPUT, 150, 0, &match,
> + &ofpacts);
> +
> consider_mc_group(mff_ovn_geneve, ct_zones, local_datapaths,
> chassis,
> mc, &ofpacts, &remote_ofpacts, flow_table);
> }
> diff --git a/ovn/lib/logical-fields.h b/ovn/lib/logical-fields.h
> index 696c529be..eb0b8f422 100644
> --- a/ovn/lib/logical-fields.h
> +++ b/ovn/lib/logical-fields.h
> @@ -49,6 +49,7 @@ enum mff_log_flags_bits {
> MLF_RCV_FROM_VXLAN_BIT = 1,
> MLF_FORCE_SNAT_FOR_DNAT_BIT = 2,
> MLF_FORCE_SNAT_FOR_LB_BIT = 3,
> + MLF_KEEP_LOCAL_BIT = 4,
> };
>
> /* MFF_LOG_FLAGS_REG flag assignments */
> @@ -69,6 +70,11 @@ enum mff_log_flags {
> /* Indicate that a packet needs a force SNAT in the gateway router
> when
> * load-balancing has taken place. */
> MLF_FORCE_SNAT_FOR_LB = (1 << MLF_FORCE_SNAT_FOR_LB_BIT),
> +
> + /* Indicate that a packet that should be distributed across multiple
> + * hypervisors should instead only be output to local targets
> + */
> + MLF_KEEP_LOCAL = (1 << MLF_KEEP_LOCAL_BIT),
> };
>
> #endif /* ovn/lib/logical-fields.h */
> diff --git a/ovn/ovn-architecture.7.xml b/ovn/ovn-architecture.7.xml
> index b13b41177..9c7663e93 100644
> --- a/ovn/ovn-architecture.7.xml
> +++ b/ovn/ovn-architecture.7.xml
> @@ -1027,6 +1027,16 @@
> their traffic should never go out through a tunnel.
> </li>
> <li>
> + A higher-priority rule to match packets that have the
> MLF_KEEP_LOCAL
> + logical flow flag set, and whose destination is a multicast
> address.
> + This flag indicates that the packet should not be delivered to
> remote
> + hypervisors, even if the multicast destination includes ports on
> + remote hypervisors. This flag is used when ovn-controller is the
> + originator of the multicast packet. Since each ovn-controller
> + instance is originating these packets, the packets only need to
> be
> + delivered to local ports.
> + </li>
> + <li>
> A fallback flow that resubmits to table 33 if there is no other
> match.
> </li>
> --
> 2.13.5
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
More information about the dev
mailing list