Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -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
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
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"skip_ledd": true,
"skip_xcvrd": true,
"skip_xcvrd": false,
"skip_pcied": true,
"skip_psud": true,
"skip_syseepromd": true,
Expand Down
140 changes: 140 additions & 0 deletions device/virtual/x86_64-kvm_x86_64-r0/xcvr_emu.yaml
Original file line number Diff line number Diff line change
@@ -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
13 changes: 13 additions & 0 deletions dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2
Original file line number Diff line number Diff line change
Expand Up @@ -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" %}
Expand Down
15 changes: 14 additions & 1 deletion dockers/docker-platform-monitor/docker_init.j2
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down
8 changes: 8 additions & 0 deletions files/build_templates/sonic_debian_extension.j2
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion platform/vs/sonic-platform-modules-vs/debian/rules
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ clean:
dh_clean

build:
# Nothing to do
$(PYTHON) setup.py bdist_wheel -d $(SRC_DIR)


binary: binary-arch binary-indep
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-kvm_x86_64-r0
53 changes: 48 additions & 5 deletions platform/vs/sonic-platform-modules-vs/sonic_platform/chassis.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -24,14 +35,15 @@ 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 = {}
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):
Expand All @@ -55,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")
Loading