| .. _stratum_chassis_config: |
| |
| Stratum Chassis Configuration |
| ============================= |
| |
| .. tip:: |
| |
| Check out `examples <https://github.com/stratum/stratum/tree/main/stratum/hal/config>`_ |
| for every platform supported by Stratum. |
| |
| See the `Deployment Guide <../deployment.rst>`_ to learn about how to deploy Stratum |
| with a custom chassis config. |
| |
| The Stratum chassis config is the internal data structure that encapsulates the so called |
| "config" pushed to the entire chassis. The term "chassis" refers to the a switching box |
| with one or more switching nodes managed by a management interface. |
| |
| The chassis config file will be placed on the disk of the device and loaded when starting the Stratum agent. |
| The config includes all the not-so-frequent settings that are required before the switch |
| can accept flow programming requests from the controller. |
| |
| A valid chassis config includes a ``chassis`` and a ``node`` field, and may includes one |
| or more ``singleton_port`` field. See each section below for more detail. |
| |
| .. note:: |
| |
| In Stratum the external interface for pushing config is gNMI. |
| The protobuf realization of the YANG models for the config is internally converted |
| to a chassis config before it is consumed by the internal stack components. |
| |
| The `format of chassis config <https://github.com/stratum/stratum/blob/main/stratum/hal/lib/common/common.proto#L824-L833>`_ |
| is based on protobuf text format, check out |
| `the protobuf language guide for more info <https://developers.google.com/protocol-buffers/docs/overview?hl=en>`_ |
| |
| Chassis |
| ------- |
| |
| A ``chassis`` uniquely identifies a switch with a single management interface. |
| Each chassis may contain one or more slots (aka linecards), |
| and one or more switching nodes (aka chips) on each slot. |
| |
| A chassis contains the following fields: |
| |
| * ``platform``: The chassis platform. **Required** |
| * ``name``: An arbitrary name for the chassis. **Optional** |
| * ``config_params``: Parameters configured for the entire chassis when config is pushed to the the switch. **Optional** |
| |
| .. tip:: |
| |
| Check out the list of platforms `here <https://github.com/stratum/stratum/blob/main/stratum/hal/lib/common/common.proto#L33-L47>`_ |
| |
| Node |
| ---- |
| |
| A ``node`` uniquely identifies a single switching node (aka chip) on a chassis linecard |
| and all its flow-related and config-related parameters. |
| |
| A node contains the following fields: |
| |
| * ``id``: The unique ID of the switch node on the chassis as used by the P4Runtime controller. **Required** |
| * ``name``: An arbitrary name for the switching node. **Optional** |
| * ``slot``: The 1-base index of the slot (aka linecard) which this node belongs. **Required** |
| * ``index``: The optional 1-base index of the node within the chassis. **Optional** |
| |
| .. _singleton_port: |
| |
| Singleton Port |
| -------------- |
| |
| A ``singleton port`` in the chassis configuration uniquely identifies a single physical port on |
| a single chassis. |
| |
| A singleton port contains the following fields: |
| |
| * ``id``: The unique ID of the singleton port. **Required** |
| * ``name``: An optional arbitrary name for the singleton port. **Required** |
| |
| The control plan (e.g., ONOS) can use this name to query port information as a gNMI path key. |
| |
| * ``slot``: The 1-base index of the slot (aka linecard) of the port. **Required** |
| * ``port``: The 1-base index of the singleton port on the slot. **Required** |
| * ``channel``: The 1-base channel index. Absence or zero means non-channelized. **Optional** |
| * ``speed_bps``: The speed of the port in bps. **Required** |
| * ``node``: The id of the corresponding node that the port belongs to. **Required** |
| * ``config_params``: Parameters configured for this port. **Optional** |
| |
| * ``admin_state``: The initial admin state for this port, port will be disabled by default. |
| |
| * Choose from ``ADMIN_STATE_DISABLED`` or ``ADMIN_STATE_ENABLED``. |
| |
| * ``mtu``: The maximum transmission unit for this port. |
| * ``autoneg``: Whether auto-negotiation is enabled or not for this port. |
| |
| * Choose from ``TRI_STATE_FALSE`` or ``TRI_STATE_TRUE`` |
| * The initial configuration might be different if this field is empty, based on the |
| platform or the connector you are using. |
| |
| * ``fec_mode``: The |
| |
| * Choose from ``FEC_MODE_ON``, ``FEC_MODE_OFF``, or ``FEC_MODE_AUTO`` |
| |
| * ``loopback_mode``: |
| |
| * Choose from ``LOOPBACK_STATE_NONE``, ``LOOPBACK_STATE_MAC``, or ``LOOPBACK_STATE_PHY`` |
| |
| Example chassis config |
| ---------------------- |
| |
| In this example, we want to set up a **Tofino-based switch** with only one node/slot. |
| |
| And we want to set up two ports: |
| |
| * Port 1: 100G port without channelization, enabled by default, and disable auto auto-negotiation. |
| * Port 2: break out to four 10G ports, uses different channels for each port and enable |
| them by default with auto-negotiation. |
| |
| .. image:: ../images/chassis-config-example.svg |
| :width: 500px |
| |
| Below is an example of a chassis configuration with a list of singleton port: |
| |
| .. code-block:: |
| |
| description: "A chassis config example." |
| chassis { |
| platform: PLT_GENERIC_BAREFOOT_TOFINO |
| name: "leaf-1" |
| } |
| nodes { |
| id: 1 |
| slot: 1 |
| index: 1 |
| } |
| singleton_ports { |
| id: 1 |
| name: "1/0" |
| slot: 1 |
| port: 1 |
| speed_bps: 100000000000 # 100G |
| config_params { |
| admin_state: ADMIN_STATE_ENABLED |
| autoneg: TRI_STATE_FALSE |
| } |
| node: 1 |
| } |
| singleton_ports { |
| id: 200 |
| name: "2/0" |
| slot: 1 |
| port: 2 |
| channel: 1 |
| speed_bps: 10000000000 # 10G |
| config_params { |
| admin_state: ADMIN_STATE_ENABLED |
| autoneg: TRI_STATE_TRUE |
| } |
| node: 1 |
| } |
| singleton_ports { |
| id: 201 |
| name: "2/1" |
| slot: 1 |
| port: 2 |
| channel: 2 |
| speed_bps: 10000000000 # 10G |
| config_params { |
| admin_state: ADMIN_STATE_ENABLED |
| autoneg: TRI_STATE_TRUE |
| } |
| node: 1 |
| } |
| singleton_ports { |
| id: 202 |
| name: "2/2" |
| slot: 1 |
| port: 2 |
| channel: 3 |
| speed_bps: 10000000000 # 10G |
| config_params { |
| admin_state: ADMIN_STATE_ENABLED |
| autoneg: TRI_STATE_TRUE |
| } |
| node: 1 |
| } |
| singleton_ports { |
| id: 203 |
| name: "2/3" |
| slot: 1 |
| port: 2 |
| channel: 4 |
| speed_bps: 10000000000 # 10G |
| config_params { |
| admin_state: ADMIN_STATE_ENABLED |
| autoneg: TRI_STATE_TRUE |
| } |
| node: 1 |
| } |