def get_eeprom_dict(self, port_num): if not self.get_presence(port_num): return None sfp_data = {} eeprom_ifraw = self.get_eeprom_raw(port_num) eeprom_domraw = self.get_eeprom_dom_raw(port_num) if eeprom_ifraw is None: return None if port_num in self.qsfp_ports: sfpi_obj = sff8436InterfaceId(eeprom_ifraw) if sfpi_obj is not None: sfp_data['interface'] = sfpi_obj.get_data_pretty() sfpd_obj = sff8436Dom(eeprom_ifraw) if sfpd_obj is not None: sfp_data['dom'] = sfpd_obj.get_data_pretty() return sfp_data sfpi_obj = sff8472InterfaceId(eeprom_ifraw) if sfpi_obj is not None: sfp_data['interface'] = sfpi_obj.get_data_pretty() cal_type = sfpi_obj.get_calibration_type() if eeprom_domraw is not None: sfpd_obj = sff8472Dom(eeprom_domraw, cal_type) if sfpd_obj is not None: sfp_data['dom'] = sfpd_obj.get_data_pretty() return sfp_data
def get_eeprom_dict(self, port_num): """Returns dictionary of interface and dom data. format: {<port_num> : {'interface': {'version' : '1.0', 'data' : {...}}, 'dom' : {'version' : '1.0', 'data' : {...}}}} """ sfp_data = {} eeprom_ifraw = self.get_eeprom_raw(port_num) eeprom_domraw = self.get_eeprom_dom_raw(port_num) if eeprom_ifraw is None: return None if port_num in self.osfp_ports: sfpi_obj = inf8628InterfaceId(eeprom_ifraw) if sfpi_obj is not None: sfp_data['interface'] = sfpi_obj.get_data_pretty() return sfp_data elif port_num in self.qsfp_ports: sfpi_obj = sff8436InterfaceId(eeprom_ifraw) if sfpi_obj is not None: sfp_data['interface'] = sfpi_obj.get_data_pretty() # For Qsfp's the dom data is part of eeprom_if_raw # The first 128 bytes sfpd_obj = sff8436Dom(eeprom_ifraw) if sfpd_obj is not None: sfp_data['dom'] = sfpd_obj.get_data_pretty() return sfp_data else: sfpi_obj = sff8472InterfaceId(eeprom_ifraw) if sfpi_obj is not None: sfp_data['interface'] = sfpi_obj.get_data_pretty() cal_type = sfpi_obj.get_calibration_type() if eeprom_domraw is not None: sfpd_obj = sff8472Dom(eeprom_domraw, cal_type) if sfpd_obj is not None: sfp_data['dom'] = sfpd_obj.get_data_pretty() return sfp_data
def get_sfp_data(self, port_num): """Returns dictionary of interface and dom data. format: {<port_num> : {'interface': {'version' : '1.0', 'data' : { ... }}, 'dom' : {'version' : '1.0', 'data' : { ... }}}} """ sfp_data = {} if self.eeprom_ifraw == None: return None if port_num in self._qsfp_ports: sfpi_obj = sff8436InterfaceId(self.eeprom_ifraw) if sfpi_obj != None: sfp_data['interface'] = sfpi_obj.get_data_pretty() # For Qsfp's the dom data is part of eeprom_if_raw # The first 128 bytes sfpd_obj = sff8436Dom(self.eeprom_ifraw) if sfpd_obj != None: sfp_data['dom'] = sfpd_obj.get_data_pretty() return sfp_data sfpi_obj = sff8472InterfaceId(self.eeprom_ifraw) if sfpi_obj != None: sfp_data['interface'] = sfpi_obj.get_data_pretty() cal_type = sfpi_obj.get_calibration_type() if self.eeprom_domraw != None: sfpd_obj = sff8472Dom(self.eeprom_domraw, cal_type) if sfpd_obj != None: sfp_data['dom'] = sfpd_obj.get_data_pretty() return sfp_data
def get_transceiver_dom_info_dict(self, port_num): transceiver_dom_info_dict = {} 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 = open(file_path, "rb") except IOError: print("Error: reading sysfs file %s" % file_path) return None sfpd_obj = sff8436Dom() if sfpd_obj is None: return None sfpi_obj = sff8436InterfaceId() if sfpi_obj is None: return None # 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 None 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 None dom_voltage_raw = self._read_eeprom_specific_bytes( sysfsfile_eeprom, (offset + QSFP_VLOT_OFFSET), QSFP_VOLT_WIDTH) if dom_voltage_raw is not None: dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) else: return None 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 None 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 None 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 = open(file_path, "rb") except IOError: print("Error: reading sysfs file %s" % file_path) return None sfpd_obj = sff8472Dom() 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: dom_temperature_data = sfpd_obj.parse_temperature( dom_temperature_raw, 0) 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: 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