.. _cspifc:

==============
CSP Interfaces
==============

The SRS-4 transceiver is operated remotely via `CubeSat Space Protocol (CSP) <http://www.libcsp.org/>`_ messages. The :ref:`srs4-client` and :ref:`prop-client` all contain wrapper function around CSP protocols. In addition, SRS-4 also implements the standard CSP service ports such as ``CSP_PING`` and ``CSP_REBOOT``.

Configuration CSP parameters
----------------------------

By default, the system uses address 24 but this can be changed by adjusting the address property ``sys.csp.address`` and saving the ``sys`` group. The system must be rebooted for the address change to take effect.

The system supports CSP via CAN-bus (``CAN`` interface) and RS-422 (``KISS`` interface) in the P1 connector, and through the spacelink (``SPACE`` interface). The interfaces are always enabled for incoming messages, but the default routing table sends egress messages on the CAN interface for all traffic except traffic to ground (address 10) and loopback.

Note that the CAN interface by default operates in CSP/CFP "promiscuous" mode, meaning that the SRS-4 will receive, and potentially forward, all CSP frames on the CAN-bus regardless of the CSP/CFP destination address. This behaviour can be disabled by setting the ``sys.can.promisc`` property to false.

The current routing table can be listed using the ``csp route show`` command in the debug shell:

.. code-block:: none

    [srs-4] csp route show 
    24/5 LOOP
    0/0 CAN
    10/5 SPACE

The results are listed using `CIDR notation <https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing>`_. CSP addresses are 5 bits long so, ``24/5`` is an exact match to address ``24``, i.e. the loopback address. ``0/0`` marks the default route. To adjust CSP routing, the ``sys.csp.routes`` property should be used. As an example, to send all traffic via the RS-422/KISS interface set the property to ``0/0 KISS`` and save the ``sys`` group. It is not necessary to add an explicit route for the loopback interface.

The CSP stack is configured for 256 packet buffers of up to 1024 bytes. The ``CAN`` and ``KISS`` interfaces both have an MTU of 1024 bytes, while the ``SPACE`` interface MTU is limited by the ``tx.size`` property. The maximum spacelink payload size of 1024 bytes allows for CSP frames of up to 1020 bytes since the 4-byte CSP header must be included in the payload data.

The CSP connection can be tested using the ``csp ping`` debug shell command. This example pings address 1 with 100 byte frames 10 times:

.. code-block:: none

    [srs-4] csp ping -s100 -c10 -r 1
    Reply in 4.540 ms
    Reply in 4.510 ms
    Reply in 4.488 ms
    Reply in 4.478 ms
    Reply in 4.449 ms
    Reply in 4.446 ms
    Reply in 4.437 ms
    Reply in 4.544 ms
    Reply in 4.552 ms
    Reply in 4.313 ms
    Sent: 10 Received: 10 (100.0%) Lost: 0 (0.0%)
    RTT: min=4.313 max=4.552 avg=4.476
