From 6b436502450b1f0ba144de571d874907baa2deff Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 29 Aug 2019 14:14:12 -0700 Subject: [PATCH 01/61] [libteam]: timerfd read() could return 0 fix (#3393) * Update sonic-quagga submodule * [libteam]: timerfd read() could return 0 --- ...erfd-returned-0-don-t-consider-this-.patch | 39 +++++++++++++++++++ src/libteam/patch/series | 1 + 2 files changed, 40 insertions(+) create mode 100644 src/libteam/patch/0010-When-read-of-timerfd-returned-0-don-t-consider-this-.patch diff --git a/src/libteam/patch/0010-When-read-of-timerfd-returned-0-don-t-consider-this-.patch b/src/libteam/patch/0010-When-read-of-timerfd-returned-0-don-t-consider-this-.patch new file mode 100644 index 000000000000..e703d73e0263 --- /dev/null +++ b/src/libteam/patch/0010-When-read-of-timerfd-returned-0-don-t-consider-this-.patch @@ -0,0 +1,39 @@ +From 038bed6fe3970dc829dbf9a282f7bea7198e7826 Mon Sep 17 00:00:00 2001 +From: Pavel Shirshov +Date: Wed, 28 Aug 2019 16:39:35 -0700 +Subject: [PATCH] When read of timerfd returned 0, don't consider this an error + +Just skip this event. +--- + teamd/teamd.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/teamd/teamd.c b/teamd/teamd.c +index 96794e8..a5ce745 100644 +--- a/teamd/teamd.c ++++ b/teamd/teamd.c +@@ -285,6 +285,10 @@ static int handle_period_fd(int fd) + teamd_log_err("read() failed."); + return -errno; + } ++ if (ret == 0) { ++ teamd_log_warn("read() for timer_fd returned 0."); ++ return 1; ++ } + if (ret != sizeof(uint64_t)) { + teamd_log_err("read() returned unexpected number of bytes."); + return -EINVAL; +@@ -345,7 +349,9 @@ static int teamd_run_loop_do_callbacks(struct list_item *lcb_list, fd_set *fds, + continue; + if (lcb->is_period) { + err = handle_period_fd(lcb->fd); +- if (err) ++ if (err == 1) ++ continue; /* timerfd returned 0. Don't do anything */ ++ if (err < 0) + return err; + } + err = lcb->func(ctx, events, lcb->priv); +-- +2.7.4 + diff --git a/src/libteam/patch/series b/src/libteam/patch/series index c30bdc7dd861..7be69525d9d0 100644 --- a/src/libteam/patch/series +++ b/src/libteam/patch/series @@ -7,3 +7,4 @@ 0007-Send-LACP-PDU-immediately-if-our-state-changed.patch 0008-libteam-Add-warm_reboot-mode.patch 0009-Fix-ifinfo_link_with_port-race-condition-with-newlink.patch +0010-When-read-of-timerfd-returned-0-don-t-consider-this-.patch From 15612f574938706f867bf72c301dede8053005c2 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan <47282725+renukamanavalan@users.noreply.github.com> Date: Wed, 28 Aug 2019 09:29:48 -0700 Subject: [PATCH 02/61] Create the src archive in target/ when INSTALL_DEBUG_TOOLS=y (#3323) * Create the src archive in target/ when INSTALL_DEBUG_TOOLS=y * Dropped -v (verbose flag) from tar command --- build_debian.sh | 5 +---- dbg_files.sh | 11 +++++++---- slave.mk | 7 ++++++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index ecb3767d2807..a90858f9b61b 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -452,10 +452,7 @@ then sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "echo '/debug is mounted in each docker' >> /etc/motd" sudo mkdir -p $FILESYSTEM_ROOT/src - pushd src - ../dbg_files.sh | sudo tar -cvzf ../$FILESYSTEM_ROOT/src/sonic_src.tar.gz -T - - popd - + sudo cp $DEBUG_SRC_ARCHIVE_FILE $FILESYSTEM_ROOT/src/ sudo mkdir -p $FILESYSTEM_ROOT/debug fi diff --git a/dbg_files.sh b/dbg_files.sh index 1515639bc9d7..6624fca83f34 100755 --- a/dbg_files.sh +++ b/dbg_files.sh @@ -2,8 +2,11 @@ # Provide file paths to archive for debug image as relative to src subdir # -for i in $debug_src_archive -do - find $i/ -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" -type f -done +if [ "$DEBUG_IMG" == "y" ] +then + for i in $DEBUG_SRC_ARCHIVE_DIRS + do + find src/$i/ -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" -type f + done | tar -czf $DEBUG_SRC_ARCHIVE_FILE -T - +fi diff --git a/slave.mk b/slave.mk index d32f37f6128a..c31c38ee1d1a 100644 --- a/slave.mk +++ b/slave.mk @@ -29,6 +29,7 @@ FILES_PATH = $(TARGET_PATH)/files PYTHON_WHEELS_PATH = $(TARGET_PATH)/python-wheels PROJECT_ROOT = $(shell pwd) DBG_IMAGE_MARK = dbg +DBG_SRC_ARCHIVE_FILE = $(TARGET_PATH)/sonic_src.tar.gz CONFIGURED_PLATFORM := $(shell [ -f .platform ] && cat .platform || echo generic) PLATFORM_PATH = platform/$(CONFIGURED_PLATFORM) @@ -608,9 +609,13 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ chmod +x sonic_debian_extension.sh, ) - export debug_src_archive="$(DBG_SRC_ARCHIVE)" + DEBUG_IMG="$(INSTALL_DEBUG_TOOLS)" \ + DEBUG_SRC_ARCHIVE_DIRS="$(DBG_SRC_ARCHIVE)" \ + DEBUG_SRC_ARCHIVE_FILE="$(DBG_SRC_ARCHIVE_FILE)" \ + scripts/dbg_files.sh DEBUG_IMG="$(INSTALL_DEBUG_TOOLS)" \ + DEBUG_SRC_ARCHIVE_FILE="$(DBG_SRC_ARCHIVE_FILE)" \ USERNAME="$(USERNAME)" \ PASSWORD="$(PASSWORD)" \ ./build_debian.sh $(LOG) From fe23aa77bcbcd0ee8f539c23916126af82c0d02d Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 30 Aug 2019 08:02:44 -0700 Subject: [PATCH 03/61] [201811][build] fix path for dbg_files.sh (#3396) Signed-off-by: Ying Xie --- slave.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slave.mk b/slave.mk index c31c38ee1d1a..e4c6719641ab 100644 --- a/slave.mk +++ b/slave.mk @@ -612,7 +612,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ DEBUG_IMG="$(INSTALL_DEBUG_TOOLS)" \ DEBUG_SRC_ARCHIVE_DIRS="$(DBG_SRC_ARCHIVE)" \ DEBUG_SRC_ARCHIVE_FILE="$(DBG_SRC_ARCHIVE_FILE)" \ - scripts/dbg_files.sh + ./dbg_files.sh DEBUG_IMG="$(INSTALL_DEBUG_TOOLS)" \ DEBUG_SRC_ARCHIVE_FILE="$(DBG_SRC_ARCHIVE_FILE)" \ From 8dba5baa01b3eac65b373e4b617a1a1d1f799fde Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 29 Jan 2019 10:36:04 -0800 Subject: [PATCH 04/61] [swss]: remove intfsyncd service (#2499) intfsyncd is replaced by intfmgrd service Signed-off-by: Guohan Lu --- dockers/docker-orchagent/start.sh | 2 -- platform/p4/docker-sonic-p4/start.sh | 3 --- platform/p4/docker-sonic-p4/supervisord.conf | 8 -------- platform/vs/docker-sonic-vs/start.sh | 2 -- platform/vs/docker-sonic-vs/supervisord.conf | 8 -------- 5 files changed, 23 deletions(-) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 4b4b6731a6ed..b6c2d97d77cd 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -23,8 +23,6 @@ supervisorctl start restore_neighbors supervisorctl start portsyncd -supervisorctl start intfsyncd - supervisorctl start neighsyncd supervisorctl start swssconfig diff --git a/platform/p4/docker-sonic-p4/start.sh b/platform/p4/docker-sonic-p4/start.sh index 7c8f9ce151c2..c9cf4528bedd 100755 --- a/platform/p4/docker-sonic-p4/start.sh +++ b/platform/p4/docker-sonic-p4/start.sh @@ -55,9 +55,6 @@ supervisorctl start orchagent echo "Start portsyncd" supervisorctl start portsyncd -echo "Start intfsyncd" -supervisorctl start intfsyncd - echo "Start neighsyncd" supervisorctl start neighsyncd diff --git a/platform/p4/docker-sonic-p4/supervisord.conf b/platform/p4/docker-sonic-p4/supervisord.conf index 5815689f9301..008f4c82d2c9 100644 --- a/platform/p4/docker-sonic-p4/supervisord.conf +++ b/platform/p4/docker-sonic-p4/supervisord.conf @@ -68,14 +68,6 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog -[program:intfsyncd] -command=/usr/bin/intfsyncd -priority=7 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - [program:neighsyncd] command=/usr/bin/neighsyncd priority=8 diff --git a/platform/vs/docker-sonic-vs/start.sh b/platform/vs/docker-sonic-vs/start.sh index 63e5f3534ef5..043753aa2926 100755 --- a/platform/vs/docker-sonic-vs/start.sh +++ b/platform/vs/docker-sonic-vs/start.sh @@ -41,8 +41,6 @@ supervisorctl start orchagent supervisorctl start portsyncd -supervisorctl start intfsyncd - supervisorctl start neighsyncd supervisorctl start teamsyncd diff --git a/platform/vs/docker-sonic-vs/supervisord.conf b/platform/vs/docker-sonic-vs/supervisord.conf index 3fe3df30c2d4..c3d0ef4ab6fb 100644 --- a/platform/vs/docker-sonic-vs/supervisord.conf +++ b/platform/vs/docker-sonic-vs/supervisord.conf @@ -51,14 +51,6 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog -[program:intfsyncd] -command=/usr/bin/intfsyncd -priority=7 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - [program:neighsyncd] command=/usr/bin/neighsyncd priority=8 From ab1e505325401453a21c0344c92aa0f778007287 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi <50386592+SuvarnaMeenakshi@users.noreply.github.com> Date: Tue, 3 Sep 2019 13:24:03 -0700 Subject: [PATCH 05/61] Add IPv6 Support in TACACS (#3395) * Add patch to support IPv6 * Add support for IPv6 * Remove in-correct changes by IPv6 support patch --- ...rsing-of-IP-addr-and-port-number-str.patch | 26 ++++++++++++++++ src/tacacs/nss/Makefile | 1 + ...ng-of-IP-address-and-port-number-to-.patch | 31 +++++++++++++++++++ src/tacacs/pam/Makefile | 1 + 4 files changed, 59 insertions(+) create mode 100644 src/tacacs/nss/0005-libnss-Modify-parsing-of-IP-addr-and-port-number-str.patch create mode 100644 src/tacacs/pam/0005-pam-Modify-parsing-of-IP-address-and-port-number-to-.patch diff --git a/src/tacacs/nss/0005-libnss-Modify-parsing-of-IP-addr-and-port-number-str.patch b/src/tacacs/nss/0005-libnss-Modify-parsing-of-IP-addr-and-port-number-str.patch new file mode 100644 index 000000000000..247972b63b55 --- /dev/null +++ b/src/tacacs/nss/0005-libnss-Modify-parsing-of-IP-addr-and-port-number-str.patch @@ -0,0 +1,26 @@ +From aa8af2b2400b7bbcbe7af0cb50047a98e93660ca Mon Sep 17 00:00:00 2001 +From: SuvarnaMeenakshi +Date: Thu, 29 Aug 2019 09:44:24 -0700 +Subject: [PATCH] libnss: Modify parsing of IP addr and port number string to + support IPv6 + +--- + nss_tacplus.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/nss_tacplus.c b/nss_tacplus.c +index f2a86e1..3ff3c35 100644 +--- a/nss_tacplus.c ++++ b/nss_tacplus.c +@@ -98,7 +98,7 @@ static int parse_tac_server(char *srv_buf) + hints.ai_socktype = SOCK_STREAM; + + srv = token + 7; +- port = strchr(srv, ':'); ++ port = strrchr(srv, ':'); + if(port) { + *port = '\0'; + port++; +-- +2.17.1 + diff --git a/src/tacacs/nss/Makefile b/src/tacacs/nss/Makefile index 308b05f2c13b..63abfcf2a3c9 100644 --- a/src/tacacs/nss/Makefile +++ b/src/tacacs/nss/Makefile @@ -16,6 +16,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : git am ../0002-Enable-modifying-local-user-permission.patch git am ../0003-management-vrf-support.patch git am ../0004-Skip-accessing-tacacs-servers-for-local-non-tacacs-u.patch + git am ../0005-libnss-Modify-parsing-of-IP-addr-and-port-number-str.patch dpkg-buildpackage -rfakeroot -b -us -uc popd diff --git a/src/tacacs/pam/0005-pam-Modify-parsing-of-IP-address-and-port-number-to-.patch b/src/tacacs/pam/0005-pam-Modify-parsing-of-IP-address-and-port-number-to-.patch new file mode 100644 index 000000000000..541333232b56 --- /dev/null +++ b/src/tacacs/pam/0005-pam-Modify-parsing-of-IP-address-and-port-number-to-.patch @@ -0,0 +1,31 @@ +From 264de96e8a1c411371f9fc20b0b5b00c10e7052d Mon Sep 17 00:00:00 2001 +From: SuvarnaMeenakshi +Date: Thu, 29 Aug 2019 09:51:43 -0700 +Subject: [PATCH] pam: Modify parsing of IP address and port number to support + IPv6 + +--- + support.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/support.c b/support.c +index 44efee3..7c00618 100644 +--- a/support.c ++++ b/support.c +@@ -225,11 +226,11 @@ int _pam_parse (int argc, const char **argv) { + + if (*server_buf == '[' && (close_bracket = strchr(server_buf, ']')) != NULL) { /* Check for URI syntax */ + server_name = server_buf + 1; +- port = strchr(close_bracket, ':'); ++ port = strrchr(close_bracket, ':'); + *close_bracket = '\0'; + } else { /* Fall back to traditional syntax */ + server_name = server_buf; +- port = strchr(server_buf, ':'); ++ port = strrchr(server_buf, ':'); + } + if (port != NULL) { + *port = '\0'; +-- +2.17.1 + diff --git a/src/tacacs/pam/Makefile b/src/tacacs/pam/Makefile index a54f577bc847..627242af5a71 100644 --- a/src/tacacs/pam/Makefile +++ b/src/tacacs/pam/Makefile @@ -18,6 +18,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : git apply ../0002-Fix-libtac2-bin-install-directory-error.patch git apply ../0003-Obfuscate-key-before-printing-to-syslog.patch git apply ../0004-management-vrf-support.patch + git apply ../0005-pam-Modify-parsing-of-IP-address-and-port-number-to-.patch dpkg-buildpackage -rfakeroot -b -us -uc popd From aa33644d3c9f94143bb3c5efba9e8474a27d5097 Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Sat, 7 Sep 2019 06:12:45 +0800 Subject: [PATCH 06/61] [Mellanox] fix sfp issue in reading qsfp_status (#3386) There is a very low possibility that qsfp_status exists when opening it but doesn't when reading it a bit later. If this occurs an exception is raised. However, this should be treated as "not presence" rather than causing an exception, which can be achieved by putting it into try block. --- device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py index db1bea8a47f9..bfdb9ce48200 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py @@ -8,6 +8,7 @@ import subprocess from sonic_sfp.sfputilbase import * import syslog + import sys except ImportError as e: raise ImportError("%s - required module not found" % str(e)) @@ -103,12 +104,11 @@ def get_presence(self, port_num): try: reg_file = open(self.qsfp_sysfs_path + "qsfp{}_status".format(port_num + 1)) + content = reg_file.readline().rstrip() except IOError as e: - print "Error: unable to open file: %s" % str(e) + print >> sys.stderr, "Error: unable to access file: %s" % str(e) return False - content = reg_file.readline().rstrip() - # content is a string with the qsfp status if content == SFP_STATUS_INSERTED: return True @@ -127,7 +127,7 @@ def get_low_power_mode(self, port_num): if 'LPM ON' in output: return True except subprocess.CalledProcessError as e: - print "Error! Unable to get LPM for {}, rc = {}, err msg: {}".format(port_num, e.returncode, e.output) + print >> sys.stderr, "Error! Unable to get LPM for {}, rc = {}, err msg: {}".format(port_num, e.returncode, e.output) return False return False From 97130ee18868825e2c85e92aeff7d2ab57c16240 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 6 Sep 2019 16:43:14 -0700 Subject: [PATCH 07/61] [201811][utilities] advance sonic-utilities sub module head (#3411) Submodule src/sonic-utilities 4f72e14..11b4cf1: > [fast-reboot] Check if ASIC config has changed before warm reboot (#621) > [neighbor_advertiser]: Change the ICMPv6 type to 135 (#629) > [acl_loader]: Fix show mirror_session error (#580) Signed-off-by: Ying Xie --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 4f72e146647d..11b4cf14631e 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 4f72e146647d2ebb93b9e6eb327337942cc68b14 +Subproject commit 11b4cf14631eb6a42eb7bcb00d5dcc7fdc5510ca From aee7d86fc901ce9255cc0535136252750359612f Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Sun, 8 Sep 2019 12:33:08 -0700 Subject: [PATCH 08/61] [201811] Log message containing SONiC version to syslog at boot (#3417) --- files/image_config/platform/rc.local | 2 ++ 1 file changed, 2 insertions(+) diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index 76fe390be3cd..1df03718da3c 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -121,6 +121,8 @@ program_console_speed() #### Begin Main Body #### +logger "SONiC version ${SONIC_VERSION} starting up..." + # If the machine.conf is absent, it indicates that the unit booted # into SONiC from another NOS. Extract the machine.conf from ONIE. if [ ! -e /host/machine.conf ]; then From 541208fca21f59f8e01a2830c4f0ff663ab5033b Mon Sep 17 00:00:00 2001 From: Danny Allen <52468448+daall@users.noreply.github.com> Date: Thu, 5 Sep 2019 19:41:35 -0700 Subject: [PATCH 09/61] [build_debian] Include checksum of ASIC config files in SONiC filesystem (#3384) [build_debian] Generate checksum of ASIC config files * Adds script to generate checksums for ASIC config files * Adds step to build_debian that copies ASIC config checksum into SONiC filesystem Signed-off-by: Danny Allen daall@microsoft.com --- build_debian.sh | 8 +++ .../generate_asic_config_checksum.py | 67 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 files/build_scripts/generate_asic_config_checksum.py diff --git a/build_debian.sh b/build_debian.sh index a90858f9b61b..932cca7e65ea 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -422,6 +422,14 @@ build_number: ${BUILD_NUMBER:-0} built_by: $USER@$BUILD_HOSTNAME EOF +## Copy ASIC config checksum +python files/build_scripts/generate_asic_config_checksum.py +if [[ ! -f './asic_config_checksum' ]]; then + echo 'asic_config_checksum not found' + exit 1 +fi +sudo cp ./asic_config_checksum $FILESYSTEM_ROOT/etc/sonic/asic_config_checksum + if [ -f sonic_debian_extension.sh ]; then ./sonic_debian_extension.sh $FILESYSTEM_ROOT $PLATFORM_DIR fi diff --git a/files/build_scripts/generate_asic_config_checksum.py b/files/build_scripts/generate_asic_config_checksum.py new file mode 100644 index 000000000000..ca83f4f26a6f --- /dev/null +++ b/files/build_scripts/generate_asic_config_checksum.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +import syslog +import os +import hashlib + +SYSLOG_IDENTIFIER = 'asic_config_checksum' + +CHUNK_SIZE = 8192 + +CONFIG_FILES = { + os.path.abspath('./src/sonic-swss/swssconfig/sample/'): ['netbouncer.json', '00-copp.config.json'] +} + +OUTPUT_FILE = os.path.abspath('./asic_config_checksum') + +def log_info(msg): + syslog.openlog(SYSLOG_IDENTIFIER) + syslog.syslog(syslog.LOG_INFO, msg) + syslog.closelog() + +def log_error(msg): + syslog.openlog(SYSLOG_IDENTIFIER) + syslog.syslog(syslog.LOG_ERR, msg) + syslog.closelog() + +def get_config_files(config_file_map): + ''' + Generates a list of absolute paths to ASIC config files. + ''' + config_files = [] + for path, files in config_file_map.items(): + for config_file in files: + config_files.append(os.path.join(path, config_file)) + return config_files + +def generate_checksum(checksum_files): + ''' + Generates a checksum for a given list of files. Returns None if an error + occurs while reading the files. + + NOTE: The checksum is performed in the order provided. This function does + NOT do any re-ordering of the files before creating the checksum. + ''' + checksum = hashlib.sha1() + for checksum_file in checksum_files: + try: + with open(checksum_file, 'r') as f: + for chunk in iter(lambda: f.read(CHUNK_SIZE), b""): + checksum.update(chunk) + except IOError as e: + log_error('Error processing ASIC config file ' + checksum_file + ':' + e.strerror) + return None + + return checksum.hexdigest() + +def main(): + config_files = sorted(get_config_files(CONFIG_FILES)) + checksum = generate_checksum(config_files) + if checksum == None: + exit(1) + + with open(OUTPUT_FILE, 'w') as output: + output.write(checksum + '\n') + +if __name__ == '__main__': + main() From 614475feaf34df1227e15aa5153ce2f932b17283 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 5 Sep 2019 16:35:30 -0700 Subject: [PATCH 10/61] [minigraph]: Ignore mirror session portion in minigraph (#3410) This piece of information is currently not used. Revert this pull request in the future to add back the default mirror session information into the configuration database. Signed-off-by: Shu0T1an ChenG --- src/sonic-config-engine/minigraph.py | 28 ++++++++++--------- src/sonic-config-engine/tests/test_cfggen.py | 18 ++++++------ .../tests/test_minigraph_case.py | 18 ++++++------ 3 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 060cac0447fd..ac4f0da0f1c4 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -624,19 +624,21 @@ def parse_xml(filename, platform=None, port_config_file=None): results['TACPLUS_SERVER'] = dict((item, {'priority': '1', 'tcp_port': '49'}) for item in tacacs_servers) results['ACL_TABLE'] = acls - mirror_sessions = {} - if erspan_dst: - lo_addr = '0.0.0.0' - for lo in lo_intfs: - lo_network = ipaddress.IPNetwork(lo[1]) - if lo_network.version == 4: - lo_addr = str(lo_network.ip) - break - count = 0 - for dst in erspan_dst: - mirror_sessions['everflow{}'.format(count)] = {"dst_ip": dst, "src_ip": lo_addr} - count += 1 - results['MIRROR_SESSION'] = mirror_sessions + + # Do not configure the minigraph's mirror session, which is currently unused + # mirror_sessions = {} + # if erspan_dst: + # lo_addr = '0.0.0.0' + # for lo in lo_intfs: + # lo_network = ipaddress.IPNetwork(lo[1]) + # if lo_network.version == 4: + # lo_addr = str(lo_network.ip) + # break + # count = 0 + # for dst in erspan_dst: + # mirror_sessions['everflow{}'.format(count)] = {"dst_ip": dst, "src_ip": lo_addr} + # count += 1 + # results['MIRROR_SESSION'] = mirror_sessions return results diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index a841f4d19c23..0d30c40fc9e4 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -89,10 +89,11 @@ def test_minigraph_acl(self): "'SSH_ACL': {'services': ['SSH'], 'type': 'CTRLPLANE', 'policy_desc': 'SSH_ACL'}, " "'EVERFLOWV6': {'type': 'MIRRORV6', 'policy_desc': 'EVERFLOWV6', 'ports': ['PortChannel01', 'PortChannel02', 'PortChannel03', 'PortChannel04', 'Ethernet24', 'Ethernet40', 'Ethernet20', 'Ethernet44', 'Ethernet48', 'Ethernet28', 'Ethernet96', 'Ethernet92', 'Ethernet76', 'Ethernet72', 'Ethernet52', 'Ethernet80', 'Ethernet56', 'Ethernet32', 'Ethernet16', 'Ethernet36', 'Ethernet12', 'Ethernet60', 'Ethernet8', 'Ethernet4', 'Ethernet0', 'Ethernet64', 'Ethernet68', 'Ethernet84', 'Ethernet88', 'Ethernet108', 'Ethernet104', 'Ethernet100']}}") - def test_minigraph_everflow(self): - argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v MIRROR_SESSION' - output = self.run_script(argument) - self.assertEqual(output.strip(), "{'everflow0': {'src_ip': '10.1.0.32', 'dst_ip': '2.2.2.2'}}") +# everflow portion is not used +# def test_minigraph_everflow(self): +# argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v MIRROR_SESSION' +# output = self.run_script(argument) +# self.assertEqual(output.strip(), "{'everflow0': {'src_ip': '10.1.0.32', 'dst_ip': '2.2.2.2'}}") def test_minigraph_mgmt_ports(self): argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v MGMT_PORT' @@ -219,10 +220,11 @@ def test_minigraph_extra_ethernet_interfaces(self): "'Ethernet20': {'alias': 'fortyGigE0/20', 'pfc_asym': 'off', 'lanes': '45,46,47,48', 'description': 'fortyGigE0/20', 'mtu': '9100'}, " "'Ethernet24': {'alias': 'fortyGigE0/24', 'pfc_asym': 'off', 'lanes': '5,6,7,8', 'description': 'fortyGigE0/24', 'mtu': '9100'}}") - def test_metadata_everflow(self): - argument = '-m "' + self.sample_graph_metadata + '" -p "' + self.port_config + '" -v "MIRROR_SESSION"' - output = self.run_script(argument) - self.assertEqual(output.strip(), "{'everflow0': {'src_ip': '10.1.0.32', 'dst_ip': '10.0.100.1'}}") +# everflow portion is not used +# def test_metadata_everflow(self): +# argument = '-m "' + self.sample_graph_metadata + '" -p "' + self.port_config + '" -v "MIRROR_SESSION"' +# output = self.run_script(argument) +# self.assertEqual(output.strip(), "{'everflow0': {'src_ip': '10.1.0.32', 'dst_ip': '10.0.100.1'}}") def test_metadata_tacacs(self): argument = '-m "' + self.sample_graph_metadata + '" -p "' + self.port_config + '" -v "TACPLUS_SERVER"' diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index 9a859e7fb0f6..665bcb85d0c7 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -59,10 +59,11 @@ def test_render_template(self): output = self.run_script(argument) self.assertEqual(output.strip(), 'value1\nvalue2') - def test_minigraph_everflow(self): - argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v MIRROR_SESSION' - output = self.run_script(argument) - self.assertEqual(output.strip(), "{'everflow0': {'src_ip': '10.1.0.32', 'dst_ip': '10.0.100.1'}}") +# everflow portion is not used +# def test_minigraph_everflow(self): +# argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v MIRROR_SESSION' +# output = self.run_script(argument) +# self.assertEqual(output.strip(), "{'everflow0': {'src_ip': '10.1.0.32', 'dst_ip': '10.0.100.1'}}") def test_minigraph_interfaces(self): argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v \'INTERFACE.keys()\'' @@ -104,10 +105,11 @@ def test_minigraph_neighbor_metadata(self): output = self.run_script(argument) self.assertEqual(output.strip(), "{'switch-01t1': {'lo_addr': '10.1.0.186/32', 'mgmt_addr': '10.7.0.196/26', 'hwsku': 'Force10-S6000', 'type': 'LeafRouter', 'deployment_id': '2'}}") - def test_metadata_everflow(self): - argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "MIRROR_SESSION"' - output = self.run_script(argument) - self.assertEqual(output.strip(), "{'everflow0': {'src_ip': '10.1.0.32', 'dst_ip': '10.0.100.1'}}") +# everflow portion is not used +# def test_metadata_everflow(self): +# argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "MIRROR_SESSION"' +# output = self.run_script(argument) +# self.assertEqual(output.strip(), "{'everflow0': {'src_ip': '10.1.0.32', 'dst_ip': '10.0.100.1'}}") def test_metadata_tacacs(self): argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "TACPLUS_SERVER"' From d4758afddeeaad79dc4d3d1b66b4a325f3184dd5 Mon Sep 17 00:00:00 2001 From: sridhar-ravindran <45350577+sridhar-ravindran@users.noreply.github.com> Date: Tue, 10 Sep 2019 11:03:32 +0530 Subject: [PATCH 11/61] [DELL] S6100 Add PowerCycle Support for Last Reset Reason (#3402) * [DELL] S6100 Add PowerCycle Support for Last Reset Reason * handle first time boot properly * S6000 Last Reboot Reason Fix --- files/image_config/platform/rc.local | 3 ++ .../process-reboot-cause/process-reboot-cause | 14 +++++ .../common/dell_pmc.c | 54 +++++++++++++++++++ .../s6000/sonic_platform/chassis.py | 15 +++--- .../s6100/scripts/s6100_platform.sh | 19 +++++++ .../s6100/sonic_platform/chassis.py | 23 ++++++-- 6 files changed, 119 insertions(+), 9 deletions(-) diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index 1df03718da3c..5ea98a8eccd9 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -235,6 +235,9 @@ if [ -f $FIRST_BOOT_FILE ]; then touch /tmp/pending_config_initialization fi + # Notify firstboot to Platform, to use it for reboot-cause + touch /tmp/notify_firstboot_to_platform + if [ -d /host/image-$SONIC_VERSION/platform/$platform ]; then dpkg -i /host/image-$SONIC_VERSION/platform/$platform/*.deb fi diff --git a/files/image_config/process-reboot-cause/process-reboot-cause b/files/image_config/process-reboot-cause/process-reboot-cause index 81c496a025ce..49cfa752641f 100755 --- a/files/image_config/process-reboot-cause/process-reboot-cause +++ b/files/image_config/process-reboot-cause/process-reboot-cause @@ -21,6 +21,7 @@ SYSLOG_IDENTIFIER = "process-reboot-cause" REBOOT_CAUSE_DIR = "/host/reboot-cause/" REBOOT_CAUSE_FILE = REBOOT_CAUSE_DIR + "reboot-cause.txt" PREVIOUS_REBOOT_CAUSE_FILE = REBOOT_CAUSE_DIR + "previous-reboot-cause.txt" +FIRST_BOOT_PLATFORM_FILE = "/tmp/notify_firstboot_to_platform" UNKNOWN_REBOOT_CAUSE = "Unknown" @@ -86,6 +87,13 @@ def main(): cause_file = open(REBOOT_CAUSE_FILE, "r") previous_reboot_cause = cause_file.readline().rstrip('\n') cause_file.close() + # If it is FirstTime Boot and previous_reboot_cause is unknown + # and hardware_reboot cause is non_hardware then + # Update the reboot cause as required + if os.path.isfile(FIRST_BOOT_PLATFORM_FILE): + if (previous_reboot_cause == UNKNOWN_REBOOT_CAUSE): + previous_reboot_cause = UNKNOWN_REBOOT_CAUSE + os.remove(FIRST_BOOT_PLATFORM_FILE) elif hardware_reboot_cause == chassis.REBOOT_CAUSE_HARDWARE_OTHER: previous_reboot_cause = "{} ({})".format(hardware_reboot_cause, optional_details) else: @@ -100,6 +108,12 @@ def main(): previous_reboot_cause = cause_file.readline().rstrip('\n') cause_file.close() + # If it is FirstTime Boot and previous_reboot_cause is unknown + # Update the reboot cause as required + if os.path.isfile(FIRST_BOOT_PLATFORM_FILE): + if (previous_reboot_cause == UNKNOWN_REBOOT_CAUSE): + previous_reboot_cause = UNKNOWN_REBOOT_CAUSE + os.remove(FIRST_BOOT_PLATFORM_FILE) # Write the previous reboot cause to PREVIOUS_REBOOT_CAUSE_FILE prev_cause_file = open(PREVIOUS_REBOOT_CAUSE_FILE, "w") prev_cause_file.write(previous_reboot_cause) diff --git a/platform/broadcom/sonic-platform-modules-dell/common/dell_pmc.c b/platform/broadcom/sonic-platform-modules-dell/common/dell_pmc.c index 141f41ba4a03..05cab626f135 100644 --- a/platform/broadcom/sonic-platform-modules-dell/common/dell_pmc.c +++ b/platform/broadcom/sonic-platform-modules-dell/common/dell_pmc.c @@ -43,6 +43,7 @@ #define IOREGION_LENGTH 0x4 #define SMF_ADDR_REG_OFFSET 0 #define SMF_READ_DATA_REG_OFFSET 2 +#define SMF_WRITE_DATA_REG_OFFSET 3 #define SMF_REG_ADDR 0x200 #define SMF_POR_SRC_REG 0x209 #define SMF_RST_SRC_REG 0x20A @@ -151,6 +152,8 @@ #define CPU_7_MONITOR_STATUS 0x02E8 #define CPU_8_MONITOR_STATUS 0x02E9 +/* Mailbox PowerOn Reason */ +#define TRACK_POWERON_REASON 0x05FF unsigned long *mmio; static struct kobject *dell_kobj; @@ -441,6 +444,18 @@ struct smf_sio_data { enum kinds kind; }; +static int smf_write_reg(struct smf_data *data, u16 reg, u16 dev_data) +{ + int res = 0; + + mutex_lock(&data->lock); + outb_p(reg>> 8, data->addr + SMF_ADDR_REG_OFFSET); + outb_p(reg & 0xff, data->addr + SMF_ADDR_REG_OFFSET + 1); + outb_p(dev_data & 0xff, data->addr + SMF_WRITE_DATA_REG_OFFSET); + mutex_unlock(&data->lock); + + return res; +} static int smf_read_reg(struct smf_data *data, u16 reg) { @@ -532,6 +547,40 @@ static ssize_t show_power_on_reason(struct device *dev, return sprintf(buf, "%x\n", ret); } +/* SMF Mailbox Power ON Reason */ +static ssize_t set_mb_poweron_reason(struct device *dev, + struct device_attribute *devattr, const char *buf, size_t count) +{ + int err = 0; + unsigned int dev_data = 0; + struct smf_data *data = dev_get_drvdata(dev); + + err = kstrtouint(buf, 16, &dev_data); + if (err) + return err; + + err = smf_write_reg(data, TRACK_POWERON_REASON, dev_data); + + if(err < 0) + return err; + + return count; +} + +static ssize_t show_mb_poweron_reason(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + unsigned int ret = 0; + struct smf_data *data = dev_get_drvdata(dev); + + ret = smf_read_reg(data, TRACK_POWERON_REASON); + + if(ret < 0) + return ret; + + return sprintf(buf, "0x%x\n", ret); +} + /* FANIN ATTR */ static ssize_t show_fan_label(struct device *dev, struct device_attribute *attr, char *buf) @@ -1816,11 +1865,16 @@ static SENSOR_DEVICE_ATTR(smf_reset_reason, S_IRUGO, show_reset_reason, NULL, 1) static SENSOR_DEVICE_ATTR(smf_poweron_reason, S_IRUGO, show_power_on_reason, NULL, 1); +/* Mailbox Power tracking Reason */ +static SENSOR_DEVICE_ATTR(mb_poweron_reason, S_IRUGO|S_IWUSR, + show_mb_poweron_reason, set_mb_poweron_reason, 0); + static struct attribute *smf_dell_attrs[] = { &sensor_dev_attr_smf_version.dev_attr.attr, &sensor_dev_attr_smf_firmware_ver.dev_attr.attr, &sensor_dev_attr_smf_reset_reason.dev_attr.attr, &sensor_dev_attr_smf_poweron_reason.dev_attr.attr, + &sensor_dev_attr_mb_poweron_reason.dev_attr.attr, &sensor_dev_attr_fan_tray_presence.dev_attr.attr, &sensor_dev_attr_fan1_airflow.dev_attr.attr, &sensor_dev_attr_fan3_airflow.dev_attr.attr, diff --git a/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/chassis.py index b1046d9310f8..48ac70377877 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/chassis.py @@ -28,7 +28,7 @@ class Chassis(ChassisBase): def __init__(self): ChassisBase.__init__(self) - def get_register(self, reg_name): + def _get_register(self, reg_name): rv = 'ERR' mb_reg_file = self.MAILBOX_DIR+'/'+reg_name @@ -49,13 +49,16 @@ def get_reboot_cause(self): """ Retrieves the cause of the previous reboot """ - reset_reason = int(self.get_register('last_reboot_reason'), base=16) - # In S6000, We track the reboot reason by writing the reason in # NVRAM. Only Warmboot and Coldboot reason are supported here. + # Since it does not support any hardware reason, we return + # non_hardware as default - if (reset_reason in self.reset_reason_dict): - return (self.reset_reason_dict[reset_reason], None) + lrr = self._get_register('last_reboot_reason') + if (lrr != 'ERR'): + reset_reason = int(lrr, base=16) + if (reset_reason in self.reset_reason_dict): + return (self.reset_reason_dict[reset_reason], None) - return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason") + return (ChassisBase.REBOOT_CAUSE_NON_HARDWARE, None) diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform.sh b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform.sh index 71a5d269fec0..974d0662d564 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform.sh +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/scripts/s6100_platform.sh @@ -217,6 +217,24 @@ reset_muxes() { io_rd_wr.py --set --val 0xff --offset 0x20b } +track_reboot_reason() { + if [[ -d /sys/devices/platform/SMF.512/hwmon/ ]]; then + rv=$(cd /sys/devices/platform/SMF.512/hwmon/*; cat mb_poweron_reason) + reason=$(echo $rv | cut -d 'x' -f2) + if [ $reason == "ff" ]; then + cd /sys/devices/platform/SMF.512/hwmon/* + if [[ -e /tmp/notify_firstboot_to_platform ]]; then + echo 0x01 > mb_poweron_reason + else + echo 0xbb > mb_poweron_reason + fi + elif [ $reason == "bb" ] || [ $reason == "1" ]; then + cd /sys/devices/platform/SMF.512/hwmon/* + echo 0xaa > mb_poweron_reason + fi + fi +} + install_python_api_package() { device="/usr/share/sonic/device" platform=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) @@ -239,6 +257,7 @@ if [[ "$1" == "init" ]]; then modprobe dell_ich modprobe dell_s6100_iom_cpld modprobe dell_s6100_lpc + track_reboot_reason cpu_board_mux "new_device" switch_board_mux "new_device" diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py index 6245f8efdc0d..ea57f368914b 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py @@ -39,7 +39,14 @@ class Chassis(ChassisBase): def __init__(self): ChassisBase.__init__(self) - def get_pmc_register(self, reg_name): + def _get_reboot_reason_smf_register(self): + # Returns 0xAA on software reload + # Returns 0xFF on power-cycle + # Returns 0x01 on first-boot + smf_mb_reg_reason = self._get_pmc_register('mb_poweron_reason') + return int(smf_mb_reg_reason, 16) + + def _get_pmc_register(self, reg_name): rv = 'ERR' mb_reg_file = self.MAILBOX_DIR+'/'+reg_name @@ -61,8 +68,12 @@ def get_reboot_cause(self): """ Retrieves the cause of the previous reboot """ - reset_reason = int(self.get_pmc_register('smf_reset_reason')) - power_reason = int(self.get_pmc_register('smf_poweron_reason')) + reset_reason = int(self._get_pmc_register('smf_reset_reason')) + power_reason = int(self._get_pmc_register('smf_poweron_reason')) + smf_mb_reg_reason = self._get_reboot_reason_smf_register() + + if ((smf_mb_reg_reason == 0x01) and (power_reason == 0x11)): + return (ChassisBase.REBOOT_CAUSE_NON_HARDWARE, None) # Reset_Reason = 11 ==> PowerLoss # So return the reboot reason from Last Power_Reason Dictionary @@ -71,10 +82,16 @@ def get_reboot_cause(self): # checking key presence in dictionary else return # REBOOT_CAUSE_HARDWARE_OTHER as the Power_Reason and Reset_Reason # registers returned invalid data + + # In S6100, if Reset_Reason is not 11 and smf_mb_reg_reason + # is ff or bb, then it is PowerLoss if (reset_reason == 11): if (power_reason in self.power_reason_dict): return (self.power_reason_dict[power_reason], None) else: + if ((smf_mb_reg_reason == 0xbb) or (smf_mb_reg_reason == 0xff)): + return (ChassisBase.REBOOT_CAUSE_POWER_LOSS, None) + if (reset_reason in self.reset_reason_dict): return (self.reset_reason_dict[reset_reason], None) From a3ec223aa689b70b8bb43b50806520810451cdcd Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Tue, 10 Sep 2019 13:37:17 +0800 Subject: [PATCH 12/61] [201811]Advance pointers for sonic-platform-common and sonic-platform-daemons (#3420) * advance pointer for sonic-platform-daemon to 9e2eb29e6e55a116b424faa63f510c7cdeeef7eb [xcvrd] fix issue: xcvrd fails due to syntax error after sequential reboot (#43) * advance pointer for sonic-platform-common to ac7fde6e9ce532d450b3c43f354fc2f128053b4f [sonic_sfp] fix syntax error in sfputilbase._read_eeprom_specific_bytes (#58) --- src/sonic-platform-common | 2 +- src/sonic-platform-daemons | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-platform-common b/src/sonic-platform-common index b972e84c17d5..ac7fde6e9ce5 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit b972e84c17d5f7e1bb378cc9a31b9da9c22a2311 +Subproject commit ac7fde6e9ce532d450b3c43f354fc2f128053b4f diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index 1039764ef53e..9e2eb29e6e55 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit 1039764ef53e70be5d7b4da0caaf6eab8dc8ca60 +Subproject commit 9e2eb29e6e55a116b424faa63f510c7cdeeef7eb From 96038ee7f5aa73bef8685d720f0bfefbbeddbd28 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Tue, 10 Sep 2019 06:22:36 -0700 Subject: [PATCH 13/61] [201811] advance sairedis, swss and utilities sub module head (#3424) Submodule src/sonic-sairedis 4ee82cb..1cf2eea: > Add acl counter match logic based on acl entry field (#511) > Add specific comparison logic for ACL counter (#484) Submodule src/sonic-swss 46bc1f4..660530e: > Fix VLAN error introduced with new 4.9 kernel behavior (#1001) > Warmboot Vlan neigh restore fix (#1040) Submodule src/sonic-utilities 11b4cf1..f76fc2c: > [warm reboot] Skip ASIC config pre-check if current image does not support it (#637) > [FastReboot]: Send SIGINT to all teamd before stop (#633) > [warm/fast reboot] provide strict option to prevent warm reboot under certain conditions (#631) Signed-off-by: Ying Xie --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-utilities | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 4ee82cb0a804..1cf2eea3bc21 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 4ee82cb0a804e801524972afac102c18abaa710d +Subproject commit 1cf2eea3bc219d7cb6fdba322eecbf58d3e94bd1 diff --git a/src/sonic-swss b/src/sonic-swss index 46bc1f483980..660530ea312e 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 46bc1f483980c0f398b7d4b097b6b23a69254944 +Subproject commit 660530ea312ed0242f0c8f2d65bddef80f219440 diff --git a/src/sonic-utilities b/src/sonic-utilities index 11b4cf14631e..f76fc2c01ce3 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 11b4cf14631eb6a42eb7bcb00d5dcc7fdc5510ca +Subproject commit f76fc2c01ce3b84ae29ba298461fb2a3ce990960 From df5a03f3e1169ac6da5292e3494c358d4f5699de Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Tue, 10 Sep 2019 07:26:50 -0700 Subject: [PATCH 14/61] Wait 5 second before start/restart snmpd (#3427) --- dockers/docker-snmp-sv2/supervisord.conf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dockers/docker-snmp-sv2/supervisord.conf b/dockers/docker-snmp-sv2/supervisord.conf index 0e5db64cf287..6b59f7809379 100644 --- a/dockers/docker-snmp-sv2/supervisord.conf +++ b/dockers/docker-snmp-sv2/supervisord.conf @@ -20,10 +20,11 @@ stdout_logfile=syslog stderr_logfile=syslog [program:snmpd] -command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable,inetCidrRouteTable,ipCidrRouteTable,ip,disk_hw -p /run/snmpd.pid +command=bash -c "sleep 5; /usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable,inetCidrRouteTable,ipCidrRouteTable,ip,disk_hw -p /run/snmpd.pid" priority=3 autostart=false autorestart=true +startsecs = 10 stdout_logfile=syslog stderr_logfile=syslog From 9c6b70865a4cbbdc1646af9e84292316f59f451c Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Wed, 11 Sep 2019 05:38:00 +0800 Subject: [PATCH 15/61] [Mellanox] Fix the typo in mlnx-sfpd (#3426) * [mlnx-sfpd] adjust the log from "error" to "info" since it is something that should be ignored. --- platform/mellanox/mlnx-sfpd/scripts/mlnx-sfpd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-sfpd/scripts/mlnx-sfpd b/platform/mellanox/mlnx-sfpd/scripts/mlnx-sfpd index b11403b31514..1f86f7d38dda 100644 --- a/platform/mellanox/mlnx-sfpd/scripts/mlnx-sfpd +++ b/platform/mellanox/mlnx-sfpd/scripts/mlnx-sfpd @@ -218,7 +218,7 @@ class MlnxSfpd: sfp_state = sfp_value_status_dict.get(module_state, STATUS_UNKNOWN) if sfp_state == STATUS_UNKNOWN: - log_error("unknown module state {} on port {}".format(module_state, port)) + log_info("Got module state {} on port(s) {}, ignored".format(module_state, port_list)) continue for port in port_list: From d7ca700e39748d9c5cca53e9007e754928261008 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Tue, 10 Sep 2019 22:00:15 -0700 Subject: [PATCH 16/61] [sonic-slave]: Updated version of ctypesgen.py has a different name (#3434) * Fix the build. Updated version of ctypesgen.py has a different name --- sonic-slave/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 368f1bdfe3b1..46983362ce49 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -255,7 +255,7 @@ RUN python2 -m pip install -U pip==9.0.3 # For p4 build RUN pip install \ - ctypesgen \ + ctypesgen==0.r125 \ crc16 # For sonic config engine testing From 9f28851d1150b7c11c785c77414f9bf4bd239fad Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 11 Sep 2019 16:37:05 -0700 Subject: [PATCH 17/61] [submodule update]: Advance sonic-dbsyncd (#3440) * [submodule update]: Advance sonic-dbsyncd --- src/sonic-dbsyncd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-dbsyncd b/src/sonic-dbsyncd index fe60afa7e24a..ffb3bad2f355 160000 --- a/src/sonic-dbsyncd +++ b/src/sonic-dbsyncd @@ -1 +1 @@ -Subproject commit fe60afa7e24a7053a7bd9d7084268c1bbd203208 +Subproject commit ffb3bad2f355c28be201d5f27ac4564c46047593 From 92d359dcc8d20ab1f47ae65de6610fe529ca957e Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 12 Sep 2019 10:57:36 -0700 Subject: [PATCH 18/61] [201811][dhcp_relay] Properly wait for routed interfaces to be ready before starting relay agent (#3442) --- dockers/docker-dhcp-relay/wait_for_intf.sh.j2 | 28 +++++++++-------- .../tests/sample_output/wait_for_intf.sh | 30 +++++++------------ 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 b/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 index 23133706cb6c..f697b2432df4 100644 --- a/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 +++ b/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 @@ -2,21 +2,17 @@ STATE_DB_IDX="6" -PORT_TABLE_PREFIX="PORT_TABLE" -VLAN_TABLE_PREFIX="VLAN_TABLE" -LAG_TABLE_PREFIX="LAG_TABLE" - function wait_until_iface_ready { - TABLE_PREFIX=$1 - IFACE=$2 + IFACE_NAME=$1 + IFACE_CIDR=$2 - echo "Waiting until interface $IFACE is ready..." + echo "Waiting until interface ${IFACE_NAME} is ready..." # Wait for the interface to come up # (i.e., interface is present in STATE_DB and state is "ok") while true; do - RESULT=$(redis-cli -n ${STATE_DB_IDX} HGET "${TABLE_PREFIX}|${IFACE}" "state" 2> /dev/null) + RESULT=$(redis-cli -n ${STATE_DB_IDX} HGET "INTERFACE_TABLE|${IFACE_NAME}|${IFACE_CIDR}" "state" 2> /dev/null) if [ x"$RESULT" == x"ok" ]; then break fi @@ -24,17 +20,23 @@ function wait_until_iface_ready sleep 1 done - echo "Interface ${IFACE} is ready!" + echo "Interface ${IFACE_NAME} is ready!" } -# Wait for all interfaces to be up and ready +# Wait for all interfaces with IPv4 addresses to be up and ready {% for (name, prefix) in INTERFACE %} -wait_until_iface_ready ${PORT_TABLE_PREFIX} {{ name }} +{% if prefix | ipv4 %} +wait_until_iface_ready {{ name }} {{ prefix }} +{% endif %} {% endfor %} {% for (name, prefix) in VLAN_INTERFACE %} -wait_until_iface_ready ${VLAN_TABLE_PREFIX} {{ name }} +{% if prefix | ipv4 %} +wait_until_iface_ready {{ name }} {{ prefix }} +{% endif %} {% endfor %} {% for (name, prefix) in PORTCHANNEL_INTERFACE %} -wait_until_iface_ready ${LAG_TABLE_PREFIX} {{ name }} +{% if prefix | ipv4 %} +wait_until_iface_ready {{ name }} {{ prefix }} +{% endif %} {% endfor %} diff --git a/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh b/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh index 383f7cb389e9..918f0b6e1648 100644 --- a/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh +++ b/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh @@ -2,21 +2,17 @@ STATE_DB_IDX="6" -PORT_TABLE_PREFIX="PORT_TABLE" -VLAN_TABLE_PREFIX="VLAN_TABLE" -LAG_TABLE_PREFIX="LAG_TABLE" - function wait_until_iface_ready { - TABLE_PREFIX=$1 - IFACE=$2 + IFACE_NAME=$1 + IFACE_CIDR=$2 - echo "Waiting until interface $IFACE is ready..." + echo "Waiting until interface ${IFACE_NAME} is ready..." # Wait for the interface to come up # (i.e., interface is present in STATE_DB and state is "ok") while true; do - RESULT=$(redis-cli -n ${STATE_DB_IDX} HGET "${TABLE_PREFIX}|${IFACE}" "state" 2> /dev/null) + RESULT=$(redis-cli -n ${STATE_DB_IDX} HGET "INTERFACE_TABLE|${IFACE_NAME}|${IFACE_CIDR}" "state" 2> /dev/null) if [ x"$RESULT" == x"ok" ]; then break fi @@ -24,18 +20,14 @@ function wait_until_iface_ready sleep 1 done - echo "Interface ${IFACE} is ready!" + echo "Interface ${IFACE_NAME} is ready!" } -# Wait for all interfaces to be up and ready -wait_until_iface_ready ${VLAN_TABLE_PREFIX} Vlan1000 -wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel01 -wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel01 -wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel02 -wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel02 -wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel03 -wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel03 -wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel04 -wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel04 +# Wait for all interfaces with IPv4 addresses to be up and ready +wait_until_iface_ready Vlan1000 192.168.0.1/27 +wait_until_iface_ready PortChannel01 10.0.0.56/31 +wait_until_iface_ready PortChannel02 10.0.0.58/31 +wait_until_iface_ready PortChannel03 10.0.0.60/31 +wait_until_iface_ready PortChannel04 10.0.0.62/31 From 02eac34bc93dfb82effbebd34a4d3c7befcc84f1 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Thu, 12 Sep 2019 16:34:59 -0700 Subject: [PATCH 19/61] [201811] advance sub module head for platform-common, swss, swss-common (#3443) Submodule src/sonic-platform-common ac7fde6..58f9672: > [sfp_base] Raise exceptions (previously was incorrectly returning them) (#61) Submodule src/sonic-swss 660530e..2974844: > Fix MIRROR_SESSION table macro name (#802) > Don't try to remove a vxlan tunnel if it has associated tunnel maps (#1052) Submodule src/sonic-swss-common d6140fa..d7b1f53: > Fix MIRROR_SESSION table macro name (#264) Signed-off-by: Ying Xie --- src/sonic-platform-common | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-platform-common b/src/sonic-platform-common index ac7fde6e9ce5..58f9672b4dd1 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit ac7fde6e9ce532d450b3c43f354fc2f128053b4f +Subproject commit 58f9672b4dd17428267fa8850522da795f172368 diff --git a/src/sonic-swss b/src/sonic-swss index 660530ea312e..29748444f9f9 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 660530ea312ed0242f0c8f2d65bddef80f219440 +Subproject commit 29748444f9f9841741116cd000a6c8c68de7ea04 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index d6140fa3e355..d7b1f53dee43 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit d6140fa3e3559784d6471384e55e98495e0b042e +Subproject commit d7b1f53dee43810149385ae54e8078b05015127c From 87cb1e307e7351ebafba92e8c0daa47d1a7231c2 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 12 Sep 2019 22:48:40 -0700 Subject: [PATCH 20/61] [baseimage]: fix monit configuration (#3448) - monit config broke by one monit upgrade - abandon sed approach since it is suspestible to monit config changes - use unixsocket instead of httpd due to a bug in 5.20.0 --- build_debian.sh | 27 +-- files/image_config/monit/monitrc | 308 +++++++++++++++++++++++++++++++ 2 files changed, 310 insertions(+), 25 deletions(-) create mode 100644 files/image_config/monit/monitrc diff --git a/build_debian.sh b/build_debian.sh index 932cca7e65ea..061efb8d747b 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -307,31 +307,8 @@ sudo sed -i 's/^ListenAddress ::/#ListenAddress ::/' $FILESYSTEM_ROOT/etc/ssh/ss sudo sed -i 's/^#ListenAddress 0.0.0.0/ListenAddress 0.0.0.0/' $FILESYSTEM_ROOT/etc/ssh/sshd_config ## Config monit -sudo sed -i ' - s/^# set logfile syslog/set logfile syslog/; - s/^\s*set logfile \/var/# set logfile \/var/; - s/^# set httpd port/set httpd port/; - s/^# use address localhost/ use address localhost/; - s/^# allow localhost/ allow localhost/; - s/^# allow admin:monit/ allow admin:monit/; - s/^# allow @monit/ allow @monit/; - s/^# allow @users readonly/ allow @users readonly/ - ' $FILESYSTEM_ROOT/etc/monit/monitrc - -sudo tee -a $FILESYSTEM_ROOT/etc/monit/monitrc > /dev/null <<'EOF' -check filesystem root-overlay with path / - if space usage > 90% for 5 times within 10 cycles then alert -check filesystem var-log with path /var/log - if space usage > 90% for 5 times within 10 cycles then alert -check system $HOST - if memory usage > 50% for 5 times within 10 cycles then alert - if cpu usage (user) > 90% for 5 times within 10 cycles then alert - if cpu usage (system) > 90% for 5 times within 10 cycles then alert -check process rsyslog with pidfile /var/run/rsyslogd.pid - start program = "/bin/systemctl start rsyslog.service" - stop program = "/bin/systemctl stop rsyslog.service" - if totalmem > 800 MB for 5 times within 10 cycles then restart -EOF +sudo cp files/image_config/monit/monitrc $FILESYSTEM_ROOT/etc/monit/ +sudo chmod 600 $FILESYSTEM_ROOT/etc/monit/monitrc ## Config sysctl sudo mkdir -p $FILESYSTEM_ROOT/var/core diff --git a/files/image_config/monit/monitrc b/files/image_config/monit/monitrc new file mode 100644 index 000000000000..f9350733fa44 --- /dev/null +++ b/files/image_config/monit/monitrc @@ -0,0 +1,308 @@ +############################################################################### +## Monit control file +############################################################################### +## +## Comments begin with a '#' and extend through the end of the line. Keywords +## are case insensitive. All path's MUST BE FULLY QUALIFIED, starting with '/'. +## +## Below you will find examples of some frequently used statements. For +## information about the control file and a complete list of statements and +## options, please have a look in the Monit manual. +## +## +############################################################################### +## Global section +############################################################################### +## +## Start Monit in the background (run as a daemon): +# + set daemon 120 # check services at 2-minute intervals +# with start delay 240 # optional: delay the first check by 4-minutes (by +# # default Monit check immediately after Monit start) +# +# +## Set syslog logging. If you want to log to a standalone log file instead, +## specify the full path to the log file +# +# set logfile /var/log/monit.log +set logfile syslog +# +# +## Set the location of the Monit lock file which stores the process id of the +## running Monit instance. By default this file is stored in $HOME/.monit.pid +# +# set pidfile /var/run/monit.pid +# +## Set the location of the Monit id file which stores the unique id for the +## Monit instance. The id is generated and stored on first Monit start. By +## default the file is placed in $HOME/.monit.id. +# +# set idfile /var/.monit.id + set idfile /var/lib/monit/id +# +## Set the location of the Monit state file which saves monitoring states +## on each cycle. By default the file is placed in $HOME/.monit.state. If +## the state file is stored on a persistent filesystem, Monit will recover +## the monitoring state across reboots. If it is on temporary filesystem, the +## state will be lost on reboot which may be convenient in some situations. +# + set statefile /var/lib/monit/state +# +# + +## Set limits for various tests. The following example shows the default values: +## +# set limits { +# programOutput: 512 B, # check program's output truncate limit +# sendExpectBuffer: 256 B, # limit for send/expect protocol test +# fileContentBuffer: 512 B, # limit for file content test +# httpContentBuffer: 1 MB, # limit for HTTP content test +# networkTimeout: 5 seconds # timeout for network I/O +# programTimeout: 300 seconds # timeout for check program +# stopTimeout: 30 seconds # timeout for service stop +# startTimeout: 30 seconds # timeout for service start +# restartTimeout: 30 seconds # timeout for service restart +# } + +## Set global SSL options (just most common options showed, see manual for +## full list). +# +# set ssl { +# verify : enable, # verify SSL certificates (disabled by default but STRONGLY RECOMMENDED) +# selfsigned : allow # allow self signed SSL certificates (reject by default) +# } +# +# +## Set the list of mail servers for alert delivery. Multiple servers may be +## specified using a comma separator. If the first mail server fails, Monit +# will use the second mail server in the list and so on. By default Monit uses +# port 25 - it is possible to override this with the PORT option. +# +# set mailserver mail.bar.baz, # primary mailserver +# backup.bar.baz port 10025, # backup mailserver on port 10025 +# localhost # fallback relay +# +# +## By default Monit will drop alert events if no mail servers are available. +## If you want to keep the alerts for later delivery retry, you can use the +## EVENTQUEUE statement. The base directory where undelivered alerts will be +## stored is specified by the BASEDIR option. You can limit the queue size +## by using the SLOTS option (if omitted, the queue is limited by space +## available in the back end filesystem). +# + set eventqueue + basedir /var/lib/monit/events # set the base directory where events will be stored + slots 100 # optionally limit the queue size +# +# +## Send status and events to M/Monit (for more informations about M/Monit +## see https://mmonit.com/). By default Monit registers credentials with +## M/Monit so M/Monit can smoothly communicate back to Monit and you don't +## have to register Monit credentials manually in M/Monit. It is possible to +## disable credential registration using the commented out option below. +## Though, if safety is a concern we recommend instead using https when +## communicating with M/Monit and send credentials encrypted. The password +## should be URL encoded if it contains URL-significant characters like +## ":", "?", "@". +# +# set mmonit http://monit:monit@192.168.1.10:8080/collector +# # and register without credentials # Don't register credentials +# +# +## Monit by default uses the following format for alerts if the the mail-format +## statement is missing:: +## --8<-- +## set mail-format { +## from: Monit +## subject: monit alert -- $EVENT $SERVICE +## message: $EVENT Service $SERVICE +## Date: $DATE +## Action: $ACTION +## Host: $HOST +## Description: $DESCRIPTION +## +## Your faithful employee, +## Monit +## } +## --8<-- +## +## You can override this message format or parts of it, such as subject +## or sender using the MAIL-FORMAT statement. Macros such as $DATE, etc. +## are expanded at runtime. For example, to override the sender, use: +# +# set mail-format { from: monit@foo.bar } +# +# +## You can set alert recipients whom will receive alerts if/when a +## service defined in this file has errors. Alerts may be restricted on +## events by using a filter as in the second example below. +# +# set alert sysadm@foo.bar # receive all alerts +# +## Do not alert when Monit starts, stops or performs a user initiated action. +## This filter is recommended to avoid getting alerts for trivial cases. +# +# set alert your-name@your.domain not on { instance, action } +# +# +## Monit has an embedded HTTP interface which can be used to view status of +## services monitored and manage services from a web interface. The HTTP +## interface is also required if you want to issue Monit commands from the +## command line, such as 'monit status' or 'monit restart service' The reason +## for this is that the Monit client uses the HTTP interface to send these +## commands to a running Monit daemon. See the Monit Wiki if you want to +## enable SSL for the HTTP interface. +# +set httpd unixsocket /var/run/monit.sock and + allow localhost # allow localhost to connect to the server and +# +############################################################################### +## Services +############################################################################### +## +## Check general system resources such as load average, cpu and memory +## usage. Each test specifies a resource, conditions and the action to be +## performed should a test fail. +# +# check system $HOST +# if loadavg (1min) > 4 then alert +# if loadavg (5min) > 2 then alert +# if cpu usage > 95% for 10 cycles then alert +# if memory usage > 75% then alert +# if swap usage > 25% then alert +# +# +## Check if a file exists, checksum, permissions, uid and gid. In addition +## to alert recipients in the global section, customized alert can be sent to +## additional recipients by specifying a local alert handler. The service may +## be grouped using the GROUP option. More than one group can be specified by +## repeating the 'group name' statement. +# +# check file apache_bin with path /usr/local/apache/bin/httpd +# if failed checksum and +# expect the sum 8f7f419955cefa0b33a2ba316cba3659 then unmonitor +# if failed permission 755 then unmonitor +# if failed uid root then unmonitor +# if failed gid root then unmonitor +# alert security@foo.bar on { +# checksum, permission, uid, gid, unmonitor +# } with the mail-format { subject: Alarm! } +# group server +# +# +## Check that a process is running, in this case Apache, and that it respond +## to HTTP and HTTPS requests. Check its resource usage such as cpu and memory, +## and number of children. If the process is not running, Monit will restart +## it by default. In case the service is restarted very often and the +## problem remains, it is possible to disable monitoring using the TIMEOUT +## statement. This service depends on another service (apache_bin) which +## is defined above. +# +# check process apache with pidfile /usr/local/apache/logs/httpd.pid +# start program = "/etc/init.d/httpd start" with timeout 60 seconds +# stop program = "/etc/init.d/httpd stop" +# if cpu > 60% for 2 cycles then alert +# if cpu > 80% for 5 cycles then restart +# if totalmem > 200.0 MB for 5 cycles then restart +# if children > 250 then restart +# if loadavg(5min) greater than 10 for 8 cycles then stop +# if failed host www.tildeslash.com port 80 protocol http +# and request "/somefile.html" +# then restart +# if failed port 443 protocol https with timeout 15 seconds then restart +# if 3 restarts within 5 cycles then unmonitor +# depends on apache_bin +# group server +# +# +## Check filesystem permissions, uid, gid, space and inode usage. Other services, +## such as databases, may depend on this resource and an automatically graceful +## stop may be cascaded to them before the filesystem will become full and data +## lost. +# +# check filesystem datafs with path /dev/sdb1 +# start program = "/bin/mount /data" +# stop program = "/bin/umount /data" +# if failed permission 660 then unmonitor +# if failed uid root then unmonitor +# if failed gid disk then unmonitor +# if space usage > 80% for 5 times within 15 cycles then alert +# if space usage > 99% then stop +# if inode usage > 30000 then alert +# if inode usage > 99% then stop +# group server +# +# +## Check a file's timestamp. In this example, we test if a file is older +## than 15 minutes and assume something is wrong if its not updated. Also, +## if the file size exceed a given limit, execute a script +# +# check file database with path /data/mydatabase.db +# if failed permission 700 then alert +# if failed uid data then alert +# if failed gid data then alert +# if timestamp > 15 minutes then alert +# if size > 100 MB then exec "/my/cleanup/script" as uid dba and gid dba +# +# +## Check directory permission, uid and gid. An event is triggered if the +## directory does not belong to the user with uid 0 and gid 0. In addition, +## the permissions have to match the octal description of 755 (see chmod(1)). +# +# check directory bin with path /bin +# if failed permission 755 then unmonitor +# if failed uid 0 then unmonitor +# if failed gid 0 then unmonitor +# +# +## Check a remote host availability by issuing a ping test and check the +## content of a response from a web server. Up to three pings are sent and +## connection to a port and an application level network check is performed. +# +# check host myserver with address 192.168.1.1 +# if failed ping then alert +# if failed port 3306 protocol mysql with timeout 15 seconds then alert +# if failed port 80 protocol http +# and request /some/path with content = "a string" +# then alert +# +# +## Check a network link status (up/down), link capacity changes, saturation +## and bandwidth usage. +# +# check network public with interface eth0 +# if failed link then alert +# if changed link then alert +# if saturation > 90% then alert +# if download > 10 MB/s then alert +# if total uploaded > 1 GB in last hour then alert +# +# +## Check custom program status output. +# +# check program myscript with path /usr/local/bin/myscript.sh +# if status != 0 then alert +# +# +############################################################################### +## Includes +############################################################################### +## +## It is possible to include additional configuration parts from other files or +## directories. +# + include /etc/monit/conf.d/* + include /etc/monit/conf-enabled/* +# +check filesystem root-overlay with path / + if space usage > 90% for 5 times within 10 cycles then alert +check filesystem var-log with path /var/log + if space usage > 90% for 5 times within 10 cycles then alert +check system $HOST + if memory usage > 90% for 5 times within 10 cycles then alert + if cpu usage (user) > 90% for 5 times within 10 cycles then alert + if cpu usage (system) > 90% for 5 times within 10 cycles then alert +check process rsyslog with pidfile /var/run/rsyslogd.pid + start program = "/bin/systemctl start rsyslog.service" + stop program = "/bin/systemctl stop rsyslog.service" + if totalmem > 800 MB for 5 times within 10 cycles then restart From 94f2113cec79daebfaabbefd8b340bed832bfdb2 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 12 Sep 2019 15:21:53 -0700 Subject: [PATCH 21/61] [lldpmgrd] Initialize port_desc to None to prevent crashing (#3451) --- dockers/docker-lldp-sv2/lldpmgrd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dockers/docker-lldp-sv2/lldpmgrd b/dockers/docker-lldp-sv2/lldpmgrd index d66072602a88..edcdc5c42e47 100755 --- a/dockers/docker-lldp-sv2/lldpmgrd +++ b/dockers/docker-lldp-sv2/lldpmgrd @@ -131,6 +131,8 @@ class LldpManager(object): For port `port_name`, look up the description and alias in the Config database, then form the appropriate lldpcli configuration command and run it. """ + port_desc = None + # Retrieve all entires for this port from the Port table port_table = swsscommon.Table(self.config_db, swsscommon.CFG_PORT_TABLE_NAME) (status, fvp) = port_table.get(port_name) From ba77de12acb7b3979f437097ad218d33a8c84152 Mon Sep 17 00:00:00 2001 From: Danny Allen <52468448+daall@users.noreply.github.com> Date: Fri, 13 Sep 2019 10:50:31 -0700 Subject: [PATCH 22/61] [cron.d] Add cron job to periodically clean-up core files (#3449) * [cron.d] Create cron job to periodically clean-up core files * Create script to scan /var/core and clean-up older core files * Create cron job to run clean-up script Signed-off-by: Danny Allen * Update interval for running cron job * Respond to feedback * Change syslog id --- build_debian.sh | 3 ++ files/image_config/cron.d/core_cleanup | 3 ++ files/scripts/core_cleanup.py | 51 ++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 files/image_config/cron.d/core_cleanup create mode 100755 files/scripts/core_cleanup.py diff --git a/build_debian.sh b/build_debian.sh index 061efb8d747b..c589d4acf14f 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -399,6 +399,9 @@ build_number: ${BUILD_NUMBER:-0} built_by: $USER@$BUILD_HOSTNAME EOF +## Copy over clean-up script +sudo cp ./files/scripts/core_cleanup.py $FILESYSTEM_ROOT/usr/bin/core_cleanup.py + ## Copy ASIC config checksum python files/build_scripts/generate_asic_config_checksum.py if [[ ! -f './asic_config_checksum' ]]; then diff --git a/files/image_config/cron.d/core_cleanup b/files/image_config/cron.d/core_cleanup new file mode 100644 index 000000000000..b1c379da9ebb --- /dev/null +++ b/files/image_config/cron.d/core_cleanup @@ -0,0 +1,3 @@ +# Attempts to clean up core files every 2 hours +* */2 * * * root /usr/bin/core_cleanup.py > /dev/null 2>&1 + diff --git a/files/scripts/core_cleanup.py b/files/scripts/core_cleanup.py new file mode 100755 index 000000000000..67620b2397de --- /dev/null +++ b/files/scripts/core_cleanup.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +import syslog +import os + +from collections import defaultdict +from datetime import datetime + +SYSLOG_IDENTIFIER = 'core_cleanup.py' +CORE_FILE_DIR = os.path.basename(__file__) +MAX_CORE_FILES = 4 + +def log_info(msg): + syslog.openlog(SYSLOG_IDENTIFIER) + syslog.syslog(syslog.LOG_INFO, msg) + syslog.closelog() + +def log_error(msg): + syslog.openlog(SYSLOG_IDENTIFIER) + syslog.syslog(syslog.LOG_ERR, msg) + syslog.closelog() + +def main(): + if os.getuid() != 0: + log_error('Root required to clean up core files') + return + + log_info('Cleaning up core files') + core_files = [f for f in os.listdir(CORE_FILE_DIR) if os.path.isfile(os.path.join(CORE_FILE_DIR, f))] + + core_files_by_process = defaultdict(list) + for f in core_files: + process = f.split('.')[0] + curr_files = core_files_by_process[process] + curr_files.append(f) + + if len(curr_files) > MAX_CORE_FILES: + curr_files.sort(reverse = True, key = lambda x: datetime.utcfromtimestamp(int(x.split('.')[1]))) + oldest_core = curr_files[MAX_CORE_FILES] + log_info('Deleting {}'.format(oldest_core)) + try: + os.remove(os.path.join(CORE_FILE_DIR, oldest_core)) + except: + log_error('Unexpected error occured trying to delete {}'.format(oldest_core)) + core_files_by_process[process] = curr_files[0:MAX_CORE_FILES] + + log_info('Finished cleaning up core files') + +if __name__ == '__main__': + main() + From 9cde0fc8087d0d8e529b10d85d0784f6bc805061 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 13 Sep 2019 22:07:42 -0700 Subject: [PATCH 23/61] [201811][utilities] advance sub module head (#3456) Submodule src/sonic-utilities f76fc2c..fe2c656: > [warm-reboot]: Do not clean up mirror session state database (#639) > [config] Reset failed status of all SONiC services, whether or not they are currently failed (#619) Signed-off-by: Ying Xie --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index f76fc2c01ce3..fe2c65698ade 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit f76fc2c01ce3b84ae29ba298461fb2a3ce990960 +Subproject commit fe2c65698ade286756242dfabe899368f29655e3 From cb81e3ab1ed3e7e40a18260659213929bdc33f11 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan <47282725+renukamanavalan@users.noreply.github.com> Date: Fri, 13 Sep 2019 22:08:28 -0700 Subject: [PATCH 24/61] [snmpd]: Fix snmpd crash possible when snmp agent takes too long to respond. (#3454) Patch from source-forge: net-snmp. Crash due to stale memory access. --- ...-crashing-and-or-freezing-on-timeout.patch | 211 ++++++++++++++++++ src/snmpd/patch-5.7.3+dfsg/series | 1 + 2 files changed, 212 insertions(+) create mode 100644 src/snmpd/patch-5.7.3+dfsg/0006-From-Jiri-Cervenka-snmpd-Fixed-agentx-crashing-and-or-freezing-on-timeout.patch diff --git a/src/snmpd/patch-5.7.3+dfsg/0006-From-Jiri-Cervenka-snmpd-Fixed-agentx-crashing-and-or-freezing-on-timeout.patch b/src/snmpd/patch-5.7.3+dfsg/0006-From-Jiri-Cervenka-snmpd-Fixed-agentx-crashing-and-or-freezing-on-timeout.patch new file mode 100644 index 000000000000..d11a9d6d75e9 --- /dev/null +++ b/src/snmpd/patch-5.7.3+dfsg/0006-From-Jiri-Cervenka-snmpd-Fixed-agentx-crashing-and-or-freezing-on-timeout.patch @@ -0,0 +1,211 @@ +From a5782d0673044ad0c621daed7975f53238bb038e Mon Sep 17 00:00:00 2001 +From: Renuka Manavalan +Date: Tue, 10 Sep 2019 17:51:45 +0000 +Subject: [PATCH] Patch from SourceForge: net-snmp commit #793d59 Avoids snmpd + crash when sub agent timesout. + +--- + agent/mibgroup/agentx/master_admin.c | 1 + + agent/snmp_agent.c | 81 ++++++++++++++++++---------- + include/net-snmp/agent/snmp_agent.h | 5 ++ + 3 files changed, 60 insertions(+), 27 deletions(-) + +diff --git a/agent/mibgroup/agentx/master_admin.c b/agent/mibgroup/agentx/master_admin.c +index 4dc1aa7..8c1d194 100644 +--- a/agent/mibgroup/agentx/master_admin.c ++++ b/agent/mibgroup/agentx/master_admin.c +@@ -158,6 +158,7 @@ close_agentx_session(netsnmp_session * session, int sessid) + for (sp = session->subsession; sp != NULL; sp = sp->next) { + + if (sp->sessid == sessid) { ++ netsnmp_remove_delegated_requests_for_session(sp); + unregister_mibs_by_session(sp); + unregister_index_by_session(sp); + unregister_sysORTable_by_session(sp); +diff --git a/agent/snmp_agent.c b/agent/snmp_agent.c +index b96d650..7cacd1a 100644 +--- a/agent/snmp_agent.c ++++ b/agent/snmp_agent.c +@@ -1409,6 +1409,7 @@ init_agent_snmp_session(netsnmp_session * session, netsnmp_pdu *pdu) + asp->treecache_num = -1; + asp->treecache_len = 0; + asp->reqinfo = SNMP_MALLOC_TYPEDEF(netsnmp_agent_request_info); ++ asp->flags = SNMP_AGENT_FLAGS_NONE; + DEBUGMSGTL(("verbose:asp", "asp %p reqinfo %p created\n", + asp, asp->reqinfo)); + +@@ -1457,6 +1458,9 @@ netsnmp_check_for_delegated(netsnmp_agent_session *asp) + + if (NULL == asp->treecache) + return 0; ++ ++ if (asp->flags & SNMP_AGENT_FLAGS_CANCEL_IN_PROGRESS) ++ return 0; + + for (i = 0; i <= asp->treecache_num; i++) { + for (request = asp->treecache[i].requests_begin; request; +@@ -1535,39 +1539,48 @@ int + netsnmp_remove_delegated_requests_for_session(netsnmp_session *sess) + { + netsnmp_agent_session *asp; +- int count = 0; ++ int total_count = 0; + + for (asp = agent_delegated_list; asp; asp = asp->next) { + /* + * check each request + */ ++ int i; ++ int count = 0; + netsnmp_request_info *request; +- for(request = asp->requests; request; request = request->next) { +- /* +- * check session +- */ +- netsnmp_assert(NULL!=request->subtree); +- if(request->subtree->session != sess) +- continue; ++ for (i = 0; i <= asp->treecache_num; i++) { ++ for (request = asp->treecache[i].requests_begin; request; ++ request = request->next) { ++ /* ++ * check session ++ */ ++ netsnmp_assert(NULL!=request->subtree); ++ if(request->subtree->session != sess) ++ continue; + +- /* +- * matched! mark request as done +- */ +- netsnmp_request_set_error(request, SNMP_ERR_GENERR); +- ++count; ++ /* ++ * matched! mark request as done ++ */ ++ netsnmp_request_set_error(request, SNMP_ERR_GENERR); ++ ++count; ++ } ++ } ++ if (count) { ++ asp->flags |= SNMP_AGENT_FLAGS_CANCEL_IN_PROGRESS; ++ total_count += count; + } + } + + /* + * if we found any, that request may be finished now + */ +- if(count) { ++ if(total_count) { + DEBUGMSGTL(("snmp_agent", "removed %d delegated request(s) for session " +- "%8p\n", count, sess)); +- netsnmp_check_outstanding_agent_requests(); ++ "%8p\n", total_count, sess)); ++ netsnmp_check_delegated_requests(); + } + +- return count; ++ return total_count; + } + + int +@@ -2739,19 +2752,11 @@ handle_var_requests(netsnmp_agent_session *asp) + return final_status; + } + +-/* +- * loop through our sessions known delegated sessions and check to see +- * if they've completed yet. If there are no more delegated sessions, +- * check for and process any queued requests +- */ + void +-netsnmp_check_outstanding_agent_requests(void) ++netsnmp_check_delegated_requests(void) + { + netsnmp_agent_session *asp, *prev_asp = NULL, *next_asp = NULL; + +- /* +- * deal with delegated requests +- */ + for (asp = agent_delegated_list; asp; asp = next_asp) { + next_asp = asp->next; /* save in case we clean up asp */ + if (!netsnmp_check_for_delegated(asp)) { +@@ -2790,6 +2795,23 @@ netsnmp_check_outstanding_agent_requests(void) + prev_asp = asp; + } + } ++} ++ ++ ++/* ++ * loop through our sessions known delegated sessions and check to see ++ * if they've completed yet. If there are no more delegated sessions, ++ * check for and process any queued requests ++ */ ++void ++netsnmp_check_outstanding_agent_requests(void) ++{ ++ netsnmp_agent_session *asp; ++ ++ /* ++ * deal with delegated requests ++ */ ++ netsnmp_check_delegated_requests(); + + /* + * if we are processing a set and there are more delegated +@@ -2819,7 +2841,8 @@ netsnmp_check_outstanding_agent_requests(void) + + netsnmp_processing_set = netsnmp_agent_queued_list; + DEBUGMSGTL(("snmp_agent", "SET request remains queued while " +- "delegated requests finish, asp = %8p\n", asp)); ++ "delegated requests finish, asp = %8p\n", ++ agent_delegated_list)); + break; + } + #endif /* NETSNMP_NO_WRITE_SUPPORT */ +@@ -2880,6 +2903,10 @@ check_delayed_request(netsnmp_agent_session *asp) + case SNMP_MSG_GETBULK: + case SNMP_MSG_GETNEXT: + netsnmp_check_all_requests_status(asp, 0); ++ if (asp->flags & SNMP_AGENT_FLAGS_CANCEL_IN_PROGRESS) { ++ DEBUGMSGTL(("snmp_agent","canceling next walk for asp %p\n", asp)); ++ break; ++ } + handle_getnext_loop(asp); + if (netsnmp_check_for_delegated(asp) && + netsnmp_check_transaction_id(asp->pdu->transid) != +diff --git a/include/net-snmp/agent/snmp_agent.h b/include/net-snmp/agent/snmp_agent.h +index aad8837..43f4fff 100644 +--- a/include/net-snmp/agent/snmp_agent.h ++++ b/include/net-snmp/agent/snmp_agent.h +@@ -32,6 +32,9 @@ extern "C" { + #define SNMP_MAX_PDU_SIZE 64000 /* local constraint on PDU size sent by agent + * (see also SNMP_MAX_MSG_SIZE in snmp_api.h) */ + ++#define SNMP_AGENT_FLAGS_NONE 0x0 ++#define SNMP_AGENT_FLAGS_CANCEL_IN_PROGRESS 0x1 ++ + /* + * If non-zero, causes the addresses of peers to be logged when receptions + * occur. +@@ -205,6 +208,7 @@ extern "C" { + int treecache_num; /* number of current cache entries */ + netsnmp_cachemap *cache_store; + int vbcount; ++ int flags; + } netsnmp_agent_session; + + /* +@@ -240,6 +244,7 @@ extern "C" { + int init_master_agent(void); + void shutdown_master_agent(void); + int agent_check_and_process(int block); ++ void netsnmp_check_delegated_requests(void); + void netsnmp_check_outstanding_agent_requests(void); + + int netsnmp_request_set_error(netsnmp_request_info *request, +-- +2.17.1 + diff --git a/src/snmpd/patch-5.7.3+dfsg/series b/src/snmpd/patch-5.7.3+dfsg/series index f3b91e2382f1..13b28de693d3 100644 --- a/src/snmpd/patch-5.7.3+dfsg/series +++ b/src/snmpd/patch-5.7.3+dfsg/series @@ -2,3 +2,4 @@ 0002-at.c-properly-check-return-status-from-realloc.-Than.patch 0003-CHANGES-BUG-2743-snmpd-crashes-when-receiving-a-GetN.patch 0004-Disable-SNMPv1.patch +0006-From-Jiri-Cervenka-snmpd-Fixed-agentx-crashing-and-or-freezing-on-timeout.patch From 67b1dad6e70a5a5477a891967037986ab6481fe0 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan <47282725+renukamanavalan@users.noreply.github.com> Date: Fri, 13 Sep 2019 23:31:05 -0700 Subject: [PATCH 25/61] [redis]: Upgrade redis-server from 3.2.4 to 3.2.13 (#3432) --- rules/redis.mk | 2 +- src/redis/Makefile | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rules/redis.mk b/rules/redis.mk index f44016fdb63e..926578f90c94 100644 --- a/rules/redis.mk +++ b/rules/redis.mk @@ -1,6 +1,6 @@ # redis package -REDIS_VERSION = 3.2.4-1~bpo8+1 +REDIS_VERSION = 3.2.13-1~bpo8+1 REDIS_TOOLS = redis-tools_$(REDIS_VERSION)_amd64.deb $(REDIS_TOOLS)_SRC_PATH = $(SRC_PATH)/redis diff --git a/src/redis/Makefile b/src/redis/Makefile index 8cd4458b4339..f229d321a11f 100644 --- a/src/redis/Makefile +++ b/src/redis/Makefile @@ -2,7 +2,7 @@ SHELL = /bin/bash .ONESHELL: .SHELLFLAGS += -e -REDIS_VERSION = 3.2.4 +REDIS_VERSION = 3.2.13 REDIS_VERSION_FULL = $(REDIS_VERSION)-1~bpo8+1 MAIN_TARGET = redis-server_$(REDIS_VERSION_FULL)_amd64.deb @@ -10,9 +10,9 @@ DERIVED_TARGETS = redis-tools_$(REDIS_VERSION_FULL)_amd64.deb \ redis-sentinel_$(REDIS_VERSION_FULL)_amd64.deb $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : - wget -O redis_$(REDIS_VERSION).orig.tar.gz -N "https://sonicstorage.blob.core.windows.net/packages/redis_$(REDIS_VERSION).orig.tar.gz?sv=2015-04-05&sr=b&sig=B3qGEoSHe%2FBh5rVwvXHpKijgBtKF7dHeuJWp1p17UnU%3D&se=2026-11-26T22%3A31%3A31Z&sp=r" - wget -O redis_$(REDIS_VERSION_FULL).dsc -N "https://sonicstorage.blob.core.windows.net/packages/redis_$(REDIS_VERSION_FULL).dsc?sv=2015-04-05&sr=b&sig=LoUtjLXa%2BCcoM%2BsPewRLkY7YPRvSJTbsvQoW%2BL%2B3QWM%3D&se=2026-11-26T22%3A32%3A11Z&sp=r" - wget -O redis_$(REDIS_VERSION_FULL).debian.tar.xz -N "https://sonicstorage.blob.core.windows.net/packages/redis_$(REDIS_VERSION_FULL).debian.tar.xz?sv=2015-04-05&sr=b&sig=I33UsbDHiffEkQRndpFwY9y3I%2FrKTu0wmG%2FMXB98kys%3D&se=2026-11-26T22%3A32%3A34Z&sp=r" + wget -O redis_$(REDIS_VERSION).orig.tar.gz -N "https://sonicstorage.blob.core.windows.net/packages/redis/redis_$(REDIS_VERSION).orig.tar.gz?sv=2015-04-05&sr=b&sig=DE%2F3Gb3%2BabCrtUJqCPyfU1OTJCANGYkBrdEKi%2FJYMQQ%3D&se=2033-05-19T16%3A43%3A53Z&sp=r" + wget -O redis_$(REDIS_VERSION_FULL).dsc -N "https://sonicstorage.blob.core.windows.net/packages/redis/redis_$(REDIS_VERSION_FULL).dsc?sv=2015-04-05&sr=b&sig=mQ502FHWRiOFb9cjEUcK0r1gXAc3bBv0fmVEWtroy5c%3D&se=2033-05-19T16%3A43%3A29Z&sp=r" + wget -O redis_$(REDIS_VERSION_FULL).debian.tar.xz -N "https://sonicstorage.blob.core.windows.net/packages/redis/redis_$(REDIS_VERSION_FULL).debian.tar.xz?sv=2015-04-05&sr=b&sig=iboHl5%2BV6zUcS5%2B8CaNnE9A0qLa7H%2BU8P1H0eofWjig%3D&se=2033-05-19T16%3A43%3A00Z&sp=r" dpkg-source -x redis_$(REDIS_VERSION_FULL).dsc pushd redis-$(REDIS_VERSION) From 5a604d07dfa5a1362f9b9e7879fa8467aabd6cf5 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Sun, 15 Sep 2019 08:55:06 -0700 Subject: [PATCH 26/61] [201811][sairedis][swss] advance sub module head (#3459) Submodule src/sonic-sairedis 1cf2eea..55ec4d2: > [syncd]: support query port with 8 lanes (400G) Submodule src/sonic-swss 2974844..24fcbb6: > support 8 lanes for a physical port (#778) Signed-off-by: Ying Xie --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 1cf2eea3bc21..55ec4d241052 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 1cf2eea3bc219d7cb6fdba322eecbf58d3e94bd1 +Subproject commit 55ec4d241052aec597d0c8fc60e75098611668fa diff --git a/src/sonic-swss b/src/sonic-swss index 29748444f9f9..24fcbb67c1d1 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 29748444f9f9841741116cd000a6c8c68de7ea04 +Subproject commit 24fcbb67c1d1e928838597cfbf4ef8fad8f22a44 From 67ce0d1a2dd7f9e872f6f71c8d2442dcab44185d Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Wed, 18 Sep 2019 00:34:11 +0800 Subject: [PATCH 27/61] [submodule]: update sonic-platform-daemons sub module to pick up fix (#3462) [201811 xcvrd] state machine enhancement Azure/sonic-platform-daemons#45 --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index 9e2eb29e6e55..d7380c6e3cdf 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit 9e2eb29e6e55a116b424faa63f510c7cdeeef7eb +Subproject commit d7380c6e3cdf53ad6c6ecdfcd146bfa524d42c41 From 65494418a86333de291e820c4e25d461f0b72cd5 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan <47282725+renukamanavalan@users.noreply.github.com> Date: Tue, 17 Sep 2019 13:28:08 -0700 Subject: [PATCH 28/61] Add debug docker for SNMP. (#3467) --- rules/docker-snmp-sv2.mk | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/rules/docker-snmp-sv2.mk b/rules/docker-snmp-sv2.mk index 2da1e8e685e6..bf84a035437f 100644 --- a/rules/docker-snmp-sv2.mk +++ b/rules/docker-snmp-sv2.mk @@ -1,14 +1,27 @@ # docker image for snmp agent -DOCKER_SNMP_SV2 = docker-snmp-sv2.gz +DOCKER_SNMP_SV2_STEM = docker-snmp-sv2 +DOCKER_SNMP_SV2 = $(DOCKER_SNMP_SV2_STEM).gz +DOCKER_SNMP_SV2_DBG = $(DOCKER_SNMP_SV2_STEM)-$(DBG_IMAGE_MARK).gz + $(DOCKER_SNMP_SV2)_PATH = $(DOCKERS_PATH)/docker-snmp-sv2 ## TODO: remove LIBPY3_DEV if we can get pip3 directly $(DOCKER_SNMP_SV2)_DEPENDS += $(SNMP) $(SNMPD) $(PY3) $(LIBPY3_DEV) + +$(DOCKER_SNMP_SV2)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE)_DBG_DEPENDS) +$(DOCKER_SNMP_SV2)_DBG_DEPENDS += $(LIBSNMP_DBG) + +$(DOCKER_SNMP_SV2)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE)_DBG_IMAGE_PACKAGES) + $(DOCKER_SNMP_SV2)_PYTHON_WHEELS += $(SONIC_PLATFORM_COMMON_PY3) $(SWSSSDK_PY3) $(ASYNCSNMP_PY3) $(DOCKER_SNMP_SV2)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) + SONIC_DOCKER_IMAGES += $(DOCKER_SNMP_SV2) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SNMP_SV2) +SONIC_DOCKER_DBG_IMAGES += $(DOCKER_SNMP_SV2_DBG) +SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_SNMP_SV2_DBG) + $(DOCKER_SNMP_SV2)_CONTAINER_NAME = snmp $(DOCKER_SNMP_SV2)_RUN_OPT += --net=host --privileged -t $(DOCKER_SNMP_SV2)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro From 9f03af0a2e30d63ec9adaf8419aa282474128c3b Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Tue, 17 Sep 2019 17:22:29 -0700 Subject: [PATCH 29/61] [201811][utilities] advance sub module head (#3469) Submodule src/sonic-utilities fe2c656..afaedb7: > Revert "[FastReboot]: Send SIGINT to all teamd before stop (#633)" (#650) > Fixed config Asym PFC CLI. (#632) > [config] Do no stop or restart dependent services (#582) Signed-off-by: Ying Xie --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index fe2c65698ade..afaedb7bff59 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit fe2c65698ade286756242dfabe899368f29655e3 +Subproject commit afaedb7bff59fed5806d64baf60b3c6527901c44 From 4ef5ce74e437cfef70e71c71743dfb332d948187 Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Wed, 18 Sep 2019 10:12:28 -0700 Subject: [PATCH 30/61] Install Iptables rules to set TCPMSS for 'lo' interface (#3452) * Install Iptables rules to set TCPMSS for lo interface * Moved implementation to hostcfgd to maintain at one place --- files/image_config/hostcfgd/hostcfgd | 92 ++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/files/image_config/hostcfgd/hostcfgd b/files/image_config/hostcfgd/hostcfgd index 0543a55539fe..0563947acb8c 100755 --- a/files/image_config/hostcfgd/hostcfgd +++ b/files/image_config/hostcfgd/hostcfgd @@ -7,6 +7,7 @@ import subprocess import syslog import copy import jinja2 +import ipaddr as ipaddress from swsssdk import ConfigDBConnector # FILE @@ -39,6 +40,82 @@ def obfuscate(data): else: return data +class Iptables(object): + def __init__(self): + ''' + Default MSS to 1460 - (MTU 1500 - 40 (TCP/IP Overhead)) + For IPv6, it would be 1440 - (MTU 1500 - 60 octects) + ''' + self.tcpmss = 1460 + self.tcp6mss = 1440 + + def is_ip_prefix_in_key(self, key): + ''' + Function to check if IP address is present in the key. If it + is present, then the key would be a tuple or else, it shall be + be string + ''' + return (isinstance(key, tuple)) + + def load(self, lpbk_table): + for row in lpbk_table: + self.iptables_handler(row, lpbk_table[row]) + + def command(self, chain, ip, ver, op): + cmd = 'iptables' if ver == '4' else 'ip6tables' + cmd += ' -t mangle --{} {} -p tcp --tcp-flags SYN SYN'.format(op, chain) + cmd += ' -d' if chain == 'PREROUTING' else ' -s' + mss = self.tcpmss if ver == '4' else self.tcp6mss + cmd += ' {} -j TCPMSS --set-mss {}'.format(ip, mss) + + return cmd + + def iptables_handler(self, key, data, add=True): + if not self.is_ip_prefix_in_key(key): + return + + iface, ip = key + ip_str = ip.split("/")[0] + ip_addr = ipaddress.IPAddress(ip_str) + if isinstance(ip_addr, ipaddress.IPv6Address): + ver = '6' + else: + ver = '4' + + self.mangle_handler(ip_str, ver, add) + + def mangle_handler(self, ip, ver, add): + if not add: + op = 'delete' + else: + op = 'check' + + iptables_cmds = [] + chains = ['PREROUTING', 'POSTROUTING'] + for chain in chains: + cmd = self.command(chain, ip, ver, op) + if not add: + iptables_cmds.append(cmd) + else: + ''' + For add case, first check if rule exists. Iptables just appends to the chain + as a new rule even if it is the same as an existing one. Check this and + do nothing if rule exists + ''' + ret = subprocess.call(cmd, shell=True) + if ret == 0: + syslog.syslog(syslog.LOG_INFO, "{} rule exists in {}".format(ip, chain)) + else: + # Modify command from Check to Append + iptables_cmds.append(cmd.replace("check", "append")) + + for cmd in iptables_cmds: + syslog.syslog(syslog.LOG_INFO, "Running cmd - {}".format(cmd)) + try: + subprocess.check_call(cmd, shell=True) + except subprocess.CalledProcessError as err: + syslog.syslog(syslog.LOG_ERR, "{} - failed: return code - {}, output:\n{}" + .format(err.cmd, err.returncode, err.output)) class AaaCfg(object): def __init__(self): @@ -148,6 +225,9 @@ class HostConfigDaemon: tacacs_server = self.config_db.get_table('TACPLUS_SERVER') self.aaacfg = AaaCfg() self.aaacfg.load(aaa, tacacs_global, tacacs_server) + lpbk_table = self.config_db.get_table('LOOPBACK_INTERFACE') + self.iptables = Iptables() + self.iptables.load(lpbk_table) def aaa_handler(self, key, data): self.aaacfg.aaa_update(key, data) @@ -166,10 +246,22 @@ class HostConfigDaemon: log_data['passkey'] = obfuscate(log_data['passkey']) syslog.syslog(syslog.LOG_INFO, 'value of {} changed to {}'.format(key, log_data)) + def lpbk_handler(self, key, data): + key = ConfigDBConnector.deserialize_key(key) + #Check if delete operation by fetch existing keys + keys = self.config_db.get_keys('LOOPBACK_INTERFACE') + if key in keys: + add = True + else: + add = False + + self.iptables.iptables_handler(key, data, add) + def start(self): self.config_db.subscribe('AAA', lambda table, key, data: self.aaa_handler(key, data)) self.config_db.subscribe('TACPLUS_SERVER', lambda table, key, data: self.tacacs_server_handler(key, data)) self.config_db.subscribe('TACPLUS', lambda table, key, data: self.tacacs_global_handler(key, data)) + self.config_db.subscribe('LOOPBACK_INTERFACE', lambda table, key, data: self.lpbk_handler(key, data)) self.config_db.listen() From e9037a72ff3096c26f602a73df839542bcc310b7 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 18 Sep 2019 20:02:41 -0700 Subject: [PATCH 31/61] [201811][utilities][swss] advance sub module head (#3481) Submodule src/sonic-swss 24fcbb6..3cee6b8: > [aclorch]: Fix table name in counter table for mirror rules (#1060) > Cannot ping to link-local ipv6 interface address of the switch. (#774) > [MirrorOrch]: Mirror Session Retention across Warm Reboot (#1062) Submodule src/sonic-utilities afaedb7..a06bee7: > [201811][config] Add '-h' and '-?' as help options to unify with show/sonic-clear cmds (#654) > Revert "Fixed config Asym PFC CLI. (#632)" (#652) Signed-off-by: Ying Xie --- src/sonic-swss | 2 +- src/sonic-utilities | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-swss b/src/sonic-swss index 24fcbb67c1d1..3cee6b87fa81 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 24fcbb67c1d1e928838597cfbf4ef8fad8f22a44 +Subproject commit 3cee6b87fa81ec7c39b01bc8115497ca7c5ffdcf diff --git a/src/sonic-utilities b/src/sonic-utilities index afaedb7bff59..a06bee79644a 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit afaedb7bff59fed5806d64baf60b3c6527901c44 +Subproject commit a06bee79644aaeac745d4061377604ee38d0031c From 0493b6274ead8719467d118a0ab4af9d064f6714 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan <47282725+renukamanavalan@users.noreply.github.com> Date: Thu, 19 Sep 2019 09:09:25 -0700 Subject: [PATCH 32/61] Map /src & /debug for debug docker containers (#3470) * Add debug docker for SNMP. * Removed a redundant install of debug packages. Propagate the debug flag to template file to mount /dbg & /src to debug containers. * Revert the last change to retain the original --- files/build_templates/docker_image_ctl.j2 | 3 +++ slave.mk | 1 + 2 files changed, 4 insertions(+) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 426e519f1e48..215bdcc3b8ee 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -139,6 +139,9 @@ start() { # TODO: Mellanox will remove the --tmpfs exception after SDK socket path changed in new SDK version {%- endif %} docker create {{docker_image_run_opt}} \ +{%- if install_debug_image == "y" %} + -v /src:/src:ro -v /debug:/debug:rw \ +{%- endif %} {%- if '--log-driver=json-file' in docker_image_run_opt or '--log-driver' not in docker_image_run_opt %} --log-opt max-size=2M --log-opt max-file=5 \ {%- endif %} diff --git a/slave.mk b/slave.mk index e4c6719641ab..a381a464dd94 100644 --- a/slave.mk +++ b/slave.mk @@ -581,6 +581,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ export swsssdk_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SWSSSDK_PY2))" export platform_common_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_COMMON_PY2))" export redis_dump_load_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(REDIS_DUMP_LOAD_PY2))" + export install_debug_image="$(INSTALL_DEBUG_TOOLS)" $(foreach docker, $($*_DOCKERS),\ export docker_image="$(docker)" From e5974158388c3d1d36bd27f044ba3d7c06cc31a8 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Thu, 19 Sep 2019 17:28:50 -0700 Subject: [PATCH 33/61] [201811][swss] advance sub module head (#3491) Submodule src/sonic-swss 3cee6b8..57e531d: > Ignore link local neighbors (#1065) Signed-off-by: Ying Xie --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 3cee6b87fa81..57e531d5fe4b 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 3cee6b87fa81ec7c39b01bc8115497ca7c5ffdcf +Subproject commit 57e531d5fe4b76dd777e19feff20f76410e78bd9 From 2fc617fcd9f3c2fdba8fb75b91744110d71299c8 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 20 Sep 2019 15:33:40 -0700 Subject: [PATCH 34/61] [libteam]: Add Fast-Reboot mode for teamd (#3490) * [libteam]: add special Fast-Reboot teamd stop mode * Fix last packet sending * Update sonic-utilities module --- .../0008-libteam-Add-warm_reboot-mode.patch | 55 ++++++++++++------- src/sonic-utilities | 2 +- 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch b/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch index 10770b8740b5..d92ac6987e62 100644 --- a/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch +++ b/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch @@ -1,18 +1,18 @@ -From a21a3dec9f9b9d825a0229e2963e07862395bbba Mon Sep 17 00:00:00 2001 +From 5d418847bf6fa86f049e18c1b57028c71e40a9c4 Mon Sep 17 00:00:00 2001 From: Pavel Shirshov -Date: Fri, 14 Jun 2019 14:20:05 -0700 -Subject: [PATCH] [libteam]: Reimplement Warm-Reboot procedure +Date: Thu, 19 Sep 2019 14:49:17 -0700 +Subject: [PATCH 1/1] [libteam]: Reimplement Warm-Reboot procedure --- libteam/ifinfo.c | 6 +- - teamd/teamd.c | 42 +++- + teamd/teamd.c | 57 ++++- teamd/teamd.h | 6 + teamd/teamd_events.c | 13 ++ teamd/teamd_runner_lacp.c | 474 +++++++++++++++++++++++++++++++++++--- - 5 files changed, 498 insertions(+), 43 deletions(-) + 5 files changed, 509 insertions(+), 47 deletions(-) diff --git a/libteam/ifinfo.c b/libteam/ifinfo.c -index 46d56a2..b86d34c 100644 +index a15788b..e48193e 100644 --- a/libteam/ifinfo.c +++ b/libteam/ifinfo.c @@ -109,15 +109,13 @@ static void update_hwaddr(struct team_ifinfo *ifinfo, struct rtnl_link *link) @@ -34,7 +34,7 @@ index 46d56a2..b86d34c 100644 } } diff --git a/teamd/teamd.c b/teamd/teamd.c -index 9dc85b5..96794e8 100644 +index 9dc85b5..679da49 100644 --- a/teamd/teamd.c +++ b/teamd/teamd.c @@ -117,7 +117,9 @@ static void print_help(const struct teamd_context *ctx) { @@ -90,51 +90,66 @@ index 9dc85b5..96794e8 100644 if (optind < argc) { fprintf(stderr, "Too many arguments\n"); return -1; -@@ -390,8 +410,14 @@ static int teamd_run_loop_run(struct teamd_context *ctx) +@@ -390,12 +410,21 @@ static int teamd_run_loop_run(struct teamd_context *ctx) if (err != -1) { switch(ctrl_byte) { case 'q': ++ case 'f': + case 'w': if (quit_in_progress) return -EBUSY; -+ if (ctrl_byte == 'w') { +- teamd_refresh_ports(ctx); +- err = teamd_flush_ports(ctx); +- if (err) +- return err; ++ if (ctrl_byte == 'w' || ctrl_byte == 'f') { + ctx->keep_ports = true; + ctx->no_quit_destroy = true; -+ teamd_ports_flush_data(ctx); ++ teamd_refresh_ports(ctx); ++ if (ctrl_byte == 'w') ++ teamd_ports_flush_data(ctx); ++ } else { ++ err = teamd_flush_ports(ctx); ++ if (err) ++ return err; + } - teamd_refresh_ports(ctx); - err = teamd_flush_ports(ctx); - if (err) -@@ -434,6 +460,12 @@ void teamd_run_loop_quit(struct teamd_context *ctx, int err) + quit_in_progress = true; + continue; + case 'r': +@@ -434,6 +463,12 @@ void teamd_run_loop_quit(struct teamd_context *ctx, int err) teamd_run_loop_sent_ctrl_byte(ctx, 'q'); } -+static void teamd_run_loop_quit_w_boot(struct teamd_context *ctx, int err) ++static void teamd_run_loop_quit_a_boot(struct teamd_context *ctx, char type, int err) +{ + ctx->run_loop.err = err; -+ teamd_run_loop_sent_ctrl_byte(ctx, 'w'); ++ teamd_run_loop_sent_ctrl_byte(ctx, type); +} + void teamd_run_loop_restart(struct teamd_context *ctx) { teamd_run_loop_sent_ctrl_byte(ctx, 'r'); -@@ -700,6 +732,10 @@ static int callback_daemon_signal(struct teamd_context *ctx, int events, +@@ -700,6 +735,14 @@ static int callback_daemon_signal(struct teamd_context *ctx, int events, teamd_log_warn("Got SIGINT, SIGQUIT or SIGTERM."); teamd_run_loop_quit(ctx, 0); break; + case SIGUSR1: + teamd_log_warn("Got SIGUSR1."); -+ teamd_run_loop_quit_w_boot(ctx, 0); ++ teamd_run_loop_quit_a_boot(ctx, 'w', 0); ++ break; ++ case SIGUSR2: ++ teamd_log_warn("Got SIGUSR2."); ++ teamd_run_loop_quit_a_boot(ctx, 'f', 0); + break; } return 0; } -@@ -1531,7 +1567,7 @@ static int teamd_start(struct teamd_context *ctx, enum teamd_exit_code *p_ret) +@@ -1531,7 +1574,7 @@ static int teamd_start(struct teamd_context *ctx, enum teamd_exit_code *p_ret) return -errno; } - if (daemon_signal_init(SIGINT, SIGTERM, SIGQUIT, SIGHUP, 0) < 0) { -+ if (daemon_signal_init(SIGINT, SIGTERM, SIGQUIT, SIGHUP, SIGUSR1, 0) < 0) { ++ if (daemon_signal_init(SIGINT, SIGTERM, SIGQUIT, SIGHUP, SIGUSR1, SIGUSR2, 0) < 0) { teamd_log_err("Could not register signal handlers."); daemon_retval_send(errno); err = -errno; diff --git a/src/sonic-utilities b/src/sonic-utilities index a06bee79644a..a89b9d4c69e9 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit a06bee79644aaeac745d4061377604ee38d0031c +Subproject commit a89b9d4c69e993c2891f59fbbd48891b23eba298 From c74822a1a4cc9498c012994a1be9ed14f078b5b1 Mon Sep 17 00:00:00 2001 From: bbinxie Date: Fri, 20 Sep 2019 22:26:40 +0800 Subject: [PATCH 35/61] Add new device data for dx010 (Celestica-DX010-C32,Celestica-DX010-D48C8) (#3492) * add config.bcm for hlx * modify config.bcm path for hlx * Delete hx4-cel-hbtn-48x1G+4x10G.config.bcm * add config.bcm and path * update led for cxp * Add new device data for dx010 --- .../Celestica-DX010-C32/buffers.json.j2 | 2 + .../buffers_defaults_t0.j2 | 54 ++ .../buffers_defaults_t1.j2 | 54 ++ .../Celestica-DX010-C32/pg_profile_lookup.ini | 17 + .../Celestica-DX010-C32/port_config.ini | 33 + .../Celestica-DX010-C32/qos.json.j2 | 1 + .../Celestica-DX010-C32/sai.profile.j2 | 13 + .../th-seastone-dx010-32x100G-t0.config.bcm | 376 ++++++++++ .../th-seastone-dx010-32x100G-t1.config.bcm | 696 ++++++++++++++++++ .../Celestica-DX010-D48C8/buffers.json.j2 | 2 + .../buffers_defaults_t0.j2 | 69 ++ .../pg_profile_lookup.ini | 17 + .../Celestica-DX010-D48C8/port_config.ini | 57 ++ .../Celestica-DX010-D48C8/qos.json.j2 | 1 + .../Celestica-DX010-D48C8/sai.profile | 1 + ...th-seastone-dx010-48x50G+8x100G.config.bcm | 648 ++++++++++++++++ 16 files changed, 2041 insertions(+) create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers.json.j2 create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/port_config.ini create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/sai.profile.j2 create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t0.config.bcm create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t1.config.bcm create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers.json.j2 create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/port_config.ini create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/sai.profile create mode 100644 device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/th-seastone-dx010-48x50G+8x100G.config.bcm diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers.json.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers.json.j2 new file mode 100644 index 000000000000..0b1cb2c541b6 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers.json.j2 @@ -0,0 +1,2 @@ +{%- set default_topo = 't1' %} +{%- include 'buffers_config.j2' %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 new file mode 100644 index 000000000000..43b7d7e31a9c --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 @@ -0,0 +1,54 @@ + +{%- set default_cable = '5m' %} + +{%- set ports2cable = { + 'torrouter_server' : '300m', + 'leafrouter_torrouter' : '300m', + 'spinerouter_leafrouter' : '300m' + } +-%} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,32) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossless_pool]", + "size":"1518", + "static_th":"3995680" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..6ec383c77081 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 @@ -0,0 +1,54 @@ + +{%- set default_cable = '40m' %} + +{%- set ports2cable = { + 'torrouter_server' : '300m', + 'leafrouter_torrouter' : '300m', + 'spinerouter_leafrouter' : '300m' + } +-%} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,32) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossless_pool]", + "size":"1518", + "static_th":"3995680" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini new file mode 100644 index 000000000000..aedda37a8878 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 10000 5m 1248 2288 35776 -3 2288 + 25000 5m 1248 2288 53248 -3 2288 + 40000 5m 1248 2288 66560 -3 2288 + 50000 5m 1248 2288 90272 -3 2288 + 100000 5m 1248 2288 165568 -3 2288 + 10000 40m 1248 2288 37024 -3 2288 + 25000 40m 1248 2288 53248 -3 2288 + 40000 40m 1248 2288 71552 -3 2288 + 50000 40m 1248 2288 96096 -3 2288 + 100000 40m 1248 2288 177632 -3 2288 + 10000 300m 1248 2288 46176 -3 2288 + 25000 300m 1248 2288 79040 -3 2288 + 40000 300m 1248 2288 108160 -3 2288 + 50000 300m 1248 2288 141856 -3 2288 + 100000 300m 1248 2288 268736 -3 2288 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/port_config.ini b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/port_config.ini new file mode 100644 index 000000000000..24e7b3c99858 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index +Ethernet0 65,66,67,68 etp1 100000 1 +Ethernet4 69,70,71,72 etp2 100000 2 +Ethernet8 73,74,75,76 etp3 100000 3 +Ethernet12 77,78,79,80 etp4 100000 4 +Ethernet16 33,34,35,36 etp5 100000 5 +Ethernet20 37,38,39,40 etp6 100000 6 +Ethernet24 41,42,43,44 etp7 100000 7 +Ethernet28 45,46,47,48 etp8 100000 8 +Ethernet32 49,50,51,52 etp9 100000 9 +Ethernet36 53,54,55,56 etp10 100000 10 +Ethernet40 57,58,59,60 etp11 100000 11 +Ethernet44 61,62,63,64 etp12 100000 12 +Ethernet48 81,82,83,84 etp13 100000 13 +Ethernet52 85,86,87,88 etp14 100000 14 +Ethernet56 89,90,91,92 etp15 100000 15 +Ethernet60 93,94,95,96 etp16 100000 16 +Ethernet64 97,98,99,100 etp17 100000 17 +Ethernet68 101,102,103,104 etp18 100000 18 +Ethernet72 105,106,107,108 etp19 100000 19 +Ethernet76 109,110,111,112 etp20 100000 20 +Ethernet80 1,2,3,4 etp21 100000 21 +Ethernet84 5,6,7,8 etp22 100000 22 +Ethernet88 9,10,11,12 etp23 100000 23 +Ethernet92 13,14,15,16 etp24 100000 24 +Ethernet96 17,18,19,20 etp25 100000 25 +Ethernet100 21,22,23,24 etp26 100000 26 +Ethernet104 25,26,27,28 etp27 100000 27 +Ethernet108 29,30,31,32 etp28 100000 28 +Ethernet112 113,114,115,116 etp29 100000 29 +Ethernet116 117,118,119,120 etp30 100000 30 +Ethernet120 121,122,123,124 etp31 100000 31 +Ethernet124 125,126,127,128 etp32 100000 32 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 new file mode 100644 index 000000000000..3e548325ea30 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/sai.profile.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/sai.profile.j2 new file mode 100644 index 000000000000..abc2daefd04e --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/sai.profile.j2 @@ -0,0 +1,13 @@ +{# Get sai.profile based on switch_role #} +{%- if DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['type'] is defined -%} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] -%} +{%- if switch_role.lower() == 'torrouter' %} +{% set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-seastone-dx010-32x100G-t0.config.bcm' -%} +{%- else %} +{% set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-seastone-dx010-32x100G-t1.config.bcm' -%} +{%- endif %} +{%- else %} +{% set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-seastone-dx010-32x100G-t1.config.bcm' -%} +{%- endif %} +{# Write the contents of sai_ profile_filename to sai.profile file #} +{{ sai_profile_contents }} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t0.config.bcm b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t0.config.bcm new file mode 100644 index 000000000000..7c315460dc8e --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t0.config.bcm @@ -0,0 +1,376 @@ +# Define default OS / SAL +os=unix + +# all XPORTs to XE ports +#pbmp_xport_xe=0x1fffffffe +pbmp_xport_xe=0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +pbmp_oversubscribe=0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe + +# Mode control to select L2 Table DMA mode aka L2MODE_POLL (0) or +# L2MOD_FIFO mechanism aka L2MODE_FIFO (1) for L2 table change notification. +l2xmsg_mode=1 + +# Memory table size configs +l2_mem_entries=8192 +l3_mem_entries=8192 +l3_alpm_enable=2 +ipv6_lpm_128b_enable=1 +mmu_lossless=0 + +################################################################################### +# Celestica Customize for SeaStone +################################################################################### + +#ext mdio frequency to 495/0x80/2(1.933Mhz) or 415/0x80/2(1.62MHz) +# default is 40 +# Set external MDIO freq to 6.19MHz (495MHz) or 5.19MHz (415MHz) +#* target_freq is core_clock_freq * DIVIDEND / DIVISOR / 2 +# +rate_ext_mdio_divisor=0x80 + +# use internal rom boot +phy_ext_rom_boot=0 + +#fpem_mem_entries=32768 +oversubscribe_mode=1 +#pbmp_xport_xe=0x3fd000000ff4000003fc000001fe + + +dport_map_enable=1 + +dport_map_port_68=1 +dport_map_port_72=5 +dport_map_port_76=9 +dport_map_port_80=13 +dport_map_port_34=17 +dport_map_port_38=21 +dport_map_port_42=25 +dport_map_port_46=29 +dport_map_port_50=33 +dport_map_port_54=37 +dport_map_port_58=41 +dport_map_port_62=45 +dport_map_port_84=49 +dport_map_port_88=53 +dport_map_port_92=57 +dport_map_port_96=61 +dport_map_port_102=65 +dport_map_port_106=69 +dport_map_port_110=73 +dport_map_port_114=77 +dport_map_port_1=81 +dport_map_port_5=85 +dport_map_port_9=89 +dport_map_port_13=93 +dport_map_port_17=97 +dport_map_port_21=101 +dport_map_port_25=105 +dport_map_port_29=109 +dport_map_port_118=113 +dport_map_port_122=117 +dport_map_port_126=121 +dport_map_port_130=125 + + +# port mapping +portmap_68=65:100:4 +portmap_72=69:100:4 +portmap_76=73:100:4 +portmap_80=77:100:4 +portmap_34=33:100:4 +portmap_38=37:100:4 +portmap_42=41:100:4 +portmap_46=45:100:4 +portmap_50=49:100:4 +portmap_54=53:100:4 +portmap_58=57:100:4 +portmap_62=61:100:4 +portmap_84=81:100:4 +portmap_88=85:100:4 +portmap_92=89:100:4 +portmap_96=93:100:4 +portmap_102=97:100:4 +portmap_106=101:100:4 +portmap_110=105:100:4 +portmap_114=109:100:4 +portmap_1=1:100:4 +portmap_5=5:100:4 +portmap_9=9:100:4 +portmap_13=13:100:4 +portmap_17=17:100:4 +portmap_21=21:100:4 +portmap_25=25:100:4 +portmap_29=29:100:4 +portmap_118=113:100:4 +portmap_122=117:100:4 +portmap_126=121:100:4 +portmap_130=125:100:4 +#portmap_66=129:10 +#portmap_100=131:10 + +#WC16 +xgxs_tx_lane_map_68=0x3201 +xgxs_rx_lane_map_68=0x2310 + + +#WC17 +xgxs_tx_lane_map_72=0x3201 +xgxs_rx_lane_map_72=0x2301 + +#WC18 +xgxs_tx_lane_map_76=0x0132 +xgxs_rx_lane_map_76=0x0123 + +#WC19 +xgxs_tx_lane_map_80=0x2031 +xgxs_rx_lane_map_80=0x1320 + +#WC8 +xgxs_tx_lane_map_34=0x3021 +xgxs_rx_lane_map_34=0x0213 + +#WC9 +xgxs_tx_lane_map_38=0x3210 +xgxs_rx_lane_map_38=0x1023 + +#WC10 +xgxs_tx_lane_map_42=0x2310 +xgxs_rx_lane_map_42=0x3210 + +#WC11 +xgxs_tx_lane_map_46=0x1032 +xgxs_rx_lane_map_46=0x1302 + +#WC12 +xgxs_tx_lane_map_50=0x3201 +xgxs_rx_lane_map_50=0x0213 + + +#WC13 +xgxs_tx_lane_map_54=0x2301 +xgxs_rx_lane_map_54=0x2310 + +#WC14 +xgxs_tx_lane_map_58=0x3201 +xgxs_rx_lane_map_58=0x0213 + +#WC15 +xgxs_tx_lane_map_62=0x1302 +xgxs_rx_lane_map_62=0x2310 + +#WC20 +xgxs_tx_lane_map_84=0x0213 +xgxs_rx_lane_map_84=0x2301 + +#WC21 +xgxs_tx_lane_map_88=0x0132 +xgxs_rx_lane_map_88=0x3210 + +#WC22 +xgxs_tx_lane_map_92=0x0132 +xgxs_rx_lane_map_92=0x2031 + +#WC23 +xgxs_tx_lane_map_96=0x2031 +xgxs_rx_lane_map_96=0x3201 + +#WC24 +xgxs_tx_lane_map_102=0x0132 +xgxs_rx_lane_map_102=0x2301 + +#WC25 +xgxs_tx_lane_map_106=0x0132 +xgxs_rx_lane_map_106=0x3201 + +#WC26 +xgxs_tx_lane_map_110=0x0132 +xgxs_rx_lane_map_110=0x2031 + +#WC27 +xgxs_tx_lane_map_114=0x2031 +xgxs_rx_lane_map_114=0x2301 + + +#WC0 +xgxs_tx_lane_map_1=0x3210 +xgxs_rx_lane_map_1=0x3120 + +#WC1 +xgxs_tx_lane_map_5=0x0132 +xgxs_rx_lane_map_5=0x1023 + +#WC2 +xgxs_tx_lane_map_9=0x3201 +xgxs_rx_lane_map_9=0x3120 + +#WC3 +xgxs_tx_lane_map_13=0x2031 +xgxs_rx_lane_map_13=0x1032 + +#WC4 +xgxs_tx_lane_map_17=0x2310 +xgxs_rx_lane_map_17=0x3210 + +#WC5 +xgxs_tx_lane_map_21=0x2301 +xgxs_rx_lane_map_21=0x3120 + +#WC6 +xgxs_tx_lane_map_25=0x3201 +xgxs_rx_lane_map_25=0x0213 + +#WC7 +xgxs_tx_lane_map_29=0x1302 +xgxs_rx_lane_map_29=0x1023 + +#WC28 +xgxs_tx_lane_map_118=0x1320 +xgxs_rx_lane_map_118=0x1302 + +#WC29 +xgxs_tx_lane_map_122=0x1032 +xgxs_rx_lane_map_122=0x1023 + +#WC30 +xgxs_tx_lane_map_126=0x3120 +xgxs_rx_lane_map_126=0x3120 + +#WC31 +xgxs_tx_lane_map_130=0x1302 +xgxs_rx_lane_map_130=0x2310 + +#PN + +#WC16 +phy_xaui_tx_polarity_flip_68=0x0000 +phy_xaui_rx_polarity_flip_68=0x0000 + +#WC17 +phy_xaui_tx_polarity_flip_72=0x000D +phy_xaui_rx_polarity_flip_72=0x0002 + + +#WC18 +phy_xaui_tx_polarity_flip_76=0x000F +phy_xaui_rx_polarity_flip_76=0x0000 + +#WC19 +phy_xaui_tx_polarity_flip_80=0x000F +phy_xaui_rx_polarity_flip_80=0x000F + + +#WC8 +phy_xaui_tx_polarity_flip_34=0x000E +phy_xaui_rx_polarity_flip_34=0x0000 + +#WC9 +phy_xaui_tx_polarity_flip_38=0x0008 +phy_xaui_rx_polarity_flip_38=0x0000 + +#WC10 +phy_xaui_tx_polarity_flip_42=0x000D +phy_xaui_rx_polarity_flip_42=0x0000 + +#WC11 +phy_xaui_tx_polarity_flip_46=0x0000 +phy_xaui_rx_polarity_flip_46=0x0000 + + +#WC12 +phy_xaui_tx_polarity_flip_50=0x0002 +phy_xaui_rx_polarity_flip_50=0x0000 + +#WC13 +phy_xaui_tx_polarity_flip_54=0x0002 +phy_xaui_rx_polarity_flip_54=0x0000 + +#WC14 +phy_xaui_tx_polarity_flip_58=0x0000 +phy_xaui_rx_polarity_flip_58=0x0000 + +#WC15 +phy_xaui_tx_polarity_flip_62=0x000A +phy_xaui_rx_polarity_flip_62=0x000F + + +#WC20 + phy_xaui_tx_polarity_flip_84=0x0007 + phy_xaui_rx_polarity_flip_84=0x000E + +#WC21 +phy_xaui_tx_polarity_flip_88=0x000D +phy_xaui_rx_polarity_flip_88=0x000D + +#WC22 +phy_xaui_tx_polarity_flip_92=0x000F +phy_xaui_rx_polarity_flip_92=0x0008 + +#WC23 +phy_xaui_tx_polarity_flip_96=0x0005 +phy_xaui_rx_polarity_flip_96=0x0000 + +#WC24 +phy_xaui_tx_polarity_flip_102=0x0000 +phy_xaui_rx_polarity_flip_102=0x000F + +#WC25 +phy_xaui_tx_polarity_flip_106=0x000F +phy_xaui_rx_polarity_flip_106=0x0000 + +#WC26 +phy_xaui_tx_polarity_flip_110=0x000F +phy_xaui_rx_polarity_flip_110=0x000F + +#WC27 +phy_xaui_tx_polarity_flip_114=0x000F +phy_xaui_rx_polarity_flip_114=0x0007 + +#WC0 +phy_xaui_tx_polarity_flip_1=0x0003 +phy_xaui_rx_polarity_flip_1=0x000F + +#WC1 +phy_xaui_tx_polarity_flip_5=0x0007 +phy_xaui_rx_polarity_flip_5=0x0000 + +#WC2 +phy_xaui_tx_polarity_flip_9=0x0002 +phy_xaui_rx_polarity_flip_9=0x0008 + +#WC3 +phy_xaui_tx_polarity_flip_13=0x000F +phy_xaui_rx_polarity_flip_13=0x0000 + +#WC4 +phy_xaui_tx_polarity_flip_17=0x0007 +phy_xaui_rx_polarity_flip_17=0x0000 + +#WC5 +phy_xaui_tx_polarity_flip_21=0x0000 +phy_xaui_rx_polarity_flip_21=0x0000 + +#WC6 +phy_xaui_tx_polarity_flip_25=0x0002 +phy_xaui_rx_polarity_flip_25=0x0005 + +#WC7 +phy_xaui_tx_polarity_flip_29=0x0002 +phy_xaui_rx_polarity_flip_29=0x0000 + +#WC28 +phy_xaui_tx_polarity_flip_118=0x000F +phy_xaui_rx_polarity_flip_118=0x000F + +#WC29 +phy_xaui_tx_polarity_flip_122=0x0004 +phy_xaui_rx_polarity_flip_122=0x0000 + +#WC30 +phy_xaui_tx_polarity_flip_126=0x000F +phy_xaui_rx_polarity_flip_126=0x0000 + +#WC31 +phy_xaui_tx_polarity_flip_130=0x0006 +phy_xaui_rx_polarity_flip_130=0x0000 + +mmu_init_config="MSFT-TH-Tier0" diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t1.config.bcm b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t1.config.bcm new file mode 100644 index 000000000000..effdfb5d7570 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/th-seastone-dx010-32x100G-t1.config.bcm @@ -0,0 +1,696 @@ +# Define default OS / SAL +os=unix + +# all XPORTs to XE ports +#pbmp_xport_xe=0x1fffffffe +pbmp_xport_xe=0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +pbmp_oversubscribe=0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe + +# Mode control to select L2 Table DMA mode aka L2MODE_POLL (0) or +# L2MOD_FIFO mechanism aka L2MODE_FIFO (1) for L2 table change notification. +l2xmsg_mode=1 + +# Memory table size configs +l2_mem_entries=8192 +l3_mem_entries=8192 +l3_alpm_enable=2 +ipv6_lpm_128b_enable=1 +mmu_lossless=0 + +################################################################################### +# Celestica Customize for SeaStone +################################################################################### + +#ext mdio frequency to 495/0x80/2(1.933Mhz) or 415/0x80/2(1.62MHz) +# default is 40 +# Set external MDIO freq to 6.19MHz (495MHz) or 5.19MHz (415MHz) +#* target_freq is core_clock_freq * DIVIDEND / DIVISOR / 2 +# +rate_ext_mdio_divisor=0x80 + +# use internal rom boot +phy_ext_rom_boot=0 + +#fpem_mem_entries=32768 +oversubscribe_mode=1 +#pbmp_xport_xe=0x3fd000000ff4000003fc000001fe + + +dport_map_enable=1 + +dport_map_port_68=1 +dport_map_port_72=5 +dport_map_port_76=9 +dport_map_port_80=13 +dport_map_port_34=17 +dport_map_port_38=21 +dport_map_port_42=25 +dport_map_port_46=29 +dport_map_port_50=33 +dport_map_port_54=37 +dport_map_port_58=41 +dport_map_port_62=45 +dport_map_port_84=49 +dport_map_port_88=53 +dport_map_port_92=57 +dport_map_port_96=61 +dport_map_port_102=65 +dport_map_port_106=69 +dport_map_port_110=73 +dport_map_port_114=77 +dport_map_port_1=81 +dport_map_port_5=85 +dport_map_port_9=89 +dport_map_port_13=93 +dport_map_port_17=97 +dport_map_port_21=101 +dport_map_port_25=105 +dport_map_port_29=109 +dport_map_port_118=113 +dport_map_port_122=117 +dport_map_port_126=121 +dport_map_port_130=125 + + +# port mapping +portmap_68=65:100:4 +portmap_72=69:100:4 +portmap_76=73:100:4 +portmap_80=77:100:4 +portmap_34=33:100:4 +portmap_38=37:100:4 +portmap_42=41:100:4 +portmap_46=45:100:4 +portmap_50=49:100:4 +portmap_54=53:100:4 +portmap_58=57:100:4 +portmap_62=61:100:4 +portmap_84=81:100:4 +portmap_88=85:100:4 +portmap_92=89:100:4 +portmap_96=93:100:4 +portmap_102=97:100:4 +portmap_106=101:100:4 +portmap_110=105:100:4 +portmap_114=109:100:4 +portmap_1=1:100:4 +portmap_5=5:100:4 +portmap_9=9:100:4 +portmap_13=13:100:4 +portmap_17=17:100:4 +portmap_21=21:100:4 +portmap_25=25:100:4 +portmap_29=29:100:4 +portmap_118=113:100:4 +portmap_122=117:100:4 +portmap_126=121:100:4 +portmap_130=125:100:4 +#portmap_66=129:10 +#portmap_100=131:10 + +#WC16 +xgxs_tx_lane_map_68=0x3201 +xgxs_rx_lane_map_68=0x2310 + + +#WC17 +xgxs_tx_lane_map_72=0x3201 +xgxs_rx_lane_map_72=0x2301 + +#WC18 +xgxs_tx_lane_map_76=0x0132 +xgxs_rx_lane_map_76=0x0123 + +#WC19 +xgxs_tx_lane_map_80=0x2031 +xgxs_rx_lane_map_80=0x1320 + +#WC8 +xgxs_tx_lane_map_34=0x3021 +xgxs_rx_lane_map_34=0x0213 + +#WC9 +xgxs_tx_lane_map_38=0x3210 +xgxs_rx_lane_map_38=0x1023 + +#WC10 +xgxs_tx_lane_map_42=0x2310 +xgxs_rx_lane_map_42=0x3210 + +#WC11 +xgxs_tx_lane_map_46=0x1032 +xgxs_rx_lane_map_46=0x1302 + +#WC12 +xgxs_tx_lane_map_50=0x3201 +xgxs_rx_lane_map_50=0x0213 + + +#WC13 +xgxs_tx_lane_map_54=0x2301 +xgxs_rx_lane_map_54=0x2310 + +#WC14 +xgxs_tx_lane_map_58=0x3201 +xgxs_rx_lane_map_58=0x0213 + +#WC15 +xgxs_tx_lane_map_62=0x1302 +xgxs_rx_lane_map_62=0x2310 + +#WC20 +xgxs_tx_lane_map_84=0x0213 +xgxs_rx_lane_map_84=0x2301 + +#WC21 +xgxs_tx_lane_map_88=0x0132 +xgxs_rx_lane_map_88=0x3210 + +#WC22 +xgxs_tx_lane_map_92=0x0132 +xgxs_rx_lane_map_92=0x2031 + +#WC23 +xgxs_tx_lane_map_96=0x2031 +xgxs_rx_lane_map_96=0x3201 + +#WC24 +xgxs_tx_lane_map_102=0x0132 +xgxs_rx_lane_map_102=0x2301 + +#WC25 +xgxs_tx_lane_map_106=0x0132 +xgxs_rx_lane_map_106=0x3201 + +#WC26 +xgxs_tx_lane_map_110=0x0132 +xgxs_rx_lane_map_110=0x2031 + +#WC27 +xgxs_tx_lane_map_114=0x2031 +xgxs_rx_lane_map_114=0x2301 + + +#WC0 +xgxs_tx_lane_map_1=0x3210 +xgxs_rx_lane_map_1=0x3120 + +#WC1 +xgxs_tx_lane_map_5=0x0132 +xgxs_rx_lane_map_5=0x1023 + +#WC2 +xgxs_tx_lane_map_9=0x3201 +xgxs_rx_lane_map_9=0x3120 + +#WC3 +xgxs_tx_lane_map_13=0x2031 +xgxs_rx_lane_map_13=0x1032 + +#WC4 +xgxs_tx_lane_map_17=0x2310 +xgxs_rx_lane_map_17=0x3210 + +#WC5 +xgxs_tx_lane_map_21=0x2301 +xgxs_rx_lane_map_21=0x3120 + +#WC6 +xgxs_tx_lane_map_25=0x3201 +xgxs_rx_lane_map_25=0x0213 + +#WC7 +xgxs_tx_lane_map_29=0x1302 +xgxs_rx_lane_map_29=0x1023 + +#WC28 +xgxs_tx_lane_map_118=0x1320 +xgxs_rx_lane_map_118=0x1302 + +#WC29 +xgxs_tx_lane_map_122=0x1032 +xgxs_rx_lane_map_122=0x1023 + +#WC30 +xgxs_tx_lane_map_126=0x3120 +xgxs_rx_lane_map_126=0x3120 + +#WC31 +xgxs_tx_lane_map_130=0x1302 +xgxs_rx_lane_map_130=0x2310 + +#PN + +#WC16 +phy_xaui_tx_polarity_flip_68=0x0000 +phy_xaui_rx_polarity_flip_68=0x0000 + +#WC17 +phy_xaui_tx_polarity_flip_72=0x000D +phy_xaui_rx_polarity_flip_72=0x0002 + + +#WC18 +phy_xaui_tx_polarity_flip_76=0x000F +phy_xaui_rx_polarity_flip_76=0x0000 + +#WC19 +phy_xaui_tx_polarity_flip_80=0x000F +phy_xaui_rx_polarity_flip_80=0x000F + + +#WC8 +phy_xaui_tx_polarity_flip_34=0x000E +phy_xaui_rx_polarity_flip_34=0x0000 + +#WC9 +phy_xaui_tx_polarity_flip_38=0x0008 +phy_xaui_rx_polarity_flip_38=0x0000 + +#WC10 +phy_xaui_tx_polarity_flip_42=0x000D +phy_xaui_rx_polarity_flip_42=0x0000 + +#WC11 +phy_xaui_tx_polarity_flip_46=0x0000 +phy_xaui_rx_polarity_flip_46=0x0000 + + +#WC12 +phy_xaui_tx_polarity_flip_50=0x0002 +phy_xaui_rx_polarity_flip_50=0x0000 + +#WC13 +phy_xaui_tx_polarity_flip_54=0x0002 +phy_xaui_rx_polarity_flip_54=0x0000 + +#WC14 +phy_xaui_tx_polarity_flip_58=0x0000 +phy_xaui_rx_polarity_flip_58=0x0000 + +#WC15 +phy_xaui_tx_polarity_flip_62=0x000A +phy_xaui_rx_polarity_flip_62=0x000F + + +#WC20 + phy_xaui_tx_polarity_flip_84=0x0007 + phy_xaui_rx_polarity_flip_84=0x000E + +#WC21 +phy_xaui_tx_polarity_flip_88=0x000D +phy_xaui_rx_polarity_flip_88=0x000D + +#WC22 +phy_xaui_tx_polarity_flip_92=0x000F +phy_xaui_rx_polarity_flip_92=0x0008 + +#WC23 +phy_xaui_tx_polarity_flip_96=0x0005 +phy_xaui_rx_polarity_flip_96=0x0000 + +#WC24 +phy_xaui_tx_polarity_flip_102=0x0000 +phy_xaui_rx_polarity_flip_102=0x000F + +#WC25 +phy_xaui_tx_polarity_flip_106=0x000F +phy_xaui_rx_polarity_flip_106=0x0000 + +#WC26 +phy_xaui_tx_polarity_flip_110=0x000F +phy_xaui_rx_polarity_flip_110=0x000F + +#WC27 +phy_xaui_tx_polarity_flip_114=0x000F +phy_xaui_rx_polarity_flip_114=0x0007 + +#WC0 +phy_xaui_tx_polarity_flip_1=0x0003 +phy_xaui_rx_polarity_flip_1=0x000F + +#WC1 +phy_xaui_tx_polarity_flip_5=0x0007 +phy_xaui_rx_polarity_flip_5=0x0000 + +#WC2 +phy_xaui_tx_polarity_flip_9=0x0002 +phy_xaui_rx_polarity_flip_9=0x0008 + +#WC3 +phy_xaui_tx_polarity_flip_13=0x000F +phy_xaui_rx_polarity_flip_13=0x0000 + +#WC4 +phy_xaui_tx_polarity_flip_17=0x0007 +phy_xaui_rx_polarity_flip_17=0x0000 + +#WC5 +phy_xaui_tx_polarity_flip_21=0x0000 +phy_xaui_rx_polarity_flip_21=0x0000 + +#WC6 +phy_xaui_tx_polarity_flip_25=0x0002 +phy_xaui_rx_polarity_flip_25=0x0005 + +#WC7 +phy_xaui_tx_polarity_flip_29=0x0002 +phy_xaui_rx_polarity_flip_29=0x0000 + +#WC28 +phy_xaui_tx_polarity_flip_118=0x000F +phy_xaui_rx_polarity_flip_118=0x000F + +#WC29 +phy_xaui_tx_polarity_flip_122=0x0004 +phy_xaui_rx_polarity_flip_122=0x0000 + +#WC30 +phy_xaui_tx_polarity_flip_126=0x000F +phy_xaui_rx_polarity_flip_126=0x0000 + +#WC31 +phy_xaui_tx_polarity_flip_130=0x0006 +phy_xaui_rx_polarity_flip_130=0x0000 + +#ce0 +serdes_driver_current_lane0_68=0x0b +serdes_driver_current_lane1_68=0x0b +serdes_driver_current_lane2_68=0x0b +serdes_driver_current_lane3_68=0x0b +serdes_preemphasis_lane0_68=0x2d3f04 +serdes_preemphasis_lane1_68=0x2b4104 +serdes_preemphasis_lane2_68=0x2b4104 +serdes_preemphasis_lane3_68=0x2d3f04 + +#ce1 +serdes_driver_current_lane0_72=0x0b +serdes_driver_current_lane1_72=0x0a +serdes_driver_current_lane2_72=0x0a +serdes_driver_current_lane3_72=0x0b +serdes_preemphasis_lane0_72=0x2b4104 +serdes_preemphasis_lane1_72=0x294403 +serdes_preemphasis_lane2_72=0x294403 +serdes_preemphasis_lane3_72=0x2b4104 + +#ce2 +serdes_driver_current_lane0_76=0x0a +serdes_driver_current_lane1_76=0x0a +serdes_driver_current_lane2_76=0x0a +serdes_driver_current_lane3_76=0x0a +serdes_preemphasis_lane0_76=0x294403 +serdes_preemphasis_lane1_76=0x294403 +serdes_preemphasis_lane2_76=0x294403 +serdes_preemphasis_lane3_76=0x294403 + +#ce3 +serdes_driver_current_lane0_80=0x0a +serdes_driver_current_lane1_80=0x0a +serdes_driver_current_lane2_80=0x0a +serdes_driver_current_lane3_80=0x0a +serdes_preemphasis_lane0_80=0x254902 +serdes_preemphasis_lane1_80=0x254902 +serdes_preemphasis_lane2_80=0x294403 +serdes_preemphasis_lane3_80=0x294403 + +#ce4 +serdes_driver_current_lane0_34=0x0b +serdes_driver_current_lane1_34=0x0b +serdes_driver_current_lane2_34=0x0b +serdes_driver_current_lane3_34=0x0b +serdes_preemphasis_lane0_34=0x2b4104 +serdes_preemphasis_lane1_34=0x2d3f04 +serdes_preemphasis_lane2_34=0x2d3f04 +serdes_preemphasis_lane3_34=0x2b4104 + +#ce5 +serdes_driver_current_lane0_38=0x0a +serdes_driver_current_lane1_38=0x0b +serdes_driver_current_lane2_38=0x0b +serdes_driver_current_lane3_38=0x0b +serdes_preemphasis_lane0_38=0x294403 +serdes_preemphasis_lane1_38=0x2b4104 +serdes_preemphasis_lane2_38=0x2b4104 +serdes_preemphasis_lane3_38=0x2b4104 + +#ce6 +serdes_driver_current_lane0_42=0x0a +serdes_driver_current_lane1_42=0x0b +serdes_driver_current_lane2_42=0x0a +serdes_driver_current_lane3_42=0x0a +serdes_preemphasis_lane0_42=0x294403 +serdes_preemphasis_lane1_42=0x2b4104 +serdes_preemphasis_lane2_42=0x294403 +serdes_preemphasis_lane3_42=0x294403 + +#ce7 +serdes_driver_current_lane0_46=0x0a +serdes_driver_current_lane1_46=0x0a +serdes_driver_current_lane2_46=0x0a +serdes_driver_current_lane3_46=0x0a +serdes_preemphasis_lane0_46=0x254902 +serdes_preemphasis_lane1_46=0x294403 +serdes_preemphasis_lane2_46=0x254902 +serdes_preemphasis_lane3_46=0x294403 + +#ce8 +serdes_driver_current_lane0_50=0x0a +serdes_driver_current_lane1_50=0x0a +serdes_driver_current_lane2_50=0x0a +serdes_driver_current_lane3_50=0x0a +serdes_preemphasis_lane0_50=0x294403 +serdes_preemphasis_lane1_50=0x254902 +serdes_preemphasis_lane2_50=0x254902 +serdes_preemphasis_lane3_50=0x254902 + +#ce9 +serdes_driver_current_lane0_54=0x0a +serdes_driver_current_lane1_54=0x09 +serdes_driver_current_lane2_54=0x0a +serdes_driver_current_lane3_54=0x09 +serdes_preemphasis_lane0_54=0x254902 +serdes_preemphasis_lane1_54=0x244a02 +serdes_preemphasis_lane2_54=0x254902 +serdes_preemphasis_lane3_54=0x244a02 + +#ce10 +serdes_driver_current_lane0_58=0x0a +serdes_driver_current_lane1_58=0x09 +serdes_driver_current_lane2_58=0x09 +serdes_driver_current_lane3_58=0x0a +serdes_preemphasis_lane0_58=0x254902 +serdes_preemphasis_lane1_58=0x244a02 +serdes_preemphasis_lane2_58=0x244a02 +serdes_preemphasis_lane3_58=0x254902 + +#ce11 +serdes_driver_current_lane0_62=0x09 +serdes_driver_current_lane1_62=0x0a +serdes_driver_current_lane2_62=0x09 +serdes_driver_current_lane3_62=0x09 +serdes_preemphasis_lane0_62=0x244a02 +serdes_preemphasis_lane1_62=0x254902 +serdes_preemphasis_lane2_62=0x244a02 +serdes_preemphasis_lane3_62=0x244a02 + +#ce12 +serdes_driver_current_lane0_84=0x09 +serdes_driver_current_lane1_84=0x09 +serdes_driver_current_lane2_84=0x09 +serdes_driver_current_lane3_84=0x09 +serdes_preemphasis_lane0_84=0x204e02 +serdes_preemphasis_lane1_84=0x204e02 +serdes_preemphasis_lane2_84=0x204e02 +serdes_preemphasis_lane3_84=0x204e02 + +#ce13 +serdes_driver_current_lane0_88=0x09 +serdes_driver_current_lane1_88=0x08 +serdes_driver_current_lane2_88=0x08 +serdes_driver_current_lane3_88=0x09 +serdes_preemphasis_lane0_88=0x204e02 +serdes_preemphasis_lane1_88=0x1d5102 +serdes_preemphasis_lane2_88=0x1d5102 +serdes_preemphasis_lane3_88=0x204e02 + +#ce14 +serdes_driver_current_lane0_92=0x09 +serdes_driver_current_lane1_92=0x08 +serdes_driver_current_lane2_92=0x08 +serdes_driver_current_lane3_92=0x09 +serdes_preemphasis_lane0_92=0x204e02 +serdes_preemphasis_lane1_92=0x1d5102 +serdes_preemphasis_lane2_92=0x1d5102 +serdes_preemphasis_lane3_92=0x204e02 + +#ce15 +serdes_driver_current_lane0_96=0x08 +serdes_driver_current_lane1_96=0x08 +serdes_driver_current_lane2_96=0x09 +serdes_driver_current_lane3_96=0x09 +serdes_preemphasis_lane0_96=0x1d5102 +serdes_preemphasis_lane1_96=0x1d5102 +serdes_preemphasis_lane2_96=0x204e02 +serdes_preemphasis_lane3_96=0x204e02 + +#ce16 +serdes_driver_current_lane0_102=0x09 +serdes_driver_current_lane1_102=0x08 +serdes_driver_current_lane2_102=0x08 +serdes_driver_current_lane3_102=0x09 +serdes_preemphasis_lane0_102=0x204e02 +serdes_preemphasis_lane1_102=0x1d5102 +serdes_preemphasis_lane2_102=0x1d5102 +serdes_preemphasis_lane3_102=0x224c02 + +#ce17 +serdes_driver_current_lane0_106=0x09 +serdes_driver_current_lane1_106=0x08 +serdes_driver_current_lane2_106=0x08 +serdes_driver_current_lane3_106=0x09 +serdes_preemphasis_lane0_106=0x204e02 +serdes_preemphasis_lane1_106=0x1d5102 +serdes_preemphasis_lane2_106=0x1d5102 +serdes_preemphasis_lane3_106=0x204e02 + +#ce18 +serdes_driver_current_lane0_110=0x09 +serdes_driver_current_lane1_110=0x08 +serdes_driver_current_lane2_110=0x08 +serdes_driver_current_lane3_110=0x09 +serdes_preemphasis_lane0_110=0x204e02 +serdes_preemphasis_lane1_110=0x1d5102 +serdes_preemphasis_lane2_110=0x1d5102 +serdes_preemphasis_lane3_110=0x204e02 + +#ce19 +serdes_driver_current_lane0_114=0x09 +serdes_driver_current_lane1_114=0x08 +serdes_driver_current_lane2_114=0x09 +serdes_driver_current_lane3_114=0x09 +serdes_preemphasis_lane0_114=0x204e02 +serdes_preemphasis_lane1_114=0x1d5102 +serdes_preemphasis_lane2_114=0x224c02 +serdes_preemphasis_lane3_114=0x224c02 + +#ce20 +serdes_driver_current_lane0_1=0x09 +serdes_driver_current_lane1_1=0x0a +serdes_driver_current_lane2_1=0x09 +serdes_driver_current_lane3_1=0x0a +serdes_preemphasis_lane0_1=0x244a02 +serdes_preemphasis_lane1_1=0x254902 +serdes_preemphasis_lane2_1=0x244a02 +serdes_preemphasis_lane3_1=0x254902 + +#ce21 +serdes_driver_current_lane0_5=0x09 +serdes_driver_current_lane1_5=0x09 +serdes_driver_current_lane2_5=0x09 +serdes_driver_current_lane3_5=0x0a +serdes_preemphasis_lane0_5=0x244a02 +serdes_preemphasis_lane1_5=0x244a02 +serdes_preemphasis_lane2_5=0x244a02 +serdes_preemphasis_lane3_5=0x254902 + +#ce22 +serdes_driver_current_lane0_9=0x0a +serdes_driver_current_lane1_9=0x0a +serdes_driver_current_lane2_9=0x0a +serdes_driver_current_lane3_9=0x0a +serdes_preemphasis_lane0_9=0x254902 +serdes_preemphasis_lane1_9=0x254902 +serdes_preemphasis_lane2_9=0x254902 +serdes_preemphasis_lane3_9=0x294403 + +#ce23 +serdes_driver_current_lane0_13=0x09 +serdes_driver_current_lane1_13=0x0a +serdes_driver_current_lane2_13=0x0a +serdes_driver_current_lane3_13=0x0a +serdes_preemphasis_lane0_13=0x244a02 +serdes_preemphasis_lane1_13=0x254902 +serdes_preemphasis_lane2_13=0x294403 +serdes_preemphasis_lane3_13=0x294403 + +#ce24 +serdes_driver_current_lane0_17=0x0a +serdes_driver_current_lane1_17=0x0a +serdes_driver_current_lane2_17=0x0a +serdes_driver_current_lane3_17=0x0a +serdes_preemphasis_lane0_17=0x254902 +serdes_preemphasis_lane1_17=0x294403 +serdes_preemphasis_lane2_17=0x294403 +serdes_preemphasis_lane3_17=0x294403 + +#ce25 +serdes_driver_current_lane0_21=0x0a +serdes_driver_current_lane1_21=0x0a +serdes_driver_current_lane2_21=0x0a +serdes_driver_current_lane3_21=0x0a +serdes_preemphasis_lane0_21=0x294403 +serdes_preemphasis_lane1_21=0x294403 +serdes_preemphasis_lane2_21=0x294403 +serdes_preemphasis_lane3_21=0x254902 + +#ce26 +serdes_driver_current_lane0_25=0x0b +serdes_driver_current_lane1_25=0x0b +serdes_driver_current_lane2_25=0x0b +serdes_driver_current_lane3_25=0x0b +serdes_preemphasis_lane0_25=0x2b4104 +serdes_preemphasis_lane1_25=0x2b4104 +serdes_preemphasis_lane2_25=0x2b4104 +serdes_preemphasis_lane3_25=0x2d3f04 + +#ce27 +serdes_driver_current_lane0_29=0x0b +serdes_driver_current_lane1_29=0x0b +serdes_driver_current_lane2_29=0x0b +serdes_driver_current_lane3_29=0x0a +serdes_preemphasis_lane0_29=0x2d3f04 +serdes_preemphasis_lane1_29=0x2d3f04 +serdes_preemphasis_lane2_29=0x2b4104 +serdes_preemphasis_lane3_29=0x294403 + +#ce28 +serdes_driver_current_lane0_118=0x0a +serdes_driver_current_lane1_118=0x0a +serdes_driver_current_lane2_118=0x0a +serdes_driver_current_lane3_118=0x0a +serdes_preemphasis_lane0_118=0x254902 +serdes_preemphasis_lane1_118=0x294403 +serdes_preemphasis_lane2_118=0x294403 +serdes_preemphasis_lane3_118=0x254902 + +#ce29 +serdes_driver_current_lane0_122=0x0a +serdes_driver_current_lane1_122=0x0a +serdes_driver_current_lane2_122=0x0a +serdes_driver_current_lane3_122=0x0a +serdes_preemphasis_lane0_122=0x294403 +serdes_preemphasis_lane1_122=0x294403 +serdes_preemphasis_lane2_122=0x294403 +serdes_preemphasis_lane3_122=0x294403 + +#ce30 +serdes_driver_current_lane0_126=0x0a +serdes_driver_current_lane1_126=0x0a +serdes_driver_current_lane2_126=0x0b +serdes_driver_current_lane3_126=0x0b +serdes_preemphasis_lane0_126=0x294403 +serdes_preemphasis_lane1_126=0x294403 +serdes_preemphasis_lane2_126=0x2b4104 +serdes_preemphasis_lane3_126=0x2b4104 + +#ce31 +serdes_driver_current_lane0_130=0x0b +serdes_driver_current_lane1_130=0x0b +serdes_driver_current_lane2_130=0x0b +serdes_driver_current_lane3_130=0x0b +serdes_preemphasis_lane0_130=0x2d3f04 +serdes_preemphasis_lane1_130=0x2d3f04 +serdes_preemphasis_lane2_130=0x2b4104 +serdes_preemphasis_lane3_130=0x2b4104 + +mmu_init_config="MSFT-TH-Tier1" diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers.json.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers.json.j2 new file mode 100644 index 000000000000..1083a6210fc9 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers.json.j2 @@ -0,0 +1,2 @@ +{%- set default_topo = 't0' %} +{%- include 'buffers_config.j2' %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 new file mode 100644 index 000000000000..766de07b4945 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 @@ -0,0 +1,69 @@ + +{%- set default_cable = '5m' %} + +{%- set ports2cable = { + 'torrouter_server' : '300m', + 'leafrouter_torrouter' : '300m', + 'spinerouter_leafrouter' : '300m' + } +-%} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,9) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(14,17) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(22,31) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(10,13) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(18,21) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossless_pool]", + "size":"1518", + "static_th":"3995680" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini new file mode 100644 index 000000000000..aedda37a8878 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 10000 5m 1248 2288 35776 -3 2288 + 25000 5m 1248 2288 53248 -3 2288 + 40000 5m 1248 2288 66560 -3 2288 + 50000 5m 1248 2288 90272 -3 2288 + 100000 5m 1248 2288 165568 -3 2288 + 10000 40m 1248 2288 37024 -3 2288 + 25000 40m 1248 2288 53248 -3 2288 + 40000 40m 1248 2288 71552 -3 2288 + 50000 40m 1248 2288 96096 -3 2288 + 100000 40m 1248 2288 177632 -3 2288 + 10000 300m 1248 2288 46176 -3 2288 + 25000 300m 1248 2288 79040 -3 2288 + 40000 300m 1248 2288 108160 -3 2288 + 50000 300m 1248 2288 141856 -3 2288 + 100000 300m 1248 2288 268736 -3 2288 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/port_config.ini b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/port_config.ini new file mode 100644 index 000000000000..7595dfbb3fed --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/port_config.ini @@ -0,0 +1,57 @@ +# name lanes alias speed index +Ethernet0 65,66 etp1a 50000 1 +Ethernet2 67,68 etp1b 50000 1 +Ethernet4 69,70 etp2a 50000 2 +Ethernet6 71,72 etp2b 50000 2 +Ethernet8 73,74 etp3a 50000 3 +Ethernet10 75,76 etp3b 50000 3 +Ethernet12 77,78 etp4a 50000 4 +Ethernet14 79,80 etp4b 50000 4 +Ethernet16 33,34 etp5a 50000 5 +Ethernet18 35,36 etp5b 50000 5 +Ethernet20 37,38 etp6a 50000 6 +Ethernet22 39,40 etp6b 50000 6 +Ethernet24 41,42 etp7a 50000 7 +Ethernet26 43,44 etp7b 50000 7 +Ethernet28 45,46 etp8a 50000 8 +Ethernet30 47,48 etp8b 50000 8 +Ethernet32 49,50 etp9a 50000 9 +Ethernet34 51,52 etp9b 50000 9 +Ethernet36 53,54 etp10a 50000 10 +Ethernet38 55,56 etp10b 50000 10 +Ethernet40 57,58,59,60 etp11 100000 11 +Ethernet44 61,62,63,64 etp12 100000 12 +Ethernet48 81,82,83,84 etp13 100000 13 +Ethernet52 85,86,87,88 etp14 100000 14 +Ethernet56 89,90 etp15a 50000 15 +Ethernet58 91,92 etp15b 50000 15 +Ethernet60 93,94 etp16a 50000 16 +Ethernet62 95,96 etp16b 50000 16 +Ethernet64 97,98 etp17a 50000 17 +Ethernet66 99,100 etp17b 50000 17 +Ethernet68 101,102 etp18a 50000 18 +Ethernet70 103,104 etp18b 50000 18 +Ethernet72 105,106,107,108 etp19 100000 19 +Ethernet76 109,110,111,112 etp20 100000 20 +Ethernet80 1,2,3,4 etp21 100000 21 +Ethernet84 5,6,7,8 etp22 100000 22 +Ethernet88 9,10 etp23a 50000 23 +Ethernet90 11,12 etp23b 50000 23 +Ethernet92 13,14 etp24a 50000 24 +Ethernet94 15,16 etp24b 50000 24 +Ethernet96 17,18 etp25a 50000 25 +Ethernet98 19,20 etp25b 50000 25 +Ethernet100 21,22 etp26a 50000 26 +Ethernet102 23,24 etp26b 50000 26 +Ethernet104 25,26 etp27a 50000 27 +Ethernet106 27,28 etp27b 50000 27 +Ethernet108 29,30 etp28a 50000 28 +Ethernet110 31,32 etp28b 50000 28 +Ethernet112 113,114 etp29a 50000 29 +Ethernet114 115,116 etp29b 50000 29 +Ethernet116 117,118 etp30a 50000 30 +Ethernet118 119,120 etp30b 50000 30 +Ethernet120 121,122 etp31a 50000 31 +Ethernet122 123,124 etp31b 50000 31 +Ethernet124 125,126 etp32a 50000 32 +Ethernet126 127,128 etp32b 50000 32 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 new file mode 100644 index 000000000000..3e548325ea30 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/sai.profile b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/sai.profile new file mode 100644 index 000000000000..46d96b2fd905 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-seastone-dx010-48x50G+8x100G.config.bcm diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/th-seastone-dx010-48x50G+8x100G.config.bcm b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/th-seastone-dx010-48x50G+8x100G.config.bcm new file mode 100644 index 000000000000..6707aa71df09 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/th-seastone-dx010-48x50G+8x100G.config.bcm @@ -0,0 +1,648 @@ +os=unix +l2xmsg_mode=1 +parity_enable=0 +rate_ext_mdio_divisor=0x80 +phy_ext_rom_boot=0 +fpem_mem_entries=32768 +l2xmsg_mode=1 +oversubscribe_mode=1 +pbmp_xport_xe=0xcccc44cc33113333044cccccc66666622 + + +dport_map_enable=1 +dport_map_port_68=1 +dport_map_port_69=2 + +dport_map_port_72=5 +dport_map_port_73=6 + +dport_map_port_76=9 +dport_map_port_77=10 + +dport_map_port_80=13 +dport_map_port_81=14 + +dport_map_port_34=17 +dport_map_port_35=18 + +dport_map_port_38=21 +dport_map_port_39=22 + +dport_map_port_42=25 +dport_map_port_43=26 + +dport_map_port_46=29 +dport_map_port_47=30 + +dport_map_port_50=33 +dport_map_port_51=34 + +dport_map_port_54=37 +dport_map_port_55=38 + +dport_map_port_58=41 + +dport_map_port_62=45 + +dport_map_port_84=49 + +dport_map_port_88=53 + +dport_map_port_92=57 +dport_map_port_93=58 + +dport_map_port_96=61 +dport_map_port_97=62 + +dport_map_port_102=65 +dport_map_port_103=66 + +dport_map_port_106=69 +dport_map_port_107=70 + +dport_map_port_110=73 + +dport_map_port_114=77 + +dport_map_port_1=81 + +dport_map_port_5=85 + +dport_map_port_9=89 +dport_map_port_10=90 + +dport_map_port_13=93 +dport_map_port_14=94 + +dport_map_port_17=97 +dport_map_port_18=98 + +dport_map_port_21=101 +dport_map_port_22=102 + +dport_map_port_25=105 +dport_map_port_26=106 + +dport_map_port_29=109 +dport_map_port_30=110 + +dport_map_port_118=113 +dport_map_port_119=114 + +dport_map_port_122=117 +dport_map_port_123=118 + +dport_map_port_126=121 +dport_map_port_127=122 + +dport_map_port_130=125 +dport_map_port_131=126 + + +# port mapping +portmap_68=65:50:2 +portmap_69=67:50:2 + +portmap_72=69:50:2 +portmap_73=71:50:2 + +portmap_76=73:50:2 +portmap_77=75:50:2 + +portmap_80=77:50:2 +portmap_81=79:50:2 + +portmap_34=33:50:2 +portmap_35=35:50:2 + +portmap_38=37:50:2 +portmap_39=39:50:2 + +portmap_42=41:50:2 +portmap_43=43:50:2 + +portmap_46=45:50:2 +portmap_47=47:50:2 + +portmap_50=49:50:2 +portmap_51=51:50:2 + +portmap_54=53:50:2 +portmap_55=55:50:2 + +portmap_58=57:100:4 + +portmap_62=61:100:4 + +portmap_84=81:100:4 + +portmap_88=85:100:4 + +portmap_92=89:50:2 +portmap_93=91:50:2 + +portmap_96=93:50:2 +portmap_97=95:50:2 + +portmap_102=97:50:2 +portmap_103=99:50:2 + +portmap_106=101:50:2 +portmap_107=103:50:2 + +portmap_110=105:100:4 + +portmap_114=109:100:4 + +portmap_1=1:100:4 + +portmap_5=5:100:4 + +portmap_9=9:50:2 +portmap_10=11:50:2 + +portmap_13=13:50:2 +portmap_14=15:50:2 + +portmap_17=17:50:2 +portmap_18=19:50:2 + +portmap_21=21:50:2 +portmap_22=23:50:2 + +portmap_25=25:50:2 +portmap_26=27:50:2 + +portmap_29=29:50:2 +portmap_30=31:50:2 + +portmap_118=113:50:2 +portmap_119=115:50:2 + +portmap_122=117:50:2 +portmap_123=119:50:2 + +portmap_126=121:50:2 +portmap_127=123:50:2 + +portmap_130=125:50:2 +portmap_131=127:50:2 + + +#WC16 +xgxs_tx_lane_map_68=0x1023 +xgxs_rx_lane_map_68=0x0132 +xgxs_tx_lane_map_69=0x1023 +xgxs_rx_lane_map_69=0x0132 + + +#WC17 +xgxs_tx_lane_map_72=0x1023 +xgxs_rx_lane_map_72=0x1032 +xgxs_tx_lane_map_73=0x1023 +xgxs_rx_lane_map_73=0x1032 + +#WC18 +xgxs_tx_lane_map_76=0x2310 +xgxs_rx_lane_map_76=0x3210 +xgxs_tx_lane_map_77=0x2310 +xgxs_rx_lane_map_77=0x3210 + +#WC19 +xgxs_tx_lane_map_80=0x1302 +xgxs_rx_lane_map_80=0x0231 +xgxs_tx_lane_map_81=0x1302 +xgxs_rx_lane_map_81=0x0231 +#WC8 +xgxs_tx_lane_map_34=0x1203 +xgxs_rx_lane_map_34=0x3120 +xgxs_tx_lane_map_35=0x1203 +xgxs_rx_lane_map_35=0x3120 + +#WC9 +xgxs_tx_lane_map_38=0x0123 +xgxs_rx_lane_map_38=0x3201 +xgxs_tx_lane_map_39=0x0123 +xgxs_rx_lane_map_39=0x3201 + +#WC10 +xgxs_tx_lane_map_42=0x0132 +xgxs_rx_lane_map_42=0x0123 +xgxs_tx_lane_map_43=0x0132 +xgxs_rx_lane_map_43=0x0123 + +#WC11 +xgxs_tx_lane_map_46=0x2301 +xgxs_rx_lane_map_46=0x2031 +xgxs_tx_lane_map_47=0x2301 +xgxs_rx_lane_map_47=0x2031 + +#WC12 +xgxs_tx_lane_map_50=0x1032 +xgxs_rx_lane_map_50=0x3120 +xgxs_tx_lane_map_51=0x1032 +xgxs_rx_lane_map_51=0x3120 + + +#WC13 +xgxs_tx_lane_map_54=0x1032 +xgxs_rx_lane_map_54=0x0132 +xgxs_tx_lane_map_55=0x1032 +xgxs_rx_lane_map_55=0x0132 + +#WC14 + xgxs_tx_lane_map_58=0x1032 + xgxs_rx_lane_map_58=0x3120 + +#WC15 +xgxs_tx_lane_map_62=0x2031 +xgxs_rx_lane_map_62=0x0132 + +#WC20 + xgxs_tx_lane_map_84=0x3120 + xgxs_rx_lane_map_84=0x1032 + +#WC21 +xgxs_tx_lane_map_88=0x2310 +xgxs_rx_lane_map_88=0x0123 + +#WC22 +xgxs_tx_lane_map_92=0x2310 +xgxs_rx_lane_map_92=0x1302 +xgxs_tx_lane_map_93=0x2310 +xgxs_rx_lane_map_93=0x1302 + +#WC23 +xgxs_tx_lane_map_96=0x1302 +xgxs_rx_lane_map_96=0x1023 +xgxs_tx_lane_map_97=0x1302 +xgxs_rx_lane_map_97=0x1023 + +#WC24 +xgxs_tx_lane_map_102=0x2310 +xgxs_rx_lane_map_102=0x1032 +xgxs_tx_lane_map_103=0x2310 +xgxs_rx_lane_map_103=0x1032 + +#WC25 +xgxs_tx_lane_map_106=0x2310 +xgxs_rx_lane_map_106=0x1023 +xgxs_tx_lane_map_107=0x2310 +xgxs_rx_lane_map_107=0x1023 + +#WC26 +xgxs_tx_lane_map_110=0x2310 +xgxs_rx_lane_map_110=0x1302 + +#WC27 +xgxs_tx_lane_map_114=0x1302 +xgxs_rx_lane_map_114=0x1032 + +#WC0 +xgxs_tx_lane_map_1=0x0123 +xgxs_rx_lane_map_1=0x0213 + +#WC1 +xgxs_tx_lane_map_5=0x2310 +xgxs_rx_lane_map_5=0x3201 + +#WC2 +xgxs_tx_lane_map_9=0x1023 +xgxs_rx_lane_map_9=0x0213 +xgxs_tx_lane_map_10=0x1023 +xgxs_rx_lane_map_10=0x0213 + +#WC3 +xgxs_tx_lane_map_13=0x1302 +xgxs_rx_lane_map_13=0x3201 +xgxs_tx_lane_map_14=0x1302 +xgxs_rx_lane_map_14=0x3201 + +#WC4 +xgxs_tx_lane_map_17=0x0132 +xgxs_rx_lane_map_17=0x0123 +xgxs_tx_lane_map_18=0x0132 +xgxs_rx_lane_map_18=0x0123 + +#WC5 +xgxs_tx_lane_map_21=0x1032 +xgxs_rx_lane_map_21=0x0213 +xgxs_tx_lane_map_22=0x1032 +xgxs_rx_lane_map_22=0x0213 + +#WC6 +xgxs_tx_lane_map_25=0x1023 +xgxs_rx_lane_map_25=0x3120 +xgxs_tx_lane_map_26=0x1023 +xgxs_rx_lane_map_26=0x3120 + +#WC7 +xgxs_tx_lane_map_29=0x2031 +xgxs_rx_lane_map_29=0x3201 +xgxs_tx_lane_map_30=0x2031 +xgxs_rx_lane_map_30=0x3201 + +#WC28 +xgxs_tx_lane_map_118=0x0231 +xgxs_rx_lane_map_118=0x2031 +xgxs_tx_lane_map_119=0x0231 +xgxs_rx_lane_map_119=0x2031 + +#WC29 +xgxs_tx_lane_map_122=0x3201 +xgxs_rx_lane_map_122=0x2301 +xgxs_tx_lane_map_123=0x3201 +xgxs_rx_lane_map_123=0x2301 + +#WC30 +xgxs_tx_lane_map_126=0x0213 +xgxs_rx_lane_map_126=0x0213 +xgxs_tx_lane_map_127=0x0213 +xgxs_rx_lane_map_127=0x0213 + +#WC31 +xgxs_tx_lane_map_130=0x2031 +xgxs_rx_lane_map_130=0x1032 +xgxs_tx_lane_map_131=0x2031 +xgxs_rx_lane_map_131=0x1032 + +#PN + +#WC16 +phy_xaui_tx_polarity_flip_68=0x0000 +phy_xaui_rx_polarity_flip_68=0x0000 +phy_xaui_tx_polarity_flip_69=0x0000 +phy_xaui_rx_polarity_flip_69=0x0000 + +#WC17 +phy_xaui_tx_polarity_flip_72=0x0003 +phy_xaui_rx_polarity_flip_72=0x0000 +phy_xaui_tx_polarity_flip_73=0x0002 +phy_xaui_rx_polarity_flip_73=0x0001 + + + +#WC18 +phy_xaui_tx_polarity_flip_76=0x0003 +phy_xaui_rx_polarity_flip_76=0x0000 +phy_xaui_tx_polarity_flip_77=0x0003 +phy_xaui_rx_polarity_flip_77=0x0000 + + +#WC19 +phy_xaui_tx_polarity_flip_80=0x0003 +phy_xaui_rx_polarity_flip_80=0x0003 +phy_xaui_tx_polarity_flip_81=0x0003 +phy_xaui_rx_polarity_flip_81=0x0003 + + +#WC8 +phy_xaui_tx_polarity_flip_34=0x0003 +phy_xaui_rx_polarity_flip_34=0x0000 +phy_xaui_tx_polarity_flip_35=0x0001 +phy_xaui_rx_polarity_flip_35=0x0000 + + +#WC9 +phy_xaui_tx_polarity_flip_38=0x0001 +phy_xaui_rx_polarity_flip_38=0x0000 +phy_xaui_tx_polarity_flip_39=0x0000 +phy_xaui_rx_polarity_flip_39=0x0000 + + +#WC10 +phy_xaui_tx_polarity_flip_42=0x0003 +phy_xaui_rx_polarity_flip_42=0x0000 +phy_xaui_tx_polarity_flip_43=0x0002 +phy_xaui_rx_polarity_flip_43=0x0000 + + +#WC11 +phy_xaui_tx_polarity_flip_46=0x0000 +phy_xaui_rx_polarity_flip_46=0x0000 +phy_xaui_tx_polarity_flip_47=0x0000 +phy_xaui_rx_polarity_flip_47=0x0000 + + +#WC12 +phy_xaui_tx_polarity_flip_50=0x0000 +phy_xaui_rx_polarity_flip_50=0x0000 +phy_xaui_tx_polarity_flip_51=0x0001 +phy_xaui_rx_polarity_flip_51=0x0000 + +#WC13 +phy_xaui_tx_polarity_flip_54=0x0000 +phy_xaui_rx_polarity_flip_54=0x0000 +phy_xaui_tx_polarity_flip_55=0x0001 +phy_xaui_rx_polarity_flip_55=0x0000 + +#WC14 +phy_xaui_tx_polarity_flip_58=0x0000 +phy_xaui_rx_polarity_flip_58=0x0000 + +#WC15 +phy_xaui_tx_polarity_flip_62=0x0005 +phy_xaui_rx_polarity_flip_62=0x000F + +#WC20 + phy_xaui_tx_polarity_flip_84=0x000E + phy_xaui_rx_polarity_flip_84=0x0007 + +#WC21 +phy_xaui_tx_polarity_flip_88=0x000B +phy_xaui_rx_polarity_flip_88=0x000B + +#WC22 +phy_xaui_tx_polarity_flip_92=0x0003 +phy_xaui_rx_polarity_flip_92=0x0001 +phy_xaui_tx_polarity_flip_93=0x0003 +phy_xaui_rx_polarity_flip_93=0x0000 + + +#WC23 +phy_xaui_tx_polarity_flip_96=0x0002 +phy_xaui_rx_polarity_flip_96=0x0000 +phy_xaui_tx_polarity_flip_97=0x0002 +phy_xaui_rx_polarity_flip_97=0x0000 + +#WC24 +phy_xaui_tx_polarity_flip_102=0x0000 +phy_xaui_rx_polarity_flip_102=0x0003 +phy_xaui_tx_polarity_flip_103=0x0000 +phy_xaui_rx_polarity_flip_103=0x0003 + + +#WC25 +phy_xaui_tx_polarity_flip_106=0x0003 +phy_xaui_rx_polarity_flip_106=0x0000 +phy_xaui_tx_polarity_flip_107=0x0003 +phy_xaui_rx_polarity_flip_107=0x0000 + +#WC26 +phy_xaui_tx_polarity_flip_110=0x000F +phy_xaui_rx_polarity_flip_110=0x000F + +#WC27 +phy_xaui_tx_polarity_flip_114=0x000F +phy_xaui_rx_polarity_flip_114=0x000E + +#WC0 +phy_xaui_tx_polarity_flip_1=0x000C +phy_xaui_rx_polarity_flip_1=0x000F + +#WC1 +phy_xaui_tx_polarity_flip_5=0x000E +phy_xaui_rx_polarity_flip_5=0x0000 + +#WC2 +phy_xaui_tx_polarity_flip_9=0x0000 +phy_xaui_rx_polarity_flip_9=0x0001 +phy_xaui_tx_polarity_flip_10=0x0001 +phy_xaui_rx_polarity_flip_10=0x0000 + + +#WC3 +phy_xaui_tx_polarity_flip_13=0x0003 +phy_xaui_rx_polarity_flip_13=0x0000 +phy_xaui_tx_polarity_flip_14=0x0003 +phy_xaui_rx_polarity_flip_14=0x0000 + +#WC4 +phy_xaui_tx_polarity_flip_17=0x0002 +phy_xaui_rx_polarity_flip_17=0x0000 +phy_xaui_tx_polarity_flip_18=0x0003 +phy_xaui_rx_polarity_flip_18=0x0000 + + +#WC5 +phy_xaui_tx_polarity_flip_21=0x0000 +phy_xaui_rx_polarity_flip_21=0x0000 +phy_xaui_tx_polarity_flip_22=0x0000 +phy_xaui_rx_polarity_flip_22=0x0000 + + +#WC6 +phy_xaui_tx_polarity_flip_25=0x0000 +phy_xaui_rx_polarity_flip_25=0x0002 +phy_xaui_tx_polarity_flip_26=0x0001 +phy_xaui_rx_polarity_flip_26=0x0002 + + +#WC7 +phy_xaui_tx_polarity_flip_29=0x0000 +phy_xaui_rx_polarity_flip_29=0x0000 +phy_xaui_tx_polarity_flip_30=0x0001 +phy_xaui_rx_polarity_flip_30=0x0000 + + +#WC28 +phy_xaui_tx_polarity_flip_118=0x0003 +phy_xaui_rx_polarity_flip_118=0x0003 +phy_xaui_tx_polarity_flip_119=0x0003 +phy_xaui_rx_polarity_flip_119=0x0003 + + +#WC29 +phy_xaui_tx_polarity_flip_122=0x0002 +phy_xaui_rx_polarity_flip_122=0x0000 +phy_xaui_tx_polarity_flip_123=0x0000 +phy_xaui_rx_polarity_flip_123=0x0000 + + +#WC30 +phy_xaui_tx_polarity_flip_126=0x0003 +phy_xaui_rx_polarity_flip_126=0x0000 +phy_xaui_tx_polarity_flip_127=0x0003 +phy_xaui_rx_polarity_flip_127=0x0000 + + +#WC31 +phy_xaui_tx_polarity_flip_130=0x0002 +phy_xaui_rx_polarity_flip_130=0x0000 +phy_xaui_tx_polarity_flip_131=0x0001 +phy_xaui_rx_polarity_flip_131=0x0000 + +#xe +serdes_driver_current=0x0a +serdes_preemphasis=0x1a5402 + +#ce0 +serdes_driver_current_lane0_58=0x0a +serdes_driver_current_lane1_58=0x09 +serdes_driver_current_lane2_58=0x09 +serdes_driver_current_lane3_58=0x0a +serdes_preemphasis_lane0_58=0x254902 +serdes_preemphasis_lane1_58=0x244a02 +serdes_preemphasis_lane2_58=0x244a02 +serdes_preemphasis_lane3_58=0x254902 + +#ce1 +serdes_driver_current_lane0_62=0x09 +serdes_driver_current_lane1_62=0x0a +serdes_driver_current_lane2_62=0x09 +serdes_driver_current_lane3_62=0x09 +serdes_preemphasis_lane0_62=0x244a02 +serdes_preemphasis_lane1_62=0x254902 +serdes_preemphasis_lane2_62=0x244a02 +serdes_preemphasis_lane3_62=0x244a02 + +#ce2 +serdes_driver_current_lane0_84=0x09 +serdes_driver_current_lane1_84=0x09 +serdes_driver_current_lane2_84=0x09 +serdes_driver_current_lane3_84=0x09 +serdes_preemphasis_lane0_84=0x204e02 +serdes_preemphasis_lane1_84=0x204e02 +serdes_preemphasis_lane2_84=0x204e02 +serdes_preemphasis_lane3_84=0x204e02 + +#ce3 +serdes_driver_current_lane0_88=0x09 +serdes_driver_current_lane1_88=0x08 +serdes_driver_current_lane2_88=0x08 +serdes_driver_current_lane3_88=0x09 +serdes_preemphasis_lane0_88=0x204e02 +serdes_preemphasis_lane1_88=0x1d5102 +serdes_preemphasis_lane2_88=0x1d5102 +serdes_preemphasis_lane3_88=0x204e02 + +#ce4 +serdes_driver_current_lane0_110=0x09 +serdes_driver_current_lane1_110=0x08 +serdes_driver_current_lane2_110=0x08 +serdes_driver_current_lane3_110=0x09 +serdes_preemphasis_lane0_110=0x204e02 +serdes_preemphasis_lane1_110=0x1d5102 +serdes_preemphasis_lane2_110=0x1d5102 +serdes_preemphasis_lane3_110=0x204e02 + +#ce5 +serdes_driver_current_lane0_114=0x09 +serdes_driver_current_lane1_114=0x08 +serdes_driver_current_lane2_114=0x09 +serdes_driver_current_lane3_114=0x09 +serdes_preemphasis_lane0_114=0x204e02 +serdes_preemphasis_lane1_114=0x1d5102 +serdes_preemphasis_lane2_114=0x224c02 +serdes_preemphasis_lane3_114=0x224c02 + +#ce6 +serdes_driver_current_lane0_1=0x09 +serdes_driver_current_lane1_1=0x0a +serdes_driver_current_lane2_1=0x09 +serdes_driver_current_lane3_1=0x0a +serdes_preemphasis_lane0_1=0x244a02 +serdes_preemphasis_lane1_1=0x254902 +serdes_preemphasis_lane2_1=0x244a02 +serdes_preemphasis_lane3_1=0x254902 + +#ce7 +serdes_driver_current_lane0_5=0x09 +serdes_driver_current_lane1_5=0x09 +serdes_driver_current_lane2_5=0x09 +serdes_driver_current_lane3_5=0x0a +serdes_preemphasis_lane0_5=0x244a02 +serdes_preemphasis_lane1_5=0x244a02 +serdes_preemphasis_lane2_5=0x244a02 +serdes_preemphasis_lane3_5=0x254902 + From 9f59207d91a78cd43972c8a641ee0c63d1a819c1 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 25 Sep 2019 12:34:11 -0700 Subject: [PATCH 36/61] [201811][swss][swss-common] advance sub module head (#3502) Submodule src/sonic-swss 57e531d..0e5c1ff: > Adopt to signature change of Selectable::readData, which switched (#1061) > [orchagent]: Remove try/catch for correct coredump file (#790) Submodule src/sonic-swss-common d7b1f53..ece5ce4: > timerfd fix: Pass false alarm to caller. (#307) Signed-off-by: Ying Xie --- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-swss b/src/sonic-swss index 57e531d5fe4b..0e5c1ff614ce 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 57e531d5fe4b76dd777e19feff20f76410e78bd9 +Subproject commit 0e5c1ff614ceee6fe20adf3b67348131458f05f3 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index d7b1f53dee43..ece5ce4f3a55 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit d7b1f53dee43810149385ae54e8078b05015127c +Subproject commit ece5ce4f3a5564078c337659c2caae7b3abb04f3 From e7f1d4f3e273a6e6c506c860660fa0f795f442b0 Mon Sep 17 00:00:00 2001 From: Wenda Ni Date: Wed, 25 Sep 2019 15:57:07 -0700 Subject: [PATCH 37/61] Remove the divide by 4 operation to the under the hood SAI (#1532) * Remove the divide by 4 operation to the under the hood SAI This is to avoid the need and thus the confusion for application program to know the mmu internal architecture This change must have support from SAI change to reach the correct config Signed-off-by: Wenda * Relegate the divide by 4 operation to the under the hood SAI for egress lossless pool Extend to 7060 and 6100 Signed-off-by: Wenda * Add more TH/TH2 hwskus Signed-off-by: Wenda Ni * Update config test Signed-off-by: Wenda Ni * Add TH2 ingress lossy profile Signed-off-by: Wenda Ni * Move the divide by 4 operation to SAI internal Signed-off-by: Wenda Ni * [bcm SAI] Upgrade Broadcom SAI to version 3.5.3.1-15 - Broadcom SAI 3.5 GA release 20190924. Signed-off-by: Ying Xie --- .../Arista-7060CX-32S-C32/buffers_defaults_t0.j2 | 2 +- .../Arista-7060CX-32S-C32/buffers_defaults_t1.j2 | 2 +- .../Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 | 2 +- .../Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 | 2 +- .../Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 | 2 +- .../Arista-7260CX3-D108C8/buffers_defaults_t0.j2 | 4 ++-- .../Arista-7260CX3-Q64/buffers_defaults_t0.j2 | 4 ++-- .../Celestica-DX010-C32/buffers_defaults_t0.j2 | 2 +- .../Celestica-DX010-C32/buffers_defaults_t1.j2 | 2 +- .../Celestica-DX010-D48C8/buffers_defaults_t0.j2 | 2 +- .../Force10-S6100/buffers_defaults_t0.j2 | 2 +- .../Force10-S6100/buffers_defaults_t1.j2 | 2 +- .../Force10-Z9100-C32/buffers_defaults_t1.j2 | 2 +- .../Force10-Z9100-C8D48/buffers_defaults_t0.j2 | 2 +- platform/broadcom/sai.mk | 8 ++++---- .../tests/sample_output/buffers-dell6100.json | 2 +- 16 files changed, 21 insertions(+), 21 deletions(-) diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 index cb74cb75281b..0869e63968ac 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 @@ -36,7 +36,7 @@ "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", - "static_th":"3995680" + "static_th":"15982720" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 index 0699433bffb4..80e96bdceca7 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 @@ -36,7 +36,7 @@ "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", - "static_th":"3995680" + "static_th":"15982720" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 index 5d6e0cd61a7e..5add8968e621 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 @@ -50,7 +50,7 @@ "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", - "static_th":"3995680" + "static_th":"15982720" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 index cb74cb75281b..0869e63968ac 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 @@ -36,7 +36,7 @@ "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", - "static_th":"3995680" + "static_th":"15982720" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 index 0699433bffb4..80e96bdceca7 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 @@ -36,7 +36,7 @@ "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", - "static_th":"3995680" + "static_th":"15982720" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 index a5951e156b26..74579a022dcb 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 @@ -38,12 +38,12 @@ "ingress_lossy_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"11075584" + "static_th":"44302336" }, "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"0", - "static_th":"10587408" + "static_th":"42349632" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 index 62a6bac1c25f..3442612f70b2 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 @@ -30,12 +30,12 @@ "ingress_lossy_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"11075584" + "static_th":"44302336" }, "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"0", - "static_th":"10587408" + "static_th":"42349632" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 index 43b7d7e31a9c..4dd6bd96ad96 100644 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 @@ -43,7 +43,7 @@ "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", - "static_th":"3995680" + "static_th":"15982720" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 index 6ec383c77081..3c93fb8fe2e3 100644 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 @@ -43,7 +43,7 @@ "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", - "static_th":"3995680" + "static_th":"15982720" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 index 766de07b4945..4e4489f84a87 100644 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 @@ -58,7 +58,7 @@ "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", - "static_th":"3995680" + "static_th":"15982720" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 index f949a31eab7b..8f55022973fb 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 @@ -36,7 +36,7 @@ "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", - "static_th":"3995680" + "static_th":"15982720" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 index e56bbb65845f..47a9c81f0796 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 @@ -36,7 +36,7 @@ "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", - "static_th":"3995680" + "static_th":"15982720" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C32/buffers_defaults_t1.j2 b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C32/buffers_defaults_t1.j2 index e127362c091a..fa78303b2468 100644 --- a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C32/buffers_defaults_t1.j2 +++ b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C32/buffers_defaults_t1.j2 @@ -36,7 +36,7 @@ "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", - "static_th":"3995680" + "static_th":"15982720" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C8D48/buffers_defaults_t0.j2 b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C8D48/buffers_defaults_t0.j2 index f200b85b2027..fa5b0fc5a52b 100644 --- a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C8D48/buffers_defaults_t0.j2 +++ b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C8D48/buffers_defaults_t0.j2 @@ -50,7 +50,7 @@ "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", - "static_th":"3995680" + "static_th":"15982720" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 48fd1e67f660..b9325efbe062 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.5.2.3_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/bcmsai/3.5/jessie/libsaibcm_3.5.2.3_amd64.deb?sv=2015-04-05&sr=b&sig=OCYEP1DOHEVlfy6qjckfME%2FoD%2F914zIueu4UKgNsyQA%3D&se=2156-05-18T17%3A37%3A54Z&sp=r" +BRCM_SAI = libsaibcm_3.5.3.1-15_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/bcmsai/3.5/jessie/libsaibcm_3.5.3.1-15_amd64.deb?sv=2015-04-05&sr=b&sig=tZ1NxKEojTqKya6uPoAHckAhcUrV2qegAyp2goN1Yms%3D&se=2033-05-22T17%3A22%3A02Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.5.2.3_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.5.3.1-15_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/bcmsai/3.5/jessie/libsaibcm-dev_3.5.2.3_amd64.deb?sv=2015-04-05&sr=b&sig=Ohiw%2FaNhnbB%2FKFn%2BTaZgDrG1ziGfwjwrr2l%2BoIKCmA4%3D&se=2156-05-18T17%3A38%3A34Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/bcmsai/3.5/jessie/libsaibcm-dev_3.5.3.1-15_amd64.deb?sv=2015-04-05&sr=b&sig=1buFitrRydJ01Y%2BvmeUYveb1R1UAEQOiYMwgcyPZikw%3D&se=2033-05-22T17%3A21%3A38Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) diff --git a/src/sonic-config-engine/tests/sample_output/buffers-dell6100.json b/src/sonic-config-engine/tests/sample_output/buffers-dell6100.json index 0b6c8cbe19a3..ce157b442614 100644 --- a/src/sonic-config-engine/tests/sample_output/buffers-dell6100.json +++ b/src/sonic-config-engine/tests/sample_output/buffers-dell6100.json @@ -96,7 +96,7 @@ "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", - "static_th":"3995680" + "static_th":"15982720" }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", From 301c69b098bc37e2f46eaedbf88ebc03260a11cb Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 25 Sep 2019 16:08:44 -0700 Subject: [PATCH 38/61] Flush port in both worm-reboot and fast-reboot mode on exit. Otherwise teamd will stuck (#3512) --- src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch b/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch index d92ac6987e62..52a181d4da6f 100644 --- a/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch +++ b/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch @@ -108,7 +108,7 @@ index 9dc85b5..679da49 100644 + teamd_refresh_ports(ctx); + if (ctrl_byte == 'w') + teamd_ports_flush_data(ctx); -+ } else { ++ /* Flush ports to destroy port object */ + err = teamd_flush_ports(ctx); + if (err) + return err; From e572080b2be862c953f5e6ad208a4a269411b6a0 Mon Sep 17 00:00:00 2001 From: Mykola F <37578614+mykolaf@users.noreply.github.com> Date: Fri, 27 Sep 2019 01:47:27 +0300 Subject: [PATCH 39/61] [Mellanox] platform_reboot - sync & umount fs before power cycle (#3430) (#3476) Signed-off-by: Mykola Faryma --- .../mellanox/x86_64-mlnx_msn2700-r0/platform_reboot | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot b/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot index 6e02d011f82d..28c5aedc4e32 100755 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot @@ -19,6 +19,14 @@ function ParseArguments() { done } +function SafePwrCycle() { + sync ; sync + umount -fa > /dev/null 2&>1 + echo 1 > $SYSFS_PWR_CYCLE + sleep 3 + echo 0 > $SYSFS_PWR_CYCLE +} + ParseArguments "$@" ${FW_UPGRADE_SCRIPT} --upgrade --verbose @@ -32,6 +40,4 @@ if [[ "${EXIT_CODE}" != "${EXIT_SUCCESS}" ]]; then fi fi -echo 1 > $SYSFS_PWR_CYCLE -sleep 3 -echo 0 > $SYSFS_PWR_CYCLE +SafePwrCycle From 5199755be7c2ebb6a3398169d51ff33467ce2f85 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 26 Sep 2019 18:14:30 -0700 Subject: [PATCH 40/61] [sonic-slave] Update linux-compiler-gcc package version to fix build (#3515) --- sonic-slave/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 46983362ce49..abe43d9fe604 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -127,7 +127,7 @@ RUN apt-get update && apt-get install -y \ squashfs-tools \ zip \ # For broadcom sdk build - linux-compiler-gcc-4.8-x86 \ + linux-compiler-gcc-4.9-x86 \ linux-kbuild-3.16 \ # teamd build libdaemon-dev \ From 21c9185e446070fc69896151e37e6dcfc0a4e6a6 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 27 Sep 2019 08:43:39 -0700 Subject: [PATCH 41/61] [201811][utilities][swss] advance sub module head (#3524) Submodule src/sonic-swss 0e5c1ff..fcd091c: > [mirrororch]: Remove mirror session state after it is remvoed (#1066) Submodule src/sonic-utilities a89b9d4..54946e9: > [acl_loader]: Add monitor port column in show mirror_session output (#662) > [warm/fast reboot] some service docker might have been stopped already (#668) Signed-off-by: Ying Xie --- src/sonic-swss | 2 +- src/sonic-utilities | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-swss b/src/sonic-swss index 0e5c1ff614ce..fcd091c9e0a7 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 0e5c1ff614ceee6fe20adf3b67348131458f05f3 +Subproject commit fcd091c9e0a7220a2b6ea0cab5fa9ddb566f0846 diff --git a/src/sonic-utilities b/src/sonic-utilities index a89b9d4c69e9..54946e9c9dab 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit a89b9d4c69e993c2891f59fbbd48891b23eba298 +Subproject commit 54946e9c9dab7222db19b5816b5735ef1385b84b From 467851e24e8add193352e61d7e9e2c0f3235ac71 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 27 Sep 2019 14:49:44 -0700 Subject: [PATCH 42/61] Regular quit needs to clean the ports two (#3531) --- src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch b/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch index 52a181d4da6f..e62d2df0597e 100644 --- a/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch +++ b/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch @@ -108,11 +108,11 @@ index 9dc85b5..679da49 100644 + teamd_refresh_ports(ctx); + if (ctrl_byte == 'w') + teamd_ports_flush_data(ctx); -+ /* Flush ports to destroy port object */ -+ err = teamd_flush_ports(ctx); -+ if (err) -+ return err; + } ++ ++ err = teamd_flush_ports(ctx); ++ if (err) ++ return err; quit_in_progress = true; continue; case 'r': From 7dccd0fc3dca2ddc1dd9c888b488946efe9270a1 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 27 Sep 2019 16:42:46 -0700 Subject: [PATCH 43/61] [201811][utilities] advance sub module head (#3532) Submodule src/sonic-utilities 54946e9..5b1fa3c: > [neighbor_advertiser] Verify that DIPs returned from ferret are not in device VLAN (#670) Signed-off-by: Ying Xie --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 54946e9c9dab..5b1fa3c8b5f8 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 54946e9c9dab7222db19b5816b5735ef1385b84b +Subproject commit 5b1fa3c8b5f8691011488070f9bdb6e5d3b639a3 From 91a5bd2c7b4c6a7db0b3fb86d7b7ed78bcc727d0 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Sat, 28 Sep 2019 17:31:27 -0700 Subject: [PATCH 44/61] [201811][utilities] advance sub module head (#3535) Submodule src/sonic-utilities 5b1fa3c..7bb6ffb: > [fast reboot] kill teamd docker directly (#683) Signed-off-by: Ying Xie --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 5b1fa3c8b5f8..7bb6ffbfdc0a 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 5b1fa3c8b5f8691011488070f9bdb6e5d3b639a3 +Subproject commit 7bb6ffbfdc0ac2f628b50fe389b2843639f25ad3 From 520dca3f8dfad0272851d0a03d6a5b5d1b904636 Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Wed, 2 Oct 2019 02:54:24 +0300 Subject: [PATCH 45/61] [Mellanox ] Updated MFT package (#3540) --- platform/mellanox/mft.mk | 8 ++++---- platform/mellanox/mft/Makefile | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/platform/mellanox/mft.mk b/platform/mellanox/mft.mk index 5191fa41bcf5..ae2c92e0ac18 100644 --- a/platform/mellanox/mft.mk +++ b/platform/mellanox/mft.mk @@ -1,11 +1,11 @@ # Mellanox SAI -MFT_VERSION = 4.9.0 -MFT_REVISION = 38 +MFT_VERSION = 4.12.0 +MFT_REVISION = 104 export MFT_VERSION MFT_REVISION -MFT = mft-$(MFT_VERSION)-$(MFT_REVISION).amd64.deb +MFT = mft_$(MFT_VERSION)-$(MFT_REVISION)_amd64.deb $(MFT)_SRC_PATH = $(PLATFORM_PATH)/mft $(MFT)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) SONIC_MAKE_DEBS += $(MFT) @@ -13,7 +13,7 @@ SONIC_MAKE_DEBS += $(MFT) KERNEL_MFT = kernel-mft-dkms_$(MFT_VERSION)-$(KVERSION)_all.deb $(eval $(call add_derived_package,$(MFT),$(KERNEL_MFT))) -MFT_OEM = mft-oem-$(MFT_VERSION)-$(MFT_REVISION).amd64.deb +MFT_OEM = mft-oem_$(MFT_VERSION)-$(MFT_REVISION)_amd64.deb $(eval $(call add_derived_package,$(MFT),$(MFT_OEM))) SONIC_STRETCH_DEBS += $(KERNEL_MFT) diff --git a/platform/mellanox/mft/Makefile b/platform/mellanox/mft/Makefile index 15a12decb4e8..e18964dd4b91 100644 --- a/platform/mellanox/mft/Makefile +++ b/platform/mellanox/mft/Makefile @@ -6,8 +6,8 @@ MFT_NAME = mft-$(MFT_VERSION)-$(MFT_REVISION)-x86_64-deb MFT_TGZ = $(MFT_NAME).tgz SRC_DEB = kernel-mft-dkms_$(MFT_VERSION)-$(MFT_REVISION)_all.deb -MAIN_TARGET = mft-$(MFT_VERSION)-$(MFT_REVISION).amd64.deb -DERIVED_TARGETS = kernel-mft-dkms_$(MFT_VERSION)-$(KVERSION)_all.deb mft-oem-$(MFT_VERSION)-$(MFT_REVISION).amd64.deb +MAIN_TARGET = mft_$(MFT_VERSION)-$(MFT_REVISION)_amd64.deb +DERIVED_TARGETS = kernel-mft-dkms_$(MFT_VERSION)-$(KVERSION)_all.deb mft-oem_$(MFT_VERSION)-$(MFT_REVISION)_amd64.deb $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : rm -rf $(MFT_NAME) From e4f8a3946c365d9959e6b105d5baf1662b93f6b7 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 2 Oct 2019 13:58:34 -0700 Subject: [PATCH 46/61] [first boot] sync file system after moving/copying files (#3550) Signed-off-by: Ying Xie --- files/image_config/platform/rc.local | 2 ++ files/image_config/updategraph/updategraph | 2 ++ 2 files changed, 4 insertions(+) diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index 5ea98a8eccd9..190743285644 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -242,6 +242,8 @@ if [ -f $FIRST_BOOT_FILE ]; then dpkg -i /host/image-$SONIC_VERSION/platform/$platform/*.deb fi + sync + # If the unit booted into SONiC from another NOS's grub, # we now install a grub for SONiC. if [ -n "$onie_platform" ] && [ -n "$migration" ]; then diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph index b14f75f8582f..5dc9c24d35ef 100755 --- a/files/image_config/updategraph/updategraph +++ b/files/image_config/updategraph/updategraph @@ -33,6 +33,8 @@ function copy_config_files_and_directories() logger "Missing SONiC configuration ${file_dir} ..." fi done + + sync } function check_system_warm_boot() From 37b78826eedf352de4875341ea89a35485480606 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 2 Oct 2019 13:58:44 -0700 Subject: [PATCH 47/61] [updategraph] enhance update graph handling (#3549) - after reloading minigraph, write latest version string in the DB. - if old config_db.json file exists, use it and migrate to latest version. - only reload minigraph when config_db.json doesn't exist and minigraph exists. Signed-off-by: Ying Xie --- files/image_config/updategraph/updategraph | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph index 5dc9c24d35ef..dd8314b01221 100755 --- a/files/image_config/updategraph/updategraph +++ b/files/image_config/updategraph/updategraph @@ -62,13 +62,20 @@ if [ -f /tmp/pending_config_migration ]; then copy_config_files_and_directories $copy_list if [ x"${WARM_BOOT}" == x"true" ]; then echo "Warm reboot detected..." - elif [ "$enabled" = "true" ]; then + elif [ -r /etc/sonic/config_db.json ]; then + echo "Use config_db.json from old system..." + sonic-cfggen -j /etc/sonic/config_db.json --write-to-db + + if [[ -x /usr/bin/db_migrator.py ]]; then + # Migrate the DB to the latest schema version if needed + /usr/bin/db_migrator.py -o migrate + fi + elif [ -r /etc/sonic/minigraph.xml ]; then echo "Use minigraph.xml from old system..." reload_minigraph sonic-cfggen -d --print-data > /etc/sonic/config_db.json else - echo "Use config_db.json from old system..." - sonic-cfggen -j /etc/sonic/config_db.json --write-to-db + echo "Didn't found neither config_db.json nor minigraph.xml ..." fi rm -f /tmp/pending_config_migration sed -i "/enabled=/d" /etc/sonic/updategraph.conf From 975fb1c488e29a7dc4a28fc247539611eeeed230 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 2 Oct 2019 15:35:11 -0700 Subject: [PATCH 48/61] [libteam]: Keep member ports parts of a team when teamd quits in FR and WR (#3544) --- .../0008-libteam-Add-warm_reboot-mode.patch | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch b/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch index e62d2df0597e..3f428bbec19e 100644 --- a/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch +++ b/src/libteam/patch/0008-libteam-Add-warm_reboot-mode.patch @@ -1,18 +1,19 @@ -From 5d418847bf6fa86f049e18c1b57028c71e40a9c4 Mon Sep 17 00:00:00 2001 +From 113d482704198685fba09cd2597fd93ca9d297c5 Mon Sep 17 00:00:00 2001 From: Pavel Shirshov -Date: Thu, 19 Sep 2019 14:49:17 -0700 +Date: Tue, 1 Oct 2019 09:23:23 -0700 Subject: [PATCH 1/1] [libteam]: Reimplement Warm-Reboot procedure --- libteam/ifinfo.c | 6 +- - teamd/teamd.c | 57 ++++- + teamd/teamd.c | 51 +++- teamd/teamd.h | 6 + teamd/teamd_events.c | 13 ++ + teamd/teamd_per_port.c | 6 + teamd/teamd_runner_lacp.c | 474 +++++++++++++++++++++++++++++++++++--- - 5 files changed, 509 insertions(+), 47 deletions(-) + 6 files changed, 512 insertions(+), 44 deletions(-) diff --git a/libteam/ifinfo.c b/libteam/ifinfo.c -index a15788b..e48193e 100644 +index 46d56a2..b86d34c 100644 --- a/libteam/ifinfo.c +++ b/libteam/ifinfo.c @@ -109,15 +109,13 @@ static void update_hwaddr(struct team_ifinfo *ifinfo, struct rtnl_link *link) @@ -34,7 +35,7 @@ index a15788b..e48193e 100644 } } diff --git a/teamd/teamd.c b/teamd/teamd.c -index 9dc85b5..679da49 100644 +index 9dc85b5..17221a9 100644 --- a/teamd/teamd.c +++ b/teamd/teamd.c @@ -117,7 +117,9 @@ static void print_help(const struct teamd_context *ctx) { @@ -90,7 +91,7 @@ index 9dc85b5..679da49 100644 if (optind < argc) { fprintf(stderr, "Too many arguments\n"); return -1; -@@ -390,12 +410,21 @@ static int teamd_run_loop_run(struct teamd_context *ctx) +@@ -390,9 +410,18 @@ static int teamd_run_loop_run(struct teamd_context *ctx) if (err != -1) { switch(ctrl_byte) { case 'q': @@ -99,9 +100,6 @@ index 9dc85b5..679da49 100644 if (quit_in_progress) return -EBUSY; - teamd_refresh_ports(ctx); -- err = teamd_flush_ports(ctx); -- if (err) -- return err; + if (ctrl_byte == 'w' || ctrl_byte == 'f') { + ctx->keep_ports = true; + ctx->no_quit_destroy = true; @@ -110,12 +108,9 @@ index 9dc85b5..679da49 100644 + teamd_ports_flush_data(ctx); + } + -+ err = teamd_flush_ports(ctx); -+ if (err) -+ return err; - quit_in_progress = true; - continue; - case 'r': + err = teamd_flush_ports(ctx); + if (err) + return err; @@ -434,6 +463,12 @@ void teamd_run_loop_quit(struct teamd_context *ctx, int err) teamd_run_loop_sent_ctrl_byte(ctx, 'q'); } @@ -207,6 +202,23 @@ index 221803e..bd4dcc1 100644 int teamd_event_port_added(struct teamd_context *ctx, struct teamd_port *tdport) { +diff --git a/teamd/teamd_per_port.c b/teamd/teamd_per_port.c +index f98a90d..a87e809 100644 +--- a/teamd/teamd_per_port.c ++++ b/teamd/teamd_per_port.c +@@ -350,6 +350,12 @@ static int teamd_port_remove(struct teamd_context *ctx, + { + int err; + ++ if (ctx->keep_ports) { ++ teamd_log_dbg("%s: Keeping port (found ifindex \"%d\").", ++ tdport->ifname, tdport->ifindex); ++ return 0; ++ } ++ + teamd_log_dbg("%s: Removing port (found ifindex \"%d\").", + tdport->ifname, tdport->ifindex); + err = team_port_remove(ctx->th, tdport->ifindex); diff --git a/teamd/teamd_runner_lacp.c b/teamd/teamd_runner_lacp.c index 4016b15..81be5b7 100644 --- a/teamd/teamd_runner_lacp.c From 40ad3fd603bcd0a70118dfa2da627bcb4fe4fced Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Thu, 3 Oct 2019 08:05:33 -0700 Subject: [PATCH 49/61] [201811][swss][utilities] advance sub module head (#3552) * [201811][swss][utilities] advance sub module head Submodule src/sonic-swss fcd091c..9585be4: > [teamsyncd]: Check if LAG exists before removing (#1069) > [mirrororch]: Toggle the mirror session when moving between VLAN/non-VLAN (#1078) Submodule src/sonic-utilities 7bb6ffb..2d721de: > [show] Properly replace port name with alias in command output (#664) > [neighbor_advertiser] hand pick partial change from #525 (#689) > Revert "Revert "Fixed config Asym PFC CLI. (#632)" (#652)" Signed-off-by: Ying Xie * address compile issue Submodule src/sonic-swss 9585be4..2529d79: > [mirrororch]: Address compiler switch issue (#1079) Signed-off-by: Ying Xie --- src/sonic-swss | 2 +- src/sonic-utilities | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-swss b/src/sonic-swss index fcd091c9e0a7..2529d79ee208 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit fcd091c9e0a7220a2b6ea0cab5fa9ddb566f0846 +Subproject commit 2529d79ee208368db30830ba80e8b2859b9efc0d diff --git a/src/sonic-utilities b/src/sonic-utilities index 7bb6ffbfdc0a..2d721deca44c 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 7bb6ffbfdc0ac2f628b50fe389b2843639f25ad3 +Subproject commit 2d721deca44c3faf7bf0ee6da45e0f8f355f414d From eecc3b15c80be4268713c6bb4ca6ee179d63b627 Mon Sep 17 00:00:00 2001 From: Volodymyr Samotiy Date: Thu, 3 Oct 2019 21:38:11 +0300 Subject: [PATCH 50/61] [Mellanox]: Update FW to 4.3.1636 version (#3551) --- platform/mellanox/fw.mk | 2 +- platform/mellanox/mlnx-sai.mk | 2 +- platform/mellanox/sdk.mk | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index a3f04aad3811..18b2d2dd54c1 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -1,6 +1,6 @@ # mellanox firmware -MLNX_FW_VERSION = 13.2000.1634 +MLNX_FW_VERSION = 13.2000.1636 MLNX_FW_FILE = fw-SPC-rel-$(subst .,_,$(MLNX_FW_VERSION))-EVB.mfa $(MLNX_FW_FILE)_URL = $(MLNX_SDK_BASE_URL)/$(MLNX_FW_FILE) SONIC_ONLINE_FILES += $(MLNX_FW_FILE) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 2027dea4eba0..199624c48580 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = SAIRel1.14.2-master -MLNX_SAI_REVISION = 6178b6ab8c6757cc7b3b8f631c52d9b584d8c6f4 +MLNX_SAI_REVISION = d5810ae692f47898bbf6e093875c89b5f7e4ef19 export MLNX_SAI_VERSION MLNX_SAI_REVISION diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index 03a2d63cbad4..a00069a01997 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -1,4 +1,4 @@ -MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/310eb922e133ecb3243e10efa4440fabe0ca73c7/sdk +MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/d5810ae692f47898bbf6e093875c89b5f7e4ef19/sdk MLNX_SDK_VERSION = 4.3.1634 MLNX_SDK_RDEBS += $(APPLIBS) $(IPROUTE2_MLNX) $(SX_ACL_RM) $(SX_COMPLIB) \ $(SX_EXAMPLES) $(SX_GEN_UTILS) $(SX_SCEW) $(SX_SDN_HAL) \ From 21192050469957cc2f240f924bde1f8712170d9a Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Thu, 3 Oct 2019 12:10:52 -0700 Subject: [PATCH 51/61] [201811][utilities] advance sub module head (#3557) Submodule src/sonic-utilities 2d721de..fb5902f: > Revert "[fast reboot] kill teamd docker directly (#683)" (#690) Signed-off-by: Ying Xie --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 2d721deca44c..fb5902f03d5b 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 2d721deca44c3faf7bf0ee6da45e0f8f355f414d +Subproject commit fb5902f03d5bb80585ab59f3a7b03b14239e321f From 56085be06bb61c2755c05a209aca4d4c068d5067 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Thu, 3 Oct 2019 17:02:59 -0700 Subject: [PATCH 52/61] [bcm config] enable sram scan (#3558) Per Broadcom's recommendations. Signed-off-by: Ying Xie --- .../Arista-7260CX3-C64/th2-a7260cx3-64-64x100G.config.bcm | 1 - .../th2-a7260cx3-64-112x50G+8x100G.config.bcm | 1 - .../Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm | 1 - .../Delta-ag9064/th2-ag9064-64x100G.config.bcm | 1 - 4 files changed, 4 deletions(-) diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/th2-a7260cx3-64-64x100G.config.bcm b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/th2-a7260cx3-64-64x100G.config.bcm index 4c9e65869318..504a2c4c63d3 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/th2-a7260cx3-64-64x100G.config.bcm +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/th2-a7260cx3-64-64x100G.config.bcm @@ -939,7 +939,6 @@ portmap_9=17:100 robust_hash_disable_egress_vlan=1 robust_hash_disable_mpls=1 robust_hash_disable_vlan=1 -sram_scan_enable=0 stable_size=0x5500000 stable_size=0x5500000 tdma_timeout_usec=15000000 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/th2-a7260cx3-64-112x50G+8x100G.config.bcm b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/th2-a7260cx3-64-112x50G+8x100G.config.bcm index 456148f06716..dc4419bd2c26 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/th2-a7260cx3-64-112x50G+8x100G.config.bcm +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/th2-a7260cx3-64-112x50G+8x100G.config.bcm @@ -681,7 +681,6 @@ port_init_cl72_hg=1 robust_hash_disable_egress_vlan=1 robust_hash_disable_mpls=1 robust_hash_disable_vlan=1 -sram_scan_enable=0 stable_size=0x5500000 stable_size=0x5500000 tdma_timeout_usec=15000000 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm index 27a06a6035ec..d1a394f1e4f4 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm @@ -939,7 +939,6 @@ portmap_9=17:40 robust_hash_disable_egress_vlan=1 robust_hash_disable_mpls=1 robust_hash_disable_vlan=1 -sram_scan_enable=0 stable_size=0x5500000 stable_size=0x5500000 tdma_timeout_usec=15000000 diff --git a/device/delta/x86_64-delta_ag9064-r0/Delta-ag9064/th2-ag9064-64x100G.config.bcm b/device/delta/x86_64-delta_ag9064-r0/Delta-ag9064/th2-ag9064-64x100G.config.bcm index 859196d8e5c8..3914599abf7c 100644 --- a/device/delta/x86_64-delta_ag9064-r0/Delta-ag9064/th2-ag9064-64x100G.config.bcm +++ b/device/delta/x86_64-delta_ag9064-r0/Delta-ag9064/th2-ag9064-64x100G.config.bcm @@ -797,6 +797,5 @@ phy_an_allow_pll_change_hg=0 robust_hash_disable_egress_vlan=1 robust_hash_disable_mpls=1 robust_hash_disable_vlan=1 -sram_scan_enable=0 stable_size=0x5500000 mmu_lossless=1 From 619c4a48516c352a9b1ab7bc6455afe1732eafe7 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 4 Oct 2019 08:00:27 -0700 Subject: [PATCH 53/61] [201811][sairedis] advance sub module head (#3562) Submodule src/sonic-sairedis 55ec4d2..627e6bc: > Add TimerWatchdog for monitoring long execution apis (#469) Signed-off-by: Ying Xie --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 55ec4d241052..627e6bcd577b 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 55ec4d241052aec597d0c8fc60e75098611668fa +Subproject commit 627e6bcd577b0187f68722e3ebe146e712ff9d68 From 4ab5c2f6e5e83b60622eb2791ecc6c976eca619c Mon Sep 17 00:00:00 2001 From: Wirut Getbamrung Date: Mon, 7 Oct 2019 21:17:46 +0700 Subject: [PATCH 54/61] [device/celestica]: update psuutil follow new platform api (#3537) Fixes #3518 Update psuutil API to detect PSU GPIO base from label --- .../x86_64-cel_seastone-r0/plugins/psuutil.py | 77 ++++++++----------- 1 file changed, 34 insertions(+), 43 deletions(-) diff --git a/device/celestica/x86_64-cel_seastone-r0/plugins/psuutil.py b/device/celestica/x86_64-cel_seastone-r0/plugins/psuutil.py index 510c03a43ff1..b2764b5b6ae0 100644 --- a/device/celestica/x86_64-cel_seastone-r0/plugins/psuutil.py +++ b/device/celestica/x86_64-cel_seastone-r0/plugins/psuutil.py @@ -12,49 +12,51 @@ raise ImportError(str(e) + "- required module not found") +GPIO_DIR = "/sys/class/gpio" +GPIO_LABEL = "pca9505" +DX010_MAX_PSUS = 2 + + class PsuUtil(PsuBase): """Platform-specific PSUutil class""" def __init__(self): PsuBase.__init__(self) # DX010 PSU pin mapping - self.psu = [ - {'base': self.get_gpio_base()}, - {'abs':27, 'power':22}, - {'abs':28, 'power':25} + self.dx010_psu_gpio = [ + {'base': self.__get_gpio_base()}, + {'prs': 27, 'status': 22}, + {'prs': 28, 'status': 25} ] - def get_gpio_base(self): - sys_gpio_dir = "/sys/class/gpio" - for r in os.listdir(sys_gpio_dir): - if "gpiochip" in r: - return int(r[8:],10) - return 216 #Reserve - - - # Get a psu status and presence - def read_psu_statuses(self, pinnum): - sys_gpio_dir = "/sys/class/gpio" - gpio_base = self.psu[0]['base'] - - gpio_dir = sys_gpio_dir + '/gpio' + str(gpio_base+pinnum) - gpio_file = gpio_dir + "/value" - + def __read_txt_file(self, file_path): try: - with open(gpio_file, 'r') as fd: - retval = fd.read() + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() except IOError: - raise IOError("Unable to open " + gpio_file + "file !") - - retval = retval.rstrip('\r\n') - return retval + pass + return "" + + def __get_gpio_base(self): + for r in os.listdir(GPIO_DIR): + label_path = os.path.join(GPIO_DIR, r, "label") + if "gpiochip" in r and GPIO_LABEL in self.__read_txt_file(label_path): + return int(r[8:], 10) + return 216 # Reserve + + def __get_gpio_value(self, pinnum): + gpio_base = self.dx010_psu_gpio[0]['base'] + gpio_dir = GPIO_DIR + '/gpio' + str(gpio_base+pinnum) + gpio_file = gpio_dir + "/value" + retval = self.__read_txt_file(gpio_file) + return retval.rstrip('\r\n') def get_num_psus(self): """ Retrieves the number of PSUs available on the device :return: An integer, the number of PSUs available on the device """ - DX010_MAX_PSUS = 2 return DX010_MAX_PSUS def get_psu_status(self, index): @@ -65,14 +67,9 @@ def get_psu_status(self, index): :return: Boolean, True if PSU is operating properly, False if PSU is\ faulty """ - status = 0 - psu_status = self.read_psu_statuses(self.psu[index]['power']) - psu_status = int(psu_status, 10) - # Check for PSU status - if (psu_status == 1): - status = 1 - - return status + raw = self.__get_gpio_value( + self.dx010_psu_gpio[index]['status']) + return int(raw, 10) == 1 def get_psu_presence(self, index): """ @@ -81,11 +78,5 @@ def get_psu_presence(self, index): :param index: An integer, index of the PSU of which to query status :return: Boolean, True if PSU is plugged, False if not """ - status = 0 - psu_absence = self.read_psu_statuses(self.psu[index]['abs']) - psu_absence = (int(psu_absence, 10)) - # Check for PSU presence - if (psu_absence == 0): - status = 1 - - return status + raw = self.__get_gpio_value(self.dx010_psu_gpio[index]['prs']) + return int(raw, 10) == 0 From 53ec9124bc0c1a0818c4a39bca42a0333e6f236e Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Mon, 7 Oct 2019 07:49:25 -0700 Subject: [PATCH 55/61] [ntp]: Use loopback address when we don't have MGMT interface (#3566) Added configuration to use Loopback ip if a switch doesn't have MGMT_PORT. --- files/image_config/ntp/ntp.conf.j2 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/files/image_config/ntp/ntp.conf.j2 b/files/image_config/ntp/ntp.conf.j2 index d7df6bcd2e04..56244bcca073 100644 --- a/files/image_config/ntp/ntp.conf.j2 +++ b/files/image_config/ntp/ntp.conf.j2 @@ -27,12 +27,19 @@ filegen clockstats file clockstats type day enable server {{ ntp_server }} iburst {% endfor %} -#only listen on localhost and eth0 ips (default is to listen on all ip addresses) +#only listen on MGMT_INTERFACE, LOOPBACK_INTERFACE ip when MGMT_INTERFACE is not defined, or eth0 +# if we don't have both of them (default is to listen on all ip addresses) interface ignore wildcard {% if MGMT_INTERFACE %} {% for (mgmt_intf, mgmt_prefix) in MGMT_INTERFACE %} interface listen {{ mgmt_prefix | ip }} {% endfor %} +{% elif LOOPBACK_INTERFACE %} +{% for (name, prefix) in LOOPBACK_INTERFACE|pfx_filter %} +{% if prefix | ipv4 and name == 'Loopback0' %} +interface listen {{ prefix | ip }} +{% endif %} +{% endfor %} {% else %} interface listen eth0 {% endif %} From 41ce07e75c438a870cfe138f36a3a805495f3aa1 Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Thu, 10 Oct 2019 03:36:45 +0300 Subject: [PATCH 56/61] [mellanox]: Add CPLD update for SN2700 (#3570) * [mellanox]: Add CPLD update for SN2700. Signed-off-by: Nazarii Hnydyn --- .../build_templates/sonic_debian_extension.j2 | 5 ++++- platform/mellanox/cpld.mk | 9 +++++++++ platform/mellanox/cpld/msn2700_cpld.tar.gz | Bin 0 -> 280387 bytes platform/mellanox/one-image.mk | 2 +- platform/mellanox/rules.mk | 1 + 5 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 platform/mellanox/cpld.mk create mode 100644 platform/mellanox/cpld/msn2700_cpld.tar.gz diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 3b40bd87774e..e12ac17b66fb 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -327,8 +327,11 @@ sudo cp {{src}} $FILESYSTEM_ROOT/{{dst}} {% endfor -%} {% if sonic_asic_platform == "mellanox" %} -sudo mkdir -p $FILESYSTEM_ROOT/etc/mlnx/ +sudo mkdir -p $FILESYSTEM_ROOT/etc/mlnx/cpld/ sudo cp target/files/$MLNX_FW_FILE $FILESYSTEM_ROOT/etc/mlnx/fw-SPC.mfa +for MLNX_CPLD_ARCHIVE in $MLNX_CPLD_ARCHIVES; do + sudo cp target/files/$MLNX_CPLD_ARCHIVE $FILESYSTEM_ROOT/etc/mlnx/cpld/ +done sudo cp target/files/$ISSU_VERSION_FILE $FILESYSTEM_ROOT/etc/mlnx/issu-version sudo cp target/files/$MLNX_FFB_SCRIPT $FILESYSTEM_ROOT/usr/bin/mlnx-ffb.sh j2 platform/mellanox/mlnx-fw-upgrade.j2 | sudo tee $FILESYSTEM_ROOT/usr/bin/mlnx-fw-upgrade.sh diff --git a/platform/mellanox/cpld.mk b/platform/mellanox/cpld.mk new file mode 100644 index 000000000000..0a03b3c54a9f --- /dev/null +++ b/platform/mellanox/cpld.mk @@ -0,0 +1,9 @@ +# mellanox cpld firmware + +MLNX_SN2700_CPLD_ARCHIVE = msn2700_cpld.tar.gz +$(MLNX_SN2700_CPLD_ARCHIVE)_PATH = platform/mellanox/cpld/ +SONIC_COPY_FILES += $(MLNX_SN2700_CPLD_ARCHIVE) + +MLNX_CPLD_ARCHIVES += $(MLNX_SN2700_CPLD_ARCHIVE) + +export MLNX_CPLD_ARCHIVES diff --git a/platform/mellanox/cpld/msn2700_cpld.tar.gz b/platform/mellanox/cpld/msn2700_cpld.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..81d99d04dda683a43d16466017ed139ef6aad430 GIT binary patch literal 280387 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

1W2n;z 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 literal 0 HcmV?d00001 diff --git a/platform/mellanox/one-image.mk b/platform/mellanox/one-image.mk index 6fd5af193276..d930850b7ac7 100644 --- a/platform/mellanox/one-image.mk +++ b/platform/mellanox/one-image.mk @@ -5,5 +5,5 @@ $(SONIC_ONE_IMAGE)_MACHINE = mellanox $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie $(SONIC_ONE_IMAGE)_INSTALLS += $(SX_KERNEL) $(KERNEL_MFT) $(MFT_OEM) $(MFT) $(MLNX_HW_MANAGEMENT) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) -$(SONIC_ONE_IMAGE)_FILES += $(MLNX_FW_FILE) $(MLNX_FFB_SCRIPT) $(ISSU_VERSION_FILE) +$(SONIC_ONE_IMAGE)_FILES += $(MLNX_FW_FILE) $(MLNX_CPLD_ARCHIVES) $(MLNX_FFB_SCRIPT) $(ISSU_VERSION_FILE) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index afd52a3459b1..3ed1f1bae042 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -1,4 +1,5 @@ include $(PLATFORM_PATH)/sdk.mk +include $(PLATFORM_PATH)/cpld.mk include $(PLATFORM_PATH)/fw.mk include $(PLATFORM_PATH)/mft.mk include $(PLATFORM_PATH)/mlnx-sai.mk From afbb91657c9594fa20f7d00b8a06aea7cd694690 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 9 Oct 2019 07:40:01 -0700 Subject: [PATCH 57/61] [baseimage]: incrase docker ramfs from 800MB to 900MB (#3582) --- onie-image.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onie-image.conf b/onie-image.conf index eb5868047089..38016877ed86 100644 --- a/onie-image.conf +++ b/onie-image.conf @@ -25,7 +25,7 @@ FILESYSTEM_DOCKERFS=dockerfs.tar.gz DOCKERFS_DIR=docker ## docker ramfs disk space -DOCKER_RAMFS_SIZE=800M +DOCKER_RAMFS_SIZE=900M ## Output file name for onie installer OUTPUT_ONIE_IMAGE=target/sonic-$TARGET_MACHINE.bin From c7a096b6b982544311fa7384d803b953e5f60d06 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 11 Oct 2019 19:46:14 -0700 Subject: [PATCH 58/61] [201811][ntp] removed undefined filter (#3594) pfx_filter is not defined in 201811 branch. Signed-off-by: Ying Xie --- files/image_config/ntp/ntp.conf.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/image_config/ntp/ntp.conf.j2 b/files/image_config/ntp/ntp.conf.j2 index 56244bcca073..07776292fc6c 100644 --- a/files/image_config/ntp/ntp.conf.j2 +++ b/files/image_config/ntp/ntp.conf.j2 @@ -35,7 +35,7 @@ interface ignore wildcard interface listen {{ mgmt_prefix | ip }} {% endfor %} {% elif LOOPBACK_INTERFACE %} -{% for (name, prefix) in LOOPBACK_INTERFACE|pfx_filter %} +{% for (name, prefix) in LOOPBACK_INTERFACE %} {% if prefix | ipv4 and name == 'Loopback0' %} interface listen {{ prefix | ip }} {% endif %} From 241b6facd8f0738d61415bb0ba4fcdf99426ae54 Mon Sep 17 00:00:00 2001 From: Wenda Ni Date: Tue, 15 Oct 2019 06:03:48 -0700 Subject: [PATCH 59/61] [devices]: PG headroom change for Arista 7260 (#3600) Signed-off-by: Wenda Ni --- .../pg_profile_lookup.ini | 14 ++++++------- .../Arista-7260CX3-Q64/pg_profile_lookup.ini | 20 +++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini index c2bf04950b80..ed0005610b71 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini @@ -1,8 +1,8 @@ # PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 50000 5m 1248 1248 56160 -3 2496 - 100000 5m 1248 1248 96928 -3 2496 - 50000 40m 1248 1248 56160 -3 2496 - 100000 40m 1248 1248 96928 -3 2496 - 50000 300m 1248 1248 56160 -3 2496 - 100000 300m 1248 1248 96928 -3 2496 +# speed cable size xon xoff threshold xon_offset + 50000 5m 1248 1248 56160 -3 2496 + 100000 5m 1248 1248 96928 -3 2496 + 50000 40m 1248 1248 96096 -3 2496 + 100000 40m 1248 1248 177632 -3 2496 + 50000 300m 1248 1248 141856 -3 2496 + 100000 300m 1248 1248 268736 -3 2496 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini index 34ac8b2ca700..ac33b4f961fb 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini @@ -1,11 +1,11 @@ # PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 40000 5m 1248 1248 56160 -3 2496 - 50000 5m 1248 1248 56160 -3 2496 - 100000 5m 1248 1248 96928 -3 2496 - 40000 40m 1248 1248 56160 -3 2496 - 50000 40m 1248 1248 56160 -3 2496 - 100000 40m 1248 1248 96928 -3 2496 - 40000 300m 1248 1248 56160 -3 2496 - 50000 300m 1248 1248 56160 -3 2496 - 100000 300m 1248 1248 96928 -3 2496 +# speed cable size xon xoff threshold xon_offset + 40000 5m 1248 1248 56160 -3 2496 + 50000 5m 1248 1248 56160 -3 2496 + 100000 5m 1248 1248 96928 -3 2496 + 40000 40m 1248 1248 71552 -3 2496 + 50000 40m 1248 1248 96096 -3 2496 + 100000 40m 1248 1248 177632 -3 2496 + 40000 300m 1248 1248 108160 -3 2496 + 50000 300m 1248 1248 141856 -3 2496 + 100000 300m 1248 1248 268736 -3 2496 From c259f404776e695fe6ad6e55e0157c6b7383e072 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Tue, 15 Oct 2019 18:43:52 -0700 Subject: [PATCH 60/61] BGPm for 201811 (#3601) * Feature is downported * Add monitors to the test minigraphs * Test * No pfx filer * Fix bgp sample * Quagga requires to activate peer-group before configuration --- dockers/docker-fpm-quagga/bgpd.conf.j2 | 27 +++++++++++++++++++ src/sonic-config-engine/minigraph.py | 8 ++++-- .../tests/sample_output/bgpd_quagga.conf | 15 +++++++++++ .../tests/simple-sample-graph.xml | 24 +++++++++++++++++ .../tests/t0-sample-graph.xml | 24 +++++++++++++++++ src/sonic-config-engine/tests/test_cfggen.py | 4 +++ 6 files changed, 100 insertions(+), 2 deletions(-) diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index 4879736437bc..73ee5b151c19 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -23,6 +23,12 @@ route-map FROM_BGP_SPEAKER_V4 permit 10 ! route-map TO_BGP_SPEAKER_V4 deny 10 ! +{% if BGP_MONITORS is defined and BGP_MONITORS|length > 0 %} +route-map FROM_BGPMON_V4 deny 10 +! +route-map TO_BGPMON_V4 permit 10 +! +{% endif %} router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} bgp log-neighbor-changes bgp bestpath as-path multipath-relax @@ -130,6 +136,27 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% endfor %} {% endif %} {% endblock bgp_peers_with_range %} +{% block bgp_monitors %} +{% if BGP_MONITORS is defined and BGP_MONITORS|length > 0 %} + neighbor BGPMON_V4 peer-group + neighbor BGPMON_V4 activate +{% for (name, prefix) in LOOPBACK_INTERFACE %} +{% if prefix | ipv4 and name == 'Loopback0' %} + neighbor BGPMON_V4 update-source {{ prefix | ip }} +{% endif %} +{% endfor %} + neighbor BGPMON_V4 route-map FROM_BGPMON_V4 in + neighbor BGPMON_V4 route-map TO_BGPMON_V4 out + neighbor BGPMON_V4 send-community + neighbor BGPMON_V4 maximum-prefix 1 +{% for neighbor_addr, bgp_session in BGP_MONITORS.items() %} + neighbor {{ neighbor_addr }} remote-as {{ DEVICE_METADATA['localhost']['bgp_asn'] }} + neighbor {{ neighbor_addr }} peer-group BGPMON_V4 + neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }} + neighbor {{ neighbor_addr }} activate +{% endfor %} +{% endif %} +{% endblock bgp_monitors %} ! {% if DEVICE_METADATA['localhost'].has_key('bgp_asn') %} maximum-paths 64 diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index ac4f0da0f1c4..98fbd79f83b8 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -360,8 +360,10 @@ def parse_cpg(cpg, hname): bgp_session = bgp_sessions[peer] if hostname.lower() == bgp_session['name'].lower(): bgp_session['asn'] = asn + bgp_monitors = { key: bgp_sessions[key] for key in bgp_sessions if bgp_sessions[key].has_key('asn') and bgp_sessions[key]['name'] == 'BGPMonitor' } bgp_sessions = { key: bgp_sessions[key] for key in bgp_sessions if bgp_sessions[key].has_key('asn') and int(bgp_sessions[key]['asn']) != 0 } - return bgp_sessions, myasn, bgp_peers_with_range + + return bgp_sessions, myasn, bgp_peers_with_range, bgp_monitors def parse_meta(meta, hname): @@ -421,6 +423,7 @@ def parse_xml(filename, platform=None, port_config_file=None): u_devices = None hwsku = None bgp_sessions = None + bgp_monitors = [] bgp_asn = None intfs = None vlan_intfs = None @@ -464,7 +467,7 @@ def parse_xml(filename, platform=None, port_config_file=None): if child.tag == str(QName(ns, "DpgDec")): (intfs, lo_intfs, mgmt_intf, vlans, vlan_members, pcs, pc_members, acls) = parse_dpg(child, hostname) elif child.tag == str(QName(ns, "CpgDec")): - (bgp_sessions, bgp_asn, bgp_peers_with_range) = parse_cpg(child, hostname) + (bgp_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors) = parse_cpg(child, hostname) elif child.tag == str(QName(ns, "PngDec")): (neighbors, devices, console_dev, console_port, mgmt_dev, mgmt_port, port_speed_png, console_ports) = parse_png(child, hostname) elif child.tag == str(QName(ns, "UngDec")): @@ -485,6 +488,7 @@ def parse_xml(filename, platform=None, port_config_file=None): 'type': current_device['type'] }} results['BGP_NEIGHBOR'] = bgp_sessions + results['BGP_MONITORS'] = bgp_monitors results['BGP_PEER_RANGE'] = bgp_peers_with_range if mgmt_routes: # TODO: differentiate v4 and v6 diff --git a/src/sonic-config-engine/tests/sample_output/bgpd_quagga.conf b/src/sonic-config-engine/tests/sample_output/bgpd_quagga.conf index ebffcaa7c24d..d562ae48ffc6 100644 --- a/src/sonic-config-engine/tests/sample_output/bgpd_quagga.conf +++ b/src/sonic-config-engine/tests/sample_output/bgpd_quagga.conf @@ -16,6 +16,10 @@ route-map FROM_BGP_SPEAKER_V4 permit 10 ! route-map TO_BGP_SPEAKER_V4 deny 10 ! +route-map FROM_BGPMON_V4 deny 10 +! +route-map TO_BGPMON_V4 permit 10 +! router bgp 65100 bgp log-neighbor-changes bgp bestpath as-path multipath-relax @@ -92,6 +96,17 @@ router bgp 65100 neighbor fc00::76 soft-reconfiguration inbound maximum-paths 64 exit-address-family + neighbor BGPMON_V4 peer-group + neighbor BGPMON_V4 activate + neighbor BGPMON_V4 update-source 10.1.0.32 + neighbor BGPMON_V4 route-map FROM_BGPMON_V4 in + neighbor BGPMON_V4 route-map TO_BGPMON_V4 out + neighbor BGPMON_V4 send-community + neighbor BGPMON_V4 maximum-prefix 1 + neighbor 10.20.30.40 remote-as 65100 + neighbor 10.20.30.40 peer-group BGPMON_V4 + neighbor 10.20.30.40 description BGPMonitor + neighbor 10.20.30.40 activate ! maximum-paths 64 ! diff --git a/src/sonic-config-engine/tests/simple-sample-graph.xml b/src/sonic-config-engine/tests/simple-sample-graph.xml index e04f692729f0..5ebbaafd9671 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph.xml @@ -2,6 +2,15 @@ + + switch-t0 + 10.1.0.32 + BGPMonitor + 10.20.30.40 + 30 + 10 + 3 + false switch-t0 @@ -42,6 +51,21 @@ + + 0 + + BGPMonitor + + + BGPPeer +
10.1.0.32
+ + + +
+
+ +
65100 switch-t0 diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml index bb1a4a4a22f6..180895928fbd 100644 --- a/src/sonic-config-engine/tests/t0-sample-graph.xml +++ b/src/sonic-config-engine/tests/t0-sample-graph.xml @@ -2,6 +2,15 @@ + + switch-t0 + 10.1.0.32 + BGPMonitor + 10.20.30.40 + 30 + 10 + 3 + false switch-t0 @@ -80,6 +89,21 @@ + + 0 + + BGPMonitor + + + BGPPeer +
10.1.0.32
+ + + +
+
+ +
65100 switch-t0 diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 0d30c40fc9e4..1ba59eb7c97a 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -236,3 +236,7 @@ def test_metadata_ntp(self): output = self.run_script(argument) self.assertEqual(output.strip(), "{'10.0.10.1': {}, '10.0.10.2': {}}") + def test_minigraph_bgp_mon(self): + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v "BGP_MONITORS"' + output = self.run_script(argument) + self.assertEqual(output.strip(), "{'10.20.30.40': {'rrclient': 0, 'name': 'BGPMonitor', 'local_addr': '10.1.0.32', 'nhopself': 0, 'holdtime': '10', 'asn': '0', 'keepalive': '3'}}") From e98be7448cd889cb9ef5cd5862a1ccfe5b3317c0 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 16 Oct 2019 07:54:44 -0700 Subject: [PATCH 61/61] [201811][utilities] advance sub module head (#3612) Submodule src/sonic-utilities fb5902f..d315dd7: > show pfcwd status to be 'N/A' when pfcwd is stopped (#682) Signed-off-by: Ying Xie --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index fb5902f03d5b..d315dd73a0c6 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit fb5902f03d5bb80585ab59f3a7b03b14239e321f +Subproject commit d315dd73a0c67d0348139d53e310d357025a308c