Design
HW acceleration settings differ significantly between chip vendors. Also, OVS is missing certain multicast features. Therefore, chip vendors create their own APIs/daemons.
The goals of this feature are:
A single table for multicast (lower footprint of OpenSync, reduced complexity, easier support, lower controller usage, better scalability)
Ability to support various chip vendor HW acceleration settings
Easier and faster development with controller-based IPTV managing
Ability to tailor solution for ISPs with controller support
This feature has been designed in accordance with IGMP RFC:
https://tools.ietf.org/html/rfc2236
Nortbound API
OVSDB Schema Changes
####################################### # Two tables: IGMP_Config, MLD_Config # ####################################### ############# IGMP_Config ############# igmp_version: enum (1,2,3) - Default IGMP version # Snooping snooping_enabled: Boolean (true) - Enable|Disable Snooping behavior on specified bridge. snooping_bridge: String (br-home) - Bridge where snooping should be used. static_mrouter_port: String (router=br-home, bridge=uplink_port) - Specify Port where IGMP reports should be sent explicitly. Even if querier is not learned on that port. mcast_group_exceptions: Masked IP address array (239.255.255.251/32) - Multicast groups that should bypass snooping behavior. unknown_mcast_group_behavior: Enum (flood, drop) - Default forwarding behavior for mcast groups that are not learned in snooping table. query_robustness_value: Integer (2) - bcm - The Robustness Variable allows tuning for the expected packet loss on a subnet. maximum_groups: Integer (25) - bcm|ovs - Max multicast groups that can be learned. fast_leave_enable: Boolean (false) - bcm - Imediatly drop the stream when IGMP leave is received maximum_sources: Integer (10) - bcm,qca - Max sources allowed. # Proxy proxy_enabled: Boolean (true) - Enable|Disable IGMP Proxy behavior proxy_upstream_if: String (eth0) - Interface where IGMP reports are proxied, and where multicast stream is expected proxy_dowstream_if: String (br-home) - Interface where Proxy is listening for IGMP reports proxy_group_exceptions: IP address array (239.255.255.251/32) - mcproxy - Do not proxy specifed multicast groups proxy_allowed_subnets: Masked IP address array (192.168.40.0/24) - Proxy only Mcast groups for the specified source IP subnet. # Querier querier_enabled: Boolean - native - Enable or disable IGMP Querier query_interval: Integer (125s) - bcm,native - The Query Interval is the interval between General Queries sent by the Querier. Default: 125 seconds. query_response_interval: Integer (10) - bcm,native - The Max Response Time inserted into the periodic General Queries. last_member_query_interval: Integer (30) - bcm,native - The Last Member Query Interval is the Max Response Time inserted into Group-Specific Queries sent in response to Leave Group messages, and is also the amount of time between Group-Specific Query messages- # Platform specific other_config: #BCM - mcast-interface: String - Mcast Uplink interface. Mandatory for HW acceleration on BCM devices. - uplink-vid: Integer - Vlan id on uplink interface. Mandatory for HW acceleration on BCM devices. - maximum_members: Integer (25) - bcm - Max members allowed subscribed. # If controller needs to be aware of an other_config value, move it to OVSDB scheme ############# MLD_Config ############## mld_version: enum (1,2) - Default MLD version # Snooping snooping_bridge: String (br-home) - Bridge where snooping should be used. snooping_enabled: Boolean (true) - Enable|Disable Snooping behavior on specified bridge. static_mrouter_port: String (router=br-home, bridge=uplink_port) - Specify Port where MLD reports should be sent explicitly. Even if querier is not learned on that port. mcast_group_exceptions: Masked IPv6 address array (ff02::2/128) - Multicast groups that should bypass snooping behavior. unknown_mcast_group_behavior: Enum (flood, drop) - Default forwarding behavior for mcast groups that are not learned in snooping table. query_robustness_value: Integer (2) - bcm - The Robustness Variable allows tuning for the expected packet loss on a subnet. maximum_groups: Integer (25) - bcm|ovs - Max multicast groups that can be learned. fast_leave_enable: Boolean (false) - bcm - Imidiatly drop the stream when MLD leave is received maximum_sources: Integer (10) - bcm,qca - Max sources allowed. # Proxy proxy_enabled: Boolean (true) - Enable|Disable MLD Proxy behavior proxy_upstream_if: String (eth0) - Interface where MLD reports are proxied, and where multicast stream is expected. proxy_dowstream_if: String (br-home) - Interface where Proxy is listening for MLD reports, and where multicast stream is sent. proxy_group_exceptions: IP address array (FF02::C/128) - mcproxy - Do not proxy specifed multicast groups proxy_allowed_subnets: Masked IPv6 address array (::) - Proxy only Mcast groups for the specified source IP subnet. # Querier querier_enabled: Boolean - native - Enable or disable MLD Querier query_interval: Integer (125s) - bcm,native - The Query Interval is the interval between General Queries sent by the Querier. Default: 125 seconds. query_response_interval: Integer (10) - bcm,native - The Max Response Time inserted into the periodic General Queries. last_member_query_interval: Integer (30) - bcm,native - The Last Member Query Interval is the Max Response Time inserted into Group-Specific Queries sent in response to Leave Group messages, and is also the amount of time between Group-Specific Query messages # Platform specific other_config: #BCM - mcast-interface: String - Mcast Uplink interface. Mandatory for HW acceleration on BCM devices. - uplink-vid: Integer - Vlan id on uplink interface. Mandatory for HW acceleration on BCM devices. - maximum_members: Integer (25) - bcm - Max members allowed subscribed. # If controller needs to be aware of an other_config value, move it to OVSDB scheme |
Southbound API
Broadcom Multicast Proxy Daemon (MCPD) Config Options
#Begin IGMP configuration igmp-default-version 2 igmp-query-interval 125 igmp-query-response-interval 10 igmp-last-member-query-interval 10 igmp-robustness-value 2 igmp-lan-to-lan-multicast 0 igmp-max-groups 25 igmp-max-sources 10 igmp-max-members 25 igmp-fast-leave 1 igmp-join-immediate 0 igmp-proxy-enable 1 igmp-proxy-interfaces atm0 ptm0.1 eth4.1 igmp-snooping-enable 1 igmp-snooping-interfaces br0 br0:0 br0:1 # #End IGMP configuration # # #Begin MLD configuration # mld-default-version 2 mld-query-interval 125 mld-query-response-interval 10 mld-last-member-query-interval 10 mld-robustness-value 2 mld-lan-to-lan-multicast 0 mld-max-groups 10 mld-max-sources 10 mld-max-members 10 mld-fast-leave 1 mld-proxy-enable 0 mld-proxy-interfaces mld-snooping-enable 1 mld-snooping-interfaces br0 br0:0 br0:1 |
Native Bridge Config Options
-rw-r--r-- 1 root root 4096 Apr 29 12:08 multicast_last_member_count -rw-r--r-- 1 root root 4096 Apr 29 12:08 multicast_last_member_interval -rw-r--r-- 1 root root 4096 Apr 29 12:08 multicast_membership_interval -rw-r--r-- 1 root root 4096 Apr 29 12:08 multicast_querier -rw-r--r-- 1 root root 4096 Apr 29 12:08 multicast_querier_interval -rw-r--r-- 1 root root 4096 Apr 29 12:08 multicast_query_interval -rw-r--r-- 1 root root 4096 Apr 29 12:08 multicast_query_response_interval -rw-r--r-- 1 root root 4096 Apr 29 12:08 multicast_query_use_ifaddr -rw-r--r-- 1 root root 4096 Apr 29 12:08 multicast_router -rw-r--r-- 1 root root 4096 Apr 29 12:08 multicast_snooping -rw-r--r-- 1 root root 4096 Apr 29 12:08 multicast_startup_query_count -rw-r--r-- 1 root root 4096 Apr 29 12:08 multicast_startup_query_interval |
OVS Config Options
Multicast Snooping Configure bridge br0 to enable multicast snooping: ovs-vsctl set Bridge br0 mcast_snooping_enable=true Set the multicast snooping aging time br0 to 300 seconds: ovs-vsctl set Bridge br0 other_config:mcast-snooping-aging- time=300 Set the multicast snooping table size br0 to 2048 entries: ovs-vsctl set Bridge br0 other_config:mcast-snooping-table- size=2048 Disable flooding of unregistered multicast packets to all ports. When set to true, the switch will send unregistered multicast packets only to ports connected to multicast routers. When it is set to false, the switch will send them to all ports. This command disables the flood of unregistered packets on bridge br0. ovs-vsctl set Bridge br0 other_config:mcast-snooping-disable- flood-unregistered=true Enable flooding of multicast packets (except Reports) on a specific port. ovs-vsctl set Port eth1 other_config:mcast-snooping-flood=true Enable flooding of Reports on a specific port. ovs-vsctl set Port eth1 other_config:mcast-snooping-flood- reports=true Deconfigure multicasting snooping from above: ovs-vsctl set Bridge br0 mcast_snooping_enable=false |
IGMP Examples
Qualcomm Router
default-version 3 snooping_enabled: true snooping_bridge: br-home static_mrouter_port: br-home - ovs-vsctl set Port br-home other_config:mcast-snooping-flood-reports=true mcast_group_exceptions: 239.255.255.251/32 unknown_mcast_group flood (ovs-vsctl set Port br-home other_config:mcast-snooping-flood=true) Proxy_enabled: true Proxy_upstream_if: eth0 Proxy_dowstream_if: br-home
Qualcomm Bridge
default-version 3 Snooping_enabled: true Snooping_bridge: br-home mrouter_port: eth0 - ovs-vsctl set Port br-home other_config:mcast-snooping-flood-reports=true mcast_exceptions: 239.255.255.251/32 unknow_mcast_group flood (ovs-vsctl set Port br-home other_config:mcast-snooping-flood=true) Proxy_enabled: false Proxy_upstream_if: Proxy_dowstream_if:
Broadcom Router
default-version 3 Snooping_enabled: true Snooping_bridge: br-home mrouter_port: br-home - ovs-vsctl set Port br-home other_config:mcast-snooping-flood-reports=true mcast_exceptions: 239.255.255.251/32 unknow_mcast_group flood (ovs-vsctl set Port br-home other_config:mcast-snooping-flood=true) proxy_enabled: true proxy_upstream_if: eth1.201 proxy_dowstream_if: br-home other_config: - mcast-iface eth1.201
Broadcom Bridge
default-version 3 Snooping_enabled: true Snooping_bridge: br-home mrouter_port: eth0.201 - ovs-vsctl set Port br-home other_config:mcast-snooping-flood-reports=true mcast_exceptions: 239.255.255.251/32 unknow_mcast_group flood (ovs-vsctl set Port br-home other_config:mcast-snooping-flood=true) Proxy_enabled: false Proxy_upstream_if: Proxy_dowstream_if: other_config: - mcast-iface br-home/eth0.201 - uplink-vid 201
Logic
Possible Table Configurations
These two tables are applicable when VLAN services are NOT enabled:
BRIDGE | Qualcomm | Broadcom |
---|---|---|
igmp_version | IGMPv3 | IGMPv3 |
snooping_enabled | true | true |
snooping_bridge | "br-home" | "br-home" |
static_mrouter_port | uplink interface (eth0, g-bhaul) | uplink interface (eth0, g-bhaul) |
mcast_group_exceptions | UPnP, NDP | UPnP, NDP |
unknown_mcast_group_behavior | "FLOOD" | "FLOOD" |
fast_leave_enable | false | false |
maximum_groups | 0 | 0 |
maximum_sources | 0 | 0 |
proxy_enabled | false | false |
proxy_upstream_if | "" | "" |
proxy_dowstream_if | "" | "" |
proxy_group_exceptions | "" | "" |
proxy_allowed_subnets | "" | "" |
query_robustness_value | 0 | 0 |
querier_enabled | false | false |
query_interval | 0 | 0 |
query_response_interval | 0 | 0 |
last_member_query_interval | 0 | 0 |
other_config | ||
*mcast_bridge | true | |
*mcast_interface | uplink interface | |
*uplink_vid | ||
maximum_members | ||
[BRIDGE]---------eth---------[BRIDGE] )))) ((((( [BRIDGE] |
ROUTER | Qualcomm | Broadcom |
---|---|---|
igmp_version | IGMPv3 | IGMPv3 |
snooping_enabled | true | true |
snooping_bridge | "br-home" | "br-home" |
static_mrouter_port | "br-home" | "br-home" |
mcast_group_exceptions | UPnP, NDP | UPnP, NDP |
unknown_mcast_group_behavior | "FLOOD" | "FLOOD" |
fast_leave_enable | false | false |
maximum_groups | 0 | 0 |
maximum_sources | 0 | 0 |
proxy_enabled | true | true |
proxy_upstream_if | uplink interface | uplink interface |
proxy_dowstream_if | "br-home" | "br-home" |
proxy_group_exceptions | "" | "" |
proxy_allowed_subnets | "" | "" |
query_robustness_value | 0 | 0 |
querier_enabled | false | false |
query_interval | 0 | 0 |
query_response_interval | 0 | 0 |
last_member_query_interval | 0 | 0 |
other_config | ||
*mcast_bridge | false | |
*mcast_interface | uplink interface | |
*uplink_vid | ||
maximum_members | ||
[ROUTER]---------eth---------[BRIDGE] )))) ((((( [BRIDGE] |
Location in router mode with bridged IPTV service enabled:
GATEWAY (gw == eth uplink) | Qualcomm | Broadcom |
---|---|---|
igmp_version | IGMPv3 | IGMPv3 |
snooping_enabled | true | true |
snooping_bridge | "br-home" | "br-home" |
static_mrouter_port | vlan uplink interface (eth0.200) | vlan uplink interface (eth0.200) |
mcast_group_exceptions | UPnP, NDP | UPnP, NDP |
unknown_mcast_group_behavior | "FLOOD" | "FLOOD" |
fast_leave_enable | false | false |
maximum_groups | 0 | 0 |
maximum_sources | 0 | 0 |
proxy_enabled | false | false |
proxy_upstream_if | "" | "" |
proxy_dowstream_if | "" | "" |
proxy_group_exceptions | "" | "" |
proxy_allowed_subnets | "" | "" |
query_robustness_value | 0 | 0 |
querier_enabled | false | false |
query_interval | 0 | 0 |
query_response_interval | 0 | 0 |
last_member_query_interval | 0 | 0 |
other_config | ||
*mcast_bridge | true | |
*mcast_interface | vlan uplink interface | |
*uplink_vid | ||
maximum_members | ||
[Bridged IPTV GW]---------eth---------[Bridged IPTV GW] )))) ((((( [BRIDGE] |
Location in router mode with routed IPTV service enabled:
GATEWAY | Qualcomm | Broadcom |
---|---|---|
igmp_version | IGMPv3 | IGMPv3 |
snooping_enabled | true | true |
snooping_bridge | "br-home" | "br-home" |
static_mrouter_port | "br-home" | "br-home" |
mcast_group_exceptions | UPnP, NDP | UPnP, NDP |
unknown_mcast_group_behavior | "FLOOD" | "FLOOD" |
fast_leave_enable | false | false |
maximum_groups | 0 | 0 |
maximum_sources | 0 | 0 |
proxy_enabled | true | true |
proxy_upstream_if | vlan uplink interface | vlan uplink interface |
proxy_dowstream_if | "br-home" | "br-home" |
proxy_group_exceptions | "" | "" |
proxy_allowed_subnets | "" | "" |
query_robustness_value | 0 | 0 |
querier_enabled | false | false |
query_interval | 0 | 0 |
query_response_interval | 0 | 0 |
last_member_query_interval | 0 | 0 |
other_config | ||
*mcast_bridge | false | |
*mcast_interface | vlan uplink interface | |
*uplink_vid | ||
maximum_members | ||
[Routed IPTV GW]---------eth---------[BRIDGE] )))) ((((( [BRIDGE] |
Config Selection Logic
When setting the multicast configuration, both IGMP and MLD are set at the same time. These are the prerequisites:
Snooping must be enabled.
Location is in bridge mode: always use BRIDGE config.
Location is in router mode: check if VLAN service is enabled.
VLAN service is NOT enabled
Proxy is disabled: not applicable
Proxy is enabled: gateway using ROUTER configuration, leaf nodes using BRIDGE configuration
VLAN service is enabled
is_mcast == true
Bridged: gateway and Ethernet nodes using bridged IPTV gateway configuration, other leaf nodes are using normal BRIDGE configuration (works as described here)
Routed: gateway nodes are using routed IPTV gateway configuration, leaf nodes are using normal BRIDGE configuration (works as described here)
is_mcast == false, unicast configuration
Bridged: NO multicast config
Routed: NO multicast config