mirror of
				https://github.com/Telecominfraproject/ols-nos.git
				synced 2025-11-03 19:47:56 +00:00 
			
		
		
		
	* buildimage: Add gearbox phy device files and a new physyncd docker to support VS gearbox phy feature
* scripts and configuration needed to support a second syncd docker (physyncd)
* physyncd supports gearbox device and phy SAI APIs and runs multiple instances of syncd, one per phy in the device
* support for VS target (sonic-sairedis vslib has been extended to support a virtual BCM81724 gearbox PHY).
HLD is located at b817a12fd8/doc/gearbox/gearbox_mgr_design.md
**- Why I did it**
This work is part of the gearbox phy joint effort between Microsoft and Broadcom, and is based
on multi-switch support in sonic-sairedis.
**- How I did it**
Overall feature was implemented across several projects. The collective pull requests (some in late stages of review at this point):
https://github.com/Azure/sonic-utilities/pull/931 - CLI (merged)
https://github.com/Azure/sonic-swss-common/pull/347 - Minor changes (merged)
https://github.com/Azure/sonic-swss/pull/1321 - gearsyncd, config parsers, changes to orchargent to create gearbox phy on supported systems
https://github.com/Azure/sonic-sairedis/pull/624 - physyncd, virtual BCM81724 gearbox phy added to vslib
**- How to verify it**
In a vslib build:
root@sonic:/home/admin# show gearbox interfaces status
  PHY Id    Interface        MAC Lanes    MAC Lane Speed        PHY Lanes    PHY Lane Speed    Line Lanes    Line Lane Speed    Oper    Admin
--------  -----------  ---------------  ----------------  ---------------  ----------------  ------------  -----------------  ------  -------
       1   Ethernet48  121,122,123,124               25G  200,201,202,203               25G       204,205                50G    down     down
       1   Ethernet49  125,126,127,128               25G  206,207,208,209               25G       210,211                50G    down     down
       1   Ethernet50      69,70,71,72               25G  212,213,214,215               25G           216               100G    down     down
In addition, docker ps | grep phy should show a physyncd docker running.
  Signed-off-by: syd.logan@broadcom.com
		
	
		
			
				
	
	
		
			142 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
 | 
						|
#
 | 
						|
# common functions used by "syncd" scipts (syncd.sh, gbsyncd.sh, etc..)
 | 
						|
# scripts using this must provide implementations of the following functions:
 | 
						|
# 
 | 
						|
# startplatform
 | 
						|
# waitplatform
 | 
						|
# stopplatform1 and stopplatform2
 | 
						|
# 
 | 
						|
# For examples of these, see gbsyncd.sh and syncd.sh.
 | 
						|
#
 | 
						|
 | 
						|
function debug()
 | 
						|
{
 | 
						|
    /usr/bin/logger $1
 | 
						|
    /bin/echo `date` "- $1" >> ${DEBUGLOG}
 | 
						|
}
 | 
						|
 | 
						|
function lock_service_state_change()
 | 
						|
{
 | 
						|
    debug "Locking ${LOCKFILE} from ${SERVICE}$DEV service"
 | 
						|
 | 
						|
    exec {LOCKFD}>${LOCKFILE}
 | 
						|
    /usr/bin/flock -x ${LOCKFD}
 | 
						|
    trap "/usr/bin/flock -u ${LOCKFD}" 0 2 3 15
 | 
						|
 | 
						|
    debug "Locked ${LOCKFILE} (${LOCKFD}) from ${SERVICE}$DEV service"
 | 
						|
}
 | 
						|
 | 
						|
function unlock_service_state_change()
 | 
						|
{
 | 
						|
    debug "Unlocking ${LOCKFILE} (${LOCKFD}) from ${SERVICE}$DEV service"
 | 
						|
    /usr/bin/flock -u ${LOCKFD}
 | 
						|
}
 | 
						|
 | 
						|
function check_warm_boot()
 | 
						|
{
 | 
						|
    SYSTEM_WARM_START=`$SONIC_DB_CLI STATE_DB hget "WARM_RESTART_ENABLE_TABLE|system" enable`
 | 
						|
    SERVICE_WARM_START=`$SONIC_DB_CLI STATE_DB hget "WARM_RESTART_ENABLE_TABLE|${SERVICE}" enable`
 | 
						|
    # SYSTEM_WARM_START could be empty, always make WARM_BOOT meaningful.
 | 
						|
    if [[ x"$SYSTEM_WARM_START" == x"true" ]] || [[ x"$SERVICE_WARM_START" == x"true" ]]; then
 | 
						|
        WARM_BOOT="true"
 | 
						|
    else
 | 
						|
        WARM_BOOT="false"
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
function wait_for_database_service()
 | 
						|
{
 | 
						|
    # Wait for redis server start before database clean
 | 
						|
    until [[ $($SONIC_DB_CLI PING | grep -c PONG) -gt 0 ]]; do
 | 
						|
      sleep 1;
 | 
						|
    done
 | 
						|
 | 
						|
    # Wait for configDB initialization
 | 
						|
    until [[ $($SONIC_DB_CLI CONFIG_DB GET "CONFIG_DB_INITIALIZED") ]];
 | 
						|
        do sleep 1;
 | 
						|
    done
 | 
						|
}
 | 
						|
 | 
						|
function getBootType()
 | 
						|
{
 | 
						|
    # same code snippet in files/build_templates/docker_image_ctl.j2
 | 
						|
    case "$(cat /proc/cmdline)" in
 | 
						|
    *SONIC_BOOT_TYPE=warm*)
 | 
						|
        TYPE='warm'
 | 
						|
        ;;
 | 
						|
    *SONIC_BOOT_TYPE=fastfast*)
 | 
						|
        TYPE='fastfast'
 | 
						|
        ;;
 | 
						|
    *SONIC_BOOT_TYPE=fast*|*fast-reboot*)
 | 
						|
        # check that the key exists
 | 
						|
        if [[ $($SONIC_DB_CLI STATE_DB GET "FAST_REBOOT|system") == "1" ]]; then
 | 
						|
            TYPE='fast'
 | 
						|
        else
 | 
						|
            TYPE='cold'
 | 
						|
        fi
 | 
						|
        ;;
 | 
						|
    *)
 | 
						|
        TYPE='cold'
 | 
						|
    esac
 | 
						|
    echo "${TYPE}"
 | 
						|
}
 | 
						|
 | 
						|
start() {
 | 
						|
    debug "Starting ${SERVICE}$DEV service..."
 | 
						|
 | 
						|
    lock_service_state_change
 | 
						|
 | 
						|
    mkdir -p /host/warmboot
 | 
						|
 | 
						|
    wait_for_database_service
 | 
						|
    check_warm_boot
 | 
						|
 | 
						|
    debug "Warm boot flag: ${SERVICE}$DEV ${WARM_BOOT}."
 | 
						|
 | 
						|
    if [[ x"$WARM_BOOT" == x"true" ]]; then
 | 
						|
        # Leave a mark for syncd scripts running inside docker.
 | 
						|
        touch /host/warmboot/warm-starting
 | 
						|
    else
 | 
						|
        rm -f /host/warmboot/warm-starting
 | 
						|
    fi
 | 
						|
 | 
						|
    startplatform
 | 
						|
 | 
						|
    # start service docker
 | 
						|
    /usr/bin/${SERVICE}.sh start $DEV
 | 
						|
    debug "Started ${SERVICE} service..."
 | 
						|
 | 
						|
    unlock_service_state_change
 | 
						|
}
 | 
						|
 | 
						|
wait() {
 | 
						|
    waitplatform
 | 
						|
 | 
						|
    /usr/bin/${SERVICE}.sh wait $DEV
 | 
						|
}
 | 
						|
 | 
						|
stop() {
 | 
						|
    debug "Stopping ${SERVICE}$DEV service..."
 | 
						|
 | 
						|
    lock_service_state_change
 | 
						|
    check_warm_boot
 | 
						|
    debug "Warm boot flag: ${SERVICE}$DEV ${WARM_BOOT}."
 | 
						|
 | 
						|
    if [[ x"$WARM_BOOT" == x"true" ]]; then
 | 
						|
        TYPE=warm
 | 
						|
    else
 | 
						|
        TYPE=cold
 | 
						|
    fi
 | 
						|
 | 
						|
    stopplatform1
 | 
						|
 | 
						|
    /usr/bin/${SERVICE}.sh stop $DEV
 | 
						|
    debug "Stopped ${SERVICE}$DEV service..."
 | 
						|
 | 
						|
    stopplatform2
 | 
						|
 | 
						|
    unlock_service_state_change
 | 
						|
}
 |