.. image:: ../../../_static/openl2m_logo.png
=========================
Discover interface optics
=========================
In the SNMP driver, we discover transceivers in the *self._get_interface_transceiver_types()* function,
called from *get_my_basic_info()* around line 1010. We use the MAU MIB to get transciever information.
Using MAU-MIB
-------------
The MAU (Media Access Unit) MIB is the standard way of describing media types, ie. transceivers.
See the MIB definition at https://www.iana.org/assignments/ianamau-mib/ianamau-mib
and the more readable version at https://mibs.observium.org/mib/MAU-MIB/
This MIB defines transceiver types for interface indeces. These types are defined as 'OID' formatted strings.
E.g. a value of ".1.3.6.1.2.1.26.4.35" means a 10GBase-LR optical transceiver.
We call _get_interface_transceiver_types() to read the device mib at **ifMauType** (.1.3.6.1.2.1.26.2.1.1.3).
This is parsed in *_parse_mibs_if_mau_type()* Here we read the return value,
and this is parsed to an optic or transceiver type in *_parse_and_set_mau_type()*
"Interesting" types are defined in snmp/constants.py, see the variable *mau_types*. We primarily want to show
optical transceivers. If a transceiver type of interest is present, we then assign a Transceiver() object to the
Interface(). This is then displayed in the template *_tpl_if_type_icons.html*, as shown here:
.. code-block:: jinja
{% if iface.transceiver %}
{% endif %}
**Note:** The return value from the call to read **ifMauType** are numbers defined by IANA in https://www.iana.org/assignments/ianamau-mib/ianamau-mib
and # https://datatracker.ietf.org/doc/html/rfc3636 .
They indicate the transceiver type. All valid returns start with ".1.3.6.1.2.1.26.4."
E.g. .1.3.6.1.2.1.26.2.1.1.3.**24.1** = OID: .1.3.6.1.2.1.26.4.35
24.1 is ., ie interface 24. The return value *".1.3.6.1.2.1.26.4.35"* is *"10GBASE-LR"*,
per the definitions in the IF-MAU MIB.
.. note::
Some drivers augment or override the _get_interface_transceiver_types() call to run their own discovery.
Other thoughs
-------------
**Not Implemented Yet**
We can also look at this:
entPhysicalClass (.1.3.6.1.2.1.47.1.1.1.1.5) for values 10 (Port)
.1.3.6.1.2.1.47.1.1.1.1.5.1006 = INTEGER: 10
followed by:
Use 'entPhysicalDescr ('.1.3.6.1.2.1.47.1.1.1.1.2')
.1.3.6.1.2.1.47.1.1.1.1.2.1006 = STRING: "Gigabit Ethernet Port"
.1.3.6.1.2.1.47.1.1.1.1.2.1007 = STRING: "SFP-10Gbase-SR"
*Some* implementation show the optics type in the device description, *but not all!*
The interface index 1006 is type .1.3.6.1.4.1.9.12.3.1.10.151
and interface 1007 is type .1.3.6.1.4.1.9.12.3.1.9.76.3, defined as SFP10GSR
See https://oid-base.com/get/1.3.6.1.4.1.9.12.3.1.9.76.3
entPhysicalVendorType (.1.3.6.1.2.1.47.1.1.1.1.3) can also be used:
.1.3.6.1.2.1.47.1.1.1.1.3.1006 = OID: .1.3.6.1.4.1.9.12.3.1.10.151
Cisco Entity VendorType OID MIB defines this as " cevPortGESFP", likely an empty SFP slot.
.1.3.6.1.2.1.47.1.1.1.1.3.1007 = OID: .1.3.6.1.4.1.9.12.3.1.9.76.3
defined by Cisco as "cevSFP10GSR", ie 10g-SR
Note that the returned value is *vendor-defined*, i.e. complex to parse!