| Pseudowire |
| ========== |
| In Trellis, we assign different subnets to hosts that attach to different edge (leaf) switches. |
| These hosts communicate over IP when traversing the spine switches, meaning that the layer-2 header is not preserved across transportation. |
| However, in some use cases it is beneficial for hosts that connect to different leaves to be able to talk directly over L2 and also belong to the same IP subnet. |
| We implemented Pseudowire (PW) in Trellis to fulfill this requirement. |
| |
| Pseudowires create tunnels between different connection points that transport L2 traffic between them. |
| Pseudowires can handle single-tagged/double-tagged traffic and are able to modify the VLAN tags in some cases. |
| |
| .. note:: |
| Pseudowires are only supported on OF-DPA hardware switches. |
| |
| Managing pseudowires via REST |
| ----------------------------- |
| You can find the REST API documentation at ``http://${ONOS-IP}:8181/onos/v1/docs``. |
| Please click the drop down list and select Segment Routing Server. |
| |
| .. image:: ../images/config-pw-rest.png |
| :width: 700px |
| |
| We configure and implement PWs through the dedicated REST API. |
| |
| .. code-block:: console |
| |
| $ curl --user onos:rocks -X POST -H 'Content-Type:application/json' http://${ONOS-IP}:8181/onos/segmentrouting/pseudowire/ -d@pseudowire.json |
| $ curl --user onos:rocks -X GET -H 'Content-Type:application/json' http://${ONOS-IP}:8181/onos/segmentrouting/pseudowire/ -d@pseudowire.json |
| $ curl --user onos:rocks -X DELETE -H 'Content-Type:application/json' http://${ONOS-IP}:8181/onos/segmentrouting/pseudowire/ -d@pseudowire.json |
| |
| Below is an example configuration for a single pseudowire, |
| which transfers L2 double tagged traffic from cp1 to cp2 and also changes the outer VLAN tag of the packets. |
| |
| |
| .. code-block:: json |
| |
| { |
| "pwId" : 42, |
| "cP1": "of:0000000000000205/25", |
| "cP2": "of:0000000000000206/33", |
| "cP1InnerTag": "101", |
| "cP1OuterTag": "110", |
| "cP2InnerTag": "101", |
| "cP2OuterTag": "111", |
| "mode": "RAW", |
| "sdTag": "", |
| "pwLabel": "1572" |
| } |
| |
| - ``cP1``: First connection point of PW |
| - ``cP2``: Second connection point of PW |
| - ``cP1InnerTag / cp1OuterTag``: The expected inner and outer VLAN tags for ``cp1``. If you only want to use a single incoming tag, |
| use the innerTag, and use ``None`` for the outerTag. |
| - ``cP2InnerTag / cp2OuterTag``: The expected inner and outer VLAN tags for ``cp2``. |
| - ``mode``: Pseudowire mode - RAW and TAGGED. Only RAW mode is supported in Trellis. |
| - ``sdTag``: Service delimiting tag, only meaningful when in TAGGED mode. |
| - ``pwLabel``: Unique pseudowire label. |
| - ``pwId``: ID of the pseudowire. |
| |
| The REST API also supports bulk addition and removal of pseudowire. |
| |
| .. code-block:: console |
| |
| $ curl --user onos:rocks -X POST -H 'Content-Type:application/json'http://<controller-ip>:8181/onos/segmentrouting/pseudowire/bulk -d@pseudowires.json |
| $ curl --user onos:rocks -X DELETE -H 'Content-Type:application/json'http://<controller-ip>:8181/onos/segmentrouting/pseudowire/bulk -d@pseudowires.json |
| |
| with the following example configuration: |
| |
| .. code-block:: json |
| |
| { |
| "pseudowires": [{ |
| "pwId": 43, |
| "cP1": "of:0000000000000227/15", |
| "cP2": "of:0000000000000205/33", |
| "cP1InnerTag": "101", |
| "cP1OuterTag": "", |
| "cP2InnerTag": "101", |
| "cP2OuterTag": "", |
| "mode": "RAW", |
| "sdTag": "", |
| "pwLabel": "2572" |
| }, |
| { |
| "pwId": 42, |
| "cP1": "of:0000000000000201/12", |
| "cP2": "of:0000000000000204/12", |
| "cP1InnerTag": "101", |
| "cP1OuterTag": "", |
| "cP2InnerTag": "101", |
| "cP2OuterTag": "", |
| "mode": "RAW", |
| "sdTag": "", |
| "pwLabel": "1572" |
| } |
| ] |
| } |
| |
| |
| Managing pseudowires via CLI |
| ---------------------------- |
| |
| To add a pseudowire: |
| |
| .. code-block:: text |
| |
| onos> sr-pw-add --help |
| DESCRIPTION |
| onos:sr-pw-add |
| |
| Add a pseudowire to the network configuration, if it already exists update it. |
| |
| SYNTAX |
| onos:sr-pw-add [options] pwId pwLabel mode sDTag cP1 cP1InnerVlan cP1OuterVlan cP2 cP2InnerVlan cP2OuterVlan |
| |
| <omitted> |
| |
| onos> sr-pw-add 42 1000 RAW None of:0000000000000204/12 100 10 of:0000000000000205/12 100 40 |
| |
| To list existing pseudowires: |
| |
| .. code-block:: text |
| |
| onos> sr-pw-list |
| |
| To remove a pseudowire: |
| |
| .. code-block:: text |
| |
| onos> sr-pw-remove 42 |
| |
| |
| Type of pseudowires |
| ------------------- |
| - **Leaf - Leaf** : As explained above we support leaf - leaf pseudowires. |
| |
| - **Spine - Leaf** : We further support leaf to spine pseudowires, |
| where one termination point resides in a spine switch rather than a leaf switch. |
| Please note that the encapsulated traffic for these types of pseudowires is carried **tagged** between leaf and spines, |
| the reason for this is due to some hardware limitation. The **reserved transport VLAN is 4093**. |
| |
| - Multi-stage |
| |
| - **Leaf - Spine-1 - Spine-2**: Where Spine-1 and Spine-2 are interconnected between them and are part of distinct topologies. |
| - **Leaf_1 - Spine_1 - Spine_2 - Leaf_2**: Where leaf-1 and leaf-2 are part of different fabric topologies which are interconnected between them between two spines. |
| |
| |
| Common errors |
| ------------- |
| If your pseudowires do not work make sure you have done the following in the host side : |
| |
| - Disabled VLAN offloading in the VM interfaces and also in the compute node interfaces. |
| - Set the compute node interfaces and the VM interfaces at promiscuous mode. |
| - In general, do the above for all the interfaces and bridges participated in the topology (either in a VM or physical server). |
| - Before programming pseudowires make sure that the topology is completely up and running and also the configuration is added to the controller and the fabric is |
| in an operational state. |
| |
| |
| Restrictions |
| ------------ |
| We list now some restrictions of pseudowire support, some of them stem from the implementation while others from switch hardware constraints. |
| |
| - We only support pseudowires with the same type of tagged traffic at each end. |
| For example, if cP1 handles single tagged traffic then cP2 must handle single tagged traffic (same applies for single tagged and double tagged traffic). |
| However, for pseudowires with single tagged traffic we support changing the tag, |
| and for pseudowires with double tagged traffic we support changing the outer tag. |
| We would like to support more use cases, however we are limited by hardware pipeline restrictions. |
| In the future, and if needed, we might address this by using the egress tables of OF-DPA. |
| - As of now, we only support RAW mode. We will support also TAGGED mode in the future if needed by any use case. |
| Since, we only support RAW mode the sdTag must always be empty or None. |
| |
| |
| Implementation limits |
| --------------------- |
| - **Link failures**: We partially support link failures. |
| Specifically, our PW implementation does not properly handle link failures when the link involved is the one used for pseudowire traffic at the spine switches towards a leaf switch. |
| This is due to an OF-DPA limitation which does not allow the use of MPLS ECMP groups in the spine. |
| We plan to address this in the next release. |
| |
| - **Device failures**: We do not handle device failures currently, on a device failure please remove and re-install the pseudowire. |
| We will address this soon. |