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
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