diff --git a/sonic-xcvrd/tests/test_xcvrd.py b/sonic-xcvrd/tests/test_xcvrd.py index 59788ffe1..5964790fc 100644 --- a/sonic-xcvrd/tests/test_xcvrd.py +++ b/sonic-xcvrd/tests/test_xcvrd.py @@ -1495,12 +1495,19 @@ def _check_notify_media_setting(self, index, expected_found=False, expected_valu port_mapping = PortMapping() port_change_event = PortChangeEvent('Ethernet0', index, 0, PortChangeEvent.PORT_ADD) port_mapping.handle_port_change_event(port_change_event) - media_settings_parser.notify_media_setting(logical_port_name, xcvr_info_dict, xcvr_table_helper, port_mapping) + media_settings_parser.notify_media_setting(logical_port_name, xcvr_info_dict, xcvr_table_helper, port_mapping, False) found, result = app_port_tbl.get(logical_port_name) result_dict = dict(result) if result else None assert found == expected_found assert result_dict == expected_value + # Test with unreliable_los as required + media_settings_parser.notify_media_setting(logical_port_name, xcvr_info_dict, xcvr_table_helper, port_mapping, True) + found, result = app_port_tbl.get(logical_port_name) + result_dict = dict(result) if result else None + assert found == expected_found + #assert result_dict == expected_value + @patch('xcvrd.xcvrd_utilities.optics_si_parser.g_optics_si_dict', optics_si_settings_dict) @patch('xcvrd.xcvrd._wrapper_get_presence', MagicMock(return_value=True)) def test_fetch_optics_si_setting(self): diff --git a/sonic-xcvrd/xcvrd/xcvrd.py b/sonic-xcvrd/xcvrd/xcvrd.py index 7355fcf07..3b4684a0f 100644 --- a/sonic-xcvrd/xcvrd/xcvrd.py +++ b/sonic-xcvrd/xcvrd/xcvrd.py @@ -1489,7 +1489,9 @@ def _post_port_sfp_info_and_dom_thr_to_db_once(self, port_mapping, xcvr_table_he rc = post_port_sfp_info_to_db(logical_port_name, port_mapping, xcvr_table_helper.get_intf_tbl(asic_index), transceiver_dict, stop_event) if rc != SFP_EEPROM_NOT_READY: if is_warm_start == False: - media_settings_parser.notify_media_setting(logical_port_name, transceiver_dict, xcvr_table_helper, port_mapping) + media_settings_parser.notify_media_setting(logical_port_name, transceiver_dict, xcvr_table_helper, port_mapping, False) + else: + media_settings_parser.notify_media_setting(logical_port_name, transceiver_dict, xcvr_table_helper, port_mapping, True) else: retry_eeprom_set.add(logical_port_name) @@ -1722,7 +1724,7 @@ def task_worker(self, stopping_event, sfp_error_event): self.dom_db_utils.post_port_dom_thresholds_to_db(logical_port) self.vdm_db_utils.post_port_vdm_thresholds_to_db(logical_port) - media_settings_parser.notify_media_setting(logical_port, transceiver_dict, self.xcvr_table_helper, self.port_mapping) + media_settings_parser.notify_media_setting(logical_port, transceiver_dict, self.xcvr_table_helper, self.port_mapping, False) transceiver_dict.clear() elif value == sfp_status_helper.SFP_STATUS_REMOVED: helper_logger.log_notice("{}: Got SFP removed event".format(logical_port)) @@ -1964,7 +1966,7 @@ def on_add_logical_port(self, port_change_event): else: self.dom_db_utils.post_port_dom_thresholds_to_db(port_change_event.port_name) self.vdm_db_utils.post_port_vdm_thresholds_to_db(port_change_event.port_name) - media_settings_parser.notify_media_setting(port_change_event.port_name, transceiver_dict, self.xcvr_table_helper, self.port_mapping) + media_settings_parser.notify_media_setting(port_change_event.port_name, transceiver_dict, self.xcvr_table_helper, self.port_mapping, False) else: status = sfp_status_helper.SFP_STATUS_REMOVED if not status else status update_port_transceiver_status_table_sw(port_change_event.port_name, status_sw_tbl, status, error_description) @@ -1992,7 +1994,7 @@ def retry_eeprom_reading(self): self.dom_db_utils.post_port_dom_thresholds_to_db(logical_port) self.vdm_db_utils.post_port_vdm_thresholds_to_db(logical_port) - media_settings_parser.notify_media_setting(logical_port, transceiver_dict, self.xcvr_table_helper, self.port_mapping) + media_settings_parser.notify_media_setting(logical_port, transceiver_dict, self.xcvr_table_helper, self.port_mapping, False) transceiver_dict.clear() retry_success_set.add(logical_port) # Update retry EEPROM set diff --git a/sonic-xcvrd/xcvrd/xcvrd_utilities/media_settings_parser.py b/sonic-xcvrd/xcvrd/xcvrd_utilities/media_settings_parser.py index 7428019eb..e3ee76c1b 100644 --- a/sonic-xcvrd/xcvrd/xcvrd_utilities/media_settings_parser.py +++ b/sonic-xcvrd/xcvrd/xcvrd_utilities/media_settings_parser.py @@ -26,6 +26,8 @@ SYSLOG_IDENTIFIER = "xcvrd" helper_logger = syslogger.SysLogger(SYSLOG_IDENTIFIER, enable_runtime_config=True) +unreliable_los_change_event_media_key = ['unreliable_los'] + PHYSICAL_PORT_NOT_EXIST = -1 def load_media_settings(): @@ -316,7 +318,7 @@ def get_speed_lane_count_and_subport(port, cfg_port_tbl): def notify_media_setting(logical_port_name, transceiver_dict, - xcvr_table_helper, port_mapping): + xcvr_table_helper, port_mapping, is_unreliable_los_setting_required=False): if not media_settings_present(): return @@ -367,6 +369,7 @@ def notify_media_setting(logical_port_name, transceiver_dict, return fvs = swsscommon.FieldValuePairs(len(media_dict)) + fvs_unreliable_los = swsscommon.FieldValuePairs(len(unreliable_los_change_event_media_key)) index = 0 helper_logger.log_notice("Publishing ASIC-side SI setting for port {} in APP_DB:".format(logical_port_name)) @@ -379,6 +382,15 @@ def notify_media_setting(logical_port_name, transceiver_dict, fvs[index] = (str(media_key), str(val_str)) index += 1 + if media_key in unreliable_los_change_event_media_key and is_unreliable_los_setting_required == True: + fvs_unreliable_los[0] = (str("apply_"+media_key), str(val_str)) + + + if is_unreliable_los_setting_required == True: + xcvr_table_helper.get_app_port_tbl(asic_index).set(port_name, fvs_unreliable_los) + # No need to apply other settings if unreliable_los_setting flag check is on + return + xcvr_table_helper.get_app_port_tbl(asic_index).set(port_name, fvs) xcvr_table_helper.get_state_port_tbl(asic_index).set(logical_port_name, [(NPU_SI_SETTINGS_SYNC_STATUS_KEY, NPU_SI_SETTINGS_NOTIFIED_VALUE)]) helper_logger.log_notice("Notify media setting: Published ASIC-side SI setting "