def get_transceiver_dom_info_dict(self, port_num): transceiver_dom_info_dict = {} dom_info_dict_keys = [ 'temperature', 'voltage', 'rx1power', 'rx2power', 'rx3power', 'rx4power', 'tx1bias', 'tx2bias', 'tx3bias', 'tx4bias', 'tx1power', 'tx2power', 'tx3power', 'tx4power', ] transceiver_dom_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') if port_num in self.qsfp_ports: offset = 0 offset_xcvr = 128 file_path = self._get_port_eeprom_path(port_num, self.IDENTITY_EEPROM_ADDR) if not self._sfp_eeprom_present(file_path, 0): return None try: sysfsfile_eeprom = io.open(file_path, mode="rb", buffering=0) except IOError: print("Error: reading sysfs file %s" % file_path) return None sfpd_obj = sff8436Dom() if sfpd_obj is None: return transceiver_dom_info_dict sfpi_obj = sff8436InterfaceId() if sfpi_obj is None: return transceiver_dom_info_dict # QSFP capability byte parse, through this byte can know whether it support tx_power or not. # TODO: in the future when decided to migrate to support SFF-8636 instead of SFF-8436, # need to add more code for determining the capability and version compliance # in SFF-8636 dom capability definitions evolving with the versions. qsfp_dom_capability_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset_xcvr + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) if qsfp_dom_capability_raw is not None: qspf_dom_capability_data = sfpi_obj.parse_qsfp_dom_capability( qsfp_dom_capability_raw, 0) else: return transceiver_dom_info_dict dom_temperature_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) if dom_temperature_raw is not None: dom_temperature_data = sfpd_obj.parse_temperature( dom_temperature_raw, 0) else: return transceiver_dom_info_dict dom_voltage_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + QSFP_VOLT_OFFSET), QSFP_VOLT_WIDTH) if dom_voltage_raw is not None: dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) else: return transceiver_dom_info_dict qsfp_dom_rev_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + QSFP_DOM_REV_OFFSET), QSFP_DOM_REV_WIDTH) if qsfp_dom_rev_raw is not None: qsfp_dom_rev_data = sfpd_obj.parse_sfp_dom_rev( qsfp_dom_rev_raw, 0) else: return transceiver_dom_info_dict transceiver_dom_info_dict['temperature'] = dom_temperature_data[ 'data']['Temperature']['value'] transceiver_dom_info_dict['voltage'] = dom_voltage_data['data'][ 'Vcc']['value'] # The tx_power monitoring is only available on QSFP which compliant with SFF-8636 # and claimed that it support tx_power with one indicator bit. dom_channel_monitor_data = {} qsfp_dom_rev = qsfp_dom_rev_data['data']['dom_rev']['value'] qsfp_tx_power_support = qspf_dom_capability_data['data'][ 'Tx_power_support']['value'] if (qsfp_dom_rev[0:8] != 'SFF-8636' or (qsfp_dom_rev[0:8] == 'SFF-8636' and qsfp_tx_power_support != 'on')): dom_channel_monitor_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WIDTH) if dom_channel_monitor_raw is not None: dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params( dom_channel_monitor_raw, 0) else: return transceiver_dom_info_dict transceiver_dom_info_dict['tx1power'] = 'N/A' transceiver_dom_info_dict['tx2power'] = 'N/A' transceiver_dom_info_dict['tx3power'] = 'N/A' transceiver_dom_info_dict['tx4power'] = 'N/A' else: dom_channel_monitor_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) if dom_channel_monitor_raw is not None: dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power( dom_channel_monitor_raw, 0) else: return None transceiver_dom_info_dict[ 'tx1power'] = dom_channel_monitor_data['data']['TX1Power'][ 'value'] transceiver_dom_info_dict[ 'tx2power'] = dom_channel_monitor_data['data']['TX2Power'][ 'value'] transceiver_dom_info_dict[ 'tx3power'] = dom_channel_monitor_data['data']['TX3Power'][ 'value'] transceiver_dom_info_dict[ 'tx4power'] = dom_channel_monitor_data['data']['TX4Power'][ 'value'] try: sysfsfile_eeprom.close() except IOError: print("Error: closing sysfs file %s" % file_path) return None transceiver_dom_info_dict['temperature'] = dom_temperature_data[ 'data']['Temperature']['value'] transceiver_dom_info_dict['voltage'] = dom_voltage_data['data'][ 'Vcc']['value'] transceiver_dom_info_dict['rx1power'] = dom_channel_monitor_data[ 'data']['RX1Power']['value'] transceiver_dom_info_dict['rx2power'] = dom_channel_monitor_data[ 'data']['RX2Power']['value'] transceiver_dom_info_dict['rx3power'] = dom_channel_monitor_data[ 'data']['RX3Power']['value'] transceiver_dom_info_dict['rx4power'] = dom_channel_monitor_data[ 'data']['RX4Power']['value'] transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data[ 'data']['TX1Bias']['value'] transceiver_dom_info_dict['tx2bias'] = dom_channel_monitor_data[ 'data']['TX2Bias']['value'] transceiver_dom_info_dict['tx3bias'] = dom_channel_monitor_data[ 'data']['TX3Bias']['value'] transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data[ 'data']['TX4Bias']['value'] else: offset = 256 file_path = self._get_port_eeprom_path(port_num, self.DOM_EEPROM_ADDR) if not self._sfp_eeprom_present(file_path, 0): return None try: sysfsfile_eeprom = io.open(file_path, "rb", 0) except IOError: print("Error: reading sysfs file %s" % file_path) return None sfpd_obj = sff8472Dom(None, 1) if sfpd_obj is None: return transceiver_dom_info_dict dom_temperature_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + SFP_TEMPE_OFFSET), SFP_TEMPE_WIDTH) if dom_temperature_raw is not None: dom_temperature_data = sfpd_obj.parse_temperature( dom_temperature_raw, 0) else: return transceiver_dom_info_dict dom_voltage_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + SFP_VOLT_OFFSET), SFP_VOLT_WIDTH) if dom_voltage_raw is not None: dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) else: return transceiver_dom_info_dict dom_channel_monitor_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + SFP_MODULE_THRESHOLD_OFFSET), SFP_MODULE_THRESHOLD_WIDTH) if dom_channel_monitor_raw is not None: dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params( dom_channel_monitor_raw, 0) else: return transceiver_dom_info_dict try: sysfsfile_eeprom.close() except IOError: print("Error: closing sysfs file %s" % file_path) return None transceiver_dom_info_dict['temperature'] = dom_temperature_data[ 'data']['Temperature']['value'] transceiver_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc'][ 'value'] transceiver_dom_info_dict['rx1power'] = dom_channel_monitor_data[ 'data']['RXPower']['value'] transceiver_dom_info_dict['rx2power'] = 'N/A' transceiver_dom_info_dict['rx3power'] = 'N/A' transceiver_dom_info_dict['rx4power'] = 'N/A' transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data[ 'data']['TXBias']['value'] transceiver_dom_info_dict['tx2bias'] = 'N/A' transceiver_dom_info_dict['tx3bias'] = 'N/A' transceiver_dom_info_dict['tx4bias'] = 'N/A' transceiver_dom_info_dict['tx1power'] = dom_channel_monitor_data[ 'data']['TXPower']['value'] transceiver_dom_info_dict['tx2power'] = 'N/A' transceiver_dom_info_dict['tx3power'] = 'N/A' transceiver_dom_info_dict['tx4power'] = 'N/A' return transceiver_dom_info_dict
def get_transceiver_dom_threshold_info_dict(self, port_num): transceiver_dom_threshold_info_dict = {} dom_info_dict_keys = [ 'temphighalarm', 'temphighwarning', 'templowalarm', 'templowwarning', 'vcchighalarm', 'vcchighwarning', 'vcclowalarm', 'vcclowwarning', 'rxpowerhighalarm', 'rxpowerhighwarning', 'rxpowerlowalarm', 'rxpowerlowwarning', 'txpowerhighalarm', 'txpowerhighwarning', 'txpowerlowalarm', 'txpowerlowwarning', 'txbiashighalarm', 'txbiashighwarning', 'txbiaslowalarm', 'txbiaslowwarning' ] transceiver_dom_threshold_info_dict = dict.fromkeys( dom_info_dict_keys, 'N/A') if port_num in self.qsfp_ports: file_path = self._get_port_eeprom_path(port_num, self.IDENTITY_EEPROM_ADDR) if not self._sfp_eeprom_present(file_path, 0): return None try: sysfsfile_eeprom = io.open(file_path, mode="rb", buffering=0) except IOError: print("Error: reading sysfs file %s" % file_path) return None sfpd_obj = sff8436Dom() if sfpd_obj is None: return transceiver_dom_threshold_info_dict # Dom Threshold data starts from offset 384 # Revert offset back to 0 once data is retrieved offset = 384 dom_module_threshold_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + QSFP_MODULE_THRESHOLD_OFFSET), QSFP_MODULE_THRESHOLD_WIDTH) if dom_module_threshold_raw is not None: dom_module_threshold_data = sfpd_obj.parse_module_threshold_values( dom_module_threshold_raw, 0) else: return transceiver_dom_threshold_info_dict dom_channel_threshold_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + QSFP_CHANNL_THRESHOLD_OFFSET), QSFP_CHANNL_THRESHOLD_WIDTH) if dom_channel_threshold_raw is not None: dom_channel_threshold_data = sfpd_obj.parse_channel_threshold_values( dom_channel_threshold_raw, 0) else: return transceiver_dom_threshold_info_dict try: sysfsfile_eeprom.close() except IOError: print("Error: closing sysfs file %s" % file_path) return None # Threshold Data transceiver_dom_threshold_info_dict[ 'temphighalarm'] = dom_module_threshold_data['data'][ 'TempHighAlarm']['value'] transceiver_dom_threshold_info_dict[ 'temphighwarning'] = dom_module_threshold_data['data'][ 'TempHighWarning']['value'] transceiver_dom_threshold_info_dict[ 'templowalarm'] = dom_module_threshold_data['data'][ 'TempLowAlarm']['value'] transceiver_dom_threshold_info_dict[ 'templowwarning'] = dom_module_threshold_data['data'][ 'TempLowWarning']['value'] transceiver_dom_threshold_info_dict[ 'vcchighalarm'] = dom_module_threshold_data['data'][ 'VccHighAlarm']['value'] transceiver_dom_threshold_info_dict[ 'vcchighwarning'] = dom_module_threshold_data['data'][ 'VccHighWarning']['value'] transceiver_dom_threshold_info_dict[ 'vcclowalarm'] = dom_module_threshold_data['data'][ 'VccLowAlarm']['value'] transceiver_dom_threshold_info_dict[ 'vcclowwarning'] = dom_module_threshold_data['data'][ 'VccLowWarning']['value'] transceiver_dom_threshold_info_dict[ 'rxpowerhighalarm'] = dom_channel_threshold_data['data'][ 'RxPowerHighAlarm']['value'] transceiver_dom_threshold_info_dict[ 'rxpowerhighwarning'] = dom_channel_threshold_data['data'][ 'RxPowerHighWarning']['value'] transceiver_dom_threshold_info_dict[ 'rxpowerlowalarm'] = dom_channel_threshold_data['data'][ 'RxPowerLowAlarm']['value'] transceiver_dom_threshold_info_dict[ 'rxpowerlowwarning'] = dom_channel_threshold_data['data'][ 'RxPowerLowWarning']['value'] transceiver_dom_threshold_info_dict[ 'txbiashighalarm'] = dom_channel_threshold_data['data'][ 'TxBiasHighAlarm']['value'] transceiver_dom_threshold_info_dict[ 'txbiashighwarning'] = dom_channel_threshold_data['data'][ 'TxBiasHighWarning']['value'] transceiver_dom_threshold_info_dict[ 'txbiaslowalarm'] = dom_channel_threshold_data['data'][ 'TxBiasLowAlarm']['value'] transceiver_dom_threshold_info_dict[ 'txbiaslowwarning'] = dom_channel_threshold_data['data'][ 'TxBiasLowWarning']['value'] else: offset = 256 file_path = self._get_port_eeprom_path(port_num, self.DOM_EEPROM_ADDR) if not self._sfp_eeprom_present(file_path, 0): return None try: sysfsfile_eeprom = io.open(file_path, "rb", 0) except IOError: print("Error: reading sysfs file %s" % file_path) return None sfpd_obj = sff8472Dom(None, 1) if sfpd_obj is None: return transceiver_dom_threshold_info_dict dom_module_threshold_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + SFP_MODULE_THRESHOLD_OFFSET), SFP_MODULE_THRESHOLD_WIDTH) if dom_module_threshold_raw is not None: dom_module_threshold_data = sfpd_obj.parse_alarm_warning_threshold( dom_module_threshold_raw, 0) else: return transceiver_dom_threshold_info_dict try: sysfsfile_eeprom.close() except IOError: print("Error: closing sysfs file %s" % file_path) return None #Threshold Data transceiver_dom_threshold_info_dict[ 'temphighalarm'] = dom_module_threshold_data['data'][ 'TempHighAlarm']['value'] transceiver_dom_threshold_info_dict[ 'templowalarm'] = dom_module_threshold_data['data'][ 'TempLowAlarm']['value'] transceiver_dom_threshold_info_dict[ 'temphighwarning'] = dom_module_threshold_data['data'][ 'TempHighWarning']['value'] transceiver_dom_threshold_info_dict[ 'templowwarning'] = dom_module_threshold_data['data'][ 'TempLowWarning']['value'] transceiver_dom_threshold_info_dict[ 'vcchighalarm'] = dom_module_threshold_data['data'][ 'VoltageHighAlarm']['value'] transceiver_dom_threshold_info_dict[ 'vcclowalarm'] = dom_module_threshold_data['data'][ 'VoltageLowAlarm']['value'] transceiver_dom_threshold_info_dict[ 'vcchighwarning'] = dom_module_threshold_data['data'][ 'VoltageHighWarning']['value'] transceiver_dom_threshold_info_dict[ 'vcclowwarning'] = dom_module_threshold_data['data'][ 'VoltageLowWarning']['value'] transceiver_dom_threshold_info_dict[ 'txbiashighalarm'] = dom_module_threshold_data['data'][ 'BiasHighAlarm']['value'] transceiver_dom_threshold_info_dict[ 'txbiaslowalarm'] = dom_module_threshold_data['data'][ 'BiasLowAlarm']['value'] transceiver_dom_threshold_info_dict[ 'txbiashighwarning'] = dom_module_threshold_data['data'][ 'BiasHighWarning']['value'] transceiver_dom_threshold_info_dict[ 'txbiaslowwarning'] = dom_module_threshold_data['data'][ 'BiasLowWarning']['value'] transceiver_dom_threshold_info_dict[ 'txpowerhighalarm'] = dom_module_threshold_data['data'][ 'TXPowerHighAlarm']['value'] transceiver_dom_threshold_info_dict[ 'txpowerlowalarm'] = dom_module_threshold_data['data'][ 'TXPowerLowAlarm']['value'] transceiver_dom_threshold_info_dict[ 'txpowerhighwarning'] = dom_module_threshold_data['data'][ 'TXPowerHighWarning']['value'] transceiver_dom_threshold_info_dict[ 'txpowerlowwarning'] = dom_module_threshold_data['data'][ 'TXPowerLowWarning']['value'] transceiver_dom_threshold_info_dict[ 'rxpowerhighalarm'] = dom_module_threshold_data['data'][ 'RXPowerHighAlarm']['value'] transceiver_dom_threshold_info_dict[ 'rxpowerlowalarm'] = dom_module_threshold_data['data'][ 'RXPowerLowAlarm']['value'] transceiver_dom_threshold_info_dict[ 'rxpowerhighwarning'] = dom_module_threshold_data['data'][ 'RXPowerHighWarning']['value'] transceiver_dom_threshold_info_dict[ 'rxpowerlowwarning'] = dom_module_threshold_data['data'][ 'RXPowerLowWarning']['value'] return transceiver_dom_threshold_info_dict
def get_transceiver_dom_info_dict(self, port_num): if port_num in self.qsfp_ports: return SfpUtilBase.get_transceiver_dom_info_dict(self, port_num) else: transceiver_dom_info_dict = {} offset = 0 file_path = self._get_port_eeprom_path(port_num, self.DOM_EEPROM_ADDR) if not self._sfp_eeprom_present(file_path, 0): return None try: sysfsfile_eeprom = open(file_path, "rb") except IOError: print("Error: reading sysfs file %s" % file_path) return None sfpd_obj = sff8472Dom(None, 1) if sfpd_obj is None: return None dom_temperature_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + SFP_TEMPE_OFFSET), SFP_TEMPE_WIDTH) if dom_temperature_raw is not None: print(dom_temperature_raw) dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) print(dom_temperature_data) else: return None dom_voltage_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + SFP_VLOT_OFFSET), SFP_VOLT_WIDTH) if dom_voltage_raw is not None: print(dom_voltage_raw) dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) else: return None dom_channel_monitor_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH) if dom_channel_monitor_raw is not None: dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_channel_monitor_raw, 0) else: return None try: sysfsfile_eeprom.close() except IOError: print("Error: closing sysfs file %s" % file_path) return None transceiver_dom_info_dict['temperature'] = dom_temperature_data['data']['Temperature']['value'] transceiver_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc']['value'] transceiver_dom_info_dict['rx1power'] = dom_channel_monitor_data['data']['RXPower']['value'] transceiver_dom_info_dict['rx2power'] = 'N/A' transceiver_dom_info_dict['rx3power'] = 'N/A' transceiver_dom_info_dict['rx4power'] = 'N/A' transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TXBias']['value'] transceiver_dom_info_dict['tx2bias'] = 'N/A' transceiver_dom_info_dict['tx3bias'] = 'N/A' transceiver_dom_info_dict['tx4bias'] = 'N/A' transceiver_dom_info_dict['tx1power'] = dom_channel_monitor_data['data']['TXPower']['value'] transceiver_dom_info_dict['tx2power'] = 'N/A' transceiver_dom_info_dict['tx3power'] = 'N/A' transceiver_dom_info_dict['tx4power'] = 'N/A' return transceiver_dom_info_dict