Skip to content

Commit 16aaa0f

Browse files
Fix port SI setting per speed during speed change
This change fixes the issue of port media settings not getting applied when speed change command is issued in CLI. Signed-off-by: Pavan Naregundi <[email protected]>
1 parent d555def commit 16aaa0f

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

sonic-xcvrd/xcvrd/xcvrd.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1998,6 +1998,8 @@ def on_port_config_change(self , port_change_event):
19981998
elif port_change_event.event_type == port_event_helper.PortChangeEvent.PORT_ADD:
19991999
self.port_mapping.handle_port_change_event(port_change_event)
20002000
self.on_add_logical_port(port_change_event)
2001+
elif port_change_event.event_type == port_event_helper.PortChangeEvent.PORT_SET:
2002+
self.on_update_logical_port(port_change_event)
20012003

20022004
def on_remove_logical_port(self, port_change_event):
20032005
"""Called when a logical port is removed from CONFIG_DB.
@@ -2095,6 +2097,31 @@ def on_add_logical_port(self, port_change_event):
20952097
status = sfp_status_helper.SFP_STATUS_REMOVED if not status else status
20962098
update_port_transceiver_status_table_sw(port_change_event.port_name, status_sw_tbl, status, error_description)
20972099

2100+
def on_update_logical_port(self, port_change_event):
2101+
"""Called when a logical port is updated.
2102+
Invoked to update media settings, when port speed is changed.
2103+
2104+
Args:
2105+
port_change_event (object): port change event
2106+
"""
2107+
int_tbl = self.xcvr_table_helper.get_intf_tbl(port_change_event.asic_id)
2108+
state_port_table = self.xcvr_table_helper.get_state_port_tbl(port_change_event.asic_id)
2109+
found, state_port_table_fvs = state_port_table.get(port_change_event.port_name)
2110+
if not found:
2111+
helper_logger.log_warning("Logical port {} not found in STATE_DB PORT_TABLE".format(port_change_event.port_name))
2112+
return
2113+
# Initialize the NPU_SI_SETTINGS_SYNC_STATUS to default value
2114+
state_port_table.set(port_change_event.port_name, [(NPU_SI_SETTINGS_SYNC_STATUS_KEY, NPU_SI_SETTINGS_DEFAULT_VALUE)])
2115+
2116+
if _wrapper_get_presence(port_change_event.port_index):
2117+
transceiver_dict = {}
2118+
rc = post_port_sfp_info_to_db(port_change_event.port_name, self.port_mapping, int_tbl, transceiver_dict)
2119+
if rc == SFP_EEPROM_NOT_READY:
2120+
# Failed to read EEPROM, put it to retry set
2121+
self.retry_eeprom_set.add(port_change_event.port_name)
2122+
else:
2123+
media_settings_parser.notify_media_setting(port_change_event.port_name, transceiver_dict, self.xcvr_table_helper, self.port_mapping)
2124+
20982125
def retry_eeprom_reading(self):
20992126
"""Retry EEPROM reading, if retry succeed, remove the logical port from the retry set
21002127
"""

sonic-xcvrd/xcvrd/xcvrd_utilities/port_event_helper.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,13 @@ def __init__(self):
225225
self.physical_to_logical = {}
226226
# Logical port name to ASIC ID mapping
227227
self.logical_to_asic = {}
228+
self.port_event_cache = {}
229+
230+
def apply_filter_to_fvp(self, filter, fvp):
231+
if filter is not None:
232+
for key in fvp.copy().keys():
233+
if key not in (set(filter) | set({'index', 'port_name', 'asic_id'})):
234+
del fvp[key]
228235

229236
def handle_port_change_event(self, port_change_event):
230237
if port_change_event.event_type == PortChangeEvent.PORT_ADD:
@@ -313,6 +320,12 @@ def read_port_config_change(asic_context, port_mapping, logger, port_change_even
313320
fvp = dict(fvp)
314321
if not multi_asic.is_front_panel_port(key, fvp.get(multi_asic.PORT_ROLE, None)):
315322
continue
323+
324+
fvp['port_name'] = key
325+
fvp['asic_id'] = asic_context[port_tbl]
326+
filter = ['speed']
327+
port_mapping.apply_filter_to_fvp(filter, fvp)
328+
316329
if op == swsscommon.SET_COMMAND:
317330
if 'index' not in fvp:
318331
continue
@@ -333,6 +346,15 @@ def read_port_config_change(asic_context, port_mapping, logger, port_change_even
333346

334347
port_change_event = PortChangeEvent(key, new_physical_index, asic_context[port_tbl], PortChangeEvent.PORT_ADD)
335348
port_change_event_handler(port_change_event)
349+
else:
350+
if key in port_mapping.port_event_cache:
351+
# Compare current event with last event on this key, to see if
352+
# there's really a need to update.
353+
diff = set(fvp.items()) - set(port_mapping.port_event_cache[key].items())
354+
# Create set event handler if there is a difference
355+
if diff:
356+
port_change_event = PortChangeEvent(key, new_physical_index, asic_context[port_tbl], PortChangeEvent.PORT_SET)
357+
port_change_event_handler(port_change_event)
336358
elif op == swsscommon.DEL_COMMAND:
337359
if port_mapping.is_logical_port(key):
338360
port_change_event = PortChangeEvent(key,
@@ -343,6 +365,9 @@ def read_port_config_change(asic_context, port_mapping, logger, port_change_even
343365
else:
344366
logger.log_warning('Invalid DB operation: {}'.format(op))
345367

368+
# Update the latest event to the cache
369+
port_mapping.port_event_cache[key] = fvp
370+
346371
def get_port_mapping(namespaces):
347372
"""Get port mapping from CONFIG_DB
348373
"""

0 commit comments

Comments
 (0)