Cisco REP (Resilient Ethernet Protocol) Support

Starting to think about learning how to add Cisco REP (Resilient Ethernet Protocol) support to LibreNMS - so asking if anyone uses it and has a start on it, or wants to assist?

Simplest explanation is probably:

The Resilient Ethernet Protocol (REP ) is a Cisco proprietary protocol that provides an alternative to the Spanning Tree Protocol (STP). REP provides a way to control network loops, handle link failures, and improve convergence time.

Here’s a pretty picture to break up my ramblings:

It is used in Metro Ethernet deployments (ME switching) and industrial applications (IE switching), but also has good support on Catalyst 35xx and 9xxx ranges.

In terms of what it does and the data it provides:

It provides (optionally)-deterministic loop avoidance topology control with fast convergence at scale (~ 50us). It is defined in rings, not meshes - so the topology and failure points can be fixed and reportable by the protocol. It can also translate topology change notifications to other STP protocols.

The MIBs for it are already in the code base, and I will have an increasing number of devices available soon to work on in anger and will need to detect and hopefully somehow visualise link failures via LibreNMS.

Some examples for later reference:

SNMP table: CISCO-RESILIENT-ETHERNET-PROTOCOL-MIB::crepSegmentTable

 crepSegmentInterface1 crepSegmentInterface2 crepSegmentComplete crepSegmentPreempt crepSegmentPreemptStatus
                    54                    56               false              false                     none
                    55                     0               false              false                     none

SNMP table: CISCO-RESILIENT-ETHERNET-PROTOCOL-MIB::crepInterfaceConfigTable

 crepIfSegmentId crepIfOperStatus crepIfPortRole               crepIfPortID crepIfAdminEdgePortType crepIfOperEdgePortType crepIfPreferredConfig crepifBlockedVlans1k crepifBlockedVlans2k crepifBlockedVlans3k crepifBlockedVlans4k crepLoadBalanceBlockPortType crepBlockPortNumInfo        crepBlockPortIdInfo crepIfPreemptDelayTimer crepIfStcnPropagateToSTP            crepIfStcnPropagateToOtherSegs crepIfStcnPropagateToIf crepIfConfigRowStatus
               1           twoWay       openPort "XX XX XX XX XX XX 83 00 "                 notEdge                notEdge                 false                   ""                   ""                   ""                   ""                         none                    0 "00 00 00 00 00 00 00 00 "     -1 delay in seconds                    false "FF FF FF FF FF FF FF FF FF FF FF FF F0 "                       0                active
               2         initDown     failedPort "XX XX XX XX XX XX 83 00 "                    edge                   edge                 false                   ""                   ""                   ""                   ""                         none                    0 "00 00 00 00 00 00 00 00 "     -1 delay in seconds                    false "FF FF FF FF FF FF FF FF FF FF FF FF F0 "                       0                active
               1         initDown     failedPort "XX XX XX XX XX XX 83 00 "                 notEdge                notEdge                 false                   ""                   ""                   ""                   ""                         none                    0 "00 00 00 00 00 00 00 00 "     -1 delay in seconds                    false "FF FF FF FF FF FF FF FF FF FF FF FF F0 "                       0                active

SNMP table: CISCO-RESILIENT-ETHERNET-PROTOCOL-MIB::crepInterfaceStatsTable

 crepCounterDiscontinuityTime crepLslRxPdus crepLslTxPdus crepHflRxPdus crepHflTxPdus crepBpaTlvRxPackets crepBpaTlvTxPackets crepBpaStcnLslRxPackets crepBpaStcnLslTxPackets crepBpaStcnHflRxPackets crepBpaStcnHflTxPackets crepEpaElectionTlvRxPackets crepEpaElectionTlvTxPackets crepEpaCommandTlvRxPackets crepEpaCommandTlvTxPackets crepEpaInfoTlvRxPackets crepEpaInfoTlvTxPackets
                         1324        299756        240138             0             0                   3                   4                       0                       0                       0                       0                       59945                           0                          0                          0                   59945                   59946
                         1325             0             0             0             0                   0                   0                       0                       0                       0                       0                           0                           0                          0                          0                       0                       0
                         1326             0             0             0             0                   0                   0                       0                       0                       0                       0                           0                           0                          0                          0                       0                       0

The console output commands on a Cisco 9300 of the above data are vaguely:

#show rep topology
REP Segment 1
Warning: REP detects a segment failure, topology may be incomplete

BridgeName                       PortName   Edge Role
-------------------------------- ---------- ---- ----
xx-SW01                 Po3             Fail
xx-SW01                 Po1             Open
yy-SW01                 Po1        Sec  Open

REP Segment 2
Warning: REP detects a segment failure, topology may be incomplete

BridgeName                       PortName   Edge Role
-------------------------------- ---------- ---- ----
xx-SW01                 Po2        Sec  Fail

#show rep topology detail
REP Segment 1
Warning: REP detects a segment failure, topology may be incomplete

xxx-SW01, Po3 (Intermediate)
  Failed Port, Reason: Physical link down
  Bridge MAC: xxxx.xxxx.8300
  Port Number: 0BEB
  Port Priority: 800
  Effective Port Priority: XXXXXXXXXXXXXX8300
  Neighbor Number: Not available
xxx-SW01, Po1 (Intermediate)
  Open Port, all vlans forwarding
  Bridge MAC: xxxx.xxxx.8300
  Port Number: 0BE9
  Port Priority: 000
  Effective Port Priority: XXXXXXXXXXXXXX8300
  Neighbor Number: Not available
yyy-SW01, Po1 (Secondary Edge)
  Open Port, all vlans forwarding
  Bridge MAC: xxxx.xxxx.7600
  Port Number: 0BE9
  Port Priority: 000
  Effective Port Priority: XXXXXXXXXXXXXX7600
  Neighbor Number: Not available

My initial usage cases will be simple full blocking without VLAN load balancing, and maybe STNC, but I envisage it would probably go on the STP tab (to avoid making more tabs), under a REP heading much like the STP ports currently are. REP divulges the full ring topology, so a table with the data in a fixed order to preserve the topology would probably be enough initially:

Thoughts, tips or other?

Hey @rhinoau

Did you ever get anywhere with this?

If you are still working on it I would like to offer my help.

Nothing yet - I still have some production REP in use, but don’t know where to start on this one. Have left it to date.

I recently made a patch that was recently merged into LibreNMS to add REP support to Cisco switches. Please see:

You should see REP state sensors by now. If not, please let me know.