On 1/22/24 15:14, Mohammad Heib wrote:
> Expose the igmp/mld group protocol version through the
> IGMP_GROUP table in SBDB.
> 
> This patch can be used by ovn consumer for debuggability purposes, user
> now can  match between the protocol version used in the OVN logical
> switches and the uplink ports.
> 
> Rreported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2160476
> Signed-off-by: Mohammad Heib <mh...@redhat.com>
> ---

Hi Mohammad,

I have a few (minor) comments, please see below.

>  NEWS                  |  2 ++
>  controller/ip-mcast.c |  8 ++++++++
>  controller/ip-mcast.h |  3 +++
>  controller/pinctrl.c  | 19 ++++++++++++++++++-
>  northd/ovn-northd.c   |  2 +-
>  ovn-sb.ovsschema      |  5 +++--
>  ovn-sb.xml            |  4 ++++
>  tests/ovn.at          |  3 +++
>  8 files changed, 42 insertions(+), 4 deletions(-)
> 
> diff --git a/NEWS b/NEWS
> index 5f267b4c6..9075e7d80 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -14,6 +14,8 @@ Post v23.09.0
>    - ovn-northd-ddlog has been removed.
>    - A new LSP option "enable_router_port_acl" has been added to enable
>      conntrack for the router port whose peer is l3dgw_port if set it true.
> +  - IGMP_Group have a new "protocol" column that displays the the group

Nit: s/have/has

> +    protocol version.
>  
>  OVN v23.09.0 - 15 Sep 2023
>  --------------------------
> diff --git a/controller/ip-mcast.c b/controller/ip-mcast.c
> index a870fb29e..83e41c81f 100644
> --- a/controller/ip-mcast.c
> +++ b/controller/ip-mcast.c
> @@ -226,6 +226,14 @@ igmp_group_cleanup(struct ovsdb_idl_txn *ovnsb_idl_txn,
>      return true;
>  }
>  
> +
> +void igmp_group_set_protocol(const struct sbrec_igmp_group *group,
> +                             mcast_group_proto protocol)
> +{
> +    sbrec_igmp_group_set_protocol(group,
> +                                  
> mcast_snooping_group_protocol_str(protocol));
> +}
> +

Does it make more sense to add the protocol as argument to
igmp_group_update_ports() and rename that function to igmp_group_update()?

>  static const struct sbrec_igmp_group *
>  igmp_group_lookup_(struct ovsdb_idl_index *igmp_groups,
>                     const char *addr_str,
> diff --git a/controller/ip-mcast.h b/controller/ip-mcast.h
> index 326f39db1..f0c34343f 100644
> --- a/controller/ip-mcast.h
> +++ b/controller/ip-mcast.h
> @@ -63,4 +63,7 @@ void igmp_group_delete(const struct sbrec_igmp_group *g);
>  bool igmp_group_cleanup(struct ovsdb_idl_txn *ovnsb_idl_txn,
>                          struct ovsdb_idl_index *igmp_groups);
>  
> +void igmp_group_set_protocol(const struct sbrec_igmp_group *group,
> +                             mcast_group_proto protocol);
> +
>  #endif /* controller/ip-mcast.h */
> diff --git a/controller/pinctrl.c b/controller/pinctrl.c
> index 77bf67e58..6379b7afb 100644
> --- a/controller/pinctrl.c
> +++ b/controller/pinctrl.c
> @@ -180,6 +180,7 @@ struct pinctrl {
>      bool mac_binding_can_timestamp;
>      bool fdb_can_timestamp;
>      bool dns_supports_ovn_owned;
> +    bool igmp_support_protocol;
>  };
>  
>  static struct pinctrl pinctrl;
> @@ -3586,11 +3587,21 @@ pinctrl_update(const struct ovsdb_idl *idl, const 
> char *br_int_name)
>      if (dns_supports_ovn_owned != pinctrl.dns_supports_ovn_owned) {
>          pinctrl.dns_supports_ovn_owned = dns_supports_ovn_owned;
>  
> -        /* Notify pinctrl_handler that fdb timestamp column
> +        /* Notify pinctrl_handler that dns ovn_owned column
>         * availability has changed. */
>          notify_pinctrl_handler();
>      }
>  
> +    bool igmp_support_proto =
> +            sbrec_server_has_igmp_group_table_col_protocol(idl);
> +    if (igmp_support_proto != pinctrl.igmp_support_protocol) {
> +        pinctrl.igmp_support_protocol = igmp_support_proto;

We only use this in the main thread, when updating the SB, why can't we
just directly check the column support there instead?

> +
> +        /* Notify pinctrl_handler that igmp protocol column
> +         * availability has changed. */
> +        notify_pinctrl_handler();
> +    }
> +
>      ovs_mutex_unlock(&pinctrl_mutex);
>  }
>  
> @@ -5400,6 +5411,12 @@ ip_mcast_sync(struct ovsdb_idl_txn *ovnsb_idl_txn,
>                                                 local_dp->datapath, chassis);
>              }
>  
> +            /* Set Group protocol*/
> +            if (pinctrl.igmp_support_protocol) {
> +                igmp_group_set_protocol(sbrec_igmp,
> +                                        mc_group->protocol_version);
> +            }
> +
>              igmp_group_update_ports(sbrec_igmp, 
> sbrec_datapath_binding_by_key,
>                                      sbrec_port_binding_by_key, ip_ms->ms,
>                                      mc_group);
> diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
> index f3868068d..700c9cf6e 100644
> --- a/northd/ovn-northd.c
> +++ b/northd/ovn-northd.c
> @@ -120,7 +120,7 @@ static const char *rbac_svc_monitor_auth_update[] =
>  static const char *rbac_igmp_group_auth[] =
>      {""};
>  static const char *rbac_igmp_group_update[] =
> -    {"address", "chassis", "datapath", "ports"};
> +    {"address", "protocol", "chassis", "datapath", "ports"};
>  static const char *rbac_bfd_auth[] =
>      {""};
>  static const char *rbac_bfd_update[] =
> diff --git a/ovn-sb.ovsschema b/ovn-sb.ovsschema
> index 72e230b75..240d65f69 100644
> --- a/ovn-sb.ovsschema
> +++ b/ovn-sb.ovsschema
> @@ -1,7 +1,7 @@
>  {
>      "name": "OVN_Southbound",
> -    "version": "20.30.0",
> -    "cksum": "2972392849 31172",
> +    "version": "20.31.0",
> +    "cksum": "2643271413 31220",
>      "tables": {
>          "SB_Global": {
>              "columns": {
> @@ -480,6 +480,7 @@
>          "IGMP_Group": {
>              "columns": {
>                  "address": {"type": "string"},
> +                "protocol": {"type": "string"},
>                  "datapath": {"type": {"key": {"type": "uuid",
>                                                "refTable": "Datapath_Binding",
>                                                "refType": "weak"},
> diff --git a/ovn-sb.xml b/ovn-sb.xml
> index e393f92b3..56e26b674 100644
> --- a/ovn-sb.xml
> +++ b/ovn-sb.xml
> @@ -4756,6 +4756,10 @@ tcp.flags = RST;
>        Destination IPv4 address for the IGMP group.
>      </column>
>  
> +    <column name="protocol">
> +      Group protocol version either IGMPv1,v2,v3 or MLDv1,v2.
> +    </column>
> +
>      <column name="datapath">
>        Datapath to which this IGMP group belongs.
>      </column>
> diff --git a/tests/ovn.at b/tests/ovn.at
> index 8cc4c311c..180b9bfdd 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -22549,6 +22549,7 @@ send_igmp_v3_report hv2-vif1 hv2 000000000002 
> $(ip_to_hex 10 0 0 2) f9f9 \
>  
>  # Check that the IGMP Group is learned on both hv.
>  wait_row_count IGMP_Group 2 address=239.0.1.68
> +wait_row_count IGMP_Group 2 protocol=IGMPv3
>  check ovn-nbctl --wait=hv sync
>  
>  AT_CAPTURE_FILE([sbflows3])
> @@ -22626,6 +22627,7 @@ send_igmp_v3_report hv1-vif1 hv1 \
>  
>  # Check that the IGMP Group is learned.
>  wait_row_count IGMP_Group 1 address=224.0.0.42
> +wait_row_count IGMP_Group 1 protocol=IGMPv3
>  
>  AS_BOX([IGMP traffic test 3])
>  # Send traffic and make sure it gets flooded to all ports.
> @@ -23287,6 +23289,7 @@ send_mld_v2_report hv2-vif1 hv2 \
>  
>  # Check that the IP multicast group is learned on both hv.
>  wait_row_count IGMP_Group 2 address='"ff0a:dead:beef::1"'
> +wait_row_count IGMP_Group 2 protocol=MLDv2
>  
>  # This gives the ovn-controller nodes a chance to see the new IGMP_Group.
>  check ovn-nbctl --wait=hv sync

Regards,
Dumitru

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to