@@ -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+
346371def get_port_mapping (namespaces ):
347372 """Get port mapping from CONFIG_DB
348373 """
0 commit comments