Thanks Dumitru for the response. I’ve looked through this code and even tried to implement similar logic for vtep lport, but realized, that vtep mcast traffic is a bit different from localnet port. mcast traffic originated in normal vif port in localnet-attached lswitch has two cases: - if uplink bridge mapping is locally available, the mcast packet is sent to this interface assuming classic network switch outside of ovn will flood it in l2 domain - if uplink bridge mapping is locally unawailable, such mcast packet is flooded in overlay. (honestly I didn’t find code related to this logic, I’ve found it just performing tests)
With same logic implemented in consider_mc_group() the BUM traffic originated in vif lport doesn’t reach remote chassis at all… With vtep lport mcast traffic must be replicated always on source node, but it’s prohibited to re-send received from vtep lport mcast packets to other remote chassis. I guess I need to reject mcast l2 flood to remote ports if REGBIT_FROM_RAMP == 1. Do you have an idea for the correct place to put such logic in? > On 16 May 2023, at 23:02, Dumitru Ceara <dce...@redhat.com> wrote: > > On 5/16/23 21:48, Vladislav Odintsov wrote: >> Hi Numan, Dumitru, Ilya, Mark, >> > > Hi Vladislav, > >> if someone can help, I’ll be very grateful. >> >> Thanks in advance. >> >>> On 15 May 2023, at 15:06, Vladislav Odintsov <odiv...@gmail.com> wrote: >>> >>> Hi, I’m implementing neighbour learning on the chassis-redirect ports >>> for traffic coming from lport of vtep type and have some >>> misunderstanding of how MC_FLOOD action works with traffic coming from >>> localnet lports. Imagine, we’ve got lswitch with 4 LSPs: - vtep lport >>> (type vtep) - lrp (chassis-redirect configured router port on hv1) - >>> lsp1 on hv1 - lsp2 on hv2 My problem is that mcast/bcast traffic >>> coming from vtep lport got flooded to all logical ports of the >>> lswitch, even for those which reside on another hypervisor (hv2 in >>> this example), resulting in duplicated packets on lsp2 vif port. vtep >>> switch performs source node replication of BUM traffic, so bcast >>> packets reach normal vif lports + MC_FLOOD in ls_in_l2_lkup. I’m >>> comparing behaviour with localnet port in same setup (lswitch with 2 >>> LSPs on different hypervisors) and see there is no such behaviour: packets >>> don’t get flooded to vif lports on other chassis. >>> I see that eth.mcast traffic is matched in ls_in_l2_lkup lflow table with >>> the action 'outport = "_MC_flood"; output;', then it got flooded to only >>> LRPs of LS and *local* vif lports. The question is - where is the >>> logic, which prevents flooding from localnet to vif located on other >>> chassis? Am I missing something? Let me know if any additional >>> information is needed. Thanks! >>> > > For localnet ports the key is in how ovn-controllers expand (L2) > multicast_groups. In consider_mc_group() [0]: > > /* Go through all of the ports in the multicast group: > * > * - For remote ports, add the chassis to 'remote_chassis' or > * 'vtep_chassis'. > * > * - For local ports (other than logical patch ports), add actions > * to 'ofpacts' to set the output port and resubmit. > * > * - For logical patch ports, add actions to 'remote_ofpacts' > * instead. (If we put them in 'ofpacts', then the output > * would happen on every hypervisor in the multicast group, > * effectively duplicating the packet.) The only exception > * is in case of transit switches (used by OVN-IC). We need > * patch ports to be processed on the remote side, after > * crossing the AZ boundary. > * > * - For chassisredirect ports, add actions to 'ofpacts' to > * set the output port to be the router patch port for which > * the redirect port was added. > */ > > Later on, we have a special check for switches with localnet > ports and we don't forward traffic to remote ports in that > case because multicast traffic reaches remote ports through > the localnet directly: > > } else if (!get_localnet_port(local_datapaths, > mc->datapath->tunnel_key)) { > /* Add remote chassis only when localnet port not exist, > * otherwise multicast will reach remote ports through localnet > * port. */ > if (port->chassis) { > if (chassis_is_vtep(port->chassis)) { > sset_add(&vtep_chassis, port->chassis->name); > } else { > sset_add(&remote_chassis, port->chassis->name); > } > } > for (size_t j = 0; j < port->n_additional_chassis; j++) { > if (chassis_is_vtep(port->additional_chassis[j])) { > sset_add(&vtep_chassis, > port->additional_chassis[j]->name); > } else { > sset_add(&remote_chassis, > port->additional_chassis[j]->name); > } > } > } > > Should we have a similar behavior if the datapath has a "vtep" > port? > > Hope this helps. > > Regards, > Dumitru > > [0] > https://github.com/ovn-org/ovn/blob/276e50c3f7782472ad7f57488c48c3bd4fdbe4b7/controller/physical.c#L1731-L1750 Regards, Vladislav Odintsov _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev