diff mbox series

[ovs-dev,v3] OVN-SB: Exposes igmp group protocol version through IGMP table.

Message ID 20240226131108.106005-1-mheib@redhat.com
State Accepted
Headers show
Series [ovs-dev,v3] OVN-SB: Exposes igmp group protocol version through IGMP table. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_ovn-kubernetes success github build: passed
ovsrobot/github-robot-_Build_and_Test fail github build: failed

Commit Message

Mohammad Heib Feb. 26, 2024, 1:11 p.m. UTC
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 <mheib@redhat.com>
---
v3:
  Address Ales comments in v2 and rebase over main.
---
 NEWS                  |  2 ++
 controller/ip-mcast.c | 11 +++++++++--
 controller/ip-mcast.h | 11 ++++++-----
 controller/pinctrl.c  | 16 ++++++++++++++--
 northd/ovn-northd.c   |  2 +-
 ovn-sb.ovsschema      |  5 +++--
 ovn-sb.xml            |  4 ++++
 tests/ovn.at          |  3 +++
 8 files changed, 42 insertions(+), 12 deletions(-)

Comments

Ales Musil Feb. 28, 2024, 6:36 a.m. UTC | #1
On Mon, Feb 26, 2024 at 2:11 PM Mohammad Heib <mheib@redhat.com> 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
> <https://bugzilla.redhat.com/show_bug.cgi?id=2160476Signed-off-by>:
> Mohammad Heib <mheib@redhat.com>
> ---
> v3:
>   Address Ales comments in v2 and rebase over main.
> ---
>  NEWS                  |  2 ++
>  controller/ip-mcast.c | 11 +++++++++--
>  controller/ip-mcast.h | 11 ++++++-----
>  controller/pinctrl.c  | 16 ++++++++++++++--
>  northd/ovn-northd.c   |  2 +-
>  ovn-sb.ovsschema      |  5 +++--
>  ovn-sb.xml            |  4 ++++
>  tests/ovn.at          |  3 +++
>  8 files changed, 42 insertions(+), 12 deletions(-)
>
> diff --git a/NEWS b/NEWS
> index c0131ceee..784fedfa0 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -5,6 +5,8 @@ Post v24.03.0
>      cloned to all unknown ports connected to the same Logical Switch.
>    - Added a new logical switch port option "disable_arp_nd_rsp" to
>      disable adding the ARP responder flows if set to true.
> +  - IGMP_Group has new "protocol" column that displays the the group
> +    protocol version.
>
>  OVN v24.03.0 - xx xxx xxxx
>  --------------------------
> diff --git a/controller/ip-mcast.c b/controller/ip-mcast.c
> index b457c7e69..0969cc07f 100644
> --- a/controller/ip-mcast.c
> +++ b/controller/ip-mcast.c
> @@ -111,11 +111,12 @@ igmp_mrouter_create(struct ovsdb_idl_txn *idl_txn,
>  }
>
>  void
> -igmp_group_update_ports(const struct sbrec_igmp_group *g,
> +igmp_group_update(const struct sbrec_igmp_group *g,
>                          struct ovsdb_idl_index *datapaths,
>                          struct ovsdb_idl_index *port_bindings,
>                          const struct mcast_snooping *ms OVS_UNUSED,
> -                        const struct mcast_group *mc_group)
> +                        const struct mcast_group *mc_group,
> +                        const bool igmp_support_protocol)
>      OVS_REQ_RDLOCK(ms->rwlock)
>  {
>      struct igmp_group_port *old_ports_storage =
> @@ -155,6 +156,12 @@ igmp_group_update_ports(const struct sbrec_igmp_group
> *g,
>          sbrec_igmp_group_update_ports_delvalue(g, igmp_port->port);
>      }
>
> +    /* set Group protocol */
> +    if (igmp_support_protocol) {
> +         sbrec_igmp_group_set_protocol(g,
> mcast_snooping_group_protocol_str(
> +                                       mc_group->protocol_version));
> +    }
> +
>      free(old_ports_storage);
>      hmap_destroy(&old_ports);
>  }
> diff --git a/controller/ip-mcast.h b/controller/ip-mcast.h
> index eebada968..026503139 100644
> --- a/controller/ip-mcast.h
> +++ b/controller/ip-mcast.h
> @@ -47,11 +47,12 @@ struct sbrec_igmp_group *igmp_mrouter_create(
>      const struct sbrec_chassis *chassis,
>      bool igmp_group_has_chassis_name);
>
> -void igmp_group_update_ports(const struct sbrec_igmp_group *g,
> -                             struct ovsdb_idl_index *datapaths,
> -                             struct ovsdb_idl_index *port_bindings,
> -                             const struct mcast_snooping *ms,
> -                             const struct mcast_group *mc_group)
> +void igmp_group_update(const struct sbrec_igmp_group *g,
> +                       struct ovsdb_idl_index *datapaths,
> +                       struct ovsdb_idl_index *port_bindings,
> +                       const struct mcast_snooping *ms,
> +                       const struct mcast_group *mc_group,
> +                       const bool igmp_support_protocol)
>      OVS_REQ_RDLOCK(ms->rwlock);
>  void
>  igmp_mrouter_update_ports(const struct sbrec_igmp_group *g,
> diff --git a/controller/pinctrl.c b/controller/pinctrl.c
> index 98b29de9f..66e390e80 100644
> --- a/controller/pinctrl.c
> +++ b/controller/pinctrl.c
> @@ -181,6 +181,7 @@ struct pinctrl {
>      bool fdb_can_timestamp;
>      bool dns_supports_ovn_owned;
>      bool igmp_group_has_chassis_name;
> +    bool igmp_support_protocol;
>  };
>
>  static struct pinctrl pinctrl;
> @@ -3599,6 +3600,17 @@ pinctrl_update(const struct ovsdb_idl *idl, const
> char *br_int_name)
>          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;
> +
> +        /* Notify pinctrl_handler that igmp protocol column
> +         * availability has changed. */
> +        notify_pinctrl_handler();
> +    }
> +
> +
>      ovs_mutex_unlock(&pinctrl_mutex);
>  }
>
> @@ -5409,9 +5421,9 @@ ip_mcast_sync(struct ovsdb_idl_txn *ovnsb_idl_txn,
>                      chassis, pinctrl.igmp_group_has_chassis_name);
>              }
>
> -            igmp_group_update_ports(sbrec_igmp,
> sbrec_datapath_binding_by_key,
> +            igmp_group_update(sbrec_igmp, sbrec_datapath_binding_by_key,
>                                      sbrec_port_binding_by_key, ip_ms->ms,
> -                                    mc_group);
> +                                    mc_group,
> pinctrl.igmp_support_protocol);
>          }
>
>          /* Mrouters. */
> diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
> index b1be73cb2..3a5544b0c 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[] =
>      {"chassis_name"};
>  static const char *rbac_igmp_group_update[] =
> -    {"address", "chassis", "datapath", "ports"};
> +    {"address", "protocol", "chassis", "datapath", "ports"};
>  static const char *rbac_bfd_auth[] =
>      {"chassis_name"};
>  static const char *rbac_bfd_update[] =
> diff --git a/ovn-sb.ovsschema b/ovn-sb.ovsschema
> index 84ae09515..b6c051ae6 100644
> --- a/ovn-sb.ovsschema
> +++ b/ovn-sb.ovsschema
> @@ -1,7 +1,7 @@
>  {
>      "name": "OVN_Southbound",
> -    "version": "20.33.0",
> -    "cksum": "4076371179 31328",
> +    "version": "20.34.0",
> +    "cksum": "2786607656 31376",
>      "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 ac4e585f2..4c26c6714 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 d26c95054..2c71370f1 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -22706,6 +22706,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])
> @@ -22783,6 +22784,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.
> @@ -23444,6 +23446,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
> --
> 2.34.3
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
>
Looks good to me, thanks.

Acked-by: Ales Musil <amusil@redhat.com>
Mark Michelson March 18, 2024, 4:57 p.m. UTC | #2
Thank you Mohammad and Ales. I pushed this change to main.

On 2/28/24 01:36, Ales Musil wrote:
> On Mon, Feb 26, 2024 at 2:11 PM Mohammad Heib <mheib@redhat.com> 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
>> <https://bugzilla.redhat.com/show_bug.cgi?id=2160476Signed-off-by>:
>> Mohammad Heib <mheib@redhat.com>
>> ---
>> v3:
>>    Address Ales comments in v2 and rebase over main.
>> ---
>>   NEWS                  |  2 ++
>>   controller/ip-mcast.c | 11 +++++++++--
>>   controller/ip-mcast.h | 11 ++++++-----
>>   controller/pinctrl.c  | 16 ++++++++++++++--
>>   northd/ovn-northd.c   |  2 +-
>>   ovn-sb.ovsschema      |  5 +++--
>>   ovn-sb.xml            |  4 ++++
>>   tests/ovn.at          |  3 +++
>>   8 files changed, 42 insertions(+), 12 deletions(-)
>>
>> diff --git a/NEWS b/NEWS
>> index c0131ceee..784fedfa0 100644
>> --- a/NEWS
>> +++ b/NEWS
>> @@ -5,6 +5,8 @@ Post v24.03.0
>>       cloned to all unknown ports connected to the same Logical Switch.
>>     - Added a new logical switch port option "disable_arp_nd_rsp" to
>>       disable adding the ARP responder flows if set to true.
>> +  - IGMP_Group has new "protocol" column that displays the the group
>> +    protocol version.
>>
>>   OVN v24.03.0 - xx xxx xxxx
>>   --------------------------
>> diff --git a/controller/ip-mcast.c b/controller/ip-mcast.c
>> index b457c7e69..0969cc07f 100644
>> --- a/controller/ip-mcast.c
>> +++ b/controller/ip-mcast.c
>> @@ -111,11 +111,12 @@ igmp_mrouter_create(struct ovsdb_idl_txn *idl_txn,
>>   }
>>
>>   void
>> -igmp_group_update_ports(const struct sbrec_igmp_group *g,
>> +igmp_group_update(const struct sbrec_igmp_group *g,
>>                           struct ovsdb_idl_index *datapaths,
>>                           struct ovsdb_idl_index *port_bindings,
>>                           const struct mcast_snooping *ms OVS_UNUSED,
>> -                        const struct mcast_group *mc_group)
>> +                        const struct mcast_group *mc_group,
>> +                        const bool igmp_support_protocol)
>>       OVS_REQ_RDLOCK(ms->rwlock)
>>   {
>>       struct igmp_group_port *old_ports_storage =
>> @@ -155,6 +156,12 @@ igmp_group_update_ports(const struct sbrec_igmp_group
>> *g,
>>           sbrec_igmp_group_update_ports_delvalue(g, igmp_port->port);
>>       }
>>
>> +    /* set Group protocol */
>> +    if (igmp_support_protocol) {
>> +         sbrec_igmp_group_set_protocol(g,
>> mcast_snooping_group_protocol_str(
>> +                                       mc_group->protocol_version));
>> +    }
>> +
>>       free(old_ports_storage);
>>       hmap_destroy(&old_ports);
>>   }
>> diff --git a/controller/ip-mcast.h b/controller/ip-mcast.h
>> index eebada968..026503139 100644
>> --- a/controller/ip-mcast.h
>> +++ b/controller/ip-mcast.h
>> @@ -47,11 +47,12 @@ struct sbrec_igmp_group *igmp_mrouter_create(
>>       const struct sbrec_chassis *chassis,
>>       bool igmp_group_has_chassis_name);
>>
>> -void igmp_group_update_ports(const struct sbrec_igmp_group *g,
>> -                             struct ovsdb_idl_index *datapaths,
>> -                             struct ovsdb_idl_index *port_bindings,
>> -                             const struct mcast_snooping *ms,
>> -                             const struct mcast_group *mc_group)
>> +void igmp_group_update(const struct sbrec_igmp_group *g,
>> +                       struct ovsdb_idl_index *datapaths,
>> +                       struct ovsdb_idl_index *port_bindings,
>> +                       const struct mcast_snooping *ms,
>> +                       const struct mcast_group *mc_group,
>> +                       const bool igmp_support_protocol)
>>       OVS_REQ_RDLOCK(ms->rwlock);
>>   void
>>   igmp_mrouter_update_ports(const struct sbrec_igmp_group *g,
>> diff --git a/controller/pinctrl.c b/controller/pinctrl.c
>> index 98b29de9f..66e390e80 100644
>> --- a/controller/pinctrl.c
>> +++ b/controller/pinctrl.c
>> @@ -181,6 +181,7 @@ struct pinctrl {
>>       bool fdb_can_timestamp;
>>       bool dns_supports_ovn_owned;
>>       bool igmp_group_has_chassis_name;
>> +    bool igmp_support_protocol;
>>   };
>>
>>   static struct pinctrl pinctrl;
>> @@ -3599,6 +3600,17 @@ pinctrl_update(const struct ovsdb_idl *idl, const
>> char *br_int_name)
>>           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;
>> +
>> +        /* Notify pinctrl_handler that igmp protocol column
>> +         * availability has changed. */
>> +        notify_pinctrl_handler();
>> +    }
>> +
>> +
>>       ovs_mutex_unlock(&pinctrl_mutex);
>>   }
>>
>> @@ -5409,9 +5421,9 @@ ip_mcast_sync(struct ovsdb_idl_txn *ovnsb_idl_txn,
>>                       chassis, pinctrl.igmp_group_has_chassis_name);
>>               }
>>
>> -            igmp_group_update_ports(sbrec_igmp,
>> sbrec_datapath_binding_by_key,
>> +            igmp_group_update(sbrec_igmp, sbrec_datapath_binding_by_key,
>>                                       sbrec_port_binding_by_key, ip_ms->ms,
>> -                                    mc_group);
>> +                                    mc_group,
>> pinctrl.igmp_support_protocol);
>>           }
>>
>>           /* Mrouters. */
>> diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
>> index b1be73cb2..3a5544b0c 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[] =
>>       {"chassis_name"};
>>   static const char *rbac_igmp_group_update[] =
>> -    {"address", "chassis", "datapath", "ports"};
>> +    {"address", "protocol", "chassis", "datapath", "ports"};
>>   static const char *rbac_bfd_auth[] =
>>       {"chassis_name"};
>>   static const char *rbac_bfd_update[] =
>> diff --git a/ovn-sb.ovsschema b/ovn-sb.ovsschema
>> index 84ae09515..b6c051ae6 100644
>> --- a/ovn-sb.ovsschema
>> +++ b/ovn-sb.ovsschema
>> @@ -1,7 +1,7 @@
>>   {
>>       "name": "OVN_Southbound",
>> -    "version": "20.33.0",
>> -    "cksum": "4076371179 31328",
>> +    "version": "20.34.0",
>> +    "cksum": "2786607656 31376",
>>       "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 ac4e585f2..4c26c6714 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 d26c95054..2c71370f1 100644
>> --- a/tests/ovn.at
>> +++ b/tests/ovn.at
>> @@ -22706,6 +22706,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])
>> @@ -22783,6 +22784,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.
>> @@ -23444,6 +23446,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
>> --
>> 2.34.3
>>
>> _______________________________________________
>> dev mailing list
>> dev@openvswitch.org
>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>>
>>
> Looks good to me, thanks.
> 
> Acked-by: Ales Musil <amusil@redhat.com>
>
diff mbox series

Patch

diff --git a/NEWS b/NEWS
index c0131ceee..784fedfa0 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,8 @@  Post v24.03.0
     cloned to all unknown ports connected to the same Logical Switch.
   - Added a new logical switch port option "disable_arp_nd_rsp" to
     disable adding the ARP responder flows if set to true.
+  - IGMP_Group has new "protocol" column that displays the the group
+    protocol version.
 
 OVN v24.03.0 - xx xxx xxxx
 --------------------------
diff --git a/controller/ip-mcast.c b/controller/ip-mcast.c
index b457c7e69..0969cc07f 100644
--- a/controller/ip-mcast.c
+++ b/controller/ip-mcast.c
@@ -111,11 +111,12 @@  igmp_mrouter_create(struct ovsdb_idl_txn *idl_txn,
 }
 
 void
-igmp_group_update_ports(const struct sbrec_igmp_group *g,
+igmp_group_update(const struct sbrec_igmp_group *g,
                         struct ovsdb_idl_index *datapaths,
                         struct ovsdb_idl_index *port_bindings,
                         const struct mcast_snooping *ms OVS_UNUSED,
-                        const struct mcast_group *mc_group)
+                        const struct mcast_group *mc_group,
+                        const bool igmp_support_protocol)
     OVS_REQ_RDLOCK(ms->rwlock)
 {
     struct igmp_group_port *old_ports_storage =
@@ -155,6 +156,12 @@  igmp_group_update_ports(const struct sbrec_igmp_group *g,
         sbrec_igmp_group_update_ports_delvalue(g, igmp_port->port);
     }
 
+    /* set Group protocol */
+    if (igmp_support_protocol) {
+         sbrec_igmp_group_set_protocol(g, mcast_snooping_group_protocol_str(
+                                       mc_group->protocol_version));
+    }
+
     free(old_ports_storage);
     hmap_destroy(&old_ports);
 }
diff --git a/controller/ip-mcast.h b/controller/ip-mcast.h
index eebada968..026503139 100644
--- a/controller/ip-mcast.h
+++ b/controller/ip-mcast.h
@@ -47,11 +47,12 @@  struct sbrec_igmp_group *igmp_mrouter_create(
     const struct sbrec_chassis *chassis,
     bool igmp_group_has_chassis_name);
 
-void igmp_group_update_ports(const struct sbrec_igmp_group *g,
-                             struct ovsdb_idl_index *datapaths,
-                             struct ovsdb_idl_index *port_bindings,
-                             const struct mcast_snooping *ms,
-                             const struct mcast_group *mc_group)
+void igmp_group_update(const struct sbrec_igmp_group *g,
+                       struct ovsdb_idl_index *datapaths,
+                       struct ovsdb_idl_index *port_bindings,
+                       const struct mcast_snooping *ms,
+                       const struct mcast_group *mc_group,
+                       const bool igmp_support_protocol)
     OVS_REQ_RDLOCK(ms->rwlock);
 void
 igmp_mrouter_update_ports(const struct sbrec_igmp_group *g,
diff --git a/controller/pinctrl.c b/controller/pinctrl.c
index 98b29de9f..66e390e80 100644
--- a/controller/pinctrl.c
+++ b/controller/pinctrl.c
@@ -181,6 +181,7 @@  struct pinctrl {
     bool fdb_can_timestamp;
     bool dns_supports_ovn_owned;
     bool igmp_group_has_chassis_name;
+    bool igmp_support_protocol;
 };
 
 static struct pinctrl pinctrl;
@@ -3599,6 +3600,17 @@  pinctrl_update(const struct ovsdb_idl *idl, const char *br_int_name)
         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;
+
+        /* Notify pinctrl_handler that igmp protocol column
+         * availability has changed. */
+        notify_pinctrl_handler();
+    }
+
+
     ovs_mutex_unlock(&pinctrl_mutex);
 }
 
@@ -5409,9 +5421,9 @@  ip_mcast_sync(struct ovsdb_idl_txn *ovnsb_idl_txn,
                     chassis, pinctrl.igmp_group_has_chassis_name);
             }
 
-            igmp_group_update_ports(sbrec_igmp, sbrec_datapath_binding_by_key,
+            igmp_group_update(sbrec_igmp, sbrec_datapath_binding_by_key,
                                     sbrec_port_binding_by_key, ip_ms->ms,
-                                    mc_group);
+                                    mc_group, pinctrl.igmp_support_protocol);
         }
 
         /* Mrouters. */
diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
index b1be73cb2..3a5544b0c 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[] =
     {"chassis_name"};
 static const char *rbac_igmp_group_update[] =
-    {"address", "chassis", "datapath", "ports"};
+    {"address", "protocol", "chassis", "datapath", "ports"};
 static const char *rbac_bfd_auth[] =
     {"chassis_name"};
 static const char *rbac_bfd_update[] =
diff --git a/ovn-sb.ovsschema b/ovn-sb.ovsschema
index 84ae09515..b6c051ae6 100644
--- a/ovn-sb.ovsschema
+++ b/ovn-sb.ovsschema
@@ -1,7 +1,7 @@ 
 {
     "name": "OVN_Southbound",
-    "version": "20.33.0",
-    "cksum": "4076371179 31328",
+    "version": "20.34.0",
+    "cksum": "2786607656 31376",
     "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 ac4e585f2..4c26c6714 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 d26c95054..2c71370f1 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -22706,6 +22706,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])
@@ -22783,6 +22784,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.
@@ -23444,6 +23446,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