SDN Multicast Solution to Support Various Chip Vendors
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
IGMP Examples
Qualcomm Router
Qualcomm Bridge
Broadcom Router
Broadcom Bridge
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