From b46d97e5aace245fcb09e6bac459ab414980853c Mon Sep 17 00:00:00 2001 From: Philo <135693886+philo-micas@users.noreply.github.com> Date: Tue, 15 Aug 2023 19:41:08 +0800 Subject: [PATCH 1/5] Add files via upload --- doc/bfd/images/vrrp.md | 437 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 437 insertions(+) create mode 100644 doc/bfd/images/vrrp.md diff --git a/doc/bfd/images/vrrp.md b/doc/bfd/images/vrrp.md new file mode 100644 index 00000000000..201465d0dc5 --- /dev/null +++ b/doc/bfd/images/vrrp.md @@ -0,0 +1,437 @@ +# Virtual Router Redundancy Protocol Adaptation HLD # + +## Table of Content + +- [Virtual Router Redundancy Protocol Adaptation HLD](#frr-isis-sonic-config-supportt) + - [Table of Content](#table-of-content) + - [Revision](#revision) + - [Scope](#scope) + - [Definitions/Abbreviations](#definitionsabbreviations) + - [Overview](#overview) + - [Requirements](#requirements) + - [Functional and Configuration Requirements](#functional-and-configuration-requirements) + - [Exemptions](#exemptions) + - [Architecture Design](#architecture-design) + - [High-Level Design](#high-level-design) + - [High-tgq](#high-tgq) + - [Design Overview](#design-overview) + - [Change Overview](#change-overview) + - [Container](#container) + - [SAI API](#sai-api) + - [Configuration and management](#configuration-and-management) + - [Manifest](#manifest) + - [CLI/YANG Model Enhancements](#cliyang-model-enhancements) + - [Config DB Enhancements](#config-db-enhancements) + - [Config DB Yang Model Changes](#config-db-yang-model-changes) + - [FRR Template Changes](#frr-template-changes) + - [Warmboot and Fastboot Design Impact](#warmboot-and-fastboot-design-impact) + - [Restrictions/Limitations](#restrictionslimitations) + - [Testing Requirements/Design](#testing-requirementsdesign) + - [Unit Test cases](#unit-test-cases) + - [System Test cases](#system-test-cases) + - [Open/Action items](#openaction-items) + +### Revision +| Rev | Date | Author | Change Description | +| :--- | :-------------- | :------ | :---------------- | +| 0.1 | Aug-16-2023 | Philo-micas | Initial version | + +### Scope + +This document describes the high level design of frr-vrrpd adaptation to SONiC. + +### Definitions/Abbreviations + +Table 1: Abbreviations + +| Abbreviation | Description | +| :---------- | :------------------------------------------------ | +| VRRP | Virtual Router Redundency Protocol | +| ARP | Address Resolution Protocol | +| FRR | Free Range Routing Stack | +| CLI | Command Line Interface | +| VMAC | Virtual MAC address | +| VIP | Virtual IP address | +| VRID | Virtual Router Identifier | +| VRRP Instance | An instance of VRRP state machine on an interface. Multiple VRRP state machines can be configured on an interface. | +| VRRP Owner | VRRP owner (of a VRRP instance) is the router whose virtual IP address is the same as the real interface IP address | + +### Overview + +FRR has already accomplished the VRRP protocol implementation. The implementation uses Linux macvlan devices to implement the shared virtual MAC feature of the protocol. However, so far, FRR-VRRP has not created these system interfaces. +This document provides a design for configuring Linux Macvlan devices in the SONiC infrastructure to enable FRR-VRRP functionality. + +### Requirements + +#### Functional Requirements + +Following requirements are addressed by the design presented in this document: + 1. Support VRRPv2(IPv4) and VRRPv3(IPv4 and IPv6) + 2. Support VRRP on Ethernet, VLAN and PortChannel interfaces + 3. Support interface configuration of multiple VRRP instances. + 4. Support configurable priority for VRRP instance + 5. Support configurable preempt mode for VRRP instance + 6. Support uplink interface tracking feature + +### Feature Description + +Each interface on which VRRP will be enabled must have at least one Macvlan device configured with the virtual MAC and placed in the proper operation mode. The addresses backed up by VRRP are assigned to these interfaces. +Suppose you have an interface eth0 with the following configuration: +``` +$ ip addr show eth0 +2: eth0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 + link/ether 02:17:45:00:aa:aa brd ff:ff:ff:ff:ff:ff + inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0 + valid_lft 72532sec preferred_lft 72532sec + inet6 fe80::17:45ff:fe00:aaaa/64 scope link + valid_lft forever preferred_lft forever +``` +Suppose that the IPv4 and IPv6 addresses you want to back up are 10.0.2.16 and 2001:db8::370:7334, and that they will be managed by the virtual router with id 5. A Macvlan device with the appropriate MAC address must be created before VRRP can begin to operate. +If you are using iproute2, the configuration is as follows: +``` +ip link add vrrp4-2-1 link eth0 addrgenmode random type macvlan mode bridge +ip link set dev vrrp4-2-1 address 00:00:5e:00:01:05 +ip addr add 10.0.2.16/24 dev vrrp4-2-1 +ip link set dev vrrp4-2-1 up + +ip link add vrrp6-2-1 link eth0 addrgenmode random type macvlan mode bridge +ip link set dev vrrp6-2-1 address 00:00:5e:00:02:05 +ip addr add 2001:db8::370:7334/64 dev vrrp6-2-1 +ip link set dev vrrp6-2-1 up +``` +The created interfaces will look like this: +``` +$ ip addr show vrrp4-2-1 +5: vrrp4-2-1@eth0: mtu 1500 qdisc noqueue state UP group default qlen 1000 + link/ether 00:00:5e:00:01:05 brd ff:ff:ff:ff:ff:ff + inet 10.0.2.16/24 scope global vrrp4-2-1 + valid_lft forever preferred_lft forever + inet6 fe80::dc56:d11a:e69d:ea72/64 scope link stable-privacy + valid_lft forever preferred_lft forever + +$ ip addr show vrrp6-2-1 +8: vrrp6-2-1@eth0: mtu 1500 qdisc noqueue state UP group default qlen 1000 + link/ether 00:00:5e:00:02:05 brd ff:ff:ff:ff:ff:ff + inet6 2001:db8::370:7334/64 scope global + valid_lft forever preferred_lft forever + inet6 fe80::f8b7:c9dd:a1e8:9844/64 scope link stable-privacy + valid_lft forever preferred_lft forever +``` +Using vrrp4-2-1 as an example, a few things to note about this interface: +- It is slaved to eth0; any packets transmitted on this interface will egress via eth0 +- Its MAC address is set to the VRRP IPv4 virtual MAC specified by the RFC for VRID 5 +- The link local address on the interface is not derived from the interface MAC + + + +#### Exemptions +Adding support for multi-linecard chassis is out of scope for this document. + +### Architecture Design + +There are no changes to the existing SONiC architecture. This new feature enhances existing code to include configuration support for the isisd daemon within the FRR container. Testing showed that with the isisd deamon enabled, ISIS routes are being learned directly from the FRR container without needing any changes to the existing orchagent or swss. It was observed that fpmsyncd works to push all of the ISIS learned routes from the FRR container to SONiC DB’s. + +### High-Level Design + +### High-tgq + +#### Design Overview + +This feature will extend functionality implemented in [SONiC FRR-BGP Extended Unified Configuration Management Framework](https://github.com/sonic-net/SONiC/blob/master/doc/mgmt/SONiC_Design_Doc_Unified_FRR_Mgmt_Interface.md) to support additional SONiC FRR-ISIS features. + +![FRR-BGP-Unified-mgmt-frmwrk](https://user-images.githubusercontent.com/114622132/222537856-eefb1a13-bcc0-495b-938a-7ea3abee0c18.png) + +Diagram 1. Diagram showing the existing framework that is being extended to include support for now ISIS config schemas. This diagram is taken from and further explained in it's original feature introduction in [SONiC FRR-BGP Extended Unified Configuration Management Framework](https://github.com/sonic-net/SONiC/blob/master/doc/mgmt/SONiC_Design_Doc_Unified_FRR_Mgmt_Interface.md) to support additional SONiC FRR-ISIS features. + +The Management framework will convert the YANG-based config data into requests that will write the configs into Redis DB. Redis DB events will trigger frrcfgd when the field frr_mgmt_framework_config set to "true" in the DEVICE_METADATA table, and then frrcfgd will configure FRR-ISIS using FRR CLI commands. + +#### Change Overview + +This enhancement will support FRR-ISIS features used in SONiC and all changes will reside in the sonic-buildimage repository. Changes include: + +- SONiC FRR-ISIS YANG models and YANG validation tests + - /src/sonic-yang-models +- FRR-ISIS config template files and isisd enabled by default in the FRR container + - /dockers/docker-fpm-frr +- Enable ISIS trap messages + - /files/image_config/copp +- Added support for ISIS tables in frrcfgd and extended frrcfgd unit tests for FRR-ISIS configs + - /src/sonic-frr-mgmt-framework +- Support ISIS show commands and show command unittests + - sonic-utilities/show + - sonic-utilities/tests + + +#### Container + +There will be changes in following containers, +- Extend frrcfgd support for FRR-ISIS + - sonic-mgmt-framework +- Enable the isisd daemon by default + - bgp + +### SAI API + +N/A - software feature + +### Configuration and management + +#### Manifest + +N/A + +#### CLI/YANG Model Enhancements + +New SONiC ISIS show commands + +|Command Description|CLI Command | +|:------------------|:-----------------| +|Show state information for all ISIS neighbors or a specified neighbor |show isis neighbors [system_id] {--verbose} | + +``` +sonic:~$ show isis neighbors +Area 1: + System Id Interface L State Holdtime SNPA +sonic1 PortChannel01202 Up 25 2020.2020.2020 +sonic2 PortChannel01212 Up 25 2020.2020.2020 +``` + +|Command Description|CLI Command | +|:------------------|:-----------------| +|Show the ISIS database globally or for a specific LSP |show isis database [lsp_id] {--verbose} | + +``` +sonic:~$ show isis database +Area 1: +IS-IS Level-2 link-state database: +LSP ID PduLen SeqNumber Chksum Holdtime ATT/P/OL +sonic1.00-00 1284 0x0000020e 0x3d7e 48072 0/0/0 +sonic1.00-01 197 0x00000136 0x4474 64797 0/0/0 +sonic2.00-00 1192 0x000001ae 0xd970 47837 0/0/0 +sonic2.00-01 367 0x00000136 0xe315 31986 0/0/0 +sonic3.00-00 1319 0x000001a9 0x3349 47881 0/0/0 +sonic3.00-00 1115 0x000002e7 0x1b38 54629 0/0/0 + 6 LSPs +``` + +|Command Description|CLI Command | +|:------------------|:-----------------| +|Show information about an ISIS node |show isis hostname | + +``` +sonic:~$ show isis hostname +vrf : default +Level System ID Dynamic Hostname +2 1000.2000.4000 sonic2 + * 1000.2000.3000 sonic +``` + +|Command Description|CLI Command | +|:------------------|:-----------------| +|Show state and configuration of ISIS for all interfaces or a specified interface |show isis interface [interface] {--verbose} {--display}| + +``` +sonic:~$ show isis interface +Area 1: + Interface CircId State Type Level + PortChannel01200x0 Up p2p L2 + +sonic:~$ show isis interface --display +[INTERFACE] options: ['Loopback0', 'Ethernet0', 'Ethernet4', 'Ethernet8', 'Ethernet12', 'Ethernet16', 'Ethernet20', 'Ethernet24', 'Ethernet28', 'Ethernet32', 'Ethernet36', 'Ethernet40', 'Ethernet44', 'Ethernet48', 'Ethernet52', 'Ethernet56', 'Ethernet60', 'Ethernet64', 'Ethernet68', 'Ethernet72', 'Ethernet76', 'Ethernet80', 'Ethernet84', 'Ethernet88', 'Ethernet92', 'Ethernet96', 'Ethernet100', 'Ethernet104', 'Ethernet108', 'Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124', 'PortChannel0002', 'PortChannel0003', 'PortChannel0120'] +Area 1: + Interface CircId State Type Level + PortChannel01200x0 Up p2p L2 +``` + +|Command Description|CLI Command | +|:------------------|:-----------------| +|Show topology IS-IS paths globally or for level-1 or level-2 specifically |show isis topology {--level-1} {--level-2} | + +``` +sonic:~$ show isis topology +Area 1: +IS-IS paths to level-2 routers that speak IP +Vertex Type Metric Next-Hop Interface Parent +sonic1 +172.20.53.0/31 IP internal 0 sonic1(4) +172.20.52.0/31 IP internal 0 sonic1(4) +sonic2 TE-IS 10 sonic2 PortChannel0121 sonic1(4) +10.3.159.80/32 IP TE 10 sonic2 PortChannel0121 sonic2(4) +10.3.159.81/32 IP TE 10 sonic2 PortChannel0121 sonic2(4) +...... +``` + +|Command Description|CLI Command | +|:------------------|:-----------------| +|Show summary of ISIS information |show isis summary | + +``` +sonic:~$ show isis summary +vrf : default +Process Id : 4663 +System Id : 0000.0000.0000 +Up time : 00:04:31 ago +Number of areas : 1 +Area 1: + Net: 10.0000.0000.0000.0000.0000.0000.0000.0000.0000.00 + TX counters per PDU type: + L2 IIH: 144 + L2 LSP: 4 + L2 CSNP: 29 + LSP RXMT: 0 + RX counters per PDU type: + L2 IIH: 143 + L2 LSP: 4 + Drop counters per PDU type: + L2 IIH: 1 + Advertise high metrics: Disabled + Level-1: + LSP0 regenerated: 3 + LSPs purged: 0 + SPF: + minimum interval : 1 + IPv4 route computation: + last run elapsed : 00:04:25 ago + last run duration : 111 usec + run count : 3 + IPv6 route computation: + last run elapsed : 00:04:25 ago + last run duration : 23 usec + run count : 3 + Level-2: + LSP0 regenerated: 4 + LSPs purged: 0 + SPF: + minimum interval : 1 + IPv4 route computation: + last run elapsed : 00:04:21 ago + last run duration : 45 usec + run count : 9 + IPv6 route computation: + last run elapsed : 00:04:21 ago + last run duration : 14 usec + run count : 9 +...... +``` + +|Command Description|CLI Command | +|:------------------|:-----------------| +|Show ISIS running configuration |show run isis {--verbose} {--config_db} {--namespace}| + +``` +sonic:~$ show run isis +"""Building configuration... +Current configuration: +! +frr version 8.2.2 +frr defaults traditional +hostname vlab-01 +log syslog informational +log facility local4 +no service integrated-vtysh-config +! +password zebra +enable password zebra +! +interface PortChannel101 + ip router isis 1 + ipv6 router isis 1 + isis network point-to-point +exit +! +router isis 1 + is-type level-2-only + net 49.0001.1720.1700.0002.00 + lsp-mtu 1383 + lsp-timers level-1 gen-interval 30 refresh-interval 900 max-lifetime 1200 + lsp-timers level-2 gen-interval 30 refresh-interval 305 max-lifetime 900 + log-adjacency-changes +exit +! +end + +sonic:~$ show run isis --config_db +{ + "ISIS_GLOBAL": { + "1": { + "net": "49.0001.1720.1700.0002.00", + "lsp_mtu_size": "1383", + "spf_time_to_learn": "25" + } + }, + "ISIS_LEVEL": { + "1|level-2": { + "lsp_refresh_interval": "305", + "lsp_maximum_lifetime": "900" + } + }, + "ISIS_INTERFACE": { + "1|PortChannel0101": { + "instance":"1", + "ifname": "PortChannel0120", + "network_type": "point-to-point", + "ipv4_routing_instance": "1", + "ipv6_routing_instance": "1", + } + } +} +``` + +#### Config DB Enhancements + +Following section describes the changes to DB. + +Added new configuration tables specific to FRR_ISIS features: + +- ISIS_GLOBAL + - ISIS router globally applicable configurations +- ISIS_LEVEL + - ISIS router level specific configurations +- ISIS_INTERFACE + - ISIS router interface specific configurations + +#### Config DB Yang Model Changes + +Detailed Yang model changes can be found at + + +- [ISIS Yang Model for SONiC High Level Design Document](https://github.com/sonic-net/SONiC/blob/073e72079bbeee3f454e65b817816c9c1bb955a0/doc/isis/frr-isis-sonic-yang-model-hld.md) + + +#### FRR Template Changes + +A new FRR-ISIS template, "isisd.conf.j2" has been made to support the non-integrated config management feature and will be saved in "/etc/frr/isisd.conf" on an FRR container startup. The FRR template, "frr.conf.j2" has been updated to include FRR-ISIS template file "isisd.conf.j2" to support the unified config managemnt feature. + +### Warmboot and Fastboot Design Impact + +There are no changes made to warmboot/fastboot impacting features. + +### Restrictions/Limitations + +When deleting or adding configs that have dependencies built within the yang models, those dependencies must be maintained while adding or deleting configs. If those dependencies are not met, frrcfgd may have trouble deleting the configs properly. + +### Testing Requirements/Design + +#### Unit Test cases + +Extended unit test cases to cover FRR-ISIS config features + - Test frrcfgd changes + - sonic-buildimage/src/sonic-frr-mgmt-framework/tests/test_config.py +- Test new ISIS YANG model Validation + - sonic-buildimage/src/sonic-yang-models/tests/test_sonic_yang_models.py + - sonic-buildimage/src/sonic-yang-models/tests/yang_model_tests/test_yang_model.py +- Test show commands for isis + - sonic-utilities/tests/isis_frr_test.py + +#### System Test cases +Extensive system test cases to cover FRR-ISIS config features +- Verify every YANG config input matches the desired FRR config output for frrcfgd + and template based configuration methods +- Verify configs can be deleted by config table name and individual fields +- Verify configs persist in the FRR container post container reboot + +New tests will also be published into sonic-mgmt for ISIS + +### Open/Action items + +Could the FRR container be renamed from 'bgp' to 'frr' ? From 157e21104f1b88811bb6eabcbb9b71acae5f8797 Mon Sep 17 00:00:00 2001 From: Philo <135693886+philo-micas@users.noreply.github.com> Date: Tue, 15 Aug 2023 19:44:00 +0800 Subject: [PATCH 2/5] Delete vrrp.md --- doc/bfd/images/vrrp.md | 437 ----------------------------------------- 1 file changed, 437 deletions(-) delete mode 100644 doc/bfd/images/vrrp.md diff --git a/doc/bfd/images/vrrp.md b/doc/bfd/images/vrrp.md deleted file mode 100644 index 201465d0dc5..00000000000 --- a/doc/bfd/images/vrrp.md +++ /dev/null @@ -1,437 +0,0 @@ -# Virtual Router Redundancy Protocol Adaptation HLD # - -## Table of Content - -- [Virtual Router Redundancy Protocol Adaptation HLD](#frr-isis-sonic-config-supportt) - - [Table of Content](#table-of-content) - - [Revision](#revision) - - [Scope](#scope) - - [Definitions/Abbreviations](#definitionsabbreviations) - - [Overview](#overview) - - [Requirements](#requirements) - - [Functional and Configuration Requirements](#functional-and-configuration-requirements) - - [Exemptions](#exemptions) - - [Architecture Design](#architecture-design) - - [High-Level Design](#high-level-design) - - [High-tgq](#high-tgq) - - [Design Overview](#design-overview) - - [Change Overview](#change-overview) - - [Container](#container) - - [SAI API](#sai-api) - - [Configuration and management](#configuration-and-management) - - [Manifest](#manifest) - - [CLI/YANG Model Enhancements](#cliyang-model-enhancements) - - [Config DB Enhancements](#config-db-enhancements) - - [Config DB Yang Model Changes](#config-db-yang-model-changes) - - [FRR Template Changes](#frr-template-changes) - - [Warmboot and Fastboot Design Impact](#warmboot-and-fastboot-design-impact) - - [Restrictions/Limitations](#restrictionslimitations) - - [Testing Requirements/Design](#testing-requirementsdesign) - - [Unit Test cases](#unit-test-cases) - - [System Test cases](#system-test-cases) - - [Open/Action items](#openaction-items) - -### Revision -| Rev | Date | Author | Change Description | -| :--- | :-------------- | :------ | :---------------- | -| 0.1 | Aug-16-2023 | Philo-micas | Initial version | - -### Scope - -This document describes the high level design of frr-vrrpd adaptation to SONiC. - -### Definitions/Abbreviations - -Table 1: Abbreviations - -| Abbreviation | Description | -| :---------- | :------------------------------------------------ | -| VRRP | Virtual Router Redundency Protocol | -| ARP | Address Resolution Protocol | -| FRR | Free Range Routing Stack | -| CLI | Command Line Interface | -| VMAC | Virtual MAC address | -| VIP | Virtual IP address | -| VRID | Virtual Router Identifier | -| VRRP Instance | An instance of VRRP state machine on an interface. Multiple VRRP state machines can be configured on an interface. | -| VRRP Owner | VRRP owner (of a VRRP instance) is the router whose virtual IP address is the same as the real interface IP address | - -### Overview - -FRR has already accomplished the VRRP protocol implementation. The implementation uses Linux macvlan devices to implement the shared virtual MAC feature of the protocol. However, so far, FRR-VRRP has not created these system interfaces. -This document provides a design for configuring Linux Macvlan devices in the SONiC infrastructure to enable FRR-VRRP functionality. - -### Requirements - -#### Functional Requirements - -Following requirements are addressed by the design presented in this document: - 1. Support VRRPv2(IPv4) and VRRPv3(IPv4 and IPv6) - 2. Support VRRP on Ethernet, VLAN and PortChannel interfaces - 3. Support interface configuration of multiple VRRP instances. - 4. Support configurable priority for VRRP instance - 5. Support configurable preempt mode for VRRP instance - 6. Support uplink interface tracking feature - -### Feature Description - -Each interface on which VRRP will be enabled must have at least one Macvlan device configured with the virtual MAC and placed in the proper operation mode. The addresses backed up by VRRP are assigned to these interfaces. -Suppose you have an interface eth0 with the following configuration: -``` -$ ip addr show eth0 -2: eth0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 - link/ether 02:17:45:00:aa:aa brd ff:ff:ff:ff:ff:ff - inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0 - valid_lft 72532sec preferred_lft 72532sec - inet6 fe80::17:45ff:fe00:aaaa/64 scope link - valid_lft forever preferred_lft forever -``` -Suppose that the IPv4 and IPv6 addresses you want to back up are 10.0.2.16 and 2001:db8::370:7334, and that they will be managed by the virtual router with id 5. A Macvlan device with the appropriate MAC address must be created before VRRP can begin to operate. -If you are using iproute2, the configuration is as follows: -``` -ip link add vrrp4-2-1 link eth0 addrgenmode random type macvlan mode bridge -ip link set dev vrrp4-2-1 address 00:00:5e:00:01:05 -ip addr add 10.0.2.16/24 dev vrrp4-2-1 -ip link set dev vrrp4-2-1 up - -ip link add vrrp6-2-1 link eth0 addrgenmode random type macvlan mode bridge -ip link set dev vrrp6-2-1 address 00:00:5e:00:02:05 -ip addr add 2001:db8::370:7334/64 dev vrrp6-2-1 -ip link set dev vrrp6-2-1 up -``` -The created interfaces will look like this: -``` -$ ip addr show vrrp4-2-1 -5: vrrp4-2-1@eth0: mtu 1500 qdisc noqueue state UP group default qlen 1000 - link/ether 00:00:5e:00:01:05 brd ff:ff:ff:ff:ff:ff - inet 10.0.2.16/24 scope global vrrp4-2-1 - valid_lft forever preferred_lft forever - inet6 fe80::dc56:d11a:e69d:ea72/64 scope link stable-privacy - valid_lft forever preferred_lft forever - -$ ip addr show vrrp6-2-1 -8: vrrp6-2-1@eth0: mtu 1500 qdisc noqueue state UP group default qlen 1000 - link/ether 00:00:5e:00:02:05 brd ff:ff:ff:ff:ff:ff - inet6 2001:db8::370:7334/64 scope global - valid_lft forever preferred_lft forever - inet6 fe80::f8b7:c9dd:a1e8:9844/64 scope link stable-privacy - valid_lft forever preferred_lft forever -``` -Using vrrp4-2-1 as an example, a few things to note about this interface: -- It is slaved to eth0; any packets transmitted on this interface will egress via eth0 -- Its MAC address is set to the VRRP IPv4 virtual MAC specified by the RFC for VRID 5 -- The link local address on the interface is not derived from the interface MAC - - - -#### Exemptions -Adding support for multi-linecard chassis is out of scope for this document. - -### Architecture Design - -There are no changes to the existing SONiC architecture. This new feature enhances existing code to include configuration support for the isisd daemon within the FRR container. Testing showed that with the isisd deamon enabled, ISIS routes are being learned directly from the FRR container without needing any changes to the existing orchagent or swss. It was observed that fpmsyncd works to push all of the ISIS learned routes from the FRR container to SONiC DB’s. - -### High-Level Design - -### High-tgq - -#### Design Overview - -This feature will extend functionality implemented in [SONiC FRR-BGP Extended Unified Configuration Management Framework](https://github.com/sonic-net/SONiC/blob/master/doc/mgmt/SONiC_Design_Doc_Unified_FRR_Mgmt_Interface.md) to support additional SONiC FRR-ISIS features. - -![FRR-BGP-Unified-mgmt-frmwrk](https://user-images.githubusercontent.com/114622132/222537856-eefb1a13-bcc0-495b-938a-7ea3abee0c18.png) - -Diagram 1. Diagram showing the existing framework that is being extended to include support for now ISIS config schemas. This diagram is taken from and further explained in it's original feature introduction in [SONiC FRR-BGP Extended Unified Configuration Management Framework](https://github.com/sonic-net/SONiC/blob/master/doc/mgmt/SONiC_Design_Doc_Unified_FRR_Mgmt_Interface.md) to support additional SONiC FRR-ISIS features. - -The Management framework will convert the YANG-based config data into requests that will write the configs into Redis DB. Redis DB events will trigger frrcfgd when the field frr_mgmt_framework_config set to "true" in the DEVICE_METADATA table, and then frrcfgd will configure FRR-ISIS using FRR CLI commands. - -#### Change Overview - -This enhancement will support FRR-ISIS features used in SONiC and all changes will reside in the sonic-buildimage repository. Changes include: - -- SONiC FRR-ISIS YANG models and YANG validation tests - - /src/sonic-yang-models -- FRR-ISIS config template files and isisd enabled by default in the FRR container - - /dockers/docker-fpm-frr -- Enable ISIS trap messages - - /files/image_config/copp -- Added support for ISIS tables in frrcfgd and extended frrcfgd unit tests for FRR-ISIS configs - - /src/sonic-frr-mgmt-framework -- Support ISIS show commands and show command unittests - - sonic-utilities/show - - sonic-utilities/tests - - -#### Container - -There will be changes in following containers, -- Extend frrcfgd support for FRR-ISIS - - sonic-mgmt-framework -- Enable the isisd daemon by default - - bgp - -### SAI API - -N/A - software feature - -### Configuration and management - -#### Manifest - -N/A - -#### CLI/YANG Model Enhancements - -New SONiC ISIS show commands - -|Command Description|CLI Command | -|:------------------|:-----------------| -|Show state information for all ISIS neighbors or a specified neighbor |show isis neighbors [system_id] {--verbose} | - -``` -sonic:~$ show isis neighbors -Area 1: - System Id Interface L State Holdtime SNPA -sonic1 PortChannel01202 Up 25 2020.2020.2020 -sonic2 PortChannel01212 Up 25 2020.2020.2020 -``` - -|Command Description|CLI Command | -|:------------------|:-----------------| -|Show the ISIS database globally or for a specific LSP |show isis database [lsp_id] {--verbose} | - -``` -sonic:~$ show isis database -Area 1: -IS-IS Level-2 link-state database: -LSP ID PduLen SeqNumber Chksum Holdtime ATT/P/OL -sonic1.00-00 1284 0x0000020e 0x3d7e 48072 0/0/0 -sonic1.00-01 197 0x00000136 0x4474 64797 0/0/0 -sonic2.00-00 1192 0x000001ae 0xd970 47837 0/0/0 -sonic2.00-01 367 0x00000136 0xe315 31986 0/0/0 -sonic3.00-00 1319 0x000001a9 0x3349 47881 0/0/0 -sonic3.00-00 1115 0x000002e7 0x1b38 54629 0/0/0 - 6 LSPs -``` - -|Command Description|CLI Command | -|:------------------|:-----------------| -|Show information about an ISIS node |show isis hostname | - -``` -sonic:~$ show isis hostname -vrf : default -Level System ID Dynamic Hostname -2 1000.2000.4000 sonic2 - * 1000.2000.3000 sonic -``` - -|Command Description|CLI Command | -|:------------------|:-----------------| -|Show state and configuration of ISIS for all interfaces or a specified interface |show isis interface [interface] {--verbose} {--display}| - -``` -sonic:~$ show isis interface -Area 1: - Interface CircId State Type Level - PortChannel01200x0 Up p2p L2 - -sonic:~$ show isis interface --display -[INTERFACE] options: ['Loopback0', 'Ethernet0', 'Ethernet4', 'Ethernet8', 'Ethernet12', 'Ethernet16', 'Ethernet20', 'Ethernet24', 'Ethernet28', 'Ethernet32', 'Ethernet36', 'Ethernet40', 'Ethernet44', 'Ethernet48', 'Ethernet52', 'Ethernet56', 'Ethernet60', 'Ethernet64', 'Ethernet68', 'Ethernet72', 'Ethernet76', 'Ethernet80', 'Ethernet84', 'Ethernet88', 'Ethernet92', 'Ethernet96', 'Ethernet100', 'Ethernet104', 'Ethernet108', 'Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124', 'PortChannel0002', 'PortChannel0003', 'PortChannel0120'] -Area 1: - Interface CircId State Type Level - PortChannel01200x0 Up p2p L2 -``` - -|Command Description|CLI Command | -|:------------------|:-----------------| -|Show topology IS-IS paths globally or for level-1 or level-2 specifically |show isis topology {--level-1} {--level-2} | - -``` -sonic:~$ show isis topology -Area 1: -IS-IS paths to level-2 routers that speak IP -Vertex Type Metric Next-Hop Interface Parent -sonic1 -172.20.53.0/31 IP internal 0 sonic1(4) -172.20.52.0/31 IP internal 0 sonic1(4) -sonic2 TE-IS 10 sonic2 PortChannel0121 sonic1(4) -10.3.159.80/32 IP TE 10 sonic2 PortChannel0121 sonic2(4) -10.3.159.81/32 IP TE 10 sonic2 PortChannel0121 sonic2(4) -...... -``` - -|Command Description|CLI Command | -|:------------------|:-----------------| -|Show summary of ISIS information |show isis summary | - -``` -sonic:~$ show isis summary -vrf : default -Process Id : 4663 -System Id : 0000.0000.0000 -Up time : 00:04:31 ago -Number of areas : 1 -Area 1: - Net: 10.0000.0000.0000.0000.0000.0000.0000.0000.0000.00 - TX counters per PDU type: - L2 IIH: 144 - L2 LSP: 4 - L2 CSNP: 29 - LSP RXMT: 0 - RX counters per PDU type: - L2 IIH: 143 - L2 LSP: 4 - Drop counters per PDU type: - L2 IIH: 1 - Advertise high metrics: Disabled - Level-1: - LSP0 regenerated: 3 - LSPs purged: 0 - SPF: - minimum interval : 1 - IPv4 route computation: - last run elapsed : 00:04:25 ago - last run duration : 111 usec - run count : 3 - IPv6 route computation: - last run elapsed : 00:04:25 ago - last run duration : 23 usec - run count : 3 - Level-2: - LSP0 regenerated: 4 - LSPs purged: 0 - SPF: - minimum interval : 1 - IPv4 route computation: - last run elapsed : 00:04:21 ago - last run duration : 45 usec - run count : 9 - IPv6 route computation: - last run elapsed : 00:04:21 ago - last run duration : 14 usec - run count : 9 -...... -``` - -|Command Description|CLI Command | -|:------------------|:-----------------| -|Show ISIS running configuration |show run isis {--verbose} {--config_db} {--namespace}| - -``` -sonic:~$ show run isis -"""Building configuration... -Current configuration: -! -frr version 8.2.2 -frr defaults traditional -hostname vlab-01 -log syslog informational -log facility local4 -no service integrated-vtysh-config -! -password zebra -enable password zebra -! -interface PortChannel101 - ip router isis 1 - ipv6 router isis 1 - isis network point-to-point -exit -! -router isis 1 - is-type level-2-only - net 49.0001.1720.1700.0002.00 - lsp-mtu 1383 - lsp-timers level-1 gen-interval 30 refresh-interval 900 max-lifetime 1200 - lsp-timers level-2 gen-interval 30 refresh-interval 305 max-lifetime 900 - log-adjacency-changes -exit -! -end - -sonic:~$ show run isis --config_db -{ - "ISIS_GLOBAL": { - "1": { - "net": "49.0001.1720.1700.0002.00", - "lsp_mtu_size": "1383", - "spf_time_to_learn": "25" - } - }, - "ISIS_LEVEL": { - "1|level-2": { - "lsp_refresh_interval": "305", - "lsp_maximum_lifetime": "900" - } - }, - "ISIS_INTERFACE": { - "1|PortChannel0101": { - "instance":"1", - "ifname": "PortChannel0120", - "network_type": "point-to-point", - "ipv4_routing_instance": "1", - "ipv6_routing_instance": "1", - } - } -} -``` - -#### Config DB Enhancements - -Following section describes the changes to DB. - -Added new configuration tables specific to FRR_ISIS features: - -- ISIS_GLOBAL - - ISIS router globally applicable configurations -- ISIS_LEVEL - - ISIS router level specific configurations -- ISIS_INTERFACE - - ISIS router interface specific configurations - -#### Config DB Yang Model Changes - -Detailed Yang model changes can be found at - - -- [ISIS Yang Model for SONiC High Level Design Document](https://github.com/sonic-net/SONiC/blob/073e72079bbeee3f454e65b817816c9c1bb955a0/doc/isis/frr-isis-sonic-yang-model-hld.md) - - -#### FRR Template Changes - -A new FRR-ISIS template, "isisd.conf.j2" has been made to support the non-integrated config management feature and will be saved in "/etc/frr/isisd.conf" on an FRR container startup. The FRR template, "frr.conf.j2" has been updated to include FRR-ISIS template file "isisd.conf.j2" to support the unified config managemnt feature. - -### Warmboot and Fastboot Design Impact - -There are no changes made to warmboot/fastboot impacting features. - -### Restrictions/Limitations - -When deleting or adding configs that have dependencies built within the yang models, those dependencies must be maintained while adding or deleting configs. If those dependencies are not met, frrcfgd may have trouble deleting the configs properly. - -### Testing Requirements/Design - -#### Unit Test cases - -Extended unit test cases to cover FRR-ISIS config features - - Test frrcfgd changes - - sonic-buildimage/src/sonic-frr-mgmt-framework/tests/test_config.py -- Test new ISIS YANG model Validation - - sonic-buildimage/src/sonic-yang-models/tests/test_sonic_yang_models.py - - sonic-buildimage/src/sonic-yang-models/tests/yang_model_tests/test_yang_model.py -- Test show commands for isis - - sonic-utilities/tests/isis_frr_test.py - -#### System Test cases -Extensive system test cases to cover FRR-ISIS config features -- Verify every YANG config input matches the desired FRR config output for frrcfgd - and template based configuration methods -- Verify configs can be deleted by config table name and individual fields -- Verify configs persist in the FRR container post container reboot - -New tests will also be published into sonic-mgmt for ISIS - -### Open/Action items - -Could the FRR container be renamed from 'bgp' to 'frr' ? From 7da3d9395d8eacac15f6150e2929e1875c6b9acb Mon Sep 17 00:00:00 2001 From: philo Date: Sat, 14 Sep 2024 14:14:15 +0800 Subject: [PATCH 3/5] Update IPMC HLD Signed-off-by: philo --- doc/ipmc/IPMC_Data_Plane_HLD.md | 472 ++++++++++++++++++++++++++ doc/ipmc/images/add_ipmc_entry.png | Bin 0 -> 29001 bytes doc/ipmc/images/ipmc_components.png | Bin 0 -> 31488 bytes doc/ipmc/images/ipmc_components2.png | Bin 0 -> 29341 bytes doc/ipmc/images/ipmc_warm_reboot.png | Bin 0 -> 21240 bytes doc/ipmc/images/ipmc_warm_reboot2.png | Bin 0 -> 9975 bytes 6 files changed, 472 insertions(+) create mode 100644 doc/ipmc/IPMC_Data_Plane_HLD.md create mode 100644 doc/ipmc/images/add_ipmc_entry.png create mode 100644 doc/ipmc/images/ipmc_components.png create mode 100644 doc/ipmc/images/ipmc_components2.png create mode 100644 doc/ipmc/images/ipmc_warm_reboot.png create mode 100644 doc/ipmc/images/ipmc_warm_reboot2.png diff --git a/doc/ipmc/IPMC_Data_Plane_HLD.md b/doc/ipmc/IPMC_Data_Plane_HLD.md new file mode 100644 index 00000000000..98b4b4c3242 --- /dev/null +++ b/doc/ipmc/IPMC_Data_Plane_HLD.md @@ -0,0 +1,472 @@ +# IPMC data plane HLD + +## Table of Content + +- [IPMC Data Plane HLD](#ipmc-data-plane-hld) + - [Table of Content](#table-of-content) + - [Revision](#revision) + - [Scope](#scope) + - [Definitions/Abbreviations](#definitionsabbreviations) + - [Overview](#overview) + - [Requirements](#requirements) + - [Functional Requirements](#functional-requirements) + - [Configuration and Management Requirements](#configuration-and-management-requirements) + - [Architecture Design](#architecture-design) + - [High-Level Design](#high-level-design) + - [Read IP multicast routes from the kernel](#read-ip-multicast-routes-from-the-kernel) + - [DB Changes](#db-changes) + - [APPL_DB changes](#appl_db-changes) + - [SWSS Container](#swss-container) + - [mgmanager](#mgmanager) + - [Warm reboot requirements](#warm-reboot-requirements) + - [Sequence diagram](#sequence-diagram) + - [Scalability and performance requirements](#scalability-and-performance-requirements) + - [SAI API](#sai-api) + - [Configuration and management](#configuration-and-management) + - [Manifest](#manifest) + - [CLI/YANG model Enhancements](#cliyang-model-enhancements) + - [Interface Yang Model](#interface-yang-model) + - [IPMC commands](#ipmc-commands) + - [Config commads](#config-commads) + - [Show commands](#show-commands) + - [Config DB Enhancements](#config-db-enhancements) + - [Warmboot and Fastboot Design Impact](#warmboot-and-fastboot-design-impact) + - [Restrictions/Limitations](#restrictionslimitations) + - [Testing Requirements/Design](#testing-requirementsdesign) + - [Unit Test cases](#unit-test-cases) + - [System Test cases](#system-test-cases) + - [Open/Action items](#openaction-items) + +### Revision + +| Rev | Date | Author | Change Description | +| :--- | :--------------- | :------------- | :---------------- | +| 0.1 | Aug-13-2024 | Hb-micas | Initial version | + +### Scope + +This document describes how to implement the IPMC data plane feature in SONiC infrastructure. + +- This document only discusses the SONiC data plane integration with IPMC functionality +- Other multicast routing protocols that use the PIM protocol (or other network protocols) are beyond the scope of this document + +### Definitions/Abbreviations + +Table 1: Abbreviations + +| Abbreviation | Description | +| :---------- | :------------------------------------------------ | +| FRR | Free Range Routing Stack | +| CLI | Command Line Interface | +| ASM | Any-Source Multicast | +| SSM | Source-Specific Multicast | +| RPF | Reverse Path Forwarding | +| IPMC | IP Multicast | +| Mroute | Multicast Route | +| Nhg | NextHop Group | + +### Overview + +IP multicast is a network communication technique that allows a single sender to send packets to multiple destinations without having to send packets separately for each destination. This method greatly saves bandwidth resources and improves the efficiency of the network. For different Multicast group members, Multicast service models can be divided into ASM(Any-Source multicast) and SSM(Source-Specific multicast) service models. To ensure efficient transmission of multicast data, IP multicast uses the RPF (Reverse Path Forwarding) mechanism. + +Routers dynamically establish forwarding tables through protocols (such as IGMP, PIM, MSDP, etc.) and maintain a multicast forwarding table, recording the membership of the multicast group and the corresponding outbound interface. + +Multicast packets target a specific multicast address (224.0.0.0/4 for ipv4 and FF00::/8 for ipv6). + +### Requirements + +#### Functional Requirements + +The following requirements are addressed by the design presented in this document: + +1. Support IP multicast routing: ASM or SSM +2. Support IPv4 and IPv6 multicast routes +3. Support IP multicast function for routing interfaces, SVI interfaces, L3 subinterfaces, and L3 Portchannel interfaces +4. Support non-default VRF for IP multicast routes +5. Support warm reboot for IP multicast routes + +#### Configuration and Management Requirements + +This document proposes that configuration and management should meet the following: + +1. Enable IP multicast on interfaces + + > The default interface is not enabled to forward multicast routes + +### Architecture Design + +This document is designed to integrate the IP multicast routing function into the SWSS Container, so that related components can support IP multicast routing installing and warm reboot functions, and finally support the IP multicast routing function at the chip level. + +In SONiC, unicast routes and ECMP routes are sent via the fpm component to the APPL DB for further processing on the data plane. However, for IP multicast routing, the FRR Container has not passed the IP multicast routing data to the fpm component. + +The frr-pimd/pim6d daemon process is introduced in the FRR Container, in order to learn IP multicast routes under the PIM protocol and install IP multicast routes to the kernel. + +For the implementation of the data plane, firstly, the fpm component does not support IP multicast routing right now; secondly, in order to support more IP multicast protocols as much as possible; thirdly, the implementation and support of FRR Container are beyond the design scope of this document, so the design will use Linux kernel as multicast route source. + +In ECMP routing, there is already a very elegant nexthop group design and implementation, so for IP multicast routing reference this design uses mgmanager to manage the ipmc group and rpf group. + +The following diagram summarizes the key structure of IPMC functionality in SONiC (The abbreviation of FRR Container is frr-pimd): + +![IPMC main structure1](images/ipmc_components.png "Figure 1: IPMC main structure") + +Figure 1. IPMC main structure. + +### High-Level Design + +#### Read IP multicast routes from the kernel + +When obtaining kernel IP multicast routing information through NetLink, you need to listen to the corresponding message type: + +Listen for NetLink message group type + +```text +RTNLGRP_IPV4_MROUTE +RTNLGRP_IPV6_MROUTE +``` + +Listens for the netlink message type + +```text +RTM_NEWROUTE +RTM_DELROUTE +``` + +The obtained routing information family should be of multicast type + +```text +RTNL_FAMILY_IPMR +``` + +#### DB Changes + +##### APPL_DB changes + +Special note: + +1. The multicast route has one more key field than other routes: the source IP address. Therefore, the multicast route cannot share the same TABLE with the original routing entries +2. When delivering an ipv6 multicast route, assume that both the source and destination IP addresses are ipv6. If the default delimiter of APPL DB ':' is used, the two ipv6 addresses cannot be distinguished by delimiter. Therefore, the delimiter '|' is used here. + +MROUTE_TABLE + +Producer: mroutesyncd + +Consumer: mrouteorch + +Description: A table was added to store IP multicast routing data. One entry corresponds to one multicast route. + +Schema: + +```SQL +; New table +; Store IP multicast routing data + +key = MROUTE_TABLE:vrf_name|source_ip|dest_ip + ; APPL DB usually uses ':' as the separator, but '|' is chosen here. + ; The reason is that when the ip address is ipv6, using ':' cannot distinguish two ipv6 addresses + vrf_name ; The multicast route belongs to the Vrf. If this field is empty, the default global Vrf is used + source_ip ; Source IP addresses of multicast routes, for example, IPv4 0.0.0.0(ASM), A.B.C.D(SSM) + dest_ip ; Indicates the destination IP address of the multicast route + +; field = value +incoming_group = router_intfs_group ; IP multicast routes into an interface member group, which can be empty or have multiple members. Each member is separated by commas ',' +outgoing_group = router_intfs_group ; The IP multicast route outgoing interface member group, which cannot be empty. It can have one or more members. Each member is separated by commas ',' +``` + +Example: + +```bash +admin@sonic:~$ redis-cli -n 4 hgetall "MROUTE_TABLE|0.0.0.0|225.0.0.1" +1) "incoming_group" +2) "Ethernet1" +3) "outgoing_group" +4) "Ethernet13,Ethernet15" +``` + +```bash +admin@sonic:~$ redis-cli -n 0 hgetall "MROUTE_TABLE:192.168.1.200|230.0.0.1" +1) "incoming_group" +2) "Ethernet49" +3) "outgoing_group" +4) "Ethernet39,Ethernet65,Vlan200" +``` + +#### SWSS Container + +mroutesyncd + +- Reads IP multicast routing messages from the kernel and listens for IP multicast routing changes in the kernel +- Based on netlink messages, the source IP address, destination IP address, inbound interface member, and outbound member of the IP multicast route are resolved and written into the APPL DB +- During a warm reboot, compare the kernel multicast route and APPL DB data to update the warm reboot data + +intfsorch + +- Listens to INTF_TABLE in the APPL DB and enables the IP multicast forwarding function of the corresponding routing interface + +mgmanager + +- IP Multicast route encapsulation management of incoming and outgoing interface groups +- Encapsulate and manage the creation, modification, and deletion of rpf group and ipmc group +- Implement rpf/ipmc group and member reference counting, exception handling, and other behaviors +- Internally invoke the SAI API of the rpf/ipmc group and member. For details about the SAI API, see the following +- Provides external query and update interfaces for the rpf/ipmc group + +mrouteorch + +- Listens to MROUTE_TABLE in the APPL DB and queries the corresponding rpf group and ipmc group +- Associate the corresponding rpf group and ipmc group IDs, and invoke the SAI API to create IP multicast routes. + +#### mgmanager + +Follow the nexthop group design, and manage the Group and Members separately: +> The reason why the nexthop group is not used directly, is that the nhg has been strongly coupled with SAI API when it is implemented. The multicast routing services cannot be reused. +> In addition, nhg IDs are often referenced by other businesses, so abstracting a single mgmanager can also avoid misuse by unfamiliar businesses + +- The MgManager exposes group query and management interfaces +- Internally, RpfMember and RpfGroup manage reference counting and exception handling, invoke the SAI API to generate the corresponding group id + +#### Warm reboot requirements + +This document mainly considers the data plane IP multicast routing function data plane warm reboot: + +The warm reboot support for the protocol plane is not in the design scope. In this case, the IP multicast route obtained from the kernel can be regarded as the latest routing data on the data plane. + +1. The data plane is warm rebooted +2. mroutesycnd reads the kernel IP multicast routing information and sends it to the common warm reboot component for comparison +3. The warm reboot component writes the data to be updated to the APPL DB to complete the IP multicast route update +4. The warm reboot of the data plane is complete + +#### Sequence diagram + +Add an IP multicast route (simplify the protocol plane into an FRR component for description. In actual situations, the selection of the protocol plane may be different): + +![Add new IP multicast routes](images/add_ipmc_entry.png "Figure 1: Add new IP multicast routes") + +Figure 3. Add new IP multicast routes. + +Warm Reboot: + +![IP multicast routes warm reboot](images/ipmc_warm_reboot2.png "Figure 1: IP multicast routes warm reboot") + +Figure 4. IP multicast routes warm reboot. + +#### Scalability and performance requirements + +In terms of capacity, the SAI API does not implement a query interface for the capacity of IP multicast routes and multicast member groups like ECMP routes. Therefore, the relevant capacity is not restricted. However, the device must continue to run normally in scenarios where the capacity is exceeded. +In terms of performance, because the SAI API does not define batch installation of bulk interfaces, IP multicast routes can only be delivered by invoking the SAI API one by one. + +### SAI API + +The SAI API invocation of IP multicast routing is similar to ECMP routing. A group is created and a member is added. Then, the created rpf group, ipmc group, source IP address, and destination IP address will be bound. +> Because the SAI API does not yet implement a capacity query interface like ECMP routing, this document is also left blank for IP multicast routing capacity-related processes and interfaces. + +In simple terms: +> Use sai_ipmc_group_api to create nexthop groups and members +> Use sai_rpf_group_api to create rpf groups and members +> Use sai_ipmc_api, source IP address, destination IP address, ipmc group id, and rpf group id to create IP multicast routes + +The SAI API involved is as follows: +| SAI API | SAI attributes | +| ---------------------------------------------------- | -------------- | +| sai_router_intfs_api->set_router_interface_attribute | SAI_ROUTER_INTERFACE_ATTR_V4_MCAST_ENABLE
SAI_ROUTER_INTERFACE_ATTR_V6_MCAST_ENABLE | +| sai_rpf_group_api->create_rpf_group | NULL | +| sai_ipmc_group_api->create_ipmc_group_member | SAI_RPF_GROUP_MEMBER_ATTR_RPF_GROUP_ID
SAI_RPF_GROUP_MEMBER_ATTR_RPF_INTERFACE_ID | +| sai_rpf_group_api->create_ipmc_group | NULL | +| sai_ipmc_group_api->create_ipmc_group_member | SAI_IPMC_GROUP_MEMBER_ATTR_IPMC_GROUP_ID
SAI_IPMC_GROUP_MEMBER_ATTR_IPMC_OUTPUT_ID | +| sai_ipmc_api->create_ipmc_entry | SAI_IPMC_ENTRY_ATTR_OUTPUT_GROUP_ID
SAI_IPMC_ENTRY_ATTR_PACKET_ACTION
SAI_IPMC_ENTRY_ATTR_RPF_GROUP_ID | + +Example of enabling ipv4 ipmc packet forwarding: + +```c++ + sai_attribute_t attr; + attr.value.booldata = mcast_status; + + attr.id = SAI_ROUTER_INTERFACE_ATTR_V4_MCAST_ENABLE; + sai_status_t status = sai_router_intfs_api->set_router_interface_attribute(port.m_rif_id, &attr); +``` + +Example of creating an ipmc group member: + +```c++ +sai_attribute_t ipmc_entry_attr; +vector ipmc_entry_attrs; + +ipmc_entry_attr.id = SAI_IPMC_GROUP_MEMBER_ATTR_IPMC_GROUP_ID; +ipmc_entry_attr.value.oid = group_id; +ipmc_entry_attrs.push_back(ipmc_entry_attr); + +ipmc_entry_attr.id = SAI_IPMC_GROUP_MEMBER_ATTR_IPMC_OUTPUT_ID; +ipmc_entry_attr.value.oid = m_rif; +ipmc_entry_attrs.push_back(ipmc_entry_attr); +sai_status_t status = sai_ipmc_group_api->create_ipmc_group_member(&m_id, gSwitchId, (uint32_t)ipmc_entry_attrs.size(), ipmc_entry_attrs.data()); +``` + +Example of creating an ipmc route: + +```c++ +sai_attribute_t ipmc_entry_attr; +vector ipmc_entry_attrs; +sai_ipmc_entry_t ipmc_entry; +ipmc_entry_attr.id = SAI_IPMC_ENTRY_ATTR_OUTPUT_GROUP_ID; +ipmc_entry_attr.value.oid = ipmc_group_id; +ipmc_entry_attrs.push_back(ipmc_entry_attr); + +ipmc_entry_attr.id = SAI_IPMC_ENTRY_ATTR_PACKET_ACTION; +ipmc_entry_attr.value.oid = SAI_PACKET_ACTION_FORWARD; +ipmc_entry_attrs.push_back(ipmc_entry_attr); + +ipmc_entry_attr.id = SAI_IPMC_ENTRY_ATTR_RPF_GROUP_ID; +ipmc_entry_attr.value.oid = rpf_group_id; +ipmc_entry_attrs.push_back(ipmc_entry_attr); + +ipmc_entry.vr_id = vrf_id; +ipmc_entry.switch_id = gSwitchId; +ipmc_entry.type = src_ip.isZero() ? SAI_IPMC_ENTRY_TYPE_XG : SAI_IPMC_ENTRY_TYPE_SG; +copy(ipmc_entry.source, src_ip); +ipmc_entry.source.addr_family = SAI_IP_ADDR_FAMILY_IPV4; +copy(ipmc_entry.destination, dest_ip); +ipmc_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4; + +sai_status_t status = sai_ipmc_api->create_ipmc_entry(&ipmc_entry, (uint32_t)ipmc_entry_attrs.size(), ipmc_entry_attrs.data()); +``` + +### Configuration and management + +#### Manifest + +N/A + +#### CLI/YANG model Enhancements + +The IPMC forwarding function is enabled on the interface + +##### Interface Yang Model + +Revised sonic-interface.yang to add ipmc_forward field + +```yang +container INTERFACE { +.. + leaf ipmc_forward { + description "enable/disable ipmc forward for the interface"; + type enumeration { + enum enable; + enum disable; + } + } +.. +} +``` + +##### IPMC commands + +SONIC Click-based configuration and monitoring CLIs have been introduced in SONIC for interface ipmc + +###### Config commands + +```python +config interface ipmc +``` + +- Run this command to enable or disable IP multicast packet forwarding on an interface +- interface_name: interface name (Ethernet/Vlan/PortChannel/sub-interface) +- ipmc_forward: enable the IP multicast packet forwarding function + +###### Show commands + +```python +show interface ipmc { } +``` + +- Run the IP multicast packet forwarding command to show the configuration of the multicast packet forwarding function on the interface + +#### Config DB Enhancements + +INTERFACE_TABLE + +Producer: config manager + +Consumer: intfmgrd + +Description: Added a field to check whether the ip multicast forwarding has been enabled or not. + +Schema: + +```sql +;Modify table +;The field of enabling ip multicast forwarding is added + +key = INTERFACE|interface_name + ; Interface name string like Vlan1 or PortChannel002 or Ethernet4 +; field = value +.. +ipmc_forward = "enable"/"disable" ; Whether to enable ip multicast forwarding on the interface. The default value is disable +.. +``` + +Example: + +```bash +admin@sonic:~$ redis-cli -n 4 hgetall "INTERFACE|Ethernet3" +1) "ipmc_forward" +2) "enable" +``` + +### Warmboot and Fastboot Design Impact + +The IPMC function's warm reboot relies on the warm reboot of the protocol plane. That is, the protocol plane is required to maintain the original IP multicast route during the warm reboot and update the changed IP multicast route after the warm reboot is complete (warm reboot support for protocol plane is not in the design scope). + +The warm reboot of the data plane uses a common warm reboot component to compare the kernel IP multicast route with the IP multicast route of the APPL DB, to ensure that the warm reboot does not affect data forwarding. + +### Restrictions/Limitations + +Due to SAI API restrictions, the following functions are not supported: + +1. Query the capacity of the IP multicast route. Query the capacity of the IP multicast route in and out interface groups +2. IP multicast routes bulk API + +The protocol plane must also support the warm reboot function to ensure uninterrupted flow during the warm reboot process + +### Testing Requirements/Design + +#### Unit Test cases + +Unit test cases for this specification are listed below: + +| Test Cases | UT Action and observation | Remarks | +| :----------------- | :------------------------------------------------------------------------------------------------------------------------------------ | :------ | +| Configuration | Verify the Ethernet/Vlan/PortChannel interface enable IP group broadcast forwarding function | | +| IP multicast route | Verify that the protocol plane creates/deletes/updates IP multicast routes, and the data plane can receive and process them normally | | +| | Verify that ASM-type multicast routes are created or deleted | | +| | The SSM type multicast route was created or deleted. Procedure | | +| | Verify that an IP multicast route bound to a non-default Vrf is created or deleted | | +| | Verify that multicast routes containing one or more inbound interfaces are created or deleted | | +| | Verify that multicast routes containing one or more outbound interfaces are created or deleted | | +| | Verify that IP multicast routes are updated in the APPL DB after they are created, deleted, or updated | | +| | Verify that the APPL DB and ASIC DB data are consistent after IP multicast routes are created, deleted, or updated | | +| | Using IPv6 addresses, validate the unit test cases[IP multicast route] | | +| Logs and errors | Any abnormal and failed operations are logged | | +| | Verification after abnormal data is delivered, mroutesyncd logs it and ignores processing | | +| | After verifying that the invocation of the SAI API fails, mrouteorch logs correctly and handles according to the invocation exception | | + +#### System Test cases + +Unit system cases for this specification are listed below: + +| Test Cases | UT Action and observation | Remarks | +| :------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :------ | +| Configuration | Verify IP multicast routes and counts for reference whose impact interfaces | | +| Verification | Verify whether IP multicast packet forwarding is enabled on the interface and is restored at config-reload | | +| | Based on unit test cases[IP multicast route], Add an IP multicast route and send an IP multicast packet to verify whether the IP multicast route work or not | | +| | Verify enable/disable IP multicast packets forwarding function in Ethernet/Vlan/PortChannel interfaces | | +| | Delete the IP multicast route and send an IP multicast packet to verify the IP multicast route work or not | | +| | Verify system test cases by using IPv6 addresses[Verification] | | +| Warm reboot | Verify the SWSS has warm reboot and the IP multicast route does not interrupt or lose packets | | +| Capacity | Verify that under the maximum number of IP group routes, sends IP multicast packets to verify the preceding functions | | +| | Verify that when the number of IP multicast routes exceeds the maximum chip capacity, the device still runs normally except for the IP multicast routing function | | +| | Create IP multicast incoming interface groups and members that exceed the maximum chip capacity, and the device still runs normally except the IP multicast routing function | | +| | Create IP multicast outgoing interface groups and members that exceed the maximum chip capacity, and the device still runs normally except the IP multicast routing function | | +| | After creating IP multicast routes that exceed the maximum chip capacity, delete all IP multicast routes and the IP multicast function still works properly | | + +### Open/Action items + +N/A diff --git a/doc/ipmc/images/add_ipmc_entry.png b/doc/ipmc/images/add_ipmc_entry.png new file mode 100644 index 0000000000000000000000000000000000000000..fb63e8c021cf12db9605cc33636032f21de635a5 GIT binary patch literal 29001 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 dTOA!8g84;C@n`)t_0h;;cA8r4$o9 literal 0 HcmV?d00001 diff --git a/doc/ipmc/images/ipmc_components.png b/doc/ipmc/images/ipmc_components.png new file mode 100644 index 0000000000000000000000000000000000000000..1718db61720d28aeac031d6a6414053db99621b6 GIT binary patch literal 31488 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 pS}4oNl>bK7*$bGKa#EvU3$DN){~!N8N3;L{ literal 0 HcmV?d00001 diff --git a/doc/ipmc/images/ipmc_warm_reboot2.png b/doc/ipmc/images/ipmc_warm_reboot2.png new file mode 100644 index 0000000000000000000000000000000000000000..83e35f2e47ca5d159b1b63230e4d7f6b94f1e7d5 GIT binary patch literal 9975 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 DtwVEm literal 0 HcmV?d00001 From 53f892c6555032be3366a600df63c6b0f579e255 Mon Sep 17 00:00:00 2001 From: philo Date: Sat, 14 Sep 2024 15:45:24 +0800 Subject: [PATCH 4/5] update images Signed-off-by: philo --- doc/ipmc/images/ipmc_components.png | Bin 31488 -> 31473 bytes doc/ipmc/images/ipmc_components2.png | Bin 29341 -> 29330 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/ipmc/images/ipmc_components.png b/doc/ipmc/images/ipmc_components.png index 1718db61720d28aeac031d6a6414053db99621b6..5b5cd29eddf3c1c571a7bcf9ac8acc82d821d38a 100644 GIT binary patch literal 31473 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 From 97ab8bba7d501f12f32bb2500c7320740347c61c Mon Sep 17 00:00:00 2001 From: philo Date: Sat, 14 Sep 2024 15:48:09 +0800 Subject: [PATCH 5/5] update container description Signed-off-by: philo --- doc/ipmc/IPMC_Data_Plane_HLD.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ipmc/IPMC_Data_Plane_HLD.md b/doc/ipmc/IPMC_Data_Plane_HLD.md index 98b4b4c3242..19439bbec97 100644 --- a/doc/ipmc/IPMC_Data_Plane_HLD.md +++ b/doc/ipmc/IPMC_Data_Plane_HLD.md @@ -105,7 +105,7 @@ For the implementation of the data plane, firstly, the fpm component does not su In ECMP routing, there is already a very elegant nexthop group design and implementation, so for IP multicast routing reference this design uses mgmanager to manage the ipmc group and rpf group. -The following diagram summarizes the key structure of IPMC functionality in SONiC (The abbreviation of FRR Container is frr-pimd): +The following diagram summarizes the key structure of IPMC functionality in SONiC: ![IPMC main structure1](images/ipmc_components.png "Figure 1: IPMC main structure")