Multicast ========= Trellis supports IP multicast in an classic SDN way. **None of the common IP multicast protocols (e.g. IGMP, PIM) is used when calculating the multicast tree internally**. Instead, benefiting from SDN, Trellis calculates the multicast tree in a centralized way and program the switches accordingly. Having said that, it doesn't prevent us from using common IP multicast protocols to communicate with externals. Here's a summary of multicast features Trellis supports. - Support both **IPv4 and IPv6** multicast - Support **multi-stage** topology - Support **dual-homed sinks** (with failure recovery) - Support **multiple sources** .. image:: ../images/config-mcast.png :width: 1000px .. note:: Dual-homed sinks and multiple sources support comes with major changes in the Multicast Routing subsystem. **Sink and sources are now identified by an ONOS HostId (MAC/VLAN)** and has associated a number of ConnectPoint while in the past we identified the sinks and the sources just using one ConnectPoint. Multicast subsystem listen for Host events and according to them modify properly the ConnectPoint associated to the HostId. In particular, it leverages the Host Location which is a collection of ONOS ConnectPoint where the Host is attached. This information is maintained updated by ONOS thanks to several discovery mechanisms implemented in the Host subsystem. Following image try to summarize the work flow of the Multicast Routing subsystem after the aforementioned changes: .. image:: ../images/config-mcast-internal.png :width: 600px :align: center .. caution:: We should avoid using reserved Multicast groups. Please check here for the reserved values: http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml Activate Multicast ------------------ The multicast service need to be activated by the following command: .. code-block:: console onos> app activate mcast You can also add ``mcast`` into ``$ONOS_APPS`` environment variable such that it gets started automatically every time. CLI commands ------------ Creating a route and adding sinks ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In order to add a new Multicast route, we have to use ``mcast-host-join`` command and we need to provide following information: 1) **source address**; 2) **group address**; 3) **sources** ; 4) **sinks**. Here's an example: .. code-block:: console onos> mcast-host-join -sAddr * -gAddr 224.0.0.1 -srcs 00:AA:00:00:00:01/None -srcs 00:AA:00:00:00:05/None -sinks 00:AA:00:00:00:03/None -sinks 00:CC:00:00:00:01/None - ``-sAddr``: we can provide **\* for ASM** or an **IP address for SSM** At this time being we do not enforce the matching of the ``-sAddr`` on the data plane. - ``-gAddr`` specifies Multicast group address - ``-srcs`` identifies the source we changed from ConnectPoint to HostId in this release. - ``-sinks`` specifies the sinks of the group, we changed from ConnectPoint to HostId in this release. Removing a sink ^^^^^^^^^^^^^^^ A sink can be removed through ``mcast-sink-delete`` command. The major difference is that the sinks to be removed is provided through ``-h`` option. If ``-h`` is not provided the command will issue a route removal. .. code-block:: console onos> mcast-sink-delete -sAddr * -gAddr 224.0.0.1 -h 00:AA:00:00:00:03/None Modifying a source ^^^^^^^^^^^^^^^^^^ We also provide a command to modify the sources of a Multicast group. In particular ``mcast-source-delete`` allows to modify the source connect points of a source. If ``-src`` is not provided, the command will issue a route removal .. code-block:: console onos> mcast-source-delete -sAddr * -gAddr 224.0.0.1 -src 00:AA:00:00:00:01/None Removing a route ^^^^^^^^^^^^^^^^ The removal of a route can be achieved in several ways: 1. **removing all sources** .. code-block:: console onos> mcast-source-delete -sAddr * -gAddr 224.0.0.1 -src 00:AA:00:00:00:01/None -src 00:AA:00:00:00:05/None 2. **not providing -h to the mcast-host-delet** command .. code-block:: console onos> mcast-sink-delete -sAddr * -gAddr 224.0.0.1 3. **not providing -src option to the mcast-source-delete** command. .. code-block:: console onos> mcast-source-delete -sAddr * -gAddr 224.0.0.1 REST APIs --------- You can find the REST API documentation at ``http://:8181/onos/v1/docs``. Please click the drop down list and select Multicast API. .. image:: ../images/config-mcast-rest.png We configure and implement multicast routes through the dedicated REST API. Some of the APIs are outlined here, you can find complete list in the ONOS docs page. The referenced files in these examples can be found in ``$ONOS_ROOT/apps/mcast/web/src/main/resources/jsonExamples`` GET operations ^^^^^^^^^^^^^^ - Get all routes .. code-block:: console $ curl --user onos:rocks -X GET -H 'Accept: application/json' 'http://:8181/onos/mcast/mcast' - Get a specific route .. code-block:: console $ curl --user onos:rocks -X GET -H 'Accept: application/json' 'http://:8181/onos/mcast/mcast/{group_ip}/{source_ip}/' - Get all source connect point for a route .. code-block:: console $ curl --user onos:rocks -X GET -H 'Accept: application/json' 'http://:8181/onos/mcast/mcast/sources/{group_ip}/{source_ip}/' - Get all sink connect points for a route .. code-block:: console $ curl --user onos:rocks -X GET -H 'Accept: application/json' 'http://:8181/onos/mcast/mcast/sinks/{group_ip}/{source_ip}/' - Get all connect points for a given host Id in a given route .. code-block:: console $ curl --user onos:rocks -X GET -H 'Accept: application/json' 'http://:8181/onos/mcast/mcast' POST operations ^^^^^^^^^^^^^^^ - Single route post .. code-block:: console $ curl --user onos:rocks -X POST -H 'Content-Type:application/json' http://:8181/onos/mcast/mcast -d@mcastRoute.json - Bulk routes post .. code-block:: console $ curl --user onos:rocks -X POST -H 'Content-Type:application/json' http://:8181/onos/mcast/mcast/bulk -d@mcastRoutes.json - Add a specific set of source connect points to a given route .. code-block:: console $ curl --user onos:rocks -X POST -H 'Accept: application/json' 'http://:8181/onos/mcast/mcast/sources/{group_ip}/{source_ip}/' -d@mcastSources.json - Add a specific set of host Ids as sinks to a given route .. code-block:: console $ curl --user onos:rocks -X POST -H 'Accept: application/json' 'http://:8181/onos/mcast/mcast/sinks/{group_ip}/{source_ip}/' -d@mcastSinks.json - Add a specific set of connect points from a host source for a given route .. code-block:: console $ curl --user onos:rocks -X POST -H 'Accept: application/json' 'http://:8181/onos/mcast/mcast/sources/{group_ip}/{source_ip}/{hostId}' -d@mcastSourcesHostId.json - Add a specific set of connect points from a host sink from a given route .. code-block:: console $ curl --user onos:rocks -X POST -H 'Accept: application/json' 'http://:8181/onos/mcast/mcast/sinks/{group_ip}/{source_ip}/{hostId}' -d@mcastSinksHostId.json DELETE operations ^^^^^^^^^^^^^^^^^ - Remove all routes .. code-block:: console $ curl --user onos:rocks -X DELETE -H 'Accept: application/json' 'http://:8181/onos/mcast/mcast' - Bulk route removal .. code-block:: console $ curl --user onos:rocks -X DELETE -H 'Content-Type:application/json' http://:8181/onos/mcast/mcast/bulk -d@mcastRoutes.json - Remove a specific route given group and ip .. code-block:: console $ curl --user onos:rocks -X DELETE -H 'Accept: application/json' 'http://:8181/onos/mcast/mcast/{group_ip}/{source_ip}' - Remove a specific source from a given route .. code-block:: console $ curl --user onos:rocks -X DELETE -H 'Accept: application/json' 'http://:8181/onos/mcast/mcast/sources/{group_ip}/{source_ip}/{host_id}' - Remove a specific sink from a given route .. code-block:: console $ curl --user onos:rocks -X DELETE -H 'Accept: application/json' 'http://:8181/onos/mcast/mcast/sinks/{group_ip}/{source_ip}/{host_id}' JSON Example ^^^^^^^^^^^^ Below we find the configuration json for a single multicast route. .. code-block:: json { "group": "224.0.1.1", "source": "*", "sources": [ "00:AA:00:00:00:01/None", "00:AA:00:00:00:05/None" ], "sinks": [ "00:CC:00:00:00:01/None", "00:AA:00:00:00:03/None" ] } - ``group``: IP address of the Multicast Group - ``source``: IP address of the Multicast source. If specified (e.g. 10.0.1.1) we will treat this route as SSM (Single Source Multicast), if instead * is used the route will be ASM (Any Source Multicast) - ``sources``: Array containing the connect points to which the source is connected to. - ``sinks``: Array containing a set of Hosts that we want as sinks of the multicast stream. ONOS will automatically handle the connect points of these hosts if they are single or dual homed.