From ee038c29a25855894a48450ec3472a96d495eedb Mon Sep 17 00:00:00 2001 From: Wataru Ishida Date: Mon, 11 Nov 2024 08:31:35 +0000 Subject: [PATCH 1/6] vs: don't throw an exception when metadata file doesn't exist the metadata file doesn't exist on pizza box vs platforms. Signed-off-by: Wataru Ishida --- platform/vs/sonic-platform-modules-vs/sonic_platform/chassis.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/platform/vs/sonic-platform-modules-vs/sonic_platform/chassis.py b/platform/vs/sonic-platform-modules-vs/sonic_platform/chassis.py index 1e9bd1f2ccb7..6b43aed233ea 100644 --- a/platform/vs/sonic-platform-modules-vs/sonic_platform/chassis.py +++ b/platform/vs/sonic-platform-modules-vs/sonic_platform/chassis.py @@ -30,8 +30,6 @@ def _read_metadata(self): if os.path.exists(self.metadata_file): with open(self.metadata_file, 'r') as f: metadata = json.load(f) - else: - raise FileNotFoundError("Metadata file {} not found".format(self.metadata_file)) return metadata def get_supervisor_slot(self): From a30ed3f593999b422d62ac5ccd9885f4afad8d41 Mon Sep 17 00:00:00 2001 From: Wataru Ishida Date: Mon, 16 Dec 2024 07:57:25 +0000 Subject: [PATCH 2/6] vs: package the sonic-platform wheel to install it in the pmon container the package is installed when pmon container starts. see dockers/docker-platform-monitor/docker_init.j2 for details. Signed-off-by: Wataru Ishida --- platform/vs/sonic-platform-modules-vs/debian/rules | 2 +- .../sonic-platform-modules-vs/debian/sonic-platform-vs.install | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 platform/vs/sonic-platform-modules-vs/debian/sonic-platform-vs.install diff --git a/platform/vs/sonic-platform-modules-vs/debian/rules b/platform/vs/sonic-platform-modules-vs/debian/rules index ab27fce12045..00e2d9b8ee75 100755 --- a/platform/vs/sonic-platform-modules-vs/debian/rules +++ b/platform/vs/sonic-platform-modules-vs/debian/rules @@ -22,7 +22,7 @@ clean: dh_clean build: - # Nothing to do + $(PYTHON) setup.py bdist_wheel -d $(SRC_DIR) binary: binary-arch binary-indep diff --git a/platform/vs/sonic-platform-modules-vs/debian/sonic-platform-vs.install b/platform/vs/sonic-platform-modules-vs/debian/sonic-platform-vs.install new file mode 100644 index 000000000000..e6f12eb7abcc --- /dev/null +++ b/platform/vs/sonic-platform-modules-vs/debian/sonic-platform-vs.install @@ -0,0 +1 @@ +sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-kvm_x86_64-r0 From abac390e26a3d472e4a0fe549552c3b6b984bf54 Mon Sep 17 00:00:00 2001 From: Wataru Ishida Date: Tue, 17 Dec 2024 01:22:17 +0000 Subject: [PATCH 3/6] xcvr-emu: add xcvr-emu package ``` make target/python-wheels/bookworm/xcvr_emu-1.0.1-py3-none-any.whl ``` Signed-off-by: Wataru Ishida --- .gitmodules | 5 ++++- rules/xcvr-emu.dep | 11 +++++++++++ rules/xcvr-emu.mk | 7 +++++++ src/xcvr-emu | 1 + 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 rules/xcvr-emu.dep create mode 100644 rules/xcvr-emu.mk create mode 160000 src/xcvr-emu diff --git a/.gitmodules b/.gitmodules index f8d10f3af4ab..adc4e3312a47 100644 --- a/.gitmodules +++ b/.gitmodules @@ -132,4 +132,7 @@ url = https://github.com/Marvell-switching/sonic-platform-marvell.git [submodule "platform/vpp"] path = platform/vpp - url = https://github.com/sonic-net/sonic-platform-vpp.git \ No newline at end of file + url = https://github.com/sonic-net/sonic-platform-vpp.git +[submodule "src/xcvr-emu"] + path = src/xcvr-emu + url = https://github.com/ishidawataru/xcvr-emu.git diff --git a/rules/xcvr-emu.dep b/rules/xcvr-emu.dep new file mode 100644 index 000000000000..9ebff8786daf --- /dev/null +++ b/rules/xcvr-emu.dep @@ -0,0 +1,11 @@ +SPATH := $($(XCVR_EMU_PY3)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/xcvr-emu.mk rules/xcvr-emu.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +SMDEP_FILES := $(addprefix $(SPATH)/,$(shell cd $(SPATH) && git ls-files)) + +$(XCVR_EMU_PY3)_CACHE_MODE := GIT_CONTENT_SHA +$(XCVR_EMU_PY3)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(XCVR_EMU_PY3)_DEP_FILES := $(DEP_FILES) +$(XCVR_EMU_PY3)_SMDEP_FILES := $(SMDEP_FILES) +$(XCVR_EMU_PY3)_SMDEP_PATHS := $(SPATH) + diff --git a/rules/xcvr-emu.mk b/rules/xcvr-emu.mk new file mode 100644 index 000000000000..2af5aa2d7e6c --- /dev/null +++ b/rules/xcvr-emu.mk @@ -0,0 +1,7 @@ +# xcvr-emu wheel package + +XCVR_EMU_PY3 = xcvr_emu-1.0.1-py3-none-any.whl +$(XCVR_EMU_PY3)_SRC_PATH = $(SRC_PATH)/xcvr-emu +$(XCVR_EMU_PY3)_PYTHON_VERSION = 3 +$(XCVR_EMU_PY3)_TEST = n +SONIC_PYTHON_WHEELS += $(XCVR_EMU_PY3) diff --git a/src/xcvr-emu b/src/xcvr-emu new file mode 160000 index 000000000000..feeeb8754774 --- /dev/null +++ b/src/xcvr-emu @@ -0,0 +1 @@ +Subproject commit feeeb87547744c82a6278c826235481a9bd02d12 From 2ab515583eb396e1ff6b65864093d1d1b4d72706 Mon Sep 17 00:00:00 2001 From: Wataru Ishida Date: Tue, 17 Dec 2024 07:00:32 +0000 Subject: [PATCH 4/6] pmon: support starting xcvr-emud in pmon container Signed-off-by: Wataru Ishida --- .../x86_64-kvm_x86_64-r0/xcvr_emu.yaml | 140 ++++++++++++++++++ .../docker-pmon.supervisord.conf.j2 | 13 ++ .../docker-platform-monitor/docker_init.j2 | 15 +- .../build_templates/sonic_debian_extension.j2 | 8 + rules/docker-platform-monitor.mk | 3 + slave.mk | 1 + 6 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 device/virtual/x86_64-kvm_x86_64-r0/xcvr_emu.yaml diff --git a/device/virtual/x86_64-kvm_x86_64-r0/xcvr_emu.yaml b/device/virtual/x86_64-kvm_x86_64-r0/xcvr_emu.yaml new file mode 100644 index 000000000000..e37b906efc84 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/xcvr_emu.yaml @@ -0,0 +1,140 @@ +transceivers: + 0: + present: true + defaults: &defaults + SFF8024Identifier: "QSFP_DD" + SFF8024IdentifierCopy: "QSFP_DD" + VendorName: "xcvr-emu" + VendorRev: "01" + VendorOUI: 0x010203 + VendorSN: "0123456789" + DateCode: + Year: "24" + Month: "12" + DayOfMonth: "14" + LengthMultiplier: "MULTIPLIER_100" + BaseLength: 1 + CmisRevision: + Major: 5 + Minor: 2 + MediaType: "OPTICAL_SMF" + ModulePowerClass: "CLASS_8" + MaxPower: 40 # 10.0 W + + ConnectorType: "MPO_1X16" + ModuleActiveFirmwareMajorRevision: 1 + ModuleActiveFirmwareMinorRevision: 2 + ModuleInactiveFirmwareMajorRevision: 1 + ModuleInactiveFirmwareMinorRevision: 1 + MemoryModel: "PAGED" + MciMaxSpeed: "UP_TO_400_KHZ" + ApplicationDescriptor: + - HostInterfaceID: 79 # 400GAUI-4-S C2M (Annex 120G) + MediaInterfaceID: 28 # 400GBASE-DR4 (Cl 124) + HostLaneCount: 4 + MediaLaneCount: 4 + HostLaneAssignmentOptions: 0b1 + - HostInterfaceID: 71 # 200GAUI-CR2 (Clause 162) + MediaInterfaceID: 23 # 200GBASE-DR4 (Cl 121) + HostLaneCount: 2 + MediaLaneCount: 2 + HostLaneAssignmentOptions: 0b101 + MediaLaneAssignmentOptions: + - 0b001 + - 0b101 + MaxDurationDPInit: "BETWEEN_1_AND_5_S" + OutputDisableTxSupported: "SUPPORTED" + SteppedConfigOnly: "STEP_BY_STEP" # no support for intervention-free reconfiguration + 1: + present: false + defaults: *defaults + 2: + present: false + defaults: *defaults + 3: + present: false + defaults: *defaults + 4: + present: false + defaults: *defaults + 5: + present: false + defaults: *defaults + 6: + present: false + defaults: *defaults + 7: + present: false + defaults: *defaults + 8: + present: false + defaults: *defaults + 9: + present: false + defaults: *defaults + 10: + present: false + defaults: *defaults + 11: + present: false + defaults: *defaults + 12: + present: false + defaults: *defaults + 13: + present: false + defaults: *defaults + 14: + present: false + defaults: *defaults + 15: + present: false + defaults: *defaults + 16: + present: false + defaults: *defaults + 17: + present: false + defaults: *defaults + 18: + present: false + defaults: *defaults + 19: + present: false + defaults: *defaults + 20: + present: false + defaults: *defaults + 21: + present: false + defaults: *defaults + 22: + present: false + defaults: *defaults + 23: + present: false + defaults: *defaults + 24: + present: false + defaults: *defaults + 25: + present: false + defaults: *defaults + 26: + present: false + defaults: *defaults + 27: + present: false + defaults: *defaults + 28: + present: false + defaults: *defaults + 29: + present: false + defaults: *defaults + 30: + present: false + defaults: *defaults + 31: + present: false + defaults: *defaults diff --git a/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 b/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 index 89b23b5b1ee2..c9e12adcd4b3 100644 --- a/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 +++ b/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 @@ -115,6 +115,19 @@ dependent_startup=true dependent_startup_wait_for=rsyslogd:running {% endif %} +{% if ENABLE_XCVR_EMU == 1 %} +[program:xcvr-emud] +command=/usr/local/bin/xcvr-emud -c {{XCVR_EMU_CONF_FILE}} +priority=5 +autostart=false +autorestart=unexpected +stdout_logfile=syslog +stderr_logfile=syslog +startsecs=10 +dependent_startup=true +dependent_startup_wait_for=rsyslogd:running +{% endif %} + {% if not skip_xcvrd %} [program:xcvrd] {% set base_command = "python3 /usr/local/bin/xcvrd" %} diff --git a/dockers/docker-platform-monitor/docker_init.j2 b/dockers/docker-platform-monitor/docker_init.j2 index c8e2943e6688..ade106b4f4da 100755 --- a/dockers/docker-platform-monitor/docker_init.j2 +++ b/dockers/docker-platform-monitor/docker_init.j2 @@ -9,10 +9,12 @@ FANCONTROL_CONF_FILE="/usr/share/sonic/platform/fancontrol" SUPERVISOR_CONF_TEMPLATE="/usr/share/sonic/templates/docker-pmon.supervisord.conf.j2" SUPERVISOR_CONF_FILE="/etc/supervisor/conf.d/supervisord.conf" MODULAR_CHASSISDB_CONF_FILE="/usr/share/sonic/platform/chassisdb.conf" +XCVR_EMU_CONF_FILE="/usr/share/sonic/platform/xcvr_emu.yaml" HAVE_SENSORS_CONF=0 HAVE_FANCONTROL_CONF=0 IS_MODULAR_CHASSIS=0 +ENABLE_XCVR_EMU=0 # Default use python2 version SONIC_PLATFORM_API_PYTHON_VERSION=2 @@ -119,7 +121,18 @@ if [ -e $MODULAR_CHASSISDB_CONF_FILE ]; then IS_MODULAR_CHASSIS=1 fi -confvar="{\"HAVE_SENSORS_CONF\":$HAVE_SENSORS_CONF, \"HAVE_FANCONTROL_CONF\":$HAVE_FANCONTROL_CONF, \"API_VERSION\":$SONIC_PLATFORM_API_PYTHON_VERSION, \"IS_MODULAR_CHASSIS\":$IS_MODULAR_CHASSIS}" +if [ -e $XCVR_EMU_CONF_FILE ]; then + ENABLE_XCVR_EMU=1 +fi + +confvar="{\ + \"HAVE_SENSORS_CONF\":$HAVE_SENSORS_CONF,\ + \"HAVE_FANCONTROL_CONF\":$HAVE_FANCONTROL_CONF,\ + \"API_VERSION\":$SONIC_PLATFORM_API_PYTHON_VERSION,\ + \"IS_MODULAR_CHASSIS\":$IS_MODULAR_CHASSIS,\ + \"ENABLE_XCVR_EMU\":$ENABLE_XCVR_EMU,\ + \"XCVR_EMU_CONF_FILE\":\"$XCVR_EMU_CONF_FILE\"\ +}" if [ -e $PMON_DAEMON_CONTROL_FILE ]; then diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 2217859dd827..26436dd13bd3 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -1151,6 +1151,14 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in {% endif %} +{% if sonic_asic_platform == "vs" %} +# Install xcvr-emu Python 3 package +XCVR_EMU_PY3_WHEEL_NAME=$(basename {{xcvr_emu_py3_wheel_path}}) +sudo cp {{xcvr_emu_py3_wheel_path}} $FILESYSTEM_ROOT/$XCVR_EMU_PY3_WHEEL_NAME +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install $XCVR_EMU_PY3_WHEEL_NAME +sudo rm -rf $FILESYSTEM_ROOT/$XCVR_EMU_PY3_WHEEL_NAME +{% endif %} + {%- if SONIC_ROUTING_STACK == "frr" %} sudo mkdir $FILESYSTEM_ROOT/etc/sonic/frr sudo touch $FILESYSTEM_ROOT/etc/sonic/frr/frr.conf diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index 0b79fd936a03..953029b9942c 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -23,6 +23,9 @@ $(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SONIC_XCVRD_PY3) $(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SONIC_YCABLED_PY3) $(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SONIC_CHASSISD_PY3) $(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SONIC_STORMOND_PY3) +ifeq ($(CONFIGURED_PLATFORM),$(filter $(CONFIGURED_PLATFORM),vs)) +$(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(XCVR_EMU_PY3) +endif ifeq ($(PDDF_SUPPORT),y) $(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(PDDF_PLATFORM_API_BASE_PY3) diff --git a/slave.mk b/slave.mk index f3d9ad3e237e..b0ebc9df675b 100644 --- a/slave.mk +++ b/slave.mk @@ -1478,6 +1478,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $(addsuffix |$(addprefix $(TARGET_PATH)/, $(package)), $(package)))))" export sonic_py_common_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PY_COMMON_PY2))" export sonic_py_common_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PY_COMMON_PY3))" + export xcvr_emu_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(XCVR_EMU_PY3))" export config_engine_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE_PY2))" export config_engine_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE_PY3))" export platform_common_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_COMMON_PY3))" From cb538b53919c5a00653f1854b13f8088a1edcf54 Mon Sep 17 00:00:00 2001 From: Wataru Ishida Date: Tue, 17 Dec 2024 07:09:43 +0000 Subject: [PATCH 5/6] vs: extend platform_module to emulate xcvrs Signed-off-by: Wataru Ishida --- .../sonic_platform/chassis.py | 51 +++++++++- .../sonic_platform/sfp.py | 95 +++++++++++++++++++ 2 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 platform/vs/sonic-platform-modules-vs/sonic_platform/sfp.py diff --git a/platform/vs/sonic-platform-modules-vs/sonic_platform/chassis.py b/platform/vs/sonic-platform-modules-vs/sonic_platform/chassis.py index 6b43aed233ea..8bd1cebd6115 100644 --- a/platform/vs/sonic-platform-modules-vs/sonic_platform/chassis.py +++ b/platform/vs/sonic-platform-modules-vs/sonic_platform/chassis.py @@ -6,11 +6,22 @@ # try: - from sonic_platform_base.chassis_base import ChassisBase - from sonic_platform_base.module_base import ModuleBase import os + import time import json - import threading + import sys + + import grpc + + from xcvr_emu.proto import emulator_pb2 as pb2 + # see https://github.com/grpc/grpc/issues/29459#issuecomment-1641587881 + proto_dir = os.path.dirname(pb2.__file__) + sys.path.append(proto_dir) + + from xcvr_emu.proto import emulator_pb2_grpc + + from sonic_platform_base.chassis_base import ChassisBase + from .sfp import Sfp except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -24,6 +35,9 @@ def __init__(self): ChassisBase.__init__(self) self.metadata_file = '/etc/sonic/vs_chassis_metadata.json' self.metadata = self._read_metadata() + channel = grpc.insecure_channel("localhost:50051") + self.xcvr_emu = emulator_pb2_grpc.SfpEmulatorServiceStub(channel) + self.sfps = {} def _read_metadata(self): metadata = {} @@ -53,3 +67,34 @@ def get_my_slot(self): else: raise ValueError("Invalid configuration: Neither supervisor nor line card") + def get_sfp(self, index): + if index not in self.sfps: + sfp = Sfp(index, self.xcvr_emu) + self.sfps[index] = (sfp, sfp.get_presence()) + + return self.sfps[index][0] + + def get_change_event(self, timeout=0): + + port_dict = {} + change_dict = {"sfp": port_dict} + + start = time.time() + + while True: + for (sfp, present) in self.sfps.values(): + current = sfp.get_presence() + if current != present: + port_dict[sfp.index] = '1' if current else '0' + self.sfps[sfp.index] = (sfp, current) + + if len(port_dict): + return True, change_dict + + if timeout > 0 and (time.time() - start > (timeout / 1000)): + return True, change_dict + + time.sleep(0.5) + + def get_reboot_cause(self): + return ("REBOOT_CAUSE_NON_HARDWARE", "Unknown") diff --git a/platform/vs/sonic-platform-modules-vs/sonic_platform/sfp.py b/platform/vs/sonic-platform-modules-vs/sonic_platform/sfp.py new file mode 100644 index 000000000000..fea9b1dd0be0 --- /dev/null +++ b/platform/vs/sonic-platform-modules-vs/sonic_platform/sfp.py @@ -0,0 +1,95 @@ +import grpc + +from xcvr_emu.proto.emulator_pb2 import ReadRequest, WriteRequest, GetInfoRequest + +from sonic_platform_base.sfp_base import SfpBase + + +class Sfp(SfpBase): + def __init__(self, index, xcvr_emu): + self.index = index + self.xcvr_emu = xcvr_emu + super().__init__() + + def get_model(self): + api = self.get_xcvr_api() + return api.get_model() if api is not None else None + + def get_serial(self): + api = self.get_xcvr_api() + return api.get_serial() if api is not None else None + + def get_transceiver_info(self): + api = self.get_xcvr_api() + return api.get_transceiver_info() if api is not None else None + + def get_transceiver_info_firmware_versions(self): + api = self.get_xcvr_api() + return api.get_transceiver_info_firmware_versions() if api is not None else None + + def get_transceiver_bulk_status(self): + api = self.get_xcvr_api() + return api.get_transceiver_bulk_status() if api is not None else None + + def get_transceiver_threshold_info(self): + api = self.get_xcvr_api() + return api.get_transceiver_threshold_info() if api is not None else None + + def get_transceiver_status(self): + api = self.get_xcvr_api() + return api.get_transceiver_status() if api is not None else None + + def get_transceiver_loopback(self): + api = self.get_xcvr_api() + return api.get_transceiver_loopback() if api is not None else None + + def is_coherent_module(self): + api = self.get_xcvr_api() + return api.is_coherent_module() if api is not None else None + + def get_transceiver_pm(self): + api = self.get_xcvr_api() + return api.get_transceiver_pm() if api is not None else None + + def get_presence(self): + try: + info = self.xcvr_emu.GetInfo(GetInfoRequest(index=self.index)) + except grpc.RpcError: + return False + return info.present + + def is_replaceable(self): + return True + + def read_eeprom(self, offset, num_bytes): + if not self.get_presence(): + return None + # convert optoe offset to SFF page and offset + # optoe maps the SFF 2D address to a linear address + page = offset // 128 + if page > 0: + page = page - 1 + + if offset > 128: + offset = (offset % 128) + 128 + + return self.xcvr_emu.Read( + ReadRequest(index=self.index, offset=offset, page=page, length=num_bytes) + ).data + + def write_eeprom(self, offset, num_bytes, write_buffer): + assert len(write_buffer) <= num_bytes + # convert optoe offset to SFF page and offset + # optoe maps the SFF 2D address to a linear address + page = offset // 128 + if page > 0: + page = page - 1 + + if offset > 128: + offset = (offset % 128) + 128 + + return self.xcvr_emu.Write( + WriteRequest( + index=self.index, page=page, offset=offset, length=num_bytes, data=bytes(write_buffer) + ) + ) From 353d50436aa5f9e958189309c26211165e855a9d Mon Sep 17 00:00:00 2001 From: Wataru Ishida Date: Mon, 16 Dec 2024 07:56:07 +0000 Subject: [PATCH 6/6] vs: enable xcvrd Signed-off-by: Wataru Ishida --- device/virtual/x86_64-kvm_x86_64-r0/pmon_daemon_control.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/virtual/x86_64-kvm_x86_64-r0/pmon_daemon_control.json b/device/virtual/x86_64-kvm_x86_64-r0/pmon_daemon_control.json index 35fd93caadcd..c19975e3f4cf 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/pmon_daemon_control.json +++ b/device/virtual/x86_64-kvm_x86_64-r0/pmon_daemon_control.json @@ -1,6 +1,6 @@ { "skip_ledd": true, - "skip_xcvrd": true, + "skip_xcvrd": false, "skip_pcied": true, "skip_psud": true, "skip_syseepromd": true,